先运行 mox serve 或打开 App;公开 API 默认关闭,通过 App“本机 API”或 mox api enable 开启。mox api status 返回动态地址,mox api key 显示独立 Keychain 密钥。将地址(不带 /v1)填入 $MOX_API_URL,密钥填入 $MOX_API_KEY。客户端配置在服务重启后刷新;key 重置使旧 key 失效。
curl "$MOX_API_URL/v1/chat/completions" \
-H "Authorization: Bearer $MOX_API_KEY" -H 'Content-Type: application/json' \
-d '{"model":"my-model","messages":[{"role":"user","content":"你好"}],"max_tokens":64}'
curl "$MOX_API_URL/v1/messages" \
-H "x-api-key: $MOX_API_KEY" -H 'anthropic-version: 2023-06-01' \
-H 'Content-Type: application/json' \
-d '{"model":"my-model","messages":[{"role":"user","content":"你好"}],"max_tokens":64}'OpenAI SDK 的 base_url 使用 $MOX_API_URL/v1;Anthropic SDK base_url 使用 $MOX_API_URL,并传 api_key。只支持下述子集,不保证需要 Responses 等接口的任意 agent 可用。GET /v1/models 列出可请求的安装 alias;model 接受 alias 或安装 UUID,不是文件路径。公共 /health 只提供探活。
两个 listener 仅 127.0.0.1;公开 key 不可调用私有 /mox/v1/*,管理 token 不可作为公开 key。拒绝非空 Origin/浏览器跨站请求,无宽松 CORS。无 LAN、服务端工具执行或公共请求自动写 GUI 历史。
下列为 Mox 0.1 支持子集,不是声称两家 API 的完整实现。解析器对已知但不支持的语义字段和未知非空字段返回 400,指出安全的字段路径;不得用宽松 Decodable 静默丢弃。允许标准 SDK 会附带但不改变语义的空/默认字段,逐项列入 fixtures;不得以“忽略所有 extra”实现。请求 JSON 深度、字符串、工具数量与 schema 大小设命名上限,16 MiB body 上限在聚合前执行;输入仍受 Core 1 MiB 原文、8192 token、模型 context 与资源预算限制。精确值由所属模块单处定义,测试记录。
- 请求:
model为本服务已安装 alias 或精确安装标识;messages依原顺序接收system、user、assistant的文本字符串或纯文本块,以及assistant.tool_calls和tool的tool_call_id文本结果。developer、function旧角色、name、图片/音频/视频、refusal、未识别块拒绝。工具调用必须由紧邻的上一 assistant 轮次定义,ID 唯一,多个结果可用连续tool消息逐一匹配;未收齐前不得插入无关 user/assistant/system 消息,不能丢弃缺失/多余结果。服务不自动补历史。 - 接收
stream(默认 false)、temperature、top_p、max_tokens、stop(字符串或有限字符串数组)、tools(仅type:function的 name/description/JSON object parameters)、tool_choice的none/auto,stream_options.include_usage。n仅 1,parallel_tool_calls仅 false,response_format仅缺省或text;其他值拒绝。required、指定函数、strict schema、seed、logprobs、penalties、max_completion_tokens、prediction、modalities、audio、service_tier、store、metadata 等首版拒绝。缺省tool_choice:无工具为 none,有工具为 auto。none不得生成结构化工具调用;auto 仅在模型能力经验证时接受,否则 400unsupported_input。这里的工具选择限制是明确的 0.1 产品边界,后续若要支持强制选择须先证明运行时可执行该语义,不能只靠提示词伪装。 - 非流式成功:
chat.completion、稳定本次 ID、实际模型、单 choice 的 assistant(文本或tool_calls),finish_reason为stop/length/tool_calls,usage.prompt_tokens/completion_tokens/total_tokens来自已执行推理的真实计数。没有可证计数时失败,不填估算或零。无工具调用时tool_calls不出现或为 null,遵循 SDK 解码实测。 - 流式:
text/event-stream的data:ChatCompletionChunk;首块delta.role=assistant;文本 delta 保持 UTF-8 顺序;工具按index、稳定id、functionname起始,再发可拼接的function.argumentsJSON 字符串分片,末块 finish_reason;末尾data: [DONE]。include_usage=true时在 DONE 前发choices:[]的最终 usage chunk,先前 chunk usage 为 null/省略;false 时不承诺末尾 usage chunk。ID/model/created 在同一响应一致。工具参数只有通过完整 JSON 与 schema 基本校验后才可标 tool_calls 终态;不把尚未确认的模型文字伪装为已完成调用。部分流失败按下文错误处理。
- 必须要求
anthropic-version: 2023-06-01;x-api-key单独校验,anthropic-beta非空一律拒绝,避免虚假 beta 语义。model同上;max_tokens必填且为正。system接收字符串或纯文本块;messages按原顺序接收 user/assistant 的文本块,assistanttool_use(id/name/input JSON object),usertool_result(tool_use_id/纯文本/is_error)。不接收图片、文档、thinking、server tools、cache_control、citations 或其它内容块。多个 tool_result 必须在紧随调用的同一 user 消息中收齐,可与文本块混排;不得跨越无关轮次,保留块顺序与错误标志。 - 接收
stream、temperature、top_p、stop_sequences、tools(仅客户端自定义 name/description/input_schema JSON object)、tool_choice的auto/none。any、指定 tool、disable_parallel_tool_use为 true、fine-grained streaming、JSON/结构化输出、top_k、metadata、service_tier等拒绝;缺省有工具时 auto、否则 none。文本与工具可混合且多个 tool_use 块按生成顺序输出。无工具能力模型带工具请求明确拒绝。 - 非流式:
type:message、assistant role、有序content文本/tool_use 块、stop_reason为end_turn/max_tokens/stop_sequence/tool_use;usage.input_tokens/output_tokens为真实计数。没有缓存 token 时不伪造 cache 统计。stop_sequence返回实际命中的序列,否则 null。 - 流式:严格按
message_start→ 每块content_block_start、零或多个content_block_delta、content_block_stop→message_delta(最终 stop_reason 与累计 usage)→message_stop。文本用text_delta;工具输入用input_json_delta.partial_json,块开始携带 id/name 和空 input;各 index 稳定且拼接后是合法 JSON object。message_start.usage包含真实 input token,最终 message_delta 含真实累计 output token。可发 ping;不能把 OpenAI[DONE]发到 Anthropic 流。
- 参数在准入前解析并冻结;
stop/stop_sequences必须真正在生成边界生效,跨 token/Unicode 分片正确,命中序列不出现在用户文本;它与自然 EOS、长度耗尽、工具调用分别映射停止原因。模型特殊 token 或未知上游停止原因不得凭猜测映射为成功。取消不返回伪造的stop/end_turn,客户端主动断连则取消并等待后端及 lease 释放;若连接仍在,使用协议错误终止流。 - 错误在 headers 前给协议 JSON:OpenAI
error:{message,type,param,code},Anthropictype:error,error:{type,message},request_id。分类:400 格式/不支持,401 凭据,404 模型,409 状态冲突,413 大小,429 队列,503 不可用,500 意外错误;资源不足用稳定resource_exhaustedcode 并取 503。认证检查早于模型信息泄露。SSE headers 后失败发相应协议的error事件/错误 data 并关闭,绝不再写第二个 HTTP 响应、成功终态或 DONE;SDK 可能将其解释为异常或流中断,测试必须核对。request ID 可用于脱敏诊断关联。 - 每请求有服务拥有的 task、单个 Core GenerationHandle 和唯一终态;真实 HTTP 写入 await 背压,写入超时/断连取消并等待;客户端长时间不读须有有界队列与期限,不能让 GPU 或内存无限积压。正常结束 flush/end;服务关闭 drain 所有在途任务。公共请求默认不记录正文、参数、工具输入/结果、API key、Authorization、敏感 URL。日志只留协议、阶段、时长、稳定错误码、request/model 安全标识和计数。失败路径能在 GUI 诊断中定位。
- 对未读完 body 就能拒绝的请求,先写有界协议错误并关闭连接,不等待客户端继续上传;GET 带 body 明确拒绝。已鉴权的请求体读取有绝对期限,空闲 HTTP/1 连接也有限期;超过 16 MiB 的声明长度和聚合中超限都释放连接配额。用未终止 chunked 真 socket 测试 401/403/413、连接关闭及后续正常请求。
工具必须由客户端执行,再显式带完整历史和相同调用 ID 请求下一轮。Mox 不执行函数、文件或网络工具。支持 auto/none,不提供 required/any 或指定函数强制调用;未知语义明确拒绝。
当前经验证的工具产物为受管 mlx-community/Qwen3-0.6B-4bit,HF revision 73e3e38d981303bc594367cd910ea6eb48349da8,还必须匹配权重与 tokenizer 摘要。仅 model_type、模型卡或导入目录不能获得能力。参数在官方 parser 完整解析、验证后由协议层分片;不是模型未完成的参数直接透传。
官方 SDK 验证入口及固定版本见 DEVELOPMENT,实际运行范围见 VALIDATION。