标准 OpenAI 接口。拿到激活码先在首页兑换成 Key,再按下面接入。
Authorization: Bearer <你的Key>model 填下方模型 ID;省略则默认 Stella| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /v1/chat/completions | 对话补全,流式 / 非流式 |
| GET | /v1/models | 可用模型列表 |
| POST | /api/register | 激活码注册账号(首页已封装) |
| POST | /v1/embeddings | 文本向量(模型填 Sextant) |
| POST | /v1/search | 联网搜索,返回结构化结果,可选让模型写带引用的答案 |
| POST | /search | 同上,Tavily 兼容别名:把 base_url 指过来即可 |
| POST | /v1/extract | 抓取指定网页的正文并抽取;别名 /extract(Tavily 兼容) |
| POST | /mcp | MCP 端点(Streamable HTTP),给 Claude Code / Claude Desktop 等客户端用 |
| POST | /v1/video/generations | 提交一次视频渲染,立刻返回 job_id 与报价(异步) |
| GET | /v1/video/jobs/{id} | 查任务状态;done 时顺带把产物取回本地 |
| GET | /v1/video/jobs/{id}/content | 取 mp4 |
| GET | /v1/video/jobs | 我的任务列表 |
| DELETE | /v1/video/jobs/{id} | 取消(不退费) |
| POST | /v1/video/uploads | 上传参考图 / 参考视频,拿一个句柄回来 |
| — | /v1/videos(及 /{id}、/{id}/content) |
OpenAI 形状的别名,同一套限额与鉴权;给现成 SDK 用,见下文 |
| GET | /api/usage | 查用量(下方工具已封装) |
| GET | /api/savings | 省额度榜(首页已展示) |
六个:三个对话模型走 /v1/chat/completions,向量走
/v1/embeddings,搜索走 /v1/search,视频走
/v1/videos。各类不能互调,用错端点会返回 400 并告诉你该用哪些。
响应快、直接给答案,不思考,适合日常问答与短平快的任务。约 91 tok/s。
因为不思考,max_tokens 给多小都能正常出正文。常驻(Apple M 系 · 128GB)。
快、通用,适合日常编程、问答、Agent 与工具调用。约 95 tok/s。
会先思考,max_tokens 建议 ≥3000(网关已自动兜底)。常驻(Apple M 系 · 128GB)。
NVFP4 量化 + MTP 投机解码,单流约 120 tok/s,高并发聚合 2000+ tok/s, 上下文上限 262K——直接在请求里传更长即可。跑在 RTX PRO 6000 上, 可能不定时下线。跑分见下方。
把文本变成向量,做语义检索、RAG、聚类、去重。1024 维、 已 L2 归一化(余弦相似度直接等于点积)。吞吐约 5200 tok/s。 详见文本向量一节。
Novus 跑在部署者自己的 RTX PRO 6000 大显存 N 卡上,
可能不定时下线去跑别的实验,请勿依赖它的持续可用性。常驻的两个模型长期在线,但上下文有限制(见标签)。模型官方发布的跑分;本站运行的是接近无损的量化版本,实际表现可能有微小差异。
| 基准 | 分数 | 基准 | 分数 |
|---|---|---|---|
| MMLU-Pro | 86.2 | SWE-bench Verified | 77.2 |
| MMLU-Redux | 93.5 | LiveCodeBench v6 | 83.9 |
| GPQA Diamond | 87.8 | AIME 2026 | 94.1 |
| SuperGPQA | 66.0 | HMMT Feb 2026 | 84.3 |
| C-Eval | 91.4 | Terminal-Bench 2.0 | 59.3 |
| 模型 | 适合 | 倍率 | 推荐→上限 |
|---|---|---|---|
Stella默认 · 常驻 |
日常问答、写作、中文任务,最省额度 | ×0.33 | 8K → 24K |
Aurora常驻 |
编程、Agent、工具调用、较难的推理 | ×1 | 8K → 32K |
Novus限时福利 |
长文、复杂推理,速度最快;跑在独立 N 卡上,可能不定时下线 | ×2 | 16K → 262K |
413 拒绝——先缩短对话/输入,或换上限更高的模型。Stella 名义 24K、实际能装约 23.5K(约 96%);Aurora 与 Novus 同理。不必自己折算,超了会返回 413 并附上估算值。默认用 Stella 就够,省额度;需要更强或更快、且 Novus 在线时再用它。
# pip install openai
from openai import OpenAI
client = OpenAI(base_url="", api_key="你的Key")
r = client.chat.completions.create(
model="Stella", # 默认;或 "Aurora"
messages=[{"role":"user","content":"用 Python 写个二分查找"}],
)
print(r.choices[0].message.content)
换 model 字段就能切模型,下面用默认的 Stella 举例。
curl /v1/chat/completions \
-H "Authorization: Bearer 你的Key" \
-H "Content-Type: application/json" \
-d '{"model":"Stella",
"messages":[{"role":"user","content":"你好"}]}'
curl /v1/chat/completions \
-H "Authorization: Bearer 你的Key" \
-H "Content-Type: application/json" \
-d '{"model":"Stella",
"messages":[{"role":"user","content":"讲个冷笑话"}],
"stream":true}'
curl /v1/chat/completions \
-H "Authorization: Bearer 你的Key" \
-H "Content-Type: application/json" \
-d '{"model":"Novus",
"messages":[{"role":"user","content":"用一句话解释 KV 缓存"}],
"max_tokens":8192}'
reasoning_content 字段、答案在 content;
可用 X-Thinking 头开关思考。max_tokens 建议 ≥8000——实测 4096
仍可能被思考烧光、正文为空(网关已自动兜底到 8192,但你自己设大一点更省心)。详见下方
思考模式一节。curl /v1/search \
-H "Authorization: Bearer 你的Key" \
-H "Content-Type: application/json" \
-d '{"query":"KV cache 显存占用怎么算",
"search_depth":"advanced",
"include_answer":true,
"max_results":5}'
basic 只取各引擎给的摘要,几秒返回;
advanced 会真去抓取网页正文再抽取,慢十几秒但拿到的是完整正文而不是摘要。
注意它不保证每条都抓到——反爬包装的站点一律不抓(抓回来只会是验证页),
实测一次 advanced 通常有 2~3 条拿到正文。具体抓到几条、为什么没抓全,
看响应里的 danlu.extract(下面有一节专门讲)。/search 路径不变即可;api_key 放在请求体里
也认,不必改成请求头。按真正做了多少工作叠加,而不是按深度收一个打包价。
basicSextant 的倍率,
那是全站最低的一档include_answer 真写出答案时发生,
按合成模型自己的倍率另算——这一项通常比其余几项加起来还大danlu.extract.fetched——它就是这次按页收费的条数。basic 约
128、advanced 约 222、advanced+
include_answer 约 1150。写答案那一项占了八成以上,
不需要成段答案时就别开它。basic 且没开 include_answer 时命中不收费(实测扣 0)。
开了 include_answer 就不免费——缓存只省检索,答案照样要重新写一遍,
而那一项恰好是最贵的。advanced 命中时检索那一份不收,但正文仍要重新抓,
所以还有抓取费(实测 90)。"no_cache": true。注意它的语义是
不读缓存、结果照样写回缓存——和 HTTP 的 no-cache 一致
("不要存"是 no-store,那是另一回事)。这是本服务的一条硬规矩:最坏的失败不是报错,是沉默。 下面这些"要了没给到"的情况,响应里一定有一行说明,而不是悄悄给你降级过的结果。
search_depth(fast、
拼错的)会当 basic,认不出的 topic 会当 general,
max_results 超过 20 会被夹到 20,这三种都不会在响应里告诉你。
这么设计是为了客户端 SDK 升级后不至于整体报废(拒绝比降级更没道理),但代价就是这层
静默,写 agent 时别指望它会提示。danlu.extract只要用了
advanced 就一定有这个字段(哪怕正文全抓到了),所以"字段没有"只有
一种含义:不是 advanced。里面是
applied / fetched / results,不完整时还带
reason。applied:false = 服务繁忙、抓取槽位没排到,本次只给了引擎摘要——
重试通常就能拿到正文。applied:true 但 fetched < results = 那几条是反爬包装站点
(抓回来只会是验证页,一律不抓)或已知抽不出正文的死链——重试也不会变。danlu.time_filter在你传了
time_range 或 Tavily 的 days 时出现。注意
days 是天数(比如 7),而我们只认 day/week/month/year,
所以传 days 一定会得到 applied:false 和"无法识别的取值"——
想过滤时间请改用 time_range。applied:false 会连原因一起给出——
最常见的是时间过滤只在 topic:"news" 下生效:
general 话题下上游会把不支持该参数的引擎整台丢弃,实测池子从 88 条掉到
25 条、还出现了公司都不对的结果,净负收益,所以我们不应用它而是如实告诉你。danlu.extract.applied === false 就知道"值得重试一次";
看到 fetched < results 就知道"重试是浪费,换个查询或接受摘要"。
这个区分是故意做出来的——两种不完整的处置方式相反。在 opencode、Cursor 这类客户端里调"reasoning effort",本站怎么响应。
"reasoning_effort": "off | low | medium | high | max",
也认 "reasoning": {"effort": "high"}(两种都实测生效:
off → 思考 0,low → 预算 1024,high → 16384)。
IDE/CLI 发的就是这个字段,因为它们通常不给你改请求头的地方X-Thinking: off|low|medium|high|max,
还额外接受纯数字直接指定 token 预算(如 X-Thinking: 4096)。
请求体优先于请求头——头在客户端上设一次就固定了,分不出下一次调用Stella 不思考,
Aurora 的思考深度不可控(实测八种写法都无效)。发给它们不会报错,
但响应头会明说 X-Thinking-Effective: unsupported 和
X-Unsupported-Params: reasoning_effort,不会让你以为调上了X-Thinking-Effective:
off / 1024(low)/ 16384(high)——它是预算上限,
不是目标值。简单问题上 low 和 high 的实际思考长度可能差不多,因为模型本来就没用满X-Unknown-Params 会把它们列出来。想让我们支持某个开关,
把这个头贴给群主就行X-Thinking-Effective。 它是本站真正生效的档位(off /
1024 / 16384 / unsupported),与客户端无关。
配好之后打一发、看这个头,比读任何文档都可靠。@ai-sdk/openai-compatible,内部的 reasoning 选项是
reasoning: {effort} 形状——那个形状本站认。但具体该在
opencode.jsonc 里怎么写,本站没能验证通:给模型加
"options": {…} 之后 opencode 在非交互模式下卡在发请求之前(网关侧一条请求都
没收到),所以这里不给配置方案,免得照抄之后工具挂住。想调的话自己试,然后用
X-Thinking-Effective 确认到底有没有生效。Novus 有意义,给 Stella / Aurora 配了也只会拿到
unsupported。文生视频 / 图生视频 / 参考生视频,输出自带同步立体声。接口是异步的。
REQUEST_TIMEOUT 是 600 秒 —— 四档里有两档本身就超过它。所以没有同步接口,
只有"提交 → 轮询 → 取件"三段。BASE=
TOK=你的Key
# ① 提交。响应里有 job_id、own_eta_s(预估秒数)、price(报价)、以及实际会渲染的 frames
JOB=$(curl -s --noproxy '*' -X POST $BASE/v1/video/generations \
-H "Authorization: Bearer $TOK" -H 'Content-Type: application/json' \
-d '{"prompt":"A weathered fisherman mends a net on a pier at dawn.
Soundscape: gentle waves, distant gulls. Music: none."}' \
| python3 -c 'import sys,json;print(json.load(sys.stdin)["job_id"])')
# ② 轮询。默认档就要三分半,别每秒问一次 —— 先睡到接近 eta_s 再开始问
while s=$(curl -s --noproxy '*' -H "Authorization: Bearer $TOK" \
$BASE/v1/video/jobs/$JOB | python3 -c 'import sys,json;print(json.load(sys.stdin)["status"])');
[ "$s" = queued ] || [ "$s" = running ]; do sleep 10; done
# ③ done 之后取片
[ "$s" = done ] && curl -s --noproxy '*' -H "Authorization: Bearer $TOK" \
-o out.mp4 $BASE/v1/video/jobs/$JOB/content
# 我的任务列表
curl -s --noproxy '*' -H "Authorization: Bearer $TOK" $BASE/v1/video/jobs
# 上传参考图(表单字段名是 file),拿返回的 ref 填进 ref_image / first_frame 等字段
curl -s --noproxy '*' -X POST $BASE/v1/video/uploads \
-H "Authorization: Bearer $TOK" -F 'file=@ref.png'
--noproxy '*' 别省。 这台机器上 http_proxy
是有值的,curl 会把 127.0.0.1 也送进代理。Python 用
trust_env=False(httpx)或
urllib.request.build_opener(urllib.request.ProxyHandler({}))。t2v(默认)纯文字出视频。只需要
prompt,其余参数都有默认值i2v给 first_frame /
last_frame,图片是字面上的某一帧,像素级锁定。两端都可以只给一个。
适配方式不同:首帧拉伸填满画布,末帧居中裁剪 —— 比例不对时两头会以
不同方式变形,而且不报错r2v给 ref_image /
ref_image_2 / ref_video,图片是语义参考,
不作为任何一帧出现。prompt 里要用 <Picture 1> /
<Picture 2> / <Video 1> 显式引用。
典型用途:让这个角色去做别的事、别的场景。另有
ref_video_audio(是否也参考视频里的声音)与
ref_image_size(match 默认 / max 更精细但更慢)| 字段 | 默认 | 边界(越界返回 400,报错会点名超了哪条) |
|---|---|---|
prompt | — | 必填,最长 20000 字符 |
task | t2v | t2v/i2v/r2v |
duration | 5.0 | 秒。会向上吸附到帧网格,见下 |
resolution | 768 | 方形边长,32 的倍数。实际最大 992,见下 |
width / height | — | 给了就覆盖 resolution,用来出非方形。边长 256–1344 |
steps | 20 | 20 是硬下限(原因见下),上限 60 |
seed | 随机 | 同 seed + 同参数 = 同结果 |
| 帧数 | — | 5–362(15.1 秒) |
| 单帧像素 | — | ≤ 1,032,192(= 1344×768) |
| 上传单文件 | — | ≤ 64 MB,超出返回 413 |
1024² = 1,048,576 已经超了 ——
所以 resolution: 1024 会被 400 拒,尽管 1024 落在 256–1344 区间内、
也是 32 的倍数。实测确认过。要竖屏用 768×1344,要横屏用 1344×768。400 并列出
可用字段 —— 字段名写错却静默用默认值跑完,是最难发现的一类失败。duration 会向上吸附到帧网格 17k+5。
帧率 24 fps。要 5.0 秒 → 实际 124 帧 / 5.17 秒。响应里的 frames 和
duration_s 才是实际会渲染的,可能跟你请求的不一样。steps 低于 20:画面正常,音频会坏。
实测 4 步时底噪抬高约 10 dB,细节埋进嘶声里。只看视频会放过一个坏配置 ——
所以 20 是硬下限而不是建议值,低于直接 400。| 配置(20 步) | 实测耗时 | 相对默认档 |
|---|---|---|
| 768×768 / 124 帧(5.2 秒) | 203 s | 1.0× |
| 1344×768 / 124 帧 | 365 s | 1.8× |
| 768×768 / 362 帧(15.1 秒) | 841 s | 4.1× |
| 1344×768 / 362 帧(15.1 秒) | 2172 s(36 分钟) | 10.7× |
60 × own_eta_s × 倍率。
倍率以 /health 为准,别照抄这里 —— 写死在正文里的倍率迟早会过期advanced+include_answer 搜索price 就是这次的账。
不轮询也照扣 —— 按实际耗时结账更公平,但那样不轮询的人永远不结账429。这是真正的闸503背后的模型是对着一个叫 H3-Context-IR 的结构化格式训练的,随手写大白话出来的 东西明显差一档。
Soundscape:(环境音)→
Music:(配乐,没有就写 Music: none.)[Shot 2] At 00:03.500, the camera cuts to…<d>[Chinese] 你好 </d> 里,
多人用 (S1) (S2) 区分。不这么写可能根本不出声dolly in、crash zoom
这些是分布外的。改成描述方向 + 幅度 + 速度的白话,比如
"the camera slowly pushes forward about half a metre over three seconds""rewrite_prompt": true,网关会用本站的
模型把大白话转成上面这个格式。改写发生时一定会说出来 ——
danlu.prompt_rewritten 里同时给出 original 和 used,
我们不会悄悄改你的输入。改写本身按那个模型的倍率另算(很便宜)。danlu.upstream_purged 就是这件事的凭证 —— 万一删失败,那里会是
false 并带上原因,而不是假装成功。即使你提交完再也不来查,
后台巡检也会替你取回并删源。410。
要长期保存请自己下载,过期不补。| 码 | 什么时候 |
|---|---|
400 | 参数越界(detail 里点名超了哪条、边界是多少),或发了不认识的字段 |
401 | Key 缺失或无效 |
404 | job_id 不存在,或者不属于你。刻意不用 403 —— 那会告诉对方"这个 id 存在" |
409 | 任务还没 done 就来取片 |
410 | 产物已过 7 天被清理。不可恢复(源文件早已删掉),重新提交 |
413 | 上传超过 64 MB |
429 | 你已有任务在跑(并发 1),或今天的 10 个用完了。看 Retry-After |
503 | 模型级并发+队列满了;或视频服务不可用(隧道断了 —— 报错会点名让你查隧道) |
失败原因在 error 字段。status 的取值:queued /
running / done / failed / canceled。
/v1/videos)上面那套 /v1/video/* 是本站的原生形状。除此之外还有一组
与 OpenAI 视频接口(Sora)同名同形的别名,方便直接用现成 SDK 或
LiteLLM 这类网关,不用改一行客户端代码:
| OpenAI 形状 | 等价的原生端点 |
|---|---|
POST /v1/videos | POST /v1/video/generations |
GET /v1/videos/{id} | GET /v1/video/jobs/{id} |
GET /v1/videos/{id}/content | GET /v1/video/jobs/{id}/content |
GET /v1/videos | GET /v1/video/jobs |
DELETE /v1/videos/{id} | DELETE /v1/video/jobs/{id} |
参数名也一起翻:size:"1344x768" → width/height,
seconds → duration,input_reference →
first_frame(并自动把 task 定成 i2v,否则图片会被当成
t2v 静默忽略)。steps、seed 这些本站独有的参数照样能一起传。
底下走的是同一份代码,所以限额、计费、归属(不是自己的任务一律 404)完全一致。
两处必须知道的差异:
queued/in_progress/completed/failed
四个,没有 canceled。所以取消掉的任务在别名接口里报
failed,真实状态放在 danlu.native_status。
这么做是因为一个照着那四个词写判断的客户端碰到未知状态会永远轮询下去——
少一个词的信息量,换掉一个死循环progress 是折算的上游只报剩余秒数,
报不出真实进度。这个百分比按「已跑 ÷(已跑+剩余)」算出来,运行中封顶 99——
绝不在没完成时显示 100。danlu.progress_is_derived 会如实标注这件事还有一处是故意不跟的:OpenAI 的下载链接「最长有效 1 小时」,本站产物
暂存 7 天。他们那样是为了不长期替用户存东西;社团成员没有别处可放,7 天更实用。
variant=thumbnail 这类参数本站没有(只出视频本身),传了会明确报
400 而不是默默把 mp4 给你。
不用装任何东西,加一个 URL 就能让你的 AI 客户端直接联网搜索。
claude mcp add --transport http danlu /mcp \
--header "Authorization: Bearer 你的Key"
web_search(联网搜索)和
extract_url(抓取某个网页的正文)。它自己判断什么时候该查,你不用手动触发。,
认证头 Authorization: Bearer 你的Key。r = client.chat.completions.create(
model="Stella",
messages=[{"role":"user","content":"北京天气?"}],
tools=[{"type":"function","function":{
"name":"get_weather",
"parameters":{"type":"object",
"properties":{"city":{"type":"string"}}}}}],
)
print(r.choices[0].message.tool_calls)
Aurora 和 Novus 会先思考再作答,Stella 不思考,直接给答案。
服务端已把思考轨迹和最终答案拆成两个字段,你不用自己解析 <think>。
| 模型 | 思考字段(非流式 / 流式) | 答案 |
|---|---|---|
| Stella | 不产生思考,该字段始终为空 | message.content |
| Aurora、Novus | message.reasoning_content / delta.reasoning_content |
message.content |
reasoning),
网关统一折叠成 reasoning_content 再发给你。max_tokens 千万别给小了。
思考和正文共用同一个 max_tokens:预算太小的话,额度全被思考吃光,
你会拿到一个 content 为空、finish_reason 是 length
的回复——而且照常计费。2026-08-05 实测「用五个字回答」这种最短的问题:
max_tokens=2048 时正文为空(思考烧掉 2047 个 token),
3072 才正常出正文。
4096 仍会烧光、正文为空。
id / object / created / model /
system_fingerprint / choices / usage;
message 只有 role / content /
tool_calls,外加 reasoning_content。
上游各自的私有字段(预填 token、路由专家、内部指标等)一律不透传——
其中有些甚至会把渲染后的完整提示词原样回显,那是不该出网关的东西。
reasoning_content 是唯一一个 OpenAI 本身没有的键,为了保留思考轨迹而保留。
prompt_logprobs、stop_reason)不会凭空消失:
加请求头 X-Upstream-Extras: 1 就会收在一个 x_upstream 对象里返回。
logprobs、tools、response_format 这些标准功能一律照常。r = client.chat.completions.create(model="Novus",
messages=[{"role":"user","content":"17*23=?"}], max_tokens=8192)
print(r.choices[0].message.reasoning_content) # 思考轨迹(简单题可能为空)
print(r.choices[0].message.content) # 最终答案
X-Thinking 头(仅 Novus)Novus 有原生的思考预算档位,用一个请求头就能控制(Stella/Aurora 无此功能,忽略)。默认不封顶。
| X-Thinking 头 | 效果 |
|---|---|
off | 关思考,直接答(最快) |
low | 思考预算 1024 token |
medium | 思考预算 4096 token |
high | 思考预算 16384 token |
max | 不封顶(默认) |
<整数> | 精确预算,如 X-Thinking: 2000(0 = 关) |
finish_reason: stop)。"thinking_token_budget": 4096;body 显式设置优先于头;非法头值返回 400。X-Thinking-Effective 头(off / 1024 / … / uncapped)——实际生效的档位,日志记这个(OpenAI SDK 用 .with_raw_response 读头)。temperature 0.7, top_p 0.8, presence_penalty 1.5(见采样表)。curl /v1/chat/completions \
-H "Authorization: Bearer 你的Key" -H "X-Thinking: medium" \
-H "Content-Type: application/json" \
-d '{"model":"Novus","messages":[...],"max_tokens":6000}'
max_tokens 是思考 + 答案共用的。设了思考预算后,尺寸就是算术题:max_tokens ≥ 预算 + 预期答案
(如 X-Thinking: medium + max_tokens 6000 留 ≥1900 给答案,稳)。max_tokens 给 ≥8000 赌一把」的老规矩——不然会撞下面这个坑:finish_reason: "length" + 有 reasoning_content 但 content 为空(思考烧光了窗口)。X-Thinking: off,要平衡改 X-Thinking: medium(有界,比翻倍便宜),要质量把 max_tokens 翻倍。off。reasoning_content 字段,
模型才能延续思考:msg = r.choices[0].message
history.append({"role":"assistant", "content": msg.content or "",
"tool_calls":[t.model_dump() for t in (msg.tool_calls or [])],
"reasoning_content": getattr(msg, "reasoning_content", "") or ""}) # 服务端返回的就是这个键;没思考时该键缺席,所以用 getattr
Novus 跑在会不定时下线的远程显卡上。它连不上或返回 5xx 时,
网关会把请求自动转给 Aurora,而不是让你等满一次超时再收一个 502。
model 字段写的是
实际服务的模型(Aurora),另带两个响应头:
X-Served-By: Aurora 与 X-Fallback-From: Novus4xx——那是请求本身的问题,
换个模型一样错,降级只会把真正的错误藏起来;② 你的请求装不进 Aurora 的 32K
(Novus 上限 262K)——这时会如实返回 503,而不是塞进一个装不下它的模型X-No-Fallback: 1。
跑评测、对比模型时建议加上——「点名 A 却拿到 B 的答案」会直接污染结论/health 的 failover 字段后端对相同的提示前缀是有缓存的(同一段系统提示、同一批工具定义、 上一轮的对话),命中的部分不用重算。网关把这份节省如实折进你的账单。
usage.prompt_tokens_details.cached_tokens,
流式在带 usage 的最后一个 chunk 里把文本变成 1024 维向量,用于语义检索、RAG、聚类、去重。端点是
/v1/embeddings,model 填 Sextant。
标准 OpenAI 格式,任何 OpenAI SDK 直接可用。
| 项 | 值 |
|---|---|
| 维度 | 原生 1024;可用 dimensions 截到更小,网关自动重新归一 |
| 向量归一化 | 已 L2 归一化(模长 = 1),余弦相似度 = 点积,不用自己再归一 |
| 单条输入上限 | 4096 token,超出 413 |
| 单次请求 | 最多 128 条,合计 8192 token,超出 413 |
| 额度倍率 | 全站最低的一档,且只计输入 token(embedding 没有输出 token)。
具体数值以本页下方「使用限制」里的实时模型表为准——那张表直接读
/health,而写死在正文里的倍率迟早会过期,这一点已经发生过。 |
| 吞吐 | 约 5200 tok/s |
Query: 后面没有空格,不是笔误):
Instruct: Given a web search query, retrieve relevant passages that answer the query
Query:{你的查询}
<|endoftext|>——模型自己会加,补两次向量会变差。# 建索引:文档原文直入,不加前缀
docs = ["KV 缓存把已算过的 key/value 存下来…", "MoE 每步只激活一部分专家…"]
r = client.embeddings.create(model="Sextant", input=docs)
vecs = [d.embedding for d in r.data] # 每个 1024 维,已归一化
# 检索:查询要套指令模板
Q = "Instruct: Given a web search query, retrieve relevant passages " \
"that answer the query\nQuery:"
q = client.embeddings.create(model="Sextant", input=[Q + "显存怎么算"]).data[0].embedding
# 已归一化,所以点积就是余弦相似度
score = lambda a, b: sum(x*y for x, y in zip(a, b))
best = max(range(len(vecs)), key=lambda i: score(q, vecs[i]))
curl /v1/embeddings \
-H "Authorization: Bearer 你的Key" \
-H "Content-Type: application/json" \
-d '{"model":"Sextant","input":["第一段","第二段"]}'
dimensions 参数支持。 上游确实会忽略它,但网关替你做了:
按 Matryoshka 取前 N 维截断,并重新做 L2 归一化,返回向量模长仍是 1,
可以直接点积当余弦——不要自己再截一次,否则会二次截断。
传非正整数返回 400;传大于 1024 的值不报错,按 1024 返回。不传就用服务端默认。想调就参考下面(Novus 的推荐值来自其官方指南)。
| 模型 / 场景 | temperature | top_p | 其它 |
|---|---|---|---|
| Stella、Aurora | 0(确定)~0.7(发散) | 0.9 | 可选 repetition_penalty |
| Novus 思考·通用 | 1.0 | 0.95 | top_k 20 |
| Novus 思考·精确编程 | 0.6 | 0.95 | top_k 20 |
| Novus 非思考 | 0.7 | 0.8 | top_k 20 · presence_penalty 1.5 |
要模型输出严格 JSON,用 response_format 带上 schema:
response_format={"type":"json_schema", "json_schema":{
"name":"person", "schema":{"type":"object",
"properties":{"name":{"type":"string"},"age":{"type":"integer"}}}}}
json_schema,用 OpenAI 老的
{"type":"json_object"} 会报 400。拿不准就直接在 prompt 里要求「只输出 JSON」也行。接口无状态:每轮把完整历史都发过去,服务器不替你存对话。带 system 设定角色:
messages=[
{"role":"system","content":"你是简洁的编程助手"},
{"role":"user","content":"什么是二分查找"},
{"role":"assistant","content":"在有序数组里每次折半…"},
{"role":"user","content":"给我 Python 代码"},
]
413——到时自己裁掉最旧的消息。任何「OpenAI 兼容」的客户端,填两样东西即可:API 地址 = ,密钥 = 你的 Key,模型名填上面的 ID。
…/v1、密钥填你的 Key → 手动添加模型 ID…/v1、填密钥与模型名…/v1,模型填 IDopenai,apiBase=…/v1、apiKey、modelmax_tokens(思考被截断)——把最大输出调到 8000+。网关对 Novus 有 8192 的兜底下限会自动抬高,但客户端自己显示的数字不会跟着变。每个账号独立计量(换 Key 不重置)。以下任一触顶即暂停,到点自动恢复。
| 窗口 | 请求次数 | Token 用量 |
|---|
粘贴你的 Key,查看两个窗口剩余的次数与 token。
| 状态 | 含义 / 怎么办 |
|---|---|
400 | 模型不在白名单、或者模型名对但用错了端点
(Sextant 只能用 /v1/embeddings、Pharos 只能用
/v1/search——它们会出现在 /v1/models 里,所以客户端的模型
选择器可能让你选到;报错信息会直接告诉你该换哪个端点),或请求体不合法 |
401 | 缺少或无效的 API Key(请重新登录面板复制) |
403 | 账号或 Key 已被停用,联系群主 |
413 | 输入太长,超过该模型的上下文预算——缩短对话/输入 |
429 | 触发限额(5h/周)或你自己的并发上限;看 Retry-After 秒数后重试 |
502 | 向量或搜索的上游连不上。对话端点不会返回 502——那里的上游故障会先走降级,全部不可用时返回 503 |
503 | 该模型并发 + 排队已满(Retry-After: 5);或该模型与它的降级目标都不可用(Retry-After: 15) |
504 | 搜索上游超时(已重试过)——稍后再试,或把 search_depth 换成 basic |
max_tokens 吃光了:调大到 Aurora ≥3000、Novus ≥8000(网关已自动兜底,但自己设大更稳),或用 X-Thinking 关思考(仅 Novus)。Stella 不思考,不会有这个问题。reasoning_content 永远是空的,这是正常的。Aurora 与 Novus 才有,流式读 delta.reasoning_content;简单问题它们也可能几乎不思考。model 字段会写 Aurora,另带 X-Fallback-From: Novus 头,计费也按 Aurora 的倍率。详见下方上游降级。