models.toml:模型目录与任务分档¶
真实文件是 config/models.toml。先在厂商配置建立连接,再添加模型。
面板「模型与厂商」维护目录,「功能分配」给任务选择候选。
逐字段说明见模型模板。
模型名、真实 ID 与连接¶
每个 [[models]] 是一条模型目录记录。
name 是本地引用名,model_identifier 是服务商接口接受的真实 ID。
api_provider 指向厂商条目的 name,不是厂商预设标识。
换模型版本通常只改真实 ID;改本地名称才需要更新任务候选。
visual = true 声明该模型可接收图片,是视觉候选的准入条件。
不能通过给纯文本模型勾选视觉能力,让它获得真实图片理解能力。
omni = true 声明该模型能同时理解画面和声音(全模态),是视频理解候选的准入条件;
只能看图的视觉模型听不到视频里的人声和配乐。
思考强度等厂商参数写在模型条目的 extra_body,写法以厂商文档为准
(例如百炼全模态模型:{"reasoning_effort": "medium"})。
单价字段用于用量统计计算费用,写法见下面「单价、缓存命中价与分时段价格」;
它不会改变服务商的实际计费,也不会让路由自动选出最便宜的模型。
embedding_dim 只用于嵌入模型,必须对应接口实际返回的维度。
单价、缓存命中价与分时段价格¶
每个 [[models]] 可以写三类单价,单位都是元 / 百万 token,只用于用量统计算费用:
| 字段 | 含义 | 不写时 |
|---|---|---|
price_in |
输入单价(含缓存命中部分) | 0 |
price_out |
输出单价,输出 token 按服务商口径包含思考 | 0 |
cache_price_in |
输入里缓存命中部分的单价;写 0 表示缓存命中免费 | 与 price_in 相同,不打折 |
[[models.price_periods]] |
按时段整组替换上面三项,用于峰谷价 | 全天用基础单价 |
一次调用的费用:
费用(元)= (输入 − 缓存命中) / 1e6 × price_in
+ 缓存命中 / 1e6 × cache_price_in(不写时按 price_in)
+ 输出 / 1e6 × price_out
单价在调用结束时按调用开始那一刻生效的那组算好,累加进统计。改单价、重启之后的 新调用按新单价算,已经记下的费用不会重算;填单价之前的调用费用永远是 0,所以先填 单价再看费用。两项都是 0 的模型在统计页上会标出来,提醒是没填还是真的免费。
分时段价格每段写一个 [[models.price_periods]] 子表,放在该模型所有字段之后(TOML
里子表之后的键都归子表)。每段含 start、end(HH:MM,24 小时制)、price_in、
price_out,可选 cache_price_in(不写表示与该时段 price_in 相同)。规则:
- 时刻按运行月璃的那台机器的本地时间,与作息、日程一致;
- 含开始、不含结束:
08:00~12:00覆盖 08:00 整到 11:59:59; - 结束早于开始表示跨午夜,例如
23:00~07:00;结束写00:00表示到当天结束; - 不在任何时段内时用模型的基础单价;
- 开始等于结束、时刻写成
7:00或24:00这类不合法写法、两段时间重叠,都在启动时 报错并指出是哪个模型的第几段。
下面的数字只示意格式,按你所用服务商的价目表填写:
[[models]]
name = "my-chat"
model_identifier = "vendor-model-id"
api_provider = "my-provider"
price_in = 2.0
price_out = 8.0
cache_price_in = 0.5
[[models.price_periods]]
start = "00:30"
end = "08:30"
price_in = 1.0
price_out = 4.0
cache_price_in = 0.25
不写 cache_price_in 与 price_periods 的老配置不需要改动就能照常加载。WebUI 的
模型与厂商编辑框里可以直接填这三类单价,保存时写出的就是上面
的格式。
首装预填的七档¶
七个条目都引用 dashscope 这一条百炼连接。
下表是随本版本代码分发的配置,不是远端实时模型清单。
| 本地名称 | 真实模型 ID | 预填任务与分档意图 |
|---|---|---|
deepseek-pro |
deepseek-v4-pro-0813 |
chat、replyer、proactive,直接写给用户的内容 |
deepseek-flash |
deepseek-v4-flash-0731 |
planner、summary、scene,兼顾决策与处理速度 |
qwen-flash |
qwen3.8-flash |
expression,短文本表达选择 |
qwen-max |
qwen3.8-max |
memory、schedule,归属判断与结构化结果 |
qwen-vision |
qwen3.8-max-0902 |
vision,声明图片输入能力 |
qwen-omni |
qwen3.8-omni-flash |
video,声明全模态(画面和声音) |
qwen-embedding |
qwen3.7-text-embedding |
embedding,声明 1024 维 |
记忆抽取在后台执行,但错误事实会影响后续召回,模型选择仍需保证判断质量。
语音任务 tts 默认没有候选;语音、视觉、向量功能仍各有独立开关。
新增模型不会自动出现在任务里,要把本地名称加入对应 model_list。
实际模型权限与 ID 是否可调用,需使用实际密钥验证。
任务候选与继承¶
chat 至少保留一个候选。
planner、replyer、scene、proactive、summary、memory、schedule、expression 留空时,
继承 chat 的候选和挑选策略;各自的首字超时与慢阈值仍按各自任务设置。
vision、video、tts、embedding 不继承 chat;候选列表为空时,对应任务没有可用模型。
因此「清空摘要候选」不等于关闭摘要,而是改用对话模型做摘要。 要关某项能力,检查相应功能开关,而不是随意清空候选。 任务段名写错会被拒绝,不会当作新任务接受。
三种挑选策略¶
selection_strategy |
行为 | 适用情况 |
|---|---|---|
sequential |
优先列表前面的可用候选,失败再试后面的 | 有明确首选和备用 |
random |
每轮随机打乱候选尝试顺序 | 希望随机分摊请求 |
balance |
在健康候选间逐轮轮询 | 希望稳定轮流分摊 |
只有顺序策略下,拖动候选顺序才决定首选。 只配一个候选时,换策略不会凭空增加备用线路。 熔断按厂商连接归组;同一连接下放多个模型不能隔离厂商整体故障。 要有独立连接的候选,必须先配置另一条真实可用的厂商连接。
首字超时、慢阈值与网络超时¶
first_token_timeout_ms 默认 30000,是当前候选开始输出前的切换窗口。
该窗口包含连接的首字等待与内部重试;超时后尝试下一个候选。
它不是完整一轮对话的总时长,也不是前端打字气泡的等待上限。
slow_threshold_ms 默认 8000,只记录响应偏慢,不会在 8 秒时主动切换。
它必须小于首字超时,设 0 才是关闭慢响应记账。
厂商的 timeout_ms 管网络连接与读取,默认 120000,见厂商配置。
仅增大网络超时,不会延长任务自身配置的首字等待窗口。
已经输出的普通流式内容不会因中途断流而从头自动重试,以免重复输出。
生成参数与思考开关¶
[generation.<任务>] 控制该任务温度与输出上限。
模板当前统一温度为 0.85、max_tokens = 0,0 表示不另设输出上限。
注释中的「稳定」描述不改变实际参数值,任务温度应以配置为准。
模型条目的 temperature、max_tokens 可覆盖任务值,排查时须同时核对两级配置。
思考开关是厂商请求参数,放在模型条目的 extra_body。
本版本五个文本或视觉模型预填:
嵌入模型的模板实际为 extra_body = {};嵌入请求不透传此字段。
任务或模型的顶层 thinking 字段已取消,继续使用会导致加载失败。
reasoning_parse_mode 只改变返回思考内容的解析方式,设 none 不会关闭厂商思考。
换厂商时核对它接受的请求体格式,不能保证同一键名适用于所有接口。
嵌入模型的特殊边界¶
同一 embedding 任务的候选必须共享模型 ID、接口协议与向量维度;同维不同模型也不可比较,可用同一模型跨厂商备份。
embedding_dim 必须填写且大于 0,留空或填 0 时启动报错。
openai 协议下它只是本地声明,不会改变远端输出维度;返回维度与它不符时,这一批向量作废。
openai 协议的嵌入请求只发送模型与输入,无法用 extra_body.dimensions 调整输出维度。
百炼多模态向量协议会把它作为 dimension 参数发给服务端,只能填模型支持的值,
例如 tongyi-embedding-vision-flash-2026-03-06 只接受 64、128、256、512、768。
更换嵌入模型还会改变向量空间,即使维度相同也不应直接混用旧向量。
先保留数据库与索引,按开发手册:记忆模块核对重建要求。
修改后核对¶
保存并重启后端,检查启动模型路由是否列出预期名称。 再发一轮消息,在会话观察与调用记录中确认实际使用的任务和候选。 连接测试或拉取模型列表成功,不能替代该模型的一轮真实请求。 调用失败时,应依据模型 ID、能力声明及厂商返回信息确定原因,再评估是否调整超时。
模型接口协议¶
每个模型用 api_format 选择接口:openai(OpenAI 兼容,默认)、responses(OpenAI Responses)、
dashscope_multimodal(百炼多模态向量)、ark_multimodal(方舟多模态向量)。对话任务支持前两种,
语音与重排仅支持 openai;向量任务支持 openai 和两种多模态向量协议。
走 Responses 且开思考的模型,模型级 max_tokens 必须给思考留余量:max_output_tokens 包含思考 token。
extra_body 应按所选协议的字段写,Responses 思考档位例如 reasoning = { effort = "medium" }。
Responses 固定关闭服务端存储,不允许覆盖 model、input、stream、previous_response_id 或启用 store。
重排¶
model_tasks.rerank 在界面显示为「重排」,留空即不重排,不继承其它任务。配置后,回想(recall)与
查知识(consult)先取一个更大的候选池,交给重排模型逐条打相关度分,按分数排序,分数低于
「检索调参」里的重排相关度下限 rerank_min_score(默认 0.5)的不返回;一条都不剩时,月璃会说没想起来。
留空时两个动作按词面与向量的融合分取前几条,不设下限。
重排使用通用重排接口:请求体为 model、query、documents,响应为 results 里每条的 index
与 relevance_score。服务商的 base_url 写到版本号(如 https://api.siliconflow.cn/v1)时自动补
/rerank;路径写法不同的服务商,在服务商里把完整地址填进 base_url,以 /rerank 或 /reranks
结尾的地址原样使用,例如百炼为 https://dashscope.aliyuncs.com/compatible-api/v1/reranks。
这类服务商连接只给重排用,对话模型不要挂在上面。
每次回想或查知识多一次请求。候选约 50 条时,一次约几千 token、耗时一秒以内。重排请求失败时, 这次检索直接报失败,不会悄悄退回不设下限的排序。不同重排模型的分数刻度不一样,换模型后应重新确认下限。
表情包多模态向量¶
model_tasks.multimodal_embedding 在界面显示为「多模态向量」,仅接受 dashscope_multimodal 或 ark_multimodal。
候选的模型 ID、协议和维度必须一致,可以使用同一模型的不同厂商连接作为备份。留空不继承其它任务。
配置此槽后,表情包使用图片首帧与标签的融合向量,查询仍只发送情绪文字。 送出前取首帧、最长边缩到 512,不透明的图转 JPEG,带透明通道的保留 PNG;含图片的请求每批最多 5 张。 首次启用要为整库补算,本机 456 张约 12 分钟,期间表情包按标签匹配。 百炼融合模型应使用 2026-03-06 及以后的版本,旧版丢弃文字时会明确报错。维度应填写模型实际支持的值。
不配置专用槽时,表情包只使用 embedding 任务的标签文字向量,即使该任务的协议本身支持图片也不发送图片。
两槽都为空时保留现有标签匹配。事实与知识始终使用 embedding,仍由 [vector].enabled 控制;表情包专用槽不受这个开关限制。
启动时按模型、协议、维度和配方比对向量空间:首次登记假定已有向量来自当前配置,不清空;空间变化时清空该消费方的向量并打印条数。 表情包的缺失向量在后台补算,含封禁行;单张文件失败会告警并跳过,关停时未完成的行留待下次启动续算。