pi-codebuddy-oauth
Pi extension that registers CodeBuddy (IOA) as an OpenAI-compatible HTTP provider with OAuth/API-key auth
Package details
Install pi-codebuddy-oauth from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-codebuddy-oauth- Package
pi-codebuddy-oauth- Version
0.1.5- Published
- Sep 14, 2026
- Downloads
- 768/mo · 198/wk
- Author
- soulchildtc
- License
- MIT
- Types
- extension
- Size
- 51.5 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-codebuddy-oauth
为 CodeBuddy(腾讯 IOA 编程助手)提供 Pi 扩展,把 CodeBuddy 作为 OpenAI 兼容 HTTP provider 接入 Pi。
与 pi-codebuddy-sdk(spawn codebuddy CLI 子进程 + MCP bridge)不同,本扩展走轻量 HTTP 直连(/v2/chat/completions):协议栈复用 pi-ai 内置 openai-completions,扩展只负责鉴权、模型发现、动态头注入与瞬时故障重试。无 CLI 依赖、无子进程、无会话文件管理。
特性
- OAuth 登录 — Pi 原生
/login流程接入 IOA:/v2/plugin/auth/state→ 浏览器 → 轮询 token。token 刷新由 Pi 双检锁托管(5 分钟 skew 预刷新)。 - API Key 登录 — 设置
CODEBUDDY_API_KEY(ck_xxx)即可,无需浏览器。 - 自动模型发现 — 调用
GET /v3/config提取 craft agent 模型列表(5 分钟 TTL 缓存 + 单飞;登录后自动触发)。 - 401/403 中途刷新重试 — 流式请求中 token 失效时自动刷新并重试一次(15 秒冷却防抖)。
- 瞬时 400(code 11133)自动重试 — CodeBuddy 网关偶发把上游瞬时校验失败包装成 HTTP 400
{"code":11133}返回;拦截器按 1s → 4s → 10s → 25s 退避幂等重发(最多 4 次,总等待 ≤40s),其他 400 原样透传。 - session 级
X-Conversation-ID稳定化 — 同一 Pi session 复用同一 conversation id,提升上游 prompt cache 命中率(compaction 时淘汰)。 - 环境自动切换 — 默认国内端点(
copilot.tencent.com),CODEBUDDY_NETWORK=internet切国际(www.codebuddy.ai),CODEBUDDY_ENDPOINT覆盖完整 URL。
安装
pi install npm:pi-codebuddy-oauth
或本地路径开发调试:
pi install /path/to/pi-codebuddy-oauth
重启 pi,然后 /model → 选 codebuddy/...。
登录
方式 1 — OAuth(推荐):
/login codebuddy
按提示在浏览器完成 IOA 登录,token 自动持久化。
方式 2 — API Key:
export CODEBUDDY_API_KEY=ck_xxx
环境变量
| 变量 | 默认 | 作用 |
|---|---|---|
CODEBUDDY_ENDPOINT |
(空) | 完整 base URL 覆盖,优先级最高 |
CODEBUDDY_NETWORK |
internal |
internal/ioa → 国内端点;其他 → 国际端点 |
CODEBUDDY_AUTH |
auto |
auto / oauth / api |
CODEBUDDY_API_KEY |
(空) | API Key(ck_xxx),auto 模式下隐含启用 API Key 模式 |
CODEBUDDY_MODEL |
(空) | 强制覆盖请求 model(写进 X-Model-ID) |
CODEBUDDY_STABLE_CONVERSATION |
1 |
0 关闭 session 级 conversation-id 稳定化 |
CODEBUDDY_CONVERSATION_MAP_MAX |
1000 |
session → conversationId LRU 容量 |
CODEBUDDY_TENANT_ID / CODEBUDDY_ENTERPRISE_ID / CODEBUDDY_USER_ID |
(从 JWT 提) | 覆盖自动提取的身份头(仅 OAuth 模式) |
架构
Pi agent
│ modelRuntime.streamSimple(auth 解析 / 凭据刷新)
▼
streamSimple wrapper(src/stream.ts)
│ 注入 22 头(X-Conversation-ID 稳定化 / B3 / X-Model-ID …)
│ 注入自定义 fetch
▼
auth-fetch 拦截器(src/auth-fetch.ts)
│ 认证头注入(oauth: Bearer + 租户身份头 / api: Bearer + X-API-Key)
│ 401/403 → 刷新 token 重试一次
│ 400+11133 → 1s/4s/10s/25s 幂等重发
▼
${server}/v2/chat/completions (协议栈:pi-ai openai-completions)
token 的过期预检与刷新由 Pi 原生托管(oauth.refreshToken,5 分钟 skew + 双检锁,自动持久化到 Pi 凭据存储);扩展维护一份独立快照(~/.pi/agent/codebuddy-auth.json)供请求期读取,流中途 401 时快照兜底刷新。
| 模块 | 来源 |
|---|---|
auth-flow.ts / auth-state.ts / jwt.ts / headers.ts / lru.ts / fetch-json.ts |
平移自 opencode-codebuddy-oauth |
models.ts |
平移 + 转换为 Pi ProviderModelConfig |
auth-fetch.ts |
平移改造:删 SSE 缓冲与预刷新(Pi 原生托管) |
index.ts / stream.ts |
新写:Pi extension 接线 |
model-cache.ts |
新写:持久化模型列表,消除启动期发现竞态(见下) |
模型列表缓存
模型发现(GET /v3/config)是异步的,而会话恢复走同步路径。若会话在发现返回前恢复,
codebuddy/<具体模型> 尚未注册,pi 会报
Warning: Could not restore model codebuddy/xxx (model no longer exists) 并回落到 auto。
为此,扩展把上次成功发现的模型落盘到 ~/.pi/agent/codebuddy-models-cache.json,
启动时先同步以缓存为种子注册,再等网络发现刷新缓存。缓存只影响「首个可见模型集合」的时机,
不替代网络发现:发现失败时仍回落到已缓存列表或 auto。
刻意不写入 models.json:codebuddy 是扩展注册的 provider,鉴权由 auth-fetch 拦截器注入
(自定义 streamSimple)。在 models.json 声明同 id 的原生 provider 会产生 baseUrl/api
双重定义并绕过拦截器,也会与 pi-model-manager 的跨进程锁相互干扰。
开发
npm install
npm test # vitest
npm run typecheck
许可证
MIT — © 2026 SoulChildTc;部分代码源自 opencode-codebuddy-oauth © 2026 Ming Lo (MIT)