moonpalace
Moonshot 官方 Kimi API 本地调试代理工具,一行命令启动即可透视所有请求细节
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Moonshot 官方 Kimi API 本地调试代理工具,一行命令启动即可透视所有请求细节
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
凌晨两点,你正在调试一个基于 Kimi 大模型的 AI 应用。代码跑起来了,API 返回了,但输出的内容却莫名其妙——模型突然开始重复同一个词,或者干脆在长对话的中间"失忆"了。你怀疑是 Prompt 的问题,也怀疑是模型的问题,但无论如何都找不到证据。传统的 API 调试方式只能看到最终结果,无法捕获网络层的细节,更无法追踪模型在生成过程中的"思维轨迹"。
这时,你需要的是一面透视镜:一个能看清每个 HTTP 请求从发出到返回全过程的工具。这就是 MoonPalace(月宫)存在的意义。
MoonPalace 由月之暗面(Moonshot AI) 官方开发并维护,是专门为 Kimi API 打造的可视化调试代理工具。月之暗面是国内头部大模型创业公司,旗下 Kimi 智能助手以长上下文窗口(128K tokens)著称,在代码生成、长文分析等场景中表现突出。2024年7月,随着 Kimi API 开放给开发者使用,MoonPalace 作为配套调试工具同步开源。
从定位上看,MoonPalace 不是通用型 API 调试工具(如 Postman、Apifox),而是垂直于 Moonshot API 的专项工具。它深度集成了 Kimi 特有的请求/响应头(如 Msh-Request-Id、Msh-Gid),能够精准捕获模型层面的异常信号,这是通用工具无法做到的。
MoonPalace 的工作原理非常巧妙:它在你本地启动一个 HTTP 代理服务器(默认端口 9988),将所有发往 http://127.0.0.1:9988/v1 的请求透明转发到 Kimi 官方 API https://api.moonshot.cn。在这个转发过程中,MoonPalace 干了三件关键的事:
第一,完整日志捕获。 每次请求的 Headers、Body、Token 消耗(prompt_tokens、completion_tokens、total_tokens)都会被格式化输出到终端,颜色高亮、层次分明。如果遇到网络错误,MoonPalace 还会保存"事故现场"的原始数据,帮助开发者定位是客户端问题还是服务端问题。
第二,请求持久化存储。 所有经过 MoonPalace 的请求都会存入本地 SQLite 数据库(~/.moonpalace/moonpalace.sqlite)。开发者可以随时通过 moonpalace list 查询历史请求,用 moonpalace inspect 查看单次请求的完整细节,用 moonpalace export 导出 BadCase 数据结构化上报给 Moonshot AI 官方,帮助改进 Kimi 模型。这形成了一个本地调试→问题定位→模型反馈→模型优化的完整闭环。
第三,智能去重检测。 大模型在生成长文本时极易陷入"复读机"模式——不断重复相同的 token 或句子。MoonPalace 提供了 --detect-repeat 参数,基于编辑距离算法检测重复内容,阈值可配(默认0.5),低于阈值的生成会被拦截并警告,帮助开发者在本地就发现模型退化问题。
除了基础调试能力,MoonPalace 还提供了两个进阶功能:
--force-stream 参数很有意思。Kimi API 支持流式(stream=True)和非流式(stream=False)两种调用方式。默认情况下,如果选用非流式,客户端需要一直保持与 Kimi 服务器的连接直到生成完毕。如果网络不稳定,连接中途断开,客户端就会得到一个 Connection Error,用户体验很差。--force-stream 的作用是:将所有非流式请求在 MoonPalace 这一层强制转换为流式请求,由 MoonPalace 先与 Kimi 服务器建立稳定连接接收流式数据,组装成完整响应后再返回给客户端。客户端代码完全不用改,但稳定性大幅提升。
--auto-cache 参数则对接了 Kimi 的语义缓存(Semantic Cache) API。Kimi 会对语义相似的请求返回缓存结果,节省 token 消耗。通过 MoonPalace 的自动缓存功能,开发者可以实时监控哪些请求命中了缓存、节省了多少 tokens,这对优化 API 调用成本非常有价值。
从代码结构来看,MoonPalace 采用了非常务实的架构:
核心由一个 proxy.go 驱动(26896字节),包含 HTTP 服务器、请求转发、日志格式化三大模块。代理逻辑基于 Go 标准库 net/http 实现,使用 bufio 逐行读取流式响应并实时输出。依赖中使用了 github.com/tidwall/gjson 做 JSON 路径查询、github.com/tidwall/sjson 做 JSON 修改,这两个库在大模型输出解析场景中非常高效。
命令行入口采用 spf13/cobra,与 start、list、inspect、export、cleanup 五个子命令组成完整功能矩阵。配置加载使用 gopkg.in/yaml.v3 解析 ~/.moonpalace/config.yaml,支持端口、API Key、去重参数、流式策略、缓存策略的全方位配置。
持久化层使用 mattn/go-sqlite3,请求数据存储在 SQLite 中,文件 persistence.go(19637字节)包含了完整的建表、插入、查询逻辑。此外,项目还使用了代码生成工具 defc(通过 //go:generate 指令)来生成 API 客户端代码(caching.gen.go、persistence.gen.go),这是一个相对小众但高效的 Go 代码生成工具,用于减少手写重复的 HTTP 客户端代码。
项目支持构建标签(build tags)切换不同的 API 端点:endpoint.go 指向官方 api.moonshot.cn,endpoint_sg.go 和 endpoint_custom.go 则分别指向 SiliconCloud 和自定义端点,通过 //go:build 条件编译实现多端点支持。
MoonPalace 的安装方式对开发者极度友好:
方式一(推荐):一行命令搞定。
go install github.com/MoonshotAI/moonpalace@latest
前提是本机安装了 Go >= 1.22 工具链。安装后,moonpalace 命令直接可用。
方式二:下载预编译二进制。 GitHub Releases 页面提供了 Linux、macOS(Intel/Apple Silicon)、Windows 的预编译二进制,下载后赋予执行权限即可使用,无需安装 Go 环境。
两种方式安装后,启动调试只需一行命令:
moonpalace start --port 9988 --key sk-xxxxx
输出 base_url = http://127.0.0.1:9988/v1,用户只需在代码中替换这个地址即可。
MoonPalace 不需要 GPU,不需要容器,没有任何外部依赖——一个零门槛的本地工具。但这同时也意味着它没有 Web 界面,无法在浏览器中查看请求历史,所有交互都通过命令行完成。对于习惯 GUI 的用户有一定学习成本。
MoonPalace 并非完美。首先,它只支持 Kimi API,无法用于调试其他大模型 API(如 OpenAI、Anthropic 等),通用性受限。其次,CLI-only 的交互方式对于非技术用户不够友好,缺乏图形化界面带来的直观性。再次,日志输出到 stderr 的设计虽然便于重定向到文件,但如果不主动重定向,日志在长时间运行时可能丢失。
从架构层面看,MoonPalace 是一个轻量级代理工具,而非完整的 API 管理平台。它没有请求重放(replay)、环境切换(dev/staging/prod)等功能,如果你需要这些能力,仍然需要 Postman 或 Apifox。
MoonPalace 的出现,反映了大模型 API 调试领域的一个趋势:通用调试工具不够用了。大模型 API 有其特殊性——流式输出、Token 计数、语义缓存、重复检测——这些能力在传统 HTTP 调试工具中要么缺失,要么需要大量手动配置。垂直化的 API 调试工具正在成为大模型开发生态中的标准配件。
此外,MoonPalace 内置的 BadCase 导出功能非常有价值:开发者发现 Kimi 模型的问题后,可以直接通过工具导出结构化数据反馈给 Moonshot 官方,形成用户驱动的模型迭代飞轮。这种"调试工具即反馈渠道"的思路,值得其他大模型厂商借鉴。