diff --git a/agent/nodes/eras_expert.py b/agent/nodes/eras_expert.py index e9523c8..280146f 100644 --- a/agent/nodes/eras_expert.py +++ b/agent/nodes/eras_expert.py @@ -48,10 +48,14 @@ DOMAIN MODEL (how the data relates): - Auftraege (work orders) = tasks for Monteure (technicians) Device installation, reading collection, maintenance. -HIERARCHY: Kunde → Objekte → Nutzeinheiten → Geraete → Verbraeuche - → Nutzer - Kunde → Abrechnungen - Kunde → Auftraege +HIERARCHY (via JOINs): + Kunde ←→ objektkunde ←→ Objekt (many-to-many via junction table!) + Objekt → Nutzeinheiten → Geraete → Verbraeuche + Nutzeinheit → Nutzer + Kunde → Abrechnungen + Kunde → Auftraege + +CRITICAL: kunden and objekte are linked through the objektkunde junction table, NOT directly. IMPORTANT NOTES: - All table/column names are German, lowercase @@ -75,18 +79,31 @@ IMPORTANT NOTES: - heizbetriebskosten — heating operation costs - nebenkosten — additional costs (Nebenkosten) -KNOWN PRIMARY KEYS AND FOREIGN KEYS: -- kunden: PK = Kundennummer (int), name columns: Name1, Name2, Name3 -- objekte: PK = ObjektID, FK = KundenID → kunden.Kundennummer -- nutzeinheit: FK = ObjektID → objekte.ObjektID -- geraete: FK = NutzeinheitID → nutzeinheit.NutzeinheitID (verify with DESCRIBE) +KNOWN SCHEMA (verified — ONLY use these column names without DESCRIBE): +All tables use ID (int, auto_increment) as primary key. -IMPORTANT: Always DESCRIBE tables you haven't seen before to verify column names. -Use the FK mappings above for JOINs. Do NOT guess — use exact column names. +- kunden: PK=ID. Known columns: Name1, Name2, Name3, Kundennummer +- objekte: PK=ID. Known columns: Objektnummer +- objektkunde: JUNCTION TABLE for kunden↔objekte (many-to-many!) + PK=ID, FK: KundeID→kunden.ID, ObjektID→objekte.ID +- nutzeinheit: PK=ID, FK: ObjektID→objekte.ID +- geraete: PK=ID, FK: NutzeinheitID→nutzeinheit.ID +- geraeteverbraeuche: linked to geraete +- nutzer: linked to nutzeinheit (DESCRIBE to find FK column name) + +For ANY column not listed above, you MUST DESCRIBE the table first. + +JOIN PATTERNS (use these exactly): +- Kunde → Objekte: JOIN objektkunde ok ON ok.KundeID = k.ID JOIN objekte o ON o.ID = ok.ObjektID +- Objekt → Nutzeinheiten: JOIN nutzeinheit n ON n.ObjektID = o.ID +- Nutzeinheit → Geraete: JOIN geraete g ON g.NutzeinheitID = n.ID + +IMPORTANT: For tables not listed above, always DESCRIBE first. +The junction table objektkunde is REQUIRED to link kunden and objekte. Example for "how many Objekte per Kunde": [ - {{"tool": "query_db", "args": {{"query": "SELECT k.Kundennummer, k.Name1, COUNT(o.ObjektID) as AnzahlObjekte FROM kunden k LEFT JOIN objekte o ON o.KundenID = k.Kundennummer GROUP BY k.Kundennummer, k.Name1 ORDER BY AnzahlObjekte DESC LIMIT 20", "database": "eras2_production"}}}} + {{"tool": "query_db", "args": {{"query": "SELECT k.ID, k.Name1, COUNT(DISTINCT o.ID) as AnzahlObjekte FROM kunden k JOIN objektkunde ok ON ok.KundeID = k.ID JOIN objekte o ON o.ID = ok.ObjektID GROUP BY k.ID, k.Name1 ORDER BY AnzahlObjekte DESC LIMIT 20", "database": "eras2_production"}}}} ]""" def __init__(self, send_hud, process_manager=None): diff --git a/testcases/domain_context.md b/testcases/domain_context.md index dcf0ca0..f1770e8 100644 --- a/testcases/domain_context.md +++ b/testcases/domain_context.md @@ -12,7 +12,7 @@ and can formulate correct JOINs without guessing column names. ### 1. Expert knows the hierarchy - send: wie viele Objekte haben Kunden im Durchschnitt? - expect_trace: has tool_call -- expect_response: not contains "Error" or "error" or "Unknown column" +- expect_response: not contains "Unknown column" or "1054" or "doesn't exist" - expect_response: length > 20 ### 2. Expert can JOIN kunden and objekte @@ -33,7 +33,13 @@ and can formulate correct JOINs without guessing column names. - expect_response: not contains "Error" or "error" or "Unknown column" - expect_response: length > 20 -### 5. PA formulates good job descriptions +### 5. Multi-hop query through hierarchy +- send: zeig alle Nutzer in Objekten von Kunde mit Jaeger im Namen +- expect_trace: has tool_call +- expect_response: not contains "Unknown column" or "1054" or "doesn't exist" +- expect_response: contains "Jaeger" or "jaeger" + +### 6. PA formulates good job descriptions - send: gib mir eine Uebersicht ueber Kunde 2 - expect_trace: has routed - expect_response: length > 20