Supervisor S-2: OpenRouter-Agent, read-only Tool-Registry, Analyse-Chat

Der KI-Analyse-Agent (docs/konzepte/KONZEPT-Modul-Supervisor.md, Phase S-2):
- SupervisorToolRegistry (transport-agnostisch, spaeter auch MCP-Light): 7 read-only-Tools -
  query_decisions (inkl. Rejects+ReasonCodes), query_order_events, query_trades, get_dossier
  (Markdown-Kette), read_logs (JSONL je Tag, CID-Filter), get_kpis (TradeAnalytics),
  get_architecture_context. Ausfuehrung fehlertolerant (Exception -> Fehlertext, wirft nie).
  KEIN Tool kann handeln/schreiben.
- OpenRouterClient (IChatCompletionClient): OpenAI-kompatibles Chat-Completions-Schema inkl.
  Function-Calling; Request-Bau + Response-Parsing pur/testbar. API-Key GETRENNT vom Trading:
  env POLYTRADER_OPENROUTER_KEY oder gitignorierte openrouter.key (in .gitignore aufgenommen).
- SupervisorAgent: Function-Calling-Loop (max 8 Iterationen), System-Prompt = Arbeitsanweisung +
  eingebettetes Architektur-Kontext-Dokument (Context/ArchitectureContext.md, EmbeddedResource,
  mit dem Code versioniert - beschreibt Entscheidungswege, ReasonCodes, Leiter-Mechanik, Eigenheiten).
  Tool-Aufrufe werden gesammelt und in der UI transparent angezeigt.
- SupervisorMainForm: neuer Tab 'Analyse' (Chat, Modellwahl default openrouter/auto, Tool-Aufrufe
  live im Verlauf, Token-Zaehler) neben dem Dossiers-Tab.
- Sicherheitskonzept: OpenRouter als bewusst freigegebener Egress dokumentiert (nur Tool-Ergebnisse,
  nie Secrets; Spend-Limit je Key empfohlen).

Tests: +7 (Registry-Ausfuehrung/Fehler, Agent-Loop mit Tool-Rueckfluss, Iterationsgrenze,
Request-Body/Response-Parsing, eingebetteter Kontext). Build 0 Fehler, 351 Tests gruen,
--smoke-ui alle 5 Views gruen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Richard
2026-07-17 18:06:28 +02:00
co-authored by Claude Opus 4.8
parent c75a958e36
commit 5d732277b2
13 changed files with 941 additions and 17 deletions
@@ -20,9 +20,21 @@ namespace PolyTrader.Modules.Supervisor
public void RegisterServices(IServiceCollection services, IConfiguration configuration)
{
// S-1: reine Beschaffung/Aufbereitung. Eigene sup_-Persistenz (Berichte/Konversationen)
// folgt mit S-2/S-3.
// S-1: Dossier-Beschaffung/-Aufbereitung.
services.AddSingleton<DossierService>();
// S-2: read-only Tool-Registry + OpenRouter-Agent. Der API-Key kommt aus
// POLYTRADER_OPENROUTER_KEY bzw. gitignorierter openrouter.key (getrennt vom Trading).
services.AddSingleton(sp => Agent.SupervisorTools.CreateRegistry(
sp.GetRequiredService<PolyTrader.Core.Persistence.IDecisionJournal>(),
sp.GetRequiredService<PolyTrader.Core.Persistence.IOrderEventLog>(),
sp.GetRequiredService<PolyTrader.Core.Persistence.ITradeLogRepository>(),
sp.GetRequiredService<DossierService>()));
services.AddSingleton<Agent.IChatCompletionClient>(_ =>
new Agent.OpenRouterClient(new System.Net.Http.HttpClient { Timeout = TimeSpan.FromMinutes(3) }));
services.AddSingleton<Agent.SupervisorAgent>();
// sup_-Persistenz (Berichte/Konversationen) + Profile folgen mit S-3.
}
public void RegisterUi(IModuleUiHost host, System.IServiceProvider services)