本节摘要:框架覆盖不到的场景,需要按需扩展。本节讲四个扩展方向:接入自定义模型、扩展工具、集成自定义知识库、创建自定义 Agent 类型,并给出扩展设计的原则——优先用官方扩展点,不轻易改框架内核。
阅读完本节,你应当能够:
内置模型列表覆盖了主流厂商,但公司内部自研模型、特殊协议的服务怎么办?内置工具满足通用需求,但业务系统的私有接口呢?Agno 的设计留好了扩展口:模型、工具、知识库、Agent 四类扩展点,按官方约定接进去,框架不认识你的业务,但认识你的扩展。
💡 关键直觉:先找官方扩展点,再想改内核。Agno 的扩展点就是为"接你的东西"设计的;改框架源码意味着升级地狱,能不动内核就不动。
from agno.models import Model class MyCompanyModel(Model): """公司自研模型接入 Agno。""" def __init__(self, api_key: str): super().__init__(id="my-model") self.api_key = api_key # 实现模型调用接口:把 Agno 的请求翻译成自研服务的调用 def invoke(self, messages, **kwargs): # 调用公司模型服务,返回标准回复结构 return self._call_my_service(messages)
接入后即可当普通模型用:Agent(model=MyCompanyModel(api_key=...))。实现要点:按接口契约返回框架期望的结构,docstring 写清输入输出。
from agno.tools import tool @tool def query_internal_api(order_id: str) -> dict: """查询内部订单系统的订单状态。 参数: order_id: 订单号,如 A20260001 返回: dict: 含 status 与 detail 的订单信息 """ # 调用内部订单服务 return internal_service.get_order(order_id)
自定义工具覆盖业务接口:鉴权、日志、异常处理都封装在函数里。docstring 写清参数与返回,模型才能正确调用。
from agno.knowledge import KnowledgeBase class InternalKB(KnowledgeBase): """接入公司内部文档系统。""" def retrieve(self, query: str, top_k: int = 5): # 调用公司检索服务,返回相关片段 return internal_search(query, top_k=top_k)
自有检索能力(公司搜索、Elasticsearch)可以这样接入:实现检索接口,Agno 的 RAG 流程就会调用你的检索,而不是默认的向量库。
from agno.agent import Agent class SupportAgent(Agent): """封装售后场景的智能体模板。""" def __init__(self, **kwargs): super().__init__( name="support", description="处理售后问题的客服智能体", instructions=["先确认订单,再给方案", "超时转人工"], **kwargs, )
把"售后智能体"的通用配置沉淀成类,团队内复用,改一处全局生效。这是业务层定制最常见的形式。
| 检查项 | 说明 |
|---|---|
| 用官方扩展点 | 不碰框架内核 |
| 接口契约清晰 | 输入输出符合框架期望 |
| docstring 完整 | 模型能理解工具/模型用法 |
| 异常有兜底 | 扩展失败有降级 |
| 版本兼容 | 升级框架后扩展仍可用 |
⚠️ 常见坑:扩展接入后"静默失败"——自定义模型/工具报错被吞掉,智能体照常回复但内容不对。给扩展加日志与异常显式抛出,任何失败都要让开发者看见,别让错误藏进回答里。
框架的扩展面收敛在四个点上,每个都有原始资料的实例背书。
定制模型:模型抽象层开放自定义接入。示例演示了从现成商用模型切到托管在推理服务上的开源模型(如 FLAN-T5 一系):模型类指向自定义端点,Agent 其余代码一字不改。私有化部署、内网-only 场景全靠这个口子。
扩展工具:自定义工具就是普通 Python 类,暴露给智能体的方法带上清晰的描述文本,模型读描述决定何时调用。描述写得好坏直接决定调用准确率——这是自定义工具最容易被轻视的一环。
自定义知识源:除了 PDF,JSON 等数据格式也能通过对应源类导入向量库(资料里的示例是把 JSON 数据清洗后入库)。企业散落在数据库、接口、表格里的知识,做一个源适配就能统一进检索体系。
自定义智能体类型:把一组固定配置(模型、工具、指令、知识库)封装成自己的类,比如资料示例中的客服智能体类。团队要在多个项目里复用同一种角色时,类化封装比每次复制参数干净得多。
Agno 扩展面 ┌────────────┼────────────┐ 模型层 工具层 知识层 自定义端点 自定义类 自定义 Source 私有化部署 内部接口 库表/接口数据 └──── 智能体层:类型化封装复用 ────┘
四个扩展点都简单,难的是管住扩展欲。三条纪律:其一,扩展为了复用而不是炫技,一个项目只出现一次的逻辑不值得抽象;其二,工具描述与源适配都要有测试,它们是智能体与外部世界的接缝,接缝渗水最隐蔽;其三,自定义类里显式声明依赖与默认值,让下一个使用者看构造签名就懂怎么配。
| 扩展点 | 何时动它 | 交付物 |
|---|---|---|
| 模型 | 内网部署、成本或合规要求 | 指向自建端点的模型类 |
| 工具 | 要接内部系统或专有数据 | 带清晰描述的工具类 |
| 知识源 | 知识在库表、接口、表格里 | 对应格式的 Source 适配 |
| 智能体类型 | 角色配置要多处复用 | 封装好的子类 |
⚠️ 常见坑:自定义工具上线前没做权限最小化。智能体是会"自主决定"调用什么的,给它一个能删数据的工具,某天模型就会替你删数据。只暴露只读或幂等接口,写操作留在人工审批后面。
自定义组件写完只是半程,另一半是让它可持续。四类扩展各有各的测法:自定义模型的测试用固定问题集对比输出质量与延迟基线,端点迁移后跑一遍就知道退化没有;自定义工具的测试分两层,单元层验证输入输出的映射,集成层验证"模型会不会正确地调用它"——后者常被忽略,工具本身没错但描述写得差导致模型不用或误用,是最常见的"隐性故障";自定义知识源的测试核心是数据一致性,入库块数与源文档规模对得上、抽样块的内容与原文吻合;自定义智能体类型的测试就是配置快照——把构造参数固化成断言,别人改动时立刻发现。
演进方面给一条原则:扩展层与使用层分离。自定义的模型类、工具类、源类集中在一个独立模块里维护,业务代码只 import 不实现。框架升级时改动被圈在扩展模块内,回归测试也只需要覆盖这一个角落。团队规模变大后,这个模块还可以抽成内部共享包,多个项目的智能体共用同一套扩展,维护成本被进一步摊薄。
最后是版本纪律:扩展代码从第一天起就标注"基于哪个框架版本开发与验证",升级框架时先看扩展点有没有变更记录,再跑回归。这套流程建立后,"框架迭代快"就从风险变成了可以按节奏吸收的日常。
有这个风险。Agno 迭代快,扩展点虽然稳定,接口细节偶有调整。对策是扩展代码集中放、依赖版本锁定、升级前跑一遍回归测试集,把升级从"惊喜"变成例行公事。
按框架的模型抽象接口实现:接收消息与参数、返回统一格式的结果。功能上先保文本问答可用,流式与工具调用按需补齐,不必一步到位。
可以且推荐。内置工具打底、自定义工具补业务缺口、模型按角色混搭——扩展的意义就是把框架长成你组织的样子,而不是重造一遍。
实际的定制项目里,四个扩展点很少单独出现,常见三种组合形态。形态一是"私有化全家桶":自定义模型(内网端点)加自定义知识源(内部数据库导出),服务数据不能出域的组织——技术上是两个扩展点的拼装,组织上是一次合规改造,扩展代码反而最简单。形态二是"业务深化型":围绕一个业务域沉淀一整套自定义工具与智能体类型,比如供应链域的查询库存、跟踪物流、核对单据三件套,封装成领域智能体类后,新应用一行构造即得全套能力——这是扩展复利最丰厚的形态。形态三是"平台嫁接型":把智能体作为能力模块嵌入既有系统,扩展点主要在工具层对接现有服务总线与权限体系,重点功课是身份传递与审计对齐。
三种形态的共性启示:扩展的终极目的不是"让框架更强大",而是让组织的能力以组件形式沉淀与流转。写到这一层,你交付的已经不只是智能体应用,而是一套可继承的技术资产——这也是"会用框架"与"会做工程"之间真正的分界线。
自定义组件还有一个常被省略的义务:写文档。不是给别人看的面子工程,是给三个月后的自己。最低配置三段:这段扩展解决什么问题(没有它时会怎样)、依赖哪些外部服务与版本、已知边界与失败模式。配上一个最小使用示例,齐活。团队里扩展组件的扩散速度常快于预期——你为项目甲写的工具,半年后会出现在项目丙的配置里,届时文档就是唯一能阻止"以其昏昏使人昭昭"的东西。把"写扩展必写文档"当成完成的定义的一部分,是定制开发走向工程化的最后一厘米。
至此,框架的四个扩展点与配套纪律都已就位。你手里不再只是一个框架,而是一块可以按组织形状生长的底座——这也是"定制开发"四个字的完整含义:定制的对象从来不止是代码,还有你团队的协作方式与资产结构。
高级能力全部就位。第 4 章用四个真实案例检验——客服、内容创作、投顾、生产力工具。