AI 智能体技能:面向 Delphi、C++Builder 和 .NET
您的 AI 助手从未读过 eSeGeCe 的源码,于是它会凭空捏造并不存在的属性,还会把组件放进错误的单元。智能体技能为它提供每个库真实的公开 API。免费,MIT 许可,一行命令即可安装。
您的 AI 助手从未读过 eSeGeCe 的源码,于是它会凭空捏造并不存在的属性,还会把组件放进错误的单元。智能体技能为它提供每个库真实的公开 API。免费,MIT 许可,一行命令即可安装。
让助手用 Delphi 写一个 WebSocket 客户端,您得到的会是一段结构工整、却在细节上出错的代码。原因不是模型粗心,而是模型从未见过这个库。
这些模型学的是公开代码。eSeGeCe 组件是商业产品,其源码从未进入任何训练集。模型认得出 Delphi 组件库的样子,剩下的部分就用它熟悉的其他库来填补。由此产生了四类错误,而这四类错误让您付出的代价完全一样:花上二十分钟,去找出那行看似合理、实则写错的代码。
一个属性或事件,读起来就像是我们会写的东西,可它并不存在。第一个告诉您真相的,是编译器。
组件是真的,uses 子句却不是。这是生成的 sgcWebSockets 代码编译失败最常见的单一原因。
只要模型见过某个旧示例的片段,它就会照搬一个我们早已改名或移除的方法。
在我们这里能编译、在您那里却不能的代码,因为它用到的组件需要您的授权并未包含的版本类型。
技能不是会运行的插件,也不是在什么数据上训练出来的模型。它就是一个装着 Markdown 的文件夹,其机制刻意保持简单。
每个技能都以几行 frontmatter 开头,而智能体始终摆在眼前的只有 description。它用平实的语言说明该技能覆盖哪个库、哪个主题领域。
这正是开销得以保持低廉的原因。当您问的是不相干的问题时,您的智能体不必随身背着成千上万行 API 参考。
---
name: sgcwebsockets-mq
description: Use when connecting Delphi or
C++Builder code to a message broker with
sgcWebSockets: MQTT, STOMP including
RabbitMQ and ActiveMQ, AMQP 0.9.1, AMQP
1.0, Kafka and WAMP2.
compatibility: Requires Delphi 7 to Delphi
13, or C++Builder 2007 to 13.
---
当您问起 MQTT 消息代理时,那段描述匹配上了,智能体便载入消息代理技能。其他技能一概不打开。改问 WebRTC,加载的就是另一个技能。
在技能内部,它的浏览方式和您一样:先看组件索引找到组件,再看该组件的 API 页面,然后翻到某个它需要取值的选项类的类型页面。
sgcwebsockets-mq/
SKILL.md
reference/
components-index.md
api/TsgcWSPClient_MQTT.md
types/TsgcWSMQTTLWT_Options.md
examples/TsgcWSPClient_MQTT.md
concepts/overview.md
API 页面不是手写的。每次发布时,生成器都会解析整个库,并导出其 public 和 published 表面:每个组件及其属性、方法和事件,它所在的单元,包含它的版本类型,以及这些成员所使用的类型。
因此技能描述的正是您手上的那个版本。它们不会像手工维护的文档那样逐渐失准,上个月新增的组件,在发布当天就已经写进技能。
unit: sgcWebSocket_Protocols
Edition: Standard
| Delphi | Type |
| `Client: TsgcWebSocketClient` | ... |
| `MQTTVersion: TwsMQTTVersion` | ... |
| `LastWillTestament: ...` | ... |
生成的表格能告诉智能体存在哪些东西。它们不会告诉它协议组件本身并不拥有套接字,它要挂接到一个传输客户端上,也不会告诉它连接 1883 端口的代理需要把 Specifications.RFC6455 设为 False。
所以每个技能都以一份行动手册开头,由亲手写出这个库的人撰写:何时该用它,动笔写代码之前该先问您什么,以及那些真正会把人绊倒的错误。
## Things that catch people out
- Setting Active = true on the protocol
component does nothing useful. The
transport client owns the connection.
- One transport carries one protocol.
- MQTT has two heartbeats, and they are
different mechanisms with the same name.
有三种智能体可以直接安装插件。其余的读取一个文件夹,您把技能复制进去即可。此后无需调用任何东西:何时该用哪个技能,由智能体自行判断。
/plugin marketplace add esegece-com/agent-skills
/plugin install sgcwebsockets-delphi@esegece
市场只需添加一次,之后您用到多少插件就装多少。/skills 会列出当前生效的技能。日后再安装第二个产品时,不必重复添加市场这一步。
codex plugin marketplace add esegece-com/agent-skills
codex plugin add sgcwebsockets-delphi@esegece
codex plugin list
Codex 用的是 plugin add 而不是 plugin install,市场名称则相同。
克隆仓库,然后把您需要的技能文件夹从 plugins/<plugin>/skills/ 复制到智能体所监视的目录中。工程级优先于全局级,因此放进某个仓库里的技能只对该工程生效。
| 智能体 | 工程内 | 全局 |
|---|---|---|
| Claude Code | .claude/skills/ | %USERPROFILE%\.claude\skills\ |
| GitHub Copilot | .github/skills/ | %USERPROFILE%\.copilot\skills\ |
| Cursor | .cursor/skills/ | |
| Codex CLI | .agents/skills/ | |
| JetBrains Junie | .junie/skills/ | %USERPROFILE%\.junie\skills\ |
上述 Copilot 路径同样会被 Visual Studio、VS Code 和 Copilot CLI 读取。在 VS Code 中,请启用 "Chat: Use Agent Skills" 设置,或者从命令面板运行 "Chat: Install Plugin From Source" 并填入仓库地址。
区别不在于助手变聪明了,而在于它不再对我们的库瞎猜。
成员取自生成的 API,而不是靠形似推测,因此答案里出现的属性和事件,正是该组件真正公开的那些。
每个 API 页面都写明组件所在的单元,对 .NET 则写明唯一的命名空间。仅此一项,就消除了最常见的编译失败。
每个组件都标注了所需的最低版本类型,因此在您动手写代码之前,助手就能告诉您某个组件需要企业版。
技能会明确说明哪些部分有文档。当助手找不到某个枚举时,它得到的指示是向您询问,而不是编造一个看起来没错的常量。
每个示例都提炼自随产品发布的演示程序,只保留与该组件相关的部分,而不是整个窗体。
每次发布都从源码重新生成。新组件在发布当天就有文档,被移除的组件也在同一天消失。
按主题拆分意味着一个 MQTT 问题只会载入消息代理技能,一个 222 个组件的库,其余部分不会挤进对话。
采用 MIT 许可,完全公开。您可以先装上它们来评估这个库,之后再决定是否购买,也可以把它们当作独立的文档来读。
每个产品一个插件;至于 sgcWebSockets,则是一个包含多个主题技能的插件,而不是一个庞大的技能。
| 插件 | 技能数 | 覆盖内容 |
|---|---|---|
sgcwebsockets-delphi | 18 | WebSocket 核心、消息代理、sgc 子协议、交易所行情、AI 与 LLM、服务集成、HTTP 与传输层、身份验证、P2P 与 WebRTC、IoT,以及六个 sgcHTML 控件技能 |
sgcwebsockets-dotnet | 7 | 从 C# 使用同一个库,并附有下文所述的覆盖情况页面 |
sgcsign-delphi | 1 | XAdES、PAdES、CAdES、Authenticode、RFC 3161 时间戳、OCSP 以及各类密钥提供程序 |
sgcopenapi-delphi | 1 | OpenAPI 解析器、SDK 生成器和服务器组件 |
sgcindy-delphi | 1 | 定制版 Indy TCP/IP 实现 |
sgcbiometrics-delphi | 1 | Windows Hello、指纹和人脸身份验证 |
这个库注册了 222 个组件。用一个技能覆盖全部组件,会迫使智能体为了回答一个关于某个协议的问题而打开整个库,既慢,也让答案变差而不是变好。
所以它按领域做了拆分。每个技能都小到可以完整读完,又具体到能被正确选中;同时还有一个总索引,负责回答“我需要哪个组件”,并把问题引到正确的技能上。
已发布的 .NET 程序集,公开了 Delphi 库所注册的 222 个组件中的 70 个。与其让助手即兴发挥出一套并不存在的 C# API,我们宁愿把话说明白。
因此 .NET 插件附带一份生成的覆盖情况页面,逐一列出仅 Delphi 才有的那 152 个组件,以及每个组件所在的单元。它由构建时比对两个产品得出,因此描述的是您手上的构建,而不是某种设想。
这一点值得说清楚,因为“安装这个插件”确实会让人合理地想知道它到底做了什么。
技能就是 Markdown。它里面没有代码,不会在您的机器上运行任何东西,安装它也不会改动您的工程。
没有遥测,不回传,也不记录您问了什么。我们并不知道您装了它们,文件一旦复制到本地即可离线使用。
只包含 public 和 published 表面。方法体、private 字段和 protected 成员都被生成器排除在外,因此安装技能不会把我们的实现放到任何人的磁盘上。
仓库采用 MIT 许可,您可以自由复制、fork 并改造它的结构。一份 NOTICE 文件保留了文档内容本身的权利,这部分仍归我们所有。
不需要。它们是公开且免费的。它们描述的是 API,而不包含库本身,因此在购买任何东西之前,您都可以读它们来判断某个组件是否满足您的需要。
通常不必。智能体会拿您的问题与各技能的描述做匹配,并加载合适的那个。如果您想强制指定,Claude Code 用 /,Copilot Chat 用 #,后面接技能名称。
重新运行安装命令即可。如果您当初是手动复制文件夹的,就用新的覆盖旧的。每个技能是从哪个版本生成的,都写在它的 frontmatter 里,因此您随时都能看出自己读的是哪个构建。
通常是您和它用的构建版本不同。每个技能都带有 reference/history.md,其中列出了每个版本的变更,这是判断某个成员是否在您的版本之后才出现的最快办法。
可以,只要它会读取某个 skills 或 instructions 文件夹。这些内容就是普通的 Markdown,不含任何针对特定智能体的语法,因此把任何工具指向该文件夹都能用。上表中的五个目录,只不过是常见智能体各自采用的约定。
那就是文档缺陷,我们希望知道。请在 GitHub 上提交 issue,或使用我们的联系表单。请告诉我们您问了什么、又得到了什么答案,这两者都很有用。