extension.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. """离线示例:共享术语表服务、检索工具和模型调用前的上下文补充。"""
  2. from contextlib import asynccontextmanager
  3. import config
  4. from extensions import define_tool, get_service
  5. def enabled() -> bool:
  6. return config.get_bool("CONTEXT_DEMO_ENABLED", False)
  7. @asynccontextmanager
  8. async def glossary_service(dependencies):
  9. # 实际接入时在这里延迟导入客户端、打开连接,并在 finally 中关闭。
  10. glossary = {"风量": "单位时间内通过某一断面的空气体积。", "风速": "空气流动的速度。"}
  11. try:
  12. yield glossary
  13. finally:
  14. glossary.clear()
  15. @define_tool(group="扩展示例", label="查询术语")
  16. def lookup_demo_term(term: str) -> str:
  17. """查询离线演示术语表,仅用于演示模块接入。"""
  18. return get_service("demo_glossary").get(term, "术语表中没有该词条")
  19. def glossary_middleware(services):
  20. # 模块关闭时不会加载可选依赖。工厂只组装中间件,不创建连接。
  21. from langchain.agents.middleware.types import AgentMiddleware
  22. class DemoGlossaryMiddleware(AgentMiddleware):
  23. def enrich(self, request):
  24. message = request.system_message
  25. if message is None:
  26. return request
  27. terms = "、".join(sorted(services["demo_glossary"]))
  28. text = f"\n演示术语表可查询:{terms}。需要时调用 lookup_demo_term。"
  29. content = (message.content + text if isinstance(message.content, str)
  30. else [*message.content, {"type": "text", "text": text}])
  31. return request.override(system_message=message.model_copy(update={
  32. "content": content,
  33. }))
  34. def wrap_model_call(self, request, handler):
  35. return handler(self.enrich(request))
  36. async def awrap_model_call(self, request, handler):
  37. return await handler(self.enrich(request))
  38. return DemoGlossaryMiddleware()
  39. def setup(registry):
  40. registry.register_service("demo_glossary", glossary_service)
  41. registry.register_tool(lookup_demo_term, requires=["demo_glossary"])
  42. registry.register_middleware("DemoGlossaryMiddleware", glossary_middleware,
  43. requires=["demo_glossary"], targets=["main"])