SDK 迁移
把 OpenAI、Anthropic 官方 SDK 和 Claude Code 指向 JuCode。
JuCode 不提供自己的 SDK,也不需要。用各家官方 SDK,改 base URL 即可。
Base URL 对照
| 你在用的 SDK | Base URL |
|---|---|
| OpenAI 系(Chat Completions / Responses / Embeddings / Images / Audio) | https://api.jucode.cn/v1 |
| Anthropic 系(Messages) | https://api.jucode.cn/anthropic |
注意 Anthropic 的路径不在 /v1 下
完整路径是 /anthropic/v1/messages,不是 /v1/anthropic/messages。
Anthropic SDK 会自己在 base URL 后拼 /v1/messages,所以 base URL 填到
.../anthropic 为止就对了。
OpenAI SDK
from openai import OpenAI
client = OpenAI(
api_key="sk-juc-...",
base_url="https://api.jucode.cn/v1",
)也可以完全不改代码,走环境变量:
export OPENAI_API_KEY="sk-juc-..."
export OPENAI_BASE_URL="https://api.jucode.cn/v1"Responses API 的差异
如果你用的是 client.responses.create(),注意本网关的 /v1/responses
强制流式。传 stream=False 也会返回 SSE,SDK 按非流式解析会失败。
# 正确
stream = client.responses.create(model="gpt-5.4", input="...", stream=True)
for event in stream:
...
# 会失败——网关照样返回 SSE
resp = client.responses.create(model="gpt-5.4", input="...")需要一次性拿到完整结果的话,把流收完自己拼接,或者改用
/v1/chat/completions——它的非流式是正常工作的。
Anthropic SDK
from anthropic import Anthropic
client = Anthropic(
api_key="sk-juc-...",
base_url="https://api.jucode.cn/anthropic",
)
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "你好"}],
)
print(msg.content[0].text)两条执行路径
Anthropic 端点内部有两条路径,行为不同,而你无法从外部预知走哪条——取决于该模型 在后台路由到了哪家上游。
原生路径:上游本身就是 Anthropic。你的请求字节原样转发,只改 model。所有字段
都保留,包括 top_k、thinking、cache_control 这些。
桥接路径:上游是 OpenAI 兼容厂商。网关把请求降级翻译成 Chat Completions,再把 响应还原成 Anthropic 格式。此时只有下列字段保留:
model max_tokens system messages stream
temperature top_p stop_sequences tools tool_choice metadata其余字段被静默丢弃,不报错。
实际建议:如果你依赖某个 Anthropic 专有参数(尤其是 thinking 和 prompt 缓存的
cache_control),先确认目标模型确实路由到 Anthropic 上游,别假设它一定生效。
桥接路径的其他差异
message_start事件里的usage恒为0,真实用量在结尾的message_delta中- SSE 没有
[DONE]哨兵,以event: message_stop结束(官方 API 也是如此) - 上游返回的
reasoning_content(DeepSeek 系字段)会转成 Anthropic 的thinking块 - 工具调用参数若不是合法 JSON,会以
{"_raw_arguments": "<原始字符串>"}形式给出, 而不是直接报错
max_tokens 建议显式传
官方 API 要求 max_tokens 必填,本网关不强制,仅当 > 0 时才转发给上游。
也就是说不传它不会报错,但输出长度会由上游的默认值决定——而不同厂商的默认值不一样。 想要行为可预期,就显式传。
Claude Code
设置两个环境变量即可:
export ANTHROPIC_BASE_URL="https://api.jucode.cn/anthropic"
export ANTHROPIC_AUTH_TOKEN="sk-juc-..."LangChain
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-5.4",
api_key="sk-juc-...",
base_url="https://api.jucode.cn/v1",
)会话粘性(可选)
多轮对话时带上 conversation_id 请求头,网关会尽量把同一会话路由到同一个上游账号,
提升 prompt cache 命中率——对长上下文的重复请求,这能明显降低成本和首字延迟。
resp = client.chat.completions.create(
model="gpt-5.4",
messages=messages,
extra_headers={"conversation_id": session_id},
)值由你自己生成,只要同一会话保持一致即可。这是 JuCode 扩展,非 OpenAI 标准, 且浏览器端不可用(不在 CORS 允许头列表里)。