发布时间与版本概览ollama v0.40.13 为 Latest 版本发布时间为 2026 年 10 月 31 日。本次更新的核心焦点是 Liquid AI 的 LFM3 模型支持范围扩大。此前相关能力主要面向 Apple silicon而在 v0.40.13 中LFM3 模型现已能够运行于 Linux 和 Windows同时继续支持 Apple silicon。此次覆盖的不只是文本模型能力还包括 lfm3-audio 与 lfm3-omni 中的文本转语音能力。也就是说LFM3 的语音相关支持不再局限于 Apple silicon 环境Linux 与 Windows 平台也获得了对应支持。本次比较中共包含4 个提交29 个文件发生变化2 位贡献者参与新增 1,260 行删除 410 行更新涉及模型导入、语音渲染、llama-server 请求、重复惩罚参数处理、分词器 BOS 行为、Metal 编译兼容处理以及命令行无参数行为调整等多个部分。本次版本的核心变化LFM3 跨平台支持v0.40.13 最受关注的变化是 Liquid AI 的 LFM3 模型现在可以在 Linux、Windows 和 Apple silicon 上运行。更新说明明确指出LFM3 模型包含文本转语音能力其中 lfm3-audio 和 lfm3-omni 均涉及语音能力支持。此次更新将这部分能力扩展到了 Linux 与 Windows。从代码改动来看LFM3 的 GGUF 相关修复以及 llama-server 的 speech 支持是本次跨平台语音能力落地的重要组成部分。对应提交内容包括LFM3 GGUF 修复与 llama-server speech 支持llama.cpp 版本升级无参数运行 ollama 时显示帮助信息修复 Metal unary 相关崩溃问题llama.cpp 版本升级本次更新中LLAMA_CPP_VERSION文件的版本号发生变化b11901更新为b11963这意味着 ollama v0.40.13 所集成的 llama.cpp 版本由 b11901 升级至 b11963。llama.cpp 的升级与本次 LFM3 GGUF 修复、语音支持以及 Metal 兼容性修复共同构成了本版本的重要基础。命令行行为变化直接运行 ollama 显示帮助在cmd/cmd.go中命令行入口逻辑进行了调整。原先的逻辑使用Run在没有额外参数时会进入欢迎流程并尝试运行交互式界面。更新后改为了RunE并在完成版本判断后直接返回命令帮助。核心变化可以概括为Run:func(cmd*cobra.Command,args[]string){调整为RunE:func(cmd*cobra.Command,args[]string)error{当使用版本参数时仍然会执行版本处理逻辑ifversion,_:cmd.Flags().GetBool(version);version{versionHandler(cmd,args)returnnil}而无参数运行时不再执行原有的欢迎界面逻辑和交互式 TUI 流程改为returncmd.Help()也就是说直接运行ollama时行为变为显示帮助内容。与此对应原先的欢迎流程文件被删除cmd/welcome.go cmd/welcome_test.go其中cmd/welcome.go被删除共删除 37 行cmd/welcome_test.go被删除共删除 36 行这部分调整与提交说明中“运行 ollama 时显示帮助”相对应。launch 命令说明同步调整在cmd/launch/launch.go中launch 命令的说明文字也进行了更新。原有描述中无参数运行的说明是Without arguments, this is equivalent to running ollama directly.更新后变为Without arguments, choose a model or app from the interactive menu.同时命令说明保留了以下含义launch可以启动 ollama 交互菜单或直接启动某个特定集成如果传入标志或额外参数则需要指定集成名称支持的集成会在说明中列出这项文案调整与主命令无参数时显示帮助的变化一同出现。LFM3 语音配置改用渲染器提供的语音列表在create/lfm3.go中LFM3 模型导入时涉及语音列表的逻辑发生变化。原代码通过 LFM3 speech 包获取语音名称cfg.Voiceslfm3speech.VoiceNames()更新后改为通过渲染器获取 LFM3 Speech 的语音配置cfg.Voicesrenderers.LFM3SpeechVoices()对应的导入也发生调整。原先依赖github.com/ollama/ollama/mlxrunner/model/lfm3/lfm3speech更新为github.com/ollama/ollama/model/renderers相关逻辑位于augmentConfig中。当模型具备 speech 属性时配置将写入语音信息ift.speech{cfg.Voicesrenderers.LFM3SpeechVoices()}这意味着 LFM3 的语音配置来源由原有的lfm3speech包转向renderers中的 LFM3 Speech 语音定义。新增 llama-server 语音实现本次更新新增了文件llm/llama_server_speech.go该文件共新增 179 行代码核心目标是让llamaServerRunner实现Speaker接口var_Speaker(*llamaServerRunner)(nil)新增的Speech方法用于通过 llama-server 的/tts接口朗读文本。接口逻辑首先会判断请求中是否存在 SpeechPrompterifreq.Prompternil{returnapi.StatusError{StatusCode:http.StatusNotImplemented,ErrorMessage:this model does not support speech,}}如果没有 SpeechPrompter则返回“不支持 speech”的状态错误。随后逻辑还会检查模型是否携带 projectoriflen(s.launch.projectors)0{returnapi.StatusError{StatusCode:http.StatusNotImplemented,ErrorMessage:this model was created without its projector, which holds the speech codec; recreate it with the mmproj to use speech,}}这里明确指出speech codec 位于 projector 中。如果模型创建时没有带上 projector则无法使用 speech。错误信息也明确提示需要使用 mmproj 重新创建模型后才能使用语音能力。语音名称与语音语言的解析在进行 TTS 请求之前代码通过请求中的 Prompter 解析所选语音voice,err:req.Prompter.SpeechVoice(req.Voice)如果语音名称无效返回 HTTP 400 状态错误returnapi.StatusError{StatusCode:http.StatusBadRequest,ErrorMessage:err.Error(),}解析后的语音对象包含语音名称和语言信息后续会一起传递给 llama-server 的/tts请求。语音生成过程使用并发控制与服务状态检查新增的 Speech 实现中会先获取信号量iferr:s.sem.Acquire(ctx,1);err!nil{returnerr}defers.sem.Release(1)之后检查 llama-server 的状态status,err:s.getServerStatusRetry(ctx)如果服务状态并非 Ready则返回错误returnfmt.Errorf(unexpected server status: %s,status)因此语音生成请求会在服务就绪状态下进行。文本语音分块与 token 计数逻辑语音生成并不是直接将全部输入一次性发送而是通过渲染器提供的规则进行分块。代码注释指出SpeechPrompter 来自模型的 renderer其作用包括确定语音名称按发布方文档规定的方式拆分输入文本分块前需要进行 token 计数。代码维护了一个缓存counts:map[string]int{}计数函数会调用s.tokenize(ctx,text,false)并记录每段文本的 token 数量。代码特别说明分块过程会计数许多重叠片段每次计数都对应一次/tokenize调用。随后调用chunks:req.Prompter.SpeechChunks(req.Input,count)生成要朗读的文本块。如果 token 计数过程发生错误则返回count speech tokens相关错误。如果输入文本无法形成任何语音块则返回 HTTP 400 错误input has no text to speak因此空输入或没有可朗读文本的输入不会进入后续 TTS 生成过程。每个文本块对应一次 /tts 生成在生成阶段每个文本块都会调用speakChunk。代码注释明确表示每个 chunk 对应一次生成llama-server 负责根据 voice 和 language 渲染模型的tts模板请求体结构为typellamaServerTTSRequeststruct{Inputstringjson:inputVoicestringjson:voiceLangstringjson:langResponseFormatstringjson:response_formatStreambooljson:streamNPredictintjson:n_predict}实际请求会包含以下字段Input:chunk.Text,Voice:voice.Voice,Lang:voice.Language,ResponseFormat:pcm,Stream:true,NPredict:chunk.MaxFrames,也就是说输入内容来自当前文本块语音字段来自选择后的 voice语言字段来自 voice 的 language返回格式指定为pcm使用流式输出最大预测帧数由 chunk 的MaxFrames决定请求通过 HTTP POST 发送到http://127.0.0.1:端口/tts请求头为Content-Type: application/jsonJSON 编码时设置enc.SetEscapeHTML(false)语音请求失败时的错误处理当 HTTP 请求本身失败时如果错误属于上下文取消则直接返回该错误。否则会记录 llama-server TTS 错误并检查 runner 中是否存在最后错误信息。如果存在最后错误信息则会返回包含详细说明的错误model runner has unexpectedly stopped, this may be due to resource limitations or an internal error, check ollama server logs for details并在结尾附带最后错误信息。如果没有最后错误信息则返回不包含附加详情的同类错误提示。当/tts返回的 HTTP 状态不是 200 时代码会读取响应体并将其转换为状态错误returnapi.StatusError{StatusCode:res.StatusCode,ErrorMessage:s.statusErrorMessage(data),}llama-server 返回 PCM 格式的严格校验/tts返回成功后代码会检查响应头的Content-Type。新增的checkLlamaServerPCM函数会解析媒体类型参数并验证返回结果是否符合预期。要求包括媒体类型audio/pcm 编码float 位数32 采样率SpeechSampleRate代码逻辑为ifmediaType!audio/pcm||params[encoding]!float||params[bits]!32||rate!SpeechSampleRate{如果格式不符合预期会返回错误llama-server tts returned 某个类型, want 32-bit float PCM at 指定采样率 Hz代码注释说明llama-server 在response_format为pcm时返回的是单声道 float32 PCM 数据其采样率应当符合Speaker所承诺的采样率。float32 PCM 实时转换为 16 位 PCM新增的streamPCM16函数负责处理流式音频数据。该函数从响应流中读取数据buf:make([]byte,3210)每次读取后以 4 字节为一个完整 float32 样本进行处理。对于每个 float32 音频样本代码执行如下流程按小端序读取 float32 数据使用math.Float32frombits转换为浮点样本调用audio.PCM16(sample)转换为 PCM16使用小端序写入 16 位 PCM 数据将转换后的 PCM 数据通过回调函数输出核心代码包括sample:math.Float32frombits(binary.LittleEndian.Uint32(buf[i:]))binary.LittleEndian.PutUint16(pcm[i/2:],uint16(audio.PCM16(sample)))注释指出这一逻辑可以处理被拆分到多次读取中的单个样本。如果读取结束时仍然存在未构成完整 float32 样本的残留字节则会报错llama-server tts stream ended mid-sample这保证了输出音频流以完整样本为单位进行处理。repeat_last_n 参数兼容处理在llm/llama_server.go中新增了llamaServerRepeatLastN函数funcllamaServerRepeatLastN(repeatLastN,numCtxint)int{ifrepeatLastN0{returnnumCtx}returnrepeatLastN}代码注释解释了调整原因Ollama 的 repeat_last_n-1 表示整个上下文 llama-server 不接受负数值。因此当repeat_last_n小于 0 时系统会将其映射为上下文大小numCtx。该逻辑同时应用在两类请求中。一类是 Completion 请求RepeatLastN:llamaServerRepeatLastN(req.Options.RepeatLastN,s.options.NumCtx),另一类是 Chat 请求中的参数映射repeat_last_n:llamaServerRepeatLastN(req.Options.RepeatLastN,s.options.NumCtx),这项调整确保 Ollama 中代表“整个上下文”的负数设置能够转换为 llama-server 可接受的上下文长度数值。LFM2 分词器 BOS 逻辑修复同样位于llm/llama_server.go的tokenizerAddsBOS方法也进行了调整。此前代码在发现tokenizer.ggml.pre lfm2时会直接返回true。更新后这一提前返回逻辑被移除转而优先检查是否显式设置了tokenizer.ggml.add_bos_token新逻辑为ifkv.Has(tokenizer.ggml.add_bos_token){returnkv.Bool(tokenizer.ggml.add_bos_token)}returnkv.String(tokenizer.ggml.pre)lfm2对应注释明确说明在其他情况下显式的add_bos_token设置优先lfm2预分词器只会改变 llama.cpp 的默认行为如果 GGUF 明确设置了add_bos_token则以该显式设置为准同时Gemma4 的既有特殊处理逻辑仍然保留。注释说明llama.cpp 会在加载时强制为 Gemma4 开启add_bos即使某些 GGUF 的tokenizer.ggml.add_bos_token元数据明确为 false。因此本次调整的重点在于对于 LFM2 预分词器显式的 BOS 配置不再被默认判断覆盖。Metal unary 崩溃临时修复本次版本还新增了补丁文件llama/compat/002-metal-unary-cast-constexpr.patch该补丁针对 Metal unary 相关问题进行处理。补丁修改了ggml-metal/kernels/unary.metal中的函数定义将多个函数的inline constexpr改为inline涉及的函数包括通用转换函数templatetypenameT,typenameUinlineTggml_metal_unary_cast(U x){return(T)x;}以及在GGML_METAL_HAS_BF16条件下的 bfloat4 转换特化。原有的inlineconstexprbfloat4ggml_metal_unary_castbfloat4,float4(float4 x)改为inlinebfloat4ggml_metal_unary_castbfloat4,float4(float4 x)另一个 float 转 bfloat4 的特化也进行了同样调整。补丁内容表明这项修改用于处理 Metal unary 的崩溃问题。本次更新涉及的提交方向从提交内容可以归纳出 v0.40.13 的几个关键方向。第一LFM3 GGUF 修复与 llama-server speech 支持。这部分包含 LFM3 语音配置来源调整、llama-server 新增/tts调用、语音文本分块、token 计数、音频流式处理、PCM 格式校验以及 float32 PCM 到 PCM16 的转换。第二llama.cpp 版本升级。版本由 b11901 更新至 b11963为本次更新提供新的 llama.cpp 基础。第三命令行入口调整。直接运行ollama时改为显示帮助内容原有 welcome 相关文件被移除。第四Metal unary 崩溃规避。通过移除相关 Metal 函数的constexpr处理 unary 相关崩溃问题。第五llama-server 请求兼容性改进。包括repeat_last_n-1映射到上下文长度以及 LFM2 分词器在显式 BOS 配置下的行为调整。总结代码地址github.com/ollama/ollamaollama v0.40.13 的重点是将 LFM3 模型及其语音能力扩展至 Linux 与 Windows并继续支持 Apple silicon。围绕这一目标版本中新增了 llama-server 的 speech 实现通过/tts接口支持文本转语音流程。该实现覆盖了语音与语言选择、输入分块、token 计数、流式请求、服务状态检查、PCM 响应校验、float32 音频转换为 16 位 PCM以及异常处理。与此同时更新还完成了 llama.cpp 从 b11901 到 b11963 的升级修复了 LFM3 相关 GGUF 与 BOS 行为问题增加了repeat_last_n的 llama-server 兼容映射并针对 Metal unary 崩溃提供了补丁。在命令行体验上直接运行ollama不再进入原有欢迎与交互式流程而是显示命令帮助原有 welcome 相关实现和测试文件也随之删除。
企业数字化 ERP 产品动态
相关推荐
页面500报String.hashCode?真相:switch变量是null 页面500报String.hashCode?真相:switch变量是null
页面 500,控制台报错停在 String.hashCode——代码看着没毛病,switch 里的字符串也写得清清楚楚。真相是:那个字符串变量是 null。
原理:switch 对字符串做… · 2026/11/5 8:55:30
专其利 AI V3.4.0 更新说明 专其利 AI V3.4.0 升级说明
AI 对话,更懂你在写什么
输入框支持 快捷引用——直接关联当前专利、上传文件或图片,AI 自动理解上下文,无需反复粘贴内容图片直接上传:支持拖拽或粘贴图片,AI 自动识别图中技术内容并纳入… · 2026/11/6 18:45:54
电工证快速办理北京,真实经历告诉你学历不高也能报上名 电工证快速办理北京,真实经历告诉你学历不高也能报上名 你是不是也担心自己学历不高,考不了电工证?别急,我来跟你唠唠,我身边就有一个和你一样的人, 学历不高怕报不上名… · 2026/11/7 14:19:10
电工证考试vip题库值不值得考?别怕考不过白交培训费 电工证考试vip题库值不值得考?别怕考不过白交培训费 怕考不过白交培训费?很多电工同行都问过我,电工证考试vip题库值不值得考?尤其是像你这样的漯河劳务班组负责人,手里握着一堆项目,但证书没到手,项目就卡在审批环节。现在市场上特种作业证越来… · 2026/11/7 14:19:10
学校考电工证麻烦吗怎么报名怕考不过白交培训费 学校考电工证麻烦吗怎么报名怕考不过白交培训费 怕考不过白交培训费?这是很多想在学校考电工证的小伙伴最担心的事。其实,只要选对方法、掌握好报名流程,考试并不像你想象的那么难。本文就来帮你解决【学校考电工证麻烦吗】这个问题,手把手教你怎么报名,… · 2026/11/7 14:19:10
如何查电工证等级低证全国通用吗 电工证等级低怎么办?急需特种作业证才能上岗找工作,良心建议来了 你正为电工证等级低发愁?手上有个电工证却无法上岗?这事儿不少焦作房建工程从业者都碰过。别急,今天就给你一条 良心建议… · 2026/11/7 14:19:10
高配电工证样式怎么看?证书过期了不知道怎么复审延期?官方报名入口在这 高配电工证样式怎么看?证书过期了不知道怎么复审延期?官方报名入口在这 证书过期了不知道怎么复审延期?别慌,这期内容就帮你理清 高配电工证样式 到底长什么样,怎么辨别真假,以及最重要的——到期后该怎么通过 官方报名入口 进行复审延期。… · 2026/11/7 14:19:10
胶南电工证怎么考试 电工证全国通用怎么快速通过 胶南电工证怎么考试 电工证全国通用怎么快速通过 工地太忙根本没时间复习考试,这几乎是所有一线电工的真实写照。尤其是像胶南这种施工项目密集的地区,电工证的考试和年审都成了大家绕不开的话题。但你有没有想过,这张 全国通用… · 2026/11/7 14:18:09
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41
电工作业提示版通过率揭秘:怎么考才能一次过? 电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41
电工证年审报名千万别踩坑 外省证转过来要搞清这几点 电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23