Cherry Studio API Gateway 实战指南:从本地部署到多协议流式调用
Cherry Studio API Gateway 实战指南从本地部署到多协议流式调用【免费下载链接】cherry-studioAI productivity studio with smart chat, autonomous agents, and 300 assistants. Unified access to frontier LLMs项目地址: https://gitcode.com/GitHub_Trending/ch/cherry-studioCherry Studio 是一款支持 300 预配置助手与多 LLM 提供商的跨平台桌面客户端。它内置的 API GatewayAPI 网关把桌面端已配置的所有模型、知识库和 MCP 服务Model Context Protocol一种给 AI 挂载外部工具能力的协议暴露为本地 HTTP 接口同时兼容 OpenAI、Anthropic、Gemini 三种协议方言。如果你在自研应用里想复用本地已经配好的模型密钥或让 Claude Code、Cursor 等第三方工具直连这些模型这一篇会带你从启动网关到完成一次流式调用。快速上手获取并安装 Cherry Studio 桌面客户端Windows / macOS / Linux 均有发行版。如果是从源码运行git clone https://gitcode.com/GitHub_Trending/ch/cherry-studio corepack enable pnpm install pnpm dev在桌面端「设置 → 工具设置 → API Gateway」中打开开关。网关默认监听127.0.0.1:23333首次启动时自动生成cs-sk-前缀的 API Key设置页源码。配置认证头。网关按以下优先级读取凭证认证中间件x-api-key请求头Anthropic 风格优先Authorization: Bearer tokenOpenAI 风格x-goog-api-key或?key查询参数仅限 Gemini 路由验证网关已就绪以下两个端点无需认证curl http://127.0.0.1:23333/health # → { status: ok, timestamp: ..., version: ... } curl http://127.0.0.1:23333/openapi/json # → 完整的 OpenAPI JSON 规范完全本地生成可离线网关默认仅绑定回环地址loopback即 127.0.0.1局域网其他设备无法直接访问。如需 LAN 访问须在「设备连接」设置中显式开启此时监听地址才会切换为0.0.0.0。核心机制一次生成请求的完整链路定义在 请求引擎processMessage中共五步解析模型地址请求体里的model字段格式为providerId:modelId按第一个:切分例如anthropic:claude-sonnet-4-6。网关据此解析出目标提供商与模型stream字段决定是否走流式路径。协议转换MessageConverterFactory按路由方言openai/anthropic/gemini/openai-responses实例化对应转换器把输入消息转为 AI SDK 内部的UIMessage[]同时提取采样参数temperature、topP、maxOutputTokens等与客户端工具定义适配器源码。驱动模型调用AiStreamManager.streamPrompt()发起推理。网关在此身份是「对等、非持久化」的订阅者——与桌面端 UI 使用同一套流管理引擎但网关会话不落库、不广播状态AiStreamManager。协议回转输出侧StreamAdapterFactory把内部UIMessageChunk事件流转成调用方方言的 SSE 事件再经ISseFormatter序列化为text/event-stream字符串非流式请求则累积全部块后一次性返回 JSON。超时与中止客户端断连触发abort20 分钟无数据块的空闲超时会以失败504 或方言错误帧收场而不是静默截断。两个关键不变量值得注意。其一调用方拥有上下文网关会话标记为contextOwner: callerCherry Studio 不会替你截断工具结果或做摘要压缩多轮历史由你自己管理。其二助手无关assistant-agnostic网关不挂接任何内置助手采样参数、工具、推理选项全部按请求透传行为只取决于你发什么。接口速查方法路径协议方言用途GET/公开网关信息与端点清单GET/health公开健康检查GET/openapi、/openapi/json公开Scalar 文档页 / OpenAPI 规范GET/v1/models?offsetlimitOpenAI列出可用模型id 为providerId:modelIdPOST/v1/chat/completionsOpenAI聊天补全stream: true时返回 SSEPOST/v1/responsesOpenAI ResponsesOpenAI Responses 方言生成POST/v1/messagesAnthropicMessages 方言生成POST/v1/messages/count_tokensAnthropicToken 估算POST/v1beta/models/{providerId:modelId}:generateContentGeminiJSON 生成POST/v1beta/models/{providerId:modelId}:streamGenerateContent?altsseGeminiSSE 流式生成GET/v1/knowledge-basesCherry REST知识库列表POST/v1/knowledge-bases/searchCherry REST跨知识库语义检索GET/v1/mcps、/v1/mcps/:idCherry RESTMCP 服务器目录POST/v1/mcps/:id/mcpMCP Streamable HTTPMCP 代理initialize / tools/call 等 JSON-RPC 请求聊天补全OpenAI 方言必填项model、messages请求校验。其余字段宽松透传不会被网关拒绝。curl http://127.0.0.1:23333/v1/chat/completions \ -H Authorization: Bearer cs-sk-xxxx \ -H Content-Type: application/json \ -d { model: openai:gpt-4o, messages: [{role: user, content: Hello}], stream: false }响应OpenAI 标准结构{ id: chatcmpl-xxx, object: chat.completion, model: openai:gpt-4o, choices: [{ index: 0, message: {role: assistant, content: Hi! How can I help you?}, finish_reason: stop }], usage: {prompt_tokens: 12, completion_tokens: 9, total_tokens: 21} }模型列表curl http://127.0.0.1:23333/v1/models -H Authorization: Bearer cs-sk-xxxx{ object: list, data: [ {id: openai:gpt-4o, object: model, created: 1700000000, owned_by: OpenAI}, {id: anthropic:claude-sonnet-4-6, object: model, created: 1700000000, owned_by: Anthropic} ] }模型列表只包含「已启用提供商下的已启用模型」且做了网关 id 去重列表实现。调用前先查列表确认providerId:modelId拼写是排查 400 的第一步。实战场景场景一流式输出边生成边返回类似打字机效果OpenAI 官方 SDK 指向本地网关即可零代码改造import OpenAI from openai; const client new OpenAI({ baseURL: http://127.0.0.1:23333/v1, apiKey: cs-sk-xxxx }); const stream await client.chat.completions.create({ model: openai:gpt-4o, messages: [{ role: user, content: 用一句话解释 SSE }], stream: true }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ); }场景二多轮对话网关不替你维护上下文contextOwner: caller历史消息由客户端自行累积并随每次请求完整发送const history [{ role: user, content: 我叫小明 }]; function ask(question) { history.push({ role: user, content: question }); return fetch(http://127.0.0.1:23333/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer cs-sk-xxxx }, body: JSON.stringify({ model: deepseek:deepseek-chat, messages: history, stream: false }) }).then(r r.json()).then(d { history.push(d.choices[0].message); return d.choices[0].message.content; }); }场景三跨协议调用与知识库检索同一把 Key 可调用 Anthropic 方言x-api-key头优先curl http://127.0.0.1:23333/v1/messages \ -H x-api-key: cs-sk-xxxx -H Content-Type: application/json \ -d {model:anthropic:claude-sonnet-4-6,messages:[{role:user,content:Hi}]}对桌面端已建好的知识库做语义检索curl http://127.0.0.1:23333/v1/knowledge-bases/search \ -H Authorization: Bearer cs-sk-xxxx -H Content-Type: application/json \ -d {query:部署流程,knowledge_base_ids:[kb-id],document_count:5}错误响应按请求路径选信封错误处理/v1/messages返回 Anthropic 的{ type: error, error: {…} }/v1/chat、/v1/responses返回 OpenAI 的{ error: { message, type, code } }/v1beta返回 Google 的{ error: { code, message, status } }。客户端按自己使用的协议方言解析即可无需写分支。避坑指南现象401Unauthorized: missing credentials请求头缺少凭证。处理确认x-api-key、Authorization: Bearer、x-goog-api-key三者至少带一个。现象403Forbidden密钥不匹配或网关尚未生成 Key。处理到 API Gateway 设置页复制或重新生成Key 后重试注意 Key 变更需手动同步到所有客户端。现象400Invalid model format/not available through the API gatewaymodel未使用providerId:modelId格式提供商未启用或该模型不可路由Agent 专属提供商、外部 CLI 提供商不在网关服务范围内。处理先GET /v1/models拿合法 id 列表。现象流式请求中途断开且没有 HTTP 错误200 已提交后上游错误会转成对应方言的 SSE 终端错误帧而非改变状态码。处理流式客户端必须处理事件流中的 error 帧不能只看 HTTP 状态。现象50420 分钟无数据块的空闲超时。处理检查上游提供商状态长任务客户端侧做断点续查。现象局域网设备连不上网关默认仅回环可达。处理在「设备连接」页显式开启 LAN 暴露后监听地址才会切到0.0.0.0。进阶与扩展关键配置项偏好定义键默认值说明feature.api_gateway.enabledfalse启动时是否自动开启网关feature.api_gateway.host127.0.0.1设为0.0.0.0才允许 LAN 访问feature.api_gateway.port23333本地端口UI 限制 1000–65535feature.api_gateway.api_key自动生成首次激活生成cs-sk-uuid二次开发入口请求核心引擎模型解析、超时、提交屏障proxyStream.ts协议转换器与流适配器新增方言的落点adapters/认证中间件middleware/auth.ts错误信封与流式错误帧errors.ts知识库路由routes/knowledge.ts完整设计文档API Gateway Reference【免费下载链接】cherry-studioAI productivity studio with smart chat, autonomous agents, and 300 assistants. Unified access to frontier LLMs项目地址: https://gitcode.com/GitHub_Trending/ch/cherry-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

BLE低功耗设计-第8章第7题-多层PCB中旁路电容的最佳布局原则是什么

BLE低功耗设计-第8章第7题-多层PCB中旁路电容的最佳布局原则是什么

蓝牙面试题解析:多层 PCB 中旁路电容的最佳布局原则是什么? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、多层PCB | 高频:🔥🔥🔥 标准答案 多层 PCB 去耦布局原则:利用电源/地平面对形成低电感供电、电容紧贴引脚且过孔就近、关键区域分布多组电容、缩短电容-过孔-…

2026/10/18 4:16:28 阅读更多 →
QT智能家居项目实战:从设备抽象到串口通信的完整解析

QT智能家居项目实战:从设备抽象到串口通信的完整解析

简介:这份资源是基于QT框架的智能家居系统完整实现方案,面向具备一定C与网络编程基础、希望深入理解物联网控制架构的开发者与学习者。项目采用Web服务器加QT客户端的双端结构,服务器负责处理HTTP请求、用户认证与设备状态同步,并…

2026/10/18 4:16:28 阅读更多 →
BLE低功耗设计-第8章第10题-电源纹波如何影响蓝牙射频性能

BLE低功耗设计-第8章第10题-电源纹波如何影响蓝牙射频性能

蓝牙面试题解析:电源纹波如何影响蓝牙射频性能? 难度:⭐⭐⭐⭐ 较难 | 场景:社招二面/三面、纹波与射频 | 高频:🔥🔥🔥🔥 标准答案 电源纹波会通过调制到射频信号上产生杂散/相位噪声、干扰 PLL/VCO 本振稳定性、影响 PA 输出,从而恶化频率纯净度、增大调制误差…

2026/10/18 4:16:28 阅读更多 →

最新新闻

H5 Canvas 画布地图:不依赖 SDK 的 GeoJSON 编辑交互实现指南

H5 Canvas 画布地图:不依赖 SDK 的 GeoJSON 编辑交互实现指南

简介:面向需要构建交互式地图应用的开发者,这份rar压缩包整合了HTML5 Canvas与ECharts的地图可视化方案。核心思路是利用Canvas的fillRect、strokeRect、beginPath、moveTo、lineTo等API绘制地图基础轮廓,再借助ECharts地图系列加载GeoJSON数…

2026/10/18 9:15:26 阅读更多 →
知识图谱电影问答系统实战:Python+Neo4j+Cypher全链路解析

知识图谱电影问答系统实战:Python+Neo4j+Cypher全链路解析

简介:围绕知识图谱电影问答系统构建的Python毕业设计项目,面向计算机相关专业正在准备毕设或需要项目实战的学生,也可用于课程设计与期末大作业。项目经导师指导并获得99分评价,代码完整、依赖说明清晰,可顺利运行复现…

2026/10/18 9:15:26 阅读更多 →
谷物烘干机实用经验:选型、参数、排障与成本

谷物烘干机实用经验:选型、参数、排障与成本

说实话,第一次在田间地头看到“谷物烘干机”这几个字的时候,我脑子里想的还是那种老式的煤炉子热风塔。等到真正跟着一个烘干点的老板从收粮、进料、调火、测水、出粮走完一整轮,我才意识到这玩意儿早就不只是“把粮食烤干”那么简单了。它解…

2026/10/18 9:15:26 阅读更多 →
AI论文降重不求人:六个工具助力自然无标红改写

AI论文降重不求人:六个工具助力自然无标红改写

马上要交初稿了,结果一查重发现满屏标红,这种感觉我太懂了。论文降重这件事,很多人第一反应是找“AI论文网站”直接一键改写,但出来的东西要么语义变味,要么换个说法连自己都读不下去,最要命的是改完再一查…

2026/10/18 9:15:26 阅读更多 →
Kettle Web版部署与实战:把ETL搬到浏览器的完整指南

Kettle Web版部署与实战:把ETL搬到浏览器的完整指南

简介:Kettle(Pentaho Data Integration)的Web版,即webKettle,将桌面端Spoon设计器的ETL能力搬到浏览器中,面向需要在线完成数据抽取、转换与加载的数据工程师、运维及分布式团队。该压缩包集成了webKettle部…

2026/10/18 9:15:26 阅读更多 →
深度学习水果图像识别全流程:从数据准备到模型部署

深度学习水果图像识别全流程:从数据准备到模型部署

前阵子A同学来找我,说想做一篇和“基于深度学习的水果图像识别研究”相关的课题,问这个方向是不是太简单了。我当时跟他说,做之前你先想清楚一个问题:让模型区分苹果和橙子很容易,但让模型区分青苹果和青梨&#xff0c…

2026/10/18 9:14:26 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →