server_translator.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. """
  2. 翻译 Agent — 将中文翻译为英文
  3. 作为独立 A2A Server 运行,暴露翻译技能
  4. """
  5. import uvicorn
  6. from starlette.applications import Starlette
  7. from a2a.server.request_handlers import DefaultRequestHandler
  8. from a2a.server.routes import create_agent_card_routes, create_jsonrpc_routes
  9. from a2a.server.agent_execution import AgentExecutor, RequestContext
  10. from a2a.server.events import EventQueue
  11. from a2a.server.tasks import InMemoryTaskStore, TaskUpdater
  12. from a2a.types import AgentCapabilities, AgentCard, AgentInterface, AgentSkill
  13. from a2a.helpers import (
  14. get_message_text, new_task_from_user_message,
  15. new_text_message, new_text_part,
  16. )
  17. from openai import AsyncOpenAI
  18. DEEPSEEK_API_KEY = "你的APIKEY"
  19. class TranslatorAgent:
  20. def __init__(self):
  21. self.client = AsyncOpenAI(
  22. api_key=DEEPSEEK_API_KEY,
  23. base_url="https://api.deepseek.com/v1",
  24. )
  25. async def translate(self, text: str) -> str:
  26. response = await self.client.chat.completions.create(
  27. model="deepseek-chat",
  28. messages=[
  29. {"role": "system", "content": "你是一个专业的中译英翻译。只输出翻译结果,不要添加解释。"},
  30. {"role": "user", "content": f"把以下中文翻译成英文:{text}"},
  31. ],
  32. temperature=0.3,
  33. max_tokens=1024,
  34. )
  35. return response.choices[0].message.content
  36. class TranslatorExecutor(AgentExecutor):
  37. def __init__(self):
  38. self.agent = TranslatorAgent()
  39. async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
  40. task = context.current_task or new_task_from_user_message(context.message)
  41. if not context.current_task:
  42. await event_queue.enqueue_event(task)
  43. updater = TaskUpdater(event_queue=event_queue, task_id=task.id, context_id=task.context_id)
  44. await updater.start_work(message=new_text_message("正在翻译..."))
  45. query = get_message_text(context.message)
  46. result = await self.agent.translate(query) if query else "没有收到输入"
  47. await updater.add_artifact(parts=[new_text_part(text=result, media_type="text/plain")])
  48. await updater.complete(message=new_text_message("翻译完成!"))
  49. print(f" [翻译] {result[:60]}...")
  50. async def cancel(self, context: RequestContext, event_queue: EventQueue) -> None:
  51. raise NotImplementedError("暂不支持取消")
  52. # ── Agent Card ──
  53. skill = AgentSkill(
  54. id="translator",
  55. name="中译英翻译",
  56. description="将中文文本翻译成英文",
  57. input_modes=["text/plain"],
  58. output_modes=["text/plain"],
  59. tags=["翻译", "demo"],
  60. examples=["你好吗?", "今天天气真好"],
  61. )
  62. agent_card = AgentCard(
  63. name="翻译 Agent",
  64. description="一个中译英翻译 Agent,接收中文返回英文",
  65. version="1.0.0",
  66. default_input_modes=["text/plain"],
  67. default_output_modes=["text/plain"],
  68. capabilities=AgentCapabilities(streaming=True),
  69. supported_interfaces=[
  70. AgentInterface(protocol_binding="JSONRPC", url="http://127.0.0.1:9998", protocol_version="1.0"),
  71. ],
  72. skills=[skill],
  73. )
  74. if __name__ == "__main__":
  75. handler = DefaultRequestHandler(
  76. agent_executor=TranslatorExecutor(),
  77. task_store=InMemoryTaskStore(),
  78. agent_card=agent_card,
  79. )
  80. routes = []
  81. routes.extend(create_agent_card_routes(agent_card))
  82. routes.extend(create_jsonrpc_routes(handler, "/"))
  83. app = Starlette(routes=routes)
  84. print("🌐 翻译 Agent → http://127.0.0.1:9998")
  85. uvicorn.run(app, host="127.0.0.1", port=9998)