JoyCode 代理 2151649856sjs-create/joycode-proxy
DeepSeek Harness把京东云 JoyCoder 积分接入为智能体模型后端
30.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/18 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add 2151649856sjs-create/joycode-proxy该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:待复验
是什么
dsh 原生插件 · model
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 15 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 16 处,展示前 15 条)
- 读取密钥环境变量server.mjs:25
const API_KEY = process.env.JOYCODE_PROXY_API_KEY || ''; - 读取密钥环境变量server.mjs:30
const PT_KEY = process.env.JOYCODE_PT_KEY || ''; - 读取密钥环境变量server.mjs:49
process.env.JOYCODE_SIGN_KEY || '0691a3f0b37b4a85aeb63ad0fc7db3ed'; - 发起网络请求server.mjs:185
const resp = await fetch(url, { method: 'POST', headers, body: JSON.stringify(body), signal }); - 读取本地文件install-dsh-plugin.mjs:19
const pluginPkg = JSON.parse(readFileSync(join(pluginDir, 'package.json'), 'utf8')); - 读取本地文件install-dsh-plugin.mjs:31
if (existsSync(target)) { - 读取本地文件install-dsh-plugin.mjs:33
const real = statSync(target).isDirectory() ? target : null; - 读取本地文件install-dsh-plugin.mjs:37
const realPath = existsSync(target) ? realResolve(target) : null; - 读取本地文件install-dsh-plugin.mjs:47
if (!existsSync(nodeModules)) { - 读取本地文件install-dsh-plugin.mjs:76
if (existsSync(patchFile)) content = readFileSync(patchFile, 'utf8'); - 写入本地文件install-dsh-plugin.mjs:83
writeFileSync(patchFile, content, { encoding: 'utf8' }); - 读取本地文件setup.mjs:40
const dbPath = candidates.find((p) => existsSync(p)); - 读取本地文件setup.mjs:79
if (existsSync(envPath)) { - 读取本地文件setup.mjs:80
try { existing = parseEnv(readFileSync(envPath, 'utf8')); } catch {} - 写入本地文件setup.mjs:86
writeFileSync(envPath, body, 'utf8');
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
兼容 OpenAI 的本地代理,用来暴露 JoyCode(京东云 JoyCoder)额度,另附一个 DSH 模型服务商插件
README
由 DeepSeek 最新模型翻译生成joycode-proxy
📘 英文文档:README.en.md
把 JoyCode(京东云 JoyCoder 积分) 反代成一个 OpenAI 兼容的 HTTP 服务,再通过一个 DSH provider 插件把它的积分池接进 DSH,当作智能体的模型后端。整体思路与 qoder-proxy / dsh-llm-qoder 完全一致,只是后端换成了 JoyCode 的「color gateway」协议。
架构
DSH agent
└─ ctx.llm.registerAdapter(["joycode"], adapter) ← dsh-llm-joycode 插件 └─ PiAiAdapter → openAICompletionsApi(baseUrl=本地 shim) └─ POST http://127.0.0.1:8318/v1/chat/completions └─ joycode-proxy (server.mjs) └─ POST https://api-ai.jd.com/api?
展开完整文档(README 剩余 1 节)
joycode-proxy
📘 英文文档:README.en.md
把 JoyCode(京东云 JoyCoder 积分) 反代成一个 OpenAI 兼容的 HTTP 服务,再通过一个 DSH provider 插件把它的积分池接进 DSH,当作智能体的模型后端。整体思路与 qoder-proxy / dsh-llm-qoder 完全一致,只是后端换成了 JoyCode 的「color gateway」协议。
架构
DSH agent
└─ ctx.llm.registerAdapter(["joycode"], adapter) ← dsh-llm-joycode 插件 └─ PiAiAdapter → openAICompletionsApi(baseUrl=本地 shim) └─ POST http://127.0.0.1:8318/v1/chat/completions └─ joycode-proxy (server.mjs) └─ POST https://api-ai.jd.com/api?appid=joycode_ide&functionId=chat_completions&t=...&sign=... (HMAC-SHA256 签名 + ptKey 头) └─ JoyCode 后端(同一账号的积分计费)
端点
| 方法 | 路径 | 说明 |
| GET | /v1/models | 返回 JoyCode 后端模型列表 |
| POST | /v1/chat/completions | OpenAI 兼容,支持 stream: true/false |
| GET | /health | 探活 + 配置自检 |
为什么用「color gateway」而不是逆向
JoyCode IDE 的请求签名与鉴权都在它自带的 extension.js 里明文实现,核心只有三样东西:
1. 网关地址:https://api-ai.jd.com/api(登录态里的 colorBaseUrl)。
2. 鉴权头:ptKey(登录态里的 ptKey,即京东云账号票据)+ 可选 loginType/tenant。
3. 签名:对 {appid, functionId, t} 排序后取非空值 & 拼接,用 HMAC-SHA256 + IDE 内置签名密钥算 hex,作为 sign 查询参数。
因此不需要逆向任何加密/WASM,直接把这段签名逻辑复刻成 server.mjs 里的 signQuery() / gatewayUrl() 即可。
关于那个签名密钥:它是 IDE 客户端内置的公开协议常量,随 IDE 分发给每个用户,不是账号凭据——单独拿到它无法发起任何有效请求。真正的凭据是 ptKey,只从环境变量读、永不入库。若上游轮换密钥,重新从 extension.js 提取,或用 JOYCODE_SIGN_KEY 覆盖。
配置(环境变量)
| 变量 | 必需 | 默认 | 说明 |
| JOYCODE_PT_KEY | ✅ | 空 | 账号票据(登录态 jdhLoginInfo.ptKey) |
| JOYCODE_TENANT | ⭕ | 空 | 租户 ID(登录态 tenant) |
| JOYCODE_COLOR_BASE_URL | ⭕ | https://api-ai.jd.com | 网关 origin(登录态 colorBaseUrl) |
| JOYCODE_MASTER_BASE_URL | ⭕ | 空 | 直连 origin(登录态 masterBaseUrl),网关不可用时兜底 |
| JOYCODE_LOGIN_TYPE | ⭕ | PIN_JD_CLOUD | 登录类型 |
| JOYCODE_SIGN_KEY | ⭕ | 内置常量 | 覆盖签名密钥(上游轮换时用) |
| JOYCODE_PROXY_PORT | ⭕ | 8318 | 本地监听端口 |
| JOYCODE_PROXY_HOST | ⭕ | 127.0.0.1 | 监听地址 |
| JOYCODE_PROXY_MODEL | ⭕ | JoyAI-Code-1.6 | 缺省模型 |
| JOYCODE_PROXY_API_KEY | ⭕ | 空 | 设置后要求 Authorization: Bearer <key> |
怎么拿到自己的凭据:JoyCode IDE 的登录态存在一个 SQLite 库里(Windows %APPDATA%\JoyCode\User\globalStorage\state.vscdb; macOS ~/Library/Application Support/JoyCode/User/globalStorage/state.vscdb; Linux ~/.config/JoyCode/User/globalStorage/state.vscdb)。
读 ItemTable 表里 key 为 JoyCoder.IDE 的那一行,其 JSON 的 joyCoderUser 里就有 ptKey / colorBaseUrl / masterBaseUrl / tenant。
把这些填进 .env(见 .env.example)。.env 已在 .gitignore 里,绝不要提交。
不想手动抠?跑 npm run setup,它会自动从本机 IDE 登录态读出凭据写进 .env。
模型列表(后端实时返回)
- JoyAI-Code-1.6
- GLM-5.3-agent(GLM-5.3)
- Kimi-K2.6-agent(Kimi-K2.6,多模态)
- MiniMax-M3-agent(MiniMax-M3,多模态)
- Doubao-Seed-2.0-pro-agent(Doubao-Seed-2.0-pro,多模态)
启动
$env:JOYCODE_PT_KEY = "<ptKey>"
node server.mjs
验证:
bash
curl.exe -s http://127.0.0.1:8318/v1/models
curl.exe -s http://127.0.0.1:8318/v1/chat/completions
-H "Content-Type: application/json"
-d ']}'
快速开始 bash
git clone <this-repo> && cd joycode-proxy
npm run setup # 自动从本机 JoyCode IDE 登录态读出 ptKey / tenant 写进 .env
npm start
没装 JoyCode IDE?手动也行: bash
cp .env.example .env # 然后填入你自己的 ptKey / tenant
npm start
验证: bash
curl -s http://127.0.0.1:8318/v1/models
curl -s http://127.0.0.1:8318/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"JoyAI-Code-1.6","messages":[{"role":"user","content":"reply exactly PONG"}]}'
零运行时依赖:只用 Node 内置的 node:http / node:crypto,npm install 不是必需的。
接 DSH
一条命令即可完成挂载(自动建 junction + 追加 patch 条目,幂等): bash
npm run install:dsh # 等价于 node install-dsh-plugin.mjs
可选:指定 profile / DSH_HOME
DSH_PROFILE=web DSH_HOME=/path/to/.dsh node install-dsh-plugin.mjs
手动方式:
1. 把 dsh-plugin/ 挂进你的 DSH profile(例如用 junction / symlink 放到 <DSH_HOME>/profiles/web/node_modules/dsh-llm-joycode,或直接 dsh plugin add 该目录)。
2. 在 <DSH_HOME>/profiles/web/cordis.patch.yml 末尾追加:
yaml
- insert:
- id: llm-joycode
name: dsh-llm-joycode
3. 重启 DSH,模型选择器里应出现 joycode provider(5 个模型)。
已知限制
- 无状态:把 OpenAI messages 拍平成单个 prompt,不保留跨请求会话(和 qoder-proxy 一致)。
- 不支持 function calling / tools:JoyCode 网关的 chat completions 走纯文本路径。
- 单账号串行:凭据来自一个登录态,多并发请求共享同一账号的积分。
- 签名密钥可能轮换:密钥是 IDE 内置常量,上游更换后需重新提取,或用 JOYCODE_SIGN_KEY 覆盖。
免责声明
本项目仅用于在你自己的账号下、于本机把已有的 JoyCode 积分接到其它客户端,便于个人开发使用。请自行确认你的用法符合服务商条款。作者不对账号封禁、额度损失或任何间接损害负责。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
2151649856sjs-create/joycode-proxy
把京东云 JoyCoder 积分接入为智能体模型后端
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1