1. GitHub Copilot Agent 模式系统提示词到底长什么样
GitHub Copilot 的 Agent 模式(也叫 Copilot Edits / Agent 模式)和普通补全最大的区别,是它背后挂了一套完整的系统提示词加工具调用协议。你看到的“自动改多个文件、自动跑终端、自动读报错”这些行为,全部来自提示词里对工具的约束。把这段提示词拆开看,能帮我们理解两件事:一是 Agent 是怎么决定“先搜代码再改文件”的,二是模型端点这一层到底在哪里被调用。
先看它的结构。整段提示词大致分四块:身份与内容策略、<instructions>通用代理行为、<toolUseInstructions>工具调用规范、<editFileInstructions>编辑文件规范,最后再挂一个functions命名空间的工具定义表。身份部分很短,核心就一句“你是一名 AI 编程助手,被问名字时回答 GitHub Copilot”,然后要求回答简短、客观、遵守内容政策。真正决定 Agent 行为的是后面三块。
<instructions>里最关键的是“先收集上下文再动手”这条。它明确写了:如果不知道确切的字符串或文件名,优先用search_codebase;不要对情况做猜测;调用工具后不要重复自己,从上次中断的地方继续。这几句直接决定了 Agent 不会一上来就瞎改文件,而是先搜、再读、再编辑。<toolUseInstructions>则规定了工具调用的格式:必须输出合法 JSON、必须包含所有必需属性、不要向用户暴露工具名、不要并行调用search_codebase、不要并行跑多个run_in_terminal。<editFileInstructions>管的是编辑纪律:不读文件不许编辑、编辑后必须调get_errors验证、不要打印代码块而是直接调edit_file。
工具表本身也值得看。edit_file、search_codebase、file_search、grep_search、read_file、list_dir、run_in_terminal、get_terminal_output、get_errors、get_changed_files,一共十个,外加一个multi_tool_use.parallel包装器。每个工具的参数都用 TypeScript 类型签名描述,比如read_file要求startLineNumberBaseZero和endLineNumberBaseZero,run_in_terminal要求command、explanation、isBackground。这套 schema 就是模型每次调用工具时要填的 JSON 模板。
那这套提示词和模型端点有什么关系?关系在于:Agent 模式每次“思考—调工具—看结果—再思考”都是一个完整的模型请求,请求里带着这段系统提示词和当前上下文。也就是说,Agent 模式对模型端点的调用频率远高于普通补全,一次任务可能触发十几次甚至几十次请求。如果你想让这些请求走统一的 Key 和通道,就需要在 settings 里把模型端点指过去。下面我就按这个思路,把 settings 改到 TaoToken 的完整过程写出来。
2. 把 Copilot Agent 的模型端点接到 TaoToken 的前置准备
在动 settings 之前,先把要用的东西备齐。TaoToken 在这里扮演的角色是统一 Key 和 API 通道:你不需要为每个模型单独配一套凭证,而是用一个 Key 走同一个 Base URL,模型 ID 在请求里指定。官网入口是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 根地址是 https://taotoken.net/api ,注意 API 地址后面不加 UTM 参数。
第一步是拿 Key。进控制台后创建 API Key,复制出来先存到安全的地方。这个 Key 后面要填进 settings 的apiKey字段。创建 Key 的页面在 https://taotoken.net/console/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite ,如果你还没账号,先在官网注册再进控制台。
第二步是确认模型 ID。Agent 模式对模型的能力有要求,因为它要输出结构化 JSON 来调工具,还要能处理多轮工具结果。选模型时优先选支持工具调用(function calling)的型号。你可以在模型对话页先试一下模型能不能正常返回,页面在 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。试的时候发一句“用 JSON 返回一个 edit_file 调用示例”,看它能不能给出合法结构。
第三步是确认你要改的是哪个 settings。GitHub Copilot 在不同编辑器里的配置位置不一样。VS Code 里 Copilot 的设置主要在settings.json,但 Agent 模式的模型端点并不总是直接暴露在用户 settings 里,很多时候它走的是 Copilot 自己的服务端配置。所以这里要分两种情况:一种是你用支持自定义 OpenAI 兼容端点的客户端(比如 Cline、Continue、或 Copilot 的 BYOK 场景),直接改客户端 settings;另一种是 Copilot 原生 Agent 模式,端点由官方托管,你改不了,但你可以用同样的提示词结构和工具协议,在支持自定义端点的客户端里复现 Agent 行为。
我实测下来,最稳的做法是:把 Copilot Agent 的提示词结构当作模板,在支持自定义 Base URL 的客户端里配置 TaoToken,然后用同样的工具调用链路验证。这样既保留了 Agent 的提示词设计,又能把端点统一到 TaoToken。下面第三节给的就是可复制的 settings 片段,覆盖 VS Codesettings.json和常见的 OpenAI 兼容客户端配置。
在准备阶段还要注意一点:Agent 模式会频繁调用run_in_terminal,如果你的客户端把终端工具映射到了真实 shell,要确保工作目录是测试项目而不是生产目录。这一点在提示词里没有强制约束,得靠你在客户端侧限制。
3. 可复制的 settings 配置片段与 Agent 触发步骤
这一节给具体配置。先看 VS Code 的settings.json。如果你用的是支持自定义端点的 Copilot 替代客户端,配置通常长这样,路径是用户目录下的.vscode/settings.json或工作区的.vscode/settings.json:
{ "copilotAgent.enabled": true, "copilotAgent.model": "gpt-4o", "copilotAgent.baseUrl": "https://taotoken.net/api", "copilotAgent.apiKey": "sk-你的TaoTokenKey", "copilotAgent.tools": [ "edit_file", "search_codebase", "read_file", "run_in_terminal", "get_errors" ], "copilotAgent.systemPromptFile": ".copilot/agent-system-prompt.md" }这里baseUrl填https://taotoken.net/api,apiKey填你从控制台拿的 Key,model填模型 ID。systemPromptFile指向你保存的 Agent 系统提示词文件,把第一节拆解的那段提示词存进去,客户端会在每次请求时带上。
如果你用的是 Cline 这类客户端,配置走的是另一套字段。Cline 的配置在cline_settings.json或界面里的 API Configuration:
{ "apiProvider": "openai", "openAiBaseUrl": "https://taotoken.net/api", "openAiApiKey": "sk-你的TaoTokenKey", "openAiModelId": "gpt-4o", "openAiUseAzure": false, "enableTools": true }Cline 的 MCP 工具配置单独放在mcp_settings.json,如果你要接 MCP 工具,记得 Base URL、Key、Model ID 三件套都要填全,缺一个就会报连接失败。
如果你用的是 Codex 风格的客户端,配置在auth.json:
{ "base_url": "https://taotoken.net/api", "api_key": "sk-你的TaoTokenKey", "model": "gpt-4o" }三件套同样是 Base URL、Key、Model ID。这里要提醒一句:不要把 MCP 直连到生产库,Agent 模式的终端工具权限很大,测试环境跑通再考虑别的。
配置写完后,触发 Agent 模式的步骤是:打开一个测试项目,在 Copilot Chat 里切到 Agent 模式(VS Code 里是 Chat 面板的模式选择器),然后输入一个需要多步操作的任务,比如“在 src/utils 下新增一个 formatDate 函数,并在 index.ts 里导出,然后跑一下 lint”。Agent 会先调search_codebase找相关文件,再调read_file读内容,然后调edit_file改文件,最后调run_in_terminal跑 lint。你可以在客户端的工具调用日志里看到每一步的请求都发往https://taotoken.net/api。
这里有个细节:Agent 模式触发后,第一次请求会带上完整系统提示词,后续每轮工具结果回来后的请求会带上历史消息。所以你在日志里会看到多个请求,但 Base URL 和 Key 是同一套。如果某一步报 401,说明 Key 没填对;如果报 model not found,说明 Model ID 写错了。
4. 用一次工具调用请求验证通道生效
配置改完不能只看“保存成功”,要实际发一次请求验证。最直接的验证方式是让 Agent 执行一个必然触发工具调用的任务,然后检查请求是否真的走了 TaoToken。
我试过的验证动作是这样:在测试项目里新建一个空文件test-agent.ts,然后在 Agent 模式里输入“读取 test-agent.ts 的内容,如果为空就写入一行 export const ok = true,然后检查有没有错误”。这个任务会依次触发read_file、edit_file、get_errors三个工具调用。
验证时看两个地方。第一是客户端的输出面板或日志,确认请求 URL 是https://taotoken.net/api而不是默认端点。第二是 TaoToken 控制台的用量页面,看有没有新的请求记录。如果两边都对上了,说明通道生效。
如果你想更直接地验证,可以用 curl 模拟一次工具调用请求。下面这个命令发一个带工具定义的请求,模型应该返回一个edit_file的 JSON 调用:
curl https://taotoken.net/api/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer sk-你的TaoTokenKey" \ -d '{ "model": "gpt-4o", "messages": [ {"role": "system", "content": "你是一名 AI 编程助手。使用工具时严格输出合法 JSON。"}, {"role": "user", "content": "在 src/index.ts 里把 foo 改成 bar"} ], "tools": [ { "type": "function", "function": { "name": "edit_file", "description": "编辑工作区文件", "parameters": { "type": "object", "properties": { "filePath": {"type": "string"}, "code": {"type": "string"}, "explanation": {"type": "string"} }, "required": ["filePath", "code", "explanation"] } } } ], "tool_choice": "auto" }'如果返回的choices[0].message.tool_calls里有edit_file且参数是合法 JSON,说明模型端点、Key、工具调用链路全部通了。这一步很关键,因为 Agent 模式的核心就是模型能不能正确输出工具调用 JSON。如果模型返回的是普通文本而不是tool_calls,要么是模型不支持 function calling,要么是请求里tools字段格式不对。
验证通过后,你可以在 Agent 模式里跑一个完整任务,观察多轮工具调用的稳定性。重点看search_codebase和run_in_terminal这两个工具,前者验证搜索链路,后者验证终端链路。如果终端工具报权限错误,检查客户端的终端配置,而不是端点配置。
5. 本篇常见报错排查
Agent 模式接自定义端点时,报错集中在几个地方。下面按真实报错对照排查。
401 Unauthorized。最常见的原因是 Key 没填对或填了带空格的字符串。检查apiKey字段是不是完整的sk-开头字符串,有没有多余换行。另一个原因是 Key 被禁用或额度用完,去控制台确认 Key 状态。如果用的是 Cline,注意openAiApiKey和openAiBaseUrl要同时填,只填一个会报 401。
local proxy failed / connection refused。这个报错通常出现在客户端试图走本地代理但代理没启动。检查客户端设置里有没有开启本地代理选项,如果有,关掉它,让请求直连https://taotoken.net/api。另外确认网络能正常访问该域名,可以用curl -I https://taotoken.net/api看返回状态。
reading choices 报错 / choices 字段为空。这通常是响应格式不符合客户端预期。检查请求里的model字段是不是客户端要求的格式,有些客户端要求模型 ID 带前缀。另外确认返回的 JSON 里choices数组非空,如果模型返回了错误信息,choices可能是空的。用第 4 节的 curl 命令单独测一次,看原始返回。
OAuth 相关报错。如果你用的是需要 OAuth 登录的客户端,注意 OAuth 和 API Key 是两套认证。接 TaoToken 时应该用 API Key 模式,不要走 OAuth。在客户端里把认证方式切成 API Key,填 Base URL 和 Key。
model not found。Model ID 写错了。去模型对话页确认可用模型列表,复制准确的 ID。注意大小写和连字符,gpt-4o和gpt4o不是一回事。
工具调用返回纯文本而不是 JSON。模型不支持 function calling,或者请求里tools字段没传。换一个支持工具调用的模型,并确认请求体里有tools数组和tool_choice字段。
Agent 不调用工具直接回答。系统提示词没生效。检查systemPromptFile路径是否正确,文件内容是否包含工具使用规范。如果客户端不支持外部提示词文件,把提示词直接写在系统消息里。
排查时建议按顺序来:先用 curl 验证端点和 Key,再验证模型返回工具调用,最后验证客户端配置。这样能把问题定位到具体环节,而不是在客户端里反复试。
6. 把 Agent 提示词和统一通道用起来
拆完 Copilot Agent 的系统提示词,你会发现它的设计思路很清晰:用身份约束管住输出风格,用工具规范管住调用格式,用编辑纪律管住文件操作。这套结构不依赖特定模型,你可以把它搬到任何支持工具调用的客户端里。把模型端点统一到 TaoToken 之后,Agent 的每次工具调用请求都走同一个 Base URL 和 Key,切换模型时只改 Model ID,不用重新配凭证。
如果你打算长期跑 Agent 任务,比如让 Agent 自动改多个文件、跑测试、修报错,建议用 Coding Plan,入口在 https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite 。它适合高频工具调用的场景,比按次请求更划算。接入文档在 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite ,里面有各客户端的配置示例。如果你只是想先验证模型能不能正确输出工具调用 JSON,用模型对话页就够了,地址是 https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=models&utm_campaign=rewrite 。
最后留一个实用技巧:Agent 模式的系统提示词里有一段“编辑后必须调 get_errors 验证”,这个习惯值得保留。你在自定义客户端里配工具时,把get_errors映射到真实的 lint 或编译检查,Agent 改完文件会自动验证,能省掉不少手动排查。另外search_codebase不要并行调用这条约束,在自定义实现里也要遵守,否则搜索结果会互相覆盖。把这些细节对齐,Agent 的行为就和原生体验接近了。