跳到主要内容

渠道、模型与用量表

本页覆盖模型供给与调用记录 6 张表(记法约定见总览)。

channels — 上游供应商渠道

一个渠道 = 一个供应商账号(base_url + key)。共 9 列。

列名类型可空默认值说明
idTEXT否(PK)ch_ + 12 位十六进制
nameTEXT渠道名;lower(trim(name)) 唯一
typeTEXTopenai / claude / gemini / mock(schema 注释);管理 API 校验额外接受别名 anthropicgoogleapi/admin_handlers.go:194-208
api_formatTEXT''仅 openai 类型有效:chatresponses(Chat Completions vs Responses API);其他类型必须留空
base_urlTEXT''上游基址(空 = 官方默认端点)
api_keyTEXT''明文存储的供应商密钥,仅 API 层掩码
enabledINTEGER1是否启用
sort_orderINTEGER0拖拽排序
updated_atINTEGER → BIGINTnow()更新时间
  • 外键:无出向。入向models.channel_id(CASCADE,唯一硬外键);另有无约束软引用:models.fallback_channel_idusage_logs.channel_id
  • 索引idx_channels_name_unique(UNIQUE ON lower(trim(name)))。
  • 备注:删除渠道 → CASCADE 删除其全部模型。mock 出现在 schema 注释与 provider 代码(无 key 时走 mock 实现,llm/openai_provider.go:36),但管理 API 的类型校验拒绝 mock 字面值。

models — 模型目录

每行一个可调用模型,携带能力、工具、定价、审核全量元数据。共 34 列。

列名类型可空默认值说明
idTEXT否(PK)m_ + 12 位十六进制
channel_idTEXTFK→channels(id),CASCADE
kindTEXT'chat'chat / image / embeddingapi/admin_channel_model_import.go:241
request_idTEXT发给上游的模型名;渠道内 lower(trim(request_id)) 唯一
labelTEXT展示名
descriptionTEXT''描述
iconTEXT''图标(emoji/URL)
fallback_channel_idTEXT''主请求失败时重试的备用渠道('' = 无)
enabledINTEGER1是否上架
sort_orderINTEGER0选择器排序
tool_modeTEXT'native'工具调用方式:native(供应商原生 function calling)/ prompt(提示词模拟)/ none(禁用工具)
visionINTEGER1是否接受图片输入
streamINTEGER1是否支持 SSE 流式
research_enabledINTEGER1是否对该模型暴露 Deep Research
fastINTEGER0快速模式的全平台唯一快速模型标记(不变式由应用层维护,无库级约束)
system_promptTEXT''该模型附加的系统提示
param_controlsTEXT(JSON)'[]'用户可调参数白名单,每项声明 key(常见如 temperaturetop_pmax_tokensthinkingeffort)、type(toggle/select)与取值→上游请求体 mapllm/param_controls.go
extra_paramsTEXT(JSON)'{}'管理员专属的上游请求默认值;供应商原生请求字段优先(深合并)
official_toolsTEXT(JSON)'[]'供应商托管工具 [{name,icon,request}](旧式字符串数组在迁移中升级)
builtin_toolsTEXT(JSON)NULL本地默认工具;NULL = 全部(向后兼容),'[]' = 全禁
mcp_server_idsTEXT(JSON)NULL默认挂接的管理员 MCP 服务 id;NULL/[] = 无
tagsTEXT(JSON)'[]'model_tags id 数组(选择器过滤)
moderation_enabledINTEGER0生成前审查 prompt
moderation_modeTEXT'keyword'keyword(词表)/ model(审核模型,走 task.moderation 任务)
price_inputREAL → DOUBLE PRECISION0每百万输入 token 价格
price_outputREAL → DOUBLE PRECISION0每百万输出 token 价格
price_cache_readREAL → DOUBLE PRECISION0缓存读价格
price_cache_writeREAL → DOUBLE PRECISION0缓存写价格
price_per_imageREAL → DOUBLE PRECISION0每张图价格
currencyTEXT'USD'定价币种
dimINTEGER0嵌入模型输出维度(决定 Qdrant 集合 aivory_c<dim> 分区)
compaction_token_thresholdINTEGER0模型专属压缩触发阈值(0 = 用全局 compaction_token_trigger
image_timeout_secINTEGER0图片生成超时秒数(0 = 默认)
updated_atINTEGER → BIGINTnow()更新时间
  • 索引idx_models_channel(channel_id)idx_models_kind(kind, enabled)idx_models_channel_request_unique(UNIQUE ON (channel_id, lower(trim(request_id))))。
  • 入向引用knowledge_bases.embedding_model_id(无 CASCADE——嵌入模型被库引用时拒绝删除)、model_group_quotas.model_idmodel_skills.model_id(均 CASCADE)、conversations.model_id/messages.model_id无约束快照
  • 备注python_execute 与 web 搜索未配置后端时会从模型工具声明中扣留(cmd/api/main.go:131-137),与本表无关但常被误认为数据问题。

model_tags — 模型标签

管理员维护的选择器过滤标签。共 4 列。

列名类型可空默认值说明
idTEXT否(PK)mtag_ + 12 位十六进制
nameTEXT标签名;lower(trim(name)) 唯一
sort_orderINTEGER0排序
created_atINTEGER → BIGINTnow()创建时间
  • 备注:模型侧关系存在 models.tags(JSON id 数组),不是本表的行——删标签不会级联清理(应用层负责同步)。

model_skills — 模型默认技能关联

纯关联表。共 2 列。

列名类型可空默认值说明
model_idTEXT否(PK 之一)FK→models(id),CASCADE
skill_idTEXT否(PK 之一)FK→skills(id),CASCADE
  • 主键:复合 (model_id, skill_id)

usage_logs — 可删除的诊断明细

每次上游调用一行(失败也记),管理后台"用量"页可删。共 25 列。

列名类型可空默认值说明
idINTEGER → BIGSERIAL否(PK)自增唯一自增整数;SQLite INTEGER PRIMARY KEY AUTOINCREMENTschema.sql:827),PG BIGSERIAL
user_idTEXTFK→users(id),CASCADE
conversation_idTEXTNULL归属会话(软引用,无 FK)
message_idTEXTNULL归属消息(软引用)
model_idTEXT实际服务的模型(软引用快照)
purposeTEXTchat / image / embedding / verify / task. 前缀的内部任务(task.titletask.routertask.rag_evidence_judgetask.rag_map_reducetask.compacttask.memory_extracttask.memory_adjudicatetask.downgradetask.research_plantask.research_verifytask.research_validatetask.moderationtask.search_queriestask.tool_routetask.image_intentllm/task_llm.go:52-99
input_tokensINTEGER → BIGINT0输入 token
output_tokensINTEGER → BIGINT0输出 token
cache_read_tokensINTEGER → BIGINT0缓存读 token
cache_write_tokensINTEGER → BIGINT0缓存写 token
images_countINTEGER0生成图片数
costREAL → DOUBLE PRECISION0该行成本(按模型 currency
currencyTEXT'USD'成本币种
creditsREAL → DOUBLE PRECISION0该行向用户收取的积分(0 = 免费/未换算)
channel_idTEXT''实际服务该请求的渠道
fallbackINTEGER01 = 经模型的备用渠道(fallback_channel_id)服务
statusTEXT'ok'ok / error(错误请求同样入库)
errorTEXT''上游失败详情(仅管理员可见)
request_methodTEXT''status='error' 行的脱敏上游请求现场
request_urlTEXT''同上
request_headersTEXT''同上(已脱敏)
request_bodyTEXT''同上;受管理员日志开关 log_request_bodies 控制
ttft_fallback_modelTEXT''非空 = TTFT 超时后模型级回退接管(与渠道 fallback 正交);值为回退模型的展示名
created_atINTEGER → BIGINTnow()发生时间
workspace_idTEXT''※附加列:归属工作空间(空间用量页过滤;'' = 个人)
  • 索引idx_usage_user_time(user_id, created_at)idx_usage_model_time(model_id, created_at)idx_usage_user_model_time(user_id, model_id, created_at)(缓存计数器冷启动时的权威回退聚合)。
  • 备注:本表是可删除的诊断副本——分析统计不读它(读 usage_stats),删日志永远不改变报表。

usage_stats — 仅追加的分析真相

成功调用的不可变事实,分析仪表盘的唯一数据源。共 19 列。

列名类型可空默认值说明
source_log_idINTEGER → BIGINT否(PK)对应 usage_logs.id幂等键而非外键——故意无 FK,日志随便删
user_idTEXTNULLFK→users(id)SET NULL(全表唯一的外键:删号匿名化归属但保住全局/模型历史)
conversation_idTEXTNULL快照,无 FK
message_idTEXTNULL快照,无 FK
model_idTEXT快照,无 FK
purposeTEXTusage_logs.purpose 同词表
input_tokensINTEGER → BIGINT0usage_logs
output_tokensINTEGER → BIGINT0usage_logs
cache_read_tokensINTEGER → BIGINT0usage_logs
cache_write_tokensINTEGER → BIGINT0usage_logs
images_countINTEGER0usage_logs
costREAL → DOUBLE PRECISION0usage_logs
currencyTEXT'USD'usage_logs
creditsREAL → DOUBLE PRECISION0usage_logs
workspace_idTEXT''空间归属(在 CREATE 中就有,与 usage_logs 的附加列不同)
channel_idTEXT''服务渠道快照
fallbackINTEGER0渠道回退标记
ttft_fallback_modelTEXT''模型回退标记
created_atINTEGER → BIGINT无默认由镜像写入(从对应日志行复制),刻意不给 now() 默认值
  • 镜像机制:两方言各安装一个 AFTER INSERT 数据库触发器把成功行镜像进来(status='error' 不镜像;ON CONFLICT DO NOTHING 幂等),安装/回填见 store/usage_stats.goEnableUsageStatsMirror / BackfillUsageStatsstore.go:709-714)。逻辑备份(pg_dump)不保留该触发器——由应用启动时重新安装。
  • 索引idx_usage_stats_time(created_at)(user_id, created_at)(model_id, created_at)(message_id, purpose, source_log_id)

相关页面