一个开箱即用的 Agent LLM 服务商切换工具,通过可视化界面读写配置文件,让 Claude Code 与 Codex 在不同服务商、模型、API Key 之间一键切换,无需手动编辑。
当前访问频次受限,请登录后继续访问
a4agent
English | 简体中文
六端 AI 编程工具管理台 + 本地大模型推理控制台:为 Claude Code、Codex、dsh(DeepSeek Harness)、ZCode(智谱 Agentic 开发环境)、pi(本地 pi coding agent)与 Qoder(AI IDE) 提供统一的技能管理与 MCP 管理(六端全覆盖),并为其中没有图形配置界面的两个 CLI 工具(Claude Code、Codex)提供 API 服务商切换,同时内置 llama.cpp 本地模型推理。所有操作通过可视化界面完成,无需手动编辑配置文件。
| 能力 | 说明 |
|---|---|
| 技能管理 | 六端全局/项目级 skill 自动发现、聚合标注、跨端迁移、回收站恢复,一键把项目 skill 补齐到所有缺失的端 |
| MCP 管理 | 六端 MCP server 自动发现与一键安装、跨端迁移(按传输能力矩阵校验)、快照回收站、自动/自定义功能介绍,密钥全程脱敏/加密 |
| API 切换 | 为无图形界面的 CLI(Claude Code、Codex)一键切换服务商、模型、API Key,配置自动备份、原子写入,密钥 DPAPI 加密存储;其余四端应用自带供应商配置界面,由用户自行配置 |
| 本地模型 | 把任意 .gguf 模型一键变成 OpenAI 兼容的本地/局域网 API 服务:引擎按显卡自动获取、模型库扫描、显存风险评估,一键接入配置方案(Claude Code / Codex) |
| 任务下发 | 六端 CLI 以无头模式后台执行任务:下发即返回、下发前自动预检(引擎可用 / 配置就绪 / 真实连通)、队列轮询、产出留档、取消与超时、关窗不杀任务。直接使用你在各应用内配好的配置 |
| 通知提醒 | 两条独立通道让你不必守在电脑前:手机推送(ntfy)在任务成功 / 失败 / 超时时送达,含 Agent 最后一段输出;桌面横幅点击即唤回窗口。会话 hook 覆盖 Claude Code / Codex / ZCode / Qoder / WorkBuddy / dsh,可在手机上直接回答提问、审批权限 |
技能管理
六个目标使用同一套技能格式(<skill-name>/SKILL.md 目录 + frontmatter 的 name 与 description),因此 a4agent 可以把它们当作一种资源统一管理。
发现与聚合
- 自动扫描六端全局与项目级技能目录,以 frontmatter
name为唯一标识做聚合标注:同名技能跨端存在时自动标记「已在 N 端存在」。 - 项目根目录列表可配置(默认扫描
C:\ProgramMine),只收录含至少一个 skill 的项目。 - Codex 全局的保留目录(
.system/等点开头目录)自动跳过,不视为用户技能。
跨端迁移与「一键适配六端」
- 任意一端的 skill 可迁移到任意目标端(全局或任意项目),迁移为非破坏复制:源端永久保留。
- 迁移目标支持自选项目文件夹:目标项目无需事先存在任何 skill,
.{tool}/skills目录缺失时自动创建;桌面端直接调用系统目录选择框,浏览器端退化为输入路径。 - 目标端已存在同名技能(frontmatter name 或目录名任一命中)时,旧版自动移入回收站而非静默覆盖。
- 「一键适配六端」:一键把项目内全部 skill 按其缺失的端一次补齐,先弹计划清单再执行,带进度条并临时锁定页面,防止中途误操作。
- 每次迁移写入迁移日志(时间、Skill、源、目标、结果),全程可追溯。
回收站
- 删除的 skill 移入回收站,30 天内可恢复原位或彻底删除;恢复时原位置被占用会明确报错,绝不覆盖。
- 过期条目在下次访问回收站时惰性清理,并在返回结果中提示本次清理数量。
六端技能目录
| 工具 | 全局(用户级) | 项目级 |
|---|---|---|
| Claude Code | ~/.claude/skills/ |
<项目>/.claude/skills/ |
| Codex | ~/.codex/skills/ |
<项目>/.codex/skills/ |
| dsh | ~/.dsh/skills/($DSH_HOME 可覆盖) |
<项目>/.dsh/skills/ |
| ZCode | ~/.zcode/skills/ |
<项目>/.zcode/skills/ |
| pi | ~/.pi/agent/skills/($PI_CODING_AGENT_DIR 可覆盖) |
<项目>/.pi/skills/ |
| Qoder | ~/.qoder/skills/($A4AGENT_QODER_HOME 可覆盖) |
<项目>/.qoder/skills/ |
ZCode:官方还识别跨工具兼容目录 ~/.agents/skills 与 <项目>/.agents/skills;a4agent 统一托管到 .zcode 前缀,与其它端保持一致。迁移到 ZCode 的 skill 会被 ZCode 客户端真实读取。
pi:全局技能在 agent 子目录下(~/.pi/agent/skills,不是 ~/.pi/skills)。pi 对 skill 的校验比其它端严格:name 只能是小写字母、数字与连字符(≤64 字符,不得以连字符首尾或含连续连字符),description 必填(≤1024 字符),不合规的 skill pi 会直接不加载。迁移到 pi 时 a4agent 会按 pi 的规则复查一次,不合规则在迁移结果里明确警告,而不是留下「迁成功却找不到」的状态。
Qoder:除 ~/.qoder/skills 外还识别跨工具目录 ~/.agents/skills 与 <项目>/.agents/skills(优先级低于前者),a4agent 统一托管到 .qoder/skills 前缀,与其它端一致,项目级因此无需特判。配置目录名随发行版而变(国际版 .qoder、国内版 .qoder-cn),默认探测实际存在的那个,也可用 A4AGENT_QODER_HOME 直接指定。
MCP 管理
六端的 MCP server 都写在各自的配置文件里,a4agent 把它们归一为统一视图(name / transport / command / args / env / url / headers)管理。
发现与聚合
- 自动发现六端全局与项目级 MCP server,同名 server 跨端聚合标注(「已在 N 端存在」)。
- 详情中
env/headers一律脱敏(只回显键名),API 永不回传明文密钥。 - 每张卡片显示该 server 的功能介绍:自动识别常用 server(内置简介库 + npx 包实时查询 npm registry,均有缓存与失败兜底),也支持点「介绍」手工维护说明(本地持久化、跨端共享、留空即清除)。
- 项目级自动识别:Claude Code
.mcp.json、Codex.codex/config.toml、ZCode.zcode/config.json、pi.pi/mcp.json(Qoder 的项目级就是 Claude Code 的.mcp.json,归 Claude 端托管,不重复发现)。
安装 MCP 服务
- 点「安装 MCP」可在任意应用从零新建 server:选择目标应用(Claude Code / Codex / dsh / ZCode / pi / Qoder,写入该应用全局配置)+ 传输类型(stdio / http / sse,按目标端能力自动过滤,如 Codex 仅 stdio、pi 无 sse),填写命令/参数/环境变量或地址/请求头。
- 也支持粘贴 JSON 批量导入:把已有的 MCP 配置片段直接粘进来(兼容「mcpServers」顶层、名称作键的 server 字典、单对象三种格式),一次装多个,逐条独立——单条失败(同名冲突、目标端不支持该传输等)不中断其余,并逐条报告成功/失败。
- 安装走各端原生渲染与原子写(目标同名已存在会明确拒绝,可改用迁移或先删除),既有 server 与其它配置键原样保留;安装后立即出现在卡片列表,并自动匹配功能介绍。
跨端迁移与传输能力矩阵
- 任意端的 server 可迁移到任意目标端;目标端已有同名 server 时先快照进回收站再写入,写入前自动备份目标配置文件。
- 迁移按传输能力矩阵严格校验,不兼容的组合整对失败并留日志,不静默降级:
| 目标端 | 支持的传输 | 配置文件 |
|---|---|---|
| Claude Code | stdio / sse / http | ~/.claude.json(全局)、<项目>/.mcp.json(项目) |
| Codex | stdio | ~/.codex/config.toml([mcp_servers.*]) |
| dsh | stdio / streamable-http | ~/.dsh/profiles/<profile>/cordis.patch.yml |
| ZCode | stdio / sse / http | ~/.zcode/cli/config.json、<项目>/.zcode/config.json(mcp.servers) |
| pi | stdio / streamable-http | ~/.pi/agent/mcp.json(全局)、<项目>/.pi/mcp.json(项目,需该项目被 pi 信任) |
| Qoder | stdio / sse / http | ~/.qoder/mcp.json(全局;项目级复用 Claude Code 的 <项目>/.mcp.json) |
dsh:MCP server 挂在 @deepseek-ai/dsh-mcp-client 插件条目下,重写时保留其它非管理条目;无项目级 MCP。
ZCode:配置 schema 严格(未知键会被丢弃),a4agent 只写其规范字段(type/command/args/cwd/env/url/headers/enabled/timeoutMs),迁移到 ZCode 的 server 会被客户端自动连接。
pi:mcp.json 与 Claude Code 同构(顶层 mcpServers),但明确拒绝 legacy SSE(type: "sse" 会被判废),迁移到 pi 的 sse 条目会整对失败并留日志。pi 另有自有键 exposure / toolExposure / enabled / timeout / auth / oauth 决定工具如何暴露给模型,a4agent 读写时无损保留这些键与顶层 autoEnableCodemode。pi 的 server 名只接受字母、数字、_、-,含中文或点号的名字会在迁移/安装时被明确拒绝(写出即废条目);项目级文件不接受 auth 键,写入时自动剔除并记录日志。
Qoder:~/.qoder/mcp.json 与 Claude Code 同构(顶层 mcpServers,type 认 stdio / sse / http / streamable-http),自有键是 disabled(在 Qoder 界面里关掉某个 server 的开关,注意不是 enabled)、timeout、authType,a4agent 读写时一并无损保留。Qoder 的项目级 MCP 与 Claude Code 共用同一个 <项目>/.mcp.json(它按 .mcp.json → mcp.json 的顺序查找),所以 a4agent 不让 Qoder 端再接管项目级文件——同一文件被两端各写一次只会互相踩;迁到 Claude 项目级即 Qoder 项目级同时生效。运行时镜像 %APPDATA%\Qoder\SharedClientCache\extension\local\mcp.json 与 ~/.qoder/mcp-router.json 是进程内状态,a4agent 既不读也不写、不纳入备份。
Qoder 视图「看不到已连接 MCP」是正常的——a4agent 管理的是用户自定义那一份 ~/.qoder/mcp.json;而 Qoder 会话里实际连着的多数连接器并不来自这个文件:内置连接器(浏览器控制、node REPL 等)随 Qoder 安装包分发,插件自带的连接器写在 ~/.qoder/plugins/cache/<来源>/<插件>/mcp.json 里,两者都不属于用户配置文件,因此不会出现在 a4agent 的 Qoder 卡片上。判断依据很简单:~/.qoder/mcp.json 为空、而 Qoder 里已连着若干 MCP,二者并不矛盾。想让某个 server 出现在 Qoder 端视图,就用「安装 MCP」或跨端迁移把它写进这个文件。
回收站与数据保护
- 被替换/删除的 server 配置片段快照进回收站(30 天内可恢复);快照中的
env/headers用 DPAPI 加密落盘,恢复时解密写回。 - 每次迁移写入日志;发现、预览、回收站接口对敏感字段全程脱敏。
API 服务商切换
a4agent 为没有图形配置界面的 CLI 工具提供一键切换:目前是 Claude Code 与 Codex 两端。
- Claude Code:Anthropic 协议直连,或经内置本地翻译代理把请求实时翻译为 OpenAI Chat Completions 转发给 OpenAI 兼容服务商(代理仅监听
127.0.0.1、随机 token 鉴权,工具退出后仍存活)。 - Codex:OpenAI Responses 协议写入
~/.codex/config.toml;上游原生支持 Responses(如 DeepSeek)时直连,否则经本地代理翻译转发。
为什么只代管这两端
判定标准只有一条:目标应用是否自带完整的供应商配置界面。
| 端 | 应用内能做什么 | a4agent 的做法 |
|---|---|---|
| Claude Code | 无,纯 CLI | 代管(唯一可行路径) |
| Codex CLI | 无,纯 CLI | 代管(唯一可行路径) |
| dsh | Settings → Models,可选三种 API 协议 + 自动拉取模型清单 | 移交用户自配 |
| ZCode | 设置 → 模型供应商,双接口地址 + 按模型声明能力 | 移交用户自配 |
| pi | /model 里直接切换 |
移交用户自配 |
| Qoder | 9 个预置供应商 + 自定义端点 + 连通性校验 | 移交用户自配 |
对这些应用,外部代管配置文件既不省事(用户点几下更快),又有额外风险:界面上的能力开关、上下文窗口、启用状态外部写入时无从得知,只能填保守默认值。
需要注意,判定依据是「用户自己能配」,不是「我们读不懂它的配置」——Qoder 的模型目录虽经专有加密、外部无法写明文,但用户自己在界面里配得好好的,技术障碍不构成产品理由。
换服务商请直接在对应应用的设置里操作,各端的字段对照与界面入口见 迁移对照表。
切换前自动备份目标配置文件(滚动保留最近 5 份)并原子写入;API Key 使用 Windows DPAPI 加密存储,接口永不回显明文。
无头任务下发与配置的关系
无头任务下发覆盖六端(Claude Code / Codex / ZCode / Qoder / dsh / pi),直接使用你在各应用内自己配好的配置——a4agent 不再为这些应用写入 API 配置,改为在下发前做一次真实连通性验证:
| 步骤 | 检查什么 |
|---|---|
| 引擎可用 | 命令是否存在、能否执行、版本号 |
| 配置就绪 | 读你自己的配置,判断是否已配好服务商与模型(Qoder 因配置加密读不到,如实说明并以实测为准) |
| 真实连通 | 用最小提示词真实跑一次无头调用,拿到产出才算通过 |
这样配置自由完全归你:无论你在界面里怎么配,验证的都是「能不能真跑」,而不是「配置字段是否等于我们写的值」。
本地模型(llama.cpp 推理控制台)
「本地模型」页签把 llama.cpp 的 llama-server 封装为一键启动的 OpenAI 兼容 API 服务:装哪个引擎、选哪个模型、给什么参数,全程可视化操作。
引擎版本:llama.cpp b11370(2026-10-03 发布,钉死在 backend/app/llama/catalog.py,为单一事实来源)。该版本的 llama-server 包含决策模型端点,因此下面这项能力可用。
决策模型(System One)
除常规的 /v1/chat/completions 与 /v1/models 外,该版本引擎还提供 /v1/systemone 决策模型端点——接入卡片里会直接给出它的完整地址,附带 curl / OpenAI SDK 调用示例,可用于把「该用哪个模型、怎么拆解任务」这类调度决策交给本地引擎,同时主模型交给云上服务,形成云边协同。
首次配置向导
按「获取引擎 → 检测硬件 → 选择模型目录 → 选择默认模型 → 服务端口」五步完成全部配置:
-
硬件检测与预设推荐:通过
nvidia-smi与注册表枚举显卡,列出厂商、显存、驱动版本;依据显存档位推荐推理预设(上下文长度、KV 缓存量化、MTP 投机解码),并在选择模型时给出显存溢出风险提示 -
引擎自动获取:按显卡自动下载 llama.cpp 官方预编译引擎,四套可选:
引擎包 适用显卡 体积 最低驱动 CUDA 13.4 NVIDIA(性能优先) 525 MB 580 CUDA 12.4 NVIDIA(兼容旧驱动) 597 MB 550 Vulkan NVIDIA / AMD / Intel 独显与核显 32 MB 无 CPU 无可用显卡时的兜底 18 MB 无 下载的是钉定版本的官方预编译二进制(可复现),也支持离线安装(指定含
llama-server.exe的目录)或暂时跳过;CUDA 引擎 = 主包 + cudart 运行库包,下载后自动解压合并 -
已装有旧版 a4agent 时自动接管其引擎目录,无需重复下载
模型库与服务运行
- 添加多个模型目录,自动扫描
.gguf并解析元数据:大小、量化级别、原生上下文、是否含 MTP 层(支持投机解码);一键「设为默认模型」 - 「启动服务」实时显示运行状态(启动中 / 运行中 / 失败 / 已停止)与引擎日志;健康检查就绪后通知;端口占用、引擎缺失、进程崩溃均有明确日志提示;支持定时内存裁剪
- 推理参数可视化调整:上下文长度、KV 缓存级别(f16/q8_0/q4_0)、Flash Attention、GPU 层数、API Key 鉴权、附加参数逃生舱
- MTP 投机解码步数: llama.cpp 的 MTP(Multi-Token Prediction)写法随版本变化——旧版用
--mtp N,b105xx 起改为--spec-type draft-mtp --spec-draft-n-max N。a4agent 通过跑一次llama-server --help自动探测当前后端支持哪种写法再下发参数,跨版本升级不会因此启动失败
局域网开放与一键接入
- 「接入」卡片直接给出 Base URL、Chat Completions 地址、决策端点(System One)、模型名(
model字段)与可直接复制的 curl / OpenAI SDK 示例;推理设置切换为0.0.0.0监听后显示实际局域网调用地址 - **「接入配置方案」**一键创建指向本地服务的配置方案,弹窗里勾选要写入的应用(Claude Code / Codex),到「配置方案」页切换即可让对应应用使用本地模型,与云上 API 无缝互切
任务下发(无头 Agent 任务)
「任务下发」页签把各端的无头(headless)模式产品化:在界面里写一句任务描述、选一个引擎,a4agent 就在后台把 CLI 拉起来跑完、把产出留档,你可以继续干别的事(机制见使用文档《让 Agent 后台自主执行任务》)。
支持的引擎
| 引擎 | 无头命令 | 产出形态 |
|---|---|---|
| Claude Code | claude -p "<任务>" --output-format json |
JSON 单对象,产出在 result,含 token 用量与成本 |
| Codex | codex exec --json --ephemeral |
JSONL 事件流,取 agent_message 类型的产出 |
| ZCode | zcode -p "<任务>" --json |
JSON 单对象,产出在 text,含 toolCalls / usage / stopReason |
| Qoder | qodercli -p "<任务>" -o json |
JSON 单对象 |
| dsh | dsh --profile headless "<任务>" |
stdout 直出(能解析为 JSON 时抽正文字段) |
| pi | pi -p "<任务>" --mode json --no-session |
JSONL 事件流,按 stopReason 定成败、按事件取文本 |
- 引擎自动探测(安装状态 / 版本 / 可执行路径),未安装的在界面置灰并给出原因
- 所有命令都先把命令名解析成绝对路径:Windows 上这些 CLI 都是 npm 的
.cmd壳,直接把命令名交给subprocess会启动失败。Qoder 的命令名官方文档写qodercli、博客写qoder,两个名字都探测 - 无头模式下没有人能点审批,因此每条命令都带权限预授权参数,否则会卡在审批或被直接拒绝:Claude Code 用
--permission-mode bypassPermissions、Codex 用--sandbox danger-full-access、ZCode 用--mode yolo、Qoder 与 pi 用--yolo(dsh 不需要,其 headless profile 本身即无头入口) - dsh 额外需要屏蔽 profile 里的外部插件:headless profile 缺少它们依赖的 host 服务,不屏蔽会在启动阶段直接失败。a4agent 生成
--patch覆盖层只禁用那批相对路径插入的外部插件,不改 profile 本身
下发前自动预检(不通就不入队)
点「下发任务」会先同步做三步检查,任一步失败就不启动引擎,并用人话告诉你为什么:
- 引擎可用:目标 CLI 已安装且真能执行(结果缓存 5 分钟)
- 配置就绪:读你自己在应用内配好的配置,判断是否已配好服务商与模型。读不到时(如 Qoder 的模型目录经专有加密)如实说明「无法校验,请以实测结果为准」,不假装通过
- 真实连通:用最小提示词真实跑一次无头调用,拿到产出才算通过
第 2、3 步不再比对「配置字段是否等于我们写的值」——那会把「配置得和我不一样」误判成不可用。真实调用不管怎么配都能给出诚实答案:密钥有效没、模型名拼写对不对、网络通不通,一次调用全都会暴露出来。配置还没配好时不会跑实测(跑必然失败,白白等待)。
被拦下的任务仍会留一条 precheck_failed 记录,在队列里可以看到失败在哪一步、耗时多少。
队列与产出
- 下发即返回:接口只建任务行并交给后台线程池(默认并发 5,
A4AGENT_TASK_CONCURRENCY可调),不等结果 - 状态机:
排队中 → 执行中 → 已完成 / 失败 / 超时 / 已取消 / 预检未通过,界面 2 秒轮询,全部空闲自动停表 - 「查看产出」弹窗显示引擎产出全文(长产出只回传末尾部分,文件里始终完整)与预检各步耗时
- 支持取消(杀整棵进程树,node 壳会派生子进程)、任务历史、删除(同步清理产出文件)
- 超时默认 10 分钟(可选 5–60 分钟),到点强杀并标记超时
- 产出落盘
%APPDATA%\a4agent\task_outputs\<任务号>.jsonl|md,与其它运行数据同目录
关窗不杀任务
- 关闭主窗口 = 转入后台常驻,任务继续执行;再次启动 a4agent 会自动唤回原实例的窗口而不是新起一个进程
- 真正的退出入口是顶栏「退出」,会先告知还有几个任务在跑并二次确认;退出时如实把运行中任务标记为「应用退出」并终止其进程树
- 任务到终态时:窗口开着就在页面内提示;窗口已隐藏则闪烁任务栏图标(零新增依赖,系统通知与托盘留给后续版本)
下载、安装与使用
下载安装
从 发行版(Release) 页面下载安装包 a4agent-setup-*.exe:
- 下载地址:https://github.com/eogee/a4agent/releases (选择最新版本)
- 系统要求:Windows 10/11 64 位
- 建议核对下载页提供的 SHA256 校验值,确保文件完整未被篡改
安装包采用每用户安装(免 UAC):双击运行后按向导安装到当前用户目录,全程无需管理员权限。安装完成后自动创建开始菜单与桌面快捷方式,并可在「设置 → 应用」中卸载。
运行
- 安装完成后,从开始菜单或桌面快捷方式启动 a4agent
- 首次安装/运行时若出现 Windows SmartScreen 提示,点击「更多信息 → 仍要运行」即可(应用未做商业代码签名,属正常现象,不影响功能)
- 界面七个页签:配置方案(API 切换,仅 Claude Code 与 Codex)、供应商管理、技能管理、MCP 管理、本地模型(llama.cpp 推理控制台)、任务下发(无头 Agent 任务)、通知提醒(手机推送 + 桌面横幅)
数据与隐私
- 运行时数据(数据库、配置备份)写入
%APPDATA%\a4agent\,日志写入~/.a4agent/logs/ - 无头任务的引擎产出写入
%APPDATA%\a4agent\task_outputs\(与配置备份同级、仅本机用户可访问);产出是引擎原始输出,可能包含代码与路径等敏感内容,「问题反馈」不会自动附带任务产出,删除任务会同步删除其产出文件 - API Key 使用 Windows DPAPI 加密存储,与当前 Windows 用户绑定
- 修改前自动备份原配置文件(
~/.claude/settings.json/~/.codex/config.toml,滚动保留最近 5 份)
常见问题
- 杀毒软件报毒:PyInstaller 打包的程序偶被安全软件误报,请添加信任或排除;可将样本提交给对应厂商申诉误报
- 升级:直接运行新版
a4agent-setup-*.exe覆盖安装即可,数据与配置(%APPDATA%\a4agent\)会保留;升级前会自动停止后台翻译代理并清理旧文件 - 从 a4api 升级(v0.3.x → v0.4.0+):产品已更名为 a4agent,直接安装新版即可——首次启动会把
%APPDATA%\a4api\数据自动迁入%APPDATA%\a4agent\,安装器会把程序目录从Programs\a4api迁到Programs\a4agent并清理旧快捷方式;此前写入 Claude Code / Codex 的a4api_p*托管条目会在下次切换时自动替换为a4a_p*,无需手工处理。v0.3.x 的「检查更新」也能直接升级到新版 - 卸载:在「设置 → 应用」中卸载;程序文件会移除,运行数据(数据库、配置备份)保留在
%APPDATA%\a4agent\,如需彻底清除请手动删除该目录 - 任务下发:关闭主窗口不等于退出——a4agent 会转入后台把任务跑完,再次启动程序即唤回原窗口;要真正结束请用顶栏「退出」(会先告知还有几个任务在跑)。任务到终态时,窗口已隐藏则闪烁任务栏图标提醒
- 反馈问题:推荐用应用内入口——页脚「问题反馈」直接提交,支持截图(≤10 张 × ≤1MB)、自动附带环境信息与可选日志,直达开发者邮箱 eogee@qq.com;也可附上
~/.a4agent/logs/a4agent.log日志片段提 Issue
提交 Issue 要求
Issue 已配置结构化模板(Bug 报告 / 功能需求),按表单填写即可;应用内「问题反馈」则直接邮件送达并自动完成第 2、4 项信息,无需走 Issue。手动提交前请确认以下信息,缺失可能导致问题无法定位:
- 明确类型:Bug 报告 / 功能建议 / 使用疑问,选择对应标签,便于分流处理
- 环境信息(必填):
- a4agent 版本号(发行版页面标注的版本)
- 目标应用:Claude Code / Codex / dsh / ZCode / 其他
- 服务商与模型:如 DeepSeek、智谱 GLM 等
- 复现步骤:从打开应用到出现问题的完整操作路径,越具体越好;尽量写明「做了什么 → 实际结果 → 预期结果」
- 日志:附上
~/.a4agent/logs/a4agent.log的相关片段(不要整份粘贴,可截取报错前后内容) - 报错信息与截图:界面报错文案、终端输出、异常截图一并附上
- 隐私红线:切勿在 Issue 中粘贴 API Key、模型密钥等敏感信息;如日志可能含敏感内容,请先脱敏
- 排查先行:提交前先自查——重启应用、确认 API Key 有效、确认本机能访问上游服务、确认无代理/杀软干扰
提交前请先搜索是否已有相同 Issue,避免重复提交。
自动更新
发布新版本到 GitHub/Gitee 后,应用会在启动时静默检查或点顶部「检查更新」时发现更新,经你确认后下载安装包并显示进度,下载校验通过后再次确认即可运行安装器完成升级;也可选择「忽略此版本」。
更新源与校验
- 双源竞速下载:安装包从 GitHub 与 Gitee 两个镜像同时下载、快者胜出(同一 SHA256 绑定两个镜像地址),慢源/不可达源自动落败并提前收手;领先超过 8MB 即判胜,进度条始终显示领先者。不再串行等待慢源(国内访问 GitHub 资产常只有 ~0.1 MB/s,竞速后自动落到 Gitee 的 ~2 MB/s)。
- 更新清单签名:发布侧用 Ed25519 私钥签名
latest.json(版本、更新说明、安装包 SHA256 等字段),应用内置对应公钥验签;任何字段异常或签名不符,清单直接作废、不弹更新提示。URL 不入签名,因此 GitHub/Gitee 两份清单字节一致、共用同一签名,URL 指向的内容由被签名的 SHA256 绑死。 - 完整性校验:安装包边下边算 SHA256,与签名过的清单比对通过才落盘(存于
%APPDATA%\a4agent\updates\<版本>\);点击「立即更新」时会对磁盘文件再次校验才启动安装器。 - 传输白名单:仅 HTTPS,且每次重定向逐跳校验主机白名单(
github.com/gitee.com/ 两个*.githubusercontent.com对象存储域 /*.gitee.com),拦截跳转到任意域名。 - 防降级:候选版本需严格高于当前版本;低于清单
min_version(过旧需完整安装包)时拒绝;预发布版本仅当当前运行版本也是预发布时才提示。 - 尺寸上限:清单 512KB、安装包 300MB,超限拒绝;下载只写入用户数据目录,不信任系统临时目录。
更新流程(一次点击走完)
- 检测到新版本 → 弹窗展示版本号与更新说明(说明内容由签名清单携带)。
- 确认 → 后台下载,前端实时进度;下载中可取消。
- 校验通过 → 提示「立即更新 / 稍后」。点击立即更新:应用先停掉本地翻译代理、自动退出并释放单实例锁,随后拉起 Inno Setup 安装向导;安装完成后启动的是新版本,配置、数据库与密钥完整保留。
开发
环境要求:Windows 10+,Python 3.10,uv
uv sync # 安装依赖
uv run python desktop.py # 启动桌面应用
# 或后端单独调试
uv run uvicorn backend.app.main:app --port 8000
打包
前置:编译安装包需要 Inno Setup 6(winget install --id JRSoftware.InnoSetup -e --accept-source-agreements)。
uv run python build.py # 生成 dist/a4agent/(文件夹版 onedir)
uv run python build.py --installer # 文件夹版 + 编译安装包 dist/a4agent-setup-<版本>.exe
uv run python build.py --onefile # 可选:生成单 exe(临时分发用)
版本号自动取自 pyproject.toml([project].version),也可用 --version 覆盖;ISCC.exe 自动探测(--iscc 指定路径)。
项目结构
a4agent/
├── desktop.py # pywebview 桌面入口(关窗后台常驻、二次启动唤回原窗口)
├── build.py # 打包脚本(PyInstaller onedir + Inno Setup 安装包)
├── installer.iss # Inno Setup 安装脚本(每用户安装、免 UAC)
├── dev_server.py # 开发态后端启动脚本(浏览器访问调试)
├── pyproject.toml # 依赖清单与版本号单一来源
├── backend/app/ # FastAPI 后端
│ ├── main.py # 应用入口、生命周期与路由挂载
│ ├── api/v1/ # REST 路由层:configs / providers / switch / skills / mcp /
│ │ # llama / tasks / update / feedback / desktop / fs / removal
│ ├── models.py # SQLAlchemy 数据模型
│ ├── schemas.py # Pydantic 请求/响应模式
│ ├── crud.py # 数据库增删改查
│ ├── database.py # 数据库初始化与目录布局
│ ├── config_manager.py # 配置方案与服务商管理
│ ├── config_io.py # 公共配置 IO(逐端备份、原子写入)
│ ├── openai_proxy.py # Anthropic → OpenAI 本地翻译代理
│ ├── responses_translator.py # OpenAI Responses 协议翻译
│ ├── proxy_standalone.py # 独立进程形态的翻译代理
│ ├── crypto.py # Windows DPAPI 密钥加密
│ ├── skill_manager.py # 六端技能发现、聚合、迁移与回收站
│ ├── mcp_manager.py # 六端 MCP 发现、安装、迁移与快照
│ ├── removal.py # 移交三端的托管配置清理(只删自写条目)
│ ├── removal_backup.py # 清理前的永久快照
│ ├── task_engines.py # 无头任务引擎适配(六端命令与产出解析)
│ ├── task_precheck.py # 下发前三步预检(引擎 / 配置 / 真实连通)
│ ├── task_runner.py # 任务执行器(线程池、进程树、超时)
│ ├── task_notify.py # 任务完成提醒(窗口提示 / 任务栏闪烁)
│ ├── phone/ # 通知提醒:config(话题 / 令牌 / 事件开关)/ ntfy(推送客户端)/
│ │ # notifier(任务终态分发到两条通道)
│ ├── hooks/ # 会话 hook:dispatch(事件路由)/ handlers(提问 / 审批 / 完成)/
│ │ # register(挂载到各工具)/ deskqueue(桌面弹窗延迟代发)
│ │ # dsh(dsh 事件处理)/ dsh_register(Cordis 插件挂载)
│ ├── win_toast.py # Win32 桌面通知横幅
│ ├── updater.py # 应用自更新(清单验签、双源竞速下载)
│ ├── llama/ # 本地模型推理控制台:catalog(引擎目录)/ gguf(模型解析)/
│ │ # gpu(硬件检测)/ downloader(引擎下载)/ runtime 与 server
│ │ # (服务运行)/ presets(推理预设)/ config / lan(局域网)
│ └── tests/ # pytest 测试套件(24 个模块)
├── frontend/
│ ├── index.html # 七页签主界面
│ ├── js/app.js # 配置方案 / 供应商 / 技能管理 / MCP 管理页逻辑
│ ├── js/llama.js # 本地模型页逻辑
│ ├── js/tasks.js # 任务下发页逻辑
│ ├── js/phone.js # 通知提醒页逻辑(手机推送 / 桌面横幅 / hook 挂载)
│ ├── js/markdown.js # 更新说明 Markdown 渲染
│ ├── css/ · layui/ # 样式与 LayUI 组件库
│ └── changelog.md # 应用内更新弹窗展示的更新说明
├── docs/ # 设计文档、迁移对照表、实施计划
├── resources/ # logo 与安装包图标 / dsh-hook(挂到 ~/.dsh 的 Cordis 插件源码)
└── tools/ # 端到端烟测脚本(e2e_task_smoke.py)
运行时数据(数据库、配置备份、llama 配置与引擎)写入 backend/database/(开发)或 %APPDATA%\a4agent\(打包后)。
联系方式
- 官网:https://eogee.com
- 使用文档:https://eogee.com/article/83
- QQ:3886370035 | 微信:eogee2022
- 问题反馈:推荐应用内页脚「问题反馈」直接提交(支持截图),直达开发者邮箱 eogee@qq.com;也可按「提交 Issue 要求」章节提 Issue