feishu.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. """
  2. api.v1.feishu — 飞书机器人 Webhook 端点
  3. 飞书开放平台事件订阅 URL: http://your-server:8000/api/v1/feishu/webhook
  4. """
  5. from __future__ import annotations
  6. import json
  7. import os
  8. from fastapi import APIRouter, Request
  9. from fastapi.responses import JSONResponse
  10. router = APIRouter(prefix="/feishu", tags=["feishu"])
  11. # Agent runner(延迟初始化)
  12. _runner = None
  13. def _get_runner():
  14. global _runner
  15. if _runner is None:
  16. agent_id = os.environ.get("FEISHU_AGENT_ID", "")
  17. if agent_id:
  18. from agentpaas.services.feishu import make_paas_runner
  19. _runner = make_paas_runner(agent_id)
  20. return _runner
  21. @router.post("/webhook")
  22. async def feishu_webhook(request: Request):
  23. """
  24. 飞书事件回调端点。
  25. 飞书开放平台配置:
  26. 请求地址: http://your-server:8000/api/v1/feishu/webhook
  27. 加密策略: 不加密(开发阶段)
  28. """
  29. try:
  30. body = await request.json()
  31. except Exception:
  32. return JSONResponse({"code": -1, "msg": "invalid json"})
  33. from agentpaas.services.feishu import handle_event
  34. # 使用线程池执行 Agent(避免阻塞 event loop)
  35. import asyncio
  36. loop = asyncio.get_event_loop()
  37. result = await loop.run_in_executor(None, handle_event, body, _get_runner())
  38. return JSONResponse(result)
  39. @router.post("/bind")
  40. async def feishu_bind(request: Request):
  41. """绑定 Agent 到飞书机器人。"""
  42. global _runner
  43. try:
  44. data = await request.json()
  45. except Exception:
  46. return JSONResponse({"error": "invalid json"}, status_code=400)
  47. agent_id = data.get("agent_id", "")
  48. if not agent_id:
  49. return JSONResponse({"error": "agent_id required"}, status_code=400)
  50. from agentpaas.services.feishu import make_paas_runner
  51. _runner = make_paas_runner(agent_id)
  52. os.environ["FEISHU_AGENT_ID"] = agent_id
  53. return {"status": "ok", "agent_id": agent_id, "message": f"飞书机器人已绑定 Agent {agent_id}"}
  54. @router.get("/status")
  55. async def feishu_status():
  56. """查看飞书机器人状态。"""
  57. from agentpaas.services.feishu import FEISHU_APP_ID, FEISHU_AGENT_ID
  58. return {
  59. "app_id": FEISHU_APP_ID,
  60. "agent_id": FEISHU_AGENT_ID or os.environ.get("FEISHU_AGENT_ID", "(未绑定)"),
  61. "webhook_url": "/api/v1/feishu/webhook",
  62. "runner_active": _runner is not None,
  63. }