{
  "markdown": "# LLMToolForge\n\n为大模型提供各类工具的统一管理桌面端：**API Key 管理、Skill 管理、MCP 管理、第三方连接器（Connectors）**。\n\n## 技术栈\n\n- **桌面框架**：Tauri 2（Rust + WebView）\n- **前端**：React 18 + TypeScript + Vite\n- **UI**：shadcn 风格组件 + Tailwind CSS，设计对齐 Vercel [Geist](https://vercel.com/geist) 设计系统（明 / 暗主题）\n- **路由 / 状态**：react-router-dom + zustand\n- **本地持久化**：tauri-plugin-store（浏览器开发时自动回退到 localStorage），通过 repository 抽象层封装\n\n## 功能\n\n- **概览（Dashboard）**：各模块统计与快速入口\n- **API Keys**：提供商密钥的增删改查，列表掩码展示、一键复制\n- **Providers（多 provider 接入）**：统一入口，顶部切换 provider 类型，新增接入时手动选择 provider\n  - **Volcengine（火山引擎）**：录入 AK/SK，自动拉取账号已开通的模型（推理 Endpoint）与 Ark API Key；模型按 context window / Function Call / 多模态等能力分类展示\n  - **New API**：OpenAI 兼容网关，录入 Base URL + API Key，通过 `/v1/models` 拉取可用模型\n  - **LiteLLM**：OpenAI 兼容代理，录入 Base URL + API Key，通过 `/v1/models` 拉取可用模型\n- **Agent 聊天**：基于已接入的连接（Volcengine 凭证或 New API / LiteLLM 网关）的对话测试界面，支持 OpenAI Chat 与 Responses（火山引擎）两种请求格式、流式输出、System Prompt / 温度 / Max Tokens 参数，多模态模型可附带图片输入，并可组合 Skill 与工具执行真实对话\n- **Unified API（本地统一网关）**：把已接入的各 provider 模型统一暴露为一个本地 HTTP 服务，供 Codex、Claude Code 与本地 agent 直接使用（仅桌面端 Tauri 运行时可启动服务）\n  - **OpenAI 兼容**：`GET /v1/models`、`POST /v1/chat/completions`（流式 + 非流式）\n  - **Anthropic 兼容**：`POST /v1/messages`（请求/响应/流式事件与工具调用翻译，供 Claude Code 使用）\n  - 模型 id 形如 `{连接名}/{model}`，默认全部暴露，可按模型单独开关；可选本地 API Key 校验\n  - 内置交互式文档：`GET /openapi.json`（OpenAPI 3.1）、`GET /docs`（Redoc）\n  - 内置接入指南：OpenAI Python / Node SDK、curl、Codex、Claude Code 一键复制示例\n  - 调用监控：实时调用日志、成功率 / P95 耗时 / token 统计与 SVG 图表，支持过滤、清空、导出（JSON/CSV）\n- **Skills**：技能的增删改查、启用开关、标签；支持**从市场安装**——可输入 GitHub 仓库（`owner/repo`）列出其中的 `SKILL.md`，或通过 [skills.sh](https://www.skills.sh) 市场搜索并安装（内容仍从对应 GitHub 仓库拉取）。安装会拉取**整个 skill 目录**（`SKILL.md` + `references/` / 脚本 / 资源等多文件，文本原样保存、二进制经 base64），记录来源与内容哈希以便检测更新（可选配置 GitHub Token 提升请求限额）\n- **Agent（基于 Pi 的智能体）**：基于 [`earendil-works/pi`](https://github.com/earendil-works/pi)（`@earendil-works/pi-agent-core` + `@earendil-works/pi-ai`）的真实 agent，支持多轮 tool loop、流式输出与工具的真正执行（仅桌面端可用）\n  - **模型接入**：经本地 Unified 网关路由（`http://127.0.0.1:<port>/v1`），使用 pi-ai 原生 `openai-completions` provider；运行前需先在 Unified 页面启动网关并启用模型\n  - **内部工具**：`bash` 与文件工具 `read / write / edit / ls / grep`（Rust 实现），按沙箱模式（read-only / workspace-write / danger-full-access）门控，限定在工作目录内\n  - **外部工具（MCP）**：把每个启用的 MCP Server 的 Tools 包装为 agent 工具，经现有 `mcp_inspect` / `mcp_call_tool` 真正执行\n  - **连接器工具（Connectors）**：可选开启 OpenConnector 发现型工具，让 agent 按需检索并执行第三方 Action（凭证由运行时提供，agent 不接触明文）\n  - **Skill 调用**：Pi 风格——启用的 Skill 以 `<available_skills>` 注入系统提示词，并提供 `load_skill` 工具按需加载内容\n  - **自定义 Agent**：可创建可复用的 `AgentDefinition`（系统提示词 / 模型 / 内部工具 / Skill / MCP / 沙箱 / 温度 / Max Tokens），在输入栏下拉选择，内置最小管理页（增删改查）\n- **MCP Servers**：MCP 服务器增删改查，按传输方式（stdio / SSE / HTTP）动态表单、启用开关；支持从标准 `mcpServers` JSON 一键导入（重名自动跳过并提示）；内置 **Inspector**：连接服务器完成 `initialize` 握手，浏览并调用其 Tools（按 JSON Schema 生成参数表单 / 原始 JSON 两种模式）、读取 Resources、获取 Prompts，结果实时展示（仅桌面端可用）\n- **Connectors（第三方连接器）**：内置 [open-connector](https://github.com/oomol-lab/open-connector)（Apache-2.0，vendored 上游 commit 见 `sidecar/connector/UPSTREAM.json`）运行时，作为 **sidecar** 由应用启动/停止/健康检查，让智能体安全访问 1000+ 第三方平台的 10000+ Action（仅桌面端可用）\n  - **运行时管理**：单二进制由 `sidecar/connector/build.ts` 用 bun 编译（`node:sqlite`→`bun:sqlite` 兼容 shim），Rust supervisor（`src-tauri/src/connector/`）负责生命周期、随机/可配置端口（仅绑 `127.0.0.1`）、生成并持久化 admin token；catalog / migrations / Web Console 作为 Tauri 资源随应用分发\n  - **凭证边界**：第三方凭证（API Key / OAuth2）仅保存在运行时自己的 SQLite 数据目录（`<app-data>/connector`）内，**绝不写入应用配置或参与数据同步**\n  - **Connectors 页面**：运行时状态卡（启动/停止、端口、打开内置 Web 控制台）、Provider 目录浏览与搜索、per-provider 凭证配置（API Key 表单 + OAuth2 客户端配置与系统浏览器授权流程）、Action 搜索与调试（按 JSON Schema 生成参数表单，执行并展示结果）、运行记录\n  - **Agent 工具接入**：以 4 个发现型工具对接（`connector_list_apps` / `connector_search_actions` / `connector_get_action_guide` / `connector_execute_action`），不平铺上万 Action；在自定义 `AgentDefinition` 与会话输入栏均可开关（默认关闭），运行时未启动时返回引导性错误\n- **实用工具**：URL 编解码、JSON 预览（尽力解开被转义/双重编码的嵌套字段）、转义/去转义、Unicode 编解码，纯本地计算\n- **设置**：主题切换、数据存储说明、**数据同步**（加密同步到 S3 / S3 兼容对象存储，支持从远程恢复）\n\n> 第一阶段为脚手架 + UI 骨架 + 本地 CRUD，数据保存在本机。现已支持**加密同步**：在「设置 → 数据同步」配置 S3（或 S3 兼容）存储与加密口令，即可将本地资源经 AES-256-GCM 加密后同步到对象存储，并在新设备上恢复。\n\n### 数据同步（Storage Sync）\n\n- **后端抽象**：Rust 侧定义 `StorageBackend` trait，本期实现 S3（及 MinIO/R2 等兼容端，支持自定义 endpoint 与 path-style）；后续可扩展其它后端。\n- **端到端加密**：用户口令经 Argon2id 派生 AES-256 密钥，逐资源对象加密后上传；密钥/口令永不上传，KDF salt 随明文 manifest 共享以便多设备派生同一密钥。\n- **按资源分项同步 + 时间戳合并**：每类资源单独加密对象，拉取时按 `updatedAt` 逐条 last-write-wins 合并，删除以墓碑（tombstone）传播，避免“复活”。\n- **可扩展**：前端 `src/data/sync/registry.ts` 注册可同步资源，新增资源仅需加一行。\n- **仅桌面端**：S3 传输与加密在 Rust 原生执行，浏览器开发模式下该功能禁用。\n\n## 开发\n\n前置：Node.js + pnpm，以及 Rust 工具链（用于 Tauri）；构建 sidecar 还需 [Bun](https://bun.sh)。\n\n```bash\npnpm install\n\n# 仅前端（浏览器，数据走 localStorage）\npnpm dev\n\n# 构建 sidecar 二进制（gateway + connector），桌面端首次运行前必须执行一次\n# connector 会按固定 commit 联网克隆 open-connector 源码并用 bun 编译\npnpm run sidecar:build\n\n# 桌面应用（Tauri，数据走 tauri-plugin-store）\npnpm tauri:dev\n```\n\n> 全新克隆或执行 `pnpm clean` 之后，`src-tauri/binaries/` 下的 sidecar 二进制会缺失（它们被 gitignore，仅在本地/CI 构建时生成）。此时直接 `pnpm tauri:dev` 会报 `resource path ... doesn't exist`，需先跑一次 `pnpm run sidecar:build`。也可单独构建：`pnpm run sidecar:gateway:build` / `pnpm run sidecar:connector:build`。\n\n## 构建\n\n```bash\n# 前端产物\npnpm build\n\n# sidecar 二进制（若尚未构建）\npnpm run sidecar:build\n\n# 桌面安装包\npnpm tauri:build\n```\n\n## 目录结构\n\n```\nsrc/\n  components/\n    ui/          # 基础组件（button、input、dialog…）\n    layout/      # 侧边栏、顶栏、应用外壳\n    common/      # PageHeader、EmptyState、ConfirmDialog、ModelFeatureBadges\n  data/          # 存储适配层 + repository 抽象\n  store/         # zustand 状态（集合 store 工厂、主题）\n  pages/         # 各功能页面与表单弹窗（含 providers/、agent/）\n  lib/\n    http.ts      # Tauri/浏览器统一的 fetch（桌面端绕过 CORS）\n    volc/        # 火山引擎 OpenAPI V4 签名\n    providers/   # provider 适配层（统一类型 + volcengine 管理/推理 + openai-compatible 网关）\n  types/         # 数据模型\nsidecar/         # bun 编译的 sidecar 二进制（gateway、connector/open-connector）\nsrc-tauri/       # Tauri Rust 后端（含 unified/ 与 connector/ 两个 sidecar supervisor）\n```\n\n## CI / CD\n\n通过 GitHub Actions 实现持续集成与跨平台发布。\n\n### CI（`.github/workflows/ci.yml`）\n\n每次向 `main` 推送或提 PR 时运行：\n\n- **Frontend**：`pnpm install` → `pnpm build`（`tsc` 类型检查 + Vite 构建）\n- **Rust**：在 Linux / Windows / macOS 上执行 `cargo fmt --check`、`cargo clippy -D warnings`、`cargo check`\n\n### Release（`.github/workflows/release.yml`）\n\n推送 `v*` 形式的 tag（或手动 `workflow_dispatch`）时，使用\n[`tauri-action`](https://github.com/tauri-apps/tauri-action) 在矩阵中构建并发布到 GitHub Release（草稿）：\n\n| 平台 | Runner | 产物 |\n| --- | --- | --- |\n| macOS Apple Silicon | `macos-latest` (`aarch64-apple-darwin`) | `.dmg` / `.app` |\n| macOS Intel | `macos-latest` (`x86_64-apple-darwin`) | `.dmg` / `.app` |\n| Linux x64 | `ubuntu-22.04` | `.AppImage` / `.deb` / `.rpm` |\n| Windows x64 | `windows-latest` | `.msi` / `.exe (NSIS)` |\n\n发布步骤（版本号跟随 tag）：\n\n```bash\n# 打 tag 并推送即可，CI 会自动把版本号同步进 package.json / Cargo.toml / tauri.conf.json\ngit tag v0.2.0\ngit push origin v0.2.0\n# Actions 自动各平台构建、签名、生成 latest.json 并发布 Release（非草稿）\n```\n\n> 无需手动改版本号：`scripts/set-version.sh <tag>` 会在 CI 里把 `vX.Y.Z` 写入三处版本字段。\n\n### 自动更新\n\n应用内置 Tauri Updater，更新源指向 GitHub Releases 的 `latest.json`：\n`https://github.com/warjiang/LLMToolForge/releases/latest/download/latest.json`\n\n- **启动**：静默检查，有新版弹窗提示版本/更新日志，用户确认后下载安装并自动重启。\n- **设置页**：显示当前版本，提供「检查更新」按钮。\n- 平台支持：macOS / Windows 全量支持，Linux 仅 AppImage。\n\n### 必需 Secrets（自动更新签名）\n\n```bash\npnpm tauri signer generate -w ~/.tauri/llmtoolforge.key\n# 公钥已写入 tauri.conf.json 的 plugins.updater.pubkey\n```\n\n仓库 Secrets 中配置（缺失则更新产物不签名，客户端无法升级）：\n\n- **Tauri Updater 签名**：`TAURI_SIGNING_PRIVATE_KEY`、`TAURI_SIGNING_PRIVATE_KEY_PASSWORD`\n- **macOS 签名/公证（可选）**：`APPLE_CERTIFICATE`、`APPLE_CERTIFICATE_PASSWORD`、`APPLE_SIGNING_IDENTITY`、`APPLE_ID`、`APPLE_PASSWORD`、`APPLE_TEAM_ID`\n\n> 更换公钥需同步更新 `tauri.conf.json`，否则已发布客户端无法验证新包。\n",
  "bytes": 7701,
  "sha": "ef736129b3a6bea597d9de5a2eba574125d21e6789a6c254e716fd0361585e34",
  "repo_slug": "warjiang/llmtoolforge",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/okf_warjiang_llmtoolforge_openwiki_index_md_d9ab2cc3/readme"
}