demo_no_a2a.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. """
  2. ❌ 非 A2A 模式:两个 Agent 各自有完全不同的 API
  3. 需要手动适配,调用方必须提前知道每个 Agent 的接口细节
  4. """
  5. from openai import AsyncOpenAI
  6. import asyncio
  7. DEEPSEEK_API_KEY = "你的APIKEY"
  8. client = AsyncOpenAI(api_key=DEEPSEEK_API_KEY, base_url="https://api.deepseek.com/v1")
  9. async def call_llm(system: str, user: str) -> str:
  10. r = await client.chat.completions.create(
  11. model="deepseek-chat",
  12. messages=[{"role": "system", "content": system}, {"role": "user", "content": user}],
  13. temperature=0.3, max_tokens=1024,
  14. )
  15. return r.choices[0].message.content
  16. # ─── "Agent" A:问答服务 ─────────────────────────────
  17. # 假装这是一个外部的问答 API,格式如下:
  18. # POST /ask {"question": "..."} → {"answer": "..."}
  19. # 调用方必须:知道 URL、知道字段名是 "question"、"answer"
  20. async def agent_qa(question: str) -> str:
  21. """模拟调用一个自定义问答 API"""
  22. print(" [适配] POST /ask body={\"question\": \"...\"}")
  23. return await call_llm(
  24. "你是一个有用的AI助手",
  25. question,
  26. )
  27. # ─── "Agent" B:翻译服务 ─────────────────────────────
  28. # 假装这是另一个公司的翻译 API,格式完全不一样:
  29. # POST /v2/translate {"src": "...", "from": "zh", "to": "en"}
  30. # → {"code": 0, "data": {"result": "..."}}
  31. # 调用方必须:知道不同 URL、不同字段名、不同响应结构
  32. async def agent_translate(text: str) -> str:
  33. """模拟调用一个自定义翻译 API"""
  34. print(" [适配] POST /v2/translate body={\"src\": \"...\", \"from\": \"zh\", \"to\": \"en\"}")
  35. print(" [适配] 解析响应: resp.data.result")
  36. return await call_llm(
  37. "你是一个专业中译英翻译,只输出翻译结果",
  38. f"把以下中文翻译成英文:{text}",
  39. )
  40. # ─── 调用方:没有 A2A,必须手工适配每个 Agent ────
  41. async def main():
  42. question = "什么是微服务架构?"
  43. print("=" * 64)
  44. print(" ❌ 没有 A2A 协议")
  45. print(" 两个 Agent,两种 API,两套适配代码")
  46. print("=" * 64)
  47. print(f"\n 用户: {question}")
  48. # Step 1: 必须先知道问答 API 的地址和格式
  49. print("\n ── 调用 问答 Agent ──")
  50. qa_result = await agent_qa(question)
  51. print(f" 回答: {qa_result[:80]}...")
  52. # Step 2: 想把回答翻译成英文
  53. # → 又得知道翻译 API 的地址和格式(完全不同!)
  54. print("\n ── 调用 翻译 Agent ──")
  55. print(" ⚠ 需要写全新的适配代码:不同 URL、不同字段名、不同响应结构")
  56. trans_result = await agent_translate(qa_result)
  57. print(f" 翻译: {trans_result[:80]}...")
  58. # Step 3: 如果想再加第三个 Agent(比如总结)
  59. # → 又要第三套适配代码
  60. print("\n ❌ 再加第3个 Agent → 再写第3套适配")
  61. print(" N 个 Agent = N 套适配代码(API 格式差异越大越痛苦)")
  62. print()
  63. # ===== 显示对比总结 =====
  64. print("-" * 64)
  65. print(" 对比:")
  66. print(" 问答 API: POST /ask {\"question\": ...} -> {\"answer\": ...}")
  67. print(" 翻译 API: POST /v2/translate {\"src\": ...} -> {\"code\":0, \"data\":{\"result\":...}}")
  68. print(" → 完全不同的 URL、字段名、响应结构")
  69. print(" → 每接入一个 Agent 都要看文档写适配")
  70. if __name__ == "__main__":
  71. asyncio.run(main())