资讯动态

Cherry Studio API 设计解析:桌面端 RESTful 接口规范是如何落地的

发布时间:2026/10/26 1:24:27 来源:尧图企业网站定制
Cherry Studio API 设计解析桌面端 RESTful 接口规范是如何落地的【免费下载链接】cherry-studio Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端项目地址: https://gitcode.com/CherryHQ/cherry-studioCherry Studio 是一款支持多个 LLM 提供商的桌面客户端。要讲清它的 API 设计与 RESTful 接口规范得先认清一个约束它不跑 HTTP 服务服务器就是本机的 Electron 主进程。桌面客户端如何把知识库、文件、MCP模型上下文协议让 AI 调用外部工具的协议这类本地能力安全地暴露给渲染进程是它的接口架构要回答的核心问题。桌面端接口架构一次调用的完整链路渲染进程只持有 UI任何碰磁盘、进程、外部服务的请求都要跨进程边界进入主进程。图中分工清晰useChat() 发出消息经 Electron IPC transport 进入主进程由补全服务处理结果流分块回推最后由消息服务落 SQLite。更关键的是项目在同一套 IPC进程间通信传输上维护着两条独立的 API 通道维度DataApiIpcApi范式REST资源导向RPC能力导向寻址方式/knowledge-bases 加 HTTP 方法knowledge.search 式点分路由副作用禁止仅 SQLite 读写窗口、文件系统、进程、外部服务错误形态HTTP 状态码字符串错误码DataApi 只碰 SQLite 里的持久化业务数据形态保证未来能换一台真远程服务器IpcApi 绑定本地主进程永不远程。两条通道的路由表分别在 shared/data/api/schemas/ 与 shared/ipc/schemas/主进程侧实现在 src/main/ipc/ 与 src/main/data/。接口契约三要素路径、方法、状态码DataApi 的 URL 规则写在 schema 文件里集合用复数名词加 kebab-case层级用嵌套CRUD 路径不带动词。/knowledge-bases/:id/items 是标准形态POST /getTopics 不允许存在路径参数本身含 / 时用贪婪参数 :id*整张路由表仍受类型检查。方法与默认状态码由服务端推断handler 不用写方法幂等默认状态码语义边界GET是200纯读可重试可缓存POST否201创建接受异步任务时返回 202PUT是200整体替换PATCH是200部分更新带动效的操作应走专属端点DELETE是204无体返回数据时降为 200错误处理是码 状态两层契约每个错误码固定一个 HTTP 状态能否自动重试一次声明错误码HTTP 状态自动重试NOT_FOUND404否VALIDATION_ERROR422否CONCURRENT_MODIFICATION409否RESOURCE_LOCKED423是SERVICE_UNAVAILABLE / TIMEOUT503 / 504是可重试错误只在白名单内渲染层按 isRetryable 标志决定是否重试而不是猜状态码。核心接口拆解五组场景怎么跑应用管理链路自检的入口app.get_info 一次返回版本、打包状态与 logsPath 等真实目录路径配合 app.cache_cleanup.inspect/run 两段式清缓存、app.relaunch 重启。这组路由不碰数据库是接入前的链路自检探针。知识库读写分离是主线场景是建一次库、高频检索。读走 DataApiGET /knowledge-bases 支持 cursor limit上限 100GET /knowledge-bases/:id/items 列文档PATCH /knowledge-bases/:id/order 调排序建库、检索、重建走 IpcApi如 knowledge.searchknowledge.search: defineRoute({ input: z.strictObject({ baseId: z.string().trim().min(1), query: z.string().trim().min(1).max(1000) }), output: z.array(KnowledgeSearchResultSchema) })检索是运行时计算而非持久化读取不进 DataApi——进了会被自动重试与缓存毫无意义。文件只读 SQL 视图加独立 FS 通道GET /files/entries 一族端点是纯 SQL、固定响应形状游标分页ref-counts 批量聚合一次上限 500 个 id。碰真实文件系统的操作stat、绝对路径解析、写文件全部走独立的 file IPC 通道——这个切分保证 DataApi 的重试与缓存不触发副作用。MCP删服务器为什么走 RPC/mcp-servers 增改查走 DataApiGET 支持 id/isActive/type 过滤PATCH 整体重排顺序。删除刻意不上 DataApi——移除服务器要同时杀掉运行时 stdio 进程这是副作用所以走 mcp.server.remove由主进程统一清进程、删行。工具调用进度经 mcp.tool.call_progress 事件推回渲染层。记忆三种机制各走各的通道Cherry Studio 的记忆不是单一 API而是三种并行机制Agent 文件记忆SOUL.md 等四个文件按 Agent 隔离Agent 用文件工具自主读写、知识库Assistant 与 Agent 共用、MCP 记忆内置 cherry/memory 服务器知识图谱形态。接口层不发明记忆协议每种机制各走既有通道没有新传输。统一信封请求、响应、错误共用一套形状DataApi 的请求信封是扁平对象桌面链路里的头由 id 与 metadata 承担export interface DataRequest { id: string // 请求 ID响应回显 method: HttpMethod // GET | POST | PUT | PATCH | DELETE path: string // 如 /knowledge-bases params?: Recordstring, any body?: unknown headers?: Recordstring, string metadata?: { timestamp: number; spanContext?: unknown } }响应与之对称id 回显请求 IDstatus 是 HTTP 状态data 与 error 取其一metadata 带时间戳与缓存信息。错误是序列化结构而非抛出的堆栈——堆栈不过 IPC靠主进程日志{ code: NOT_FOUND, message: Topic with id abc123 not found, status: 404, details: { resource: Topic, id: abc123 }, requestContext: { requestId: req_1, path: /topics/abc123, method: GET } }两处细节VALIDATION_ERROR 的 details.fieldErrors 是字段→消息数组映射前端可直接定位报错位置IpcApi 则返回 { ok, data } / { ok: false, error } 而非 rejected Promise——Electron 的 invoke 在 reject 时只保留 messagecode 与 details 会丢所以这条通道永不 reject。认证与安全防护信任边界在进程不在 Token桌面应用没有用户体系认证转译为信任源校验。IpcApi 单入口有两道门来源校验——只信顶层 framewebview 内容直接拒绝生产环境 frame URL 必须是应用包内的 file: 路径一份能摸到 ipcRenderer 的下载 HTML 过不去输入校验——渲染到主进程的入参全部先经 zod parse主到渲染的事件是纯类型、不做运行时校验因为事件由主进程自己构造校验换不来安全。handler 看到的调用方身份只有 IpcContext.senderId 窗口 ID由主进程从真实 sender 推导禁止从 input 携带——否则渲染层可伪造窗口 ID 操作别的窗口。DTO 是第二道防线写入体由实体 schema 白名单 .pick() 派生z.strictObject 拒绝多余字段mass assignment 在边界被挡。这里没有 Bearer Token 与 RBAC权限模型退化为通道收窄路由表里声明的路由才存在服务不能随手注册新通道。稳定性工程分页、版本策略与可观测分页提供 offsetpage limit与 cursorcursor limit两种知识库与文件列表都走 cursor——keyset 保证并发插入不错行不丢行。过滤用字段直名排序用 sortBy sortOrder批量上限显式ref-counts 500 个 id。字段选择不靠 fields 参数靠固定形状 独立通道派生数据各有专属端点。版本不进 /v1 路径进 schema 层路由表是 TS 类型编译器强制schema 声明的每个路由必须有 handler增删路由是可见的类型变更错误码是稳定字符串契约前端按 code 等值分支不按 message 文本。可观测复用请求信封metadata.spanContext 携带 OpenTelemetry 上下文AI 调用在 topic 的 traceId 下生成 span 树chat.turn 为根日志本地 JSONL 投影、不远程上报。跨窗口一致性走 contenteditable="false">【免费下载链接】cherry-studio Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端项目地址: https://gitcode.com/CherryHQ/cherry-studio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑