JuCode 文档

SDK 迁移

把 OpenAI、Anthropic 官方 SDK 和 Claude Code 指向 JuCode。

JuCode 不提供自己的 SDK,也不需要。用各家官方 SDK,改 base URL 即可。

Base URL 对照

你在用的 SDKBase 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_kthinkingcache_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 允许头列表里)。

On this page