



ollama v0.30.10 已发布,发布时间为 2026 年 6 月 18 日。 从这次更新内容来看,版本体量并不只是一次常规修复,而是围绕 Apple Silicon、MLX 引擎、Cohere2 MoE 模型体系、解析器与渲染器能力、导入量化策略以及发布构建链路,做了一次非常完整的增强。
如果用一句话概括这个版本,那就是:
从变更范围看,本次对 14 个文件进行了修改,包含 3 次提交,总计新增 1916 行、删除 16 行。 这说明 v0.30.10 的重点并不在表层功能描述,而在底层兼容性、模型接入链路和推理运行体验的整体完善。
一、v0.30.10 核心更新一览
这次版本更新的官方要点非常明确,主要包括三项:
这三项内容看似简短,但结合代码变更来看,实际落地远不止一句“支持运行”那么简单。因为要让一类新模型真正可用,至少要打通以下几个环节:
而 v0.30.10 正是在这些环节里,把 Cohere2 MoE,也就是 Command A / North 这一家族,完整接入到了 Ollama 的体系中。
二、Apple Silicon 上的 Command A / North 家族正式跑通 MLX
本次更新最重要的变化,就是 Command A 和 North 家族模型现在能够通过 MLX 引擎在 Apple Silicon 上运行。
这不是单点支持,而是从模型导入、渲染、解析、MLX 运行时注册到构建流程都做了适配。
相关变更中最直接的一项,是在 MLX runner 的导入列表里新增了:
x/models/cohere2_moe这意味着 MLX 运行时已经把 Cohere2 MoE 模型纳入了支持范围。对应代码中,在 x/mlxrunner/imports.go 里增加了对 github.com/ollama/ollama/x/models/cohere2_moe 的导入注册。
这一步非常关键,因为没有这一层注册,即使前面的模型识别和渲染都做好了,也无法在 MLX 侧真正执行。
同时,本次还新增了一个非常大的模型实现文件:
x/models/cohere2_moe/cohere2_moe.go这个文件本次新增了 770 行,说明 Cohere2 MoE 在 MLX 侧并不是“简单套壳式接入”,而是已经具备相对完整的模型实现基础。虽然这里没有展开文件内部全部逻辑,但仅从新增体量就能看出,这次支持是实打实的底层接入,而不是表面上的识别兼容。
三、llama.cpp 升级到 b9672,底层能力同步增强
本次版本还更新了底层 llama.cpp 版本:
b9626 升级到 b9672这个改动体现在 LLAMA_CPP_VERSION 文件中,直接从原来的 b9626 变更为 b9672。
别看只是一个版本号变化,这类更新通常意味着:
而结合本次新增 Cohere2 MoE 支持来看,这次升级显然也是整个版本能力扩展的一部分。因为上层接入新模型家族,往往需要底层引擎具备相应兼容能力,尤其是面对新架构、新 tokenizer 标记和新工具调用模板时,后端能力同步非常重要。
四、修复 MLX 构建产物问题,macOS 发布链路进一步稳定
除了模型支持,v0.30.10 还对构建发布侧进行了明确修复,重点是:
在 .github/workflows/release.yaml 中,本次更新新增了对 macOS 构建环境的明确约束:
DEVELOPER_DIR 固定为 /Applications/Xcode_26.4.1.app/Contents/DeveloperCGO_CFLAGS 设置为 -mmacosx-version-min=14.0 -O3CGO_CXXFLAGS 设置为 -mmacosx-version-min=14.0 -O3CGO_LDFLAGS 设置为 -mmacosx-version-min=14.0 -O3同时新增了一个专门的 Xcode 选择步骤,用于:
DEVELOPER_DIR 是否存在/Applications 下的 Xcode 目录xcode-select 切换到指定 Xcodemetal 工具是否存在这些动作说明,之前 Darwin 侧构建过程可能存在环境漂移问题,而本次通过固定 Xcode 版本和显式检查 Metal 工具链,来保证 MLX 相关构建产物的一致性与可用性。
这对 Apple Silicon 用户非常重要。因为 MLX 的运行质量不仅取决于模型逻辑是否接入,更取决于构建链条是否稳定。如果发布产物本身出现偏差,那么用户侧即便升级版本,也可能表现为模型无法加载、二进制行为不一致或运行异常。
本次在 CI 流程里直接把 Darwin release 的 Xcode 固定下来,本质上是在给 Apple Silicon 支持“兜底”。
五、删除旧补丁文件,说明底层依赖状态进一步演进
本次更新还删除了一个补丁文件:
llama/compat/002-llama-cpp-ui-empty-assets.patch这个文件被整体删除,共 15 行。
虽然变更说明没有进一步展开,但从版本上下文看,这通常意味着:
这类删除虽然不显眼,但往往意味着项目对底层依赖的维护负担在下降,兼容逻辑更加干净。
六、新增 Cohere 解析器:完整支持思维链、文本块、工具调用块与旧模板标记
这次更新中最值得技术细看的部分,就是新增了:
model/parsers/cohere.gomodel/parsers/cohere_test.go也就是说,Ollama 为 Cohere2 MoE 家族专门增加了一套输出解析器。
这个解析器的定位非常明确,它用于解析 Cohere North / Command A 2026 模型输出,尤其是像 North-Mini-Code-1.0 这一类模型的生成格式。
从代码注释可以看出,这类模型的生成提示末尾有两种典型形式:
也就是说,模型在 reasoning 开启时,输出会直接从思维块内部开始。
这个解析器主要支持以下几类标记结构:
它定义的保留 token 包括:
这意味着 Ollama 不只是“能读懂正常格式”,而是连旧模板中偶尔出现的 legacy response markers 也兼容了。对于真实生成环境来说,这一点尤其重要,因为模型采样输出不一定总是严格遵循最新模板。
七、Cohere 解析器的状态机设计非常完整
从实现来看,这个解析器采用了状态机设计,主要包含四种状态:
初始化逻辑也比较清晰:
这里有两个非常实用的细节:
前者意味着,如果对话历史最后一条 assistant 回复是一个未闭合的文本块,那么解析器会继续承接它,而不是错误重置状态。 后者则保证当 think=false 时,模型不会被强行按“必须先输出思维”的路径解析。
八、对流式输出的处理很细,避免“假死式等待”
解析器在 Add 和 eat 的设计上,明显考虑了流式输出场景。
它会不断把增量输出写入 buffer,然后循环消费。 其中一个很关键的问题是:当标记被切碎到多个 chunk 中时,不能把半截 tag 泄漏到用户内容里,也不能因为等待完整 tag 而把内容一直卡住。
为了解决这个问题,解析器做了几件事:
这个逻辑直接对应测试里的一个回归场景:
done=false 时就流出,不能等到整个生成结束这类问题在实际产品里会表现成:
本次测试明确覆盖了三类情况:
只要思维结束之后接的是这些内容,就必须能在流式阶段提前输出。 这说明 v0.30.10 在解析器层面对“流式可见性”做了专门修正。
九、工具调用解析增强,面对畸形 JSON 也尽量保住有效调用
Cohere 解析器的另一大重点,是工具调用解析。
它把动作块内部视为一个 JSON 数组,数组里的每个元素结构为:
tool_call_idtool_nameparameters正常情况下,会直接整体反序列化这个数组。 但模型输出在真实采样时经常会出现格式瑕疵,比如:
为此,本次新增的 parseCohereActions 做了降级策略:
这里还专门实现了 scanJSONObjects,用于扫描顶层 {...} 对象,并且会正确处理:
这样就可以避免把字符串里的花括号误判为对象边界。
这个增强非常实用。因为在工具调用场景下,最怕的是:
现在的策略变成:
这意味着工具链路的鲁棒性明显提升了。
十、Cohere 解析器测试覆盖非常全面
从 model/parsers/cohere_test.go 的 268 行新增内容来看,本次不仅新增了解析器,而且做了非常细致的测试。
测试覆盖的场景包括:
这些测试基本把真实部署中最容易踩坑的流式解析问题都覆盖到了。 尤其是以下几个点,非常能说明这次接入不是“写完就算”:
因此,从工程质量上看,v0.30.10 对 Cohere 家族解析支持的完成度是相当高的。
十一、解析器正式注册,模型识别链路打通
仅有解析器文件还不够,还必须进入统一注册表。
本次在 model/parsers/parsers.go 中新增:
cohere 时,返回 CohereParser这意味着后续只要模型识别阶段命中 cohere,就会使用这一套专用解析器。
十二、新增 Cohere 渲染器:把对话历史、工具定义、思维链、动作块、工具结果都按模板写对
与解析器对应的,是本次新增的渲染器:
model/renderers/cohere.gomodel/renderers/cohere_test.go这部分非常关键,因为解析器解决的是“读懂模型输出”,而渲染器解决的是“把输入喂给模型”。
如果模板渲染不正确,模型就可能:
本次渲染器专门适配的是 Cohere North / Command A 2026 的 chat template。 它支持以下能力:
它还明确指出,模型特定的平台系统指令,比如 identity 和默认 policies,不在渲染器里硬编码,而是依赖模型的 Modelfile SYSTEM prompt 或请求中的第一条 system message。
这一点非常重要,因为它说明渲染器职责清晰,只做模板编排,不做额外内容注入。
十三、渲染器的系统消息与工具区块组织方式非常明确
渲染器输出以 LeadingBOS 开始,返回的是:
<BOS_TOKEN>然后会构造平台 system turn,包含两部分:
工具区块无论是否有工具,都会被渲染出来。
这在实现上通过 writeToolsSection 完成,格式非常严格:
工具项本身通过 cohereToolJSON 序列化,包含:
namedescriptionparametersresponses: null从实现上看,渲染器非常强调空白与分隔符的一致性,包括:
, 和 : 的空格风格这说明这次接入不是“语义接近即可”,而是尽量按原模板格式去还原。 对于大模型模板来说,这种严格性往往会直接影响输出稳定性。
十四、支持 assistant 文本、思维链、工具调用、工具结果和 prefill
在消息渲染逻辑上,CohereRenderer 处理了多种角色:
其中 assistant 分两种情况:
如果 assistant 包含工具调用,则会输出:
这里有一个细节: 渲染器保留了思维与动作前面的空白布局,以匹配模板中的未裁剪 jinja 空白。 这在测试中也有严格校验。
如果 assistant 是纯文本,则会输出:
如果这条 assistant 消息正好是最后一条消息,那么它会被视为 assistant prefill:
这与解析器里的 continuation 逻辑正好首尾呼应,形成闭环。
十五、工具调用 ID 重建与工具结果映射逻辑也已补齐
对于工具调用,渲染器并不是简单沿用原始 ID,而是维护了一套连续编号逻辑:
ToolCallID 找回对应的重建索引这个逻辑保证了两件事:
对于没有提供 ID 的情况,结果侧会退回到调用顺序或原值。
同时,连续的 tool 消息会被合并为一个 TOOL_RESULT 数组块。 也就是说,如果前面 assistant 一次发出多个工具调用,后续多个工具结果不会拆成多个 turn,而会按模板要求聚合在一起。
这在多工具协同场景中非常关键。
十六、渲染器测试同样覆盖到了模板关键路径
model/renderers/cohere_test.go 一共新增了 189 行测试,覆盖了多个核心场景:
其中有几个点值得特别提炼出来。
第一,system turn 中即使没有工具,也会输出工具区块。 第二,reasoning 关闭时,生成提示会输出“空思维块”,即思维开始后立刻结束。 第三,工具调用数组和工具结果数组的空白、缩进、换行布局都做了严格比对。 第四,assistant prefill 会留下一个未闭合的文本块,用于续写。
这说明 Cohere 模板支持不是“能跑就行”,而是对模板细节做了较高还原。
十七、渲染器正式注册,BOS 行为明确
在 model/renderers/renderer.go 中,本次也新增了注册逻辑:
cohere 时,返回 CohereRenderer同时测试还验证了:
LeadingBOSForRenderer("cohere") 返回 <BOS_TOKEN>这意味着渲染器已经完整进入统一调度体系,不是孤立文件。
十八、模型识别逻辑新增 cohere2moe 与 cohere2_moe 映射
要让 parser 和 renderer 真正生效,还必须保证模型被正确识别。
本次在 x/create/client/create.go 中,对 parser name 和 renderer name 的识别逻辑都做了扩展。
新增识别条件包括:
cohere2moecohere2_moe在不同判断分支中,命中这些字段后都会返回:
cohere也就是说,只要模型目录中的架构名或类型名包含这些关键字,Ollama 就会自动选中这套 Cohere 专用 parser 与 renderer。
这一步非常关键,因为它把“模型文件元信息”与“模板/解析能力”真正关联起来了。
十九、新增 Cohere2 MoE 导入变换:量化策略专门优化
本次在模型导入链路上还新增了:
x/create/cohere2moe.go这个文件新增 106 行,用于 Cohere2 MoE 导入时的张量量化策略调整。
其核心目标很明确:
这个 transform 会先尝试读取模型目录下的 config.json,解析其中的:
num_hidden_layers如果读取或解析失败,则回退为无启发式策略,不报错中断。
其后定义了专门的 quantizationType 逻辑,重点处理几类张量。
二十、嵌入层量化策略:优先走 8 位变体,降低解码带宽压力
针对 embed_tokens.weight,本次逻辑给出了明确策略:
具体来说:
int4 或 int8 请求模式下,优先尝试 int8mxfp4、nvfp4、mxfp8 请求模式下,优先尝试 mxfp8这说明本次更新对 Cohere2 MoE 的性能关注并不是泛泛而谈,而是已经细化到了 embedding 与 lm_head 共用权重带来的 decode bandwidth 问题。
二十一、MoE router gate 权重保持源精度,降低专家选择误差
另一个非常关键的策略,是对 .mlp.gate.weight 的处理。
代码中明确写到:
所以对于 .mlp.gate.weight:
这体现出这次更新对 MoE 模型特性的理解是比较深入的。 因为 MoE 模型里最敏感的并不总是大矩阵本身,而是“决定走哪个专家”的路由器。
二十二、敏感投影层采用按层位置启发式提升精度,避免默认策略的过度带宽开销
对于以下敏感张量:
v_projk_projdown_proj本次更新没有沿用默认策略中的“统一更高精度提升”,而是采用了按层位置的启发式方案。
实现中说明了几点:
down_proj 的统一 int8 提升会带来明显 decode bandwidth 成本useMoreBits(layerIdx, numLayers) 的思路具体规则上:
int4,提升目标为 int8mxfp4 或 nvfp4,提升目标为 mxfp8当满足以下条件时才提升:
如果层号已识别但不命中提升规则,则:
这套策略的核心就是一句话:
这对于 MoE 模型推理效率非常关键。
二十三、导入变换正式进入注册表
在 x/create/create.go 中,本次把:
Cohere2MoeForCausalLM注册到了 tensorImportTransformRegistry,对应工厂为:
newCohere2MoeImportTransform这意味着只要导入到对应模型类型,Ollama 就会自动启用这套专门量化策略。
也就是说,Cohere2 MoE 的支持不只是“运行时能推”,而是从导入阶段开始就采用针对性优化。
二十四、从创建、解析、渲染、导入到运行,Cohere2 MoE 已形成完整闭环
如果把这次更新的相关变更串起来看,会发现它其实构成了一条完整链路:
x/create/client/create.go 中识别 cohere2moe 与 cohere2_moecohere parser 和 renderermodel/renderers/cohere.go 中按 Cohere 模板渲染输入model/parsers/cohere.go 中解析思维、文本、动作和工具结果相关输出x/create/cohere2moe.go 中对导入量化策略做专门优化x/create/create.go 中将该导入策略注册到模型类型x/mlxrunner/imports.go 中把 cohere2_moe 纳入 MLX runnerx/models/cohere2_moe/cohere2_moe.go 的底层实现这就是为什么说 v0.30.10 的重点,不只是“支持一个新模型”,而是“打通一条新模型家族的全链路能力”。
二十五、这次更新的价值,几乎都集中在可用性与工程完整度上
从最终效果来看,v0.30.10 的价值主要体现在以下几个层面:
而且从测试数量和覆盖范围看,这次并不是只把功能接进来,而是尽量把流式、容错、模板细节和多工具场景都一并考虑到了。
二十六、v0.30.10 更新总结
代码地址:github.com/ollama/ollama
ollama v0.30.10 这次更新,表面上看只有几条发布说明,但从代码层面拆开后可以发现,它实际完成了以下几件大事:
cohere2moe 与 cohere2_moe 自动映射到 cohere