附录
SDK 示例
使用 OpenAI / Anthropic 官方 SDK 及各语言 HTTP 客户端接入平台的完整代码示例
概述
平台同时兼容 OpenAI 与 Anthropic 两大 SDK 生态,接入时无需修改业务代码逻辑,只需把 SDK 的 API 地址(base URL)和密钥替换为平台提供的值:
| SDK | base 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() # 自动读取环境变量五、通用建议
- 密钥安全:API Key 只放在服务端(环境变量/密钥管理),严禁写入前端代码或客户端 App——任何能被用户看到的地方都等于公开。
- 超时设置:大模型生成耗时较长,HTTP 客户端超时建议设为 60 秒以上;长文本/推理模型场景建议改用流式,避免网关或负载均衡器的空闲超时。
- 重试策略:官方 SDK 默认对 429/5xx 自动重试;自行封装 HTTP 时建议对这两类状态码做指数退避重试,400/401/403 属于确定性错误,重试无意义。
- 用量对账:非流式看响应
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 会被整体缓冲到结束才一次性返回。
下一步
- 查看 OpenAI Chat Completions 接入教程 了解全部请求参数与工具调用
- 查看 Anthropic Messages 接入教程 了解 Claude 原生接口细节
- 返回 快速接入教程 了解密钥获取与基础配置