MCPcopy Index your code
hub / github.com/LeenHawk/gproxy

github.com/LeenHawk/gproxy @v2.0.11

Chat with this repo
repository ↗ · DeepWiki ↗ · release v2.0.11 ↗ · + Follow
5,868 symbols 14,604 edges 939 files 1,108 documented · 19%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

GPROXY

单个 Rust 二进制的高性能、多供应商 LLM 代理 —— 内嵌 React 控制台、多租户鉴权, 同一套引擎可原生 / Docker / 边缘(WebAssembly) 三种形态运行。

English · 简体中文

  • 🪪 许可证: AGPL-3.0-or-later · 🐳 镜像: ghcr.io/leenhawk/gproxy
  • 🦀 构建目标: 原生二进制 · Docker · 边缘 wasm(Cloudflare / Deno / Netlify / Supabase / EdgeOne / Appwrite)
  • 🖥️ 控制台: 内置,路径 /console

它做什么

GPROXY 在众多上游 LLM 供应商之上,暴露统一的 OpenAI / Anthropic / Gemini 兼容 HTTP 接口,并补齐把它当共享服务运行所需的一切:

  • 多供应商路由 —— OpenAI、Anthropic、Gemini/Vertex、DeepSeek、Groq、OpenRouter、 NVIDIA、Vercel AI Gateway、Claude Code、Codex,以及任意 OpenAI 兼容自定义端点。
  • 两种路由模式 —— 聚合 /v1/...(供应商写在模型名里)与限定 /{provider}/v1/... (供应商写在 URL 里)。
  • 跨协议转换 —— OpenAI 客户端可打 Claude 上游(反之亦然);同方言走极简解析快路径。
  • 多租户鉴权 —— 用户、API key、glob 模型权限、RPM/RPD/token 限速、USD 配额; Claude 提示缓存、改写规则、熔断。
  • 可插拔存储 —— SQLite / PostgreSQL / MySQL,可选静态加密。
  • 内置控制台 —— 无需单独部署前端。

部署

🐳 一键(Docker,推荐)

完全自包含:内嵌控制台、文件式 SQLite、无需外部服务。

Deploy to Koyeb Deploy to Render

docker run -p 8787:8787 -e GPROXY_ADMIN_PASSWORD=change-me-min12char ghcr.io/leenhawk/gproxy
# 然后打开 http://localhost:8787/console (admin / change-me-min12char)

管理员密码至少 12 个字符 —— 过短容器启动即以 GPROXY_ADMIN_PASSWORD rejected 报错退出。

用非 localhost 地址(局域网 IP、服务器 IP、隧道)经明文 HTTP 访问控制台? 会话 cookie 默认带 Secure,浏览器会把它丢弃,于是即使密码正确,控制台登录后也会立刻弹回登录页。加上 -e GPROXY_INSECURE_COOKIES=1,或在前面挂 HTTPS 反代。http://localhost:8787 则直接可用。

☁️ Serverless 边缘(WebAssembly)

同一套路由可作为 wasm 边缘函数跑在六个平台上。预构建、即点即部署的产物在 deploy 分支(平台侧没有 cargo, 无需工具链)。边缘函数需要外部 Turso 控制面库(+ 可选 Upstash 缓存);完整步骤见 docs/edge-deploy.md

Deploy to Cloudflare Deploy to Netlify

Cloudflare 和 Netlify 按钮会在部署前要求填写必需的 TURSO_URLTURSO_TOKEN secrets。这里要填 Turso 的 HTTP URL(https://<db>.turso.io), 不要填 libsql:// URL。可选的 Upstash cache 和 GPROXY_MASTER_KEY secrets 可以在 worker/site 创建后再补。Cloudflare Workers、Netlify Edge、Deno Deploy 和 EdgeOne Pages 会在同一个部署里带上 Console 静态资产。设置 GPROXY_ADMIN_USER 和 至少 12 个字符的 GPROXY_ADMIN_PASSWORD,部署后打开 /console

平台 产物 部署
Cloudflare Workers deploy/cloudflare 一键按钮 ☝️ / wrangler deploy
Netlify Edge deploy/netlify 一键按钮 ☝️ / netlify deploy --prod
Deno Deploy deploy/deno/build.sh(CLI)
Supabase Edge deploy/supabase supabase functions deploy gproxy(Docker/eszip,CLI)
EdgeOne Pages deploy/eopages edgeone pages deploy(CLI)
Appwrite Functions deploy/appwrite-deno appwrite push functions(deno-2.0,CLI)

📦 原生二进制

每个 release 都提供预编译二进制 (linux/macOS/windows,x86_64 + aarch64)。或自行 cargo build --release


配置

GPROXY 用环境变量配置;运行期配置进数据库,通过 /console 管理。

变量 默认 用途
GPROXY_HOST / GPROXY_PORT 127.0.0.1 / 8787 监听地址
GPROXY_PERSISTENCE file file(GPROXY_DATA_DIR 下的 SQLite)或 db
GPROXY_DSN persistence=db 时的 DSN(Postgres/MySQL/SQLite)
GPROXY_MASTER_KEY 解封存储的密文(缺省=明文)
GPROXY_ADMIN_USER / GPROXY_ADMIN_PASSWORD admin / 随机 首启动管理员

从 v1 升级? 把 v2 二进制指向你现有的 v1 SQLite 库,首启动会就地迁移(旧库备份为 *.v1.bak)。


第一个请求

# 聚合 —— 供应商/模型写在 body 里
curl http://127.0.0.1:8787/v1/chat/completions \
  -H "Authorization: Bearer <your-key>" -H "Content-Type: application/json" \
  -d '{"model":"openai-main/gpt-4.1-mini","messages":[{"role":"user","content":"Hello"}]}'

运维端点(/healthz/version/metrics)走 admin 鉴权。

文档

许可证

AGPL-3.0-or-later · 作者:LeenHawk

Extension points exported contracts — how you extend this code

ChannelStreamDecoder (Interface)
A per-channel byte-stream decoder spliced BEFORE the M2 protocol transform. Used by envelope/binary channels (code-assis [5 …
src/channel/mod.rs
UpstreamClient (Interface)
(no doc) [21 implementers]
src/http/client/mod.rs
CacheBackend (Interface)
(no doc) [5 implementers]
src/store/cache/mod.rs
SecretCipher (Interface)
Object-safe cipher for stored secrets. [2 implementers]
src/crypto/mod.rs
ErrorBody (Interface)
Matches the backend's `{"error":{"message","type"}}` envelope.
console/src/api/http.ts
TokenizerStore (Interface)
(no doc) [2 implementers]
crates/gproxy-tokenize/src/tokenize/registry.rs
EmbeddingInputExt (Interface)
(no doc) [1 implementers]
crates/gproxy-transform/src/transform/embeddings/common/mod.rs
Channel (Interface)
(no doc) [21 implementers]
src/channel/mod.rs

Core symbols most depended-on inside this repo

get
called by 483
src/channel/registry.rs
arg_integer
called by 269
src/store/libsql/mod.rs
push
called by 204
src/pipeline/settle/mod.rs
col_i64
called by 130
src/store/persistence/libsql/row.rs
arg_text
called by 121
src/store/libsql/mod.rs
as_str
called by 99
src/usage/mod.rs
cn
called by 95
console/src/lib/utils.ts
api
called by 95
console/src/api/http.ts

Shape

Function 3,574
Method 963
Class 818
Enum 366
Interface 147

Languages

Rust88%
TypeScript11%
Python1%

Modules by API surface

src/store/persistence/libsql/mod.rs104 symbols
src/store/persistence/file/impl_backend.rs100 symbols
src/store/persistence/db/impl_backend.rs100 symbols
crates/gproxy-protocol/src/protocol/openai/generate_content/response_items.rs51 symbols
crates/gproxy-transform/src/transform/generate_content/stream_to_response/openai_responses.rs40 symbols
crates/gproxy-protocol/src/protocol/openai/generate_content/response_tools.rs38 symbols
src/pipeline/tests/mod.rs33 symbols
src/channel/bulletins/codex/auth.rs33 symbols
crates/gproxy-protocol/src/protocol/claude/common/tools/defs.rs33 symbols
src/channel/bulletins/kiro/mod.rs32 symbols
crates/gproxy-protocol/src/protocol/gemini/batch/mod.rs32 symbols
crates/gproxy-transform/src/transform/stream_adapter.rs31 symbols

Datastores touched

gproxyDatabase · 1 repos
(mysql)Database · 1 repos
gproxyDatabase · 1 repos
dbDatabase · 1 repos

For agents

$ claude mcp add gproxy \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact