栏目 开始 对话 文本向量 联网搜索 视频生成 额度与排错
帮助文档 · Docs

怎么调用

标准 OpenAI 接口。拿到激活码先在首页兑换成 Key,再按下面接入。

栏目
这一页很长,按服务分成 6 栏。 只想跑起来看第一栏;用哪个服务就跳对应那栏; 报错了 / 想知道额度看最后一栏。

三步接入

接口一览

方法路径说明
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/mcpMCP 端点(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 并告诉你该用哪些。

Stella
model="Stella"
对话~26B MoE · 激活 ~4B上下文 24K不思考默认

响应快、直接给答案,不思考,适合日常问答与短平快的任务。约 91 tok/s。 因为不思考,max_tokens 给多小都能正常出正文。常驻(Apple M 系 · 128GB)。

Aurora
model="Aurora"
对话~35B MoE · 激活 ~3B上下文 32K会思考

快、通用,适合日常编程、问答、Agent 与工具调用。约 95 tok/s。 会先思考max_tokens 建议 ≥3000(网关已自动兜底)。常驻(Apple M 系 · 128GB)。

Novus ultraspeed
model="Novus"
对话~27B · NVFP4 + MTP上下文 262K限时福利

NVFP4 量化 + MTP 投机解码,单流约 120 tok/s,高并发聚合 2000+ tok/s, 上下文上限 262K——直接在请求里传更长即可。跑在 RTX PRO 6000 上, 可能不定时下线。跑分见下方。

Sextant
model="Sextant"
文本向量~0.6B · Q8_01024 维单条 4K倍率最低

把文本变成向量,做语义检索、RAG、聚类、去重。1024 维、 已 L2 归一化(余弦相似度直接等于点积)。吞吐约 5200 tok/s。 详见文本向量一节。

Pharos
POST /v1/search
联网搜索自建 SearXNGTavily 兼容

给模型接上实时互联网,返回结构化结果,也可以让本地模型读完写一段 带引用的答案。抓不到的会如实说出来,不假装抓到了。 详见联网搜索一节。

Lanterna
POST /v1/videos
视频异步自带立体声最长 15.1 秒

文字 / 图片进,带声音的 mp4 出。跑在一台 A800 上, 一条要 3 分半到 36 分钟,所以是提交 + 轮询的异步接口。 详见视频生成一节。

限时福利说明。 Novus 跑在部署者自己的 RTX PRO 6000 大显存 N 卡上, 可能不定时下线去跑别的实验,请勿依赖它的持续可用性。常驻的两个模型长期在线,但上下文有限制(见标签)。
上下文上限 262K,上限内直接发更长即可;若有大规模并发 Novus(如 subagent 集群)需求,请联系社长调整后端。

基准分数(Novus)

模型官方发布的跑分;本站运行的是接近无损的量化版本,实际表现可能有微小差异。

基准分数基准分数
MMLU-Pro86.2SWE-bench Verified77.2
MMLU-Redux93.5LiveCodeBench v683.9
GPQA Diamond87.8AIME 202694.1
SuperGPQA66.0HMMT Feb 202684.3
C-Eval91.4Terminal-Bench 2.059.3

模型怎么选

模型适合倍率推荐→上限
Stella
默认 · 常驻
日常问答、写作、中文任务,最省额度×0.338K → 24K
Aurora
常驻
编程、Agent、工具调用、较难的推理×18K → 32K
Novus
限时福利
长文、复杂推理,速度最快;跑在独立 N 卡上,可能不定时下线×216K → 262K
「推荐」是典型/更快的长度;上限内直接在请求里发更长即可(自助,无需申请)。 超过上限直接返回 413 拒绝——先缩短对话/输入,或换上限更高的模型。
上限是记账口径。服务端发给模型前还要拼上系统提示、工具定义和轮次标记, 这些同样占上限;中文的 token 估算也特意偏保守。实测 Stella 名义 24K、实际能装约 23.5K(约 96%);AuroraNovus 同理。不必自己折算,超了会返回 413 并附上估算值。

默认用 Stella 就够,省额度;需要更强或更快、且 Novus 在线时再用它。

Python(OpenAI SDK)

# 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)

curl

model 字段就能切模型,下面用默认的 Stella 举例。

非流式

curl /v1/chat/completions \
  -H "Authorization: Bearer 你的Key" \
  -H "Content-Type: application/json" \
  -d '{"model":"Stella",
       "messages":[{"role":"user","content":"你好"}]}'

流式(SSE,加 "stream": true)

curl /v1/chat/completions \
  -H "Authorization: Bearer 你的Key" \
  -H "Content-Type: application/json" \
  -d '{"model":"Stella",
       "messages":[{"role":"user","content":"讲个冷笑话"}],
       "stream":true}'

Novus(限时福利)

curl /v1/chat/completions \
  -H "Authorization: Bearer 你的Key" \
  -H "Content-Type: application/json" \
  -d '{"model":"Novus",
       "messages":[{"role":"user","content":"用一句话解释 KV 缓存"}],
       "max_tokens":8192}'
Novus 是混合自动思考模型。 思考轨迹在 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(下面有一节专门讲)。
Tavily 兼容。 现成的 agent 框架(LangChain、LlamaIndex 等)只要把 Tavily 的 base_url 换成本站、/search 路径不变即可;api_key 放在请求体里 也认,不必改成请求头。

搜索怎么计费

真正做了多少工作叠加,而不是按深度收一个打包价。

看一次实际扣了多少,别照着页面算。 上面几项都要再乘各自模型的倍率, 而写死在正文里的倍率迟早会过期(下面 向量一节同样的道理)。 你的面板显示的是这次的总额;逐项拆解(检索/抓取/重排/改写/写答案)只发到 管理员的实时流,成员看不到。要自己核对最大的那一项,用响应里的 danlu.extract.fetched——它就是这次按页收费的条数。
一组实测参考值(2026-08-06,5 条结果,仅供感觉量级):basic128advanced222advanced+ include_answer1150写答案那一项占了八成以上, 不需要成段答案时就别开它。

重复的查询基本不花钱

相同查询在短时间内重复搜,会命中缓存。免费的判据是「这次真的什么都没做」basic 且没开 include_answer 时命中不收费(实测扣 0)。 开了 include_answer 就不免费——缓存只省检索,答案照样要重新写一遍, 而那一项恰好是最贵的。advanced 命中时检索那一份不收,但正文仍要重新抓, 所以还有抓取费(实测 90)。
要绕开缓存拿最新结果,加 "no_cache": true。注意它的语义是 不读缓存、结果照样写回缓存——和 HTTP 的 no-cache 一致 ("不要存"是 no-store,那是另一回事)。

要了没给到的东西,响应会自己说出来

这是本服务的一条硬规矩:最坏的失败不是报错,是沉默。 下面这些"要了没给到"的情况,响应里一定有一行说明,而不是悄悄给你降级过的结果。

但要说清边界:目前只有下面两个字段有披露。 参数取值层面的降级还没有——认不出的 search_depthfast、 拼错的)会当 basic,认不出的 topic 会当 generalmax_results 超过 20 会被夹到 20,这三种都不会在响应里告诉你。 这么设计是为了客户端 SDK 升级后不至于整体报废(拒绝比降级更没道理),但代价就是这层 静默,写 agent 时别指望它会提示。
给 agent 写代码时用得上这两个字段。 看到 danlu.extract.applied === false 就知道"值得重试一次"; 看到 fetched < results 就知道"重试是浪费,换个查询或接受摘要"。 这个区分是故意做出来的——两种不完整的处置方式相反。

思考强度:IDE / CLI 里那个滑块

在 opencode、Cursor 这类客户端里调"reasoning effort",本站怎么响应。

不管你的客户端怎么写,判据只有一个:看响应头 X-Thinking-Effective 它是本站真正生效的档位(off / 1024 / 16384 / unsupported),与客户端无关。 配好之后打一发、看这个头,比读任何文档都可靠。
Cursor:Custom OpenAI 模式直接发标准请求体,上面三种写法对它天然成立。已用归档里 一条真实的 Cursor 请求(7406 字符系统提示、共 3 条消息)原样重放验证过,正常完成。
opencode:它用 @ai-sdk/openai-compatible,内部的 reasoning 选项是 reasoning: {effort} 形状——那个形状本站认。但具体该在 opencode.jsonc 里怎么写,本站没能验证通:给模型加 "options": {…} 之后 opencode 在非交互模式下卡在发请求之前(网关侧一条请求都 没收到),所以这里不给配置方案,免得照抄之后工具挂住。想调的话自己试,然后用 X-Thinking-Effective 确认到底有没有生效。
提醒:只对 Novus 有意义,给 Stella / Aurora 配了也只会拿到 unsupported

视频生成(Lanterna)

文生视频 / 图生视频 / 参考生视频,输出自带同步立体声接口是异步的。

它慢,而且必须异步。 默认档(768×768 / 5.17 秒)实测约 203 秒;最大档(1344×768 / 15.1 秒)实测 2172 秒(36 分钟)。而网关的 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({}))

三种任务

参数与边界

字段默认边界(越界返回 400,报错会点名超了哪条)
prompt必填,最长 20000 字符
taskt2vt2v/i2v/r2v
duration5.0秒。会向上吸附到帧网格,见下
resolution768方形边长,32 的倍数。实际最大 992,见下
width / height给了就覆盖 resolution,用来出非方形。边长 256–1344
steps2020 是硬下限(原因见下),上限 60
seed随机同 seed + 同参数 = 同结果
帧数5–362(15.1 秒)
单帧像素1,032,192(= 1344×768)
上传单文件64 MB,超出返回 413
方形最大只到 992,这一条很反直觉。 像素预算 1,032,192 恰好等于 1344×768,而 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 秒。响应里的 framesduration_s 才是实际会渲染的,可能跟你请求的不一样。
网格:5, 22, 39, 56, 73, 90, 107, 124, … 345, 362。
steps 低于 20:画面正常,音频会坏 实测 4 步时底噪抬高约 10 dB,细节埋进嘶声里。只看视频会放过一个坏配置 —— 所以 20 是硬下限而不是建议值,低于直接 400

耗时:超线性,别按线性估

配置(20 步)实测耗时相对默认档
768×768 / 124 帧(5.2 秒)203 s1.0×
1344×768 / 124 帧365 s1.8×
768×768 / 362 帧(15.1 秒)841 s4.1×
1344×768 / 362 帧(15.1 秒)2172 s(36 分钟)10.7×
注意力是二次复杂度,两条轴还互相放大:加宽在短片上只贵 1.8 倍, 在长片上贵 2.6 倍。按线性外推最大档会算出约 1037 秒,实测 2172 —— 是线性估算的 2.1 倍HTTP 超时按最坏情况设,别按 5 秒片子的耗时设。

限额与计费

轮询本身不花额度,但会被额度检查。 轮询不写用量记录,所以不消耗 5h / 周的限额;但它和别的请求一样要过限额闸 —— 也就是说额度烧光后连自己正在跑的任务 都查不了。任务本身不受影响,后台巡检照样会取回产物,等窗口滚过去再查就行。

prompt 怎么写(这一节影响最大,也最容易被跳过)

背后的模型是对着一个叫 H3-Context-IR 的结构化格式训练的,随手写大白话出来的 东西明显差一档

可选的自动改写:"rewrite_prompt": true,网关会用本站的 模型把大白话转成上面这个格式。改写发生时一定会说出来 —— danlu.prompt_rewritten 里同时给出 originalused, 我们不会悄悄改你的输入。改写本身按那个模型的倍率另算(很便宜)。
改写失败时保留原文继续提交,不会因此让你的任务失败。

产物:本地 7 天,不留在云端

生成的 mp4 会被网关取回到本地,然后删掉那台 A800 上的源文件。 响应里 danlu.upstream_purged 就是这件事的凭证 —— 万一删失败,那里会是 false 并带上原因,而不是假装成功。即使你提交完再也不来查, 后台巡检也会替你取回并删源。
本地暂存 7 天后自动清理,之后取件返回 410要长期保存请自己下载,过期不补。

错误码

什么时候
400参数越界(detail 里点名超了哪条、边界是多少),或发了不认识的字段
401Key 缺失或无效
404job_id 不存在,或者不属于你。刻意不用 403 —— 那会告诉对方"这个 id 存在"
409任务还没 done 就来取片
410产物已过 7 天被清理。不可恢复(源文件早已删掉),重新提交
413上传超过 64 MB
429你已有任务在跑(并发 1),或今天的 10 个用完了。看 Retry-After
503模型级并发+队列满了;或视频服务不可用(隧道断了 —— 报错会点名让你查隧道)

失败原因在 error 字段。status 的取值:queued / running / done / failed / canceled

做不到的

也可以用 OpenAI 的形状调(/v1/videos

上面那套 /v1/video/* 是本站的原生形状。除此之外还有一组 与 OpenAI 视频接口(Sora)同名同形的别名,方便直接用现成 SDK 或 LiteLLM 这类网关,不用改一行客户端代码

OpenAI 形状等价的原生端点
POST /v1/videosPOST /v1/video/generations
GET /v1/videos/{id}GET /v1/video/jobs/{id}
GET /v1/videos/{id}/contentGET /v1/video/jobs/{id}/content
GET /v1/videosGET /v1/video/jobs
DELETE /v1/videos/{id}DELETE /v1/video/jobs/{id}

参数名也一起翻size:"1344x768"width/heightsecondsdurationinput_referencefirst_frame(并自动把 task 定成 i2v,否则图片会被当成 t2v 静默忽略)。stepsseed 这些本站独有的参数照样能一起传。 底下走的是同一份代码,所以限额、计费、归属(不是自己的任务一律 404)完全一致。

两处必须知道的差异:

还有一处是故意不跟的:OpenAI 的下载链接「最长有效 1 小时」,本站产物 暂存 7 天。他们那样是为了不长期替用户存东西;社团成员没有别处可放,7 天更实用。 variant=thumbnail 这类参数本站没有(只出视频本身),传了会明确报 400 而不是默默把 mp4 给你。

接入 MCP(推荐给 Claude Code / Claude Desktop)

不用装任何东西,加一个 URL 就能让你的 AI 客户端直接联网搜索。

claude mcp add --transport http danlu /mcp \
  --header "Authorization: Bearer 你的Key"
加完之后模型会多出两个工具:web_search(联网搜索)和 extract_url(抓取某个网页的正文)。它自己判断什么时候该查,你不用手动触发。
每次工具调用都计入你的用量,和直接调接口一样。所以别让它为同一个问题反复搜。
Claude Desktop 等其它客户端同理:填 URL , 认证头 Authorization: Bearer 你的Key
本服务器是无状态的,不发会话 ID;断线重连不需要任何恢复步骤。

函数调用(三个对话模型都支持)

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)

思考模式(reasoning)

Aurora 和 Novus 会先思考再作答,Stella 不思考,直接给答案。 服务端已把思考轨迹和最终答案拆成两个字段,你不用自己解析 <think>

① 读思考轨迹

模型思考字段(非流式 / 流式)答案
Stella 不产生思考,该字段始终为空 message.content
Aurora、Novus message.reasoning_content / delta.reasoning_content message.content
字段名三个模型一致,不用按模型分支—— Stella 只是不往里写东西。后端三个运行时原本各叫各的(其中一个叫 reasoning), 网关统一折叠成 reasoning_content 再发给你。
会思考的模型,max_tokens 千万别给小了。 思考和正文共用同一个 max_tokens:预算太小的话,额度全被思考吃光, 你会拿到一个 content 为空、finish_reasonlength 的回复——而且照常计费。2026-08-05 实测「用五个字回答」这种最短的问题:
· Aurora max_tokens=2048 时正文为空(思考烧掉 2047 个 token), 3072 才正常出正文。
· Novus 思考更长,实测 4096 仍会烧光、正文为空。
· Stella 不思考,同一个问题只花 6 个 token,给多小都没问题。
思考长度波动很大:同一个问题重复问,思考量实测在 634 ~ 2900+ token 之间浮动(4 倍以上), 所以「按平均值估一个够用的数」是不成立的,必须留足余量。
网关已经替你兜底:Aurora 自动抬到 3072、Novus 抬到 8192,Stella 不改。 这个下限只抬高过小的值,从不压低你设的大值;计费按实际用量算, 所以被抬高本身不会多扣额度。
响应就是标准 OpenAI 格式,不多不少。 顶层只有 id / object / created / model / system_fingerprint / choices / usagemessage 只有 role / content / tool_calls,外加 reasoning_content。 上游各自的私有字段(预填 token、路由专家、内部指标等)一律不透传—— 其中有些甚至会把渲染后的完整提示词原样回显,那是不该出网关的东西。 reasoning_content 是唯一一个 OpenAI 本身没有的键,为了保留思考轨迹而保留。
上游自己的少数额外能力(如 prompt_logprobsstop_reason)不会凭空消失: 加请求头 X-Upstream-Extras: 1 就会收在一个 x_upstream 对象里返回。 logprobstoolsresponse_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: 20000 = 关)
· 预算是上限:简单题思考不到预算就停,难题被封在预算处、然后正常作答(finish_reason: stop)。
· 等价 body 写法:"thinking_token_budget": 4096body 显式设置优先于头;非法头值返回 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}'

③ token 预算与截断

max_tokens思考 + 答案共用的。设了思考预算后,尺寸就是算术题:max_tokens ≥ 预算 + 预期答案 (如 X-Thinking: medium + max_tokens 6000 留 ≥1900 给答案,稳)。
只有不设预算的请求还要用「max_tokens 给 ≥8000 赌一把」的老规矩——不然会撞下面这个坑:
· 失败态:finish_reason: "length" + 有 reasoning_contentcontent 为空(思考烧光了窗口)。
· 别原样重试:要快改 X-Thinking: off,要平衡改 X-Thinking: medium(有界,比翻倍便宜),要质量把 max_tokens 翻倍。
· 极小预算(<200)会退化(思考被硬切、串进 content)——这种就直接用 off

④ 多轮 / Agent 循环

用户轮次的旧思考会被服务端自动剥掉,历史照发即可、无需清理。但在同一个工具调用回合内 (最后一条 user 之后的 assistant/tool 消息),要把 assistant 消息原样回传、保留 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 不可用时会自动降级

Novus 跑在会不定时下线的远程显卡上。它连不上或返回 5xx 时, 网关会把请求自动转给 Aurora,而不是让你等满一次超时再收一个 502。

流式的边界。降级只发生在第一个字节发出之前。 一旦开始吐字了才失败,网关会如实中断,不会偷偷换个模型接着往下写—— 否则你会得到一段前后由不同模型拼起来的回答,而且无从察觉。

重复的前缀只按两成计费

后端对相同的提示前缀是有缓存的(同一段系统提示、同一批工具定义、 上一轮的对话),命中的部分不用重算。网关把这份节省如实折进你的账单

典型的反例。把「当前时间」「本次请求 ID」「随机 few-shot 顺序」 放在系统提示开头——每次都变,于是整条前缀一次也命中不了。挪到最后就能全部命中。
做对了能省多少:实测一个 agent 多轮循环,第二轮起稳定命中 76~80%, 整体额度省 60% 以上。谁省得最多在首页的省额度榜上。

文本向量(embeddings)

把文本变成 1024 维向量,用于语义检索、RAG、聚类、去重。端点是 /v1/embeddingsmodelSextant。 标准 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|>——模型自己会加,补两次向量会变差。

Python

# 建索引:文档原文直入,不加前缀
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

curl /v1/embeddings \
  -H "Authorization: Bearer 你的Key" \
  -H "Content-Type: application/json" \
  -d '{"model":"Sextant","input":["第一段","第二段"]}'
三个容易踩的点。
· 先切块再来。 一整篇长文压成一个向量,检索基本没用——那是把所有段落平均掉了。 RAG 的常规块长是 200~1000 token,4096 的上限已经很宽裕。
· dimensions 参数支持。 上游确实会忽略它,但网关替你做了: 按 Matryoshka 取前 N 维截断,并重新做 L2 归一化,返回向量模长仍是 1, 可以直接点积当余弦——不要自己再截一次,否则会二次截断。 传非正整数返回 400;传大于 1024 的值不报错,按 1024 返回。
· 批量是为了省次数,不是省时间。 实测吞吐恒定在 ~5200 tok/s,跟批量大小和并发都无关。 5000 个块打包成 40 次请求和发 5000 次,总耗时一样,但前者只扣 40 次请求额度。

采样参数

不传就用服务端默认。想调就参考下面(Novus 的推荐值来自其官方指南)。

模型 / 场景temperaturetop_p其它
Stella、Aurora0(确定)~0.7(发散)0.9可选 repetition_penalty
Novus 思考·通用1.00.95top_k 20
Novus 思考·精确编程0.60.95top_k 20
Novus 非思考0.70.8top_k 20 · presence_penalty 1.5

结构化 JSON 输出

要模型输出严格 JSON,用 response_format 带上 schema:

response_format={"type":"json_schema", "json_schema":{
  "name":"person", "schema":{"type":"object",
    "properties":{"name":{"type":"string"},"age":{"type":"integer"}}}}}
常驻模型(LM Studio)只认 json_schema,用 OpenAI 老的 {"type":"json_object"} 会报 400。拿不准就直接在 prompt 里要求「只输出 JSON」也行。

多轮对话

接口无状态:每轮把完整历史都发过去,服务器不替你存对话。带 system 设定角色:

messages=[
  {"role":"system","content":"你是简洁的编程助手"},
  {"role":"user","content":"什么是二分查找"},
  {"role":"assistant","content":"在有序数组里每次折半…"},
  {"role":"user","content":"给我 Python 代码"},
]
历史越堆越长,累计 token 超过该模型上下文上限会返回 413——到时自己裁掉最旧的消息。

在编辑器 / 客户端里用

任何「OpenAI 兼容」的客户端,填两样东西即可:API 地址 = 密钥 = 你的 Key,模型名填上面的 ID。

注意:很多客户端会用它自己的默认参数请求。若用 Novus 且看到空回复,多半是它没给够 max_tokens(思考被截断)——把最大输出调到 8000+。网关对 Novus 有 8192 的兜底下限会自动抬高,但客户端自己显示的数字不会跟着变。

使用限制

每个账号独立计量(换 Key 不重置)。以下任一触顶即暂停,到点自动恢复。

窗口请求次数Token 用量

查我的用量

粘贴你的 Key,查看两个窗口剩余的次数与 token。

错误码

状态含义 / 怎么办
400模型不在白名单、或者模型名对但用错了端点Sextant 只能用 /v1/embeddingsPharos 只能用 /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

常见问题

← 返回首页 · 关于本站