十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

big-AGI Ollama 模型注册表维护指南:从官方库页面抓取到源码级同步的自动化工作流

big-AGI Ollama 模型注册表维护指南:从官方库页面抓取到源码级同步的自动化工作流 big-AGI Ollama 模型注册表维护指南从官方库页面抓取到源码级同步的自动化工作流【免费下载链接】big-AGIAI suite powered by state-of-the-art models and providing advanced AI/AGI functions. Includes AI personas, AGI functions, world-class Beam multi-model chats, text-to-image, voice, response streaming, code highlighting and execution, PDF import, presets for developers, much more. Deploy on-prem or in the cloud.项目地址: https://gitcode.com/GitHub_Trending/bi/big-AGIOllama 本地模型服务因其 API 不提供上游可拉取模型列表big-AGI 在 src/modules/llms/server/ollama/ollama.models.ts 中维护了一份硬编码的基础模型注册表。本文基于 .claude/commands/llms/update-models-ollama.md 的维护规范完整讲解这套从抓取官方模型库 HTML、用解析脚本提取结构化数据、再到按严格纪律回写 TypeScript 定义文件的自动化工作流并深入源码揭示这份注册表在运行时如何被消费——读完你既能独立执行一次模型列表同步也能理解isNew徽标、能力标签tools/vision/thinking与上下文窗口的底层联动逻辑。一、为什么 Ollama 需要一份硬编码的模型注册表在 big-AGI 的模型接入架构中大多数云端厂商OpenAI、Anthropic、Gemini 等都提供/v1/models之类的运行时枚举 API。而 Ollama 的情况特殊ollama.models.ts 头部注释给出了明确原因Ollama API 不提供上游可用模型列表无法像 OpenAI 那样直接拉取API 也不提供模型描述模型的能力、参数规模等信息无从自动获取上下文窗口大小同样不可靠获取且上游存在已知 bug对应 ollama/ollama issue #1473。因此 big-AGI 采取硬编码注册表 运行时枚举的双轨方案硬编码注册表OLLAMA_BASE_MODELS镜像 Ollama 官方模型库索引排除 embedding 模型按最新优先排序记录每个模型的下载量、能力标签、尺寸标签与新增日期运行时枚举在 listModels.dispatch.ts 的ollama分支中通过/api/tags列出用户本地已拉取的模型再逐模型调用/api/show补充元数据最后用注册表里的hasTools、hasVision等字段补全能力描述。这份注册表既是管理端可拉取模型目录的数据源也是已安装模型能力描述的补充来源因此它必须与官方库保持同步——这正是本文维护工作流的用途所在。二、核心数据结构OLLAMA_BASE_MODELS与两个更新日期常量1. 模型条目对象注册表本体是一个以模型名为键的映射见 ollama.models.tsexport const OLLAMA_BASE_MODELS: { [key: string]: { pulls: number, // 官方库累计下载量四舍五入后的近似值 contextWindow?: number, // 可选覆盖默认上下文窗口默认 8192 hasTools?: true, // 支持函数调用 / 工具 hasVision?: true, // 支持视觉输入 isEmbeddings?: true, // 是 embedding 模型注意复数 s tags?: string[], // 能力标签 尺寸标签如 [thinking, 1.5b, 7b] added?: string // 新增日期YYYYMMDD 格式 } } { ... };真实条目示例截至本文撰写时文件内容deepseek-r1: { pulls: 92200000, tags: [thinking, 1.5b, 7b, 8b, 14b, 32b, 70b, 671b], hasTools: true, added: 20250128 }, gemma4: { pulls: 23900000, tags: [thinking, audio, e2b, e4b, 12b, 26b, 31b], hasVision: true, hasTools: true, added: 20260402 }, kimi-k3: { pulls: 67000, tags: [thinking], hasVision: true, hasTools: true, added: 20260817 }, command-r-plus: { pulls: 796000, contextWindow: 128000, tags: [104b], hasTools: true, added: 20240501 },注意几个细节tags数组混排了能力标签如thinking、audio与尺寸标签如1.5b、7b、671b顺序与官方库页面上的顺序一致added只出现在新模型上老条目保留原始日期不动默认上下文窗口为 8192因此contextWindow仅在有明确信息时才定义如command-r-plus的 128000避免冗余。2. 更新日期常量驱动isNew徽标文件末尾定义了两个字符串常量见 ollama.models.tsexport const OLLAMA_LAST_UPDATE: string 20260831; export const OLLAMA_PREV_UPDATE: string 20260824;它们的语义是OLLAMA_PREV_UPDATE保存上一次同步日期OLLAMA_LAST_UPDATE保存当前同步日期。任何added晚于OLLAMA_PREV_UPDATE的模型都会被判定为本轮新增从而在管理界面显示NEW徽标详见本文第六节。三、自动化同步工作流两条命令搞定全流程维护规范给出了高度自动化的两步工作流全部命令可直接在仓库根目录执行# 1. 抓取官方模型库 HTML 到跨平台临时目录按 newest 排序保证顺序稳定 curl -s https://ollama.com/library?sortnewest -o $(node -p require(os).tmpdir())/ollama-newest.html # 2. 用解析脚本处理脚本会自动在 os.tmpdir() 中寻找该文件 node .claude/scripts/parse-ollama-models.js 211. 抓取阶段为什么用?sortnewest官方库索引页面默认排序会变动而本注册表要求以最新优先固定排序对应 ollama.models.ts 注释// Sorted by newest。sortnewest参数保证每次抓取的页面顺序稳定从而让注册表的条目顺序与页面一致、diff 最小化便于审查。$(node -p require(os).tmpdir())利用 Node 运行时获取跨平台的临时目录路径macOS/Linux 为/tmpWindows 为用户 TEMP 目录避免硬编码路径带来的环境差异。2. 解析阶段脚本自动定位文件解析脚本 .claude/scripts/parse-ollama-models.js 支持显式传参也支持自动定位const htmlPath process.argv[2] || path.join(os.tmpdir(), ollama-newest.html);若文件不存在脚本会打印友好的错误提示与重试命令并退出见该脚本 L34-L41。四、解析脚本原理5 个管道分隔字段与三条过滤规则1. 输出格式脚本以管道分隔输出每行 5 个字段modelName|pulls|capabilities|sizes|cloud官方文档给出的两个示例行deepseek-r1|91500000|tools,thinking|1.5b,7b,8b,14b,32b,70b,671b| kimi-k3|39000|vision,tools,thinking||cloud其中capabilities来自页面上的靛蓝色能力芯片indigo chips取值集合为tools、vision、thinking、embedding、audiosizes来自蓝色尺寸芯片blue chips如1.5b、7bcloud第 5 字段为cloud表示该模型是纯云端模型来自青色芯片标记本地没有可拉的尺寸空表示普通可拉取模型。2. 三条过滤 / 保留规则不设 pulls 阈值、不设 top-N 截断索引页上每一行都应当进入文件每一条文件记录都应对应页面输出的一行The parser applies no pull threshold and no top-N cut排除 embedding 模型embedding能力模型会被跳过并计数脚本中skippedEmbeddings因为注册表只承载对话/工具类模型保留 cloud-only 模型kimi-k3、glm-5.2、minimax-m3等纯云端条目照常写入文件第 5 字段仅作信息提示文件本身没有云端标记。云端模型没有尺寸芯片导致sizes为空是预期行为不是解析失败。3. Pulls 的四舍五入为稳定 diff 而设计官方库的下载量数字每小时都在变化若原样写入会导致每次同步产生大量无意义 diff。脚本提供roundPulls分级舍入函数见 parse-ollama-models.jsfunction roundPulls(pulls) { if (pulls 10000000) return Math.round(pulls / 100000) * 100000; // 10M舍入到 10 万 if (pulls 1000000) return Math.round(pulls / 10000) * 10000; // 1M舍入到 1 万 return Math.round(pulls / 1000) * 1000; // 1M舍入到 1 千 }例如109,123,456 → 109,100,000、5,432,100 → 5,430,000、88,700 → 89,000。这也解释了为什么注册表中的pulls都是 1000 的整数倍——如deepseek-r1的92200000。4. 对页面标记的脆弱依赖与健康检查脚本头部注释明确警告L24-L27官方库页面没有机器可读属性所有字段都是靠渲染后的芯片 CSS class 读取的能力text-indigo-600类名的芯片文本尺寸text-blue-600类名的芯片文本云端标记text-cyan-500且文本为cloud的芯片。因此页面改版会导致所有模型解析出 0 pulls / 空能力。脚本内置了两级健康检查统计信息打印到 stderrTotal models: N (X cloud-only, Y embedding models skipped)若所有模型 pulls 均为 0打印明确警告WARNING: 0 pulls on every model - the page markup changed, fix the regexes in this script部分为 0 也会单独计数提醒。维护规范要求编辑前必须做 sanity check——输出 200 行、pulls 非零、capabilities 非空。全零 pulls 或空能力意味着页面标记已变应先修复脚本中的正则绝不能把残缺列表写进文件。五、字段映射规则从解析行到 TypeScript 定义解析输出行与注册表条目之间的映射规则如下源自维护规范 Field mapping 一节解析输出字段注册表字段说明tools能力hasTools: true函数调用能力vision能力hasVision: true视觉输入能力embedding能力isEmbeddings: true注意复数s因解析脚本已丢弃 embedding 模型实际不应出现thinking/audio能力并入tags数组与尺寸标签混排1.5b、7b、32b…尺寸追加进tags数组保持页面顺序因此一个解析行qwen3.8|1200000|thinking|27b| 含 vision、tools 的情况另见能力列会映射为qwen3.8: { pulls: 1200000, tags: [thinking, 27b], hasVision: true, hasTools: true, added: 20260817 },六、同步纪律排序、日期、徽标与移除规则维护规范强调了几条不可妥协的纪律直接决定 diff 质量与 UI 正确性1. 排序与文件整洁排序必须与源页面完全一致newest first这是保证稳定排序的前提最小化空白与注释改动聚焦内容更新保留注释与换行让 diff 易于审查。2. 日期管理驱动NEW徽标仅对新增模型设置今天的日期YYYYMMDD 格式不得修改既有模型的日期常量推进规则OLLAMA_PREV_UPDATE← 旧的OLLAMA_LAST_UPDATEOLLAMA_LAST_UPDATE← 今天。例如本次同步前两者为20260824 / 20260831那么下次同步时 PREV 取20260831、LAST 取新日期。这条规则的消费端在 ollama.router.ts 的adminListPullable查询中isNew: !!model.added model.added OLLAMA_PREV_UPDATE,即任何added日期晚于OLLAMA_PREV_UPDATE的模型都会在管理界面获得NEW徽标。UI 消费点在 OllamaAdministration.tsx{p.isNew true Chip sizesm variantsolidNEW/Chip} {p.label}{sortByPulls (${p.pulls.toLocaleString()})}3. 移除规则不要用 404 探测移除某条目仅当该模型名在官方库索引中完全消失。规范明确警告不要探测ollama.com/library/id页面——已下架模型在该 URL 上依然返回 200已验证glm-5、glm-4.7就是如此索引中已不存在但单独访问仍 200因此 404 探测永远不会触发会造成漏删。4. 同步后全面复核完成写入后应通读整个模型列表逐项核对新增、移除与变更确保与页面输出严格一致。七、注册表的运行时消费三层调用链理解这份文件的真实分量需要看它如何被三个层级消费1. 运行时模型枚举对话模型的能力补全在 listModels.dispatch.ts 的ollama分支中fetchModels先请求GET /api/tags拿到用户本地已安装模型列表再对每个模型并发调用POST /api/show用Promise.allSettled单个模型失败不拖垮整体convertToDescriptions阶段用OLLAMA_BASE_MODELS[modelName] ?? {}查找注册表条目hasTools→ 追加LLM_IF_OAI_Fn接口函数调用hasVision或模型名含-vision→ 追加LLM_IF_OAI_Vision视觉isEmbeddings为假才赋予LLM_IF_OAI_ChatbaseModel.contextWindow || 8192作为默认上下文窗口随后尝试从/api/show返回的parameters里解析num_ctx行覆盖之并将maxCompletionTokens设为上下文窗口的一半模型描述首行由parameter_size、quantization_level、format、模型文件体积GB拼装并追加[tools]/[vision]标记。也就是说注册表直接影响对话界面中每个 Ollama 模型的能力开关工具调用、视觉输入与上下文窗口显示。2. 管理端可拉取目录Ollama Administrationollama.router.ts 的adminListPullable将整个OLLAMA_BASE_MODELS直接映射为可拉取列表tag: latest、tags取自尺寸标签、pulls透传、isNew按上文规则计算。配对的adminPull则调用POST /api/pull按行解析返回的 JSONL 流累计最新status与erroradminDelete调用DELETE /api/delete。管理界面 OllamaAdministration.tsx 提供下拉选择可切换为按下载量排序、Tag 自由输入默认latest、Pull / Delete 按钮与拉取可能超时但服务器仍在下载的提示——超时场景源于 Edge Functions 的时长限制需再次点击 Pull 直到出现绿色成功消息这一点在 docs/config-local-ollama.md 的用户指南中亦有说明。3. 访问层默认 Host 与路径拼接ollama.access.ts 定义了访问配置默认 Host 为http://127.0.0.1:11434可用环境变量OLLAMA_API_HOST覆盖再经llmsFixupHost规范化后拼接 API 路径/api/tags、/api/show、/api/pull、/api/delete。这意味着注册表维护工作与 Ollama 服务的网络拓扑无关——无论本地还是远端模型元数据都来自这份硬编码镜像。八、失败兜底与维护边界当官方库抓取被拦截时维护规范给出了替代信息源路径如检查 Ollama 官方仓库、搜索 ollama featured models / ollama latest models 等但强调应以官方库索引为准。同时需要明确本次工作流的边界它只负责维护ollama.models.ts这一个文件规范要求参考 llm.server.types.ts 与 models.mappings.ts 以理解上下文但不要下钻修改其他代码。这与仓库内其他update-models-*维护命令如 update-models-openai.md、update-models-anthropic.md 等全部位于 .claude/commands/llms/ 目录职责分离动态厂商OpenRouter、Together 等由 API 运行时拉取并校验解析器而 Ollama 这类无列表 API 的厂商则依赖本文件的手动同步。九、执行检查清单一次合规的 Ollama 模型注册表同步应逐项确认已抓取?sortnewest页面的最新 HTML解析输出200 行无0 pulls警告capabilities 非空云端模型kimi-k3等已保留空 sizes 属预期embedding 模型被脚本跳过stderr 计数与页面一致条目顺序与页面完全一致newest first仅新模型写入今天的added日期既有日期未动OLLAMA_PREV_UPDATE← 旧OLLAMA_LAST_UPDATEOLLAMA_LAST_UPDATE← 今天已核对新增、移除、变更三项移除仅基于索引缺名而非 404 探测空白与注释改动最小化diff 清晰可审。完成上述步骤后新的模型列表会立即作用于对话模型的能力开关hasTools/hasVision、上下文窗口显示以及管理界面中带NEW徽标的可拉取目录让 Ollama 接入在 big-AGI 中始终与官方模型生态保持同步。【免费下载链接】big-AGIAI suite powered by state-of-the-art models and providing advanced AI/AGI functions. Includes AI personas, AGI functions, world-class Beam multi-model chats, text-to-image, voice, response streaming, code highlighting and execution, PDF import, presets for developers, much more. Deploy on-prem or in the cloud.项目地址: https://gitcode.com/GitHub_Trending/bi/big-AGI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表