附录

SDK 示例

使用 OpenAI / Anthropic 官方 SDK 及各语言 HTTP 客户端接入平台的完整代码示例

概述

平台同时兼容 OpenAI 与 Anthropic 两大 SDK 生态,接入时无需修改业务代码逻辑,只需把 SDK 的 API 地址(base URL)和密钥替换为平台提供的值:

SDKbase URL对应接口
OpenAI SDK(Python / Node.js 等)https://www.yunsell.com/v1必须带 /v1/v1/chat/completions 等 OpenAI 标准接口
Anthropic SDK(Python / Node.js 等)https://www.yunsell.com不带 /v1,SDK 会自动拼接)/v1/messages

示例中的模型名仅供参考,请替换为控制台中实际可用的模型名称;sk-your-api-key 替换为你自己的密钥。


一、OpenAI SDK

Python

安装:

pip install openai

基础调用:

from openai import OpenAI

client = OpenAI(
    api_key="sk-your-api-key",
    base_url="https://www.yunsell.com/v1",
)

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "你是一个乐于助人的助手"},
        {"role": "user", "content": "你好,介绍一下你自己"},
    ],
)

print(response.choices[0].message.content)
print(response.usage)  # prompt_tokens / completion_tokens / total_tokens

流式调用(含用量统计):

stream = client.chat.completions.create(
    model="gpt-4o",
    messages=[{"role": "user", "content": "写一首关于春天的短诗"}],
    stream=True,
    stream_options={"include_usage": True},
)

for chunk in stream:
    # 最后一个 chunk 的 choices 为空数组、只带 usage,必须先判空
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)
    if chunk.usage:
        print(f"\n\n用量:{chunk.usage}")

Node.js / TypeScript

安装:

npm install openai
# 或
bun add openai

基础调用:

import OpenAI from 'openai';

const client = new OpenAI({
  apiKey: 'sk-your-api-key',
  baseURL: 'https://www.yunsell.com/v1',
});

const response = await client.chat.completions.create({
  model: 'gpt-4o',
  messages: [
    { role: 'system', content: '你是一个乐于助人的助手' },
    { role: 'user', content: '你好,介绍一下你自己' },
  ],
});

console.log(response.choices[0].message.content);
console.log(response.usage);

流式调用:

const stream = await client.chat.completions.create({
  model: 'gpt-4o',
  messages: [{ role: 'user', content: '写一首关于春天的短诗' }],
  stream: true,
  stream_options: { include_usage: true },
});

for await (const chunk of stream) {
  const delta = chunk.choices[0]?.delta?.content;
  if (delta) process.stdout.write(delta);
  if (chunk.usage) console.log('\n\n用量:', chunk.usage);
}

二、Anthropic SDK

Python

安装:

pip install anthropic

基础调用:

from anthropic import Anthropic

client = Anthropic(
    api_key="sk-your-api-key",
    base_url="https://www.yunsell.com",  # 注意:不带 /v1
)

message = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=1024,  # Anthropic 接口必填
    system="你是一个乐于助人的助手",
    messages=[
        {"role": "user", "content": "你好,介绍一下你自己"},
    ],
)

print(message.content[0].text)
print(message.usage)  # input_tokens / output_tokens

流式调用(SDK 已封装事件解析):

with client.messages.stream(
    model="claude-sonnet-4-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "写一首关于春天的短诗"}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

    final = stream.get_final_message()
    print(f"\n\n用量:{final.usage}")

Node.js / TypeScript

安装:

npm install @anthropic-ai/sdk
# 或
bun add @anthropic-ai/sdk

基础调用:

import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic({
  apiKey: 'sk-your-api-key',
  baseURL: 'https://www.yunsell.com', // 注意:不带 /v1
});

const message = await client.messages.create({
  model: 'claude-sonnet-4-5',
  max_tokens: 1024,
  system: '你是一个乐于助人的助手',
  messages: [{ role: 'user', content: '你好,介绍一下你自己' }],
});

console.log(message.content[0].type === 'text' ? message.content[0].text : '');
console.log(message.usage);

流式调用:

const stream = client.messages.stream({
  model: 'claude-sonnet-4-5',
  max_tokens: 1024,
  messages: [{ role: 'user', content: '写一首关于春天的短诗' }],
});

stream.on('text', (text) => process.stdout.write(text));

const final = await stream.finalMessage();
console.log('\n\n用量:', final.usage);

三、其他语言与框架

Go(标准库 net/http)

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
)

func main() {
	body, _ := json.Marshal(map[string]any{
		"model": "gpt-4o",
		"messages": []map[string]string{
			{"role": "user", "content": "你好,介绍一下你自己"},
		},
	})

	req, _ := http.NewRequest("POST",
		"https://www.yunsell.com/v1/chat/completions",
		bytes.NewReader(body))
	req.Header.Set("Authorization", "Bearer sk-your-api-key")
	req.Header.Set("Content-Type", "application/json")

	resp, err := http.DefaultClient.Do(req)
	if err != nil {
		panic(err)
	}
	defer resp.Body.Close()

	data, _ := io.ReadAll(resp.Body)
	fmt.Println(string(data))
}

LangChain(Python)

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model="gpt-4o",
    api_key="sk-your-api-key",
    base_url="https://www.yunsell.com/v1",
)

print(llm.invoke("你好,介绍一下你自己").content)

四、通过环境变量配置

两家官方 SDK 都支持从环境变量读取地址与密钥,代码中可不写死任何配置:

# OpenAI SDK
export OPENAI_API_KEY="sk-your-api-key"
export OPENAI_BASE_URL="https://www.yunsell.com/v1"

# Anthropic SDK
export ANTHROPIC_API_KEY="sk-your-api-key"
export ANTHROPIC_BASE_URL="https://www.yunsell.com"

配置后初始化不需要传参:

from openai import OpenAI
client = OpenAI()  # 自动读取环境变量

五、通用建议

  1. 密钥安全:API Key 只放在服务端(环境变量/密钥管理),严禁写入前端代码或客户端 App——任何能被用户看到的地方都等于公开。
  2. 超时设置:大模型生成耗时较长,HTTP 客户端超时建议设为 60 秒以上;长文本/推理模型场景建议改用流式,避免网关或负载均衡器的空闲超时。
  3. 重试策略:官方 SDK 默认对 429/5xx 自动重试;自行封装 HTTP 时建议对这两类状态码做指数退避重试,400/401/403 属于确定性错误,重试无意义。
  4. 用量对账:非流式看响应 usage 字段;OpenAI 格式流式需开启 stream_options.include_usage,Anthropic 格式流式以 message_delta 事件中的用量为准。

六、常见问题

Q:请求返回 404?

  • OpenAI SDK 的 base_url 少了 /v1 后缀,或 Anthropic SDK 的 base_url 多带了 /v1(该 SDK 会自动拼接 /v1/messages,重复拼接会变成 /v1/v1/messages)。

Q:请求返回 401?

  • 检查 API Key 是否完整(含 sk- 前缀)、是否过期或被禁用;自行拼请求头时确认格式为 Authorization: Bearer sk-xxx

Q:流式响应收不到内容?

  • 确认已设置 stream: true;自建反向代理(Nginx 等)需关闭响应缓冲(proxy_buffering off),否则 SSE 会被整体缓冲到结束才一次性返回。

下一步