← Discover MCPs and Agents
L
MCPAI & MLGitHub

LLM-Proxy

OpenAI-compatible local HTTP proxy for Claude Code, OpenCode, Kimi CLI, and extensible AI CLIs

Links

README

From the repo.

LLM Proxy

把已经登录、已经配置好模型的本地 AI CLI,转换为统一的 OpenAI-compatible HTTP 服务。

Python FastAPI uv

LLM Proxy 面向这样一种本地场景:Claude Code、OpenCode、Kimi CLI 等工具已经能够正常调用模型,但调用者拿不到、也不应该接触 CLI 内部的账号凭据或模型密钥。LLM Proxy 不读取这些密钥,而是调用现有 CLI 的非交互命令,把结果转换成统一的 HTTP/JSON/SSE 响应。

[!IMPORTANT] 本项目默认监听 0.0.0.0,同一网络及公网客户端可在防火墙和路由允许时连接。服务已经提供有界 CLI 并发、有限队列、请求体/提示词/输出上限和 MCP Host/Origin 防护,但不内置 TLS、多用户 RBAC 或按租户计费限流;公网部署前必须阅读“生产运行边界”和“安全边界”。

详细设计与协议边界见 生产架构与演进方案OpenAI API 兼容性说明本地 Agent 接入指南

为什么需要它

  • 复用 Claude Code、OpenCode、Kimi CLI 等工具已有的登录状态和模型资源。
  • 给脚本、应用和 OpenAI SDK 提供统一的调用方式。
  • 通过逻辑 Session ID 隔离不同用户、任务和调用方的上下文。
  • 调用方既可以只发送本轮增量,也可以每次发送完整消息历史。
  • 在网页中配置、探测、测试新的 CLI,而不是为每个工具重新开发一套网关。
  • 不向普通 API 调用方暴露管理 token、CLI 环境变量或内部模型凭据。

功能概览

  • OpenAI-compatible GET /v1/modelsPOST /v1/chat/completions
  • 普通 JSON 与 OpenAI SSE 传输,支持 stream_options.include_usage;内容增量粒度取决于 CLI
  • 官方 MCP Streamable HTTP /mcp/,可直接接入 OpenCode
  • MCP 工具:列举 CLI、发现模型、委派任务、关闭 MCP 逻辑会话
  • Claude Code、OpenCode、Kimi CLI 内置适配器
  • 通用 JSONL / 纯文本 CLI 在线配置
  • Adapter Manifest JSON 无密钥导入/导出;导入后默认禁用
  • 网页端真实对话测试、停止生成和多轮续接
  • CLI 模型自动发现、静态候选和手动模型 ID 回退
  • autoincrementalstateless 三种上下文模式
  • 逻辑 Session ID 到 CLI 原生 Session ID 的隔离映射
  • 完整消息历史的前缀指纹比较,只转发新增后缀
  • 上下文分叉检测与上游 Session 自动轮换
  • 同一 Session 的请求串行执行,避免上下文交错
  • 全局容量、每 CLI 容量、有限等待队列和明确的 429 Retry-After
  • Idempotency-Key 防止网络重试造成重复模型调用
  • CLI 探测、版本检查、真实连接测试、会话和请求日志管理
  • 超时、取消和子进程组清理
  • Windows 使用 taskkill /T /F 清理 CLI 子进程树
  • 管理端 token 与调用端 API key 分离
  • 子进程使用 argv 调用,不经过 shell
  • 可选 stdin 提示词传输,避免提示词出现在进程命令行

工作方式

flowchart LR
    Client["应用 / OpenAI SDK"] -->|"Chat Completions"| API["协议与鉴权网关"]
    OpenCode["OpenCode"] -->|"MCP /mcp"| API
    Browser["本地管理台"] -->|"Admin API"| API
    API --> Session["会话、幂等与容量调度"]
    Session --> DB[("SQLite 元数据")]
    Session --> Queue["全局 / 每 CLI 有界队列"]
    Queue --> Adapter["CLI Adapter Runtime"]
    Adapter -->|"argv + stdin/stdout"| CLI["Claude Code / OpenCode / Kimi / 自定义 CLI"]
    CLI --> Model["CLI 已配置的模型服务"]

一次请求的关键路径如下:

  1. API key 校验并解析 OpenAI-compatible 请求。
  2. 根据 model 选择 CLI 适配器。
  3. 根据逻辑 Session ID 判断新建、续接、分叉或无状态调用。
  4. 进入全局与适配器容量队列;过载时快速返回 429。
  5. 将本轮新增内容转换为 CLI argv 或 stdin。
  6. 启动本地 CLI 子进程并解析文本或 JSONL 事件。
  7. 转换为普通 JSON 或 SSE 响应,同时更新会话元数据。

内置适配器

适配器调用方式Session 策略模型发现
Claude Codeclaude -p --output-format stream-json代理生成 UUID,通过 --session-id / --resume 续接CLI 没有稳定的非交互枚举命令,提供官方别名候选并标注为未验证
OpenCodeopencode run --format json从 JSONL 捕获 sessionID,通过 --session 续接执行本机 opencode models,显示当前配置实际枚举结果
Kimi CLIkimi -p --output-format stream-json从输出捕获 Session,通过 --session 续接提供官方模型 ID 候选;也可按安装版本配置发现命令

Claude Code 默认附加 --tools "",避免把普通 LLM HTTP 请求自动升级成具有文件和命令执行能力的 Agent 请求。需要工具能力时,应建立单独适配器、独立工作目录和更严格的访问策略。

环境要求

  • Python 3.11+
  • uv
  • 至少一个已经完成登录或模型配置的 AI CLI
  • 已记录的真实验证环境与结果见 真实端到端测试报告;其他 CLI/版本上线前仍需在目标机器验收

Kimi CLI 未安装时不会影响服务启动,只会在管理台显示“命令未找到”。

快速开始

Windows:双击启动

克隆或下载项目后,直接双击根目录的 start.bat。脚本会检查 uv、根据 uv.lock 自动准备环境、启动服务,并在约两秒后打开管理台。

start.bat

服务默认监听所有网络接口(0.0.0.0:8787),本机管理台地址为 http://127.0.0.1:8787,其他设备使用 http://<运行服务的电脑 IP>:8787。可以预先设置 LLM_PROXY_HOSTLLM_PROXY_PORT 等环境变量;若不希望自动打开浏览器,可设置 LLM_PROXY_OPEN_BROWSER=0

命令行启动

git clone https://github.com/Carlehyy/LLM-Proxy.git
cd LLM-Proxy
uv sync --dev
uv run llm-proxy serve

首次启动会在 data/credentials.json 生成强随机的管理 token 和 API key,并在终端显示一次。凭据文件权限会设置为 0600

# 再次查看本地凭据
uv run llm-proxy credentials

# 探测所有已配置 CLI
uv run llm-proxy doctor

打开 http://127.0.0.1:8787,输入管理 token 即可进入管理台。

网页管理台

管理台包含以下功能:

  • 运行总览、CLI 探测状态和请求统计
  • 对话测试、SSE 流式输出与停止生成
  • CLI、模型、上下文模式和 Session ID 选择
  • 自动模型发现与手动刷新
  • 新建、编辑、启用和禁用适配器
  • 真实模型连接测试
  • 逻辑会话查看、分叉和删除
  • 请求结果、耗时和错误记录

网页对话使用管理 token 调用本地管理接口,不会把普通调用端 API key 暴露给浏览器页面。

Adapter Manifest 导出会清除所有环境变量值,只记录需要补齐的变量名;导入在一个数据库事务内执行,默认采用“跳过冲突”并禁用新配置。管理员检查命令、工作目录和环境变量后再手动启用,避免导入文件立即执行未知命令。

OpenCode MCP 接入

管理台“接入指南”会根据当前访问地址生成可复制配置。OpenCode 使用官方远程 MCP 配置形态:

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "llm-proxy": {
      "type": "remote",
      "url": "http://127.0.0.1:8787/mcp/",
      "enabled": true,
      "headers": {
        "Authorization": "Bearer lp_xxx"
      },
      "timeout": 30000
    }
  }
}

提供四个刻意收敛权限的工具:

工具用途
list_clis查看已托管 CLI、检测状态、能力与并发容量
list_cli_models读取指定 CLI 的真实模型列表或静态候选
delegate_to_cli把文本任务委派给 CLI,并可用返回的 Session ID 续接
close_cli_session删除 MCP 创建的逻辑 Session 映射

MCP 不提供新增、编辑或删除适配器的工具,避免 OpenCode 中的模型自行修改本机可执行命令。通过 HTTP 暴露 MCP 时必须配置 LLM_PROXY_MCP_ALLOWED_HOSTS;默认只接受 localhost Host,防止 DNS rebinding。

HTTP API

鉴权

用途Header
普通模型调用Authorization: Bearer <api-key>
管理接口X-Admin-Token: <admin-token>

不要把管理 token 分发给普通调用方。管理 token 可以修改本机要执行的命令,其权限高于 API key。

查看适配器

/v1/models 返回的是可调用的适配器 ID。model 直接指定适配器;如需在不支持 extra_body 的标准客户端中指定 CLI 内部模型,使用 适配器ID::CLI模型ID

curl http://127.0.0.1:8787/v1/models \
  -H 'Authorization: Bearer lp_xxx'

以下两种调用等价;第一种是推荐的标准 OpenAI 形态,第二种保留向后兼容:

{
  "model": "opencode::opencode/deepseek-v4-flash-free",
  "messages": [
    {"role": "user", "content": "只回复:你好"}
  ]
}
{
  "model": "opencode",
  "cli_model": "opencode/deepseek-v4-flash-free",
  "messages": [{"role": "user", "content": "只回复:你好"}]
}

新会话

不传 Session ID 时,每个请求都会创建新的逻辑会话。响应头 X-LLM-Proxy-Session-ID 和响应体 llm_proxy.session_id 会返回生成的 ID。

curl http://127.0.0.1:8787/v1/chat/completions \
  -H 'Authorization: Bearer lp_xxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "claude-code",
    "messages": [{"role":"user","content":"只回复:你好"}]
  }'

持续会话:只发送本轮增量

相同 Session ID 默认恢复同一个 CLI 原生会话。

curl http://127.0.0.1:8787/v1/chat/completions \
  -H 'Authorization: Bearer lp_xxx' \
  -H 'X-LLM-Proxy-Session-ID: user-42' \
  -H 'Idempotency-Key: turn-0002' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "opencode",
    "context_mode": "incremental",
    "messages": [{"role":"user","content":"基于上一轮,再补充一个例子"}]
  }'

session_id 也可以放在 JSON body 中。推荐使用 Header,以兼容不允许附加 body 字段的 OpenAI SDK。

调用方每次发送完整上下文

保持默认的 context_mode: "auto"。代理比较消息 SHA-256 指纹,如果本次 messages 以上一轮为前缀,只向 CLI 转发新增后缀。

标准的完整历史可以直接发送:

[
  {"role": "user", "content": "记住编号 A-17"},
  {"role": "assistant", "content": "已记住"},
  {"role": "user", "content": "编号是什么?"}
]

如果历史被编辑或出现分叉,逻辑 Session ID 保持不变,但代理会创建新的 CLI 上游 Session;llm_proxy.session_action 返回 reset-divergedgeneration 加一。

无状态调用

设置 context_mode: "stateless" 后,每次请求都会创建独立的 CLI 调用,不恢复上游 Session。请求中的全部消息都会被转换并转发,Session ID 仅用于日志关联和幂等缓存。

SSE 流式响应

curl -N http://127.0.0.1:8787/v1/chat/completions \
  -H 'Authorization: Bearer lp_xxx' \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "opencode",
    "stream": true,
    "messages": [{"role":"user","content":"写一句问候"}]
  }'

最终 SSE 事件的 llm_proxy 字段包含 Session 动作、generation、上游模型和耗时。

设置 "stream_options": {"include_usage": true} 后,结束块之后会增加一个 choices: [] 的 usage chunk,再发送 [DONE]。同一条流的 idcreatedmodel 保持不变;容量准入失败会在流开始前返回 HTTP 429。

这里的“流式”分为两层:LLM Proxy 的 HTTP 响应使用标准 SSE 并会及时转发 CLI 已产生的文本事件,但是否能逐 token/逐小段显示取决于上游 CLI 的事件粒度。真实测试中,OpenCode 1.18.12 的 opencode run --format json 每轮只产生一个最终 text 事件,因此客户端会先建立 SSE 连接,在模型完成后一次收到正文;这仍是协议兼容的 SSE,但不能称为逐 token 流式。详见 OpenAI API 兼容性说明

Python OpenAI SDK

from openai import OpenAI

client = OpenAI(
    base_url="http://127.0.0.1:8787/v1",
    api_key="lp_xxx",
)

response = client.chat.completions.create(
    model="opencode",
    messages=[{"role": "user", "content": "解释 CAP 定理"}],
    extra_headers={
        "X-LLM-Proxy-Session-ID": "course-7-user-42",
        "Idempotency-Key": "turn-1",
    },
    extra_body={
        "context_mode": "auto",
        "cli_model": "opencode/deepseek-v4-flash-free",
    },
)

print(response.choices[0].message.content)

接入本地 Agent

只使用文本 Chat Completions、允许配置 OpenAI Base URL 和手工模型 ID 的 Agent,可以直接把本服务作为模型后端。依赖原生 function calling、Responses API、结构化输出、多模态或 Embeddings 的 Agent 当前不能无感接入。

推荐的通用配置为:

OPENAI_BASE_URL=http://127.0.0.1:8787/v1
OPENAI_API_KEY=<LLM Proxy API Key>
MODEL=opencode::provider/model

外层 Agent 已经管理完整对话历史时,建议使用 context_mode=stateless;需要复用 CLI 原生会话时,再为每个 Agent Thread 固定 X-LLM-Proxy-Session-ID。详细能力矩阵、Session 策略、超时和“Agent 套 Agent”边界见 本地 Agent 接入指南

会话语义

场景代理行为
不传 Session ID创建新逻辑会话并返回 ID
已有 Session + 单条 user 消息恢复同一 CLI Session,只发送本轮增量
已有 Session + 完整历史比较消息指纹,只发送新增后缀
完整历史发生改写或分叉轮换上游 Session,generation + 1
同一 Session 并发调用服务端串行化,避免上下文交错
相同幂等键重试返回已完成结果,不再次调用 CLI
同 Session 更换适配器、模型或工作目录返回 409;应新建或 fork Session

逻辑会话会固定绑定首次调用时的适配器、cli_model 和工作目录。网页端在切换这些参数时会创建新的 Session,避免污染已有上下文和模型缓存。

SQLite 只保存消息指纹、最近回复预览、运行状态和请求统计,不保存完整用户消息。CLI 自身仍可能按原生机制保存完整历史,这是实现原生 Session 恢复所需要的行为。

模型发现

模型选择采用适配器级发现协议:

  1. 如果配置了 model_list_args,服务通过安全 argv 执行只读模型列表命令。
  2. model_list_format: "lines" 表示每行一个模型 ID。
  3. model_list_format: "json" 表示 JSON 数组,可用 model_list_json_path 指向嵌套数组。
  4. 无法非交互枚举时,可以配置 static_models
  5. 静态候选会明确标注为“未经当前账号验证”,不会伪装成真实探测结果。
  6. 网页始终允许手动输入模型 ID。

管理端发现接口:

POST /api/admin/adapters/{adapter_id}/models
X-Admin-Token: <admin-token>

新增 CLI 适配器

对于支持非交互调用、文本或 JSONL 输出的 CLI,通常不需要修改 Python 代码。

在管理台选择“适配器 → 新建适配器”,配置:

  1. command:单个可执行文件名或绝对路径。
  2. initial_args:首次调用 argv 模板。
  3. resume_args:恢复会话 argv 模板。
  4. session_strategyprovidedcapturednone
  5. output_mode:通用 JSONL、纯文本或内置专用协议。
  6. model_arg:例如 --model
  7. 模型发现 argv、输出格式和静态候选。
  8. 环境变量、工作目录、超时和 JSONL 解析路径。

可用 argv 模板变量:

变量含义
{prompt}本次转换后的输入文本
{upstream_session_id}CLI 原生 Session ID
{session_id}{upstream_session_id} 的别名
{model}cli_model 或适配器默认模型

示例配置:

{
  "id": "my-cli",
  "name": "My CLI",
  "command": "my-ai-cli",
  "initial_args": [
    "ask",
    "--json",
    "--session",
    "{upstream_session_id}",
    "{prompt}"
  ],
  "resume_args": [
    "ask",
    "--json",
    "--resume",
    "{upstream_session_id}",
    "{prompt}"
  ],
  "session_strategy": "provided",
  "output_mode": "generic-jsonl",
  "model_arg": "--model",
  "model_list_args": ["models"],
  "model_list_format": "lines",
  "parser_config": {
    "session_paths": ["session.id"],
    "delta_paths": ["event.delta"],
    "final_paths": ["result.text"]
  },
  "prompt_transport": "argv",
  "delta_mode": "snapshot",
  "max_concurrency": 2,
  "queue_timeout_seconds": 30
}

保存后建议依次执行:

  1. “探测”:验证命令是否存在并读取版本。
  2. “刷新模型”:验证模型发现协议。
  3. “真实测试”:创建隔离 Session 并实际调用模型。
  4. “对话测试”:验证同一逻辑 Session 的多轮恢复。

兼容性边界

CLI 类型支持情况
非交互 + 纯文本可配置接入;通常使用无状态或代理提供的 Session ID
非交互 + JSONL可配置接入;支持通用点路径解析
支持 resume/session flag可实现原生多轮持续会话
模型列表为逐行或 JSON 数组可自动发现
仅支持交互式 TUI需要 CLI 自己提供非交互模式或增加包装程序
ACP、私有二进制或特殊事件协议需要新增专用协议驱动,但无需重写 HTTP 和会话层

环境变量

项目不会主动读取 .env。可由 shell、进程管理器或 uv run --env-file .env ... 注入。

变量默认值说明
LLM_PROXY_HOST0.0.0.0HTTP 监听地址;默认允许从其他网络设备连接
LLM_PROXY_PORT8787HTTP 端口
LLM_PROXY_DATA_DIR./dataSQLite、凭据和隔离工作目录
LLM_PROXY_REQUEST_TIMEOUT300默认 CLI 请求超时,单位秒
LLM_PROXY_MAX_CONCURRENT_REQUESTS8全局同时执行的 CLI 子进程上限
LLM_PROXY_MAX_QUEUE_SIZE200CLI 等待队列上限
LLM_PROXY_QUEUE_TIMEOUT30默认容量等待时间,超时返回 429
LLM_PROXY_MAX_PROMPT_CHARS200000转换后 Prompt 字符上限
LLM_PROXY_MAX_OUTPUT_CHARS2000000单次 CLI 输出字符上限
LLM_PROXY_MAX_REQUEST_BODY_BYTES4194304HTTP/MCP 请求体字节上限
LLM_PROXY_HTTP_LIMIT_CONCURRENCY512Uvicorn 并发请求上限
LLM_PROXY_HTTP_BACKLOG2048TCP accept backlog
LLM_PROXY_GRACEFUL_SHUTDOWN_TIMEOUT30优雅退出等待秒数
LLM_PROXY_IDEMPOTENCY_TTL_HOURS24幂等响应保留小时数
LLM_PROXY_REQUEST_LOG_RETENTION_DAYS30请求统计保留天数
LLM_PROXY_ALLOW_CLIENT_WORKSPACE0是否允许 API 调用方指定工作目录
LLM_PROXY_WORKSPACE_ROOTSdata/workspace允许的工作目录根,逗号分隔
LLM_PROXY_MCP_ENABLED1是否启用 /mcp
LLM_PROXY_MCP_ALLOWED_HOSTS仅 localhostMCP Host allowlist,逗号分隔
LLM_PROXY_MCP_ALLOWED_ORIGINSMCP Origin allowlist,逗号分隔
LLM_PROXY_ADMIN_TOKEN自动生成管理台与管理 API token
LLM_PROXY_API_KEY自动生成普通 /v1 API key

如果只设置两个凭据变量中的一个,另一个仍会从本地凭据文件读取或生成。生产化运行时建议同时显式配置二者。

生产运行边界

当前版本是单进程、单机 Runner。内存中的 Session 锁和容量队列保证同一进程内的正确性,因此不要直接使用多个 Uvicorn worker;内置 llm-proxy serve 已按单 worker 启动。SQLite 使用 WAL、外键、busy timeout 和定期数据清理,适合个人电脑或一台专用 Runner。

默认可以接住 100+ 同时到达的 HTTP/MCP 请求,但不会同时启动 100 个 CLI:HTTP 上限默认 512,等待队列 200,实际执行全局上限 8、每个 Adapter 默认 2。应根据真实 CLI 的 RSS、CPU、上游并发限制和账号条款调优。若目标是 100+ 同时执行中的 CLI、多机器或多租户,需要控制面、PostgreSQL、Redis/持久任务流和带 Session 租约的 Runner agent;不能用“共享 SQLite + 多 worker”替代。

部署、容量公式、故障处理和多 Runner 目标设计见 生产架构与演进方案

安全边界

  • 默认绑定 0.0.0.0。这只表示监听所有网卡;公网能否访问仍取决于操作系统防火墙、云安全组、路由和端口映射。
  • 直接暴露公网有较高风险。应在前置网关增加 TLS、独立身份认证、IP 限制和速率限制;仅需本机访问时设置 LLM_PROXY_HOST=127.0.0.1
  • 管理 token 可以修改本机执行命令,必须与普通 API key 分开保管。
  • 自定义适配器环境变量以明文保存在本机 SQLite;管理 API 返回时会遮罩。
  • 优先复用 CLI 自己的登录状态,避免在适配器环境变量中保存模型密钥。
  • 子进程不经过 shell,可降低参数层面的 shell 注入风险,但远程 prompt 仍会影响 Agent 行为。
  • 为具有文件、网络或命令工具能力的 CLI 设置独立工作目录和操作系统权限。
  • 删除逻辑 Session 不会删除 CLI 在用户目录中保存的原生会话历史。
  • 当前没有内置按用户/租户的公网级限流、多用户 RBAC、集中审计或 TLS 终止。

开发与测试

uv sync --dev
uv run ruff check .
uv run ruff format --check .
uv run pytest
uv build

测试使用独立 fake CLI,不依赖真实模型资源,覆盖:

  • 新会话与增量续接
  • 完整上下文去重与分叉重置
  • Session 隔离与同 Session 串行化
  • 幂等请求缓存
  • 普通 JSON 与 SSE
  • 官方 OpenAI Python SDK 普通与流式契约
  • stream_options.include_usage 与稳定 chunk 元数据
  • 官方 MCP Client 的内存和 Streamable HTTP 契约
  • 100 请求容量调度、队列满与排队超时
  • 超时、错误和进程清理
  • 管理端鉴权与适配器 CRUD
  • 无密钥 Adapter Manifest 导入/导出
  • 请求体、Prompt、输出与工作目录边界
  • CLI 探测与模型发现
  • 网页对话使用的管理端流式接口

真实 CLI 的模型调用可能产生额度消耗,因此不会放入自动化测试套件,可在管理台按需执行。

仓库另保留一份不含凭据的 DeepSeek + OpenCode 真实端到端测试报告,覆盖 OpenAI SDK 长对话、远程 MCP 工具委派、管理台 SSE 和真实容量排队。它是一次指定环境的验收记录,不替代每个发布版本和目标机器的门禁测试。

项目结构

.
├── src/llm_proxy/
│   ├── api.py          # HTTP、鉴权、OpenAI-compatible 与管理 API
│   ├── mcp_server.py   # 官方 MCP Streamable HTTP 与委派工具
│   ├── service.py      # 会话差分、分叉、幂等和请求生命周期
│   ├── scheduler.py    # 全局 / 每 CLI 有界容量与公平调度
│   ├── runtime.py      # CLI 子进程、事件解析和模型发现
│   ├── database.py     # SQLite schema、迁移和内置适配器
│   ├── schemas.py      # Pydantic 请求与适配器模型
│   ├── config.py       # 环境变量与本地凭据
│   ├── cli.py          # serve / credentials / doctor
│   └── static/         # 原生 HTML、CSS、JavaScript 管理台
├── docs/               # 生产架构和 OpenAI 兼容矩阵
├── tests/              # fake CLI 与自动化测试
├── .env.example
├── pyproject.toml
└── uv.lock

设计来源与致谢

本项目的产品方向和部分架构思路参考了 iOfficeAI/AionUi

  • 已安装 CLI 的自动探测
  • 自定义 command + args + env
  • 在线连接测试
  • CLI/ACP 会话持久化
  • 统一 Agent 注册与能力呈现

LLM Proxy 没有复制 AionUi 源码。它针对“本地 CLI → OpenAI-compatible HTTP 网关”这一目标,使用 Python、FastAPI、SQLite 和原生 Web 技术重新实现。AionUi 原项目采用 Apache License 2.0

协议和参数行为同时参考:

当前限制与后续方向

  • 当前只实现 Chat Completions 文本子集,不提供 Responses、工具调用、多模态、Embeddings 等接口。
  • 单机只允许一个应用进程;多 Runner 需要 PostgreSQL、分布式锁/租约和持久任务事件流。
  • 当前只有一个普通 API key 和一个 Admin token,没有用户、租户、RBAC 与租户配额。
  • Adapter 配置尚未版本化;修改 Adapter 会影响同 ID 的后续 Session 调用。
  • 尚未提供 Prometheus 指标、结构化集中审计、TLS 终止和机密管理服务集成。
  • ACP、私有二进制或特殊事件协议仍需专用协议驱动。

免责声明

本项目与 Anthropic、OpenCode、Moonshot AI、iOfficeAI 无隶属或官方合作关系。使用本项目调用第三方 CLI 和模型服务时,仍需遵守对应产品的许可、账号政策、配额和服务条款。

Collected info

  • 1 stars
  • Language: Python
  • Source updated: 8/4/2026

Config for your environment

Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.

Tool

OS

Config file: ~/.cursor/mcp.json

{
  "mcpServers": {
    "mcp-server": {
      "url": "{MCP_ENDPOINT_URL}"
    }
  }
}

Paste into mcpServers in the config file. Restart Cursor after saving.

If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.