Tokio:Rust 异步编程的工业级基石
2026/7/8 4:03:36
请关注公众号【碳硅化合物AI】
AgentScope 的强大之处在于它的可扩展性。你可以添加新的模型、新的工具、新的智能体,甚至新的记忆系统。本文将深入分析框架的扩展机制,包括如何添加新模型、如何创建自定义工具、如何扩展智能体,以及扩展的最佳实践。通过阅读本文,你会理解框架的扩展点在哪里,如何正确实现扩展,以及如何避免常见的陷阱。无论你是想要集成新的模型提供商,还是想要创建领域特定的智能体,这篇文章都会为你提供清晰的指导。
AgentScope 提供了多个扩展点:
所有扩展点都基于抽象基类:
class ChatModelBase: """Base class for chat models.""" model_name: str stream: bool def __init__( self, model_name: str, stream: bool, ) -> None: self.model_name = model_name self.stream = stream @abstractmethod async def __call__( self, *args: Any, **kwargs: Any, ) -> ChatResponse | AsyncGenerator[ChatResponse, None]: passclass FormatterBase: """The base class for formatters.""" @abstractmethod async def format(self, *args: Any, **kwargs: Any) -> list[dict[str, Any]]: """Format the Msg objects to a list of dictionaries that satisfy the API requirements."""添加新模型需要实现三个组件:
工具扩展的流程:
根据贡献指南,添加新模型需要实现三个组件:
第一步:实现 ChatModelBase
fromagentscope.modelimportChatModelBase,ChatResponseclassYourChatModel(ChatModelBase):def__init__(self,model_name:str,api_key:str,stream:bool=True):super().__init__(model_name,stream)# 初始化你的 API 客户端self.client=YourAPIClient(api_key=api_key)asyncdef__call__(self,messages:list[dict],tools:list[dict]|None=None,tool_choice:str|None=None,**kwargs:Any,)->ChatResponse|AsyncGenerator[ChatResponse,None]:# 实现模型调用逻辑# 支持流式和非流式返回# 支持 tools APIifself.stream:asyncforchunkinself.client.stream(messages,tools):yieldChatResponse(...)else:response=awaitself.client.create(messages,tools)returnChatResponse(...)关键点:
ChatResponse对象第二步:实现 FormatterBase
fromagentscope.formatterimportFormatterBaseclassYourModelFormatter(FormatterBase):asyncdefformat(self,msgs:list[Msg],**kwargs:Any,)->list[dict[str,Any]]:# 将 Msg 对象转换为你的 API 所需格式formatted=[]formsginmsgs:formatted.append({"role":msg.role,"name":msg.name,# 如果 API 支持"content":self._convert_content(msg.content),})returnformatted关键点:
第三步:实现 TokenCounterBase(可选)
fromagentscope.tokenimportTokenCounterBaseclassYourTokenCounter(TokenCounterBase):defcount(self,text:str)->int:# 实现 token 计数逻辑returnyour_tokenizer.count(text)添加工具非常简单,只需要注册函数:
fromagentscope.toolimportToolkit toolkit=Toolkit()# 注册普通函数defmy_tool_function(query:str)->str:"""Tool function description. Args: query: The query string. Returns: The result string. """# 实现工具逻辑returnresult toolkit.register_tool_function(my_tool_function)# 注册异步函数asyncdefmy_async_tool(query:str)->str:"""Async tool function."""# 实现异步逻辑returnresult toolkit.register_tool_function(my_async_tool)# 注册流式函数asyncdefmy_streaming_tool(query:str)->AsyncGenerator[str,None]:"""Streaming tool function."""asyncforchunkinprocess_streaming(query):yieldchunk toolkit.register_tool_function(my_streaming_tool)Toolkit 会自动:
创建自定义智能体有两种方式:
方式一:继承 AgentBase
fromagentscope.agentimportAgentBasefromagentscope.messageimportMsgclassMyCustomAgent(AgentBase):asyncdefreply(self,msg:Msg|None=None)->Msg:"""实现自定义的回复逻辑"""# 你的自定义逻辑returnMsg(self.name,response,"assistant")方式二:继承 ReActAgentBase
fromagentscope.agentimportReActAgentBaseclassMyReActAgent(ReActAgentBase):asyncdef_reasoning(self,*args,**kwargs)->Msg:"""实现推理逻辑"""# 你的推理实现passasyncdef_acting(self,tool_call,*args,**kwargs):"""实现行动逻辑"""# 你的行动实现pass扩展记忆系统也很直接:
fromagentscope.memoryimportMemoryBasefromagentscope.messageimportMsgclassMyCustomMemory(MemoryBase):def__init__(self):super().__init__()# 你的存储实现(如数据库、文件等)self.storage=YourStorage()asyncdefadd(self,memories:Msg|list[Msg]|None)->None:"""实现添加记忆的逻辑"""# 你的实现passasyncdefget_memory(self)->list[Msg]:"""实现获取记忆的逻辑"""# 你的实现returnself.storage.get_all()扩展时,必须严格遵循基类的接口:
扩展应该:
扩展应该:
遵循框架的懒加载原则:
AgentScope 的扩展机制设计得非常灵活:
这些扩展点都遵循统一的接口设计,让扩展变得简单而强大。在下一篇文章中,我们会分析框架中使用的设计模式和架构决策,这些是理解框架设计精髓的关键。