---
title: posthog2api
canonical_url: "https://www.modelscope.ai/studios/moyang303/posthog2api"
md_url: "https://www.modelscope.ai/studios/moyang303/posthog2api.md"
repository: moyang303/posthog2api
chinese_name: PostHog2Api
last_updated: 2026-10-02
sdk_type: docker
downloads: 0
stars: 0
---

# posthog2api

> posthog2api - An interactive demo by moyang303 on ModelScope. PostHog OAuth LLM gateway with Modal registration bridge

moyang303/posthog2api is an interactive demo (Studio) on ModelScope. built with docker. also known as 「PostHog2Api」.

- **Repository**: moyang303/posthog2api
- **SDK**: docker
- **Downloads**: 0
- **Stars**: 0
- **Last updated**: 2026-10-02

Source: https://www.modelscope.ai/studios/moyang303/posthog2api

---

# PostHog2Api

PostHog2Api 把自己账号可用的 PostHog LLM Gateway 模型暴露为 OpenAI Chat Completions、OpenAI Responses 和 Anthropic Messages 接口。它是一个 Go 单二进制程序，内嵌中文管理页面，支持多个 PostHog OAuth 账号、固定账号持续使用及有限故障切换。

账号选择默认 `until_failure`：持续使用同一个账号，额度耗尽或上游错误（包括 502）后切换并保持下一个账号；客户端主动取消、断开连接不算账号失败。当前账号持久化保存，重启后继续使用。0.6.1 首次启动会将旧配置切换到此策略，之后可在设置中选择 `round_robin`（轮询）或 `highest_balance`（最高余额优先）。仅这两种旧策略执行剩余额度恰好 `$120.00` 自动停用，固定账号策略不执行，也不会自动重新启用已停用账号。

模型、权限、额度和计费都由 PostHog 提供和控制。本项目不会接入独立的 OpenAI、Anthropic 或其他供应商 Key。

## 快速开始

要求 Go 1.25.1 或更高版本。前端源码构建要求 Node.js 22.12 或更高版本。

```powershell
go build -o posthog2api.exe ./cmd/posthog2api
./posthog2api.exe serve
```

打开 <http://127.0.0.1:8787>，进入“账号管理”，填写账号名称和区域，然后完成 OAuth 授权。授权成功后程序根据官方返回的 `scoped_teams` / `scoped_organizations` 自动发现项目：保留仍可访问的原项目，否则选择当前组织的第一个项目，再回退到授权范围内的第一个项目。账号编辑提供项目下拉列表，切换项目后刷新模型和余额。

项目发现失败会保留已授权账号并显示原因，可点击“重新检查”重试，无需再次输入授权码。旧版窄权限账号需先重新授权。

OAuth scope 与 PostHog Desktop v8 保持一致，包括 `project:read`、`organization:read`、`user:read` 和 `llm_gateway:read`。从 0.1 升级的账号会显示“OAuth 权限需更新”，点击“重新授权”即可保留原本地账号 ID 并刷新权限。已有 refresh token 无法自行获得新增 scope。

账号管理还提供“导入账号 JSON”。它接受一个包含 `region`、正整数 `project_id`、`access_token`、`refresh_token` 和 `expires_at` 的账号对象；同一账号 ID，或同一区域、OAuth 身份和项目，会更新原条目而不是重复加入轮询。导入响应只返回脱敏账号视图，Token 不进入推理请求记录。启用的账号在保存后自动刷新项目、模型和额度，部分刷新失败会作为 `warnings` 返回，凭据本身仍保留。

也可以通过本地管理接口导入。下面只使用占位符，不要把真实 Token 写入脚本仓库：

```text
POST /api/admin/accounts/import
Content-Type: application/json

{
  "id": "acct_optional_local_id",
  "name": "工作账号",
  "region": "us",
  "project_id": 123,
  "scoped_teams": [123],
  "scoped_organizations": ["organization-id"],
  "oauth_scope_version": 8,
  "access_token": "REPLACE_WITH_ACCESS_TOKEN",
  "refresh_token": "REPLACE_WITH_REFRESH_TOKEN",
  "expires_at": "2030-01-01T00:00:00Z",
  "enabled": true,
  "status": "available"
}
```

默认状态目录为系统用户配置目录下的 `PostHog2Api`。可使用环境变量或参数指定其他目录：

```powershell
$env:POSTHOG2API_DATA_DIR = 'D:\posthog2api-data'
$env:POSTHOG2API_ADMIN_PASSWORD = '请设置独立管理密码'
./posthog2api.exe serve
```

设置 `POSTHOG2API_ADMIN_PASSWORD` 后，网页和 `/api/admin/*` 必须先完成密码登录。登录使用 24 小时 HttpOnly 会话 Cookie；服务重启会注销现有会话。该密码不替代客户端模型 API Key。

Windows 上账号状态文件使用当前用户的 DPAPI 加密；Linux/macOS 上使用权限为 `0600` 的本地文件。

## Modal Sandbox 注册任务

“注册任务”页面支持两种方式，均通过 Go 后端内嵌的 Python / Modal SDK 接入：

- **浏览器版（默认）**：`posthog-auto-sandbox`，Camoufox 完成注册、邮箱验证和登录后，由 HTTP 子进程完成绑卡、限额、OAuth 和上传；支持 Microsoft 邮箱池或 Gmail/Emailnator，保留原参数、环境测试和历史任务兼容。
- **浏览器注册 + HTTP 后处理**（`method=protocol`）：仍使用 `posthog-protocol-sandbox` / `posthog-protocol-data`，同一套混合流程部署在独立应用上；支持 Microsoft 或 Gmail/Emailnator，每 2 秒查询邮件、最多 120 秒；本页完整流程固定绑卡、并发 1。失败不自动换邮箱或 IP 重试，支付结果不明确时停止等待核查。

两种方式均支持任务状态、增量日志、停止和显式续跑；应用和 Volume 按任务保存的方式分别读取。提交后不能修改方式或邮箱服务。

部署端新增两个环境变量即可连接账号：

```text
MODAL_TOKEN_ID=ak-你的ModalTokenID
MODAL_TOKEN_SECRET=as-你的ModalTokenSecret
```

使用拥有注册应用的工作区 Token（目前为 `moyang303406`）。Docker 已安装 Python 和 Modal SDK。
无需 HTTP 控制 API 地址、target ID 或命令密钥；注册邮箱、卡信息与上传地址继续放在 Modal
的 `posthog-auto-config` Secret。新后端只读取该既有 Secret，并额外使用 `posthog-protocol-config` 保存加密密钥和服务器登录配置，当前上传目标为 `https://p.moyang1.top`。更换域名时需同步调整对应执行器，不能只更改网页配置；不要覆盖原 `posthog-auto-sandbox` 应用。

根目录 `.env.example` 提供环境变量模板。完整部署、操作和排错说明见
[docs/REGISTRATION_SANDBOX.md](docs/REGISTRATION_SANDBOX.md)；双方式接入说明见 [docs/PROTOCOL_REGISTRATION.md](docs/PROTOCOL_REGISTRATION.md)。

当前 Docker 入口保留 Cloudflare Tunnel，需要已有的 `CLOUDFLARE_TUNNEL_TOKEN`，监听
`0.0.0.0:7860`，状态目录为 `/mnt/workspace`，请挂载持久化存储。管理入口沿用当前项目的访问方式。

从 0.4 起，每次已读取正文的推理请求会保存客户端原始正文和实际发送给 PostHog 的正文（包括协议转换和参数适配后的结果）。401 刷新重发、账号切换分别记录，附带账号 ID、目标接口、协议和 HTTP 状态。不会保存 Authorization、Cookie、本地 API Key 等请求头。正文可能包含用户自行传入的敏感内容，按原文保存，不应把凭据放在消息正文中。

在“请求记录 → 诊断详情 → 读取请求正文”查看。摘要保存在数据目录的 `requests.jsonl`；正文单独保存到 `request-bodies/*.json`，列表不会加载大正文。默认随最近 10,000 条记录留存，可在设置中调整保留条数。超出保留窗口的正文自动清理。旧记录无法补回正文，未读取请求体的鉴权/并发拒绝不会产生正文日志。正文在请求结束时落盘，中途退出的请求不能保证留存；超大或读取失败的请求体不保留不完整正文。

## 客户端接入

启动时会生成独立的本地 API Key，可在“设置”页面查看或修改。

OpenAI Chat Completions：

```bash
curl http://127.0.0.1:8787/v1/chat/completions \
  -H "Authorization: Bearer ph2_your_local_key" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "从 /v1/models 选择",
    "messages": [{"role": "user", "content": "你好"}],
    "stream": false
  }'
```

Anthropic Messages：

```bash
curl http://127.0.0.1:8787/v1/messages \
  -H "x-api-key: ph2_your_local_key" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "从 /v1/models 选择",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "你好"}],
    "stream": false
  }'
```

“余额与额度”页面直接显示 PostHog `/v1/usage/posthog_code` 返回的已使用金额、额度上限、剩余金额、日/月使用百分比、账期结束时间和高级模型计费状态。

“账号管理”和“余额与额度”按页读取本地缓存（默认每页 20 个，可选 10/20/50/100），支持按名称、邮箱、账号 ID、项目 ID 搜索，以及按“已启用 / 已停用 / 需处理”筛选；“需处理”指已启用但状态不是可用或需要重新授权的账号。余额页的“刷新本页上游”只逐个刷新当前页账号；服务端另会每分钟检查一次，自动刷新超过 10 分钟的已启用账号缓存。

`GET /v1/models` 返回所有已启用账号可用模型的去重并集。一个请求携带完整对话历史时可以在账号间轮询；同模型的 Responses `reasoning.encrypted_content` 已验证可以跨已授权 PostHog 账号原样续接。跨协议转换后的思考（例如 Claude Code 用 GPT、Codex 用 Claude、Chat 客户端用 GPT）同样保留并可在同一区域的任意账号续接；中途换模型时，其他模型产生的转换思考会被自动移除（正文和工具调用保留），并记入请求记录，不再返回 400。若请求使用与账号绑定的文件 ID、item reference 或服务端响应 ID，必须固定账号：

```text
X-PostHog2Api-Account: acct_xxx
```

指定账号后，本次请求不会切换到其他账号。

## 多账号调度

默认固定账号策略跨模型和协议共用一个当前账号；成功请求不轮换，账号繁忙时返回并发限制，不分流到其他账号。默认单账号最多 2 个并发，全局最多 8 个并发。手动停用、凭据失效、额度耗尽或不支持所需模型/区域的账号不可选。显式绑定账号仍禁止本次请求跨账号。

推理和 count_tokens 在输出开始前遇到上游 HTTP 错误（含 502、429、额度不足）、网络错误或上游超时，会在请求总时限内换号，一次请求最多尝试 3 个不同账号。切换后的账号用于后续请求；客户端本地格式错误不触发切号。网络错误及部分 5xx 可能发生在上游已处理请求之后，因此自动重发存在重复生成或计费风险。

客户端主动取消或断开连接不重试、不冷却账号、不切号；聊天记录标记为 `499` / `canceled`。已经开始输出的流不重放；真正的上游流错误只影响后续账号选择。旧轮询/最高余额策略保留原有限故障切换范围，不因普通网络错误或 5xx 自动重放。

## 协议行为

### 转换引擎选择

在“设置 → 调度容量 → 协议转换引擎”选择：

- **原有转换（默认）**：保留项目现有转换行为；旧状态文件升级后仍使用它。
- **New API · RelayKit**：直接使用 [new-api RelayKit v0.2.1](https://github.com/QuantumNous/new-api/tree/relaykit/v0.2.1/relaykit)，支持 Chat Completions、Responses、Messages 三种格式的全部六个跨协议方向，包括请求、非流式 JSON 和增量 SSE。不是另起一个 New API 服务，也不是失败后自动回退到原引擎。

设置字段为 `protocol_conversion`，值为 `builtin` 或 `newapi`；通过现有 `PUT /api/admin/settings` 提交完整设置。保存立即影响新请求，无需重启；已开始的请求、账号切换和流式输出固定使用开始时选定的引擎。同格式继续原生转发，不经过 RelayKit；模型参数适配、鉴权和账号调度仍由本项目负责。请求记录的诊断详情显示选定引擎，New API 的转换器及损耗诊断写入 `compatibility_rules`。

New API 模式仍将 GPT 路由到 Responses，Claude 路由保持模型目录规则；Responses 客户端还可转换到仅支持 Chat 的上游。思考续接用本项目封装保存原始供应商项目，HTTPS 图片保持 URL、不由转换器下载。供应商专属功能并不保证等价；不能安全映射的工具按 RelayKit safe 策略报错。切换引擎时，已有对话的专属推理历史可能不兼容。具体差异和验证见 [协议兼容说明](docs/PROTOCOL_COMPATIBILITY.md)。

### 传输与原有转换行为

流式请求使用独立的首响应超时，默认 360 秒；非流式响应头超时默认 120 秒。PostHog 官方网关自身的流式初始化时限是 300 秒。固定账号策略在首响应超时且总请求时限尚未结束时换号；无法继续尝试时返回 HTTP 504。旧轮询/最高余额策略不重放超时请求。

Claude Opus 4.7/4.8、Claude Opus/Sonnet/Fable 5 系列使用供应商默认采样，网关移除 `temperature`、`top_p`、`top_k` 并记录原因。到 PostHog 的长流式连接固定使用 HTTP/1.1，避免已观察到的 HTTP/2 提前 EOF。

PostHog Desktop 对 OpenAI 系列模型实际使用 `/{product}/v1/responses`，因此本服务把 Chat/Messages 请求转换为 Responses，再把文本、工具、思考、停止状态和真实 usage 转回客户端格式。原有转换将 `reasoning_effort` 映射为 `reasoning.effort` 与 `reasoning.summary: "auto"`，保留续接签名；New API 模式使用 RelayKit 的字段映射并由本项目补充不透明续接元数据。本服务同时公开 `/v1/responses` 和 `/responses`；原生 Responses 正文不被统一重建。

`max_completion_tokens`（Chat）和 `max_tokens`（Messages）会忠实映射为 Responses 的 `max_output_tokens`。模型因该上限返回 `length` / `max_tokens` 表示输出预算已用完；服务不会静默提高客户端指定上限。生成长 SVG 或大段代码时应给足输出预算。

除 GPT 固定走 Responses 外，程序优先使用模型可用的同格式接口；跨协议时使用所选引擎转换文本、图片、工具声明、调用、结果、停止原因及 usage。

- Chat 流以 `data: ...` SSE 和 `[DONE]` 结束；Responses 使用 `response.completed` / `response.incomplete` 等终止事件。
- Messages 流保持命名事件及内容块顺序。
- 工具由 API 客户端执行，PostHog2Api 不执行客户端函数。
- 工具参数必须是有效 JSON；原有转换还会验证常用 JSON Schema 约束和调用 ID，New API 模式采用 RelayKit 工具转换与损耗策略。
- 图片支持 HTTPS URL、PNG/JPEG/WebP/GIF data URL 或 Messages base64 块；单张解码后最大 5 MiB。
- 原有转换拒绝无法保真的 thinking、developer 权限差异和部分高级字段；New API 模式有不同的支持边界，不能假定两种引擎完全等价。
- 原有 Chat → Messages 流会缓冲以获取真实输入用量；New API 模式增量发送。两种模式的同格式流均不缓冲正文，断流不会伪造成功结束事件。

详细能力和验证状态见 [docs/CAPABILITIES.md](docs/CAPABILITIES.md)。

## Fast 模式

Fast 模式用同一个模型换取更快的输出，价格约为标准的 2 倍。按模型提供方有两种机制：

| 模型 | 上游字段 | 说明 |
|---|---|---|
| `claude-opus-4-8`、`claude-opus-5`、`claude-opus-5-5` | `"speed": "fast"` | Anthropic 研究预览，与 PostHog Desktop 相同；PostHog 网关里的 LiteLLM 会自动补上 `fast-mode-2026-02-01` beta 头；有独立限流额度。Desktop 列表中的 `claude-opus-4-7` 会被 Anthropic 拒绝，未提供。 |
| `gpt-6-astra`、`gpt-5.6-sol`、`gpt-5.6-terra`、`gpt-5.6-luna`、`gpt-5.5`、`gpt-5.4`（以及 `gpt-6-sol`、`gpt-6-luna`） | `"service_tier": "priority"` | OpenAI Fast 模式（原 Priority processing），也是 Codex `/fast` 发送的值；与标准处理共享限流，过载时按标准速度处理。GPT-6 在 EU 数据驻留下只能标准处理，EU 账号自动跳过。 |

PostHog Desktop 只给 Claude 提供了开关：本地 Codex 会话没有入口，Codex 也会丢弃其模型目录未声明的档位，所以 PostHog 只在云端 Codex 任务里经 Go 网关注入 `service_tier`。个人账号走的 Python 网关会把请求体里的 `service_tier` 原样交给 LiteLLM 转发到 OpenAI，因此本服务可以直接写入该字段。Sonnet、Haiku、`gpt-5.3-codex`、`gpt-5.2`、`gpt-5-mini` 等模型没有 Fast 模式。

- 在“模型目录”页按模型开关，默认全部关闭。开启后，该模型未指定 `speed` / `service_tier` 的请求会自动加上对应字段；客户端自行传入的值（例如 Claude Code 或 Codex 的 `/fast`）原样透传，不被覆盖。
- 固定账号策略下，Claude fast 的 HTTP 429 同样按账号失败切换；旧轮询/最高余额策略仍在服务端注入 fast 后遇到普通限流时，同账号以标准速度重试一次并暂停该模型的 Fast 模式。GPT 的 429 按账号限流处理。
- Anthropic 返回的 `usage.speed`（`fast` / `standard`）和 OpenAI 返回的 `service_tier`（`priority` / `fast`，降级时为 `default`）会记入请求记录的 Token 明细，可据此确认是否真的以 Fast 速度处理。

## 命令行

```text
posthog2api serve [--data-dir DIR]
posthog2api login --region us [--project-id ID] [--name NAME]
posthog2api models
posthog2api doctor
posthog2api logout [--account ID]
posthog2api version
```

网页管理在设置 `POSTHOG2API_ADMIN_PASSWORD` 后启用独立密码登录。没有设置时仅保留本机开发兼容模式；公网部署必须通过平台 Secret 配置该变量。服务默认只监听 `127.0.0.1`。

## 开发与验证

```bash
go test ./...
go test -race ./...
go vet ./...
go build ./cmd/posthog2api
```

测试使用本地模拟响应，不调用真实模型，也不消耗 PostHog 额度。真实账号验证需要用户自己完成 OAuth 登录后执行最小请求。

## API 列表

| 路径 | 用途 |
|---|---|
| `POST /v1/chat/completions` | OpenAI Chat Completions |
| `POST /v1/messages` | Anthropic Messages |
| `POST /v1/responses`、`POST /responses` | OpenAI Responses |
| `GET /v1/models` | 合并后的 PostHog 模型目录 |
| `GET /healthz` | 本地存活检查 |
| `GET /api/admin/accounts` | 脱敏账号列表；`offset`、`limit`（最大 200）、`q`、`status=all/enabled/disabled/attention` 分页筛选，返回 `total`；不带 `limit` 时返回全部 |
| `POST /api/admin/accounts/import` | 导入或更新账号凭据 JSON；响应不含 Token |
| `PATCH/DELETE /api/admin/accounts/{id}` | 修改、停用或删除账号 |
| `/api/admin/oauth/*` | OAuth 发起、状态及手动回调 |
| `/api/admin/models` | 模型、账号数量、限制原因及 Fast 模式状态 |
| `PUT /api/admin/fast-mode` | 按模型开关 Fast 模式：`{"model":"claude-opus-5","enabled":true}` |
| `/api/admin/usage` | 每个账号的 PostHog 余额与计费状态；分页筛选参数同账号列表 |
| `/api/admin/requests` | 有界请求记录 |
| `/api/admin/requests/{id}` | 单条记录与原始/上游请求正文 |
| `/api/admin/settings` | 运行设置 |
| `/api/admin/registration/settings`、`/capabilities` | Modal SDK 环境变量摘要与连接检查 |
| `/api/admin/registration/tasks` | 注册/验证任务创建与历史 |
| `/api/admin/registration/tasks/{id}`、`/{id}/logs` | 阶段状态与增量日志 |
| `/api/admin/registration/tasks/{id}/stop`、`/{id}/resume` | 停止 Sandbox / 从 Volume 续跑 |
| `POST /api/integrations/accounts/import` | Modal 专用、幂等的账号回传接口 |

## 许可证与发布

本版本内嵌 AGPLv3 的 RelayKit，组合程序按 AGPLv3 分发，不能仅视为 MIT；原 PostHog2Api 代码的 MIT 授权保留。详见 [LICENSE](LICENSE)、[LICENSE-AGPL-3.0](LICENSE-AGPL-3.0) 和 [NOTICE](NOTICE)。选择原有转换并不会移除二进制中已链接的依赖。

分发或对外提供网络服务时，运营者必须按许可证向用户提供所部署版本的完整对应源码（包含本项目修改及构建说明），不能只链接 new-api 上游仓库。本服务公开源码位于 [ModelScope Studio 文件仓库](https://www.modelscope.ai/studios/moyang303/posthog2api/files)，可通过 `git clone https://www.modelscope.ai/studios/moyang303/posthog2api.git` 获取并按部署提交检出。登录页和管理页提供源码入口，前端和 Docker 镜像保留所需的来源署名与许可信息。
