news 2026/8/20 18:39:07

3步完成AI助手自定义工具开发:让Copilot for Xcode动手干活

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3步完成AI助手自定义工具开发:让Copilot for Xcode动手干活

3步完成AI助手自定义工具开发:让Copilot for Xcode动手干活

【免费下载链接】CopilotForXcodeAI coding assistant for Xcode项目地址: https://gitcode.com/GitHub_Trending/cop/CopilotForXcode

凌晨一点半,我的构建脚本又挂了。Copilot for Xcode 的AI助手在旁边只会说"我可以帮你分析",却什么忙都帮不上——直到我发现,它其实藏着一整套 AI助手自定义工具 系统,只是我从来没摸对门。

后来我把这个开源项目从里到外翻了一遍,又照着它写了一个专属工具,才回过味来:所谓"AI不会干活",多半不是模型不行,而是没人给它装手。🛠️

今天这篇,就把我怎么给它装上第一只"手"的过程原原本本讲给你听。想边看边动手的同学,可以先把仓库拉下来:git clone https://gitcode.com/GitHub_Trending/cop/CopilotForXcode

上面这张图是AI在Xcode里一步步干活的实拍,右侧模拟器跟着它的操作同步刷新——这就是"能干活"和"只会聊天"之间的鸿沟。

深夜崩溃,我对着只会聊天的AI干瞪眼

那天晚上的报错,长得能绕屏幕一圈。我试着让AI去终端重跑一遍、把报错抓回来分析,它回我一句:"我建议你手动运行以下命令……"

手动?我要是想手动,还要它干嘛。

第二天找同事吐槽,他丢过来一句话:"你去看看项目里那个 ToolCalls 目录。"我顺着这条线摸进去,才发现自己一直在门外转悠。

原来AI的"手"都藏在这个目录里

Core/Sources/ChatService/ToolCalls/这层目录,就是所有"手"的家。跑终端的、建文件的、抓网页的、收集报错的,一应俱全:RunInTerminalToolCreateFileToolFetchWebPageToolGetErrorsTool……

它们长相统一,都遵循同一个协议ICopilotTool。这个协议只规定一件事:怎么接请求、怎么把结果还回去。

public protocol ICopilotTool { func invokeTool( _ request: InvokeClientToolRequest, completion: @escaping (AnyJSONRPCResponse) -> Void, contextProvider: ToolContextProvider? ) -> Bool }

这段代码解决的是"工具的统一长相"。你只要盯住completion这个回调:工具干完活,必须经由它把结果送回对话,AI才知道是成功了还是报错了。

换句话说,实现这一个方法,你就给AI装上了一只新手。🔍

第一关:照着"写文件"这只手抄作业

光看协议不过瘾。我们拿CreateFileTool当范本拆一遍,它的活儿其实就四步:校验参数、防覆盖、建目录写文件、把结果回报给AI。

guard let filePath = input["filePath"]?.value as? String, let content = input["content"]?.value as? String else { completeResponse(request, status: .error, response: "Invalid parameters", completion: completion) return true } let fileURL = URL(fileURLWithPath: filePath) try FileManager.default.createDirectory( at: fileURL.deletingLastPathComponent(), withIntermediateDirectories: true, attributes: nil) try content.write(to: fileURL, atomically: true, encoding: .utf8)

这段在解决"AI说建文件,怎么真的建出来"。第一行的guard是守门员,参数不齐直接报错返回,别让AI瞎写;中间那行createDirectory会自动补出父目录——新手工具十有八九就挂在"路径的爸爸不存在"这种破事上。

顺带一提,作者还留了个贴心小动作:文件建好之后会自动调用 Xcode 打开,让你一眼看到成果。💡

第二关:给它"挂号",AI才知道你有这只手

工具写好了不注册,等于没写。项目里有个CopilotToolRegistry注册表,初始化时把所有工具塞进一个字典,AI按名字来取。

tools[ToolName.createFile.rawValue] = CreateFileTool()

就这一行,工具就"上架"了。工具名也都定义在ToolNames.swift的枚举里,给AI看的不是类名,而是create_filerun_in_terminal这种下划线小名。

第三关:别让工具一崩到底

我第一次自己写工具时,天真地以为"能跑就行",结果AI建文件建到一半告诉我失败了,又说不清为啥。翻完项目里的范本我才学乖:一只称职的"手",至少要有三道保险。

写之前先查文件在不在,在就拒绝,免得覆盖;所有文件操作包进do-catch,失败要带上原因回话;写完再读一遍校验,确认没写歪。每一步出错,AI收到的都是一条带原因的报错,而不是一个冷冰冰的 false。

还有件容易被忽略的事:让AI跑终端、写文件都属于"有风险"操作。项目在ToolCalls/AutoApproval/下备好了一整套审批机制,敏感动作要不要弹窗让你确认,可以按自己的习惯配置。

上图是Xcode的扩展授权界面。勾选 GitHub Copilot 之后,你的自定义工具才有资格操作编辑器——权限没给够,再好的工具也只能回你一句"权限不足"。

想更顺手,还有两个小台阶

工具不是孤岛。ToolContextProvider这个上下文提供者,能让工具拿到当前打开的工作区路径、往聊天历史里追加执行记录,还能把"我改了哪些文件"实时同步给AI。RunInTerminalTool就是靠它定位到你正在开发的项目目录,命令才不会跑错地方。

再往上走,项目的设置界面里还有个内置工具列表(BuiltInToolsListView),支持搜索、开关,还能按 Agent 模式单独配置。等你的工具多了,就知道这个入口多省心了。

想让AI干活?先把手给它

那天凌晨的事,最后以我给AI"加装"了一个跑测试的自定义命令收场。现在它一看到报错,就自己开终端重跑、抓回输出、逐行分析,一气呵成。

要不要也给 AI 加一条自定义命令试试?让它自动格式化代码,或者一键跑完单元测试。等你折腾完那一刻,大概也会和我一样,觉得那句"我建议你手动运行"特别可笑。

【免费下载链接】CopilotForXcodeAI coding assistant for Xcode项目地址: https://gitcode.com/GitHub_Trending/cop/CopilotForXcode

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/20 18:35:41

5个高频难题讲透Dify语音交互实战:30分钟让应用会听会说

5个高频难题讲透Dify语音交互实战:30分钟让应用会听会说 【免费下载链接】dify Build Agentic workflows, RAG pipelines, with rich AI model and tool support on one collaborative workspace. Deploy on cloud, VPC, or self-hosted, so teams move from protot…

作者头像 李华
网站建设 2026/8/20 18:30:15

嵌入式C语言位运算实战:从寄存器操作到算法优化的核心技巧

这次我们来看嵌入式开发中一个基础但极其重要的技术点:位运算。对于嵌入式程序员来说,位运算不是一道简单的面试题,而是直接关系到代码效率、内存占用和硬件寄存器操作的核心技能。无论是控制一个LED灯的亮灭,还是解析复杂的传感器…

作者头像 李华
网站建设 2026/8/20 18:25:59

PDF补丁丁书签批量替换实操指南:如何一次改完整个PDF目录

PDF补丁丁书签批量替换实操指南:如何一次改完整个PDF目录 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等等 项目地址: https:/…

作者头像 李华