ADR-0003 legt eine Multi-Agent-DAG fest mit typisierten Inputs/Outputs, Tool-Use, Provider-Diversität und einer Coordinator-Orchestrierung. Wir brauchen ein Framework, das diese Anforderungen abdeckt, ohne große Mengen an unbenötigter Komplexität mitzubringen.
Wir wählen Option A: Pydantic AI als Agent-Framework.
pydantic_ai.Agent-Instanz mit eigenem result_type (Pydantic-Modell) und eigener Tool-Liste.asyncio.gather für parallele Schritte (Research+Analyst, Critic+Risk-Assessment).deps_type / RunContext an Agents übergeben — enthält DB-Handles, Run-ID, Watchlist-Konfiguration.@agent.tool; MCP-Server via Pydantic-AI MCP-Client-Adapter (siehe ADR-0006).research_agent = Agent(
model=research_model, # konfigurierbar pro Agent
deps_type=RunDeps,
result_type=ResearchReport,
system_prompt=RESEARCH_PROMPT,
tools=[tavily_search, tavily_extract, sec_edgar_filing],
)
analyst_agent = Agent(
model=analyst_model,
deps_type=RunDeps,
result_type=QuantSnapshot,
tools=[get_eod_prices, compute_indicators, get_fundamentals],
)
# Coordinator (deterministische Python-Logik, kein LLM)
async def coordinate(watchlist: Watchlist, trigger: TriggerType) -> RunSummary:
shortlist = await screener_agent.run(...)
research, quant = await asyncio.gather(
research_agent.run(shortlist.tickers, deps=deps),
analyst_agent.run(shortlist.tickers, deps=deps),
)
strategy = await strategy_agent.run(research=research.data, quant=quant.data, deps=deps)
critic, risk = await asyncio.gather(
critic_agent.run(strategy.data, deps=deps),
risk_agent.run(strategy.data, deps=deps),
)
return persist_run_summary(...)
AgentModelSpec-Schicht (siehe ADR-0005), die Provider-Konfiguration entkoppelt.