靖奇 發表於 2025-4-16 14:33:00

Python A2A: Google 的智能体到智能体协议的全面指南

<p><span style="font-size: 1.5em">简介</span></p>
<p>Python A2A 是 Google 的智能体到智能体 (Agent-to-Agent, A2A) 协议的实现,旨在标准化 AI 智能体之间的通信。该协议解决了 AI 生态系统中的一个主要挑战:使不同的 AI 服务能够无需自定义转换层即可无缝通信。</p>
<p>随着 AI 领域分化为各种专业服务,每种服务都有自己的 API 格式和参数,开发人员花费过多时间构建通信基础设施,而不是专注于 AI 逻辑。Python A2A 通过提供一种标准化的方式让 AI 智能体互相交流,解决了这个问题,无论它们的底层实现如何。</p>
<h2 id="1" data-heading="true">Python A2A 入门</h2>
<h3 id="2" data-heading="true">安装</h3>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-bash"><span class="hljs-comment">#&nbsp;基本安装<br>pip&nbsp;install&nbsp;python-a2a<br><br><span class="hljs-comment">#&nbsp;用于&nbsp;OpenAI&nbsp;集成<br>pip&nbsp;install&nbsp;<span class="hljs-string">"python-a2a"<br><br><span class="hljs-comment">#&nbsp;用于&nbsp;Anthropic&nbsp;Claude&nbsp;集成<br>pip&nbsp;install&nbsp;<span class="hljs-string">"python-a2a"<br><br><span class="hljs-comment">#&nbsp;安装所有可选依赖<br>pip&nbsp;install&nbsp;<span class="hljs-string">"python-a2a"</span></span></span></span></span></span></span></code></span></pre>
<h2 id="3" data-heading="true">核心概念</h2>
<p>Python A2A 实现了 A2A 协议的几个关键概念:</p>
<ol>
<li>1.&nbsp;<strong>消息结构</strong>:定义了文本、函数调用和响应的格式</li>
<li>2.&nbsp;<strong>对话线程</strong>:支持在多次交互中维护上下文</li>
<li>3.&nbsp;<strong>函数调用</strong>:智能体暴露和调用函数的标准化方式</li>
<li>4.&nbsp;<strong>错误处理</strong>:一致的错误格式</li>
</ol>
<h2 id="4" data-heading="true">构建您的第一个 A2A 智能体</h2>
<p>让我们从一个简单的回声智能体开始,它会响应消息:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;A2AServer,&nbsp;Message,&nbsp;TextContent,&nbsp;MessageRole,&nbsp;run_server<br><br><span class="hljs-keyword">class&nbsp;<span class="hljs-title class_">EchoAgent(<span class="hljs-title class_ inherited__">A2AServer):<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">"""一个简单的智能体,用前缀回显消息。"""<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">def&nbsp;<span class="hljs-title function_">handle_message(<span class="hljs-params">self,&nbsp;message):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;message.content.<span class="hljs-built_in">type&nbsp;==&nbsp;<span class="hljs-string">"text":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(text=<span class="hljs-string">f"Echo:&nbsp;<span class="hljs-subst">{message.content.text}"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_message_id=message.message_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=message.conversation_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><br><span class="hljs-comment">#&nbsp;运行服务器<br><span class="hljs-keyword">if&nbsp;__name__&nbsp;==&nbsp;<span class="hljs-string">"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;agent&nbsp;=&nbsp;EchoAgent()<br>&nbsp;&nbsp;&nbsp;&nbsp;run_server(agent,&nbsp;host=<span class="hljs-string">"0.0.0.0",&nbsp;port=<span class="hljs-number">5000)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<p>现在,让我们创建一个客户端来与我们的智能体交流:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;A2AClient,&nbsp;Message,&nbsp;TextContent,&nbsp;MessageRole<br><br><span class="hljs-comment">#&nbsp;创建一个客户端来与我们的智能体交流<br>client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5000/a2a")<br><br><span class="hljs-comment">#&nbsp;发送消息<br>message&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(text=<span class="hljs-string">"Hello,&nbsp;is&nbsp;this&nbsp;thing&nbsp;on?"),<br>&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>)<br>response&nbsp;=&nbsp;client.send_message(message)<br><br><span class="hljs-comment">#&nbsp;打印响应<br><span class="hljs-built_in">print(<span class="hljs-string">f"Agent&nbsp;says:&nbsp;<span class="hljs-subst">{response.content.text}")</span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="5" data-heading="true">智能体之间的函数调用</h2>
<p>A2A 的强大功能之一是标准化的函数调用。这是一个提供数学函数的计算器智能体:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">import&nbsp;math<br><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;A2AServer,&nbsp;Message,&nbsp;TextContent,&nbsp;FunctionCallContent,<br>&nbsp;&nbsp;&nbsp;&nbsp;FunctionResponseContent,&nbsp;FunctionParameter,&nbsp;MessageRole,&nbsp;run_server<br>)<br><br><span class="hljs-keyword">class&nbsp;<span class="hljs-title class_">CalculatorAgent(<span class="hljs-title class_ inherited__">A2AServer):<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">"""提供数学计算函数的智能体。"""<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">def&nbsp;<span class="hljs-title function_">handle_message(<span class="hljs-params">self,&nbsp;message):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;message.content.<span class="hljs-built_in">type&nbsp;==&nbsp;<span class="hljs-string">"text":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">"我是一个计算器智能体。你可以调用我的函数:\n"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">"-&nbsp;calculate:&nbsp;基础算术&nbsp;(operation,&nbsp;a,&nbsp;b)\n"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">"-&nbsp;sqrt:&nbsp;平方根&nbsp;(value)"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_message_id=message.message_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=message.conversation_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">elif&nbsp;message.content.<span class="hljs-built_in">type&nbsp;==&nbsp;<span class="hljs-string">"function_call":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function_name&nbsp;=&nbsp;message.content.name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params&nbsp;=&nbsp;{p.name:&nbsp;p.value&nbsp;<span class="hljs-keyword">for&nbsp;p&nbsp;<span class="hljs-keyword">in&nbsp;message.content.parameters}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;function_name&nbsp;==&nbsp;<span class="hljs-string">"calculate":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;operation&nbsp;=&nbsp;params.get(<span class="hljs-string">"operation",&nbsp;<span class="hljs-string">"add")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;<span class="hljs-built_in">float(params.get(<span class="hljs-string">"a",&nbsp;<span class="hljs-number">0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b&nbsp;=&nbsp;<span class="hljs-built_in">float(params.get(<span class="hljs-string">"b",&nbsp;<span class="hljs-number">0))<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;operation&nbsp;==&nbsp;<span class="hljs-string">"add":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;a&nbsp;+&nbsp;b<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">elif&nbsp;operation&nbsp;==&nbsp;<span class="hljs-string">"subtract":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;a&nbsp;-&nbsp;b<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">elif&nbsp;operation&nbsp;==&nbsp;<span class="hljs-string">"multiply":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;a&nbsp;*&nbsp;b<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">elif&nbsp;operation&nbsp;==&nbsp;<span class="hljs-string">"divide":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;b&nbsp;==&nbsp;<span class="hljs-number">0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">raise&nbsp;ValueError(<span class="hljs-string">"不能除以零")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;a&nbsp;/&nbsp;b<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">raise&nbsp;ValueError(<span class="hljs-string">f"未知操作:&nbsp;<span class="hljs-subst">{operation}")<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=FunctionResponseContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=<span class="hljs-string">"calculate",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response={<span class="hljs-string">"result":&nbsp;result}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_message_id=message.message_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=message.conversation_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">elif&nbsp;function_name&nbsp;==&nbsp;<span class="hljs-string">"sqrt":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;=&nbsp;<span class="hljs-built_in">float(params.get(<span class="hljs-string">"value",&nbsp;<span class="hljs-number">0))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;value&nbsp;&lt;&nbsp;<span class="hljs-number">0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">raise&nbsp;ValueError(<span class="hljs-string">"不能计算负数的平方根")<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;math.sqrt(value)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=FunctionResponseContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=<span class="hljs-string">"sqrt",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response={<span class="hljs-string">"result":&nbsp;result}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_message_id=message.message_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=message.conversation_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">except&nbsp;Exception&nbsp;<span class="hljs-keyword">as&nbsp;e:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=FunctionResponseContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=function_name,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response={<span class="hljs-string">"error":&nbsp;<span class="hljs-built_in">str(e)}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_message_id=message.message_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=message.conversation_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><br><span class="hljs-keyword">if&nbsp;__name__&nbsp;==&nbsp;<span class="hljs-string">"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;agent&nbsp;=&nbsp;CalculatorAgent()<br>&nbsp;&nbsp;&nbsp;&nbsp;run_server(agent,&nbsp;host=<span class="hljs-string">"0.0.0.0",&nbsp;port=<span class="hljs-number">5001)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<p>以下是如何调用计算器智能体的函数:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;A2AClient,&nbsp;Message,&nbsp;FunctionCallContent,<br>&nbsp;&nbsp;&nbsp;&nbsp;FunctionParameter,&nbsp;MessageRole<br>)<br><br>client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5001/a2a")<br><br><span class="hljs-comment">#&nbsp;创建一个函数调用消息<br>function_call&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;content=FunctionCallContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=<span class="hljs-string">"calculate",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameters=[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FunctionParameter(name=<span class="hljs-string">"operation",&nbsp;value=<span class="hljs-string">"add"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FunctionParameter(name=<span class="hljs-string">"a",&nbsp;value=<span class="hljs-number">5),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FunctionParameter(name=<span class="hljs-string">"b",&nbsp;value=<span class="hljs-number">3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]<br>&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>)<br><br>response&nbsp;=&nbsp;client.send_message(function_call)<br><br><span class="hljs-keyword">if&nbsp;response.content.<span class="hljs-built_in">type&nbsp;==&nbsp;<span class="hljs-string">"function_response":<br>&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;response.content.response.get(<span class="hljs-string">"result")<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;result&nbsp;<span class="hljs-keyword">is&nbsp;<span class="hljs-keyword">not&nbsp;<span class="hljs-literal">None:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">f"Result:&nbsp;<span class="hljs-subst">{result}")&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;输出:&nbsp;Result:&nbsp;8</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="6" data-heading="true">基于 LLM 的智能体</h2>
<p>Python A2A 包含了与流行 LLM 提供商的即用型集成。这是一个由 OpenAI 驱动的智能体:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">import&nbsp;os<br><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;OpenAIA2AServer,&nbsp;run_server<br><br><span class="hljs-comment">#&nbsp;创建一个由&nbsp;OpenAI&nbsp;驱动的智能体<br>agent&nbsp;=&nbsp;OpenAIA2AServer(<br>&nbsp;&nbsp;&nbsp;&nbsp;api_key=os.environ[<span class="hljs-string">"OPENAI_API_KEY"],<br>&nbsp;&nbsp;&nbsp;&nbsp;model=<span class="hljs-string">"gpt-4",<br>&nbsp;&nbsp;&nbsp;&nbsp;system_prompt=<span class="hljs-string">"你是一个有帮助的&nbsp;AI&nbsp;助手。"<br>)<br><br><span class="hljs-comment">#&nbsp;运行服务器<br><span class="hljs-keyword">if&nbsp;__name__&nbsp;==&nbsp;<span class="hljs-string">"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;run_server(agent,&nbsp;host=<span class="hljs-string">"0.0.0.0",&nbsp;port=<span class="hljs-number">5002)</span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<p>同样,您可以创建一个由 Anthropic Claude 驱动的智能体:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">import&nbsp;os<br><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;ClaudeA2AServer,&nbsp;run_server<br><br><span class="hljs-comment">#&nbsp;创建一个由&nbsp;Anthropic&nbsp;Claude&nbsp;驱动的智能体<br>agent&nbsp;=&nbsp;ClaudeA2AServer(<br>&nbsp;&nbsp;&nbsp;&nbsp;api_key=os.environ[<span class="hljs-string">"ANTHROPIC_API_KEY"],<br>&nbsp;&nbsp;&nbsp;&nbsp;model=<span class="hljs-string">"claude-3-opus-20240229",<br>&nbsp;&nbsp;&nbsp;&nbsp;system_prompt=<span class="hljs-string">"你是一个有帮助的&nbsp;AI&nbsp;助手。"<br>)<br><br><span class="hljs-comment">#&nbsp;运行服务器<br><span class="hljs-keyword">if&nbsp;__name__&nbsp;==&nbsp;<span class="hljs-string">"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;run_server(agent,&nbsp;host=<span class="hljs-string">"0.0.0.0",&nbsp;port=<span class="hljs-number">5003)</span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="7" data-heading="true">多智能体工作流</h2>
<p>A2A 的真正威力在于连接多个智能体。让我们构建一个研究助手工作流:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;A2AClient,&nbsp;Message,&nbsp;TextContent,&nbsp;MessageRole,&nbsp;Conversation<br>)<br><br><span class="hljs-keyword">def&nbsp;<span class="hljs-title function_">research_workflow(<span class="hljs-params">query):<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;连接到专业智能体<br>&nbsp;&nbsp;&nbsp;&nbsp;llm_client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5002/a2a")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;LLM&nbsp;智能体<br>&nbsp;&nbsp;&nbsp;&nbsp;search_client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5003/a2a")&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;搜索智能体<br>&nbsp;&nbsp;&nbsp;&nbsp;summarize_client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5004/a2a")&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;总结智能体<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;在对话中跟踪整个工作流<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation&nbsp;=&nbsp;Conversation()<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation.create_text_message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">f"研究问题:&nbsp;<span class="hljs-subst">{query}",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;步骤&nbsp;1:&nbsp;生成搜索查询<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">"生成搜索查询...")<br>&nbsp;&nbsp;&nbsp;&nbsp;search_request&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">f"基于这个研究问题:&nbsp;'<span class="hljs-subst">{query}',&nbsp;"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">f"生成&nbsp;3&nbsp;个特定的搜索查询,以帮助找到相关信息。"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;search_queries_response&nbsp;=&nbsp;llm_client.send_message(search_request)<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation.add_message(search_queries_response)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;步骤&nbsp;2:&nbsp;检索信息<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">"检索信息...")<br>&nbsp;&nbsp;&nbsp;&nbsp;search_message&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">f"搜索信息以回答:&nbsp;<span class="hljs-subst">{query}\n\n"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">f"使用这些查询:\n<span class="hljs-subst">{search_queries_response.content.text}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;search_results&nbsp;=&nbsp;search_client.send_message(search_message)<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation.add_message(search_results)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;步骤&nbsp;3:&nbsp;综合信息<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">"综合信息...")<br>&nbsp;&nbsp;&nbsp;&nbsp;summarize_message&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">f"综合这些信息来回答问题:&nbsp;'<span class="hljs-subst">{query}'\n\n"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">f"信息:\n<span class="hljs-subst">{search_results.content.text}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;summary_response&nbsp;=&nbsp;summarize_client.send_message(summarize_message)<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation.add_message(summary_response)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;将最终答案添加到对话中<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation.create_text_message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">f"你的研究问题的答案:\n\n<span class="hljs-subst">{summary_response.content.text}",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;conversation<br><br><span class="hljs-comment">#&nbsp;使用示例<br><span class="hljs-keyword">if&nbsp;__name__&nbsp;==&nbsp;<span class="hljs-string">"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;query&nbsp;=&nbsp;<span class="hljs-built_in">input(<span class="hljs-string">"你的研究问题是什么?&nbsp;")<br>&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;research_workflow(query)<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">"\n研究完成!")<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">"="&nbsp;*&nbsp;<span class="hljs-number">50)<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(result.messages[-<span class="hljs-number">1].content.text)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="8" data-heading="true">高级示例:使用 A2A 进行天气和行程规划</h2>
<p>这是一个示例,展示了 A2A 如何简化智能体之间的通信:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;A2AClient,&nbsp;Message,&nbsp;TextContent,&nbsp;MessageRole<br><br><span class="hljs-comment">#&nbsp;使用&nbsp;A2A:&nbsp;任何智能体&nbsp;-&gt;&nbsp;任何其他智能体<br><span class="hljs-keyword">def&nbsp;<span class="hljs-title function_">plan_trip(<span class="hljs-params">location):<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;连接到专业智能体&nbsp;-&nbsp;都使用相同的协议<br>&nbsp;&nbsp;&nbsp;&nbsp;weather_client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5001/a2a")<br>&nbsp;&nbsp;&nbsp;&nbsp;openai_client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5002/a2a")<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;询问天气智能体<br>&nbsp;&nbsp;&nbsp;&nbsp;weather_message&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(text=<span class="hljs-string">f"请问<span class="hljs-subst">{location}的天气预报如何?"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;weather_response&nbsp;=&nbsp;weather_client.send_message(weather_message)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;询问&nbsp;OpenAI&nbsp;智能体,包括天气信息<br>&nbsp;&nbsp;&nbsp;&nbsp;planning_message&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">f"我正在计划前往<span class="hljs-subst">{location}的旅行。天气预报:&nbsp;<span class="hljs-subst">{weather_response.content.text}"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">f"请推荐一些活动。"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;planning_response&nbsp;=&nbsp;openai_client.send_message(planning_message)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;planning_response.content.text<br><br><span class="hljs-comment">#&nbsp;这适用于任何兼容&nbsp;A2A&nbsp;的智能体&nbsp;-&nbsp;无需自定义适配器!</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="9" data-heading="true">管理对话</h2>
<p>Python A2A 提供了一个&nbsp;<code>Conversation</code>&nbsp;类来管理多轮交互:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;Conversation,&nbsp;MessageRole,&nbsp;A2AClient<br><br><span class="hljs-comment">#&nbsp;创建一个新对话<br>conversation&nbsp;=&nbsp;Conversation()<br><br><span class="hljs-comment">#&nbsp;添加用户消息<br>conversation.create_text_message(<br>&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">"今天天气怎么样?",<br>&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>)<br><br><span class="hljs-comment">#&nbsp;连接到一个智能体<br>weather_agent&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5001/a2a")<br><br><span class="hljs-comment">#&nbsp;发送对话中的最后一条消息<br>last_message&nbsp;=&nbsp;conversation.messages[-<span class="hljs-number">1]<br>response&nbsp;=&nbsp;weather_agent.send_message(last_message)<br><br><span class="hljs-comment">#&nbsp;将响应添加到对话中<br>conversation.add_message(response)<br><br><span class="hljs-comment">#&nbsp;继续对话<br>conversation.create_text_message(<br>&nbsp;&nbsp;&nbsp;&nbsp;text=<span class="hljs-string">"谢谢!我需要带伞吗?",<br>&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>)<br><br><span class="hljs-comment">#&nbsp;发送新消息,包括对话历史<br>response&nbsp;=&nbsp;weather_agent.send_message(<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation.messages[-<span class="hljs-number">1],<br>&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=conversation.conversation_id<br>)<br><br><span class="hljs-comment">#&nbsp;也添加这个响应<br>conversation.add_message(response)<br><br><span class="hljs-comment">#&nbsp;打印整个对话<br><span class="hljs-keyword">for&nbsp;msg&nbsp;<span class="hljs-keyword">in&nbsp;conversation.messages:<br>&nbsp;&nbsp;&nbsp;&nbsp;role&nbsp;=&nbsp;<span class="hljs-string">"用户"&nbsp;<span class="hljs-keyword">if&nbsp;msg.role&nbsp;==&nbsp;MessageRole.USER&nbsp;<span class="hljs-keyword">else&nbsp;<span class="hljs-string">"智能体"<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">f"<span class="hljs-subst">{role}:&nbsp;<span class="hljs-subst">{msg.content.text}")</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="10" data-heading="true">错误处理</h2>
<p>Python A2A 提供标准化的错误处理:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;A2AClient,&nbsp;Message,&nbsp;TextContent,&nbsp;MessageRole<br><br>client&nbsp;=&nbsp;A2AClient(<span class="hljs-string">"http://localhost:5001/a2a")<br><br><span class="hljs-keyword">try:<br>&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(text=<span class="hljs-string">"你好"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.USER<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;response&nbsp;=&nbsp;client.send_message(message)<br><br><span class="hljs-keyword">except&nbsp;ConnectionError&nbsp;<span class="hljs-keyword">as&nbsp;e:<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">f"连接错误:&nbsp;<span class="hljs-subst">{e}")<br><br><span class="hljs-keyword">except&nbsp;TimeoutError&nbsp;<span class="hljs-keyword">as&nbsp;e:<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">f"超时错误:&nbsp;<span class="hljs-subst">{e}")<br><br><span class="hljs-keyword">except&nbsp;Exception&nbsp;<span class="hljs-keyword">as&nbsp;e:<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">print(<span class="hljs-string">f"意外错误:&nbsp;<span class="hljs-subst">{e}")</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="11" data-heading="true">创建自定义 A2A 智能体</h2>
<p>以下是创建您自己的 A2A 兼容智能体的模板:</p>
<pre class="hljs code__pre"><span class="mac-sign"><code class="language-python"><span class="hljs-keyword">from&nbsp;python_a2a&nbsp;<span class="hljs-keyword">import&nbsp;A2AServer,&nbsp;Message,&nbsp;TextContent,&nbsp;MessageRole,&nbsp;run_server<br><br><span class="hljs-keyword">class&nbsp;<span class="hljs-title class_">MyCustomAgent(<span class="hljs-title class_ inherited__">A2AServer):<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">def&nbsp;<span class="hljs-title function_">__init__(<span class="hljs-params">self,&nbsp;**kwargs):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-built_in">super().__init__(**kwargs)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;在这里初始化您的智能体特定组件<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">def&nbsp;<span class="hljs-title function_">handle_message(<span class="hljs-params">self,&nbsp;message):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-string">"""处理收到的消息并返回响应。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是处理智能体消息的主要入口点。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">if&nbsp;message.content.<span class="hljs-built_in">type&nbsp;==&nbsp;<span class="hljs-string">"text":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;处理文本消息<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user_text&nbsp;=&nbsp;message.content.text<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;生成您的响应(替换为您的逻辑)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response_text&nbsp;=&nbsp;<span class="hljs-string">f"你说:&nbsp;<span class="hljs-subst">{user_text}"<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(text=response_text),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_message_id=message.message_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=message.conversation_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">elif&nbsp;message.content.<span class="hljs-built_in">type&nbsp;==&nbsp;<span class="hljs-string">"function_call":<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;处理函数调用(如果您的智能体支持)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;...<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">pass<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-comment">#&nbsp;如果没有其他条件匹配,返回默认响应<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="hljs-keyword">return&nbsp;Message(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content=TextContent(text=<span class="hljs-string">"我不知道如何处理这种消息类型。"),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;role=MessageRole.AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_message_id=message.message_id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversation_id=message.conversation_id<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br><br><span class="hljs-comment">#&nbsp;运行您的智能体<br><span class="hljs-keyword">if&nbsp;__name__&nbsp;==&nbsp;<span class="hljs-string">"__main__":<br>&nbsp;&nbsp;&nbsp;&nbsp;my_agent&nbsp;=&nbsp;MyCustomAgent()<br>&nbsp;&nbsp;&nbsp;&nbsp;run_server(my_agent,&nbsp;host=<span class="hljs-string">"0.0.0.0",&nbsp;port=<span class="hljs-number">5005)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></span></pre>
<h2 id="12" data-heading="true">结论</h2>
<p>Python A2A 提供了一种标准化的方式让 AI</p>
<p>智能体进行通信,使构建多智能体系统变得更加容易。通过采用这个协议,您可以:</p>
<ol>
<li>1. 减少在通信基础设施上花费的开发时间</li>
<li>2. 轻松切换和升级智能体实现</li>
<li>3. 构建模块化、可扩展的 AI 系统</li>
<li>4. 利用专业智能体完成不同任务</li>
</ol>
<p>A2A 协议及其 Python 实现正在帮助构建一个未来,在这个未来中,AI 系统可以像乐高积木一样组合,让专业智能体无缝合作。</p>
<p>欲了解更多信息,请查看 Python A2A 的 GitHub 仓库、PyPI 页面和文档。</p>
<p>Python A2A: Google 的智能体到智能体协议的全面指南</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/sing1ee/p/18828654
頁: [1]
查看完整版本: Python A2A: Google 的智能体到智能体协议的全面指南