From 5e8eecc288c8af2cd0e3e9b7706705af44bd79e9 Mon Sep 17 00:00:00 2001 From: Windows Date: Fri, 11 Sep 2026 11:49:11 +0800 Subject: [PATCH] feat: adapt advisor agent to qyqy base --- app/service/agent/bootstrap.py | 5 +++++ app/service/agent/implementations/advisor.py | 21 ++++++++++++++++++ pyproject.toml | 1 + requirements.txt | 1 + .../unit/service/test_advisor_base_adapter.py | 22 +++++++++++++++++++ 5 files changed, 50 insertions(+) create mode 100644 app/service/agent/implementations/advisor.py create mode 100644 tests/unit/service/test_advisor_base_adapter.py diff --git a/app/service/agent/bootstrap.py b/app/service/agent/bootstrap.py index a24d541..9625489 100644 --- a/app/service/agent/bootstrap.py +++ b/app/service/agent/bootstrap.py @@ -12,6 +12,7 @@ from app.infrastructure.memory_cache import MemoryCacheAdapter from app.infrastructure.vector_memory import VectorMemoryAdapter from app.service.agent.factory import AgentFactory from app.service.agent.governance import PlatformGovernance +from app.service.agent.implementations.advisor import AdvisorAgent from app.service.agent.implementations.fund_query_demo import FundQueryDemoAgent from app.service.fund_quote_service import query_fund_quote_tool from app.service.intent_classifier import IntentClassifier @@ -172,3 +173,7 @@ def register_business_agents(factory: AgentFactory) -> None: FundQueryDemoAgent.definition, lambda _context: FundQueryDemoAgent(FundQueryDemoAgent.definition), ) + factory.register( + AdvisorAgent.definition, + lambda _context: AdvisorAgent(AdvisorAgent.definition), + ) diff --git a/app/service/agent/implementations/advisor.py b/app/service/agent/implementations/advisor.py new file mode 100644 index 0000000..da7b95e --- /dev/null +++ b/app/service/agent/implementations/advisor.py @@ -0,0 +1,21 @@ +"""投顾 Agent 的迁移骨架。 + +当前阶段只接入新底座已有的场内基金行情只读能力;后续业务模块会按迁移 TODO +逐项扩展 definition、工具白名单和处理逻辑。 +""" + +from app.core.contracts import AgentDefinition +from app.service.agent.implementations.fund_query_demo import FundQueryDemoAgent + + +class AdvisorAgent(FundQueryDemoAgent): + """通过公共 BaseAgent 链路运行的最小投顾 Agent。""" + + definition = AgentDefinition( + agent_type="advisor", + version="0.1.0", + allowed_roles=("customer", "advisor", "operator", "admin"), + allowed_portals=("api",), + allowed_tools=("query_fund_quote",), + supported_intents=("fund_quote",), + ) diff --git a/pyproject.toml b/pyproject.toml index fe73c5a..2b042b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -28,6 +28,7 @@ dependencies = [ dev = [ "pytest>=8.3,<9", "pytest-asyncio>=0.25,<1", + "aiosqlite>=0.20,<1", "ruff>=0.9,<1", "mypy>=1.14,<2", ] diff --git a/requirements.txt b/requirements.txt index 9980b9e..0cea438 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,5 +17,6 @@ httpx>=0.28,<1 # Development and test dependencies pytest>=8.3,<9 pytest-asyncio>=0.25,<1 +aiosqlite>=0.20,<1 ruff>=0.9,<1 mypy>=1.14,<2 diff --git a/tests/unit/service/test_advisor_base_adapter.py b/tests/unit/service/test_advisor_base_adapter.py new file mode 100644 index 0000000..59832e2 --- /dev/null +++ b/tests/unit/service/test_advisor_base_adapter.py @@ -0,0 +1,22 @@ +from app.core.contracts import RequestContext +from app.service.agent.base import BaseAgent +from app.service.agent.bootstrap import get_agent_factory +from app.service.agent.implementations.advisor import AdvisorAgent + + +def test_advisor_is_registered_through_the_new_base_factory() -> None: + factory = get_agent_factory() + definition = factory.definition("advisor") + context = RequestContext( + user_id="1", + trace_id="advisor-base-adapter", + roles=("customer",), + permissions=("agent:run",), + ) + agent = factory.create("advisor", context) + + assert isinstance(agent, BaseAgent) + assert isinstance(agent, AdvisorAgent) + assert agent.definition == definition + assert definition.allowed_tools == ("query_fund_quote",) + assert definition.supported_intents == ("fund_quote",)