一份文档,
三套协议。
LemonGir AI 同时兼容 OpenAI 与 Anthropic 两家的接口格式。已有代码无论用哪家 SDK,替换 base_url 和 api_key 即可直连全部模型。
概览
网关只做一件事:把多家上游模型收敛到一个入口、一套鉴权、一份账单。
Base URL
所有协议共用同一个根地址
鉴权头
OpenAI 风格 Bearer,Anthropic 风格 x-api-key 均可
计费
按量计费,人民币结算,分组折扣低至官方价 1.8 折
限流
单用户每分钟成功请求上限,超出返回 429
模型名与实时价格请以 模型广场 为准,本页示例中的模型名(如 glm-5.3、claude-sonnet-5)均为当前已上线型号。
鉴权与端点
在 控制台 → 令牌 创建 API Key(以 sk- 开头)。Key 绑定分组与额度上限,建议每个应用单独一把。
端点一览
鉴权方式
两种写法等价,网关会自动识别。OpenAI 路径与 Anthropic 路径都接受任一种:
# 方式一 · OpenAI 风格(推荐)
Authorization: Bearer sk-你的令牌
# 方式二 · Anthropic 风格(/v1/messages 也接受方式一)
x-api-key: sk-你的令牌
anthropic-version: 2023-06-01
API Key 只在服务端使用。不要把它写进前端代码、公开仓库或客户端分发包;一旦泄露请立即在控制台删除并重建。
快速开始
用官方 SDK 时只需改两个参数。下面三种语言任选其一,30 秒跑通第一条请求。
from openai import OpenAI
client = OpenAI(
api_key="sk-你的令牌",
base_url="https://ai.lemongir.shop/v1",
)
resp = client.chat.completions.create(
model="glm-5.3",
messages=[
{"role": "system", "content": "你是一个简洁的助手。"},
{"role": "user", "content": "用一句话介绍你自己"},
],
temperature=0.7,
max_tokens=512,
)
print(resp.choices[0].message.content)
print(resp.usage) # prompt_tokens / completion_tokens / total_tokens
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-你的令牌",
baseURL: "https://ai.lemongir.shop/v1",
});
const resp = await client.chat.completions.create({
model: "kimi-k2.6",
messages: [
{ role: "system", content: "你是一个简洁的助手。" },
{ role: "user", content: "用一句话介绍你自己" },
],
temperature: 0.7,
max_tokens: 512,
});
console.log(resp.choices[0].message.content);
curl https://ai.lemongir.shop/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer sk-你的令牌" \
-d '{
"model": "qwen3.8-max",
"messages": [
{"role": "system", "content": "你是一个简洁的助手。"},
{"role": "user", "content": "用一句话介绍你自己"}
],
"temperature": 0.7,
"max_tokens": 512
}'
充值比例 1:1(人民币 = 美元),按分组享官方价 1.8 折起。每次调用的精确扣费在 调用日志 中逐条可查。
OpenAI Chat Completions
POST /v1/chat/completions — 生态最广的对话接口,几乎所有客户端和框架都原生支持。全部文本模型可用。
请求体
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 模型 ID,如 glm-5.3。传 auto 由网关按可用性自动路由。 |
| messages | array | 是 | 对话历史。每项含 role(system / user / assistant / tool)与 content(字符串或多模态数组)。 |
| stream | boolean | 否 | 默认 false。true 时以 SSE 增量返回,见 流式输出。 |
| temperature | number | 否 | 0 – 2,默认 1。越低越确定,越高越发散。与 top_p 二选一调整。 |
| top_p | number | 否 | 0 – 1,核采样阈值。默认 1。 |
| max_tokens | integer | 否 | 输出 token 上限。不传由模型默认;建议显式设置以控制成本。 |
| max_completion_tokens | integer | 否 | 新版字段,含推理 token。与 max_tokens 二选一。 |
| stop | string | array | 否 | 最多 4 个停止序列,命中即截断。 |
| presence_penalty | number | 否 | -2 – 2。正值抑制已出现过的话题重复。 |
| frequency_penalty | number | 否 | -2 – 2。正值按出现频次抑制重复用词。 |
| n | integer | 否 | 生成候选数,默认 1。按 n 倍计费。 |
| seed | integer | 否 | 尽力复现的随机种子(不保证严格确定)。 |
| response_format | object | 否 | {"type":"json_object"} 强制 JSON;{"type":"json_schema","json_schema":{…}} 按 schema 约束。需模型支持。 |
| tools | array | 否 | 函数定义列表,见 工具调用。 |
| tool_choice | string | object | 否 | auto(默认)/ none / required / 指定某个函数。 |
| parallel_tool_calls | boolean | 否 | 是否允许一次返回多个工具调用,默认 true。 |
| reasoning_effort | string | 否 | 推理模型专用:low / medium / high。控制思考深度与耗时。 |
| stream_options | object | 否 | {"include_usage": true} 让流式最后一帧带 usage。 |
| user | string | 否 | 终端用户标识,便于你自己按用户归集日志。 |
多模态输入
content 传数组即可混合文本与图片。图片支持公网 URL 或 base64 data URL:
{
"model": "qwen3.8-max",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "这张图里有什么?" },
{ "type": "image_url",
"image_url": { "url": "https://example.com/photo.jpg", "detail": "auto" } }
]
}]
}
响应体
{
"id": "chatcmpl-9f3a…",
"object": "chat.completion",
"created": 1756900000,
"model": "glm-5.3",
"choices": [{
"index": 0,
"message": { "role": "assistant", "content": "我是一个简洁的 AI 助手。" },
"finish_reason": "stop" // stop | length | tool_calls | content_filter
}],
"usage": {
"prompt_tokens": 28,
"completion_tokens": 12,
"total_tokens": 40
}
}
OpenAI Responses
POST /v1/responses — OpenAI 新一代接口,用 input 取代 messages,输出为结构化 output 数组,天然支持多轮工具编排。GPT 系列与部分国产模型可用。
resp = client.responses.create(
model="gpt-5.6-luna",
instructions="你是一个简洁的助手。", # 等价于 system prompt
input="用一句话介绍你自己", # 字符串或 message 数组
max_output_tokens=512,
reasoning={"effort": "medium"}, # 推理模型可选
)
print(resp.output_text) # SDK 便捷字段, 拼接全部文本输出
与 Chat Completions 的字段对照
| Chat Completions | Responses | 说明 |
|---|---|---|
| messages | input | 可直接传字符串,也可传 role/content 数组 |
| messages[role=system] | instructions | 顶层字段,不再塞进消息数组 |
| max_tokens | max_output_tokens | 含推理 token |
| reasoning_effort | reasoning.effort | 嵌套对象 |
| response_format | text.format | 结构化输出改到 text 下 |
| tools[].function | tools[](扁平) | name / parameters 直接位于 tool 对象上 |
| choices[0].message | output[] | 数组,元素类型为 message / function_call / reasoning 等 |
| usage.prompt_tokens | usage.input_tokens | 命名变化 |
| usage.completion_tokens | usage.output_tokens | 命名变化 |
Responses 的 previous_response_id(服务端状态续接)依赖上游支持,网关不保证所有模型可用。跨轮对话建议仍由客户端自行维护 input 数组。
Anthropic Messages
POST /v1/messages — Claude 原生格式。用 Anthropic 官方 SDK 或 Claude Code 等工具时走这条路径,网关会把它透明转发或翻译到非 Claude 模型。
from anthropic import Anthropic
client = Anthropic(
api_key="sk-你的令牌",
base_url="https://ai.lemongir.shop", # 注意: 不带 /v1, SDK 会自动补
)
msg = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024, # Anthropic 协议中为必填
system="你是一个简洁的助手。", # 顶层字段, 不放进 messages
messages=[{"role": "user", "content": "用一句话介绍你自己"}],
)
print(msg.content[0].text)
print(msg.usage) # input_tokens / output_tokens
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: "sk-你的令牌",
baseURL: "https://ai.lemongir.shop",
});
const msg = await client.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
system: "你是一个简洁的助手。",
messages: [{ role: "user", content: "用一句话介绍你自己" }],
});
console.log(msg.content[0].type === "text" ? msg.content[0].text : msg.content);
curl https://ai.lemongir.shop/v1/messages \
-H "Content-Type: application/json" \
-H "x-api-key: sk-你的令牌" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"system": "你是一个简洁的助手。",
"messages": [{"role": "user", "content": "用一句话介绍你自己"}]
}'
请求体
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| model | string | 是 | 模型 ID。可填 Claude 系列,也可填其他模型由网关翻译。 |
| max_tokens | integer | 是 | 输出上限。Anthropic 协议要求必填,漏传会 400。 |
| messages | array | 是 | 仅 user / assistant 两种 role,须交替出现,首条为 user。content 为字符串或 content block 数组。 |
| system | string | array | 否 | 系统提示,顶层字段。数组形式可给单块加 cache_control。 |
| stream | boolean | 否 | SSE 流式,事件类型见 流式输出。 |
| temperature | number | 否 | 0 – 1(注意上限是 1,不是 2)。默认 1。 |
| top_p | number | 否 | 核采样。与 temperature 建议只调一个。 |
| top_k | integer | 否 | 仅从概率最高的 k 个 token 采样。 |
| stop_sequences | array | 否 | 停止序列,命中时 stop_reason 为 stop_sequence。 |
| tools | array | 否 | 每项含 name / description / input_schema(JSON Schema)。 |
| tool_choice | object | 否 | {"type":"auto"} / {"type":"any"} / {"type":"tool","name":"…"}。 |
| thinking | object | 否 | {"type":"enabled","budget_tokens":4096} 开启扩展思考,思考内容以 thinking block 返回。 |
| metadata | object | 否 | {"user_id":"…"} 终端用户标识。 |
响应体
{
"id": "msg_01Xa…",
"type": "message",
"role": "assistant",
"model": "claude-sonnet-5",
"content": [
{ "type": "text", "text": "我是一个简洁的 AI 助手。" }
],
"stop_reason": "end_turn", // end_turn | max_tokens | stop_sequence | tool_use
"stop_sequence": null,
"usage": { "input_tokens": 31, "output_tokens": 14 }
}
两套协议关键差异
| 维度 | OpenAI Chat Completions | Anthropic Messages |
|---|---|---|
| 系统提示 | messages 里 role=system | 顶层 system 字段 |
| max_tokens | 可选 | 必填 |
| temperature 范围 | 0 – 2 | 0 – 1 |
| 消息顺序 | 无强约束 | user / assistant 严格交替 |
| 输出结构 | choices[].message.content 字符串 | content[] block 数组 |
| 结束原因 | finish_reason: stop / length / tool_calls | stop_reason: end_turn / max_tokens / tool_use |
| 工具结果回传 | role=tool 消息 | user 消息内 tool_result block |
| 用量字段 | prompt_tokens / completion_tokens | input_tokens / output_tokens |
图像生成
POST /v1/images/generations — 当前接入 gpt-image-2,按张计费 ¥0.03 / 张。需使用「生图」分组的令牌。
img = client.images.generate(
model="gpt-image-2",
prompt="极简风格的红色柠檬 logo,白底,矢量感",
size="1024x1024", # 1024x1024 | 1536x1024 | 1024x1536
quality="medium", # low | medium | high
n=1,
)
print(img.data[0].url or img.data[0].b64_json)
| 参数 | 类型 | 说明 |
|---|---|---|
| prompt | string | 必填。描述越具体越好,支持中文。 |
| size | string | 默认 1024x1024。横竖版 1536x1024 / 1024x1536。 |
| quality | string | low / medium / high,影响耗时与细节。 |
| n | integer | 张数,默认 1。按张计费。 |
| response_format | string | url(默认)或 b64_json。 |
向量嵌入
POST /v1/embeddings — 把文本转成向量用于检索、聚类与 RAG。可用的嵌入模型以模型广场「嵌入」分类为准。
emb = client.embeddings.create(
model="你的嵌入模型",
input=["第一段文本", "第二段文本"], # 字符串或字符串数组, 批量更省
encoding_format="float", # float | base64
)
vec = emb.data[0].embedding # list[float]
print(len(vec), emb.usage.total_tokens)
通用参数详解
这几个参数决定了输出的"性格"。理解它们比换模型更能改善效果。
temperature — 随机性
控制采样时对低概率 token 的宽容度。0 接近贪心解码,同样输入几乎总得同样输出,适合抽取、分类、代码补全;0.7 – 1.0 是对话与写作的常用区间;> 1.2 用于头脑风暴,但容易失控。OpenAI 协议上限 2,Anthropic 协议上限 1。
top_p — 核采样
只从累计概率达到 p 的最小 token 集合里采样。top_p=0.1 意味着只考虑最可能的那 10% 概率质量。与 temperature 效果部分重叠,官方建议二者只调一个,另一个保持默认。
max_tokens — 输出上限
触顶时 finish_reason 为 length(Anthropic 为 max_tokens),内容被硬截断。这是控制单次调用最大成本的直接手段。注意它不是"期望长度"——模型不会因为上限大就写得长。需要短回答请在提示词里说。
presence_penalty / frequency_penalty — 去重复
都在 -2 到 2 之间,默认 0。presence 对"出现过"一刀切扣分,鼓励换话题;frequency 按出现次数累积扣分,抑制口水词。长文生成出现循环时,先把 frequency 调到 0.3 – 0.6 试试。负值反而鼓励重复,几乎不用。
stop — 停止序列
模型生成到任一序列时立即停止,且序列本身不会出现在输出里。典型用法:多轮模拟时用 ["\nUser:"] 防止模型替用户说话;生成列表时用 ["\n\n"] 只取一段。
response_format — 结构化输出
json_object 模式保证返回合法 JSON,但结构由提示词约束;json_schema 模式按你给的 schema 严格约束字段与类型。用 JSON 模式时提示词里必须提到 "JSON",否则部分模型会报错。
"response_format": {
"type": "json_schema",
"json_schema": {
"name": "sentiment",
"strict": true,
"schema": {
"type": "object",
"properties": {
"label": { "type": "string", "enum": ["positive", "neutral", "negative"] },
"score": { "type": "number" }
},
"required": ["label", "score"],
"additionalProperties": false
}
}
}
reasoning_effort / thinking — 推理深度
推理模型(DeepSeek V4 Pro、MiniMax M2.x、Claude 等)会在回答前"思考"。OpenAI 协议用 reasoning_effort: low | medium | high;Anthropic 协议用 thinking: {type:"enabled", budget_tokens: N} 直接给思考预算。思考 token 也计费,简单任务请用 low 或关闭。
流式输出
传 "stream": true 后,响应变为 text/event-stream,每帧一个 data: 行。首 token 延迟通常从数秒降到几百毫秒。
OpenAI 协议帧格式
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"我是"},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"一个助手。"},"finish_reason":null}]}
data: {"id":"chatcmpl-…","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-…","choices":[],"usage":{"prompt_tokens":28,"completion_tokens":12,"total_tokens":40}} ← 需 stream_options.include_usage
data: [DONE]
stream = client.chat.completions.create(
model="deepseek-v4-flash-0731",
messages=[{"role": "user", "content": "写一首关于柠檬的短诗"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
if chunk.usage:
print("\n", chunk.usage)
const stream = await client.chat.completions.create({
model: "deepseek-v4-flash-0731",
messages: [{ role: "user", content: "写一首关于柠檬的短诗" }],
stream: true,
stream_options: { include_usage: true },
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
if (chunk.usage) console.log("\n", chunk.usage);
}
Anthropic 协议事件类型
Anthropic 的流用命名事件而非统一 chunk,顺序固定:
| event | 说明 |
|---|---|
| message_start | 整体消息骨架,含 id / model / 初始 usage(input_tokens) |
| content_block_start | 一个 content block 开始,带 index 与 type(text / tool_use / thinking) |
| content_block_delta | 增量。text 为 text_delta;工具参数为 input_json_delta(partial_json 需拼接) |
| content_block_stop | 该 block 结束 |
| message_delta | 顶层字段变化:stop_reason 与 usage.output_tokens |
| message_stop | 流结束 |
| ping | 心跳,可忽略 |
| error | 中途出错,body 含 error.type / error.message |
with client.messages.stream(
model="claude-sonnet-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(final.usage)
工具调用
让模型决定"该调哪个函数、传什么参数",你执行后把结果回填,模型再组织最终回答。这是 Agent 的基本回路。
OpenAI 协议
import json
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string", "description": "城市名"}},
"required": ["city"],
},
},
}]
messages = [{"role": "user", "content": "上海现在多少度?"}]
# 第一轮: 模型决定调用工具
r1 = client.chat.completions.create(model="glm-5.3", messages=messages, tools=tools)
call = r1.choices[0].message.tool_calls[0]
args = json.loads(call.function.arguments) # {"city": "上海"}
# 你执行真正的函数
result = get_weather(**args) # 例: {"temp": 27, "desc": "多云"}
# 第二轮: 回填结果, 模型组织答案
messages += [
r1.choices[0].message, # 含 tool_calls 的 assistant 消息
{"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)},
]
r2 = client.chat.completions.create(model="glm-5.3", messages=messages, tools=tools)
print(r2.choices[0].message.content) # "上海现在 27℃,多云。"
Anthropic 协议
工具定义用 input_schema,模型返回 tool_use block,结果以 tool_result block 放在下一条 user 消息里回传:
tools = [{
"name": "get_weather",
"description": "查询指定城市的实时天气",
"input_schema": {"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]},
}]
messages = [{"role": "user", "content": "上海现在多少度?"}]
r1 = client.messages.create(model="claude-sonnet-5", max_tokens=1024,
tools=tools, messages=messages)
use = next(b for b in r1.content if b.type == "tool_use")
result = get_weather(**use.input)
messages += [
{"role": "assistant", "content": r1.content},
{"role": "user", "content": [{
"type": "tool_result",
"tool_use_id": use.id,
"content": json.dumps(result),
}]},
]
r2 = client.messages.create(model="claude-sonnet-5", max_tokens=1024,
tools=tools, messages=messages)
print(r2.content[0].text)
写好 description 比调参更重要——模型完全靠它判断何时调用。参数描述里写清单位、格式与取值范围,能显著减少幻觉参数。
流式 + 工具调用时,参数 JSON 会被拆成碎片逐帧到达,务必拼接完整后再 parse。
模型参数矩阵
上下文与最大输出取自各厂商官方文档(2026-09 核对)。网关不裁剪上游限制,但单次请求耗时受 300 秒读超时约束。分组与价格见 模型广场。
| 模型 | 厂商 | 上下文 | 最大输出 | 推理模式 | 多模态输入 | 来源 |
|---|---|---|---|---|---|---|
| glm-5.3 | 智谱 | 1M | 128K | 始终开启 · effort low/high/max | 文本 | Z.ai 文档 |
| glm-5.3-flash | 智谱 | 1M | 128K | 始终开启 | 文本 / 图片 / 视频 / 文件 | Z.ai 文档 |
| glm-5.1 · glm-5 | 智谱 | 200K | 128K | 可选 thinking | 文本 | 智谱开放文档 |
| kimi-k2.6 | Moonshot | 256K | ≤ 256K(含推理) | Thinking 默认 / Instant 可选 | 文本 / 图片 | 模型卡 |
| kimi-k2.5 | Moonshot | 256K | 64K | 可选 thinking | 文本 / 图片 | 模型卡 |
| kimi-k2.7-code | Moonshot | 256K | ≤ 256K(含推理) | 始终开启 · temperature 锁定 1.0 | 文本 | Kimi 平台 |
| qwen3.8-max | 阿里 | 1M | 128K | 可选 enable_thinking | 文本 / 图片 / 视频 | 百炼文档 |
| qwen3.7-max | 阿里 | 1M | 64K | 可选 enable_thinking | 文本(6 月快照起支持图片) | 百炼文档 |
| Qwen3.8-27B | 阿里 | 256K 原生(可扩至 1M) | 128K 建议值 | 可选 thinking | 文本 / 图片 | 模型卡 |
| deepseek-v4-pro-0813 | DeepSeek | 1M | 384K | thinking 默认 · effort low/high/max | 文本 | DeepSeek 文档 |
| deepseek-v4-flash-0731 | DeepSeek | 1M | 384K | thinking / non-thinking | 文本 | DeepSeek 文档 |
| minimax-m2.7 · m2.5 | MiniMax | 200K(输入 + 输出共用) | 建议 64K · 上限 200K | 始终开启,不可关闭 | 文本 | MiniMax 文档 |
| seed-2.1-pro · turbo | 字节 | 256K | 256K(默认 4K,需显式设 max_tokens) | 深度思考 | 文本 / 图片 | 火山方舟 |
| mimo-v2.5-pro | 小米 | 1M | 128K | 可选 thinking | 文本 | 小米官网 |
| claude-sonnet-5 | Anthropic · 福利 | 1M | 128K | Adaptive thinking | 文本 / 图片 / PDF | Anthropic 文档 |
| gpt-5.6-luna | OpenAI · 福利 | 1.05M(>272K 输入部分上游加价) | 128K | effort none → max | 文本 / 图片 | OpenAI 文档 |
| gpt-image-2 | OpenAI · 生图 | — | 1024² / 1536×1024 / 1024×1536 | — | 文本 → 图片 | — |
| auto | 网关路由 | 随所选模型 | 随所选模型 | 随所选模型 | 文本 | — |
表中数值为厂商官方 API 的公开上限。网关接入的具体渠道可能低于此值(例如第三方托管版本常将输出压到 128K 以内),实际以响应中的 finish_reason / usage 为准。发现不一致请反馈,我们会同步修正。
计费与限流
全部以人民币计价。当前所有模型都是按次计费:一次请求扣一次固定费用,与 token 数无关。
文本模型
default 分组全部文本模型统一价,不区分输入输出、不区分推理 token。
福利分组
海外旗舰按次单价略高,仍远低于按 token 直采。
gpt-5.6-luna ¥0.01 / 次
图像模型
按张计费,与 prompt 长度、尺寸无关。
速率限制
单用户每分钟 200 次成功请求。超出返回 429,等待下一分钟窗口即恢复。
按次计费意味着:一次塞满上下文的长请求和一次"你好"扣费相同。流式请求同样只算一次。失败(4xx / 5xx)的请求不扣费。响应里的 usage 字段仍会如实返回 token 用量,方便你自己做统计。
分组折扣(default / 国模 / 腾讯限量 / 生图)低至官方价 1.8 折,不在单价之上再加价。每次调用的模型、耗时、扣费在 调用日志 逐条可查。建议给每把令牌设额度上限;额度不足时可在 钱包 充值,实时到账。
错误码
错误响应统一为 {"error": {"message", "type", "code"}}。HTTP 状态码决定重试策略。
| HTTP | 常见 type / code | 原因 | 处理 |
|---|---|---|---|
| 400 | invalid_request_error | 参数缺失或格式错误;Anthropic 协议漏传 max_tokens;messages 顺序不合法 | 检查请求体,不要重试 |
| 401 | authentication_error | Key 缺失、格式错误、已删除或被禁用 | 确认 Authorization: Bearer sk-…,到控制台核对令牌状态 |
| 403 | permission_denied | 令牌所属分组无权使用该模型(如 default 分组调 claude-sonnet-5) | 切换到有权限的分组或申请福利分组 |
| 404 | model_not_found | 模型名拼写错误或已下线 | 到模型广场复制准确 ID,注意大小写 |
| 413 | context_length_exceeded | 输入超出模型上下文窗口 | 裁剪历史、摘要压缩,或换大上下文模型 |
| 429 | rate_limit_exceeded | 超过 200 req/min;或额度用尽(insufficient_quota) | 指数退避重试;额度问题去充值 |
| 500 | api_error | 网关内部错误 | 重试一次,持续失败请联系管理员 |
| 502 / 503 | upstream_error | 上游渠道超时或不可用 | 重试或临时切换模型;auto 会自动绕开故障渠道 |
| 529 | overloaded_error | 上游过载(Anthropic 特有) | 退避 5 – 30 秒后重试 |
import time
from openai import OpenAI, RateLimitError, APIStatusError
def ask(messages, retries=4):
for i in range(retries):
try:
return client.chat.completions.create(model="glm-5.3", messages=messages)
except RateLimitError:
time.sleep(2 ** i) # 1s, 2s, 4s, 8s
except APIStatusError as e:
if e.status_code in (502, 503, 529):
time.sleep(2 ** i)
else:
raise # 4xx 参数问题不重试
raise RuntimeError("retries exhausted")
客户端配置
任何支持"自定义 OpenAI 兼容端点"的工具都能直接用。填下面两个值即可。
OpenAI 兼容类
Cherry Studio · Lobe Chat · NextChat · Open WebUI · DeepChat · 沉浸式翻译 · 流畅阅读 · Cursor · Continue
API Key = sk-…
Anthropic 兼容类
Claude Code · Cline · Roo Code 等选择 Anthropic 供应商时
ANTHROPIC_API_KEY = sk-…
Claude Code
export ANTHROPIC_BASE_URL="https://ai.lemongir.shop"
export ANTHROPIC_API_KEY="sk-你的令牌"
export ANTHROPIC_MODEL="claude-sonnet-5" # 或任何文本模型, 如 kimi-k2.7-code
claude
Cursor / Continue / Cline
选择 OpenAI Compatible 供应商,Base URL 填 https://ai.lemongir.shop/v1,模型名手动填写(如 kimi-k2.7-code)。部分工具会先请求 /v1/models 拉列表,若为空请直接手填模型名。
LangChain / LlamaIndex
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="glm-5.3",
api_key="sk-你的令牌",
base_url="https://ai.lemongir.shop/v1",
temperature=0.3,
)
print(llm.invoke("你好").content)
在 令牌页 点击「聊天」可一键跳转到已填好参数的在线客户端。
常见问题
遇到问题先看这里,多数情况 30 秒内能解决。
用 Anthropic SDK 时 base_url 到底带不带 /v1?
不带。Anthropic SDK 会自动在 base_url 后拼 /v1/messages,填 https://ai.lemongir.shop 即可。OpenAI SDK 则相反,要填到 /v1。
能用 Anthropic 格式调国产模型吗?
可以。/v1/messages 路径下 model 填 glm-5.3 等任意文本模型,网关会做协议翻译。反过来用 Chat Completions 调 claude-sonnet-5 也行。
为什么同样的请求两次结果不一样?
temperature > 0 时采样有随机性。要复现请把 temperature 设为 0,并传固定 seed;即便如此上游也只承诺"尽力"确定。
返回被截断了怎么办?
看 finish_reason:为 length 说明撞到 max_tokens 上限,调大即可;为 content_filter 说明触发上游安全策略,需调整提示词。
流式请求中途断开?
网关对流式连接的读超时为 300 秒。长任务请确保客户端不设更短超时,并处理 [DONE] 之前的异常断连(记录已收到的内容后重试)。
token 用量会影响扣费吗?
不会。当前所有模型按次计费,一次请求固定扣一次费用(文本模型 ¥0.001)。响应里的 usage 只是上游如实回报的 token 数,供你自己统计,不参与扣费。
如何申请福利分组?
福利分组包含 Claude Sonnet 5、GPT-5.6 Luna 等,倍率同样为 1.0。目前需联系管理员开通,开通后在创建令牌时选择「福利分组」。
数据会被存储吗?
网关只记录计费与排障所需的元数据(时间、模型、token 数、状态码、耗时),不存储请求与响应正文。传输全程 HTTPS。