From 6def5c7be65b7be74042986adc591a8dcb613c81 Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Fri, 27 Mar 2026 17:16:26 -0400 Subject: [PATCH 01/29] transformer asset integration initial commit --- src/servers/fmsr/main.py | 258 +++++++++++++++++++++++++++ src/servers/fmsr/models.py | 38 ++++ src/servers/fmsr/prompt_templates.py | 86 +++++++++ src/servers/fmsr/tests/test_tools.py | 165 +++++++++++++++++ 4 files changed, 547 insertions(+) create mode 100644 src/servers/fmsr/models.py create mode 100644 src/servers/fmsr/prompt_templates.py diff --git a/src/servers/fmsr/main.py b/src/servers/fmsr/main.py index 1638b7629..b867c2087 100644 --- a/src/servers/fmsr/main.py +++ b/src/servers/fmsr/main.py @@ -28,6 +28,17 @@ from mcp.server.fastmcp import FastMCP from pydantic import BaseModel +from src.servers.fmsr.models import ( + DGAInterpretationResult, + WindingTemperatureResult, + LoadProfileResult, +) +from src.servers.fmsr.prompt_templates import ( + _INTERPRET_DGA_PROMPT, + _ASSESS_WINDING_PROMPT, + _ASSESS_LOAD_PROMPT, +) + load_dotenv() _log_level = getattr(logging, os.environ.get("LOG_LEVEL", "WARNING").upper(), logging.WARNING) @@ -85,6 +96,63 @@ def _parse_relevancy(text: str) -> dict: temporal = lines[2] if (answer == "Yes" and len(lines) >= 3) else "Unknown" return {"answer": answer, "reason": reason, "temporal_behavior": temporal} +def _parse_dga_response( + text: str +) -> dict: + """Parse a DGA interpretation response + into fault type, R1-R3 values, code, confidence, reasoning, and recommended action.""" + result = {} + for line in text.strip().splitlines(): + if ":" in line: + k, _, v = line.partition(":") + result[k.strip()] = v.strip() + return { + "fault_type": result.get("Fault Type", "Unknown"), + "r1": float(result.get("R1 (CH4/H2)", 0) or 0), + "r2": float(result.get("R2 (C2H2/C2H4)", 0) or 0), + "r3": float(result.get("R3 (C2H4/C2H6)", 0) or 0), + "code": result.get("Code (R1,R2,R3)", "Unknown"), + "confidence": result.get("Confidence", "Unknown"), + "reasoning": result.get("Reasoning", ""), + "recommended_action": result.get("Recommended Action", ""), + } + +def _parse_winding_response(text: str) -> dict: + """Parse a winding temperature assessment response + into thermal status, ageing rate, and recommended action.""" + result = {} + for line in text.strip().splitlines(): + if ":" in line: + k, _, v = line.partition(":") + result[k.strip()] = v.strip() + return { + "thermal_status": result.get("Thermal Status", "Unknown"), + "hot_spot_rise_c": float(result.get("Hot-Spot Rise (C)", 0) or 0), + "ageing_rate": float(result.get("Ageing Rate", 1.0) or 1.0), + "alarm_active": result.get("Alarm Active", "No") == "Yes", + "trip_active": result.get("Trip Active", "No") == "Yes", + "risk_level": result.get("Risk Level", "Unknown"), + "reasoning": result.get("Reasoning", ""), + "recommended_action": result.get("Recommended Action", ""), + } + +def _parse_load_response(text: str) -> dict: + """Parse a load profile response into load factor, imbalance, and recommended action.""" + result = {} + for line in text.strip().splitlines(): + if ":" in line: + k, _, v = line.partition(":") + result[k.strip()] = v.strip() + return { + "load_mva": float(result.get("Load MVA", 0) or 0), + "load_factor_pct": float(result.get("Load Factor (%)", 0) or 0), + "loading_status": result.get("Loading Status", "Unknown"), + "current_imbalance_pct": float(result.get("Current Imbalance (%)", 0) or 0), + "neutral_current_flag": result.get("Neutral Current Flag", "No") == "Yes", + "reasoning": result.get("Reasoning", ""), + "recommended_action": result.get("Recommended Action", ""), + } + # ── LLM backend (lazy init; graceful degradation if creds are absent) ───────── @@ -152,6 +220,96 @@ def _call_relevancy(asset_name: str, failure_mode: str, sensor: str) -> dict: last_exc = exc raise last_exc +def _call_dga( + asset_name: str, + hydrogen: float, + methane: float, + acetylene: float, + ethylene: float, + ethane: float, +) -> dict: + """Query the LLM to interpret DGA readings. Retries up to _MAX_RETRIES times.""" + prompt = _INTERPRET_DGA_PROMPT.format( + asset_name=asset_name, + hydrogen=hydrogen, + methane=methane, + acetylene=acetylene, + ethylene=ethylene, + ethane=ethane, + ) + + last_exc: Exception | None = None + for _ in range(_MAX_RETRIES): + try: + raw = _llm.generate(prompt) + return _parse_dga_response(raw) + except Exception as exc: + last_exc = exc + raise last_exc + +def _call_winding( + asset_name: str, wti: float, oti: float, ati: float, oti_a: int, oti_t: int +) -> dict: + """Query the LLM to assess winding temperature condition. Retries up to _MAX_RETRIES times.""" + prompt = _ASSESS_WINDING_PROMPT.format( + asset_name=asset_name, + wti=wti, + oti=oti, + ati=ati, + oti_a=oti_a, + oti_t=oti_t, + ) + + last_exc: Exception | None = None + for _ in range(_MAX_RETRIES): + try: + raw = _llm.generate(prompt) + return _parse_winding_response(raw) + except Exception as exc: + last_exc = exc + raise last_exc + + +def _call_load( + asset_name: str, + vl1: float, + vl2: float, + vl3: float, + il1: float, + il2: float, + il3: float, + vl12: float, + vl23: float, + vl31: float, + inut: float, + rated_mva: float, +) -> dict: + """Query the LLM to assess load profile. Retries up to _MAX_RETRIES times.""" + prompt = _ASSESS_LOAD_PROMPT.format( + asset_name=asset_name, + vl1=vl1, + vl2=vl2, + vl3=vl3, + il1=il1, + il2=il2, + il3=il3, + vl12=vl12, + vl23=vl23, + vl31=vl31, + inut=inut, + rated_mva=rated_mva, + ) + + last_exc: Exception | None = None + for _ in range(_MAX_RETRIES): + try: + raw = _llm.generate(prompt) + return _parse_load_response(raw) + except Exception as exc: + last_exc = exc + raise last_exc + + # ── Result models ───────────────────────────────────────────────────────────── @@ -281,6 +439,106 @@ def get_failure_mode_sensor_mapping( ) +@mcp.tool() +def interpret_dga( + asset_name: str, + hydrogen: float, + methane: float, + acetylene: float, + ethylene: float, + ethane: float, +) -> Union[DGAInterpretationResult, ErrorResult]: + + if not asset_name: + return ErrorResult(error="asset_name is required") + + if not _llm_available: + return ErrorResult(error="LLM unavailable") + + try: + parsed = _call_dga(asset_name, hydrogen, methane, acetylene, ethylene, ethane) + return DGAInterpretationResult( + asset_name=asset_name, + **parsed, + ) + except Exception as exc: + logger.error("_call_dga failed: %s", exc) + return ErrorResult(error=str(exc)) + + +@mcp.tool() +def assess_winding_temperature( + asset_name: str, + wti: float, + oti: float, + ati: float, + oti_a: int, + oti_t: int, +) -> Union[WindingTemperatureResult, ErrorResult]: + + if not asset_name: + return ErrorResult(error="asset_name is required") + + if not _llm_available: + return ErrorResult(error="LLM unavailable") + + try: + parsed = _call_winding(asset_name, wti, oti, ati, oti_a, oti_t) + return WindingTemperatureResult( + asset_name=asset_name, + **parsed, + ) + except Exception as exc: + logger.error("_call_winding failed: %s", exc) + return ErrorResult(error=str(exc)) + + +@mcp.tool() +def assess_load_profile( + asset_name: str, + vl1: float, + vl2: float, + vl3: float, + il1: float, + il2: float, + il3: float, + vl12: float, + vl23: float, + vl31: float, + inut: float, + rated_mva: float, +) -> Union[LoadProfileResult, ErrorResult]: + + if not asset_name: + return ErrorResult(error="asset_name is required") + + if not _llm_available: + return ErrorResult(error="LLM unavailable") + + try: + parsed = _call_load( + asset_name, + vl1, + vl2, + vl3, + il1, + il2, + il3, + vl12, + vl23, + vl31, + inut, + rated_mva, + ) + return LoadProfileResult( + asset_name=asset_name, + **parsed, + ) + except Exception as exc: + logger.error("_call_load failed: %s", exc) + return ErrorResult(error=str(exc)) + + def main(): mcp.run(transport="stdio") diff --git a/src/servers/fmsr/models.py b/src/servers/fmsr/models.py new file mode 100644 index 000000000..944767ae5 --- /dev/null +++ b/src/servers/fmsr/models.py @@ -0,0 +1,38 @@ +from pydantic import BaseModel + +class HealthIndexResult(BaseModel): + asset_name: str + health_index: float + condition: str + +class DGAInterpretationResult(BaseModel): + asset_name: str + fault_type: str + r1: float + r2: float + r3: float + code: str + confidence: str + reasoning: str + recommended_action: str + +class WindingTemperatureResult(BaseModel): + asset_name: str + thermal_status: str + hot_spot_rise_c: float + ageing_rate: float + alarm_active: bool + trip_active: bool + risk_level: str + reasoning: str + recommended_action: str + +class LoadProfileResult(BaseModel): + asset_name: str + load_mva: float + load_factor_pct: float + loading_status: str + current_imbalance_pct: float + neutral_current_flag: bool + reasoning: str + recommended_action: str \ No newline at end of file diff --git a/src/servers/fmsr/prompt_templates.py b/src/servers/fmsr/prompt_templates.py new file mode 100644 index 000000000..a10cfa9b2 --- /dev/null +++ b/src/servers/fmsr/prompt_templates.py @@ -0,0 +1,86 @@ +_INTERPRET_DGA_PROMPT = ( + "You are a transformer diagnostic expert. Analyse the following " + "dissolved gas analysis (DGA) readings for asset {asset_name} " + "and determine the fault type using IEC 60599 ratio method.\n\n" + "DGA Readings:\n" + " Hydrogen (H2): {hydrogen} ppm\n" + " Methane (CH4): {methane} ppm\n" + " Acetylene (C2H2): {acetylene} ppm\n" + " Ethylene (C2H4): {ethylene} ppm\n" + " Ethane (C2H6): {ethane} ppm\n\n" + "Steps to follow:\n" + "1. Compute R1=CH4/H2, R2=C2H2/C2H4, R3=C2H4/C2H6\n" + "2. Convert to IEC codes:\n" + " R1: <0.1->0, 0.1-3->1, >3->2\n" + " R2: <0.1->1, 0.1-1->0, >1->2\n" + " R3: <1->0, 1-3->1, >3->2\n" + "3. Map code combination to fault type:\n" + " (0,0,0)->NF, (0,1,0)->PDLED, (1,1,0)->PDHED,\n" + " (1or2,0,1or2)->LED, (1,0,2)->HED,\n" + " (0,0,1)->LTH1, (0,2,0)->LTH4, (0,2,1)->MTH,\n" + " (0,2,2)->HTH, other->UD\n" + "4. Recommend an action.\n\n" + "Respond in exactly this format:\n" + "Fault Type: \n" + "R1 (CH4/H2): \n" + "R2 (C2H2/C2H4): \n" + "R3 (C2H4/C2H6): \n" + "Code (R1,R2,R3): \n" + "Confidence: \n" + "Reasoning: \n" + "Recommended Action: " +) + +_ASSESS_WINDING_PROMPT = ( + "You are a transformer thermal assessment expert. Evaluate the " + "winding temperature condition of asset {asset_name} using " + "IEC 60076-7.\n\n" + "Temperature Readings:\n" + " Winding Temperature (WTI): {wti} C\n" + " Oil Temperature (OTI): {oti} C\n" + " Ambient Temperature (ATI): {ati} C\n" + " Alarm flag (OTI_A): {oti_a}\n" + " Trip flag (OTI_T): {oti_t}\n\n" + "Steps to follow:\n" + "1. Compute hot-spot rise = WTI - ATI.\n" + "2. Thermal status: <=98C Normal, <=140C Warning, " + "<=160C Critical, >160C or trip=1 Trip.\n" + "3. Ageing rate = 2^((WTI-98)/6).\n" + "4. Check alarm and trip flags.\n" + "5. Recommend an action.\n\n" + "Respond in exactly this format:\n" + "Thermal Status: \n" + "Hot-Spot Rise (C): \n" + "Ageing Rate: \n" + "Alarm Active: \n" + "Trip Active: \n" + "Risk Level: \n" + "Reasoning: \n" + "Recommended Action: " +) + +_ASSESS_LOAD_PROMPT = ( + "You are a transformer load assessment expert. Evaluate the " + "loading condition of asset {asset_name}.\n\n" + "Electrical Readings:\n" + " Phase voltages: VL1={vl1}V, VL2={vl2}V, VL3={vl3}V\n" + " Phase currents: IL1={il1}A, IL2={il2}A, IL3={il3}A\n" + " Line voltages: VL12={vl12}V, VL23={vl23}V, VL31={vl31}V\n" + " Neutral current: INUT={inut}A\n" + " Rated Capacity: {rated_mva} MVA\n\n" + "Steps to follow:\n" + "1. load_mva = (VL12*IL1+VL23*IL2+VL31*IL3)/(sqrt(3)*1e6)\n" + "2. load_factor_pct = (load_mva/rated_mva)*100\n" + "3. <=100% Normal, <=110% Overloaded, >110% Severely Overloaded\n" + "4. imbalance = (max-min)/mean of IL1,IL2,IL3 * 100\n" + "5. INUT > 10% of mean phase current indicates imbalance.\n" + "6. Recommend an action.\n\n" + "Respond in exactly this format:\n" + "Load MVA: \n" + "Load Factor (%): \n" + "Loading Status: \n" + "Current Imbalance (%): \n" + "Neutral Current Flag: \n" + "Reasoning: \n" + "Recommended Action: " +) \ No newline at end of file diff --git a/src/servers/fmsr/tests/test_tools.py b/src/servers/fmsr/tests/test_tools.py index 3bbc3129d..95cbb8556 100644 --- a/src/servers/fmsr/tests/test_tools.py +++ b/src/servers/fmsr/tests/test_tools.py @@ -134,3 +134,168 @@ async def test_integration(self): assert "full_relevancy" in data assert len(data["full_relevancy"]) == 1 assert data["full_relevancy"][0]["relevancy_answer"] in ("Yes", "No", "Unknown") + +class TestInterpretDGA: + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_llm_unavailable_returns_error(self, no_llm): + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "Transformer1", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_parse_llm_response(self, mock_dga_chain): + """Test correct parsing of a mocked LLM response.""" + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "Transformer1", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "fault_type" in data + assert isinstance(data["r1"], float) + assert isinstance(data["confidence"], str) + mock_dga_chain.assert_called_once() + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "interpret_dga", { + "asset_name": "Transformer1", + "hydrogen": 10.0, + "methane": 5.0, + "acetylene": 0.5, + "ethylene": 1.0, + "ethane": 0.1, + }) + assert "fault_type" in data + assert len(data["reasoning"]) > 0 + + +class TestAssessWindingTemperature: + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_llm_unavailable_returns_error(self, no_llm): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "Transformer1", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_parse_llm_response(self, mock_winding_chain): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "Transformer1", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "thermal_status" in data + assert isinstance(data["ageing_rate"], float) + assert isinstance(data["alarm_active"], bool) + mock_winding_chain.assert_called_once() + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "assess_winding_temperature", { + "asset_name": "Transformer1", + "wti": 80, + "oti": 90, + "ati": 85, + "oti_a": 3, + "oti_t": 5, + }) + assert "thermal_status" in data + assert len(data["recommended_action"]) > 0 + + +class TestAssessLoadProfile: + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_llm_unavailable_returns_error(self, no_llm): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "Transformer1", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "error" in data + + @pytest.mark.anyio + async def test_parse_llm_response(self, mock_load_chain): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "Transformer1", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "load_mva" in data + assert isinstance(data["load_factor_pct"], float) + assert isinstance(data["neutral_current_flag"], bool) + mock_load_chain.assert_called_once() + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "assess_load_profile", { + "asset_name": "Transformer1", + "vl1": 10, "vl2": 10, "vl3": 10, + "il1": 5, "il2": 5, "il3": 5, + "vl12": 20, "vl23": 20, "vl31": 20, + "inut": 5, + "rated_mva": 50, + }) + assert "load_mva" in data + assert len(data["reasoning"]) > 0 From 92dd88346d3a2cda30cc78976cfab5d94933a9b4 Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Sun, 29 Mar 2026 18:36:48 -0400 Subject: [PATCH 02/29] added failure modes for transformer --- src/servers/fmsr/failure_modes.yaml | 11 +++++++++++ src/servers/fmsr/tests/test_tools.py | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/servers/fmsr/failure_modes.yaml b/src/servers/fmsr/failure_modes.yaml index 16712b8ee..4c02afdcc 100644 --- a/src/servers/fmsr/failure_modes.yaml +++ b/src/servers/fmsr/failure_modes.yaml @@ -13,3 +13,14 @@ ahu: - "Belts or sheaves Wear" - "Improper switch position" - "Solenoid Valves Bound due to hardened grease" + +smart grid transformer: + - "Partial Discharge in Oil" + - "Thermal Fault — Oil Overheating" + - "Thermal Fault — Core/Winding" + - "Low-Energy Arcing (Sparking)" + - "High-Energy Arcing" + - "Tap Changer Mechanical Wear" + - "Oil Contamination / Moisture Ingress" + - "Cellulose Insulation Ageing" + - "Oil Dielectric Degradation" \ No newline at end of file diff --git a/src/servers/fmsr/tests/test_tools.py b/src/servers/fmsr/tests/test_tools.py index 95cbb8556..d4c1035cf 100644 --- a/src/servers/fmsr/tests/test_tools.py +++ b/src/servers/fmsr/tests/test_tools.py @@ -35,6 +35,12 @@ async def test_ahu_returns_hardcoded(self): assert "failure_modes" in data assert len(data["failure_modes"]) == 5 + @pytest.mark.anyio + async def test_transformer_returns_hardcoded(self): + data = await call_tool(mcp, "get_failure_modes", {"asset_name": "Smart Grid Transformer"}) + assert "failure_modes" in data + assert len(data["failure_modes"]) == 9 + @pytest.mark.anyio async def test_empty_asset_name_returns_error(self): data = await call_tool(mcp, "get_failure_modes", {"asset_name": ""}) From 4cfb6685d1e968e68fb746cf191bd7a3703ac9fc Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Tue, 31 Mar 2026 21:53:31 -0400 Subject: [PATCH 03/29] add transformer health index prediction tool --- pyproject.toml | 1 + .../fmsr/artifacts/health_index_dataset.csv | 471 +++++++++++ .../fmsr/artifacts/health_index_model.pkl | Bin 0 -> 3402878 bytes .../fmsr/artifacts/health_index_scalers.pkl | Bin 0 -> 1047 bytes .../transformer_health_index_predictor.ipynb | 778 ++++++++++++++++++ src/servers/fmsr/main.py | 109 ++- src/servers/fmsr/models.py | 4 + src/servers/fmsr/tests/test_tools.py | 47 ++ 8 files changed, 1408 insertions(+), 2 deletions(-) create mode 100644 src/servers/fmsr/artifacts/health_index_dataset.csv create mode 100644 src/servers/fmsr/artifacts/health_index_model.pkl create mode 100644 src/servers/fmsr/artifacts/health_index_scalers.pkl create mode 100644 src/servers/fmsr/artifacts/transformer_health_index_predictor.ipynb diff --git a/pyproject.toml b/pyproject.toml index 990dcdb86..496f9499a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,7 @@ dependencies = [ "claude-agent-sdk>=0.0.14", "python-dotenv>=1.0", "scipy>=1.10.0", + "scikit-learn>=1.8.0", ] [project.scripts] diff --git a/src/servers/fmsr/artifacts/health_index_dataset.csv b/src/servers/fmsr/artifacts/health_index_dataset.csv new file mode 100644 index 000000000..c796db63a --- /dev/null +++ b/src/servers/fmsr/artifacts/health_index_dataset.csv @@ -0,0 +1,471 @@ +Hydrogen,Oxigen,Nitrogen,Methane,CO,CO2,Ethylene,Ethane,Acethylene,DBDS,Power factor,Interfacial V,Dielectric rigidity,Water content,Health index +2845,5860,27842,7406,32,1344,16684,5467,7,19,1,45,55,0,95.2 +12886,61,25041,877,83,864,4,305,0,45,1,45,55,0,85.5 +2820,16400,56300,144,257,1080,206,11,2190,1,1,39,52,11,85.3 +1099,70,37520,545,184,1402,6,230,0,87,4.58,33,49,5,85.3 +3210,3570,47900,160,360,2130,4,43,4,1,0.77,44,55,3,85.2 +13500,343,36500,3150,113,984,5,1230,1,1,4.93,37,52,6,75.6 +10200,11900,33700,573,87,611,0,162,0,1,3.53,45,55,5,75.6 +3,15459,41347,5,68,902,12,2,13,5,0.58,41,71,6,73.2 +16,2470,59600,8,520,2660,5,8,2,164,0.29,44,56,4,72.8 +488,11861,48353,13,85,1957,29,23,0,164,0.27,37,72,10,68 +4,26100,60600,1,206,1440,13,0,13,5,1.32,40,56,4,63.4 +4,21800,46200,0,75,655,3,0,11,0,0.65,42,53,5,63.4 +254,592,60300,14,376,2500,5,9,0,205,0.44,42,42,6,61.3 +23349,2475,28011,5045,156,48,5588,3532,2951,0,1,52,70,2,60.5 +9040,1870,47500,1790,183,2060,7820,638,1450,0,1,42,55,18,60.5 +13200,1120,32800,2650,156,2240,16400,1610,1510,0,1,45,58,22,60.5 +6620,5250,51900,2240,190,1870,13100,1400,1660,0,1,42,54,21,60.5 +8710,4530,42800,658,437,1780,1260,97,9740,1,1,45,55,1,60.5 +5810,11900,51400,471,354,1470,798,44,3990,1,1,44,50,16,60.5 +757,289,57400,1700,1730,24900,2280,755,12,0,42.1,24,51,77,60.5 +590,23200,63900,949,209,51,828,168,582,0,1,45,55,4,60.5 +1310,2690,51900,1010,119,2220,2520,376,17,0,0.25,45,29,34,60.5 +122,294,73100,50,372,2180,69,31,0,168,1.27,42,35,19,59.3 +106,581,75200,47,760,4070,11,30,0,183,0.16,43,29,5,58.3 +95,1760,80800,72,488,3050,10,36,0,176,0.29,44,55,12,58 +87,362,76100,47,560,3920,5,31,0,184,0.23,43,52,4,57.4 +79,699,75700,72,508,3810,83,42,0,136,1.24,34,48,5,56 +2183,192,43380,1061,183,5730,1308,646,2,0,1,42,28,31,55.8 +76,324,71700,45,904,5220,10,27,0,227,0.45,45,45,8,55.1 +14,17600,44300,0,161,2010,22,0,0,0,1.16,37,49,16,51.6 +14,2750,29500,12,54,5190,0,0,0,5,0.19,43,55,3,51.6 +40,2350,65000,8,538,2480,9,0,1,0,1,35,56,62,51.5 +5,9400,37100,4,496,2720,3,0,1,0,1,35,56,51,51.5 +7,12300,32200,0,302,3640,3,0,1,0,1,35,55,36,51.5 +2390,9050,44300,163,546,2660,3,53,0,0,1.71,46,54,12,50.7 +12880,1571,36351,827,184,2267,4,320,0,1,1,46,54,12,50.7 +10700,13100,32700,625,79,660,0,190,1,1,4.45,42,44,4,50.7 +921,22000,43400,42,132,542,75,3,713,0,0.48,45,56,13,50.7 +9350,229,53000,188,451,2720,228,28,0,0,71.75,30,55,5,50.7 +6200,291,59400,218,492,10600,103,39,0,0,67.67,30,54,10,50.7 +3060,257,69500,190,403,8930,68,47,0,0,73.2,29,56,14,50.7 +7907,3564,24991,467,96,1765,2,249,0,0,1,29,56,14,50.7 +5030,7140,54300,179,38,260,0,21,0,0,1.9,29,49,15,50.7 +322,669,56400,181,614,466,170,15,173,0,0.63,45,51,2,50.7 +152,21400,49300,254,64,1510,2250,908,4830,0,1,43,51,5,50.7 +211,249900,62600,148,118,2300,751,103,3030,0,1,45,41,9,50.6 +277,21500,46100,142,93,2090,802,59,3840,0,1,45,50,5,50.6 +253,17300,43700,135,82,1870,57,734,3330,0,1,44,50,4,50.6 +216,24300,48500,93,94,1890,578,36,2830,0,1,42,54,7,50.6 +135,5091,48792,33,568,1301,3,5,0,1,0.12,47,66,3,50.3 +0,219,56900,4,20,507,30,49,67,0,4.4,47,50,3,50 +38,3127,16464,11,177,727,28,3,19,0,1,47,75,38,49.9 +36,2950,63300,101,525,4080,193,35,0,127,0.37,40,53,6,49.2 +30,316,54100,161,309,2710,248,28,0,20,0.57,40,55,4,49.2 +52,387,68400,37,936,6130,8,21,0,138,0.82,44,56,4,49.1 +30,413,19600,39,140,2690,17,48,0,158,0.15,46,56,7,49 +24,455,21700,41,186,2790,10,65,0,162,0.17,44,52,3,48.9 +21,425,33000,32,217,3030,9,47,0,160,0.13,42,53,4,48.5 +59,645,56000,20,267,2300,9,15,0,136,0.21,42,52,4,48.5 +104,1450,76500,37,357,3220,11,11,0,2,0.32,45,54,8,48.3 +3,19700,67600,0,108,1480,10,0,0,17,1,43,53,28,48.2 +40,24800,53300,9,84,919,17,12,0,88,1.68,39,51,4,48.2 +35,1920,73500,6,202,1310,20,0,0,92.6,0.48,40,49,8,48.2 +3,1900,81300,37,234,2800,10,102,0,123,0.44,41,47,6,48.2 +0,693,50600,43,68,2770,4,91,0,180,1.15,44,52,10,48.2 +28,9950,47300,16,245,1290,0,3,0,47.5,0.9,44,49,4,48.2 +25,15500,50700,3,267,1180,0,0,0,27,1,43,43,4,48.2 +25,508,54500,12,317,2750,4,14,0,0,0.65,45,56,4,48.2 +23,888,74700,16,914,3420,5,6,0,63.7,0.14,43,47,7,48.2 +9,10700,42300,2,308,1970,0,4,0,108,0.38,42,57,9,48.2 +9,738,56000,10,294,1960,4,17,0,175,0.27,42,56,7,48.2 +4,408,38700,22,105,1100,7,47,0,168,1.82,43,57,7,48.2 +8,1060,55300,14,235,1850,6,22,0,113,0.21,42,56,3,48.2 +7,376,54700,13,205,1780,4,15,0,162,0.29,43,55,4,48.2 +7,425,50500,9,317,2690,4,15,0,165,0.32,41,55,8,48.2 +7,15700,46800,2,373,3470,28,0,0,162,0.57,40,51,8,48.2 +7,1990,58800,10,154,2210,4,18,0,144,0.3,40,50,1,48.2 +6,3760,70200,17,277,2200,7,31,0,194,0.48,41,55,3,48.2 +5,378,53100,16,231,2170,5,22,0,165,0.32,43,54,4,48.2 +5,17400,53400,4,296,2750,7,0,0,164,0.52,41,55,10,48.2 +5,22900,51800,0,149,826,10,0,0,12,0.21,40,49,10,48.2 +5,20400,42200,0,148,820,17,0,0,142,1.02,38,52,9,48.2 +4,57,31384,5,89,876,2,6,0,76,0.16,38,68,7,48.2 +4,4740,73200,2,154,1910,8,0,0,7,1.55,40,52,15,48.2 +4,20200,44700,0,194,2050,66,0,0,144,2.05,37,54,13,48.2 +3,15400,46100,0,333,1240,18,0,0,0,1.49,38,35,14,48.2 +3,20600,42000,0,118,906,18,0,0,127,0.89,37,57,6,48.2 +3,395,47000,5,47,623,9,11,0,169,3.35,38,54,9,48.2 +2,21500,47500,2,106,1040,3,0,0,123,0.28,42,54,4,48.2 +2,14700,44200,2,297,1780,55,0,0,35,0.8,41,41,14,48.2 +0,5640,71800,17,305,2200,6,41,0,4.4,0.23,42,55,6,48.2 +0,21900,48300,2,39,1420,3,7,0,136,0.41,41,56,9,48.2 +0,21200,44200,0,91,1520,0,0,0,136,0.32,43,50,2,48.2 +0,25900,49700,0,22,399,0,0,0,120,0.86,39,50,4,48.2 +0,22900,45300,0,66,553,0,0,0,155,0.37,43,53,5,48.2 +0,21800,52500,3,78,2180,9,8,0,0,0.41,42,56,6,48.2 +0,2220,58800,13,131,1520,4,22,0,173,0.55,42,52,4,48.2 +0,944,58700,6,266,3530,8,11,0,153,0.35,40,56,4,48.2 +0,27000,56600,0,47,480,0,0,0,11,1,43,51,4,48.2 +0,21600,45800,0,204,2750,5,0,0,9,0.08,43,52,6,48.2 +0,30800,58700,0,98,1740,4,0,0,6,0.17,44,53,4,48.2 +0,21700,45600,0,198,2250,6,0,0,6,0.13,41,55,3,48.2 +0,8380,30800,0,23,180,0,0,0,1,9.43,37,43,7,48.2 +0,27300,55500,0,32,525,0,0,0,1,0.62,40,40,19,48.2 +0,19300,45700,0,53,481,0,0,0,0,1.24,45,47,6,48.2 +0,24800,45700,0,81,514,0,0,0,203,1.47,45,55,5,48.2 +0,22000,44900,0,122,856,8,0,0,136,0.63,41,52,7,48.2 +0,14300,65700,7,148,1960,3,13,0,0,0.41,37,51,2,48.2 +18,17600,51700,4,231,1610,0,7,0,55,1,45,49,3,48.2 +11,1140,63900,7,540,2980,47,0,0,60,8.44,36,50,36,48.2 +16,7340,71000,5,548,3170,5,0,0,0,0.36,46,45,8,48.2 +12,461,54500,3,69,2150,3,8,0,161,0.28,41,57,7,48.2 +4,624,44500,36,232,2580,3,54,0,169,1.16,42,56,8,48.1 +114,2359,31861,2,144,707,0,0,0,0,1,42,75,28,47.9 +1450,13000,55800,157,278,3360,82,75,0,3,13.8,36,56,6,46.6 +81,23790,64479,10,852,1371,0,0,0,5,0.06,47,74,4,45.3 +67,5940,41600,14,930,4030,0,5,0,5,0.15,43,50,2,40 +1230,239,71300,61,576,11300,28,24,0,0,0.95,34,53,12,38.6 +54,1690,27100,8,554,3990,0,3,0,5,0.19,45,56,2,38.4 +44,1735,41280,1,133,520,0,0,0,0,1,45,74,24,38.3 +37,623,20300,21,888,3690,10,10,0,5,0.14,44,55,3,38.3 +24,35700,85300,5,361,1570,0,0,0,0,0.09,40,55,7,38.3 +24,1330,70800,12,771,2960,3,4,0,2,0.12,44,50,4,38.3 +22,2820,53100,3,770,2390,3,0,0,11,0.37,43,43,5,38.3 +20,2170,21300,6,307,1960,0,0,0,1,1.02,46,52,4,38.3 +19,618,20200,15,184,586,2,4,0,0,0.36,47,47,3,38.3 +8,10600,61600,23,226,4390,0,5,0,5,0.13,45,52,2,38.3 +8,8710,71900,21,230,5050,0,4,0,10,0.2,43,55,3,38.3 +7,4973,56032,21,200,4782,0,2,0,10,0.21,38,66,5,38.3 +10,3350,51100,2,678,2360,0,0,0,5,0.24,44,56,4,38.3 +9,909,32800,16,279,2820,0,3,0,5,0.12,45,49,3,38.3 +7,8220,55800,18,236,2730,0,4,0,5,0.08,54,52,2,38.3 +7,647,16900,8,152,528,0,0,0,5,0.11,45,47,3,38.3 +7,1430,15400,4,221,268,0,0,0,5,1.58,46,48,2,38.3 +7,2630,58800,2,784,1410,0,0,0,5,0.26,40,46,2,38.3 +7,4520,22800,2,157,1080,0,0,0,5,1.55,46,49,7,38.3 +6,8510,64300,13,291,2050,9,0,0,1,0.72,41,50,5,38.3 +6,13300,36900,0,411,4160,0,0,0,0,1,41,52,55,38.3 +6,6080,40900,5,893,2640,0,0,0,0,1,33,55,12,38.3 +5,12300,70900,17,269,1880,3,5,0,5,0.12,45,48,2,38.3 +5,12500,48400,3,534,3010,3,0,0,1,1,45,62,3,38.3 +5,3686,57725,5,158,4331,6,1,0,5,1.41,39,49,19,38.3 +5,15000,44400,0,230,399,0,0,0,0,0.71,48,57,4,38.3 +4,279,20000,8,285,4230,0,4,0,2,0.22,44,55,3,38.3 +4,13600,37500,3,443,5890,0,7,0,0,1,34,55,77,38.3 +4,17000,56700,1,408,936,0,0,0,5,0.54,47,48,5,38.3 +3,20500,44000,0,35,290,0,0,0,1,1,47,48,5,38.3 +3,17400,56700,3,362,2230,4,0,0,1,1.02,44,48,3,38.3 +3,2020,59600,6,1070,2950,0,0,0,5,0.39,42,51,3,38.3 +3,22900,48000,0,201,2320,5,0,0,3,0.1,45,51,4,38.3 +3,23700,49800,0,202,3290,8,0,0,2,0.1,46,56,4,38.3 +3,21700,43200,0,129,1530,0,0,0,1,1.59,35,54,21,38.3 +3,19500,42800,0,209,2650,30,0,0,0,0.78,40,43,23,38.3 +3,18400,45000,0,128,1700,28,0,0,5,1.7,35,55,12,38.3 +3,14900,56700,0,163,458,0,0,0,0,0.13,44,50,3,38.3 +3,12000,35800,0,195,283,0,0,0,0,0.59,48,55,4,38.3 +2,24978,76582,2,19,498,0,0,0,0,1,48,55,4,38.3 +2,15900,51300,4,359,2250,0,0,0,0,0.23,43,49,3,38.3 +2,24800,54600,3,216,3260,9,0,0,4,0.08,46,54,6,38.3 +0,24600,50800,0,31,907,9,0,0,1,1.05,41,53,8,38.3 +0,5010,51800,4,262,845,0,0,0,5,0.41,45,52,3,38.3 +0,7520,38100,5,297,778,0,3,0,5,0.39,44,47,2,38.3 +0,839,20700,4,458,2830,0,0,0,1,0.46,41,47,2,38.3 +0,1565,9555,0,111,417,0,0,0,5,0.26,42,75,7,38.3 +0,22200,47200,2,223,2650,10,0,0,4,0.25,45,55,6,38.3 +0,21800,47300,0,249,2510,7,0,0,2,0.27,44,49,4,38.3 +0,22900,49800,0,205,2190,5,0,0,2,0.09,50,50,5,38.3 +0,26600,62500,2,209,2190,6,0,0,2,0.07,46,52,4,38.3 +0,3300,12200,0,118,270,0,0,0,1,1,45,56,3,38.3 +0,1850,61700,0,43,554,0,0,0,0,3.93,51,51,5,38.3 +0,27200,58900,0,100,609,0,0,0,0,1.93,38,52,8,38.3 +0,24400,47700,0,51,458,0,0,0,5,0.32,46,56,4,38.3 +0,25200,50000,0,67,462,0,0,0,5,0.31,48,54,3,38.3 +11,478,19400,11,196,1900,3,5,0,5,0.37,43,42,2,38.3 +17,5680,59500,16,809,3590,11,0,0,5,0.35,42,50,3,38.3 +12,15200,62800,4,413,4720,5,0,0,5,0.53,44,56,14,38.3 +12,4350,65500,11,870,11100,16,8,0,5,0.5,41,56,10,38.3 +178,4070,27300,144,672,2260,3,10,0,0,1,41,58,12,38.1 +10,11900,55100,2,403,1140,6,0,2,0,1,41,30,23,38 +4,5040,37600,4,597,1440,4,3,2,0,1,41,56,27,38 +0,14908,42800,0,52,620,0,0,2,0,0.78,39,60,7,38 +9,578,29200,35,267,1610,52,17,0,0,0.53,42,50,4,36.6 +17,3960,36100,29,113,4420,3,5,0,5,0.15,45,54,2,36.4 +14,2380,67400,78,372,1850,33,1850,0,0,5.56,36,43,27,33.6 +478,9460,64700,21,54,323,0,4,0,0,1,36,43,27,31 +14,514,70600,11,674,11700,13,5,1,0,0.62,42,45,21,28.1 +13,12300,43400,0,309,908,0,0,0,0,1,42,47,26,26.7 +13,6680,59700,2,236,857,0,0,0,0,0.12,42,57,4,26.7 +13,283,60700,3,33,649,0,80,0,0,2.93,32,54,19,26.7 +13,3430,16300,3,220,1280,0,0,0,1,1.07,46,53,3,26.7 +13,309,55000,10,121,3340,15,71,0,0,1,31,58,43,26.7 +14,1170,50900,4,72,1120,3,100,0,0,1,33,60,29,26.7 +14,27000,56100,0,27,397,0,0,0,5,1,43,53,7,26.7 +14,437,55000,2,20,645,0,44,0,0,2.37,32,53,33,26.7 +14,248,44600,2,35,532,3,73,0,0,3.23,31,56,26,26.7 +14,305,54800,2,35,517,0,60,0,0,2.95,32,57,23,26.7 +14,2690,10300,3,155,735,0,0,0,0,0.28,47,54,2,26.7 +5,7930,49900,5,709,2310,5,0,1,0,1,47,54,36,26.6 +7,6150,19400,3,320,785,6,0,1,0,1,32,56,19,26.6 +15,18300,52900,4,266,630,13,3,1,0,1,33,52,31,26.6 +227,9987,37210,11,122,2942,8,26,0,1,2.54,38,52,20,26.6 +114,7840,70100,2,258,1250,0,0,0,0,1,38,54,25,23 +104,163,49800,5,40,579,17,274,0,0,1,32,53,24,22.5 +91,571,44200,6,80,1860,8,168,0,0,10.1,32,30,31,21.9 +91,24600,49400,5,31,420,0,6,0,1,6.16,41,41,9,21.9 +89,189,57800,2,50,502,0,44,0,0,1,32,55,37,21.7 +88,11300,52600,3,530,2640,0,0,0,0,1,32,58,56,21.6 +79,667,54400,6,45,409,14,533,0,0,1,32,53,35,19.8 +78,294,55700,3,132,892,4,121,0,0,2.34,32,57,11,19.5 +73,1100,49947,10,253,2101,1,2,0,1,0.1,47,61,4,17.5 +71,342,46100,8,133,2650,7,257,0,0,1,21,57,37,16.6 +70,371,40100,1,12,1750,7,117,0,0,22,36,53,62,16.2 +61,440,48800,4,98,909,3,117,0,0,1,32,53,15,13.9 +61,1670,52600,4,98,591,0,52,0,0,1.86,33,56,11,13.9 +59,587,20100,15,577,6140,5,5,0,5,0.15,45,54,4,13.8 +59,1900,62400,3,68,704,3,109,0,0,2.08,32,47,13,13.8 +59,1420,50000,3,90,766,0,97,0,0,1,31,55,20,13.8 +58,896,55700,3,63,1040,2,86,0,0,2,33,56,28,13.7 +58,177,30704,4,70,636,4,108,0,0,2.49,33,68,16,13.7 +57,2470,53800,4,98,926,4,147,0,0,2.96,33,53,14,13.6 +56,21110,59700,4,46,430,8,430,0,0,1,33,48,36,13.6 +54,320,47000,2,222,1600,0,15,0,0,1,33,55,19,13.5 +54,256,54600,3,112,780,0,127,0,0,2.87,33,52,18,13.5 +54,281,44100,4,89,833,4,126,0,0,2.95,33,55,17,13.5 +54,281,44100,4,89,833,4,126,0,0,1,33,55,17,13.5 +52,1710,56300,3,87,934,5,82,0,0,1,30,58,51,13.5 +52,645,71300,22,203,1760,5,51,0,0,1,40,42,5,13.5 +52,322,39300,3,128,754,4,60,0,0,1,31,59,21,13.5 +52,1550,58400,3,90,681,0,68,0,0,1,32,50,11,13.5 +51,339,47800,2,53,344,0,217,0,0,2.78,30,44,33,13.4 +50,205,55200,4,70,758,4,105,0,0,1,32,54,20,13.4 +49,352,54600,4,87,1030,3,112,0,0,3.93,33,56,20,13.4 +49,398,40800,2,58,710,3,85,0,0,1,37,57,20,13.4 +48,245,58500,3,112,914,3,77,0,0,1,31,50,15,13.4 +48,1330,58900,4,124,1010,3,79,0,0,5.35,30,55,16,13.4 +48,71,21093,3,36,673,4,144,0,0,2.56,30,58,26,13.4 +48,252,56800,2,62,651,0,112,0,0,3.04,33,54,16,13.4 +48,289,57400,3,56,650,5,132,0,0,4.22,31,55,13,13.4 +47,400,48200,4,74,621,0,57,0,0,1,32,54,20,13.4 +47,366,44500,2,88,966,5,73,0,0,1,38,57,15,13.4 +46,390,40200,3,127,827,4,54,0,0,1,35,59,13,13.4 +46,227,46700,2,67,735,3,122,0,0,2.4,31,59,17,13.4 +42,2580,64500,1,25,660,0,56,0,0,3.38,30,60,37,13.4 +40,266,56300,4,86,1110,3,106,0,0,1,32,57,21,13.4 +40,511,63600,3,95,2190,0,74,0,0,3.24,33,55,18,13.4 +39,1860,57900,3,69,711,4,96,0,0,2.62,30,56,27,13.4 +39,1060,50800,4,74,804,5,83,0,0,1,32,56,58,13.4 +38,461,55900,4,126,3580,3,136,0,0,4.29,32,54,17,13.4 +38,191,60800,2,49,350,0,150,0,0,1,33,53,22,13.4 +37,224,49900,3,39,1030,8,51,0,0,1,31,59,29,13.4 +37,44788,44090,5,313,1776,8,4,0,1,0.43,34,72,5,13.4 +37,280,48100,3,43,535,2,78,0,0,1,32,56,15,13.4 +37,493,48700,2,75,1190,0,62,0,0,1,32,60,24,13.4 +36,247,54000,4,58,776,4,157,0,0,1,32,57,16,13.4 +35,438,53300,3,50,547,0,44,0,0,2.59,33,55,13,13.4 +35,302,39700,3,98,654,4,79,0,0,1,34,60,13,13.4 +35,232,61400,3,78,766,0,91,0,0,2.75,30,50,12,13.4 +35,336,51000,4,75,587,9,96,0,0,3.25,33,58,8,13.4 +3,1480,13500,37,126,319,87,32,0,0,1,45,55,2,13.4 +34,7200,51200,3,380,1680,0,0,0,0,1,45,75,25,13.4 +34,394,43300,2,72,702,4,37,0,0,1,32,52,17,13.4 +33,312,44100,4,88,738,0,91,0,0,1,33,56,8,13.4 +33,2000,48700,2,53,486,0,184,0,0,2.97,30,49,47,13.4 +32,7150,66200,4,666,6450,5,0,0,0,1,33,53,63,13.4 +30,1310,49700,3,45,641,3,111,0,0,1,32,48,15,13.4 +30,298,55400,4,105,920,3,83,0,0,1,32,58,18,13.4 +30,302,56700,3,54,604,3,69,0,0,1,32,57,13,13.4 +30,510,35200,2,46,691,0,70,0,0,1,38,60,25,13.4 +30,466,41900,2,42,439,0,79,0,0,1,37,60,19,13.4 +29,447,52700,6,84,766,13,270,0,0,2.83,33,53,20,13.4 +29,277,44200,3,95,607,0,89,0,0,1.58,33,57,14,13.4 +29,266,48500,2,74,725,4,78,0,0,1,32,60,43,13.4 +29,396,52500,2,53,569,3,115,0,0,1,32,60,27,13.4 +28,289,50300,5,157,787,3,51,0,0,1,32,59,31,13.4 +27,489,60200,11,181,591,4,11,0,0,0.37,47,46,3,13.4 +27,246,52900,3,66,725,0,122,0,0,2.83,33,55,11,13.4 +26,4440,68800,7,89,784,6,302,0,0,2.5,33,57,23,13.4 +26,321,48300,3,68,598,0,62,0,0,1,32,60,19,13.4 +26,8500,51200,2,238,1150,0,3,0,1,1.02,47,44,7,13.4 +25,1500,70400,9,482,2470,4,0,0,0,1,44,54,10,13.4 +25,2060,50300,3,42,552,0,102,0,0,1,31,55,15,13.4 +24,17200,41600,0,68,230,0,0,0,0,1,42,53,15,13.4 +24,1970,64100,2,34,398,0,92,0,0,1,32,53,13,13.4 +24,257,55700,2,47,495,4,105,0,0,3.17,31,56,15,13.4 +24,2350,23200,4,332,2640,0,0,0,1,0.93,46,56,13,13.4 +23,1690,60700,2,43,1380,3,76,0,0,1,30,60,62,13.4 +23,505,58100,2,49,807,0,48,0,0,1,32,54,69,13.4 +23,14800,40700,1,449,2720,3,0,0,0,1,32,57,89,13.4 +23,6480,42100,5,530,1760,0,0,0,0,1,32,58,22,13.4 +22,399,42600,7,100,2580,11,286,0,0,9.37,29,56,52,13.4 +22,1220,49900,3,30,813,5,291,0,0,1,32,57,27,13.4 +21,364,57700,3,40,967,3,68,0,0,1,34,60,15,13.4 +21,6240,52400,3,788,4290,7,0,0,0,1,34,56,41,13.4 +21,197,56700,5,44,1070,6,523,0,0,2.55,32,52,20,13.4 +21,2710,5600,5,167,1260,3,0,0,0,0.6,51,51,10,13.4 +21,243,48800,0,19,187,0,65,0,0,1,30,57,18,13.4 +20,4530,53000,2,842,2750,0,0,0,5,0.24,45,53,4,13.4 +20,17400,59600,4,395,999,16,4,0,0,1,32,46,31,13.4 +20,14453,52582,7,66,568,2,1,0,0,0.33,46,73,5,13.4 +19,3490,30000,1,374,728,0,0,0,1,0.81,48,53,5,13.4 +4,893,69100,24,96,707,60,17,0,4,0.64,47,51,4,13.4 +10,8010,36900,2,441,891,3,0,0,0,1,33,51,17,13.4 +10,254,56500,4,71,1020,0,108,0,0,1,32,53,22,13.4 +10,881,47800,2,54,1100,0,102,0,0,3.98,33,58,27,13.4 +10,2060,6440,2,97,549,0,0,0,0,1,48,57,7,13.4 +10,2740,53500,2,46,322,4,211,0,0,1,34,57,27,13.4 +10,210,48900,7,44,1060,30,521,0,0,1,33,48,44,13.4 +9,228,45900,2,44,515,0,128,0,0,1,32,48,72,13.4 +9,13000,45000,2,526,2050,0,0,0,0,1,32,60,24,13.4 +9,12000,45100,4,475,1570,0,0,0,0,1,32,54,12,13.4 +9,2200,58100,6,432,7980,17,0,0,0,0.67,42,37,21,13.4 +9,278,53900,2,34,1120,0,55,0,0,3.93,30,53,38,13.4 +9,414,37700,2,34,843,5,278,0,0,1,31,58,39,13.4 +9,2700,73600,4,238,5050,6,0,0,0,1.37,41,54,12,13.4 +9,17000,53500,4,173,1370,3,0,0,0,1,44,54,5,13.4 +9,2490,57000,2,42,351,3,184,0,0,2.61,32,49,66,13.4 +8,1210,27000,3,166,454,0,43,0,0,1,32,55,18,13.4 +8,5570,22800,2,323,989,0,0,0,0,1,32,38,24,13.4 +8,8470,44500,3,318,569,12,0,0,0,1,32,51,18,13.4 +8,12200,49200,6,646,3020,0,0,0,0,1,32,55,17,13.4 +8,16200,52900,4,434,1890,0,0,0,0,1,32,53,14,13.4 +8,8600,40900,4,580,1750,0,0,0,0,1,32,58,8,13.4 +8,292,47300,3,39,1390,0,79,0,0,1,33,55,28,13.4 +8,117,47900,2,20,491,0,75,0,0,2.18,33,53,15,13.4 +8,352,26900,2,38,506,4,75,0,0,1,33,52,24,13.4 +8,189,39923,1,37,698,3,78,0,0,3.14,33,71,41,13.4 +8,634,49400,2,42,444,3,227,0,0,2.14,32,56,53,13.4 +8,1140,55600,2,42,424,3,158,0,0,2.01,32,52,75,13.4 +7,7290,34700,0,463,975,3,0,0,0,1,32,54,44,13.4 +7,5860,28700,0,360,557,0,0,0,0,1,32,52,19,13.4 +7,8570,38900,5,593,2360,0,0,0,0,1,32,57,42,13.4 +7,10300,50500,6,725,2120,0,0,0,0,1,32,55,16,13.4 +7,1160,46900,4,527,1530,0,0,0,0,1,32,57,13,13.4 +7,420,63600,16,545,10600,7,5,0,1,1.11,45,39,16,13.4 +7,339,43800,2,31,644,0,167,0,0,1,32,56,24,13.4 +7,1200,51100,2,52,1340,0,67,0,0,3.83,28,54,24,13.4 +7,492,9748,1,54,221,0,0,0,1,0.46,47,66,3,13.4 +7,19100,46700,0,47,700,0,0,0,0,1,28,46,16,13.4 +7,4560,43900,5,444,1580,4,0,0,0,1,40,56,29,13.4 +6,4970,52300,5,587,4230,5,0,0,1,0.33,41,47,4,13.4 +6,10200,41700,0,434,908,3,0,0,0,1,41,57,17,13.4 +6,4570,22500,2,451,1500,0,0,0,0,1,32,57,31,13.4 +6,10600,58100,2,575,1370,0,0,0,5,0.24,43,50,2,13.4 +6,9550,49600,6,649,2960,0,0,0,0,1,43,48,14,13.4 +6,7300,44400,7,788,3030,0,0,0,0,1,43,51,12,13.4 +6,9960,53700,6,678,2220,0,0,0,0,1,43,55,10,13.4 +6,6510,37400,4,529,1540,0,0,0,0,1,43,55,9,13.4 +6,11800,44900,4,562,1670,0,0,0,0,1,43,54,12,13.4 +6,5790,30900,5,705,2250,0,0,0,0,1,43,58,9,13.4 +6,11600,44500,5,581,1870,0,0,0,0,1,32,57,11,13.4 +6,177,55400,0,17,413,0,35,0,0,1,33,54,21,13.4 +6,222,42000,2,36,311,0,175,0,0,1,34,56,22,13.4 +5,6410,45800,3,465,2850,0,0,0,0,1,34,60,79,13.4 +5,10800,43300,0,491,1140,3,0,0,0,1,34,53,21,13.4 +5,17400,43000,0,258,1130,0,0,0,0,1,34,49,40,13.4 +5,18200,66100,5,475,846,11,0,0,0,1,55,55,12,13.4 +5,4460,33100,7,689,2410,0,0,0,0,1,55,54,12,13.4 +5,10500,47300,7,696,2820,0,0,0,0,1,55,57,17,13.4 +5,3860,29300,4,739,2030,0,0,0,0,1,33,59,11,13.4 +5,8930,34900,5,466,1930,0,0,0,0,1,33,55,33,13.4 +5,9880,41700,5,582,1720,0,0,0,0,1,33,52,13,13.4 +5,7550,47400,5,746,24200,0,0,0,0,1,33,56,11,13.4 +5,5300,39600,5,685,2090,0,0,0,0,1,32,58,13,13.4 +5,15700,60200,10,507,5330,19,14,0,0,19.7,40,55,17,13.4 +5,1210,54600,0,22,226,0,68,0,0,1,32,51,26,13.4 +5,16100,53200,2,90,93,0,0,0,0,0.78,44,45,4,13.4 +4,17000,72100,5,344,2380,3,0,0,1,0.86,44,55,3,13.4 +4,22200,48400,0,82,499,0,0,0,0,1,36,44,10,13.4 +4,18900,53900,4,152,825,0,0,0,0,0.57,33,54,2,13.4 +4,6890,24800,0,322,825,0,0,0,0,1,33,55,18,13.4 +4,4990,35200,7,760,2600,0,0,0,0,1,33,56,11,13.4 +4,3910,24600,6,599,2310,0,0,0,0,1,33,52,14,13.4 +4,4300,26200,6,656,2090,0,0,0,0,1,33,55,11,13.4 +4,4690,27400,6,595,2130,0,0,0,0,1,33,55,8,13.4 +4,9600,55200,7,785,2690,0,0,0,0,1,33,57,14,13.4 +4,4070,30900,6,664,2440,0,0,0,0,1,33,57,11,13.4 +4,4860,34500,4,735,2010,0,0,0,0,1,32,59,9,13.4 +4,9660,22200,0,51,275,0,0,0,0,1,32,51,31,13.4 +4,7917,72870,4,171,2499,9,1,0,0,0.26,48,68,7,13.4 +4,19100,49000,2,92,736,0,0,0,0,0.17,43,48,4,13.4 +4,10600,49300,1,364,2020,4,0,0,0,1,43,56,76,13.4 +4,425,54300,3,68,508,0,99,0,0,1,33,49,48,13.4 +4,19700,50400,0,69,188,0,0,0,0,1,46,55,5,13.4 +3,8020,50100,6,569,3710,16,0,0,5,0.49,41,27,6,13.4 +3,1940,53800,2,29,650,0,49,0,0,1,31,49,22,13.4 +3,16900,45900,2,61,549,2,0,0,0,1,43,53,10,13.4 +3,309,38500,2,39,791,3,99,0,0,1,33,54,183,13.4 +3,3660,40100,4,669,1720,4,0,0,0,1,33,54,20,13.4 +3,17600,50900,3,426,2480,0,0,0,0,1,33,59,40,13.4 +3,5040,29500,2,510,1230,0,0,0,0,1,32,58,33,13.4 +3,7880,32100,1,368,863,0,0,0,0,1,32,58,23,13.4 +3,11200,36100,0,120,293,0,0,0,0,1,32,53,15,13.4 +3,13900,3600,1,296,5070,17,0,0,0,1,32,60,35,13.4 +3,12200,36300,2,452,6050,0,0,0,0,1,32,55,52,13.4 +3,4070,34800,7,761,2570,0,0,0,0,1,32,55,12,13.4 +3,45100,31200,5,568,2160,3,2,0,0,1,32,54,11,13.4 +3,3710,25100,6,610,2070,0,0,0,0,1,32,54,9,13.4 +3,7951,50923,11,319,3716,10,5,0,0,0.13,42,57,3,13.4 +3,220,54300,2,24,246,0,153,0,0,1.52,33,48,12,13.4 +3,9730,42000,10,532,1320,21,4,0,5,0.84,48,46,4,13.4 +3,5810,31900,9,369,1050,18,3,0,1,1.12,47,55,4,13.4 +3,11200,57300,3,483,1230,0,0,0,1,0.33,42,57,4,13.4 +3,15700,59900,1,103,555,0,0,0,0,0.43,45,43,8,13.4 +2,15700,51300,4,358,2770,2,0,0,5,0.57,46,42,4,13.4 +2,16072,46688,1,70,435,0,0,0,0,0.15,44,51,6,13.4 +2,12704,33134,2,32,801,3,3,0,1,0.39,44,63,5,13.4 +0,23500,50600,0,29,347,0,0,0,0,0.6,44,45,10,13.4 +0,302,51300,4,25,1510,3,292,0,0,1,32,49,33,13.4 +0,20600,46500,2,152,823,8,2,0,0,1,32,49,33,13.4 +0,15115,48813,2,97,915,6,1,0,0,1.45,33,49,14,13.4 +0,19100,58400,0,72,629,0,0,0,0,1,38,53,13,13.4 +0,18600,44400,0,67,511,3,0,0,0,3.47,43,56,19,13.4 +0,21900,46200,0,46,520,3,0,0,0,1.1,41,36,16,13.4 +0,21300,46200,0,51,658,0,0,0,0,0.75,37,41,9,13.4 +0,16443,43308,1,10,348,0,0,0,0,0.83,41,73,5,13.4 +0,20000,54700,3,117,699,0,0,0,0,0.05,34,51,2,13.4 +0,16600,49300,3,105,624,0,0,0,0,0.47,32,55,4,13.4 +0,17000,55600,4,182,1100,0,0,0,0,0.58,34,57,5,13.4 +0,21200,60000,5,123,767,0,0,0,0,0.54,32,50,4,13.4 +0,25600,47100,0,25,467,0,0,0,0,0.33,44,54,3,13.4 +0,789,20300,6,280,502,0,0,0,0,0.31,46,51,3,13.4 +0,21500,45600,6,197,2070,34,15,0,4,0.13,44,55,3,13.4 +0,23100,48600,0,202,2220,6,0,0,6,0.06,45,54,3,13.4 +0,16100,38600,0,251,5620,21,0,0,0,1,45,56,44,13.4 +0,14700,36500,2,284,3820,0,0,0,0,1,45,57,42,13.4 +0,9444,35331,3,358,5507,6,0,0,0,1,45,75,75,13.4 +0,27300,65600,0,56,202,0,0,0,0,1,43,48,3,13.4 +0,1230,10500,2,113,326,0,0,0,0,1,45,56,5,13.4 +0,4330,11200,0,81,192,0,0,0,0,1,57,57,4,13.4 +0,19900,43300,0,114,782,0,0,0,4,1.33,40,54,6,13.4 +0,25800,57100,0,49,427,0,0,0,0,0.07,45,49,11,13.4 +0,22800,46800,0,66,914,0,0,0,0,1,41,51,4,13.4 +0,23200,45800,0,40,620,0,0,0,0,0.76,46,52,5,13.4 +0,24100,49300,0,84,779,6,0,0,0,1.69,36,47,7,13.4 +0,24300,50200,0,54,738,0,0,0,0,1.75,44,55,4,13.4 +0,448,38900,2,24,482,0,99,0,0,4.39,31,53,12,13.4 +0,22800,44600,0,36,585,0,0,0,0,1,31,51,34,13.4 +0,16000,48000,2,426,1360,0,0,0,5,0.6,48,54,4,13.4 +0,23900,45900,0,49,466,0,0,0,5,0.29,45,53,4,13.4 +0,20300,62500,0,78,190,0,0,0,0,1,45,56,5,13.4 +0,19500,54800,0,73,196,0,0,0,0,1,46,56,4,13.4 +0,18400,51700,0,61,304,0,0,0,0,1,43,50,6,13.4 +18,154,42800,5,127,711,3,91,0,0,1,32,53,7,13.4 +11,15600,45000,3,309,2240,0,3,0,147,0.5,39,53,3,13.4 +11,1760,56800,2,41,594,3,49,0,0,1,31,60,27,13.4 +11,1770,48600,0,30,593,0,60,0,0,3.97,31,58,29,13.4 +11,1780,56900,2,29,867,0,54,0,0,2.78,31,50,27,13.4 +11,265,50800,2,54,1050,0,63,0,0,1,30,50,16,13.4 +11,15700,41700,0,62,649,0,0,0,0,1,33,44,16,13.4 +11,222,41000,2,35,309,0,211,0,0,2.53,33,58,30,13.4 +17,262,47400,2,46,1050,4,97,0,0,1,33,57,26,13.4 +17,645,49600,6,87,599,5,211,0,0,4.46,33,56,19,13.4 +17,259,53300,2,31,561,0,56,0,0,2.9,32,54,19,13.4 +17,233,53500,2,40,1230,3,64,0,0,4.18,34,59,42,13.4 +17,232,48600,2,47,796,0,116,0,0,2.15,30,50,23,13.4 +17,564,14600,5,320,2450,0,0,0,1,1.07,45,52,6,13.4 +16,1050,51600,15,122,12000,0,21,0,0,0.23,43,47,5,13.4 +16,2020,56600,6,138,663,0,138,0,0,1,33,58,12,13.4 +16,2270,65400,0,35,604,0,53,0,0,1.83,33,52,22,13.4 +16,2030,53800,4,44,709,17,183,0,0,1,33,55,22,13.4 +12,151,48200,2,34,569,4,48,0,0,1,31,58,20,13.4 +12,1840,61900,2,36,1560,3,72,0,0,4.5,31,55,36,13.4 +12,285,52500,2,35,895,0,51,0,0,3.22,33,54,37,13.4 +12,465,52700,2,52,918,0,84,0,0,3.83,33,55,24,13.4 +12,2150,11100,2,170,1440,0,0,0,1,0.73,45,54,6,13.4 +15,227,52900,3,60,853,3,84,0,0,1,32,56,28,13.4 +15,334,47100,3,64,622,3,108,0,0,1,32,55,12,13.4 +15,1280,35000,2,675,2530,0,0,0,5,0.3,45,58,8,13.4 +15,169,50600,5,77,532,0,72,0,0,1.21,33,54,11,13.4 +15,308,39700,3,64,581,5,27,0,0,1,32,60,18,13.4 diff --git a/src/servers/fmsr/artifacts/health_index_model.pkl b/src/servers/fmsr/artifacts/health_index_model.pkl new file mode 100644 index 0000000000000000000000000000000000000000..4397c3a3283e8ca3901a0294ddaa669a4fd74ecb GIT binary patch literal 3402878 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

N_w1AiFT`qIjtM_o%nn!*z8C?XT=}^jHrx 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

`=rV}2WI@*yKGCE%2( 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

SC_VqW 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%0DRbmqYeL2ae3!cjP5Mly_78 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

n@-?&@}L^%lgk@5btn64su($ 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

u58Jt5A!EZXck-6bWQa2O5qZ}T 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 literal 0 HcmV?d00001 diff --git a/src/servers/fmsr/artifacts/health_index_scalers.pkl b/src/servers/fmsr/artifacts/health_index_scalers.pkl new file mode 100644 index 0000000000000000000000000000000000000000..0d3f3bbcafa7d306be98543dc97d2abb7a97bb71 GIT binary patch literal 1047 zcmaKrUrZE79LG7hgCoL;y`bQkQb8#OJ;J3mR!jJ;-~(QIsHkmXbe-EB*lqV_x3hD1 zo{?6lSZF3O!Wfg%rlko5G9T^}#;XphkEwDK_{w*oW5gU}IS2iJ zi0VE04Ps1e8W8=WiI--X z%E?7l&89e-N?XiCl%kyA6)MG=OQ{QxbK8WBoe!y%a;Gd+nGp?9G1?5Moy=8A0~pA+Q)MF zL6DeiIaZd!%s>Q7LCqGtM6+X(myG2s>_toeSuRH!X3Igpp444ghGSMxSI9lk|Gay_a~JqjVh0>@yd&A zrDE?3ipCo+^YrvaI-Kyg_qTl6n1x^NH6H0cJC*P4!F%wVbtAj=VHe!|D7}8mK^sOl zbd7GfJPz}V_#6cG!C!Yv8g__1u&`?4!qet=ATo6-TXek{l$8f(w%>WyKGr;Zt-7-V z>S|^uE?wRY#no3PXPg!g9v*)N(f_gy(o`S$GjnS?p%@kOEoU~3DH&s_Jm^j;({<5U z_u>*vxBa+t?dgZm(AIc+qH&K>_3rNzk&nZQGHX59cIq)K)D1kl`e8u%Ztc`YJ~s}{ z$wR+xw-l)DZ7CbPvlFU5A8%FecEUGJZrl7*vtTNJ8TkKfoh*BD^yZPT;Expt-v4ay z2N<~(`FSDs6Lk8{y!B|wh3;!TiI(~lTpiuKcUSmpXiC2RTKd8O)P(wR=bHrl)8nt! z$Bx5r>-QBs>vlo)%=6ldU#x*hY|?jrvty literal 0 HcmV?d00001 diff --git a/src/servers/fmsr/artifacts/transformer_health_index_predictor.ipynb b/src/servers/fmsr/artifacts/transformer_health_index_predictor.ipynb new file mode 100644 index 000000000..f46ff01fc --- /dev/null +++ b/src/servers/fmsr/artifacts/transformer_health_index_predictor.ipynb @@ -0,0 +1,778 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "id": "hjrR9QoPl6wI" + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "import pickle\n", + "import os\n", + "\n", + "from sklearn.ensemble import RandomForestRegressor\n", + "from sklearn.preprocessing import StandardScaler\n", + "from sklearn.model_selection import train_test_split, cross_val_score\n", + "from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score\n", + "from sklearn.inspection import permutation_importance\n", + "\n", + "import warnings\n", + "warnings.filterwarnings('ignore')\n", + "\n", + "np.random.seed(42)\n", + "sns.set_style(\"whitegrid\")\n", + "plt.rcParams['figure.figsize'] = (12, 6)" + ] + }, + { + "cell_type": "code", + "source": [ + "df = pd.read_csv('health_index_dataset.csv')\n", + "\n", + "print(\"Dataset Shape:\", df.shape)\n", + "print(\"\\nColumns:\", list(df.columns))\n", + "print(\"\\nFirst 5 rows:\")\n", + "print(df.head())\n", + "print(\"\\nBasic Statistics:\")\n", + "print(df.describe())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "D2XWPARml_ff", + "outputId": "0e99c03e-4e0e-4de2-cbb0-4ab0bb0b0245" + }, + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Dataset Shape: (470, 15)\n", + "\n", + "Columns: ['Hydrogen', 'Oxigen', 'Nitrogen', 'Methane', 'CO', 'CO2', 'Ethylene', 'Ethane', 'Acethylene', 'DBDS', 'Power factor', 'Interfacial V', 'Dielectric rigidity', 'Water content', 'Health index']\n", + "\n", + "First 5 rows:\n", + " Hydrogen Oxigen Nitrogen Methane CO CO2 Ethylene Ethane \\\n", + "0 2845 5860 27842 7406 32 1344 16684 5467 \n", + "1 12886 61 25041 877 83 864 4 305 \n", + "2 2820 16400 56300 144 257 1080 206 11 \n", + "3 1099 70 37520 545 184 1402 6 230 \n", + "4 3210 3570 47900 160 360 2130 4 43 \n", + "\n", + " Acethylene DBDS Power factor Interfacial V Dielectric rigidity \\\n", + "0 7 19.0 1.00 45 55 \n", + "1 0 45.0 1.00 45 55 \n", + "2 2190 1.0 1.00 39 52 \n", + "3 0 87.0 4.58 33 49 \n", + "4 4 1.0 0.77 44 55 \n", + "\n", + " Water content Health index \n", + "0 0 95.2 \n", + "1 0 85.5 \n", + "2 11 85.3 \n", + "3 5 85.3 \n", + "4 3 85.2 \n", + "\n", + "Basic Statistics:\n", + " Hydrogen Oxigen Nitrogen Methane CO \\\n", + "count 470.000000 470.000000 470.000000 470.000000 470.000000 \n", + "mean 404.261702 8357.372340 47759.561702 79.695745 244.000000 \n", + "std 2002.142678 14164.233283 13760.451816 489.320336 237.267485 \n", + "min 0.000000 57.000000 3600.000000 0.000000 10.000000 \n", + "25% 4.000000 496.000000 41700.000000 2.000000 66.000000 \n", + "50% 9.000000 3810.000000 49100.000000 3.000000 150.500000 \n", + "75% 34.000000 14875.000000 55875.000000 7.000000 361.750000 \n", + "max 23349.000000 249900.000000 85300.000000 7406.000000 1730.000000 \n", + "\n", + " CO2 Ethylene Ethane Acethylene DBDS \\\n", + "count 470.000000 470.000000 470.000000 470.000000 470.000000 \n", + "mean 1816.414894 162.923404 81.940426 91.491489 17.036596 \n", + "std 2256.790519 1323.811504 342.573636 644.365828 46.735057 \n", + "min 48.000000 0.000000 0.000000 0.000000 0.000000 \n", + "25% 641.750000 0.000000 0.000000 0.000000 0.000000 \n", + "50% 1125.000000 3.000000 4.000000 0.000000 0.000000 \n", + "75% 2257.500000 6.000000 69.750000 0.000000 2.000000 \n", + "max 24900.000000 16684.000000 5467.000000 9740.000000 227.000000 \n", + "\n", + " Power factor Interfacial V Dielectric rigidity Water content \\\n", + "count 470.000000 470.000000 470.000000 470.000000 \n", + "mean 1.849043 38.434043 53.495745 16.282979 \n", + "std 6.144009 6.178830 6.458906 17.115646 \n", + "min 0.050000 21.000000 27.000000 0.000000 \n", + "25% 0.570000 32.000000 51.000000 5.000000 \n", + "50% 1.000000 39.000000 54.000000 12.000000 \n", + "75% 1.000000 44.000000 56.000000 21.000000 \n", + "max 73.200000 57.000000 75.000000 183.000000 \n", + "\n", + " Health index \n", + "count 470.000000 \n", + "mean 27.504043 \n", + "std 17.741458 \n", + "min 13.400000 \n", + "25% 13.400000 \n", + "50% 13.400000 \n", + "75% 38.550000 \n", + "max 95.200000 \n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Missing values and duplicates\n", + "print(\"\\nMissing Values:\")\n", + "print(df.isnull().sum())\n", + "print(f\"\\nDuplicate rows: {df.duplicated().sum()}\")\n", + "\n", + "# Health Index distribution\n", + "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n", + "\n", + "axes[0].hist(df['Health index'], bins=30, edgecolor='black', alpha=0.7, color='steelblue')\n", + "axes[0].set_xlabel('Health Index')\n", + "axes[0].set_ylabel('Frequency')\n", + "axes[0].set_title('Distribution of Health Index')\n", + "\n", + "axes[1].boxplot(df['Health index'])\n", + "axes[1].set_ylabel('Health Index')\n", + "axes[1].set_title('Boxplot of Health Index')\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('health_index_distribution.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(f\"\\nHealth Index Statistics:\")\n", + "print(f\" Mean: {df['Health index'].mean():.2f}\")\n", + "print(f\" Std Dev: {df['Health index'].std():.2f}\")\n", + "print(f\" Min: {df['Health index'].min():.2f}\")\n", + "print(f\" Max: {df['Health index'].max():.2f}\")\n", + "\n", + "# Correlation heatmap\n", + "plt.figure(figsize=(14, 10))\n", + "corr = df.corr()\n", + "sns.heatmap(corr, annot=True, fmt='.2f', cmap='coolwarm', center=0)\n", + "plt.title('Feature Correlation Heatmap')\n", + "plt.tight_layout()\n", + "plt.savefig('correlation_heatmap.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(\"\\nFeature Correlation with Health Index:\")\n", + "print(df.corr()['Health index'].sort_values(ascending=False))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "Gk1DmEHNmE6Y", + "outputId": "1ee1922c-7a81-4628-a3ea-1464f7f9b2a6" + }, + "execution_count": 3, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Missing Values:\n", + "Hydrogen 0\n", + "Oxigen 0\n", + "Nitrogen 0\n", + "Methane 0\n", + "CO 0\n", + "CO2 0\n", + "Ethylene 0\n", + "Ethane 0\n", + "Acethylene 0\n", + "DBDS 0\n", + "Power factor 0\n", + "Interfacial V 0\n", + "Dielectric rigidity 0\n", + "Water content 0\n", + "Health index 0\n", + "dtype: int64\n", + "\n", + "Duplicate rows: 0\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "

" + ], + "image/png": "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qlSpko4ePaqff/5ZktSoUSMNGTJEb775ph588EG1bNlSktSiRQvLHBcuXNDAgQPVrVs39ejRQ/7+/tes6+2335aLi4sGDhyolJQUvf/++3r88cf16aefWq4ILozC1PZ3hmHomWeesYS9zZo10+bNmzV16lSdPXtWY8aMsdr/p59+0pdffqlHHnlEVapU0dKlSzVkyBB9++23uuGGG65a159//qm+ffvq2LFj6tOnjwIDA/X5559r1KhRSk1N1WOPPaZGjRpp6tSpiouLU61atfTEE09IkqpVq3bN55yTk1PgSWdaWlq+seTkZD3wwANycXFRnz59VK1aNX3//fd6+eWXlZ6erscff1ySlJ6ero8//ljdu3fXv/71L126dEmffPKJBgwYoI8//viqS2J06dJFR44c0fr16zV69GhLT/7+HIrbw2uZPHmyfH19NXjwYJ08eVLvv/++Jk6cqJkzZ1r2mTVrlt5++221b99e7du31549e/Tkk08qOzvbaq7MzEw9+uijOnv2rB566CHdeOON2rlzp2bMmKGkpCS9/PLLcnFxUWxsrHr06KFx48Zpzpw5kq6E1gcOHNDSpUvl5eVVrOcCAABKJj093XJulJKSoqVLlyojI0M9evSw7FOYc8DKlSvrtdde08MPP6w33nhDo0ePliRNnDhRaWlpiouLk8lkssxpNps1YMAANW/eXC+99JI2b96s2bNny2w2WwLXghw4cEB9+vRRlSpVNGDAALm5uemjjz5S3759tWzZMjVv3ly33nqr+vbtq6VLl+rpp59Ww4YNJV05972arVu3auDAgQoMDNTgwYP1559/atmyZXr44Ye1evVqBQYG6sEHH1TNmjU1b9489e3bV6Ghoapevfp1e3zp0qUCzz8LCiTXrl2rUaNGKTo6WsOHD1dmZqaWL1+uRx55RGvWrLEs9bB161YdP35cMTExCggI0IEDB7Ry5UodPHhQK1eulIuLS4G1jBkzRpMmTZKXl5eefvppScr3HApzrlgUFy9e1IABA9SlSxfdc889+uKLLzRt2jQFBQWpffv2kq6c/z/22GM6ffq0+vbtqxo1aujTTz8t8CKIhIQEDRw4UCEhIRo8eLBcXFy0evVqPfbYY/rwww8VFhamRo0aaejQoZo6daruuusu3XHHHcrIyNDo0aPVsGHDa77GAJQRAwCuYdWqVUZQUJDx66+/XnWfli1bGvfff7/l9ptvvmkEBQVZbi9evNgICgoyUlJSrjrHr7/+agQFBRmrVq3Kt+3RRx81goKCjOXLlxe47dFHH7Xc3rZtmxEUFGTcfvvtRlpammV848aNRlBQkPH+++9bxjp27GiMHDnyunNeq7aRI0caHTt2tNz+6quvjKCgIOOtt96y2u/55583goODjaNHj1rGgoKCjFtuucVqbO/evUZQUJCxdOnSfI/1d++9954RFBRkfPrpp5axrKws48EHHzTCw8OtnnvHjh2NQYMGXXO+v+8bFBR0za/PPvvMsv+YMWOMtm3bGufPn7eaZ9iwYUbLli2NzMxMwzAMIycnx7h8+bLVPhcvXjSioqKM0aNHW40HBQUZb775puX2woULjaCgIOP48eP56i1JD48fP24EBQUZCxcutIzlvd4ff/xxIzc31zIeGxtrNGvWzEhNTTUMwzBSUlKMW265xRg0aJDVfjNmzDCCgoKsXldz5841wsPDjcOHD1s9/rRp04xmzZoZp06dsoytWLHC8ve6a9cuo1mzZsaUKVOu+TwAAEDpyDsv+OdXSEiIsXr1aqt9i3IOOH36dKNp06bGjz/+aHz22WdGUFCQ8d5771ndb+TIkUZQUJAxadIky1hubq4xaNAg45ZbbrE6r/7nudOzzz5r3HLLLcaxY8csY2fPnjUiIiKMPn36WMbyHnvbtm2F6sd9991nREZGGv/73/8sY3v37jWaNm1qjBgxwjKWdz7+93PGq8nb91pf4eHhlv3T09ONVq1aGWPHjrWaJykpyWjZsqXVeN556N+tX7/eCAoKMn788UfLWN7f89/PNbt162b188A/973eueLV5P2c9Pe/v7yfddasWWMZu3z5stG2bVvj+eeft4zlnf9v3LjRMpaRkWF06dLF6u8xNzfXuPPOO40nn3zSqsbMzEyjU6dOxhNPPGEZM5vNxsMPP2xERUUZ58+fNyZMmGDcfPPN1/zZD0DZYXkEACXm5eWlS5cuXXV73odHffPNN5a3gxdVpUqVivRBAPfff7+8vb0tt++++24FBASU+if9fv/99zKZTPneQvXkk0/KMIx8b9uPiopSvXr1LLebNm0qb29vHT9+/LqPExAQoO7du1vG3N3d1bdvX2VkZOjHH38s9nNo3ry5Fi9enO9r5MiRVvsZhqEvv/xSnTp1kmEYOn/+vOUrOjpaaWlp2rNnjyTJZDJZ1h/Ozc3VhQsXlJOTo5CQEP3222/FrlUqfg+vJe/q4TytWrWS2WzWyZMnJV25ciM7O1uPPvqo1X6PPfZYvrk+//xztWzZUr6+vlY9ioqKktlstvq7evDBBxUdHa3JkydrxIgRqlu3rv79738X+3kAAICSe/XVVy3nQ6+//rpat26tsWPH6ssvv7TsU5RzwMGDB6tx48YaOXKkJkyYoNtuu039+vUr8LH79Olj+XPeO5uys7OVkJBQ4P5ms1k//PCDOnfurLp161rGa9Sooe7du+unn35Senp6kXtw7tw57d27Vz179lTVqlUt402bNlVUVFSJz7Gfe+65As8/o6OjrfbbunWrUlNT1a1bN6vzKldXVzVv3txqeYe/v7vu8uXLOn/+vJo3by5JlnPU4rreuWJReXl56b777rPcrlSpkkJDQ63OZ/PO/++++27LmKenZ753O+7du1dHjhzRvffeq//973+WHmVkZCgyMlI//vij5WcyV1dXxcfHKyMjQwMHDtSHH36oQYMGWa3hDMB+WB4BQIllZGRcc7mCrl276uOPP9bYsWM1ffp0RUZGqkuXLrr77rvl6lq43x3VrFmzSB86Vr9+favbLi4uql+/frFPpArr5MmTqlGjhlVgLP31VrN/Pv6NN96Ybw4/Pz+lpqZe93Hq16+fr395j3Pq1Kki157nhhtuUFRUVL7xv79dT7ryIROpqan66KOP9NFHHxU419/f5rZmzRq9++67Onz4sNUSAiX9tOLi9vBaateubXU77xcPeXPm9femm26y2q9atWry8/OzGjt69Kj279+vyMjIAh/rn28FjI2NVefOnXXx4kWtWLGiSMt5AAAA2wsLC7MKsbp37677779fEydOVIcOHVSpUqUinQNWqlRJsbGx6t27tzw8PBQbG1vgW/VdXV2tgldJatCgQb75/u78+fPKzMy07PfPWnJzc3X69Gk1adKkkM/+irxzn6vNu2XLFmVkZBR7OaegoKACzz///rkZknTkyBFJBf+iXJJV/y9cuKA5c+Zo48aNVp8ZIBW87FdRXO9csahq1aqV7zXg5+en/fv3W27nnf//c79//p3k9eifF1z8XVpamuWctV69eho8eLCmTp2qoKAgPfvss8V6DgBsj9AWQImcOXNGaWlpVlc6/lPlypX1wQcfaPv27dq0aZM2b96sjRs36qOPPtK7776bLwy82hxlxWw2F6omW7ja4xiF+IAJe8v7DX2PHj3Us2fPAvfJ+0C6Tz/9VKNGjVLnzp3Vv39/+fv7y2Qyaf78+SW6IlYqnR5e7ZcJxZkzNzdXbdu21YABAwrc/s/gd/v27Zb1237//XdFREQU+TEBAEDpcXV1VevWrbVkyRIdPXq0yAGoJG3ZskXSlStAjx49mi+cRcHyzsWmTp2qgICAfNv/fl74wgsvaOfOnerfv7+aNWsmLy8v5ebmasCAASU+17bluaJ09fPZ4sirYcSIEVf93Ih/hus//PCDpCtXVF+4cKHA3gIoe4S2AErk008/laR8b136J1dXV0VGRioyMlKjR4/WvHnz9MYbb2j79u2Kioq66gcBFNfRo0etbhuGoaNHj1pCROnqV2OeOnXK6sS5KLXVqVNHCQkJSk9Pt/pN/6FDhyzbbaFOnTrav3+/cnNzrU4a8x7nn7/9Lw3VqlVTlSpVlJubW+CVEX/3xRdfqG7dupozZ45VP998883rPo6tXxu2kNffI0eOWL1Wzp8/r4sXL1rtW69ePWVkZFy3R9KVE+XJkycrOjpa7u7ueu211xQdHW2z1w0AALANs9ks6co7zqSinQPu27dPc+fOVUxMjPbt26exY8dq3bp18vHxsXqM3NxcHT9+3OpKysOHD+eb7++qVasmT09Py35/d+jQIbm6ulrepVSUc6y8c5+rzXvDDTeUyYem5p13+fv7X/Pc6uLFi0pISNDzzz+vwYMHW8bzrkK9Hkc8/6xTp45+//13GYZhVd8//07yeuTt7V2o88/ly5frhx9+0LBhwzR//ny9+uqrevvtt21bPIBiYU1bAMWWkJCgt956S4GBgVafnvtPFy5cyDeW91vfvCsKPT09JRX/LUX/tHbtWqv1uj7//HMlJSWpXbt2lrG6devql19+sfpU2m+//VanT5+2mqsotbVr105ms1kffPCB1fh7770nFxcXq8cviXbt2ikpKUkbN260jOXk5Gjp0qXy8vLSrbfeapPHuRaTyaS77rpLX3zxhX7//fd82//+tv+8qwf+fvXBL7/8ol27dl33cfL6X9K3sdlSVFSU3N3dtWzZMqvn9P777+fb95577tHOnTu1efPmfNtSU1OVk5Njuf3KK68oNzdXU6ZM0cSJE+Xm5qaXX365XFx5DQCAs8jOztYPP/wgd3d3y/IHhT0HzM7O1ujRo1WjRg29/PLLiouLU3JysmJjYwt8rL/PZxiGPvjgA7m7u1912SWTyaS2bdvqm2++0YkTJyzjycnJWr9+vVq2bGkJlYtyjlWjRg01a9ZMa9eutTon/v333/XDDz+offv2153DFm6//XZ5e3tr/vz5Vstt5ck7/7zalasFnasVxNPT02Y/l9hKu3btdO7cOX3++eeWsczMTK1cudJqv5CQENWrV0/vvvtugZ878vdz9OPHj2vq1Km666679PTTT2vkyJH673//q7Vr15ba8wBQeFxpC6BQvv/+ex06dEhms1nJycnavn27fvjhB9WuXVtvv/22PDw8rnrfuXPn6v/+7//Uvn171alTRykpKfrwww9Vq1YttWzZUtKVqxF9fX21YsUKValSRV5eXgoLCyv2W8X8/Pz0yCOPKCYmRikpKXr//fdVv359q4X6//Wvf+mLL77QgAEDdM899+jYsWNat25dvqUeilJbp06d1Lp1a73xxhs6efKkgoOD9cMPP+ibb77RY489ds1lJIriwQcf1EcffaRRo0Zpz549qlOnjr744gv9/PPPGjNmTL711ErLiy++qO3bt+uBBx7Qv/71LzVu3FgXL17Unj17lJCQoB07dkiSOnTooC+//FLPPfecOnTooBMnTmjFihVq3Lix5QqVq7nlllskSW+88Ya6du0qd3d3dezYsUyu5riaatWq6cknn9T8+fP11FNPqX379vrtt9/0/fff64YbbrDat3///vrvf/+rp59+Wj179tQtt9yizMxM/f777/riiy/0zTffqFq1alq1apU2bdqk+Ph41apVS5I0duxYvfTSS/rwww+tPogEAACUnbzzYOlK4LVu3TodOXJEgwYNspxzFfYc8O2339bevXv13nvvydvbW02bNtVzzz2nmTNn6u6777YKPz08PLR582aNHDlSYWFh2rx5szZt2qSnn35a1apVu2q9L7zwgrZu3apHHnlEjzzyiEwmkz766CNlZWXppZdesuzXrFkzmUwmLViwQGlpaapUqZLatGlz1c+qGDFihAYOHKgHH3xQvXv31p9//qlly5bJx8fH6mrW0uTt7a3x48drxIgRiomJUdeuXVWtWjWdOnVK3333nVq0aKFXX31V3t7euvXWW7Vw4UJlZ2erZs2a+uGH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q1Zp48aN8vT01JNPPqnevXvr7NmzmjNnjp599ll98skntqoVAAAAKBWjRo1S//791bVrV2VlZWn48OE6cuSIbrjhBs2YMaPQ8yxYsEC1atVSXFycZezvH+BrGIaWLFmiZ555Rp07d5YkTZ06VVFRUfr666/VrVs32z0pAAAAlFvFCm0XL16s1atX6/Dhw2rXrp3l6lpX1ysX7tatW1fx8fHq1KmTTYsFAAAASkOtWrX06aefasOGDdq/f78yMjLUu3dv3XvvvapcuXKh5/nvf/+r6OhoDRkyRD/++KNq1qypRx55RA888IAk6cSJE0pKSlJUVJTlPj4+PmrevLl27txJaAsAAABJxQxtly9frl69eqlnz56qUaNGgftUq1ZNU6ZMueY8P/74oxYtWqTdu3crKSlJc+fOtVxxIF254mHNmjVW94mOjtaiRYssty9cuKBJkybp22+/laurq+688069/PLLRV57DAAAAM7Nzc1N9913X4nmOH78uJYvX64nnnhCTz/9tBITEzV58mS5u7urZ8+eSkpKkiT5+/tb3c/f31/JyclFfjyz2VyiegHAEeWtMZ6bm8txDkCFU9jjWrFC2y+//PK6+1SqVEk9e/a85j4ZGRkKDg5Wr169NHjw4AL3uf32263eXvbPT/QdPny4kpKStHjxYmVnZ2vMmDF69dVXNX369EI8EwAAADirb775ptD73nHHHYXazzAMhYSE6N///rck6eabb9aBAwe0YsWK654bF8ffP+AMACqKgwcPWr67uZVoVUcAKLeKdfRbtWqVvLy8dM8991iNf/bZZ/rzzz8LfULavn37636wQ6VKlRQQEFDgtj/++EObN2/WJ598otDQUEnS2LFjNWjQII0YMUI1a9YsVB0AAABwPs8995zVbRcXFxmGkW9Mkvbu3VuoOQMCAtSoUSOrsYYNG+qLL76wbJeklJQUq3espaSkqGnTpkV7ApJCQ0NlMpmKfD8AcGQ5OTmSpMaNGys8PNy+xQCAjZnN5kL94r1Yoe0777yjCRMm5Bv39/fXK6+8YtOrCHbs2KHIyEj5+vqqTZs2euGFF3TDDTdIknbu3ClfX19LYCtJUVFRcnV11a+//qouXbrYrA4AAABULPv27bP8eevWrZo2bZqGDRumiIgISVfONWfOnGm5arYwWrRoocOHD1uNHTlyRHXq1JEkBQYGKiAgQAkJCWrWrJkkKT09Xb/88osefvjhIj8Hk8lEaAugwsn7vBxXV1eOcQCcVrFC21OnTikwMDDfeO3atXX69OkSF5Xn9ttvV5cuXRQYGKjjx49rxowZGjhwoD766COZTCYlJyerWrVqVvdxc3OTn5+fZb2woshbU+Kf323tyryGDMPIdzVHUV25vyGz2Vzqa/2Udl/KK/qSHz0pGH3Jj54UjL4UjL7kR09s99xjY2M1fvx4tWrVyjJ2++23y9PTU6+88oo+++yzQs3z2GOP6eGHH9a8efN0zz336Ndff9XKlSs1ceJESVeu3O3Xr5/efvtt1a9fX4GBgZo1a5Zq1Khh9dkOAAAAcG7FCm39/f21f//+fMHtvn37VLVqVVvUJUlWn54bHBys4OBgde7c2XL1ra3989Lk0loj7MSJE8rIzFR6errcPFNLNFd6eroyMjO1d+9epaWl2ajCa2PttILRl/zoScHoS370pGD0pWD0JT96UnLHjh2Tr69vvnFvb2+dPHmy0POEhYVpzpw5mjFjhubOnavAwECNGTNGPXr0sOwzcOBAZWZm6tVXX1VqaqpatmyphQsXysPDwybPBQAAAOVfsULbbt26acqUKapSpYpuvfVWSVeWMYiNjbUKWm2tbt26uuGGG3T06FFFRkaqevXqOn/+vNU+OTk5unjx4lXXwb2WvDXB8taWKK01wnx8fOTl6Slvb+8CfzgoipzMVHl5eqpZs2b51k+ztdLuS3lFX/KjJwWjL/nRk4LRl4LRl/zoSeHXBLue0NBQxcfHa+rUqapevbokKTk5Wa+//rrCwsKKNFfHjh3VsWPHq253cXHR0KFDNXTo0BLVDAAAgIqrWKHt0KFDdfLkST3++OOWT3LMzc3Vfffdp2HDhtm0wL87c+aMLly4YAlkIyIilJqaqt27dyskJESStG3bNuXm5hb55FrKvyZYaa0RdmVOF7m4uFg+3KK4rtzfpUzXM2PttILRl/zoScHoS370pGD0pWD0JT96UnKxsbEaPHiwOnTooBtvvFGSdPr0ad10002aO3eunasDAACAsylWaFupUiXNnDlThw8f1r59+1S5cmUFBQVZPmChsC5duqRjx45Zbp84cUJ79+6Vn5+f/Pz8NGfOHN11112qXr26jh8/rtdff13169fX7bffLklq1KiRbr/9dr3yyiuaMGGCsrOzNWnSJHXr1k01a9YszlMDAACAE6pfv77+85//6IcfftChQ4ckXTnXjIqKKvEv2QEAAICiKlZom6dBgwZq0KBBse+/e/du9evXz3I7Li5OktSzZ0+NHz9ev//+u9auXau0tDTVqFFDbdu21dChQ1WpUiXLfaZNm6ZJkybpsccek6urq+68806NHTu2+E8KAAAATsnFxUXR0dGKjo62dykAAABwcsUKbc1ms1avXq1t27YpJSVFubm5VtuXLFlSqHlat26t/fv3X3X7okWLrjtH1apVNX369EI9HgAAAHA1CQkJSkhIKPD8Nu/iAgAAAKAsFCu0nTJlitasWaP27durSZMmvGUMAAAA5dqcOXM0d+5chYSEKCAggPNbAAAA2FWxQtsNGzZo5syZat++va3rAQAAAMrcihUrFBcXp/vvv9/epQAAAAByLc6d3N3dVa9ePVvXAgAAANhFdna2WrRoYe8yAAAAAEnFDG2ffPJJLVmyRIZh2LoeAAAAoMz17t1b69ats3cZAAAAgKRiLo/w008/afv27fr+++/VpEkTublZTzNnzhybFAcAAACUhcuXL2vlypVKSEhQcHBwvvPb0aNH26kyAAAAOKNihba+vr7q0qWLrWsBAAAA7GL//v1q2rSpJOn333+32saHkgEAAKCsFSu0jYuLs3UdAAAAgN0sXbrU3iUAAAAAFsVa01aScnJytHXrVq1YsULp6emSpLNnz+rSpUs2Kw4AAAAAAAAAnE2xrrQ9efKkBgwYoNOnTysrK0tt27aVt7e3FixYoKysLE2cONHWdQIAAAA2N3jw4ELtx2c2AAAAoCwV60rbKVOmKCQkRDt27JCHh4dlvEuXLtq2bZvNigMAAABKk4+PT6G+AAAAgLJUrCttf/rpJy1fvlyVKlWyGq9Tp47Onj1rk8IAAACA0sZnNQAAAMARFetK29zcXOXm5uYbP3PmjKpUqVLiogAAAAAAAADAWRUrtG3btq3ef/99q7FLly5p9uzZat++vU0KAwAAAAAAAABnVKzQdtSoUfr555/VtWtXZWVlafjw4erUqZPOnj2r4cOH27pGAAAAAAAAAHAaxVrTtlatWvr000+1YcMG7d+/XxkZGerdu7fuvfdeVa5c2dY1AgAAAAAAAIDTKFZoK0lubm667777bFkLAAAAAAAAADi9YoW2a9euveb2+++/vzjT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v248/PDDV93OMdcwJk+ebHTu3NnIzc116tfKoEGDjNGjR1uNDR482HjxxRcNw3DO10pmZqbRrFkz49tvv7Ua79mzpzFjxgyn7AkAoOL758/oAOBsnPpK22s5ceKEkpKSFBUVZRnz8fFR8+bNtXPnTjtWVrbS0tIkyXI13O7du5WdnW3Vl0aNGql27dratWuXPUosc2azWRs2bFBGRoYiIiKcvicTJ05U+/btrZ6/5NyvlaNHjyo6Olp33HGHXnzxRZ06dUqSc/fkv//9r0JCQjRkyBBFRkbq/vvv18qVKy3bnf2Ym5WVpf/85z/q1auXXFxcnPq1EhERoW3btunw4cOSpH379umnn35Su3btJDnnayUnJ0dms1keHh5W4x4eHvr555+dsicAAABARedm7wIcVVJSkiTJ39/fatzf398p1hSUpNzcXMXGxqpFixYKCgqSJCUnJ8vd3V2+vr5W+/r7+1t6VlHt379fDz30kC5fviwvLy/NnTtXjRs31t69e522Jxs2bNBvv/2mTz75JN82Z32thIWFKS4uTg0aNFBSUpLmzp2rPn36aN26dU7bE0k6fvy4li9frieeeEJPP/20EhMTNXnyZLm7u6tnz55Of8z9+uuvlZaWpp49e0py3n8/kjRo0CClp6frnnvukclkktls1rBhw9SjRw9Jzvn/s7e3tyIiIvTWW2+pYcOGql69utavX69du3apXr16TtkTAAAAoKIjtMVVTZgwQQcOHLBaj9OZNWjQQGvXrlVaWpq++OILjRw5UsuWLbN3WXZz+vRpTZkyRe+++26+q7+cWfv27S1/btq0qZo3b66OHTvqs88+U+XKle1YmX0ZhqGQkBD9+9//liTdfPPNOnDggFasWGEJKp3ZqlWr1K5dO9WsWdPepdjdZ599pnXr1mn69OmWX4zFxcWpRo0aTv1amTp1qsaMGaN27drJZDLp5ptvVrdu3bRnzx57lwYAAACgFLA8wlUEBARIklJSUqzGU1JSVL16dXuUVKYmTpyoTZs26f3331etWrUs49WrV1d2drZSU1Ot9k9JSbH0rKKqVKmS6tevr5CQEL344otq2rSplixZ4rQ92bNnj1JSUhQTE6Obb75ZN998s3bs2KGlS5fq5ptvdtq+/JOvr69uuukmHTt2zKl7EhAQoEaNGlmNNWzY0LJ0hDMfc0+ePKmtW7eq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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Health Index Statistics:\n", + " Mean: 27.50\n", + " Std Dev: 17.74\n", + " Min: 13.40\n", + " Max: 95.20\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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z5un2p4S518bXl5emDJ5Mrbv2IFt27bBxsYGs2bNgqOjozJM927dIJPJsMbPDykpKfD29sb8efNU6l6hYR1B9H4iRUkvPEef5MaNG+jTpw9Onz4Ne/uSfaC9+UjYHSolxSYnXNNJEIS/q/bRdBIEwfr+FU0nQTDMRKwjAKCsjOUAANH6TppOAgmInkiYO91qgnnK8/cHKgUydYX/I3ZJeKUjvJ1+NUGSwe8DANjqC3vmV0kyzJRqOgmCYOlZOqcphw3poOkkvJfTlqD3B/qMcOSgwJ0+fRoGBgZwcHDA8+fPsXDhQtSsWbPEOwaJiIiIiIiIiOj/DzsHBS41NRXLly/Hy5cvYWpqigYNGmDKlCmaThYREREREREREf0fYOegwHXq1AmdOnXSdDKIiIiIiIiIiIrd/+NuwELH3YqJiIiIiIiIiIhKKXYOEhERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSrFzkIiIiIiIiIiIqJRi5yAREREREREREVEppa3pBBAREREREREREQGASCzSdBJKHY4cJCIiIiIiIiIiKqXYOUhERERERERERFRKcVoxEREREREREREJgkjMcWwljSVORERERERERERUSrFzkIiIiIiIiIiIqJTitGIiIiIiIiIiIhIE7lZc8jhykIiIiIiIiIiIqJRi5yAREREREREREVEpxc5BIiIiIiIiIiKiUoqdg0RERERERERERKUUOweJiIiIiIiIiIhKKe5WTEREREREREREgiAScxxbSWPnIH0wux2TNJ0EQUgYPE/TSRAE6/tXNJ0EQXjp1VDTSRCMciEnNJ0EQcjQKavpJAiC6Id+mk6CICQ8lWg6CYJQfcNcTSdBMKLKV9N0EgTBMDtR00kQhIoZ4ZpOgiAY6ZloOgmCkA5DTSdBMKxDr2s6CcLgWUvTKaBSgt2xREREREREREREpRQ7B4mIiIiIiIiIiEopTismIiIiIiIiIiJhEIk0nYJShyMHiYiIiIiIiIiISil2DhIREREREREREZVS7BwkIiIiIiIiIiIqpdg5SEREREREREREVEqxc5CIiIiIiIiIiKiU4m7FREREREREREQkCCIxdysuaRw5SEREREREREREVEqxc5CIiIiIiIiIiKiU4rRiIiIiIiIiIiISBJGY49hKGkuciIiIiIiIiIiolGLnIBER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IiIiIiIiKqXYOUhERERERERERFRKcVoxEREREREREREJgoi7FZc4ljgREREREREREVEpxc5BIiIiIiIiIiKiUoqdg0RERERERERERKUUOweJiIiIiIiIiIhKKXYOEhERERERERERlVLcrZiIiIiIiIiIiARBJBZpOgmlDkcOEhERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSnHNQSIiIiIiIiIiEgYxx7GVNJY4ERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFNccpA8mGeyr6SQIgpx96gAAM1G8ppMgCOVCTmg6CYLx0KONppMgCI2XttV0EgQhZflWTSdBEAzlBppOgiBEiVM1nQTBMMhJ0nQSBEEnR6bpJAiCVk6mppMgCOkiQ00ngQQm2ammppMgCPqaTgAVmV27dmHz5s2IjY2Fh4cHZs2ahapVqxYaPikpCatWrcLp06chlUphY2OD6dOno2nTpsWSPnYOEhERERERERERFYNjx45h8eLF8PX1RbVq1bB9+3YMHToUJ06cgLm5+VvhMzMzMXjwYJibm+Onn36CpaUlXr58CSMjo2JLIzsHiYiIiIiIiIhIEERikaaTUKS2bt2KHj16oGvXrgAAX19fXLhwAQEBARg2bNhb4QMCApCYmIi9e/dCR0cHAGBra1usaeT8SCIiIiIiIiIioiKWmZmJe/fuoUGDBspjYrEYDRo0wD///KM2zrlz51C9enXMmzcPDRo0QLt27fDLL78gJyen2NLJkYNEREREREREREQfKDMzE5mZquvG6urqQldXV+WYRCJBTk7OW9OHzc3N8fTpU7XnjoiIwLVr19C+fXv8+uuveP78OXx9fZGdnY0xY8YUbUbysHOQiIiIiIiIiIgEQSQS/iTXDRs2YO3atSrHxowZg7Fjx37yuRUKBczNzTF//nxoaWmhcuXKiImJwebNm9k5SEREREREREREpGnDhw/H4MGDVY69OWoQAExNTaGlpYX4+HiV4/Hx8bCwsFB77vLly0NbWxtaWlrKY87OzoiNjUVmZqbav/OphN8dS0REREREREREJBC6urooW7asyktdp52uri68vb1x9epV5TG5XI6rV6+iRo0aas9ds2ZNPH/+HHK5XHksPDwc5cuXL5aOQYCdg0REREREREREJBRikfBf/8Hg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eppOgkYkrRZ+O9Loe+GsrVkUhLFIBBEREREREREREZU4dg4SERERERERERGVUlxzkIiIiIiIiIiIBEEI+yOUNhw5SEREREREREREVEqxc5CIiIiIiIiIiKiUYucgERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFHcrJiIiIiIiIiIiYRBzHFtJY4kTERERERERERGVUuwcJCIiIiIiIiIiKqXYOUhERERERERERFRKcc1BIiIiIiIiIiISBJFYpOkklDocOUhERERERERERFRKsXOQiIiIiIiIiIiolOK0YiIiIiIiIiIiEgYRx7GVNJY4ERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFDsHiYiIiIiIiIiISil2DhIREREREREREZVS3K2YiIiIiIiIiIiEQSzSdApKHXYO0gfTVcg0nQRBSBcZajoJglBWFq/pJAhChk5ZTSdBMBovbavpJAjCpSnHNZ0EQajSfrimkyAIWlrZmk6CICgUbOS/piXndwIAykWFaDoJgvDKvo6mkyAIWQodTSdBECyyozSdBMHQyUzVdBKIShVOKyYiIiIiIiIiIiqlOHKQiIiIiIiIiIgEQSTiOLaSxhInIiIiIiIiIiIqpdg5SEREREREREREVEqxc5CIiIiIiIiIiKiUYucgERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESllLamE0BERERERERERAQAEIs0nYJShyMHiYiIiIiIiIiISil2DhIREREREREREZVSnFZMRERERERERESCIBJzHFtJY4kTERERERERERGVUuwcJCIiIiIiIiIiKqU4rZiIiIiIiIiIiIRBxN2KSxpHDhIREREREREREZVS7BwkIiIiIiIiIiIqpdg5SEREREREREREVEqxc5CIiIiIiIiIiKiUYucgERERERERERFRKcXOQSIiIiIiIiIiolJKW9MJIPViY2Pxyy+/4MKFC4iJiYG5uTk8PT0xcOBA+Pj4AABu3ryJ9evX49atW5DJZHB0dESXLl0wYMAAaGlpAQAiIyPx888/49q1a4iLi0OFChXQoUMHjBgxArq6uprMIgAg6MhRHAg4iASJBM5OThg1Yjg83N0KDX/x0mVs9/dHTMwr2FhbY+jgQahbpzYAIDs7G9t2+OOvv/9G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/kClQLqo8PVrSpMK6c80nQRByNApq+kkCEbZo1s0nQRBuDTluKaTIAhV7h/SdBIEIUtL7/2BSgGFQrgbGZS0sllSTSdBEExe3H1/oFLglb1wR1uVpESRsJa80RSL7ChNJ0EwyqSr31W6tDGp0UzTSdCI9J0LNJ2E9yrTf6amk1CkOK2YiIiIiIiIiIiolOK0YiIiIiIiIiIiEgYRx7GVNJY4ERERERERERFRKcXOQSIiIiIiIiIiolKKnYNERERERERERESlFNccJCIiIiIiIiIiYRCLNJ2CUocjB4mIiIiIiIiIiEopdg4SERERERERERGVUpxWTEREREREREREgiAScRxbSWOJExERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSrFzkIiIiIiIiIiIqJRi5yAREREREREREVEpxd2KiYiIiIiIiIhIGMQiTaeg1OHIQSIiIiIiIiIiolKKnYNERERERERERESlFKcVExERERERERGRMIg4jq2kscSJiIiIiIiIiIhKKXYOEhERERERERERlVLsHCQiIiIiIiIiIiql2DlIRERERERERERUSnFDEvpgltcDNJ0EQXhRr5emkyAI0fpOmk6CIIh+6KfpJAhGyvKtmk6CIFRpP1zTSRCEu16dNJ0EQfDo7arpJAiC9fAhmk6CYERWrKPpJAhCumMDTSdBEMpmJGg6CYKg0OWYFQBI0zXSdBIEw/jVI00ngahUYS1MRERERERERERUSnHkIBERERERERERCYNIpOkUlDocOUhERERERERERFRMdu3ahWbNmqFKlSro3r077ty580Hxjh49Cnd3d4waNapY08fOQSIiIiIiIiIiomJw7NgxLF68GKNHj0ZgYCA8PDwwdOhQxMfHvzNeZGQkli5ditq1axd7Gtk5SEREREREREREwiAWC//1H2zduhU9evRA165d4erqCl9fX+jr6yMgoPBNX3NycjBp0iSMHTsWdnZ2n1qi78XOQSIiIiIiIiIioiKWmZmJe/fuoUGDBspjYrEYDRo0wD///FNovHXr1sHc3Bzdu3cviWRyQxIiIiIiIiIiIqIPlZmZiczMTJVjurq60NXVVTkmkUiQk5MDc3NzlePm5uZ4+vSp2nP//fffOHDgAA4dOlSkaX4Xdg4SEREREREREZEwiIQ/yXXDhg1Yu3atyrEx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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Feature Correlation with Health Index:\n", + "Health index 1.000000\n", + "DBDS 0.468809\n", + "Interfacial V 0.400216\n", + "Hydrogen 0.377388\n", + "Methane 0.361770\n", + "Ethylene 0.271504\n", + "Acethylene 0.240143\n", + "Ethane 0.236507\n", + "CO2 0.168777\n", + "Oxigen 0.121009\n", + "CO 0.112751\n", + "Power factor 0.092729\n", + "Nitrogen 0.089455\n", + "Dielectric rigidity -0.104426\n", + "Water content -0.281165\n", + "Name: Health index, dtype: float64\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "COLUMN_RENAME = {\n", + " 'Hydrogen': 'hydrogen',\n", + " 'Oxigen': 'oxygen',\n", + " 'Nitrogen': 'nitrogen',\n", + " 'Methane': 'methane',\n", + " 'CO': 'co',\n", + " 'CO2': 'co2',\n", + " 'Ethylene': 'ethylene',\n", + " 'Ethane': 'ethane',\n", + " 'Acethylene': 'acetylene',\n", + " 'DBDS': 'dbds',\n", + " 'Power factor': 'power_factor',\n", + " 'Interfacial V': 'interfacial_v',\n", + " 'Dielectric rigidity': 'dielectric_rigidity',\n", + " 'Water content': 'water_content',\n", + " 'Health index': 'health_index',\n", + "}\n", + "\n", + "df = df.rename(columns=COLUMN_RENAME)\n", + "df = df.drop_duplicates()\n", + "\n", + "FEATURE_COLUMNS = [\n", + " 'hydrogen', 'oxygen', 'nitrogen', 'methane', 'co', 'co2',\n", + " 'ethylene', 'ethane', 'acetylene', 'dbds',\n", + " 'power_factor', 'interfacial_v', 'dielectric_rigidity', 'water_content'\n", + "]\n", + "\n", + "X = df[FEATURE_COLUMNS]\n", + "y = df['health_index']\n", + "\n", + "print(f\"\\nFeatures shape: {X.shape}\")\n", + "print(f\"Target shape: {y.shape}\")\n", + "print(f\"Feature names: {FEATURE_COLUMNS}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4RjdE4_HmIBC", + "outputId": "2b33e735-4f01-4a13-ddc2-2fb16aa108df" + }, + "execution_count": 4, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Features shape: (470, 14)\n", + "Target shape: (470,)\n", + "Feature names: ['hydrogen', 'oxygen', 'nitrogen', 'methane', 'co', 'co2', 'ethylene', 'ethane', 'acetylene', 'dbds', 'power_factor', 'interfacial_v', 'dielectric_rigidity', 'water_content']\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "X_train, X_temp, y_train, y_temp = train_test_split(\n", + " X, y, test_size=0.30, random_state=42)\n", + "X_val, X_test, y_val, y_test = train_test_split(\n", + " X_temp, y_temp, test_size=0.50, random_state=42)\n", + "\n", + "print(f\"\\nTraining set: {X_train.shape[0]} samples ({X_train.shape[0]/len(X)*100:.1f}%)\")\n", + "print(f\"Validation set: {X_val.shape[0]} samples ({X_val.shape[0]/len(X)*100:.1f}%)\")\n", + "print(f\"Test set: {X_test.shape[0]} samples ({X_test.shape[0]/len(X)*100:.1f}%)\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "E26xVDwbmKxU", + "outputId": "c4292aaa-ef24-438b-9e38-57256f863615" + }, + "execution_count": 5, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Training set: 329 samples (70.0%)\n", + "Validation set: 70 samples (14.9%)\n", + "Test set: 71 samples (15.1%)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "scaler_X = StandardScaler()\n", + "X_train_scaled = scaler_X.fit_transform(X_train)\n", + "X_val_scaled = scaler_X.transform(X_val)\n", + "X_test_scaled = scaler_X.transform(X_test)\n", + "\n", + "print(\"\\nFeatures normalized using StandardScaler.\")\n", + "print(f\"X_train scaled shape: {X_train_scaled.shape}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "68p7bRAxmO6E", + "outputId": "6f2fd844-cf62-4c48-ba4e-b75a54883807" + }, + "execution_count": 6, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Features normalized using StandardScaler.\n", + "X_train scaled shape: (329, 14)\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"\\nModel: RandomForestRegressor\")\n", + "\n", + "model = RandomForestRegressor(\n", + " n_estimators=300,\n", + " max_depth=None,\n", + " min_samples_split=2,\n", + " min_samples_leaf=1,\n", + " random_state=42,\n", + " n_jobs=-1\n", + ")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "4sBJ6w1pmRhB", + "outputId": "0a6b0a73-d557-430a-8587-df2c67a17fb0" + }, + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Model: RandomForestRegressor\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(\"\\nTraining RandomForestRegressor...\")\n", + "model.fit(X_train_scaled, y_train)\n", + "print(\"Training complete.\")\n", + "\n", + "# Cross-validation on training set\n", + "cv_scores = cross_val_score(model, X_train_scaled, y_train,\n", + " cv=5, scoring='r2')\n", + "print(f\"\\n5-Fold CV R² on training set: {cv_scores.mean():.4f} ± {cv_scores.std():.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MiDWyMvkmT4t", + "outputId": "77738bf1-b7d9-44eb-c2c8-debc17ee37f8" + }, + "execution_count": 9, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Training RandomForestRegressor...\n", + "Training complete.\n", + "\n", + "5-Fold CV R² on training set: 0.6558 ± 0.0735\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_val_pred = model.predict(X_val_scaled)\n", + "\n", + "val_mae = mean_absolute_error(y_val, y_val_pred)\n", + "val_rmse = np.sqrt(mean_squared_error(y_val, y_val_pred))\n", + "val_r2 = r2_score(y_val, y_val_pred)\n", + "\n", + "print(\"\\nValidation Metrics:\")\n", + "print(f\" MAE: {val_mae:.4f}\")\n", + "print(f\" RMSE: {val_rmse:.4f}\")\n", + "print(f\" R²: {val_r2:.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "fid6UCRUmX27", + "outputId": "28d39896-ea09-4510-c6f6-3bb71bf7bbee" + }, + "execution_count": 10, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Validation Metrics:\n", + " MAE: 6.4508\n", + " RMSE: 9.9702\n", + " R²: 0.7512\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_test_pred = model.predict(X_test_scaled)\n", + "\n", + "test_mae = mean_absolute_error(y_test, y_test_pred)\n", + "test_rmse = np.sqrt(mean_squared_error(y_test, y_test_pred))\n", + "test_r2 = r2_score(y_test, y_test_pred)\n", + "\n", + "print(\"\\nTest Metrics:\")\n", + "print(f\" MAE: {test_mae:.4f}\")\n", + "print(f\" RMSE: {test_rmse:.4f}\")\n", + "print(f\" R²: {test_r2:.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "sks39c5vmbOe", + "outputId": "488e211d-ca78-402e-d226-2aefbdaa1225" + }, + "execution_count": 11, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Test Metrics:\n", + " MAE: 6.4817\n", + " RMSE: 9.7757\n", + " R²: 0.7098\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "y_train_pred = model.predict(X_train_scaled)\n", + "\n", + "metrics_df = pd.DataFrame({\n", + " 'Dataset': ['Training', 'Validation', 'Test'],\n", + " 'Samples': [len(X_train), len(X_val), len(X_test)],\n", + " 'MAE': [mean_absolute_error(y_train, y_train_pred), val_mae, test_mae],\n", + " 'RMSE': [np.sqrt(mean_squared_error(y_train, y_train_pred)), val_rmse, test_rmse],\n", + " 'R²': [r2_score(y_train, y_train_pred), val_r2, test_r2],\n", + "})" + ], + "metadata": { + "id": "djRLTCC3mfPx" + }, + "execution_count": 12, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(\"\\nComprehensive Metrics:\")\n", + "print(metrics_df.to_string(index=False))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TiqXTorwmg5q", + "outputId": "1afa70f3-721a-45bf-bfdf-1e4f5e1baccd" + }, + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Comprehensive Metrics:\n", + " Dataset Samples MAE RMSE R²\n", + " Training 329 2.351117 3.710875 0.952014\n", + "Validation 70 6.450814 9.970195 0.751184\n", + " Test 71 6.481746 9.775679 0.709752\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# Plot 1: Predicted vs Actual\n", + "fig, axes = plt.subplots(1, 3, figsize=(16, 5))\n", + "\n", + "for ax, actual, pred, title, color in zip(\n", + " axes,\n", + " [y_train, y_val, y_test],\n", + " [y_train_pred, y_val_pred, y_test_pred],\n", + " ['Training', 'Validation', 'Test'],\n", + " ['steelblue', 'orange', 'green']\n", + "):\n", + " r2 = r2_score(actual, pred)\n", + " ax.scatter(actual, pred, alpha=0.6, s=30, color=color)\n", + " mn = min(actual.min(), pred.min())\n", + " mx = max(actual.max(), pred.max())\n", + " ax.plot([mn, mx], [mn, mx], 'r--', lw=2)\n", + " ax.set_xlabel('Actual Health Index')\n", + " ax.set_ylabel('Predicted Health Index')\n", + " ax.set_title(f'{title} Set (R² = {r2:.4f})')\n", + " ax.grid(True, alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('predicted_vs_actual.png', dpi=150)\n", + "plt.show()\n", + "\n", + "# Plot 2: Residuals\n", + "residuals = y_test.values - y_test_pred\n", + "\n", + "fig, axes = plt.subplots(1, 2, figsize=(14, 5))\n", + "\n", + "axes[0].scatter(y_test_pred, residuals, alpha=0.6)\n", + "axes[0].axhline(y=0, color='r', linestyle='--', lw=2)\n", + "axes[0].set_xlabel('Predicted Health Index')\n", + "axes[0].set_ylabel('Residuals')\n", + "axes[0].set_title('Residuals vs Predicted (Test Set)')\n", + "axes[0].grid(True, alpha=0.3)\n", + "\n", + "axes[1].hist(residuals, bins=20, edgecolor='black', alpha=0.7)\n", + "axes[1].set_xlabel('Residuals')\n", + "axes[1].set_ylabel('Frequency')\n", + "axes[1].set_title('Distribution of Residuals (Test Set)')\n", + "axes[1].grid(True, alpha=0.3)\n", + "\n", + "plt.tight_layout()\n", + "plt.savefig('residuals.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(f\"\\nResiduals (Test Set):\")\n", + "print(f\" Mean: {residuals.mean():.4f}\")\n", + "print(f\" Std Dev: {residuals.std():.4f}\")\n", + "\n", + "# Plot 3: Feature Importance\n", + "importances = model.feature_importances_\n", + "indices = np.argsort(importances)[::-1]\n", + "\n", + "plt.figure(figsize=(12, 6))\n", + "plt.bar(range(len(FEATURE_COLUMNS)),\n", + " importances[indices], align='center', alpha=0.7, color='steelblue')\n", + "plt.xticks(range(len(FEATURE_COLUMNS)),\n", + " [FEATURE_COLUMNS[i] for i in indices], rotation=45, ha='right')\n", + "plt.xlabel('Feature')\n", + "plt.ylabel('Importance')\n", + "plt.title('Random Forest Feature Importances')\n", + "plt.tight_layout()\n", + "plt.savefig('feature_importance.png', dpi=150)\n", + "plt.show()\n", + "\n", + "print(\"\\nFeature Importances (ranked):\")\n", + "for i in indices:\n", + " print(f\" {FEATURE_COLUMNS[i]:<25} {importances[i]:.4f}\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "fK7-YsYbmjDp", + "outputId": "5df10c4b-7fac-4cbf-b039-d5abfc2239ec" + }, + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAABjYAAAHqCAYAAACne3d+AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xt8zuUfx/HXvXtnM4eZkTlsjmlhErWU06gMhZBCB6VzopOOFEk6IZJQopxyqJyFDkR+yVCisCFnm8M2O2/3749vu+e2jY1t92Hv5+Oxh32v7334XG72/ez6fK/rMlksFgsiIiIiIiIiIiIiIiJOwM3eAYiIiIiIiIiIiIiIiBSWChsiIiIiIiIiIiIiIuI0VNgQERERERERERERERGnocKGiIiIiIiIiIiIiIg4DRU2RERERERERERERETEaaiwISIiIiIiIiIiIiIiTkOFDRERERERERERERERcRoqbIiIiIiIiIiIiIiIiNNQYUNERERERERERERERJyGChsiV2DYsGG0b9/+sp770Ucf0bBhw2KOyLns2LGDsLAwDh8+bO9QpAB79+6lcePG/PPPP/YORUTEIR06dIiGDRuyaNEia1tRrvENGzbko48+KtaY+vfvT//+/Yv1NZ1JdnY2Xbp0YfLkyfYORS5iyJAhDB482N5hiIiIk9D13fFlZGTQpk0bvvrqK3uHImWEu70DECkJhR1MmDlzJq1atSrhaBzTunXr+Oyzz9i3bx/JyclUqVKFsLAwevbsyS233FLk1/vkk0+oV68ekZGRhX7Ohx9+SFRUFDVq1LC29e/fn//973/WYy8vL2rXrk3Pnj0ZMGAAbm659djnn3+eQ4cOkZmZiZeXF2+88QZ169YtcuxXYu3atUycOJG9e/cSEBBAjx49ePzxx3F3v/SP1wMHDvD++++zadMm0tPTady4MYMHD+aGG26wedywYcNYvHhxnueHhISwcuVK6/G+fftYuHAhv/zyCwcPHqRcuXI0btyYp556imuvvTbP848fP87o0aP55ZdfyM7OplWrVrz88svUrFnT+ph69erRpk0bJkyYwMSJE4vyVyMi4nAeffRRNm3axC+//IKfn1++j3n22WdZtWoV69evp1KlSqUcYeHt3buXFStW0L17d4KDg+0djtWhQ4eYNGkSv/32G8ePH8ff3586derQqlUrnn766SK/3k8//cSOHTt46qmnCv2cpUuXcvToUfr162dtW7RoES+99JL12Gw2ExAQwE033cSQIUMICgqynlu2bBmzZs3C3d2d06dPc//999OrV68ix34lCnONzs+hQ4fo0KFDged79erFqFGjANi8eTMDBgzI93Hz5s2jWbNm1uMNGzawfPlyduzYwb59+6hevTrr1q3L87yi5CIPP/wwPXv2ZPfu3TRq1Oii/RIRcXWlOYaRkpLCtGnTaNmyZaFfS9f34lEa13eA9PR0xo8fz7fffktCQgINGzbkmWee4aabbrJ5XkZGBlOmTGHx4sUcP36coKAgevbsyaBBg/KMaezfv5/x48fz+++/c/bsWapXr06XLl0YOHAgPj4+AHh4ePDAAw/wySefcNddd+Hl5VXUvyKRIlFhQ1zS2LFjbY6//fZbfvnllzztVzoIPnLkSCwWy2U997HHHmPQoEFX9P6Xa/r06YwdO5aWLVvyyCOP4O3tzYEDB9i0aRPLly+/rMLGlClTuPXWWwtd2Ni1axcbN25k7ty5ec5Vq1aNoUOHAnD69GmWLl3K22+/zenTpxkyZIj1cY8//jghISEAvPXWW4wYMYJZs2YVOfbL9dNPP/HEE0/QsmVLXnvtNf755x8mT55MfHw8b7zxxkWfe/ToUfr06YPZbLYmAosWLWLgwIHMmDGD66+/3ubxnp6eNokKQPny5W2OFyxYwIIFC+jUqRP33HMPiYmJzJs3jz59+jBt2jQiIiKsjz137hwDBgwgMTGRRx55BA8PD2bMmEG/fv345ptvbAbz7r77bgYNGsTBgwepVavW5f51iYjYXbdu3fjhhx9Ys2YNd955Z57zKSkprFu3jtatW19RUaM0rvF79+5l4sSJtGzZMk9hY/r06SX63gU5cOCA9ZfYnj17EhwczIkTJ/jrr7+YOnXqZQ98fPXVV0Ua+Jg+fTpRUVF5rpMATz/9NMHBwaSnp7Nt2zYWL17M77//ztKlS62/fDdp0oRZs2bh4eHBrl276N69OzfeeGOpFZCKco2+UOXKlfPkuwDr169nyZIleQY0wLip5MKiw4XX+6VLl7J8+XIaN25M1apVC3z/ouQijRs3JiwsjM8++yzfmEVEypLSGsMAI9+ZOHEiTz75ZKEKG7q+F4/SvL4PGzaMVatWMWDAAOrUqcPixYsZNGgQX3zxBS1atLA+7vnnn2flypX07NmTsLAwtm/fzvjx4zl69CgjR460Pu7o0aP06tWL8uXL069fPypUqMC2bdv46KOP2Llzp80smh49evDee++xZMkS7rrrriv5KxO5NItIGfDGG29YGjRocMnHJScnl0I09pWRkWFp3ry55YEHHsj3fFxc3GW9brNmzSwvvvhioR8/cuRIS9u2bS3Z2dk27f369bNERUXZtKWmplratWtnCQ8Pt2RmZhb4egMGDCh64Fegc+fOlm7dulkyMjKsbR988IGlYcOGlr179170uSNGjLA0btzYsm/fPmtbcnKypU2bNpbu3bvbPPbFF1+0NGvW7JLx/PHHH5akpCSbtlOnTlluuOEGy913323T/umnn1oaNGhg2b59u7Vt7969lquvvtry/vvv2zw2PT3dcv3111vGjRt3yRhERBxZSkqKJTw83PLggw/me37JkiWWBg0aWJYtW1bo1/z3338tDRo0sCxcuPCyYmrQoIFlwoQJRX7eihUrLA0aNLD8+uuvl/W+JSHn2nbo0KE85y43vyhsDpdj586dlgYNGlg2btxo075w4UJLgwYNLDt27LBpf/fddy/6me/cudPSqFGjfPtUUopyjS6s++67z9K8eXNLamqqte3XX3+1NGjQwLJixYpLPv/YsWOW9PR0i8VisQwaNMjSrl27fB9XlFzEYrFYpk+fbmnWrFme54iIlHVFvf4VRXx8fJHyD13fi0dpXd+3b99uadCggWXatGnWttTUVEtkZKSlT58+eR534e/5Y8aMsTRs2NCya9cua9vkyZMtDRo0sPzzzz82j33hhRcsDRo0sJw5c8am/ZFHHrHcc889l9UnkaLQHhtSZvXv358uXbrw559/cu+999K0aVM++OADANasWcOgQYNo3bo1YWFhREZGMmnSJLKysmxe48I9NnLW2Z4+fTrz5s0jMjLSurzTjh07bJ6b3/rbDRs25M0332TNmjV06dKFsLAwoqKi+Pnnn/PEv3nzZnr06MG1115LZGQkc+fOLdSa3qdPnyYpKYnmzZvnez4gIMDmOD09nQkTJtCxY0fCwsJo06YNY8eOJT093Sbu5ORkFi9eTMOGDWnYsCHDhg27aBxr167lhhtuwGQyXfRxYCxHFRYWxrlz54iPj89zftOmTSxYsIBnn332kq9VXPbu3cvevXvp3bu3zRTNe+65B4vF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MTGFKiCJiDiqG264gcDAQJYuXWpT2Fi5ciUZGRnWXw4bNmzIqlWrcHPLneB8xx13cPvtt7NgwQKeeOKJQr/n7t27+e6777jnnnsYPnw4APfeey/PPvssf//9t81j27Zty2233WbT1q5dO/r06cOqVau48847qVmzJi1atGDWrFlERERccn3sefPmsW/fPt599126desGGPsn9e/fn3HjxtGzZ0+bn/mXm8f079+fb7/9lvvvv5+rr76a66+/nlatWnHTTTdZf0kGY5DgrbfeolevXjbrN3fv3p3bbruNKVOmMHLkSMLDw6lTpw6//PJLofILMHKMpk2bFng+KSmJU6dOkZ6ezvbt25k4cSKenp42/UpNTeWxxx4jMDCQMWPGYDabL/m+I0eOzDMDJj8tW7a86H5gl3ONvpTvvvuOwMBAbrjhBpt2Dw8Pbr31Vm655RYqVarEvn37mD59Ovfeey9z584t0g0oF5NfLpLD3d2datWqsXfv3mJ5LxERV7Vlyxa+/vpr3nvvPZuB7FatWvHQQw+xcuVKunbtSnR0NGfPnmX69Ok2ReqcvSp9fX259dZbGTFiBA0bNizU9VXXd+e6vp88efKS7wNY9yvdunWrzeblW7ZssXkcwC233MLgwYOZMmUK69ats7Y/+uijNvug5sh5vb1796qwISVKhQ0p0zw9PfMdvD5/8DwpKYn09HRatGjBvHnziImJoVGjRhd93c6dO9vcjX+xaZAXioiIsJnt0KhRI/z8/KzPzcrKYtOmTURGRtrcLVq7dm1uvvlmfvjhh0u+x9NPP01oaCizZ89mw4YN/Pzzz3z44Yc0btyY9957z3rH58qVK6lbty6hoaE2Mx1yLpybN28ucEmrizl9+jSQ9+6JHDExMXkKEO3bt+ett96yacsZVPriiy/44osv8PPzs9m0Kj+ff/55oWKsV6/eRc+npqYC5Fvk8vLyuuiSUWAUy3744QeGDBnCkCFD8PHxYfbs2da7InJeH8izxFZUVBR16tThww8/ZNWqVXmmjuaIj4/n2WefJTg4mIceesjannPHSUGxn/+YHDmfVc5nJyLirMxmM1FRUcyYMYNDhw5Zi+xLly6lSpUq1uvP+T8js7KySEhIwNfXl5CQEOusvcL66aefAPIsD3XfffexdOlSm7bzc5CMjAySkpKoVasW/v7+/PXXX/luen4p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UERERC6k67tzmDFjBtOmTWPNmjWF2g9G5Epc3sKpImJ3qampNsf79+/n559/vugGjY5m6NChrFixgsOHD9s7FCnAvn37+PHHHxk8eLC9QxERESmUbt26cdVVV/HVV1/ZOxS5iE8//ZRbb71VRQ0RESkUXd8dX0ZGBjNmzOCxxx5TUUNKhWZsiDip1q1b0717d2rWrMnhw4eZO3cu6enpLF68mDp16tg7PBEREREREREREZESoT02RJzUzTffzLJlyzh58iSenp40a9aMoUOHqqghIiIiIiIiIiIiLk0zNkRERERERERERERExGlojw0REREREREREREREXEaKmyIiIiIiIiIiIiIiIjTcPk9NrKzs8nMzMTNzQ2TyWTvcERERJyKxWIhOzsbd3d33NzKzv0Qyh9ERESujHII5RAiIiJFVZT8weULG5mZmfzxxx/2DkNERMSpXXvttXh6eto7jFKj/EFERKR4KIcQERGRoipM/uDyhY2cyk7t2rWpWLGiy98xYbFYSEhIwN/fX311IWWlr2Wln6C+uipX7GtWVhZ//PFHmbrTEnLzh2uvvRaz2exyn60r9ceV+gLqj6NTfxyb+uNYynoOoTEI16O+uib11TWpr86rKPmDyxc2cj5QNzc3zGazS3zAF2OxWNRXF1RW+lpW+gnqq6ty5b66Wn8uJae/ZrPZWthwpc/WlfrjSn0B9cfRqT+OTf1xTM4c++XQGITrUl9dk/rqmtRX51eYvpStWydERERERERERERERMSpqbAhIiIiIiIiIiIiIiJOQ4UNERERERERERERERFxGipsiIiIiIiIiIiIiIiI01BhQ0REREREREREREREnIYKGyIiIiIiIiIiIiIi4jRU2BAREREREREREREREaehwoaIiIiIiIiIiIiIiDgNFTZERERERERERERERMRpqLAhIiIiIiIiIiIiIiJOQ4UNERERERERERERERFxGipsiIiIiIiIiIiIiIiI01BhQ0REREREREREREREnIYKGyIiIiIiIiIiIiIi4jRU2BAREXEFmZlw+LC9oxARERFnc/CgvSMQERERZ3P0KGRk2DUEFTZEREScXVYWdO8Ot9wCJ07YOxoRERFxFtOmQb16sGyZvSMRERERZ/H339CiBTz6KFgsdgtDhQ0RERFnZzZD06YQEwN33WXXxEJEREScyDXXGHlEnz6wd6+9oxERERFnUKMGBAXBZ5/BpEl2C8Pdbu8sIiIixWfkSDh1yihsmEz2jkZEREScwY03wpdfwtatEBpq72hERETEGfj5wdKl8Mwzxs0RdqLChoiIiDOKj4eAgNxjkwk+/th+8YiIiIjjO3UKKlYEt/MWb+jZ0/gSERERyU92Npw5A5Ur57ZddRXMn2+3kEBLUYmIiDifzz+HOnVgwwZ7RyIiIiLOYvduYz3sl16ydyQiIiLiLFJToW9faNcOEhLsHY0NFTZERESchcUCr70GDz4ISUlwxx1w8KC9oxIRERFH99NPxrJTsbEwdizMmGHviERERMTRxcVBZKQxM2PHDrj7bofa01NLUYmIiDiDtDQYOBC++iq3rV8/Y9MuERERkYJ8+aVxU0RGhnHcrBl07GjXkERERMTB7dkDnTvD3r3Gcbly8PjjDrWnp2ZsiIiIOLpTp6BTp9yihskE48bB+PFgNts1NBEREXFQFguMHAn9++cWNTp3hp9/1o0RIiIiUrBffjFmeuYUNapXN/KHLl3sG9cFNGNDRETEkcXEGIMQf/9tHPv4wOzZcOeddg1LREREHFh6OjzyiO2SU48+Ch99BO4aBhAREZECzJsH991nrBoBEBYGy5ZBrVr2jSsfmrEhIiLiqDZvhhtuyC1qVK0KP/6oooaIiIgU7MwZ46aI84saY8fCxx+rqCEiIiL5s1jgnXeMfTRyihqRkbBhg0MWNUAzNkRERBxTQgLcfjucPm0cX321cZdESIh94xIRERHH9thjsHat8b2XF8yaBb162TcmERERcWzffAPDhuUeP/ggfPIJeHjYLaRL0YwNERERR+TvD5MnG9+3bWuscamihoiIiFzKu+/CVVdBlSqwbp2KGiIiInJpd9wBvXsb348aBdOmOXRRAzRjQ0RExHH16QN+ftCxI3h62jsaERERcQbBwbBiBfj6Qr169o5GREREnIGbG3zxBdx/v7F6hBPQjA0RERFHkJQEX36Ztz0qSkUNERERKdjs2ZCYaNvWpImKGiIiIlKw7dvh119t27y9naaoASpsiIiI2N/Ro9CmDfTvb0z3FBEREbmU7Gx49lm4915jlmdmpr0jEhEREWewciW0bg1du8LevfaO5rKpsCEiImJPf/4JN9wAW7cax8OGGRuHi4iIiBQkOdnYO+ODD4zjFStg6VL7xiQiIiKO79NPoUsXY9WIuDgYPtzeEV02FTZERETsZc0auOkmOHjQOK5VC376ydg4XERERCQ/J05Au3awaJFxbDYbgxR33mnXsERERMSBZWcbN1I+8ghkZRltPXrA1Kn2jesKaPNwERERe/j8cxg0KHfZiOuuM+60rFbNvnGJiIiI49q9Gzp3hthY49jPDxYsgFtvtW9cIiIi4rhSU+G++2D+/Ny2Z5+FsWONTcOdlPNGLiIi4owsFnj9dXjwwdyiRteuxkwNFTVERESkID//DBERuUWNGjVgwwYVNURERKRgcXEQGZlb1HBzg4kT4b33nLqoAZqxISIiUnrS0uChh+DLL3PbnnoKPvzQWEZCREREJD+zZ8MDD0B6unHctKkx0zM42L5xiYiIiOPau9eY6blnj3Hs6wvz5hl7bLgA5y7LiIiIOJO4OGNfDQCTyShoTJigosZlSEpK4q233qJdu3Y0adKEu+++mx07dljPWywWxo8fT+vWrWnSpAn3338/+/fvt1/AIiIil8tigcWLc4sat90G69erqCEiIiIX9/vvuUWNatWM2Z8uUtQAFTZERERKT40asGwZBAbCwoXwzDP2jshpvfrqq2zcuJGxY8eyZMkSbrrpJh544AGOHz8OwNSpU5k1axYjRoxg/vz5+Pj4MHDgQNLS0uwcuYiISBGZTDBzJtxwg7Hh55IlUL68vaMSERERR9enD4waBddcA5s3G3t7uhAVNkREREpT8+bG2tjdu9s7EqeVmprK6tWref7557n++uupXbs2Tz31FLVr12b27NlYLBZmzpzJY489RmRkJI0aNWLs2LGcOHGCNTkzZkRERJyJj48x63PyZHDXitIiIiJSSC+/bBQ1atWydyTFThmRiIhISfnmG5gzx1gX+/zlpsqVs1tIriAzM5OsrCy8vLxs2r28vNi6dSuHDh3i5MmTREREWM+VL1+epk2bEh0dTVRUVKHfy2Kx5PlyBa7UH1fqC6g/jk79cWwu05+DB+HBB7FMmYIlICC3P76+xp9O0j9H+xyysrL46KOP+O6774iLi6Nq1ap0796dxx9/HJPJBBgxT5gwga+//pqEhASaN2/OiBEjqFOnjn2DFxERuZTMTGMPz1atjH25cphMLjsGYdfChhILERFxWePGwdChxuBDYCB89JGRUMgV8/PzIzw8nI8//pjQ0FCqVKnC0qVL2bZtG7Vq1eLkyZMABAQE2DwvICCAuLi4Ir1XQkICbm5uWCwWkpOTAaw5ijNzpf64Ul9A/XF06o9jc4X+mLdvp1yfPrgdP052586kLFoEOGd/srOz7R2CjalTpzJnzhzeeecd6tWrx59//slLL71E+fLlGTBggPUxs2bNYsyYMQQHBzN+/HgGDhzI8uXL89xQISIi4jASE6FvX1i5EqZPN2ZndOhg76hKnF0LG0osRETE5WRlweDBRiEjx+nTRruWjig2Y8eO5eWXX+aWW27BbDbTuHFjoqKi2LlzZ7G+j7+/P2az2XrXaYUKFZxycOlCrtQfV+oLqD+OTv1xbE7fn6VLoW9fTOfOAeBmsVAuI4PyTtqfrKwse4dgIzo6mg4dOtC2bVsAgoODWbZsGTt27ADIs5QlGPlGREQEa9asKdKMTxERkVJz+DDlO3fG9OefxrHJBP/d7Ofq7DrCosRCRERcyrlzlOvfH9OKFbltr70Gb7yh2RrFrFatWnz55ZckJyeTlJRE1apVeeaZZ6hZsyaBgYEAxMfHU7VqVetz4uPjadSoUZHex2QyWQeTcr53xsGl/LhSf1ypL6D+ODr1x7E5bX8+/thYPiJnlkNEBHzzDRYPD+fsD443yyQ8PJz58+cTGxtLSEgIu3fv5vfff2fYsGEAxbqUpYiISKnYvh2iojAfPmwcV6oEixdDmzb2jauU2LWwocRCRERcxrFj0KULHr//bhy7u8Onn9qubSnFztfXF19fX86ePcuGDRt4/vnnCQ4OJjAwkE2bNnH11VcDkJSUxPbt2+nbt6+dIxYRETlPdja88AK8/35uW+/e8MUX4OUFZ8/aLzYXM2jQIJKSkrj99tsxm81kZWUxZMgQunXrBlCsS1kCrrHfSyG4zN42haC+uib11TWVib6uWgW9emFKSgLAEhICy5ZBo0ZOsx9Xforymdm1sFGaiYXL/2P+T5n4j/sf9dX1lJV+gvrqcnbuhC5dMB04AIDF3x8WLIDISKdOKMDxNv7MsX79eiwWCyEhIRw8eJCxY8cSGhpKjx49MJlMDBgwgMmTJ1O7dm3rUpZVq1a1zgAVERGxu5QU6N8fFi7MbXvxRRg9GtzcnD6HcDQrVqxgyZIlvP/++9SrV49du3bx9ttvW/f6LG7Jycm4ubk53MyV4uYKe9sUlvrqmtRX1+TqffX84gt8nn0W03/LPqY3a0byvHlQtarT3xRRlD267FrYKM3EQkmF61FfXU9Z6Seor67EvGMHfl27YkpIACDzqqs4N38+lmuucfqEAhxv488ciYmJfPDBBxw7doyKFSvSqVMnhgwZgoeHBwAPP/wwKSkpvP766yQkJHDdddcxbdo07c8lIiKOIT0d2reHX381js1mYzmqQYPsG5cLGzt2LIMGDbKu/NCwYUOOHDnClClT6N69e7EuZQnGrFKn3e+lCJx+b5siUF9dk/rqmly6r++8g+mll6yHljvv5NzEiVSoXt0l+lqUPbrsWtgozcRCSYXrUV9dT1npJ6ivLqV5c2jYEH77DUvz5iR9+SX+DRu6TF8dbePPHJ07d6Zz584FnjeZTAwePJjBgweXYlQiIiKF5OkJt91mFDb8/ODrr41jKTGpqal58jOz2WzNVYt7KUun3e/lMqivrkl9dU3qqwvo0AF8fIyZn0OHGoWOpCSX6WtR+mDXwkZpJhYu+485H+qrayorfS0r/QT11WX4+cGSJTB8OLz7LmRluVRfXaUfIiIiDuf11+HcObj3Xmja1N7RuLx27drxySefcNVVV1lXjPj888/p2bMngJayFBER53D99TBnDvz7Lzz5ZJleutKuhQ0lFiIi4nTS0yE+HqpXz20LCoJPPjESChdYfkpERERKwMGDUKtW7rHJBGPH2i+eMubVV19l/PjxvPHGG9ZVIfr06cMTTzxhfYyWshQREYdz6JAx/mA257bdcYf94nEgdi1sKLEQERGncvo09OgBJ07AL79AxYr2jkhEREQcncVibAj+5puwahW0bWvviMokPz8/XnnlFV555ZUCH6OlLEVExKFs2gTdukG/fvDhh/aOxuHYtbChxEJERJzG/v3QuTPs2mUc9+sHS5faNSQRERFxcBkZ8Oij8NlnxnH37rBzJ1x1lX3jEhEREce2YIEx7pCWBuPGQbNmcN999o7KobjZOwARERGH99tv0KpVblEjMBBee82+MYmIiIhjO3sWoqJyixoAL71ku5yliIiIyPksFnjvPejVyyhqALRvr+Wn8mHXGRsiIiIO79tvoW9fSEkxjhs2hOXLITTUvnGJiIiI4zp40Chq/PmncezlBV98AX362DcuERERcVyZmfD00zB5cm7b/ffDlCng6Wm3sByVZmyIiIgUZPx4Y8mInKLGLbfAxo0qaoiIiEjB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/jcMHrzHp83YZwYVVRVk27PxNnppijbhtDopzC4k15HLjH1m9EHwQoi+1OXExo033shll13Gf//7Xw444AAAVq1axXfffcd9bWvvCyHSh66ricWGDbDvvp16ilW3EDFM7LoFwzQxTTU/0TWNiBHDqrf22AhHDdZW1VPT0IR3m58Mh41BOU7yXU50i4UMu5W6xtRdBBFC9O78IScnh7333pv169czefJkIpEIDQ0N7XZt1NbWdtiTozOvret6y12nubm5Kbm49H3pNJ50GgukwHg2vQrb3wfX3mDLbj0f8WHd/j7O4JR2zavNiy+mYb/9yD7ySJzJOJ4uSvrPp4tkPMkt1cdjGEZcXkfWIIToh0pK4O23Ya+9IDOzU085fMThOKwONmzdgAULWbYswkaYDQ0bGFQ0iMNHHN67MQsh+lyXExtHHnkkb775Jk8//TQejweAY445htNPP52ioqK4ByiESIDHH4cf/hAOOqj1XFZWp5MaADkZNrzbg4S+10A8itlyHVRS4+n31rJ+q49g2MCiQX0gQq2viSEDMtinMJdgOErRwM5NZoQQyak35w9+v58NGzYwaNAgxo4di81mY9myZRx//PEAeDweNm/e3K3+GpqmtSwmNf+ciotLHUmn8aTTWCDJx+P9D2g62F3tz9tzYG0llN8Fd8xqdylWWpq84+mGpP58ukHGk9xSeTzxilnWIISIj1A0RLmnnDJPGV6fl0JXIdPc05jqnorDmsB+V01NsHAhXHdd+yTGD37QpZf57/r/EjWilA4ppbaplkA4QKY9k3xnPlEjyn/X/5eZo2fu+YWEECmjy4kNgKKiIq666qp4xyKESDTTVA3Bb7kFCgvho49gxIhuvljnemx8sm4L5Z9twjChuWKVCYQjMTbVBnDadCyahfHugm7GIYRIFvGaP9xxxx0cffTRFBcXs2XLFu677z4sFguzZs3C5XIxe/ZsFi5cSG5uLtnZ2cyfP5/S0lJpHC5EPDR52+/UaFZRBdeuAF8E9n8Szjqr72MTQqQtWYMQomdC0RAL31/IEs8SdE0n257NKu8qKqoqWF61nLlT5iYmuVFbCyedBO+/rxqGP/usqhjRDWWeMqwWK6PzR+90bW3dWso8ZZLYECLNWPb8kJ0tX76ca665htNPP53q6moAFi9ezPLly+ManBCiD4XDcO65KqkB4PXCM890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t+V9qW3btmfd0/j4eI0bN06SXfc0NzdXL7zwgtq2bauEhAS1b99e06ZNkzHGc44t97UksimWsC1esDkmCPRx38Zx3abx27Yx2sZxOC0tTRMnTlSbNm2UkJCgXr16af369Z76QOtPSWFTzHAutsUUvtgcb5xLoMcjvtgYq/hiUxzji20xji82xj8Fwlhk8eLF5rnnnjNff/21iYuLMwsWLPCqf+2118w111xjFixYYDZt2mQGDhxo2rZta44fP+6nFl+Ye++918yaNcts3brVbNq0yfTv39+0bt3apKene8557LHHTKtWrczSpUvNhg0bzG233WZuv/12P7b6wnzzzTdm8eLF5vfffzdJSUnmueeeM/Xq1TNbt241xtjTzzOtW7fOtGnTxnTu3NlMmDDBU25TX6dOnWo6depkDhw44PlKSUnx1NvS1yNHjpg2bdqYkSNHmnXr1pnk5GSzZMkSs2PHDs85trwvpaSkeN3PH374wcTFxZkff/zRGGPPPTXGmFdeecVcd9115ttvvzU7d+408+fPN1dffbV55513POfYcl9LIptiCdviBVtjAhvGfdvGddvGb9vGaBvH4aFDh5qOHTuaFStWmO3bt5upU6eaRo0amX379hljAq8/JYVNMcO52BZT+GJrvHEuNsQjvtgWq/hiWxzji20xji82xj8FwarExpn+HFi43W7TvHlz8+abb3rKjh07ZurXr2/mzp3rjyYWmJSUFBMXF2dWrFhhjHH6Va9ePTN//nzPOb/99puJi4sza9as8VMrC861115rZsyYYWU/09LSTIcOHcwPP/xg+vTp4wkobOvr1KlTTZcuXfKss6mvTz/9tOndu/df1tv8vjRhwgTTvn1743a7rbqnxhgzYMAAM2rUKK+ywYMHm+HDhxtj7L6vJY1tsYSN8UKgxwS2jPu2jeu2j9+BPkbbNg5nZmaaq666ynz77bde5d27dzfPPfdcwPWnpLItZjgXG2MKXwI93jgXW+IRX2yLVXyxPY7xJdBjHF9si38KilVLUfmya9cuHTx4UM2aNfOURUZGqmHDhlqzZo0fW3bxUlNTJUnly5eXJG3cuFHZ2dlefa1du7ZiYmK0du1afzSxQOTm5mrevHnKyMhQYmKilf0cP368WrVq5dUnyc57umPHDrVo0ULt2rXT8OHDtWfPHkl29XXRokWqX7++hgwZ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\n" + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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X64dO3Y0iK2pml2NHXPhwoU677zzNHz4cGVkZGjChAl65ZVXAmqDF198URMnTtShhx6qI444QpMnT9Y777zT5Pa7du3SoEGDGr2VfNOmTUpPT9dLL70kKbA2aomjjjpKUm19WemPtti4caOuv/56HXHEETrnnHP827/11luaPHmyMjMzdeSRR+q6667T9u3bGxz3tdde07hx45SZmanTTz9dX3/9dYNtmqpp++uvv2rmzJk66qijlJmZqfHjx+vhhx/2x1c3onXs2LFKT09Xenq6P/62jrEp77//vpKTk1s8itTlcmnOnDk67rjjlJGRodGjR+vBBx+Uy+Wqt93KlSt19tln6/DDD9fQoUM1fvx4/eMf/5BUW+qi7qLw1ltv9bdBc7WBt2zZotTU1EZHJickJDRYtrc2nDZtmlasWKG8vDz/+Xf/3bLZbDryyCMb/I4DABBKhg8friuvvFJ5eXn1atQ3dm24L3+bp02bppNOOklr167Vueeeq0MPPdS/b1P19H0+n/7xj39o5MiRGjJkiC6//PIG1zNjxozRLbfc0mDf3Y+5t9gauz6uqqrS/fffr9GjRysjI0Pjx4/XvHnzGozITU9P11//+le9//77Oumkk5SRkaGJEyfq448/bq7Z/QoLC3XbbbdpxIgRGjx4sE455RQtXrzYv76uNmtubq5WrFjR6HVfIOLj49W3b19t2bKl3nKfz6fnnntOEydO1ODBgzVixAjdeeedKi0trbfdmjVrNH36dA0bNkyZmZkaM2ZMgzupGqtp+/XXXys7O1uDBw/WuHHj9OqrrzaIrbk5HvY8Zl5enu6++26NHz9emZmZGjZsmGbMmBFQe+Tk5Oiaa67RyJEjNXjwYB1zzDG67rrrVF5e3ux+K1askMfj0YgRI/Z6jj0Fck2+t7jS09NVVVWlxYsX+/u/sdd8nS1btshisWjIkCEN1tnt9gbJ9e+//17Tp0/XYYcdpkMPPVRTp07VN998418fyGePESNG6JtvvlFJSUlLmwgIKQyNAw4AdfWNdk8ObdiwQWeffbYOOuggXXLJJerUqZOWLl2qq666So8++qiOO+44SdLcuXP11FNP6YwzzlBmZqYqKiq0du1a/fjjjxo5cmST5/zLX/6it99+WyeddJKysrL0+eef73MJhQULFqh///4aM2aMrFarPvzwQ82aNUuGYejcc89tcr/XX39d99xzj8aPH6/zzjtPNTU1Wr9+vb7//nudfPLJje7TtWtXHXHEEVq6dGmD276WLFkii8XiHx3b2jZqSt3Fa+fOnestnzlzpg4++GBdd911/gv0J554Qv/85z914okn6vTTT1dRUZFeeuklnXvuuXrzzTf9ff7vf/9bd955p4YOHarzzz9fW7du1RVXXCGHw6GkpKRm4/n555917rnnymq1asqUKUpOTtaWLVv0wQcf6LrrrtNxxx2nnJycBrdg1ZUc6IgYpdrbpA455JDAG1q1HwyuuOIKffPNNzrzzDPVr18//fLLL3r++eeVk5Ojxx9/XFLt78tll12m9PR0zZgxQxEREdq8ebNWr14tSerXr59mzJihOXPmaMqUKTrssMMkNX8LWnJysr799lv98ssvSktLazbOQNrw8ssvV3l5eb3yD3veanbIIYdo+fLlqqioaJNagQAAtIdTTz1V//jHP/Tpp582OQqzLf42l5SU6JJLLtHEiRN1yimnNPql6e6eeOIJmUwmXXLJJSosLNTzzz+vCy64QG+99ZZ/RHAgWnrdYBiGrrjiCn+yd+DAgfrkk0/04IMPaufOnbrtttvqbf/NN9/ov//9r8455xzFxMToxRdf1IwZM/Thhx/Wu1V+T9XV1Zo2bZq2bNmic889VykpKVq2bJluueUWlZWV6fzzz1e/fv304IMPavbs2erevbu/5EFLS015PB7t3LlTDoej3vI777xTixcv1uTJkzVt2jTl5ubq5Zdf1k8//aQFCxbIZrOpsLBQ06dPV5cuXXTppZcqLi5Oubm5+t///tfsOdevX6/p06crPj5e11xzjTwejx599NG99ntz1qxZo2+//VYTJ05U9+7dlZeXpwULFui8887Tu+++q+jo6Eb3c7lcmj59ulwul6ZOnaquXbtq586dWrFihcrKyhQbG9vkOb/99lt17txZycnJLYo1kOvJQOJ68MEHdfvttyszM9P/+9ncoInk5GR5vV699dZbmjRpUrMxrlq1SpdccokyMjJ09dVXy2QyadGiRTr//PP1yiuvKDMzc6+fPaTaa17DMPTtt9/q2GOPbVE7ASHFALDfWLhwoZGWlmZ89tlnRmFhobF9+3Zj2bJlxlFHHWVkZGQY27dv9297/vnnGyeddJJRU1PjX+bz+YwpU6YYxx9/vH/ZKaecYlx66aXNnnfOnDlGWlqa//G6deuMtLQ04+6776633Z///GcjLS3NmDNnjn/ZzTffbBx77LF7PaZhGIbT6Wyw3UUXXWSMHTu23rKpU6caU6dO9T++4oorjIkTJzb7HBrz6quvGmlpacb69evrLZ8wYYJx3nnn+R8H0kaN+fzzz420tDTjjTfeMAoLC42dO3caK1asMI499lgjPT3d+OGHHwzD+KMt/vznP9fbPzc31xg4cKDxxBNP1Fu+fv16Y9CgQf7lLpfLGD58uHHqqafW6+/XXnvNSEtLq9dWW7duNdLS0oyFCxf6l5177rnG0KFDjby8vHrn8fl8/p+fffZZIy0tzdi6dWu7x9gYt9ttpKenG/fff3+z21166aX1Xm9vvvmmMWDAAOOrr76qt92CBQuMtLQ045tvvjEMwzDmz59vpKWlGYWFhU0e+4cffmjQds359NNPjYEDBxoDBw40pkyZYjz44IPGJ598YrhcrnrbBdqGjT2/Pb3zzjtGWlqa8f333wcUIwAA7aHumrXuWqcxhx12mHHaaaf5H+95bbivf5unTp1qpKWlGQsWLGh03e7XHnXXbEcffbRRXl7uX75kyRIjLS3NeP755/3Ljj32WOPmm2/e6zGbi23P6+P//e9/RlpamvH444/X2+6aa64x0tPTjc2bN/uXpaWlGYcccki9ZXXX5i+++GKDc+3uueeeM9LS0oy33nrLv8zlchlTpkwxhgwZUu+5H3vssQFf/x577LHGRRddZBQWFhqFhYXG+vXrjRtvvNFIS0szZs2a5d/uq6++MtLS0oy333673v4ff/xxveV17dHc68cwjAafO6688kpj8ODB9a5pN27caAwcOLDea6ux6+GmjtnY55Nvv/3WSEtLMxYvXuxfVvca+vzzzw3DMIyffvrJSEtLM5YuXdrsc2jM2WefbUyaNKnZbfa8Ng/0ejLQuIYMGdLo67wxBQUFxlFHHWWkpaUZJ5xwgnHnnXca77zzjlFWVlZvO5/PZxx//PHGRRddVO9zhtPpNMaMGWNceOGFTT6/Pe3cudNIS0sznn766YBiBEIV5RGA/dAFF1yg4cOHa/To0ZoxY4aio6P1xBNPqHv37pJqRxV8/vnnOvHEE1VRUaGioiIVFRWpuLhYo0aNUk5Ojnbu3CmpdnTuhg0blJOTE/D5P/roI0lqcFvZ+eefv0/Pa/cRDOXl5SoqKtKRRx6prVu3NnsbUVxcnHbs2KEffvihRec77rjjZLVatWTJEv+yX375RRs3bqxXG7g1bbS72267TcOHD9fRRx+tSy+9VE6nU/fff3+9Gm9S7URSu/vf//4nn8+nE0880d+HRUVF6tq1qw4++GB98cUXkqS1a9eqsLBQZ511Vr0abZMmTWr2W3ypdqbXr776StnZ2erRo0e9dSaTaa/PrSNilKTS0lIZhtHiSdCWLVumfv36qW/fvvXiqytRURdf3XGXL18un8/XonM0ZeTIkXr11Vc1ZswY/fzzz3r22Wc1ffp0HXPMMfVKGATahoGoex7FxcVt8hwAAGgvnTp1qjex0p7a4m9zRESEJk+eHPD2p512Wr07VU444QR169bNf+3bXj7++GNZLJYG19YXXXSRDMNoUPpgxIgR9UY+DhgwQHa7vUGptMbO061bN5100kn+ZTabTdOmTVNVVZW++uqrVj+HTz/9VMOHD9fw4cN18skn+2/Tv+mmm/zbLFu2TLGxsRo5cmS9a55DDjlEnTp18l/z1F0brlixQm63O6Dze71effrppxo3bly9a9p+/fpp1KhRrX5eu38+cbvdKi4uVq9evRQXF6effvqpyf3qXkeffvqpnE5ni85ZUlLSYITy3gR6PbkvcTWla9eueuutt3TWWWeprKxMr776qq6//noNHz5cjz32mP8OwnXr1iknJ0cnn3yyiouL/TFWVVVp+PDh+uqrrwL+Xa9rH655Ee4ojwDsh+6880716dNH5eXlWrhwob766qt6ibAtW7bIMAz985//1D//+c9Gj1FYWKiDDjpIM2bM0JVXXqnx48crLS1No0aN0qmnnlpvNt895eXlyWw2N7hNpm/fvvv0vL755hs9+uij+u677xpcRJSXlzeZ3Lvkkkv02Wef6YwzztDBBx+skSNH6qSTTvLfitaU+Ph4HXXUUVq6dKmuvfZaSbWlEaxWq798hKRWtdHurrrqKh1++OEym83q0qWL+vXr1+hEG3tOIpCTkyPDMHT88cc3ety6Y2zbtk2S/LPL1rHZbOrZs2ezsdVd3O/t9v2mdESMuzNaONPy5s2b9euvv2r48OGNrq+bEGzChAn697//rdtvv13/93//p+HDh+u4447TCSecILO59d9/ZmZmau7cuXK5XPr555/1/vvv67nnntPMmTP15ptvKjU1NeA2DERL2wcAgGCpqqpq9rb1tvjbfNBBB7Vo0rE9r1NMJpMOPvhgfymy9pKXl6fExMQGpY369evnX7+7xspKORwOlZWV7fU8Bx98cIP2qztP3fVaaxx66KG69tpr5fV6tWHDBj3xxBMqKyurNwnV5s2bVV5evtfrsiOPPFLjx4/X3Llz9dxzz+nII4/UuHHjdPLJJzfZn0VFRaqurm7Qh5LUp0+fVifeq6ur9dRTT2nRokXauXNnvWut5gaV9OzZUxdeeKHmz5+vd955R4cffrjGjBmjU045JaABCy29pgv0enJf42pKYmKiZs2apbvvvls5OTn69NNP9cwzz2jOnDlKTEzUGWec4R8Ac/PNNzd5nPLy8oAS1nXtE8ggEyCUkbQF9kOZmZn+UZrjxo3TOeeco+uvv17Lli1TTEyM/xvKiy66SEcffXSjx6hLuB5xxBH63//+p+XLl2vlypV644039Pzzz2vWrFk644wz9jnWpv6Qer3eeo+3bNmiCy64QH379tUtt9yipKQk2Ww2ffTRR3ruueea/da1X79+WrZsmVasWKFPPvlE//3vf/XKK6/oqquu0owZM5qNb+LEibr11lu1bt06DRw4UEuXLtVRRx1Vr2bSvrZRWlpaQBMJ7Fmk3+fzyWQy6ZlnnpHFYmmwfadOnfZ6zPbWUTE6HA6ZTKa9fhhpLL60tLQGE1fUqRudHhUVpZdffllffPGF/3W0ZMkSvfbaa/rXv/7V6HNriYiICGVmZiozM1O9e/fWrbfeqmXLlunqq69u0zasa5/m6tkBABBsO3bsUHl5ebN1Mtvib3NL6tDuK6/Xu8/XC4Fq6jzB/PK2S5cu/uvdo48+Wn379tVll12mF154wV8X1+fzKSEhQQ899FCjx6i7/jaZTJozZ46+++47ffjhh/rkk0902223af78+Xrttdca1PRvqUA/n0jS3/72N3/N1SFDhig2NlYmk6neHBRNueWWWzRp0iT/Z4h77rlHTz31lF5//XX/NWhjOnfu3Kpr3kCvJ1sbVyBMJpP69OmjPn366E9/+pOOP/54vf322zrjjDP87XXTTTdp4MCBje4f6HVv3cR1XPMi3JG0BfZzFotFf/7zn3Xeeefp5Zdf1qWXXuofuWiz2QJKFnbu3FnZ2dnKzs5WZWWlpk6dqkcffbTJhGRycrJ8Pp+2bNlSb3Ttpk2bGmwbFxfX6EXHnt/kf/DBB3K5XHriiSfq3dIU6K3hnTp10oQJEzRhwgS5XC5dc801evLJJ3XZZZc1SIbubty4cbrzzjv9JRJycnJ02WWXNdiupW3UFnr16iXDMJSSkqI+ffo0uV1de23evLneyAW3263c3NxmRwTXvVZ++eWXZmNp6uK2I2KUakcH9OrVq8UzF/fq1Us///yzhg8fvtdv4s1ms/+2vltvvVVPPvmkHn74YX3xxRcaMWJEm32Tn5GRIUnKz8/3xxhIG0p7H02Qm5srs9m81+MAABBMb731liTt9bb1jvrbXGfz5s31HhuGoc2bNys9Pd2/rKkRrdu2bat391BLYktOTtaqVasaTCRad23d0gmpmjvP+vXr5fP56o22rTvPnqWy9sWf/vQnHXnkkXryySc1ZcoUderUSb169dKqVauUlZUVUEJ9yJAhGjJkiK677jq98847uuGGG7RkyZJGr7/j4+MVFRXVoA8l6bfffqv3uG4k55792NhI4/fee0+nnXaabrnlFv+ympqaZkfZ7i49PV3p6em68sortXr1ap199tlasGCBrrvuuib36du3r/773/8GdPw6LbmebG1cLdWzZ0/FxcWpoKDA/1iqLdGwt8+ogVzzSn+MEgfCFTVtgQPAsGHDlJmZqeeff141NTVKSEjQkUceqddee82fGNpdUVGR/+c96wDFxMSoV69ecrlcTZ7vmGOOkSS9+OKL9ZY///zzDbbt1auXysvL9fPPP/uX5efnN5j9te4b4T1vOVq4cGGTcTT1HCIiItSvXz8ZhrHXOlhxcXEaNWqUli5dqnfffVc2m03jxo1r9viBtFFbOP7442WxWDR37twG3+QbhuGPKyMjQ/Hx8Xr11VfrxbR48eK9fksfHx+vI444QgsXLmxwobr7Oetmxt3zArUjYqwzZMgQrV27NqBt65x44onauXOnXn/99QbrqqurVVVVJam2dtie6kYA1MVb1waBxvv55583OgKj7va8ui88Am3Duhia+5Dw448/KjU1dZ9ubwMAoD2tWrVKjz/+uFJSUnTKKac0uV17/G3emzfffFMVFRX+x8uWLVNBQYH/2leqTTx9//339a5nPvzwQ23fvr3esVoS2zHHHCOv16uXX3653vLnnntOJpOp3vn3xTHHHKOCgoJ68zl4PB69+OKL6tSpk4444og2OU+diy++WCUlJf7rsBNPPFFer1ePP/54g209Ho+/rermMtjdnn2/J4vFolGjRun999+vd03766+/6tNPP623rd1uV5cuXfT111/XW/7KK680etw9vfjii42Oyt1dRUWFPB5PvWVpaWkym817/QwxZMgQlZaW7rVG8e4CvZ4MNK5OnToF/Hv1/fff+6+pd/fDDz+opKTEn0TOyMhQr1699K9//avReta7f0Zt6rNHnR9//FEmk0lDhgwJKEYgVDHSFjhATJ8+XTNnztSiRYt09tln66677tI555yjk08+WWeeeaZ69uypXbt26bvvvtOOHTv09ttvS6otD3DkkUfqkEMOUefOnbVmzRq99957mjp1apPnGjhwoE466SS98sorKi8v19ChQ/X55583+s32hAkT9NBDD+nqq6/WtGnTVF1drQULFqhPnz768ccf/duNHDlSNptNl19+uc466yxVVlbq3//+txISEvzfzjb33Lt27aqsrCwlJCRo06ZNeumllzR69OgGtcEaM2HCBN1444165ZVXNGrUqAaTXbWmjdpCr169dO211+r//u//lJeXp3HjxikmJka5ubl6//33deaZZ2r69Omy2Wy69tprdeedd+r888/XhAkTlJubq0WLFgVUL/b222/X2WefrUmTJmnKlClKSUlRXl6eVqxY4R8Jc8ghh0iSHn74YU2YMEE2m03HHntsh8UoSWPHjtVbb72l3377LeCRpKeeeqqWLl2qu+66S1988YWysrLk9Xq1adMmLVu2TM8++6wGDx6sxx57TF9//bVGjx6t5ORkFRYW6pVXXlH37t39tZHrJp149dVXFRMTo06dOikzM7PJ+O+55x45nU4dd9xx6tu3r9xut1avXq2lS5cqOTnZPzFKoG1Y1w9LlizR7NmzNXjwYHXq1EljxoyRVDtq+auvvtLZZ58dUNsAANDePv74Y23atEler1e7du3SF198oZUrV6pHjx564oknmr0bqj3+Nu+Nw+HQOeeco8mTJ6uwsFDPP/+8Dj74YJ155pn+bc444wy99957uvjii3XiiSdqy5YteueddxqUemhJbGPGjNGwYcP08MMPKy8vT+np6Vq5cqWWL1+u888/v9kyEi0xZcoUvfbaa7rlllv0448/Kjk5We+9955Wr16t2267LaDr5pYYPXq00tLS9Nxzz+ncc8/VkUceqSlTpuipp57SunXr/Nf/OTk5WrZsmf7yl7/ohBNO0OLFi7VgwQKNGzdOvXr1UmVlpV5//XXZ7fZmE9jXXHONPvnkE5177rk6++yz5fV69dJLLyk1NVXr16+vt+0ZZ5yhp59+Wn/5y1+UkZGhr7/+usGIXKl2xPBbb70lu92u1NRUfffdd/rss8/UuXPnZp/7559/rr/+9a864YQT1Lt3b3m9Xr311luyWCwaP358s/v+6U9/ktVq1WeffaYpU6Y0u22dQK8nA43rkEMO0apVqzR//nwlJiYqJSVFhx56aKPnfuutt/TOO+9o3LhxysjIkM1m06+//qqFCxcqMjJSl19+uaTakfP33HOPLrnkEp100kmaPHmyDjroIO3cuVNffPGF7Ha7nnzySf/5pYafPerKJ3z22WfKysqiPALCHklb4ABx/PHH+7+5PPPMM5WamqqFCxdq7ty5Wrx4sUpKShQfH69Bgwbpqquu8u83bdo0ffDBB1q5cqVcLpd69Oiha6+91p8kasp9992nLl266J133tHy5cs1bNgwPf300xo9enS97bp06aK5c+fq/vvv19///nelpKToz3/+szZv3lwvadu3b1/NmTNHjzzyiB544AF17dpVZ599tuLj43Xbbbc1G8uUKVP0zjvvaP78+aqqqlL37t01bdo0XXnllQG13ZgxYxQVFaXKykpNmDChwfrWtlFbuPTSS9W7d28999xzeuyxxyTV1mEdOXKkP1kn1baB1+vVvHnz9OCDDyotLU1PPPFEkxPR7W7AgAF6/fXX9c9//lMLFixQTU2NevTooRNPPNG/TWZmpmbOnKlXX31Vn3zyiXw+n5YvX65OnTp1SIySdOyxx6pLly5aunRpwH1rNpv12GOP6bnnntNbb72l//3vf4qOjlZKSoqmTZvmT/6OGTNGeXl5WrhwoYqLi9WlSxcdeeSRuuaaa/yjVm02m+6//3794x//0N133y2Px6PZs2c3+cHwpptu0rJly/TRRx/ptddek9vtVo8ePXTOOefoiiuuqPflQKBteM4552jdunVatGiRnnvuOSUnJ/vXr1q1SiUlJZo0aVJAbQMAQHubM2eOpNq/oZ07d1ZaWppuu+02TZ48ea8Jwvb427w3l19+udavX6+nn35alZWVGj58uO666y7/qD+ptl7rLbfcovnz5+u+++5TRkaGnnzyST3wwAP1jtWS2Mxms5544gnNmTNHS5Ys0aJFi5ScnKybbrpJF110UaueS2OioqL04osv6qGHHtLixYtVUVGhPn36aPbs2f4vk9vaRRddpFtuuUXvvPOOJk+erL/+9a/KyMjQq6++qocfflgWi0XJyck65ZRTlJWVJal2IrI1a9ZoyZIl2rVrl2JjY5WZmamHHnqo2b4dMGCA5s2bp9mzZ2vOnDnq3r27rrnmGhUUFDRI2l511VUqKirSe++9p6VLl+qYY47Rs88+22CStL/85S8ym8165513VFNTo6ysLM2fP18XX3xxs887PT1do0aN0ocffqidO3cqOjpa6enpeuaZZ/Y6OrRr16465phjtHTp0oCTtlJg15OBxnXLLbfozjvv1COPPKLq6mpNmjSpyaTtlClTFBUVpc8//1wffPCBKioq1KVLF40cOVKXXXaZBg0a5N922LBheu211/T444/rpZdeUlVVlbp166bMzMx6z7W5zx7l5eX69NNPdddddwXcNkCoMhlMJQ0A2E889thjWrRokf773/922GQf4eLKK6+UyWTyX6QDAAAgPH399deaNm2ali5dqt69ewc7nJDy3HPP6dlnn9X777/foZMNAu2BmrYAgP3GBRdcoKqqKr377rvBDiWk/Prrr1qxYoVmzpwZ7FAAAACwjw4//HCNHDlSzz77bLBDCSlut1vPPfecrrjiChK22C8w0hYAAAAAAAAAQggjbQEAAAAAAAAghJC0BQAAAAAAAIAQQtIWAAAAAAAAAEIISVsAAAAAAAAACCHWYAcQanw+nzwej8xms0wmU7DDAQAAwO8Mw5DP55PVapXZzNiD5nBNCwAAEJoCvaYlabsHj8ejNWvWBDsMAAAANGHw4MGKiIgIdhghjWtaAACA0La3a1qStnuoy3APHjxYFoslyNHsfwzDUFlZmeLi4hj10QFo745Hm3cs2rtj0d4di/ZuyOv1as2aNYyyDUCoX9Py+g5P9Fv4ou/CE/0Wvui78NRR/RboNS1J2z3UdYrFYgnJC9xwZxiGzGazLBYLb1wdgPbueLR5x6K9Oxbt3bFo76bRHnsX6te0vL7DE/0Wvui78ES/hS/6Ljx1dL/t7RwMUwAAAAAAAACAEELSFgAAAAAAAABCCElbAAAAAAAAAAghJG0BAAAAAAAAIISQtAUAAAAAAACAEELSFgAA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xx9XTEyMv05tbGysoqKiFBsbq+zsbN1///1yOByy2+265557NHToUJK2baR3QoxSE+1ak1uq1Eh7vdEuhmFoe6lTmSmd1TshJohRhi/aFwAAAAAAAFIYJW0XLFggSZo2bVq95bNnz9bkyZMlSbfddpvMZrNmzJghl8ulUaNG6a677urwWPdXZrNJ2Vkpyit2amN+hZIc0YqOsMjp8mp7qVPxMRGanJUss5lbF1uD9gUAAAAAAIAURknb9evX73WbyMhI3XXXXSRq21FGskMzxvbXwtW52phfoZ1lPkXazMpM6azJWcnKSHYEO8SwRvsCAAAAAAAgbJK2CB0ZyQ4NSopTTmGlyqs9io2yqndCDCNA2wjtCwBA+Pjqq680b948rV27VgUFBXrsscc0btw4//pbbrlFixcvrrfPqFGjNG/evGaP+/LLL2vevHkqKCjQgAEDdMcddygzM7NdngMAAABCD0lbtIrZbFLfbvZgh7Hfon0BAAgPVVVVSk9PV3Z2tq6++upGtzn66KM1e/Zs/+OIiIhmj7lkyRLNnj1bs2bN0qGHHqrnn39e06dP17Jly5SQkNCm8QMAACA0kbQFAAAAWmn06NEaPXp0s9tERESoW7duAR9z/vz5OvPMM5WdnS2pdkLeFStWaOHChbr00kv3KV4AAACEB3OwAwAAAAD2Z19++aWGDx+u8ePH66677lJxcXGT27pcLv34448aMWKEf5nZbNaIESP07bffdkS4AAAACAGMtAUAAADaydFHH63jjjtOKSkp2rp1q/7xj3/okksu0WuvvSaLxdJg++LiYnm93gZlEBISErRp06YWn98wDBmG0er420tdXKEYG5pGv4UuwzCk2n9qvHcM/38N7ftcGcbv/8froX3xOxe+6Lvw1FH9FujxSdoCAAAA7WTixIn+n9PT05Wenq5x48b5R9+2t7KyMpnNoXdznWEYqqqqkiSZTEy2Gi7ot9BVXl4ur9crr9stj9vd6DZer7fNzud1u+X1elVeXq7S0tI2Oy7q43cufNF34amj+s3n8wW0HUlbAAAAoIP07NlTXbp00ebNmxtN2nbp0kUWi0WFhYX1lhcWFqpr164tPl9cXFyjI3qDrW6EicPh4MNsGKHfQldsbKwsFossNpusNlsjW9T2ndVmldpgpK3FZpPFYlFsbKwcDsc+Hw+N43cufNF34amj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f/nll7VhwwZ98MEHNb4nJSVF06ZN06233upetnjxYs2ePVvr1q2rU730aQEAAPzbufq0jLT9maCgIHXu3Flms5lRLQAAAH6kavRxUFDgdGGbNGkii8VS46FjBQUFNUbTVomLi6sxqvZs5WtDnxYAAMA/1bVPGzg9Xi8xm80BM3IDAAAA/i04OFidOnXS+vXr1a9fP0mnphJYv369hgwZUuv3dO3aVf/+97/1wAMPuJetW7dOXbt2rXO99GkBAAACGw8iAwAAADzowQcf1NKlS7VixQrt3btXEydOVEVFhQYOHChJGjdunP7whz+4yw8bNkz//Oc/NW/ePO3du1ezZs3Stm3bzpjkBQAAQMPDSFsAAADAg2655RYVFhZq5syZysvLU4cOHfTWW2+5pzs4cuSIzOafxlJ069ZN06dP14wZM/Tqq6+qVatWmj17tpKSkny1CwAAAPAyHkQGAAAAAAAAAH6E6REAAAAAAAAAwI+QtAUAAAAAAAAAP0LSFgAAAAAAAAD8CElbAAAAAAAAAPAjJG3hEXPmzNGgQYOUlpamHj166NFHH9W+ffuqlamsrNSkSZPUvXt3paWl6YknnlB+fr6PIg5s7777rgYMGKBu3bqpW7duuueee/T111+719PWnvXnP/9ZycnJevHFF93LaPP6M2vWLCUnJ1f7279/f/d62rr+HT16VGPHjlX37t2VmpqqAQMGaOvWre71hmHo9ddfV3p6ulJTU/XAAw8oOzvbdwEHsD59+tQ4v5OTkzVp0iRJnN9oeHJzczVhwgT16dNHqamp6tevn2bOnCmbzVat3A8//KD7779fnTt3Vq9evTR37lwfRYwqb775pu6991516dJFV199da1lDh8+rIcfflhdunRRjx499NJLL8nhcHg5Uvzc4sWL1adPH3Xu3Fl33XWXtmzZ4uuQ8DMbNmzQb37zG6Wnpys5OVlr1qyptp6+l38i7xG4AiWHQtIWHvHtt99q8ODBWrp0qebPny+Hw6ERI0aovLzcXWbq1Kn68ssvNWPGDC1cuFDHjh3T448/7sOoA9dll12msWPHavny5Vq2bJmuu+46PfbYY9q9e7ck2tqTtmzZoiVLlig5Obnactq8frVr105r1651/3333Xfd62jr+lVUVKT77rtPVqtVc+fO1cqVKzV+/HhFR0e7y8ydO1cLFy7UxIkTtXTp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rwMAgPNx/fXXKysrSzabTV9//bUyMzNltVr1yCOP1Chrs9kUHBxcL/U2bty4XrYDAAAABKqqvrjD4dD27ds1fvx4mUwmPf300xe1XYvFovj4+HqKEgAaBkbaAggowcHBio+PV0JCgu6//3717NlTf//73yX9NOrzzTffVHp6uvr37y9JOnLkiJ588kldffXVuvbaa/Xb3/5Wubm57m06nU5lZWXp6quvVvfu3fXyyy/LMIxq9f58egSbzaZXXnlFvXr1co/6/eCDD5Sbm6thw4ZJkq655holJyfrmWeekSS5XC7NmTNHffr0UWpqqm677TatXr26Wj1ff/21brrpJqWmpmro0KE6dOhQvbbfBx98oJtvvlmdO3dW//79tXjx4mrrX3nlFd10003q0qWL+vbtqxkzZshut9e6rVmzZmnFihX64osv3KMuvvnmG/f6gwcPaujQoerSpYtuu+02bdq06bxiTU5O1gcffKDHHntMXbp00Y033qgvvviiWpm6tNd3332n+++/X6mpqerVq5emTJmi8vJySdJHH32ktLQ0ZWdnu8tPnDhR/fv3V0VFxXnFCwAA0NBV9cWbN2+ufv36qWfPnlq3bp2kc/d1i4qKNGbMGF133XVKTU3VjTfeqGXLlkmqfXqEc/Xzarur7C9/+Yv69Onjfr1lyxY9+OCD6t69u6666ioNGTJE27dvP+P+2Ww2ZWZmKj09XZ07d1bv3r01Z86cC28wALgIjLQFENBCQkJ04sQJ9+v169crIiJC8+fPlyTZ7XaNGDFCXbt21eLFixUUFKQ//vGPGjlypD7++GMFBwdr3rx5WrFihaZOnao2bdpo3rx5+vzzz3Xdddedsd5x48Zp8+bN+v3vf6/27dsrNzdXx48fV/PmzTVr1iw98cQTWr16tSIiIhQaGipJmjNnjj7++GNNmjRJrVq10oYNG/T0008rJiZG1157rY4cOaLHH39cgwcP1t13361t27bppZdeqre2+vjjj/X666/r//2//6cOHTpox44dev7559WoUSNlZGRIksLDw5WVlaWmTZtq165dev755xUeHq6HHnqoxvaGDx+uvXv3qrS0VFlZWZKk6OhoHTt2TJL02muvafz48WrZsqVee+01jRkzRn/7298UFFT3j5433nhDTz/9tMaNG6eFCxdq7Nix+vLLL9W4ceM6tdeBAwf00EMP6cknn9TUqVNVWFioyZMna/LkycrKytIdd9yhL7/8UmPHjtWSJUu0du1affjhh1qyZInCwsIutKkBAAAavF27dmnTpk1q0aKFpHP3dV9//XXt3btXc+fOVZMmTXTgwAGdPHmy1m3XV7+4rKxMd9xxh37/+99LkubNm6eHH35Yf/3rXxUREVGj/MKFC/X3v/9dM2bMUPPmzXXkyBH9+OOP510vANQHkrYAApJhGFq/fr3Wrl2rIUOGuJc3atRIU6ZMcU+L8L//+79yuVx68cUXZTKZJElZWVm65ppr9O233yo9PV3vvPOOHn74Yd14442SpEmTJmnt2rVnrHv//v367LPPNH/+fPXs2VOSdPnll7vXR0dHS5JiY2MVFRUl6dRv7efMmaP58+crLS3N/T3/93//p/fff1/XXnut3nvvPV1xxRXukblXXnmldu3apblz556zPaZPn67XX3+92jK73a42bdq4X8+aNUvPPPOMez8vv/xy7dmzR++//747aXv6/LSJiYnav3+/Vq5cWWvSNjw8XKGhobLZbLXezjZ8+HD98pe/lCSNGjVK//M//6OcnJxqMZ1LRkaGbr31VknS6NGjtXDhQm3ZskU33HBDndprzpw5GjBggB544AFJUqtWrfTcc89p6NChmjhxokJCQpSZmanbbrtNU6ZM0eeff67HH39cKSkpdY4RAADgUvHVV18pLS1NDodDNptNZrNZzz//fJ36uocPH1aHDh3UuXNnSaf6mmdyMf3i0/Xo0aPa68mTJ+vqq6/Whg0b1Lt37xrljxw5opYtW+qqq66SyWRSQkLCedUHAPWJpC2AgFLVUbTb7TIMQ7feequeeOIJ9/qkpKRq89j+8MMPOnDggLp161ZtO5WVlTpw4IBKSkqUl5enLl26uNcFBQUpJSWlxhQJVXbs2CGLxaJrrrmmznHn5OSooqJCw4cPr7bcbrerQ4cOkqS9e/cqNTW12vquXbvWafsjRozQwIEDqy1buHChNmzYIEkqLy/XgQMH9Nxzz+n55593l3E4HIqMjHS/XrVqlRYsWKCDBw+qvLxcDoej1lEIdZGcnOz+uiqpW1hYeF5J29O30ahRI0VERKiwsFBS3drrhx9+0M6dO/XJJ5+4lxmGIZfLpdzcXLVp00bR0dF68cUXNWLECKWlpenhhx+uc3wAAACXku7du2vixImq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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Residuals (Test Set):\n", + " Mean: 0.6886\n", + " Std Dev: 9.7514\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAAJOCAYAAABm7rQwAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAxVJJREFUeJzs3XmcTvX///HnNRvDSPZkbB+aBTNEki3RJHuWENmXJCF7CeEnsoaIrFlD2coWI9kpJWQNEdlnhlmZMfP+/eE7VzOhawzOxczjfru51ZzrXOe8zmvOdV3nes4572MzxhgBAAAAAAAAFnJxdgEAAAAAAABIfwilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAAAAAAAAYDlCKQAAAAAAAFiOUAoAAAAAAACWI5QCAAAAAACA5QilAABIp95//31Vq1bN2WUAAAAgnSKUAgDgIVu2bJl8fX3t/4oVK6bKlSvr/fff18WLF51d3iPj331K+m/MmDHOLu+Opk6dquDg4BTNe/bs2btuX5MmTR5KfRcvXtRnn32mw4cPP5Tl34/EfsycOdPZpaTa5s2b9dlnnzm7DAAAHltuzi4AAID0olu3bvL29lZsbKx+++03LV++XL/88otWrVqlDBkyOLu8R0Zin5Ly8fFxUjX/7YsvvtCrr76qoKCgFD+nTp06evHFF5NNy549+4MuTZJ06dIlTZo0Sfny5ZO/v/9DWUd6tnnzZi1YsEBdu3Z1dikAADyWCKUAALDIiy++qICAAElS48aNlS1bNk2fPl0bN25UrVq1nFzdoyNpnx6k6OhoZcqU6YEv914VK1ZMr732mrPLuC83btyQu7u7XFzS50n3j8q+BADA4y59HkkAAPAIeO655yRJZ86csU+LjY3VhAkT1LBhQ5UpU0alSpVS8+bNtWvXrmTPTXrp0+LFixUUFKQSJUqoUaNG2r9//23rCg4OVp06dRQQEKA6depow4YNd6wpOjpan3zyiapUqaISJUro1Vdf1cyZM2WMSTafr6+vhg4dqrVr16pWrVoKDAxU06ZNdfToUUnSokWL9MorryggIEAtW7bU2bNn76tXSe3cuVPNmzdXqVKl9Nxzz6lz5846ceJEsnk+++wz+fr66vjx4+rVq5fKli2r5s2b2x9fuXKlGjZsqMDAQD3//PPq0aOHzp8/n2wZp06dUteuXVWxYkUFBAToxRdfVI8ePRQREWHvQXR0tJYvX26/DO/999+/7+07ceKEunXrpueff14BAQFq2LChNm7cmGyeq1evauTIkapbt66effZZlS5dWh06dNCRI0fs8+zevVuvv/66JOmDDz6w17hs2TJJUrVq1e5Yb8uWLdWyZctky/H19dXq1av16aefqnLlyipZsqQiIyMlSfv27VP79u1VpkwZlSxZUi1atNAvv/ySqm1PvIRzz549GjZsmF544QU999xzGjRokGJjYxUeHq6+ffuqbNmyKlu2rEaNGpVs30z6uvjyyy9VtWpVBQYGqkWLFjp27Nht67uffen999/XggULJCnZpZiJZs6cqTfeeEPlypVTYGCgGjZsqHXr1t1WQ+JrKfE1WqJECdWuXVtbtmy5bd6LFy+qf//+qlSpkkqUKKFq1arpo48+UmxsrH2e8PBwffzxx/bX8CuvvKJp06YpISEh2bJWr16thg0b2vefunXras6cOSn8TQEA8GBwphQAAE7y999/S5KeeOIJ+7TIyEh9/fXXqlOnjho3bqyoqCh988036tChg77++uvbLsFatWqVoqKi1LRpU9lsNs2YMUNdu3ZVcHCw3N3dJUnbtm1T165dVbRoUfXq1UthYWH64IMP9NRTTyVbljFGnTt3tocZ/v7+2rp1q0aNGmX/MpzUnj179MMPP9jDnmnTpuntt99Whw4dtHDhQjVv3lzXrl3TjBkz1L9/f82dOzdFfYmMjFRoaGiyaYmXt+3YsUMdO3aUt7e33n33XV2/fl3z589Xs2bNtGzZstsu++vevbsKFiyoHj162MOLKVOmaMKECapZs6Zef/11hYaGav78+XrzzTe1YsUKPfHEE4qNjVX79u0VGxurFi1aKGfOnLp48aJ+/PFHhYeHK0uWLBo1apQGDBigwMBA+5hQBQoUcLh9MTExt21flixZ5O7urj/++EPNmjVTnjx51LFjR2XKlElr165Vly5d9Nlnn+mVV16RdCvIDA4OVo0aNeTt7a0rV65o8eLFatGihVavXq08efKoSJEi6tatmyZOnKimTZuqTJkykqTSpUun6Pfwb59//rnc3d3tfXF3d9fOnTvVsWNHlShRQu+++65sNpuWLVum1q1ba+HChQoMDEzVuoYNG6acOXOqa9eu2rdvnxYvXqwsWbJo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df36db377rvKkiWLRowYoUKFCmnz5s2aNGmS/P397WdypGVJ96GJEydq4cKFqlixoi5evKjDhw9r5MiRCgoK0h9//KFhw4YpJCREWbNmlbe3t4YNGyZ3d/d08YeExNeJozvs/vXXX+rSpYtKlCihVatW6auvvrL/gSo9Wb9+vYYPHy53d3d5eXnp3Xff1csvv6w//vhDrVu3Vu7cueXi4qLcuXNr3759mjlzZrr83uZshFKwGz9+vPbu3ZvsbjGnT59W06ZNFRAQoP79+6tw4cI6dOiQcufObT/7JT05cOCAOnbsqDfeeEPu7u765ptvVKxYMXXu3Fn+/v7auXOnvv32W0VGRqpgwYJq3LjxbV900qqkBxMrVqzQuHHj1LNnT507d05ff/21ypQpo3feeUfe3t765ZdftGLFCmXOnFlPPfWU2rVrJzc3t3RxMJFo9OjRWrlypRo0aKBr167p+++/12uvvab+/fvrzJkzWrRokTZt2qQ6deronXfecXa5j5SkX1zOnz+vffv22cfcSo+3hN6xY4eGDBmiWbNmKV++fLd9OTx48KC2b9+up556SvXq1VORIkWcXLG1jhw5ou7duyskJESLFy9OdmOFa9euqUWLFgoPD9eCBQvk7e3t7HItcenSJa1fv15Nmza1v2ZWrlyp0NBQbdu2TR4eHurevbv8/Pzs4dy/g4OOHTuqRIkS6t69u5O3xhqbNm3S4MGD9fnnn6t48eL65Zdf9Oabb2rMmDGqU6eOpFsDevfp00clS5a0X8afHiR9Tx43bpw2bdqky5cvy8fHR7ly5dKQIUPk4eGhyZMna/r06Ro9erRq165912WkRf/evo8//liXL1/W+PHj7a+xsLAwNWrUSKVLl9aYMWMkSfv27VNAQECaP/MnqbNnz2rFihWqVKmSSpUqpfPnz2vatGn66quvNHnyZL388su6ceOGrl+/Ljc3N2XOnFmS0tUx5I4dO9SpUyf16dNH2bJlU2hoqEaNGqVGjRqpf//+ypgxo06cOKHatWsra9as6e4P5EmvQGjUqJHeffddeXp66tdff7UHwjVq1FBoaKhWrlypS5cuqVChQipfvrwKFCjg7PLTJ4N0LyEhwRhjzNChQ03Tpk3t069fv26MMWbFihXG19fXtGzZ0vz1119OqfFR8Ndff5kZM2aYyZMn26f99ttvpkGDBqZz585m7969zivuEfLbb7+ZTz75xKxcudI+7ccffzS1a9c2PXv2NIcPH77j827evGlViU63fft2U7VqVXPw4EFjzK2e+fr6mu+++84+z7lz58zAgQNNjx497K/RtGzq1Klm3759KZ7/bj2JjY19UCU9NjZs2GCqVKlizp49a4wxJj4+3v562rVrlzlz5owzy7NUfHz8HacfO3bMVKpUybRr186EhoYaY/7Zh0JDQ02vXr3SzXtQVFSUMeaf18r8+fPNlClT7I+vXLnStGrVyrz99tvmyJEj9unbtm0zMTEx9p+bNm1qhg8fblHVzvfNN9+Y7t27G2OMWb16tSlVqpRZuHChMcaYa9eumXPnzhljbr13320/TOtmzpxpXnjhBbN7925jjDEDBgwwJUuWND///LMx5ta+N27cOOPr62u2bdvmzFKd5sqVK8YYY9577z3Trl07+/TEY+41a9aYSpUqmb///jvZ89LLPrVhwwbj6+trqlevbo4fP26ffvnyZTN48GDj7+9vNm7ceNvz0sNxkjH/bOdHH31kevbsmeyxXbt2GT8/PzNr1ixjjDE3btwwPXr0MMeOHbO8zkfBzp07zYIFC8zo0aPt065cuWKGDRtmfH19zerVq40x6ee19ahLP7E77MwdBqGWpKCgIB08eFArVqyQJGXIkEGSlClTJpUrV07nz59PV3+pSWSMUUhIiN58801NmjRJV69etT9WsmRJDRo0SOfPn9fs2bO1devWZM9Lb44cOaKWLVtq/vz5unbtmn16lSpV1KdPHx07dkyzZ8/Wnj17bntuWr5M5t9iYmKUP39+FStWTKtWrVLbtm01aNAg1alTR5GRkfr999+VN29evfvuu/YxW9Ly/rR3716tWbNGU6dO1eHDh1P0nH//RT2xP+nxTClfX1+FhYVpyZIlkiQXFxf76yk4OFjLli1TbGysM0u0RNIzxDZv3qwFCxZo5cqVOnTokJ555hnNmDFDR48eVd++fRUWFmYfBDZbtmwaM2aM/dLQtGzMmDGqXr26IiIi5O7urqtXr+rUqVNaunSppk6dKkmqV6+eXn/9dd24cUOjRo3Sxo0b1aFDB40ZM8Z+XHD48GEdP378tvGB0rLo6Gj7GWYDBw5Unz597Dfr2LBhg8aMGaOIiAjlzZs33Q1MbYxRTEyM9uzZox49euj555/Xli1btGrVKn344Yd67rnn7LdY79Kliz766COVK1fO2WVbYsuWLfZBzD/55BPNnTtXklS/fn398ssvWrp0qaR/jrmNMfY7piWVXo6/8+XLp/r16+vvv//WlStXJN3qSc6cOdWlSxc1b95c77zzjvbu3ZvseWn5LDvpn2OclN5h98qVK/Lw8NC4ceP0zDPPOKVmZ4qJidHSpUs1dOhQHTt2zD49R44c6ty5s1q1aqW+fftq1apV6ea19ajjt5CO3Lx5U9I/two9ffq09uzZozNnzujatWsqX7683njjDU2aNEnLly+XdGvsiAMHDuiFF17Q6tWrlS9fPqfV7yw2m005cuTQ//t//09Zs2bV4cOHdeTIEfvjpUqV0uDBg3XgwAF99913un79uv15aV3ih2Tif/38/PTxxx/Ly8tLe/bs0Z9//mmfNzGY2rJli3bv3u2Uep3hTl9MwsLCFBERoR07duijjz5Sr1697GMBbd26VYsWLVJISIhy586dLsbZePbZZ9W5c2ddv35dEyZM0KFDh1L0PHOH8W7So/z582vgwIGaOXOmRo0apWPHjunEiRMaPXq0VqxYodq1a8vDw8PZZT50iQeWo0aN0pAhQ7Ru3TqtWbNG7du31+bNm+Xr66tZs2bp6NGjev/99xUaGnrbwWhaD8fLly8vb29vtWrVSuHh4XryySfVqlUr1alTRytWrNDnn38uSapbt66aNGkiDw8Pffzxx4qNjdWSJUvsr7MCBQpo/fr1aX5ssm3bttm/BL7wwgtKSEhQjx497F+OpVthVXBwsDw9PZMFCWn9i86/33/d3d0VExOjwoUL68cff1T37t3Vt29fNW7cWHFxcVq5cqV27dolDw8PNWvWzH7JfloWFhamlStX6pNPPlG3bt20YMEC1axZU5IUGBioZs2a6fPPP9dXX32l6OhoXbx4UStXrtRTTz2lLFmyOLn6h+9Ox0f+/v7q3LmzXnzxRXXt2lX79u2zHwflzJlTb731lvr166eAgAAnVOwciceA93KH3fR0I5M78fT0VPv27dW4cWPt2LEj2R/Ds2fPrrffflv169fX0KFD7WNywcmsPjULzvHVV1+ZxYsX20/bX7NmjXnhhRdMxYoVTdWqVU379u3NiRMnTEREhBk+fLgpXry4qVevnmnQoIEpXbq0OXTokJO3wFp3Ow1406ZNpkqVKubDDz+87XTYffv2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T5pixYqZBg0amHnz5pkbN24YY27dfadOnTrm4sWLzizXUklPtz59+rR57bXXzPbt240xty5tLFOmTLLL0YwxZu7cuaZz585p+jT0u5kxY4YpU6aM2b17t9m/f79Zvny5KVOmjOnbt2+ySz1PnjxpwsPD7acUp/VT0pPuCytWrDAjRowwEydOND/88IN9+qpVq0zr1q3N22+/bb98OOlln1999ZUpXbq0WbdunXWF45Hx448/mj///NMYY8yoUaPMwIEDjTHGLFy40JQtW9aULFky2XtReHi4adeunRk7dqwzyn0kHDx40FSqVMns2LHDPm3Tpk2mQYMGpn79+iY8PNwYY8yff/5pFi1alC4vs75x44Zp27at+eyzz5JNX716tSlWrJgZOXJksjsQJkpvn2/Dhw83NWrUMMOHDzddu3Y1FStWTHa3xnPnzpkpU6aYyZMnm2XLltn3pbT+2Zb0EqLRo0ebypUrm2+++cb+2tq/f7/p06ePqVOnjtmwYYMxxpi3337bfPHFF06p10rLly+331EwsU8LFy40HTp0MMbceo2VLl3aLFiwwBhza5iDxLs1nz17Nt29xpLiDrv/bf/+/eall16yf+afOnXKlC1b1vj6+poBAwbY5zty5IgZOHCgOXnypLNKxX8glErjLl68aLp162beeOMN+60vhwwZYkqVKmW+/PJL+welMcYcPnzYVKlSJd2NQZLUzZs3zcyZM82wYcOMMbfG2Xj55ZdNnz59zNtvv21/00sMpiIjI51ZrmV69Ohh/yKTeDCxb98+U6lSJWPMrS82pUqVso8hERERkewLYeJz0tNBRUJCgunUqZMZOnRosukbNmwwJUqUMH379rUfcCWV1nuU9KB91KhRpmLFiqZXr16mQ4cOpn79+mb27Nn2x1etWmXatWtn3njjDXsAYcytcYKef/55Aql06vr166Z+/fqmWrVqpl+/fqZ06dL2L8PGGNO/f39TvHhxs3nzZnPy5Elz4sQJ065dO9OgQYM0/6U40RtvvGG2bt2abNquXbtMqVKlkr2WYmNjzerVq03x4sVN8+bNTVhYWLLnpLdgKiIiwlSvXt2MHDnSPi0+Pt4kJCSY999/3/j6+ppx48bZH0sP40f9288//2wqVqxofvnlF/u0ZcuWmebNm5tOnTrZP9f+3Zv0tC99+eWXpkKFCmbv3r23hZj7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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Feature Importances (ranked):\n", + " dbds 0.3235\n", + " methane 0.2575\n", + " acetylene 0.0887\n", + " hydrogen 0.0539\n", + " interfacial_v 0.0483\n", + " co 0.0344\n", + " water_content 0.0318\n", + " dielectric_rigidity 0.0317\n", + " oxygen 0.0248\n", + " nitrogen 0.0225\n", + " power_factor 0.0225\n", + " ethylene 0.0216\n", + " co2 0.0211\n", + " ethane 0.0176\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "os.makedirs('artifacts', exist_ok=True)\n", + "\n", + "MODEL_PATH = 'artifacts/health_index_model.pkl'\n", + "SCALER_PATH = 'artifacts/health_index_scalers.pkl'\n", + "\n", + "# Save model\n", + "with open(MODEL_PATH, 'wb') as f:\n", + " pickle.dump(model, f)\n", + "print(f\"\\nModel saved to: {MODEL_PATH}\")\n", + "\n", + "# Save scaler — only scaler_X needed since RF predicts in original y scale\n", + "with open(SCALER_PATH, 'wb') as f:\n", + " pickle.dump({'scaler_X': scaler_X}, f)\n", + "print(f\"Scaler saved to: {SCALER_PATH}\")\n", + "\n", + "print(f\"\\nModel size: {os.path.getsize(MODEL_PATH) / 1024:.1f} KB\")\n", + "print(f\"Scaler size: {os.path.getsize(SCALER_PATH) / 1024:.1f} KB\")" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qRSt2DShmoXG", + "outputId": "f747ab63-d349-4940-c43c-8f2d36a30079" + }, + "execution_count": 15, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\n", + "Model saved to: artifacts/health_index_model.pkl\n", + "Scaler saved to: artifacts/health_index_scalers.pkl\n", + "\n", + "Model size: 3323.1 KB\n", + "Scaler size: 1.0 KB\n" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/servers/fmsr/main.py b/src/servers/fmsr/main.py index b867c2087..3f7b044d0 100644 --- a/src/servers/fmsr/main.py +++ b/src/servers/fmsr/main.py @@ -28,12 +28,13 @@ from mcp.server.fastmcp import FastMCP from pydantic import BaseModel -from src.servers.fmsr.models import ( +from .models import ( DGAInterpretationResult, + HealthIndexResult, WindingTemperatureResult, LoadProfileResult, ) -from src.servers.fmsr.prompt_templates import ( +from .prompt_templates import ( _INTERPRET_DGA_PROMPT, _ASSESS_WINDING_PROMPT, _ASSESS_LOAD_PROMPT, @@ -310,6 +311,43 @@ def _call_load( raise last_exc +def _call_predict_health_index( + hydrogen: float, oxygen: float, nitrogen: float, + methane: float, co: float, co2: float, + ethylene: float, ethane: float, acetylene: float, + dbds: float, power_factor: float, interfacial_v: float, + dielectric_rigidity: float, water_content: float, +) -> float: + """Loads model and scalers from artifacts and predicts health index.""" + + import pickle + import numpy as np + from pathlib import Path + + base_path = Path(__file__).parent / "artifacts" + + # Load model + with (base_path / "health_index_model.pkl").open("rb") as f: + model = pickle.load(f) + + # Load scaler + with (base_path / "health_index_scalers.pkl").open("rb") as f: + scaler_X = pickle.load(f)["scaler_X"] + + # Prepare features + feature_values = np.array([[ + hydrogen, oxygen, nitrogen, methane, co, co2, + ethylene, ethane, acetylene, dbds, + power_factor, interfacial_v, dielectric_rigidity, water_content + ]]) + + # Scale and predict + scaled = scaler_X.transform(feature_values) + score = model.predict(scaled)[0] + + # Return score as percentage (0-100) + return float(score) + # ── Result models ───────────────────────────────────────────────────────────── @@ -539,6 +577,73 @@ def assess_load_profile( return ErrorResult(error=str(exc)) +@mcp.tool() +def predict_health_index( + asset_name: str, + hydrogen: float, + oxygen: float, + nitrogen: float, + methane: float, + co: float, + co2: float, + ethylene: float, + ethane: float, + acetylene: float, + dbds: float, + power_factor: float, + interfacial_v: float, + dielectric_rigidity: float, + water_content: float, +) -> Union[HealthIndexResult, ErrorResult]: + """Predicts a health index for a transformer asset based on DGA and other sensor readings.""" + + if not asset_name: + return ErrorResult(error="asset_name is required") + + if not _llm_available: + return ErrorResult(error="LLM unavailable") + + try: + score = _call_predict_health_index( + hydrogen, + oxygen, + nitrogen, + methane, + co, + co2, + ethylene, + ethane, + acetylene, + dbds, + power_factor, + interfacial_v, + dielectric_rigidity, + water_content, + ) + + # Determine condition based on score + if score >= 85: + condition = "Very Good" + elif score >= 70: + condition = "Good" + elif score >= 50: + condition = "Fair" + elif score >= 30: + condition = "Poor" + else: + condition = "Very Poor" + + return HealthIndexResult( + asset_name=asset_name, + health_index=score, + condition=condition, + ) + + except Exception as exc: + logger.error("_call_predict_health_index failed: %s", exc) + return ErrorResult(error=str(exc)) + + def main(): mcp.run(transport="stdio") diff --git a/src/servers/fmsr/models.py b/src/servers/fmsr/models.py index 944767ae5..638052f5a 100644 --- a/src/servers/fmsr/models.py +++ b/src/servers/fmsr/models.py @@ -1,11 +1,13 @@ from pydantic import BaseModel class HealthIndexResult(BaseModel): + """Represents the health index result for a transformer asset.""" asset_name: str health_index: float condition: str class DGAInterpretationResult(BaseModel): + """Represents the DGA interpretation result for a transformer asset.""" asset_name: str fault_type: str r1: float @@ -17,6 +19,7 @@ class DGAInterpretationResult(BaseModel): recommended_action: str class WindingTemperatureResult(BaseModel): + """Represents the winding temperature result for a transformer asset.""" asset_name: str thermal_status: str hot_spot_rise_c: float @@ -28,6 +31,7 @@ class WindingTemperatureResult(BaseModel): recommended_action: str class LoadProfileResult(BaseModel): + """Represents the load profile result for a transformer asset.""" asset_name: str load_mva: float load_factor_pct: float diff --git a/src/servers/fmsr/tests/test_tools.py b/src/servers/fmsr/tests/test_tools.py index d4c1035cf..17d2fc4c9 100644 --- a/src/servers/fmsr/tests/test_tools.py +++ b/src/servers/fmsr/tests/test_tools.py @@ -305,3 +305,50 @@ async def test_integration(self): }) assert "load_mva" in data assert len(data["reasoning"]) > 0 + + +class TestTransformerHealthIndexModel: + VALID_FEATURES = { + "hydrogen": 100, + "oxygen": 10, + "nitrogen": 200, + "methane": 50, + "co": 5, + "co2": 20, + "ethylene": 15, + "ethane": 8, + "acetylene": 3, + "dbds": 0.5, + "power_factor": 0.95, + "interfacial_v": 15, + "dielectric_rigidity": 30, + "water_content": 0.2, + } + @pytest.mark.anyio + async def test_missing_asset_name_returns_error(self): + data = await call_tool(mcp, "predict_health_index", { + "asset_name": "", + **self.VALID_FEATURES + }) + assert "error" in data + + @pytest.mark.anyio + async def test_llm_unavailable_returns_error(self, no_llm): + data = await call_tool(mcp, "predict_health_index", { + "asset_name": "Transformer1", + **self.VALID_FEATURES + }) + assert "error" in data + + @requires_watsonx + @pytest.mark.anyio + async def test_integration(self): + data = await call_tool(mcp, "predict_health_index", { + "asset_name": "Transformer1", + **self.VALID_FEATURES + }) + assert "asset_name" in data + assert "health_index" in data + assert "condition" in data + assert data["asset_name"] == "Transformer1" + assert data["condition"] in ["Very Poor", "Poor", "Fair", "Good", "Very Good"] From 22c21f1be117e8ee9295d893cc17215c295db407 Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Tue, 31 Mar 2026 23:12:37 -0400 Subject: [PATCH 04/29] added transformer asset docs --- .env.public | 1 + src/couchdb/couchdb_setup.sh | 13 ++ src/couchdb/docker-compose.yaml | 1 + .../iot/bulk_docs_transformer.json | 172 ++++++++++++++++++ 4 files changed, 187 insertions(+) create mode 100644 src/couchdb/sample_data/iot/bulk_docs_transformer.json diff --git a/.env.public b/.env.public index 9ac2189f3..dcc3e25bf 100644 --- a/.env.public +++ b/.env.public @@ -4,6 +4,7 @@ COUCHDB_USERNAME=admin COUCHDB_PASSWORD=password IOT_DBNAME=chiller WO_DBNAME=workorder +TRANSFORMER_DBNAME=transformer # ── IBM WatsonX (plan-execute runner) ──────────────────────────────────────── WATSONX_APIKEY= diff --git a/src/couchdb/couchdb_setup.sh b/src/couchdb/couchdb_setup.sh index 20c5c48c4..32999f646 100644 --- a/src/couchdb/couchdb_setup.sh +++ b/src/couchdb/couchdb_setup.sh @@ -49,5 +49,18 @@ else echo "⚠️ $VIBRATION_FILE not found, skipping vibration data." fi +# Load transformer sample data (Transformer_01) into a dedicated database +TRANSFORMER_FILE="/sample_data/iot/bulk_docs_transformer.json" +if [ -f "$TRANSFORMER_FILE" ]; then + echo "Loading transformer data..." + COUCHDB_URL="http://localhost:5984" \ + python3 /couchdb/init_asset_data.py \ + --data-file "$TRANSFORMER_FILE" \ + --db "${TRANSFORMER_DBNAME:-transformer}" \ + --drop +else + echo "⚠️ $TRANSFORMER_FILE not found, skipping transformer data." +fi + echo "✅ All databases initialised." tail -f /dev/null diff --git a/src/couchdb/docker-compose.yaml b/src/couchdb/docker-compose.yaml index 9ff1443bb..49119b95a 100644 --- a/src/couchdb/docker-compose.yaml +++ b/src/couchdb/docker-compose.yaml @@ -7,6 +7,7 @@ services: IOT_DBNAME: chiller WO_DBNAME: workorder VIBRATION_DBNAME: vibration + TRANSFORMER_DBNAME: transformer ports: - "5984:5984" volumes: diff --git a/src/couchdb/sample_data/iot/bulk_docs_transformer.json b/src/couchdb/sample_data/iot/bulk_docs_transformer.json new file mode 100644 index 000000000..5765f5585 --- /dev/null +++ b/src/couchdb/sample_data/iot/bulk_docs_transformer.json @@ -0,0 +1,172 @@ +[ + { + "asset_id": "Transformer_01", + "timestamp": "2024-01-15T00:00:00.000000", + "hydrogen": 2845, + "oxygen": 5860, + "nitrogen": 27842, + "methane": 7406, + "co": 32, + "co2": 1344, + "ethylene": 16684, + "ethane": 5467, + "acetylene": 7, + "dbds": 19, + "power_factor": 1, + "interfacial_v": 45, + "dielectric_rigidity": 55, + "water_content": 0, + "vl1": 110, + "vl2": 115, + "vl3": 108, + "il1": 100, + "il2": 105, + "il3": 95, + "vl12": 225, + "vl23": 220, + "vl31": 218, + "inut": 5, + "rated_mva": 100, + "wti": 80, + "oti": 85, + "ati": 78, + "oti_a": 2, + "oti_t": 1 + }, + { + "asset_id": "Transformer_01", + "timestamp": "2024-01-16T00:00:00.000000", + "hydrogen": 2950, + "oxygen": 5700, + "nitrogen": 28000, + "methane": 7200, + "co": 30, + "co2": 1300, + "ethylene": 16500, + "ethane": 5400, + "acetylene": 6, + "dbds": 18, + "power_factor": 1.2, + "interfacial_v": 44, + "dielectric_rigidity": 53, + "water_content": 1, + "vl1": 112, + "vl2": 114, + "vl3": 109, + "il1": 102, + "il2": 103, + "il3": 96, + "vl12": 226, + "vl23": 221, + "vl31": 219, + "inut": 6, + "rated_mva": 100, + "wti": 82, + "oti": 87, + "ati": 79, + "oti_a": 2, + "oti_t": 1 + }, + { + "asset_id": "Transformer_01", + "timestamp": "2024-01-17T00:00:00.000000", + "hydrogen": 2800, + "oxygen": 5900, + "nitrogen": 27700, + "methane": 7300, + "co": 35, + "co2": 1350, + "ethylene": 16700, + "ethane": 5500, + "acetylene": 8, + "dbds": 20, + "power_factor": 0.9, + "interfacial_v": 46, + "dielectric_rigidity": 56, + "water_content": 0, + "vl1": 109, + "vl2": 116, + "vl3": 107, + "il1": 101, + "il2": 104, + "il3": 94, + "vl12": 224, + "vl23": 219, + "vl31": 217, + "inut": 5, + "rated_mva": 100, + "wti": 79, + "oti": 84, + "ati": 77, + "oti_a": 1, + "oti_t": 1 + }, + { + "asset_id": "Transformer_01", + "timestamp": "2024-01-18T00:00:00.000000", + "hydrogen": 2900, + "oxygen": 5800, + "nitrogen": 27950, + "methane": 7350, + "co": 33, + "co2": 1325, + "ethylene": 16600, + "ethane": 5450, + "acetylene": 7, + "dbds": 19, + "power_factor": 1.1, + "interfacial_v": 45, + "dielectric_rigidity": 54, + "water_content": 1, + "vl1": 111, + "vl2": 115, + "vl3": 108, + "il1": 100, + "il2": 106, + "il3": 95, + "vl12": 225, + "vl23": 220, + "vl31": 218, + "inut": 5, + "rated_mva": 100, + "wti": 81, + "oti": 86, + "ati": 78, + "oti_a": 2, + "oti_t": 1 + }, + { + "asset_id": "Transformer_01", + "timestamp": "2024-01-19T00:00:00.000000", + "hydrogen": 2850, + "oxygen": 5850, + "nitrogen": 27850, + "methane": 7400, + "co": 32, + "co2": 1340, + "ethylene": 16650, + "ethane": 5470, + "acetylene": 7, + "dbds": 19, + "power_factor": 1, + "interfacial_v": 45, + "dielectric_rigidity": 55, + "water_content": 0, + "vl1": 110, + "vl2": 115, + "vl3": 108, + "il1": 100, + "il2": 105, + "il3": 95, + "vl12": 225, + "vl23": 220, + "vl31": 218, + "inut": 5, + "rated_mva": 100, + "wti": 80, + "oti": 85, + "ati": 78, + "oti_a": 2, + "oti_t": 1 + } +] \ No newline at end of file From 618e2a64e244cd3bcb5004b5e51de2b10de97b6b Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Wed, 1 Apr 2026 13:32:22 -0400 Subject: [PATCH 05/29] added mocks and docstrings --- .../iot/bulk_docs_transformer.json | 10 +-- src/servers/fmsr/main.py | 67 +++++++++++++++++-- src/servers/fmsr/prompt_templates.py | 2 + src/servers/fmsr/tests/conftest.py | 59 ++++++++++++++++ src/servers/fmsr/tests/test_tools.py | 4 ++ 5 files changed, 133 insertions(+), 9 deletions(-) diff --git a/src/couchdb/sample_data/iot/bulk_docs_transformer.json b/src/couchdb/sample_data/iot/bulk_docs_transformer.json index 5765f5585..871fb1dae 100644 --- a/src/couchdb/sample_data/iot/bulk_docs_transformer.json +++ b/src/couchdb/sample_data/iot/bulk_docs_transformer.json @@ -1,6 +1,6 @@ [ { - "asset_id": "Transformer_01", + "asset_id": "Transformer 1", "timestamp": "2024-01-15T00:00:00.000000", "hydrogen": 2845, "oxygen": 5860, @@ -34,7 +34,7 @@ "oti_t": 1 }, { - "asset_id": "Transformer_01", + "asset_id": "Transformer 1", "timestamp": "2024-01-16T00:00:00.000000", "hydrogen": 2950, "oxygen": 5700, @@ -68,7 +68,7 @@ "oti_t": 1 }, { - "asset_id": "Transformer_01", + "asset_id": "Transformer 1", "timestamp": "2024-01-17T00:00:00.000000", "hydrogen": 2800, "oxygen": 5900, @@ -102,7 +102,7 @@ "oti_t": 1 }, { - "asset_id": "Transformer_01", + "asset_id": "Transformer 1", "timestamp": "2024-01-18T00:00:00.000000", "hydrogen": 2900, "oxygen": 5800, @@ -136,7 +136,7 @@ "oti_t": 1 }, { - "asset_id": "Transformer_01", + "asset_id": "Transformer 1", "timestamp": "2024-01-19T00:00:00.000000", "hydrogen": 2850, "oxygen": 5850, diff --git a/src/servers/fmsr/main.py b/src/servers/fmsr/main.py index 3f7b044d0..1db6befe3 100644 --- a/src/servers/fmsr/main.py +++ b/src/servers/fmsr/main.py @@ -486,7 +486,22 @@ def interpret_dga( ethylene: float, ethane: float, ) -> Union[DGAInterpretationResult, ErrorResult]: - + """Interprets dissolved gas analysis (DGA) readings for a transformer + using the IEC 60599 Rogers Ratio method to classify the fault type. + + Args: + asset_name: Name of the transformer asset (e.g. 'Transformer 1'). + hydrogen: Dissolved hydrogen (H2) concentration in oil (ppm). + methane: Dissolved methane (CH4) concentration in oil (ppm). + acetylene: Dissolved acetylene (C2H2) concentration in oil (ppm). + ethylene: Dissolved ethylene (C2H4) concentration in oil (ppm). + ethane: Dissolved ethane (C2H6) concentration in oil (ppm). + + Returns: + DGAInterpretationResult with fault type, Rogers Ratios, IEC code + combination, confidence, reasoning, and recommended action. + ErrorResult if the LLM is unavailable or all retries fail. + """ if not asset_name: return ErrorResult(error="asset_name is required") @@ -513,7 +528,24 @@ def assess_winding_temperature( oti_a: int, oti_t: int, ) -> Union[WindingTemperatureResult, ErrorResult]: - + """Assesses the thermal condition of a transformer winding using the + IEC 60076-7 thermal model. Computes hot-spot rise, insulation ageing + rate, and thermal risk level. + + Args: + asset_name: Name of the transformer asset (e.g. 'Transformer 1'). + wti: Winding Temperature Indicator reading (degrees C). + oti: Oil Temperature Indicator reading (degrees C). + ati: Ambient Temperature Indicator reading (degrees C). + oti_a: Oil Temperature Alarm flag (0 or 1). + oti_t: Oil Temperature Trip flag (0 or 1). + + Returns: + WindingTemperatureResult with thermal status, hot-spot rise, ageing + rate, alarm and trip flag status, risk level, reasoning, and + recommended action. + ErrorResult if the LLM is unavailable or all retries fail. + """ if not asset_name: return ErrorResult(error="asset_name is required") @@ -546,7 +578,29 @@ def assess_load_profile( inut: float, rated_mva: float, ) -> Union[LoadProfileResult, ErrorResult]: - + """Assesses the electrical loading condition of a transformer using + IEC 60076-7 guidelines. + + Args: + asset_name: Name of the transformer asset (e.g. 'Transformer 1'). + vl1: Phase 1 line-to-neutral voltage (V). + vl2: Phase 2 line-to-neutral voltage (V). + vl3: Phase 3 line-to-neutral voltage (V). + il1: Phase 1 line current (A). + il2: Phase 2 line current (A). + il3: Phase 3 line current (A). + vl12: Line-to-line voltage between Phase 1 and Phase 2 (V). + vl23: Line-to-line voltage between Phase 2 and Phase 3 (V). + vl31: Line-to-line voltage between Phase 3 and Phase 1 (V). + inut: Neutral current (A). + rated_mva: Transformer rated capacity (MVA). + + Returns: + LoadProfileResult with derived load MVA, load factor percentage, + loading status, current imbalance percentage, neutral current flag, + reasoning, and recommended action. + ErrorResult if the LLM is unavailable or all retries fail. + """ if not asset_name: return ErrorResult(error="asset_name is required") @@ -595,7 +649,12 @@ def predict_health_index( dielectric_rigidity: float, water_content: float, ) -> Union[HealthIndexResult, ErrorResult]: - """Predicts a health index for a transformer asset based on DGA and other sensor readings.""" + """Predicts a health index for a transformer asset based on DGA and other sensor readings. + + Returns: + HealthIndexResult with a health index score (0-100) and condition category. + ErrorResult if the LLM is unavailable or all retries fail. + """ if not asset_name: return ErrorResult(error="asset_name is required") diff --git a/src/servers/fmsr/prompt_templates.py b/src/servers/fmsr/prompt_templates.py index a10cfa9b2..8b934ce65 100644 --- a/src/servers/fmsr/prompt_templates.py +++ b/src/servers/fmsr/prompt_templates.py @@ -1,3 +1,5 @@ +"""Prompt templates for transformer diagnostics and assessment.""" + _INTERPRET_DGA_PROMPT = ( "You are a transformer diagnostic expert. Analyse the following " "dissolved gas analysis (DGA) readings for asset {asset_name} " diff --git a/src/servers/fmsr/tests/conftest.py b/src/servers/fmsr/tests/conftest.py index 4a1959c69..a60ab8deb 100644 --- a/src/servers/fmsr/tests/conftest.py +++ b/src/servers/fmsr/tests/conftest.py @@ -41,3 +41,62 @@ def mock_asset2fm_chain(): with patch("servers.fmsr.main._call_asset2fm", mock): with patch("servers.fmsr.main._llm_available", True): yield mock + + +@pytest.fixture +def mock_dga_chain(): + """Patch _call_dga to return a fixed DGAInterpretationResult.""" + mock = MagicMock( + return_value={ + "fault_type": "Partial Discharge", + "r1": 0.1, + "r2": 0.2, + "r3": 0.3, + "code": "0.1,0.2,0.3", + "confidence": "High", + "reasoning": "Based on gas ratios", + "recommended_action": "Inspect insulation", + } + ) + with patch("servers.fmsr.main._call_dga", mock): + with patch("servers.fmsr.main._llm_available", True): + yield mock + + +@pytest.fixture +def mock_winding_chain(): + """Patch _call_winding to return a fixed WindingTemperatureResult.""" + mock = MagicMock( + return_value={ + "thermal_status": "Normal", + "hot_spot_rise_c": 45.0, + "ageing_rate": 1.0, + "alarm_active": False, + "trip_active": False, + "risk_level": "Low", + "reasoning": "Within limits", + "recommended_action": "None", + } + ) + with patch("servers.fmsr.main._call_winding", mock): + with patch("servers.fmsr.main._llm_available", True): + yield mock + + +@pytest.fixture +def mock_load_chain(): + """Patch _call_load to return a fixed LoadProfileResult.""" + mock = MagicMock( + return_value={ + "load_mva": 50.0, + "load_factor_pct": 80.0, + "loading_status": "Normal", + "current_imbalance_pct": 3.0, + "neutral_current_flag": False, + "reasoning": "Balanced load", + "recommended_action": "None", + } + ) + with patch("servers.fmsr.main._call_load", mock): + with patch("servers.fmsr.main._llm_available", True): + yield mock \ No newline at end of file diff --git a/src/servers/fmsr/tests/test_tools.py b/src/servers/fmsr/tests/test_tools.py index 17d2fc4c9..317cf5c8c 100644 --- a/src/servers/fmsr/tests/test_tools.py +++ b/src/servers/fmsr/tests/test_tools.py @@ -179,6 +179,8 @@ async def test_parse_llm_response(self, mock_dga_chain): }) assert "fault_type" in data assert isinstance(data["r1"], float) + assert isinstance(data["r2"], float) + assert isinstance(data["r3"], float) assert isinstance(data["confidence"], str) mock_dga_chain.assert_called_once() @@ -235,6 +237,7 @@ async def test_parse_llm_response(self, mock_winding_chain): assert "thermal_status" in data assert isinstance(data["ageing_rate"], float) assert isinstance(data["alarm_active"], bool) + assert isinstance(data["trip_active"], bool) mock_winding_chain.assert_called_once() @requires_watsonx @@ -289,6 +292,7 @@ async def test_parse_llm_response(self, mock_load_chain): }) assert "load_mva" in data assert isinstance(data["load_factor_pct"], float) + assert isinstance(data["current_imbalance_pct"], float) assert isinstance(data["neutral_current_flag"], bool) mock_load_chain.assert_called_once() From a0597462cf2351c8b1085b1022681efdb7f8e8da Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Thu, 2 Apr 2026 21:48:50 -0400 Subject: [PATCH 06/29] feat: implement scenario generator with --log, structured error handling, and terminal output refinements --- .gitignore | 4 + pyproject.toml | 2 + src/scenarios/generator.py | 460 +++++++++++++++++++++++++++++++++++++ src/scenarios/models.py | 41 ++++ src/scenarios/prompts.py | 166 +++++++++++++ src/scenarios/utils.py | 168 ++++++++++++++ uv.lock | 259 +++++++++++++++++++++ 7 files changed, 1100 insertions(+) create mode 100644 src/scenarios/generator.py create mode 100644 src/scenarios/models.py create mode 100644 src/scenarios/prompts.py create mode 100644 src/scenarios/utils.py diff --git a/.gitignore b/.gitignore index c04e9b60f..9b2248037 100644 --- a/.gitignore +++ b/.gitignore @@ -201,3 +201,7 @@ mcp/couchdb/sample_data/bulk_docs.json .env mcp/servers/tsfm/artifacts/tsfm_models/ src/tmp/ + +# ignore generated scenarios +generated_scenarios.json +logs/ \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 496f9499a..5de94beaa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,8 @@ dependencies = [ "python-dotenv>=1.0", "scipy>=1.10.0", "scikit-learn>=1.8.0", + "datasets>=4.8.4", + "pypdf>=6.9.2", ] [project.scripts] diff --git a/src/scenarios/generator.py b/src/scenarios/generator.py new file mode 100644 index 000000000..e1fb63f90 --- /dev/null +++ b/src/scenarios/generator.py @@ -0,0 +1,460 @@ +import json +import logging +import asyncio +import os +import sys +import argparse +from typing import Any +from datetime import datetime + +from dotenv import load_dotenv + +from .models import AssetProfile, Scenario, ScenarioBudget +from .utils import fetch_arxiv_studies, fetch_hf_fewshot +from .prompts import ( + PROFILE_BUILDER_PROMPT, + SCENARIO_GENERATOR_PROMPT, + VALIDATE_REPAIR_PROMPT, + MULTIAGENT_COMBINER_PROMPT, + RESEARCH_QUERY_GENERATOR_PROMPT, + BUDGET_ALLOCATOR_PROMPT +) + +# Reuse existing llm setup +from llm.litellm import LiteLLMBackend +from workflow.executor import Executor +from workflow.cli import _DEFAULT_MODEL + +_log = logging.getLogger(__name__) + +def _parse_llm_json(raw: str) -> tuple[Any, str | None]: + """Helper to parse raw text response containing JSON. Returns (parsed_obj, error_msg).""" + text = raw.strip() + if text.startswith("```"): + lines = text.splitlines() + inner = lines[1:-1] if lines[-1].strip() == "```" else lines[1:] + text = "\n".join(inner) + if text.lower().startswith("json"): + text = text[4:] + + text = text.strip() + try: + return json.loads(text), None + except json.JSONDecodeError as e: + # Fallback to finding first brace/bracket + start_obj = text.find("{") + start_arr = text.find("[") + if start_obj == -1 and start_arr == -1: + return None, f"No JSON start character found. Error: {str(e)}" + + start = start_obj if (start_arr == -1 or (start_obj != -1 and start_obj < start_arr)) else start_arr + end_char = "}" if start == start_obj else "]" + end = text.rfind(end_char) + 1 + + if start != -1 and end > start: + try: + return json.loads(text[start:end]), None + except json.JSONDecodeError as e2: + return None, f"Failed to parse inner JSON block. Error: {str(e2)}" + return None, "Unknown parsing error." + +def _print_section(title: str) -> None: + print(f"\n{'─' * 60}") + print(f" {title}") + print(f"{'─' * 60}") + +def _print_step(phase: str, info: str, details: str = None, tool_info: str = None): + print(f" [OK ] Step ({phase}): {info}") + if tool_info: + print(f" {tool_info}") + if details: + indented = "\n".join(" " + line for line in details.splitlines()) # 8 spaces + print(indented) + +def _format_diff(scenario_id: str, old: dict, new: dict) -> str: + """Format a visual diff of changed fields between two scenario dicts.""" + lines = [f" [VALIDATED] Scenario: {scenario_id}"] + for key in set(old.keys()) | set(new.keys()): + if old.get(key) != new.get(key): + v_old = json.dumps(old.get(key)) + v_new = json.dumps(new.get(key)) + # Truncate long values for readability + if len(v_old) > 60: v_old = v_old[:57] + "..." + if len(v_new) > 60: v_new = v_new[:57] + "..." + + lines.append(f" {key}: {v_old}") + lines.append(f" ↓") + lines.append(f" {v_new}") + return "\n".join(lines) + +class ScenarioGeneratorAgent: + def __init__(self, model_id: str = _DEFAULT_MODEL, show_workflow: bool = False, log_dir: str = None): + self.llm = LiteLLMBackend(model_id=model_id) + # We instantiate standard Executor just to get server descriptions easily + self.executor = Executor(llm=self.llm) + self.show_workflow = show_workflow + self.log_dir = log_dir + self._log_step = 1 + + def _write_log(self, name: str, content: str): + if not self.log_dir: + return + os.makedirs(self.log_dir, exist_ok=True) + path = os.path.join(self.log_dir, f"{self._log_step:02d}_{name}.txt") + with open(path, "w") as f: + f.write(content) + self._log_step += 1 + + def _handle_parse_failure(self, step_name: str, response: str, error_msg: str | None): + """Log and optionally print detailed failure information.""" + _log.warning(f"Failed to parse LLM response for '{step_name}'. Error: {error_msg}") + if self.show_workflow: + print(f" [ERR!] Step ({step_name}): LLM output parsing failed.") + print(f" Reason: {error_msg}") + if response: + print(f" Raw Response: {response}") + else: + print(f" Raw Response: ") + + async def run(self, asset_name: str, num_scenarios: int = 50) -> list[Scenario]: + _log.info(f"Starting scenario generation for asset: {asset_name}") + + server_desc = await self.executor.get_server_descriptions() + + # 1. Build Asset Profile + if self.show_workflow: + _print_section("Phase 1: Asset Profile Construction") + asset_profile = await self.build_asset_profile(asset_name, server_desc) + + # 2. Budget Allocation + if self.show_workflow: + _print_section("Phase 2: Scenario Budget Allocation") + budget = await self.allocate_budget(asset_profile, total=num_scenarios) + + if self.show_workflow: + _print_section("Phase 3: Individual Agent - Generation & Validation") + + # 3, 4. Subagent generation + Validation + all_scenarios = [] + for subagent, count in budget.allocation.items(): + if count == 0: + continue + + if subagent == "multiagent": + continue + + if self.show_workflow: + _print_section(f"{subagent.upper()} Agent") + + _log.info(f"Generating {count} scenarios for subagent: {subagent}") + + if self.show_workflow: + ds_query = f"HuggingFace dataset 'ibm-research/AssetOpsBench' target_type={subagent}" + _print_step(f"generate_{subagent}", f"Generating {count} scenarios for subagent: {subagent}", tool_info=f"src: {ds_query}") + + scenarios = self.generate_single_agent_scenarios(subagent, count, asset_profile, server_desc) + + _log.info(f"Validating {count} scenarios for subagent: {subagent}") + valid_scenarios = self.validate_and_repair(scenarios, asset_profile) + + # Identify changes for logging + changed_indices = [] + if len(scenarios) == len(valid_scenarios): + for i, (s1, s2) in enumerate(zip(scenarios, valid_scenarios)): + if json.dumps(s1, sort_keys=True) != json.dumps(s2, sort_keys=True): + changed_indices.append(i) + else: + # If counts differ, we consider them all potentially changed or just a major structural shift + _log.warning(f"Scenario count mismatch after validation: {len(scenarios)} -> {len(valid_scenarios)}") + + subagent_generated = [] + diff_logs = [] + for i, s in enumerate(valid_scenarios): + s['type'] = subagent + s['id'] = f"{asset_name.replace(' ', '_').lower()}_{subagent}_{len(all_scenarios)+1:02d}" + + # Collect diff for logging if it changed + if i in changed_indices: + diff_logs.append(_format_diff(s['id'], scenarios[i], s)) + + try: + all_scenarios.append(Scenario(**s)) + subagent_generated.append(s) + except Exception as e: + _log.warning(f"Skipping incorrectly formatted scenario dict: {s} - Error: {e}") + + if diff_logs: + self._write_log(f"{subagent}_validation_changes", "\n\n".join(diff_logs)) + + if self.show_workflow: + _print_step(f"validate_{subagent}", f"Validated {len(subagent_generated)} scenarios (Made {len(changed_indices)} validation changes)") + + # 5. Multiagent Combiner + multiagent_count = budget.allocation.get("multiagent", 0) + if multiagent_count > 0: + if self.show_workflow: + _print_section("Phase 4: Multi-Agent Scenario Construction") + _log.info(f"Generating {multiagent_count} multiagent scenarios") + single_dicts = [s.model_dump() for s in all_scenarios] + + if self.show_workflow: + _print_step("generate_multiagent", f"Combining existing scenarios into {multiagent_count} multiagent scenarios.") + + multi_scenarios = self.construct_multiagent_scenarios(multiagent_count, single_dicts, asset_profile, server_desc) + + _log.info(f"Validating multiagent scenarios") + valid_multi = self.validate_and_repair(multi_scenarios, asset_profile) + + changed_indices_multi = [] + if len(multi_scenarios) == len(valid_multi): + for i, (s1, s2) in enumerate(zip(multi_scenarios, valid_multi)): + if json.dumps(s1, sort_keys=True) != json.dumps(s2, sort_keys=True): + changed_indices_multi.append(i) + + multi_generated = [] + diff_logs_multi = [] + for i, s in enumerate(valid_multi): + s['type'] = "multiagent" + s['id'] = f"{asset_name.replace(' ', '_').lower()}_multiagent_{len(all_scenarios)+1:02d}" + + if i in changed_indices_multi: + diff_logs_multi.append(_format_diff(s['id'], multi_scenarios[i], s)) + + try: + all_scenarios.append(Scenario(**s)) + multi_generated.append(s) + except Exception as e: + _log.warning(f"Skipping incorrectly formatted multiagent scenario dict: {s} - Error: {e}") + + if diff_logs_multi: + self._write_log("multiagent_validation_changes", "\n\n".join(diff_logs_multi)) + + if self.show_workflow: + _print_step("validate_multiagent", f"Validated {len(multi_generated)} multiagent scenarios (Made {len(changed_indices_multi)} validation changes)") + + if self.show_workflow: + _print_section("Summary") + print(f"Successfully generated {len(all_scenarios)} total scenarios for asset: {asset_name}.\n") + + return all_scenarios + + async def build_asset_profile(self, asset_name: str, server_desc: dict) -> AssetProfile: + metadata = {} + + # 1.1 Generate targeted queries + query_prompt = RESEARCH_QUERY_GENERATOR_PROMPT.format(asset_name=asset_name) + self._write_log("research_queries_prompt", query_prompt) + if self.show_workflow: + _print_step("researcher_queries", f"Generating ArXiv search strategy for {asset_name}...") + + query_response = self.llm.generate(query_prompt) + self._write_log("research_queries_response", query_response) + queries, err = _parse_llm_json(query_response) + + if not queries or not isinstance(queries, list): + _log.warning(f"Failed to generate queries, falling back to simple asset name: {asset_name}") + queries = [f"{asset_name} maintenance sensors", f"{asset_name} failure modes reliability"] + + if self.show_workflow: + _print_step("arxiv_search_plan", f"Researcher generated {len(queries)} targeted queries", details=json.dumps(queries, indent=2)) + + # 1.2 Fetch studies using multi-query logic + studies = fetch_arxiv_studies(queries, metadata_out=metadata) + self._write_log("arxiv_results", studies) + + if self.show_workflow: + status_summary = ", ".join(f"HTTP {s}" for s in metadata.get('status_codes', [])) + pdf_urls = metadata.get('pdf_urls', []) + query_to_pdf = metadata.get('query_to_pdf', {}) + + details = f"Queries: {len(queries)}\nStatus: {status_summary}\nReturned: {metadata.get('returned_entries', 0)} unique entries" + if query_to_pdf: + details += "\n\nQuery Results:" + for q, urls in query_to_pdf.items(): + details += f"\n - Q: \"{q}\"" + for u in urls: + details += f"\n -> {u}" + elif pdf_urls: + # Fallback if the mapping isn't populated for some reason + details += "\nFetched PDFs:\n" + "\n".join(f" - {u}" for u in pdf_urls) + + _print_step("arxiv_search_result", f"ArXiv Research phase complete", details=details) + + tools_str = json.dumps(server_desc, indent=2) + + prompt = PROFILE_BUILDER_PROMPT.format( + asset_name=asset_name, + arxiv_literature=studies, + tool_descriptions=tools_str + ) + self._write_log("asset_profile_prompt", prompt) + + response = self.llm.generate(prompt) + self._write_log("asset_profile_response", response) + parsed, parse_err = _parse_llm_json(response) + + if not parsed or not isinstance(parsed, dict): + self._handle_parse_failure("build_profile", response, parse_err) + raise RuntimeError(f"Critical failure: Could not construct AssetProfile for '{asset_name}'.") + else: + profile = AssetProfile(**parsed) + + if self.show_workflow: + _print_step("build_profile", f"Successfully generated Asset Profile for '{asset_name}'.", profile.model_dump_json(indent=2)) + + self._write_log(f"asset_profile_{asset_name}_json", profile.model_dump_json(indent=2)) + return profile + + async def allocate_budget(self, profile: AssetProfile, total: int = 50) -> ScenarioBudget: + prompt = BUDGET_ALLOCATOR_PROMPT.format( + total_scenarios=total, + asset_profile_json=profile.model_dump_json() + ) + self._write_log("budget_allocation_prompt", prompt) + + response = self.llm.generate(prompt) + self._write_log("budget_allocation_response", response) + parsed, parse_err = _parse_llm_json(response) + + if not parsed or not isinstance(parsed, dict) or "allocation" not in parsed: + self._handle_parse_failure("allocate_budget", response, parse_err) + raise RuntimeError("Critical failure: Could not dynamically allocate scenario budget.") + else: + budget = ScenarioBudget( + total_scenarios=total, + allocation=parsed["allocation"], + reasoning=parsed.get("reasoning", "") + ) + + if self.show_workflow: + details = f"Reasoning: {budget.reasoning}\n\nAllocation:\n" + details += "\n".join(f" - {k}: {v}" for k, v in budget.allocation.items()) + _print_step("allocate_budget", f"Successfully allocated {total} scenarios across agents.", details=details) + + return budget + + def generate_single_agent_scenarios(self, subagent: str, count: int, profile: AssetProfile, server_desc: dict) -> list[dict]: + few_shots = fetch_hf_fewshot(split="scenarios", target_type=subagent, fallback_if_missing=True) + few_shots_str = json.dumps(few_shots[:2], indent=2) + + category_map = { + "iot": "Data Query, Knowledge Query", + "fmsr": "Knowledge Query", + "tsfm": "Knowledge Query, Anomaly Detection Query, Tuning Query, Inference Query, Complex Query", + "wo": "Decision Support, Prediction, Knowledge Query" + } + category_options = category_map.get(subagent.lower(), "Knowledge Query") + example_category = category_options.split(",")[0].strip() + + subagent_tools = json.dumps(server_desc.get(subagent, {}), indent=2) + + prompt = SCENARIO_GENERATOR_PROMPT.format( + count=count, + subagent_name=subagent, + asset_name=profile.asset_name, + asset_profile_json=profile.model_dump_json(), + tool_definitions=subagent_tools, + few_shot_examples=few_shots_str, + category_options=category_options, + example_category=example_category + ) + self._write_log(f"{subagent}_generation_prompt", prompt) + + response = self.llm.generate(prompt) + self._write_log(f"{subagent}_generation_response", response) + parsed, parse_err = _parse_llm_json(response) + + if isinstance(parsed, list): + return parsed + self._handle_parse_failure(f"generate_{subagent}", response, parse_err) + return [] + + def validate_and_repair(self, scenarios: list[dict], profile: AssetProfile) -> list[dict]: + if not scenarios: + return [] + + prompt = VALIDATE_REPAIR_PROMPT.format( + asset_profile_json=profile.model_dump_json(), + input_scenarios_json=json.dumps(scenarios, indent=2) + ) + self._write_log("validate_repair_prompt", prompt) + + response = self.llm.generate(prompt) + self._write_log("validate_repair_response", response) + parsed, parse_err = _parse_llm_json(response) + + if isinstance(parsed, list): + return parsed + self._handle_parse_failure("validate_repair", response, parse_err) + return scenarios + + def construct_multiagent_scenarios(self, count: int, single_agents: list[dict], profile: AssetProfile, server_desc: dict) -> list[dict]: + all_tools = json.dumps(server_desc, indent=2) + + prompt = MULTIAGENT_COMBINER_PROMPT.format( + count=count, + asset_name=profile.asset_name, + asset_profile_json=profile.model_dump_json(), + mcp_function_definitions=all_tools, + single_agent_scenarios_json=json.dumps(single_agents[:10], indent=2) + ) + self._write_log("multiagent_combiner_prompt", prompt) + + response = self.llm.generate(prompt) + self._write_log("multiagent_combiner_response", response) + parsed, parse_err = _parse_llm_json(response) + + if isinstance(parsed, list): + return parsed + self._handle_parse_failure("multiagent_combiner", response, parse_err) + return [] + +def main(): + load_dotenv() + + parser = argparse.ArgumentParser(description="Scenario Generator for AssetOpsBench") + parser.add_argument("asset_name", help="Name of the asset (e.g. 'Chiller' or 'Wind Turbine')") + parser.add_argument("--model-id", default=_DEFAULT_MODEL, help="Model ID for LiteLLM") + parser.add_argument("--output", default="generated_scenarios.json", help="Path to output JSON file") + parser.add_argument("--num-scenarios", type=int, default=50, help="Total number of scenarios to generate") + parser.add_argument("--show-workflow", action="store_true", help="Show intermediate pipeline steps in the console") + parser.add_argument("--log", action="store_true", help="Dump raw prompts and results to a log directory") + + args = parser.parse_args() + + # We reduce the noise in generic logger when we are controlling console formatting ourselves + level = logging.WARNING if args.show_workflow else logging.INFO + logging.basicConfig(level=level, format="%(asctime)s %(levelname)s %(message)s") + + log_dir = None + if args.log: + timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + log_dir = f"logs/gen_{args.asset_name.lower().replace(' ', '_')}_{timestamp}" + print(f"Logging session to: {log_dir}") + os.makedirs(log_dir, exist_ok=True) + + agent = ScenarioGeneratorAgent(model_id=args.model_id, show_workflow=args.show_workflow, log_dir=log_dir) + + try: + final_scenarios = asyncio.run(agent.run(args.asset_name, num_scenarios=args.num_scenarios)) + except (RuntimeError, Exception) as e: + print(f"\n[FATAL ERROR] {e}") + sys.exit(1) + + # Check if we actually generated anything (for the final summary) + if not final_scenarios: + print("\n[WARNING] No scenarios were successfully generated and validated.") + sys.exit(0) # Not necessarily a crash, but we didn't get results + + with open(args.output, "w") as f: + json.dump([s.to_dict() for s in final_scenarios], f, indent=2) + + # No explicit redundant success print if we already printed a summary in show-workflow + if not args.show_workflow: + print(f"Success! Generated {len(final_scenarios)} scenarios at {args.output}") + else: + print(f"Scenarios saved to {args.output}") + +if __name__ == "__main__": + main() + diff --git a/src/scenarios/models.py b/src/scenarios/models.py new file mode 100644 index 000000000..05675bb7b --- /dev/null +++ b/src/scenarios/models.py @@ -0,0 +1,41 @@ +from typing import Any +from pydantic import BaseModel, Field + + +class AssetProfile(BaseModel): + asset_name: str + description: str + sensor_mappings: dict[str, str] = Field(default_factory=dict) + known_failure_modes: list[str] = Field(default_factory=list) + relevant_tools: dict[str, list[dict]] = Field(default_factory=dict) + iso_standards: list[str] = Field(default_factory=list) + + +class ScenarioBudget(BaseModel): + total_scenarios: int = 50 + allocation: dict[str, int] = Field(default_factory=dict) + reasoning: str = "" + + def __init__(self, **data): + super().__init__(**data) + if not self.allocation: + # Equal distribution as a default + types = ["iot", "fmsr", "tsfm", "wo", "multiagent"] + per_type = self.total_scenarios // len(types) + remainder = self.total_scenarios % len(types) + + self.allocation = {t: per_type for t in types} + # Add remainder to first type + if remainder > 0: + self.allocation[types[0]] += remainder + + +class Scenario(BaseModel): + id: str + type: str # e.g., iot, fmsr, wo, multiagent + text: str + category: str + characteristic_form: str + + def to_dict(self) -> dict[str, Any]: + return self.model_dump() diff --git a/src/scenarios/prompts.py b/src/scenarios/prompts.py new file mode 100644 index 000000000..7e0b205bc --- /dev/null +++ b/src/scenarios/prompts.py @@ -0,0 +1,166 @@ +PROFILE_BUILDER_PROMPT = """\ +You are an expert Reliability Engineer preparing an Asset Profile. + +Given the Asset Name, some recent literature/studies from ArXiv, the available subagents and their tools, and generic knowledge of ISO 55000 / ISO 14224 terms, create an Asset Profile in JSON format. + +Asset Name: {asset_name} + +Recent ArXiv Literature: +{arxiv_literature} + +Available Subagent Tools: +{tool_descriptions} + +Task: +Produce a JSON matching the following schema exactly. +CRITICAL: Output ONLY the raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +{{ + "asset_name": "{asset_name}", + "description": "Short summary of the asset (1-2 sentences).", + "sensor_mappings": {{"sensor_name": "description of what it measures"}}, + "known_failure_modes": ["failure mode 1", "failure mode 2"], + "relevant_tools": {{"iot": [{{"name": "tool_name", "reason": "why we might use it for this asset"}}]}}, + "iso_standards": ["list 2-3 relevant ISO standards or engineering conventions"] +}} +""" + +SCENARIO_GENERATOR_PROMPT = """\ +You are an advanced Scenario Architect for AssetOps Bench. +We need you to generate {count} evaluation scenarios specifically tailored for the '{subagent_name}' subagent, focused on the asset: {asset_name}. + +Asset Profile Details: +{asset_profile_json} + +Available Subagent Tools (these are ALL the available tools for this subagent, but you MUST prioritize the tools explicitly mentioned in the Asset Profile's "relevant_tools" section): +{tool_definitions} + +Here are some Few-Shot examples from our benchmark dataset (for style and tone reference): +{few_shot_examples} + +Constraints: +1. Emphasize Reasoning and Tool Use: Scenarios should require the agent to perform domain-specific reasoning based on the available tools. +2. Emphasize Data Handling and Forecasting where applicable. +3. Every scenario must be highly specific, having a clear 'text' (the query to the agent), a 'category' (e.g. Knowledge Query, Data Query, Analytical Query), and a 'characteristic_form' (explaining in natural language what the agent should do to answer the query correctly). + +Task: Generate a JSON array of {count} scenarios. +CRITICAL: Output ONLY the raw JSON array. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +Format exactly (raw JSON only): +[ + {{ + "text": "What IoT sites are available for the {asset_name}?", + "category": "{example_category}", + "characteristic_form": "The expected response should be the return value of all sites, either as text or as a reference to a tool call." + }} +] +""" + +VALIDATE_REPAIR_PROMPT = """\ +You are the Validator and Repair agent for the AssetOps Bench scenario generator. + +You are given a list of JSON scenarios and the corresponding Asset Profile. +Your job is to strictly validate and repair them based on: +1. Do they query realistic tools/data from the available toolset in the profile? +2. Do they fit exactly the JSON schema (text, category, characteristic_form)? +3. Does the characteristic_form accurately articulate what the ideal response/agent flow should look like? + +Asset Profile: +{asset_profile_json} + +Input Scenarios: +{input_scenarios_json} + +Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. +CRITICAL: Do not include any explanation, markdown formatting, or Python code. Output MUST be raw JSON text only. +""" + +MULTIAGENT_COMBINER_PROMPT = """\ +You are the Multiagent Scenario Combiner. +You generate complex multi-agent workflows that span across multiple subagents (e.g. IoT + WO + TSFM). +We need {count} multi-agent scenarios for {asset_name}. + +Asset Profile: +{asset_profile_json} + +Available MCP Function Definitions (these are ALL the tools across all subagents, but you MUST prioritize the tools explicitly mentioned in the Asset Profile's "relevant_tools" section): +{mcp_function_definitions} + +Here are some valid single-agent scenarios we generated earlier: +{single_agent_scenarios_json} + +Task: Use these single-agent pieces to construct cohesive multi-agent scenarios. A multiagent scenario tests Agent Communication and Coordination, Workflow Orchestration, and Decision-Making. +For instance, detecting an anomaly using IoT, confirming a historical failure with FMSR or TSFM, and creating a work order using WO. + +Return ONLY a JSON array of length {count}. +CRITICAL: Do NOT include markdown code blocks, Python code, or any conversational preamble. + +[ + {{ + "text": "Detect a temperature anomaly on the chiller, verify its past occurrences, and schedule a work order.", + "category": "Knowledge Query", + "characteristic_form": "The expected response should involve first utilizing the IoT tool to confirm the anomaly, then querying the WO tool to fetch history, before finalizing a work order creation." + }} +] +""" + +RESEARCH_QUERY_GENERATOR_PROMPT = """\ +You are a Technical Researcher for AssetOps. + +Given an Asset Name, generate exactly 3 high-quality academic search queries for ArXiv. + +IMPORTANT: +- First, convert the asset into its **canonical academic term** (e.g., "smart grid transformer" → "power transformer"). +- Use terminology commonly found in engineering research papers, NOT operational phrasing. + +Focus Areas: +1. Condition monitoring and diagnostics (use terms like "condition monitoring", "diagnostics", "measurement"). +2. Faults and failures (use terms like "fault diagnosis", "failure analysis", "failure mechanisms"). +3. Reliability and prognostics (use terms like "reliability", "prognostics", "degradation modeling"). + +Constraints: +- Keep queries SHORT (3–6 keywords max). +- Do NOT include too many AND/OR operators. +- Avoid generic words like "sensor", "maintenance" unless paired with academic terms. +- Prefer specific technical phrases (e.g., "dissolved gas analysis", "partial discharge"). + +Asset Name: {asset_name} + +Output ONLY a JSON array of 3 strings. +CRITICAL: Do NOT include markdown code blocks, Python code, or any conversational preamble. +""" + +BUDGET_ALLOCATOR_PROMPT = """\ +You are an expert Scenario Strategy Consultant for AssetOps Bench. + +Given an Asset Profile (derived from technical literature) and a total number of scenarios to generate ({{total_scenarios}}), your task is to allocate this budget across the following five categories: +1. iot: Focusing on sensor data and basic telemetry. +2. fmsr: Focusing on failure modes and structural reliability. +3. tsfm: Focusing on time-series analysis and technical maintenance. +4. wo: Focusing on actual maintenance execution and work orders. +5. multiagent: Complex, multi-stage workflows involving orchestration of multiple agents. + +Asset Profile: +{asset_profile_json} + +Allocation Strategy: +- Prioritize agents that have more "relevant_tools" or "known_failure_modes" in the profile. +- If the asset mentions complex standards (ISO 14224, etc.), lean towards analytical categories (tsfm, fmsr). +- It is perfectly acceptable for a category to have 0 scenarios if the Asset Profile doesn't warrant it. +- Cap "multiagent" at a maximum of 50% of the total budget (e.g., max 25 if total is 50). +- The sum of all allocations MUST exactly equal {total_scenarios}. + +Output Format: +CRITICAL: Return ONLY a raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +{{ + "reasoning": "A brief explanation of why you chose this distribution based on the asset details.", + "allocation": {{ + "iot": int, + "fmsr": int, + "tsfm": int, + "wo": int, + "multiagent": int + }} +}} +""" diff --git a/src/scenarios/utils.py b/src/scenarios/utils.py new file mode 100644 index 000000000..12fbe160f --- /dev/null +++ b/src/scenarios/utils.py @@ -0,0 +1,168 @@ +import urllib.request +import urllib.parse +import xml.etree.ElementTree as ET +import logging + +_log = logging.getLogger(__name__) + +def fetch_arxiv_studies(search_queries: str | list[str], max_results_per_query: int = 2, metadata_out: dict = None) -> str: + """Fetch relevant studies from ArXiv using their public API. + + If search_queries is a list, it will execute each search and combine unique results. + """ + import time + import ssl + + if isinstance(search_queries, str): + queries = [search_queries] + else: + queries = search_queries + + base_url = "http://export.arxiv.org/api/query?" + headers = {'User-Agent': 'AssetOpsBench/1.0 (mailto:admin@example.com)'} + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + + if metadata_out is not None: + metadata_out['queries'] = queries + metadata_out['status_codes'] = [] + metadata_out['returned_entries'] = 0 + metadata_out['pdf_urls'] = [] + metadata_out['query_to_pdf'] = {} + + seen_ids = set() + studies_text = [] + + for i, q in enumerate(queries): + # Respect ArXiv 3-second rule if doing multiple queries + if i > 0: + time.sleep(3.1) + + safe_query = urllib.parse.quote(q) + url = f"{base_url}search_query={safe_query}&start=0&max_results={max_results_per_query}" + + try: + req = urllib.request.Request(url, headers=headers) + with urllib.request.urlopen(req, timeout=10, context=ctx) as response: + status = response.getcode() + if metadata_out is not None: + metadata_out['status_codes'].append(status) + data = response.read() + + root = ET.fromstring(data) + ns = {'atom': 'http://www.w3.org/2005/Atom'} + + for entry in root.findall('atom:entry', ns): + arxiv_id = entry.find('atom:id', ns).text + if arxiv_id in seen_ids: + continue + seen_ids.add(arxiv_id) + + title = entry.find('atom:title', ns) + summary = entry.find('atom:summary', ns) + + t_text = title.text.strip().replace('\n', ' ') if title is not None else "No Title" + s_text = summary.text.strip().replace('\n', ' ') if summary is not None else "No Summary" + + pdf_url = None + for link in entry.findall('atom:link', ns): + if link.attrib.get('title') == 'pdf' or link.attrib.get('type') == 'application/pdf': + pdf_url = link.attrib.get('href') + if pdf_url and not pdf_url.endswith('.pdf'): + pdf_url += '.pdf' + break + + pdf_text = "" + if pdf_url: + try: + import io + from pypdf import PdfReader + + # PDF extraction also has a 3-second rule + time.sleep(3.2) + + pdf_req = urllib.request.Request(pdf_url, headers=headers) + with urllib.request.urlopen(pdf_req, timeout=15, context=ctx) as pdf_resp: + pdf_bytes = pdf_resp.read() + + reader = PdfReader(io.BytesIO(pdf_bytes)) + extracted = [] + for j, page in enumerate(reader.pages): + if j > 4: break + page_text = page.extract_text() + if page_text: + extracted.append(page_text) + + pdf_text = "\n".join(extracted) + if len(pdf_text) > 10000: + pdf_text = pdf_text[:10000] + "\n...[TRUNCATED]" + except Exception as e: + _log.warning(f"Failed to fetch or parse PDF from {pdf_url}: {e}") + pdf_text = f"[PDF Extraction Failed: {e}]" + + if pdf_url and pdf_text and "[PDF Extraction Failed" not in pdf_text: + if metadata_out is not None: + metadata_out['pdf_urls'].append(pdf_url) + if q not in metadata_out['query_to_pdf']: + metadata_out['query_to_pdf'][q] = [] + metadata_out['query_to_pdf'][q].append(pdf_url) + + studies_text.append(f"Title: {t_text}\nSummary: {s_text}\n\nPDF Content Extracted (First 5 pages):\n{pdf_text}") + + except urllib.error.HTTPError as e: + if metadata_out is not None: + metadata_out['status_codes'].append(e.code) + _log.warning(f"HTTP Error {e.code} fetching ArXiv query '{q}': {e}") + except Exception as e: + _log.warning(f"Failed to fetch ArXiv query '{q}': {e}") + + if metadata_out is not None: + metadata_out['returned_entries'] = len(studies_text) + + return "\n\n".join(studies_text) if studies_text else "No recent studies found via ArXiv." + + + +def fetch_hf_fewshot(dataset_id: str = "ibm-research/AssetOpsBench", split: str = "scenarios", target_type: str = None, fallback_if_missing: bool = True) -> list[dict]: + """Fetch few-shot scenarios from HuggingFace dataset.""" + try: + from datasets import load_dataset + ds = load_dataset(dataset_id, split) + + examples = [] + if "train" in ds: + train_ds = ds["train"] + else: + train_ds = ds + + for item in train_ds: + if target_type: + if str(item.get("type", "")).lower() == target_type.lower(): + examples.append(item) + else: + examples.append(item) + + if len(examples) >= 3: + break + + # Return only the relevant keys to keep context size manageable + clean_examples = [] + for e in examples: + clean_examples.append({ + "text": e.get("text", ""), + "category": e.get("category", ""), + "characteristic_form": e.get("characteristic_form", "") + }) + + return clean_examples + except ImportError: + _log.warning("HuggingFace 'datasets' library is not installed. Returning empty few-shots.") + if fallback_if_missing: + return [{"text": "Mock query", "category": "Knowledge Query", "characteristic_form": "Mock characteristic"}] + return [] + except Exception as e: + _log.warning(f"Failed to load HuggingFace dataset: {e}") + if fallback_if_missing: + return [{"text": "Mock query", "category": "Knowledge Query", "characteristic_form": f"Mock. Error: {e}"}] + return [] diff --git a/uv.lock b/uv.lock index b8d18b74a..75205656c 100644 --- a/uv.lock +++ b/uv.lock @@ -155,6 +155,7 @@ source = { editable = "." } dependencies = [ { name = "claude-agent-sdk" }, { name = "couchdb3" }, + { name = "datasets" }, { name = "fastmcp" }, { name = "litellm" }, { name = "mcp", extra = ["cli"] }, @@ -162,9 +163,11 @@ dependencies = [ { name = "pandas" }, { name = "pendulum" }, { name = "pydantic" }, + { name = "pypdf" }, { name = "python-dotenv" }, { name = "pyyaml" }, { name = "requests" }, + { name = "scikit-learn" }, { name = "scipy" }, ] @@ -183,6 +186,7 @@ tsfm = [ requires-dist = [ { name = "claude-agent-sdk", specifier = ">=0.0.14" }, { name = "couchdb3", specifier = ">=2.0.2" }, + { name = "datasets", specifier = ">=4.8.4" }, { name = "fastmcp", specifier = ">=2.14.5" }, { name = "litellm", specifier = "==1.81.13" }, { name = "mcp", extras = ["cli"], specifier = ">=1.26.0" }, @@ -190,9 +194,11 @@ requires-dist = [ { name = "pandas", specifier = ">=2.0" }, { name = "pendulum", specifier = ">=3.2.0" }, { name = "pydantic", specifier = ">=2.12.5" }, + { name = "pypdf", specifier = ">=6.9.2" }, { name = "python-dotenv", specifier = ">=1.0" }, { name = "pyyaml", specifier = ">=6.0" }, { name = "requests", specifier = ">=2.32.5" }, + { name = "scikit-learn", specifier = ">=1.8.0" }, { name = "scipy", specifier = ">=1.10.0" }, ] @@ -578,6 +584,40 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/1f/d8bce383a90d8a6a11033327777afa4d4d611ec11869284adb6f48152906/cyclopts-4.5.3-py3-none-any.whl", hash = "sha256:50af3085bb15d4a6f2582dd383dad5e4ba6a0d4d4c64ee63326d881a752a6919", size = 200231, upload-time = "2026-02-16T15:07:13.045Z" }, ] +[[package]] +name = "datasets" +version = "4.8.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, + { name = "filelock" }, + { name = "fsspec", extra = ["http"] }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "multiprocess" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pyarrow" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "tqdm" }, + { name = "xxhash" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/22/73e46ac7a8c25e7ef0b3bd6f10da3465021d90219a32eb0b4d2afea4c56e/datasets-4.8.4.tar.gz", hash = "sha256:a1429ed853275ce7943a01c6d2e25475b4501eb758934362106a280470df3a52", size = 604382, upload-time = "2026-03-23T14:21:17.987Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/e5/247d094108e42ac26363ab8dc57f168840cf7c05774b40ffeb0d78868fcc/datasets-4.8.4-py3-none-any.whl", hash = "sha256:cdc8bee4698e549d78bf1fed6aea2eebc760b22b084f07e6fc020c6577a6ce6d", size = 526991, upload-time = "2026-03-23T14:21:15.89Z" }, +] + +[[package]] +name = "dill" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, +] + [[package]] name = "diskcache" version = "5.6.3" @@ -843,6 +883,11 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/ab/fb21f4c939bb440104cc2b396d3be1d9b7a9fd3c6c2a53d98c45b3d7c954/fsspec-2026.2.0-py3-none-any.whl", hash = "sha256:98de475b5cb3bd66bedd5c4679e87b4fdfe1a3bf4d707b151b3c07e58c9a2437", size = 202505, upload-time = "2026-02-05T21:50:51.819Z" }, ] +[package.optional-dependencies] +http = [ + { name = "aiohttp" }, +] + [[package]] name = "h11" version = "0.16.0" @@ -1091,6 +1136,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/67/8a/a342b2f0251f3dac4ca17618265d93bf244a2a4d089126e81e4c1056ac50/jiter-0.13.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bb00b6d26db67a05fe3e12c76edc75f32077fb51deed13822dc648fa373bc19", size = 343768, upload-time = "2026-02-02T12:37:55.055Z" }, ] +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + [[package]] name = "jsonref" version = "1.1.0" @@ -1466,6 +1520,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] +[[package]] +name = "multiprocess" +version = "0.70.19" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dill" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/f2/e783ac7f2aeeed14e9e12801f22529cc7e6b7ab80928d6dcce4e9f00922d/multiprocess-0.70.19.tar.gz", hash = "sha256:952021e0e6c55a4a9fe4cd787895b86e239a40e76802a789d6305398d3975897", size = 2079989, upload-time = "2026-01-19T06:47:39.744Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/45/8004d1e6b9185c1a444d6b55ac5682acf9d98035e54386d967366035a03a/multiprocess-0.70.19-py310-none-any.whl", hash = "sha256:97404393419dcb2a8385910864eedf47a3cadf82c66345b44f036420eb0b5d87", size = 134948, upload-time = "2026-01-19T06:47:32.325Z" }, + { url = "https://files.pythonhosted.org/packages/86/c2/dec9722dc3474c164a0b6bcd9a7ed7da542c98af8cabce05374abab35edd/multiprocess-0.70.19-py311-none-any.whl", hash = "sha256:928851ae7973aea4ce0eaf330bbdafb2e01398a91518d5c8818802845564f45c", size = 144457, upload-time = "2026-01-19T06:47:33.711Z" }, + { url = "https://files.pythonhosted.org/packages/71/70/38998b950a97ea279e6bd657575d22d1a2047256caf707d9a10fbce4f065/multiprocess-0.70.19-py312-none-any.whl", hash = "sha256:3a56c0e85dd5025161bac5ce138dcac1e49174c7d8e74596537e729fd5c53c28", size = 150281, upload-time = "2026-01-19T06:47:35.037Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/d2c27e03cb84251dfe7249b8e82923643c6d48fa4883b9476b025e7dc7eb/multiprocess-0.70.19-py313-none-any.whl", hash = "sha256:8d5eb4ec5017ba2fab4e34a747c6d2c2b6fecfe9e7236e77988db91580ada952", size = 156414, upload-time = "2026-01-19T06:47:35.915Z" }, + { url = "https://files.pythonhosted.org/packages/a0/61/af9115673a5870fd885247e2f1b68c4f1197737da315b520a91c757a861a/multiprocess-0.70.19-py314-none-any.whl", hash = "sha256:e8cc7fbdff15c0613f0a1f1f8744bef961b0a164c0ca29bdff53e9d2d93c5e5f", size = 160318, upload-time = "2026-01-19T06:47:37.497Z" }, + { url = "https://files.pythonhosted.org/packages/7e/82/69e539c4c2027f1e1697e09aaa2449243085a0edf81ae2c6341e84d769b6/multiprocess-0.70.19-py39-none-any.whl", hash = "sha256:0d4b4397ed669d371c81dcd1ef33fd384a44d6c3de1bd0ca7ac06d837720d3c5", size = 133477, upload-time = "2026-01-19T06:47:38.619Z" }, +] + [[package]] name = "networkx" version = "3.6.1" @@ -2003,6 +2074,49 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/51/e4/b8b0a03ece72f47dce2307d36e1c34725b7223d209fc679315ffe6a4e2c3/py_key_value_shared-0.3.0-py3-none-any.whl", hash = "sha256:5b0efba7ebca08bb158b1e93afc2f07d30b8f40c2fc12ce24a4c0d84f42f9298", size = 19560, upload-time = "2025-11-17T16:50:05.954Z" }, ] +[[package]] +name = "pyarrow" +version = "23.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/88/22/134986a4cc224d593c1afde5494d18ff629393d74cc2eddb176669f234a4/pyarrow-23.0.1.tar.gz", hash = "sha256:b8c5873e33440b2bc2f4a79d2b47017a89c5a24116c055625e6f2ee50523f019", size = 1167336, upload-time = "2026-02-16T10:14:12.39Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/4b/4166bb5abbfe6f750fc60ad337c43ecf61340fa52ab386da6e8dbf9e63c4/pyarrow-23.0.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f4b0dbfa124c0bb161f8b5ebb40f1a680b70279aa0c9901d44a2b5a20806039f", size = 34214575, upload-time = "2026-02-16T10:09:56.225Z" }, + { url = "https://files.pythonhosted.org/packages/e1/da/3f941e3734ac8088ea588b53e860baeddac8323ea40ce22e3d0baa865cc9/pyarrow-23.0.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7707d2b6673f7de054e2e83d59f9e805939038eebe1763fe811ee8fa5c0cd1a7", size = 35832540, upload-time = "2026-02-16T10:10:03.428Z" }, + { url = "https://files.pythonhosted.org/packages/88/7c/3d841c366620e906d54430817531b877ba646310296df42ef697308c2705/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:86ff03fb9f1a320266e0de855dee4b17da6794c595d207f89bba40d16b5c78b9", size = 44470940, upload-time = "2026-02-16T10:10:10.704Z" }, + { url = "https://files.pythonhosted.org/packages/2c/a5/da83046273d990f256cb79796a190bbf7ec999269705ddc609403f8c6b06/pyarrow-23.0.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:813d99f31275919c383aab17f0f455a04f5a429c261cc411b1e9a8f5e4aaaa05", size = 47586063, upload-time = "2026-02-16T10:10:17.95Z" }, + { url = "https://files.pythonhosted.org/packages/5b/3c/b7d2ebcff47a514f47f9da1e74b7949138c58cfeb108cdd4ee62f43f0cf3/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bf5842f960cddd2ef757d486041d57c96483efc295a8c4a0e20e704cbbf39c67", size = 48173045, upload-time = "2026-02-16T10:10:25.363Z" }, + { url = "https://files.pythonhosted.org/packages/43/b2/b40961262213beaba6acfc88698eb773dfce32ecdf34d19291db94c2bd73/pyarrow-23.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:564baf97c858ecc03ec01a41062e8f4698abc3e6e2acd79c01c2e97880a19730", size = 50621741, upload-time = "2026-02-16T10:10:33.477Z" }, + { url = "https://files.pythonhosted.org/packages/f6/70/1fdda42d65b28b078e93d75d371b2185a61da89dda4def8ba6ba41ebdeb4/pyarrow-23.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:07deae7783782ac7250989a7b2ecde9b3c343a643f82e8a4df03d93b633006f0", size = 27620678, upload-time = "2026-02-16T10:10:39.31Z" }, + { url = "https://files.pythonhosted.org/packages/47/10/2cbe4c6f0fb83d2de37249567373d64327a5e4d8db72f486db42875b08f6/pyarrow-23.0.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6b8fda694640b00e8af3c824f99f789e836720aa8c9379fb435d4c4953a756b8", size = 34210066, upload-time = "2026-02-16T10:10:45.487Z" }, + { url = "https://files.pythonhosted.org/packages/cb/4f/679fa7e84dadbaca7a65f7cdba8d6c83febbd93ca12fa4adf40ba3b6362b/pyarrow-23.0.1-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:8ff51b1addc469b9444b7c6f3548e19dc931b172ab234e995a60aea9f6e6025f", size = 35825526, upload-time = "2026-02-16T10:10:52.266Z" }, + { url = "https://files.pythonhosted.org/packages/f9/63/d2747d930882c9d661e9398eefc54f15696547b8983aaaf11d4a2e8b5426/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:71c5be5cbf1e1cb6169d2a0980850bccb558ddc9b747b6206435313c47c37677", size = 44473279, upload-time = "2026-02-16T10:11:01.557Z" }, + { url = "https://files.pythonhosted.org/packages/b3/93/10a48b5e238de6d562a411af6467e71e7aedbc9b87f8d3a35f1560ae30fb/pyarrow-23.0.1-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:9b6f4f17b43bc39d56fec96e53fe89d94bac3eb134137964371b45352d40d0c2", size = 47585798, upload-time = "2026-02-16T10:11:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/5c/20/476943001c54ef078dbf9542280e22741219a184a0632862bca4feccd666/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fc13fc6c403d1337acab46a2c4346ca6c9dec5780c3c697cf8abfd5e19b6b37", size = 48179446, upload-time = "2026-02-16T10:11:17.781Z" }, + { url = "https://files.pythonhosted.org/packages/4b/b6/5dd0c47b335fcd8edba9bfab78ad961bd0fd55ebe53468cc393f45e0be60/pyarrow-23.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c16ed4f53247fa3ffb12a14d236de4213a4415d127fe9cebed33d51671113e2", size = 50623972, upload-time = "2026-02-16T10:11:26.185Z" }, + { url = "https://files.pythonhosted.org/packages/d5/09/a532297c9591a727d67760e2e756b83905dd89adb365a7f6e9c72578bcc1/pyarrow-23.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:cecfb12ef629cf6be0b1887f9f86463b0dd3dc3195ae6224e74006be4736035a", size = 27540749, upload-time = "2026-02-16T10:12:23.297Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8e/38749c4b1303e6ae76b3c80618f84861ae0c55dd3c2273842ea6f8258233/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:29f7f7419a0e30264ea261fdc0e5fe63ce5a6095003db2945d7cd78df391a7e1", size = 34471544, upload-time = "2026-02-16T10:11:32.535Z" }, + { url = "https://files.pythonhosted.org/packages/a3/73/f237b2bc8c669212f842bcfd842b04fc8d936bfc9d471630569132dc920d/pyarrow-23.0.1-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:33d648dc25b51fd8055c19e4261e813dfc4d2427f068bcecc8b53d01b81b0500", size = 35949911, upload-time = "2026-02-16T10:11:39.813Z" }, + { url = "https://files.pythonhosted.org/packages/0c/86/b912195eee0903b5611bf596833def7d146ab2d301afeb4b722c57ffc966/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd395abf8f91c673dd3589cadc8cc1ee4e8674fa61b2e923c8dd215d9c7d1f41", size = 44520337, upload-time = "2026-02-16T10:11:47.764Z" }, + { url = "https://files.pythonhosted.org/packages/69/c2/f2a717fb824f62d0be952ea724b4f6f9372a17eed6f704b5c9526f12f2f1/pyarrow-23.0.1-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:00be9576d970c31defb5c32eb72ef585bf600ef6d0a82d5eccaae96639cf9d07", size = 47548944, upload-time = "2026-02-16T10:11:56.607Z" }, + { url = "https://files.pythonhosted.org/packages/84/a7/90007d476b9f0dc308e3bc57b832d004f848fd6c0da601375d20d92d1519/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c2139549494445609f35a5cda4eb94e2c9e4d704ce60a095b342f82460c73a83", size = 48236269, upload-time = "2026-02-16T10:12:04.47Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3f/b16fab3e77709856eb6ac328ce35f57a6d4a18462c7ca5186ef31b45e0e0/pyarrow-23.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7044b442f184d84e2351e5084600f0d7343d6117aabcbc1ac78eb1ae11eb4125", size = 50604794, upload-time = "2026-02-16T10:12:11.797Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a1/22df0620a9fac31d68397a75465c344e83c3dfe521f7612aea33e27ab6c0/pyarrow-23.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:a35581e856a2fafa12f3f54fce4331862b1cfb0bef5758347a858a4aa9d6bae8", size = 27660642, upload-time = "2026-02-16T10:12:17.746Z" }, + { url = "https://files.pythonhosted.org/packages/8d/1b/6da9a89583ce7b23ac611f183ae4843cd3a6cf54f079549b0e8c14031e73/pyarrow-23.0.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:5df1161da23636a70838099d4aaa65142777185cc0cdba4037a18cee7d8db9ca", size = 34238755, upload-time = "2026-02-16T10:12:32.819Z" }, + { url = "https://files.pythonhosted.org/packages/ae/b5/d58a241fbe324dbaeb8df07be6af8752c846192d78d2272e551098f74e88/pyarrow-23.0.1-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:fa8e51cb04b9f8c9c5ace6bab63af9a1f88d35c0d6cbf53e8c17c098552285e1", size = 35847826, upload-time = "2026-02-16T10:12:38.949Z" }, + { url = "https://files.pythonhosted.org/packages/54/a5/8cbc83f04aba433ca7b331b38f39e000efd9f0c7ce47128670e737542996/pyarrow-23.0.1-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:0b95a3994f015be13c63148fef8832e8a23938128c185ee951c98908a696e0eb", size = 44536859, upload-time = "2026-02-16T10:12:45.467Z" }, + { url = "https://files.pythonhosted.org/packages/36/2e/c0f017c405fcdc252dbccafbe05e36b0d0eb1ea9a958f081e01c6972927f/pyarrow-23.0.1-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:4982d71350b1a6e5cfe1af742c53dfb759b11ce14141870d05d9e540d13bc5d1", size = 47614443, upload-time = "2026-02-16T10:12:55.525Z" }, + { url = "https://files.pythonhosted.org/packages/af/6b/2314a78057912f5627afa13ba43809d9d653e6630859618b0fd81a4e0759/pyarrow-23.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c250248f1fe266db627921c89b47b7c06fee0489ad95b04d50353537d74d6886", size = 48232991, upload-time = "2026-02-16T10:13:04.729Z" }, + { url = "https://files.pythonhosted.org/packages/40/f2/1bcb1d3be3460832ef3370d621142216e15a2c7c62602a4ea19ec240dd64/pyarrow-23.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5f4763b83c11c16e5f4c15601ba6dfa849e20723b46aa2617cb4bffe8768479f", size = 50645077, upload-time = "2026-02-16T10:13:14.147Z" }, + { url = "https://files.pythonhosted.org/packages/eb/3f/b1da7b61cd66566a4d4c8383d376c606d1c34a906c3f1cb35c479f59d1aa/pyarrow-23.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:3a4c85ef66c134161987c17b147d6bffdca4566f9a4c1d81a0a01cdf08414ea5", size = 28234271, upload-time = "2026-02-16T10:14:09.397Z" }, + { url = "https://files.pythonhosted.org/packages/b5/78/07f67434e910a0f7323269be7bfbf58699bd0c1d080b18a1ab49ba943fe8/pyarrow-23.0.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:17cd28e906c18af486a499422740298c52d7c6795344ea5002a7720b4eadf16d", size = 34488692, upload-time = "2026-02-16T10:13:21.541Z" }, + { url = "https://files.pythonhosted.org/packages/50/76/34cf7ae93ece1f740a04910d9f7e80ba166b9b4ab9596a953e9e62b90fe1/pyarrow-23.0.1-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:76e823d0e86b4fb5e1cf4a58d293036e678b5a4b03539be933d3b31f9406859f", size = 35964383, upload-time = "2026-02-16T10:13:28.63Z" }, + { url = "https://files.pythonhosted.org/packages/46/90/459b827238936d4244214be7c684e1b366a63f8c78c380807ae25ed92199/pyarrow-23.0.1-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:a62e1899e3078bf65943078b3ad2a6ddcacf2373bc06379aac61b1e548a75814", size = 44538119, upload-time = "2026-02-16T10:13:35.506Z" }, + { url = "https://files.pythonhosted.org/packages/28/a1/93a71ae5881e99d1f9de1d4554a87be37da11cd6b152239fb5bd924fdc64/pyarrow-23.0.1-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:df088e8f640c9fae3b1f495b3c64755c4e719091caf250f3a74d095ddf3c836d", size = 47571199, upload-time = "2026-02-16T10:13:42.504Z" }, + { url = "https://files.pythonhosted.org/packages/88/a3/d2c462d4ef313521eaf2eff04d204ac60775263f1fb08c374b543f79f610/pyarrow-23.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:46718a220d64677c93bc243af1d44b55998255427588e400677d7192671845c7", size = 48259435, upload-time = "2026-02-16T10:13:49.226Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f1/11a544b8c3d38a759eb3fbb022039117fd633e9a7b19e4841cc3da091915/pyarrow-23.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a09f3876e87f48bc2f13583ab551f0379e5dfb83210391e68ace404181a20690", size = 50629149, upload-time = "2026-02-16T10:13:57.238Z" }, + { url = "https://files.pythonhosted.org/packages/50/f2/c0e76a0b451ffdf0cf788932e182758eb7558953f4f27f1aff8e2518b653/pyarrow-23.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:527e8d899f14bd15b740cd5a54ad56b7f98044955373a17179d5956ddb93d9ce", size = 28365807, upload-time = "2026-02-16T10:14:03.892Z" }, +] + [[package]] name = "pycparser" version = "3.0" @@ -2162,6 +2276,15 @@ crypto = [ { name = "cryptography" }, ] +[[package]] +name = "pypdf" +version = "6.9.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/83/691bdb309306232362503083cb15777491045dd54f45393a317dc7d8082f/pypdf-6.9.2.tar.gz", hash = "sha256:7f850faf2b0d4ab936582c05da32c52214c2b089d61a316627b5bfb5b0dab46c", size = 5311837, upload-time = "2026-03-23T14:53:27.983Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/7e/c85f41243086a8fe5d1baeba527cb26a1918158a565932b41e0f7c0b32e9/pypdf-6.9.2-py3-none-any.whl", hash = "sha256:662cf29bcb419a36a1365232449624ab40b7c2d0cfc28e54f42eeecd1fd7e844", size = 333744, upload-time = "2026-03-23T14:53:26.573Z" }, +] + [[package]] name = "pyperclip" version = "1.11.0" @@ -2574,6 +2697,50 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, ] +[[package]] +name = "scikit-learn" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "joblib" }, + { name = "numpy" }, + { name = "scipy" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0e/d4/40988bf3b8e34feec1d0e6a051446b1f66225f8529b9309becaeef62b6c4/scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd", size = 7335585, upload-time = "2025-12-10T07:08:53.618Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/74/e6a7cc4b820e95cc38cf36cd74d5aa2b42e8ffc2d21fe5a9a9c45c1c7630/scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e", size = 8548242, upload-time = "2025-12-10T07:07:51.568Z" }, + { url = "https://files.pythonhosted.org/packages/49/d8/9be608c6024d021041c7f0b3928d4749a706f4e2c3832bbede4fb4f58c95/scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76", size = 8079075, upload-time = "2025-12-10T07:07:53.697Z" }, + { url = "https://files.pythonhosted.org/packages/dd/47/f187b4636ff80cc63f21cd40b7b2d177134acaa10f6bb73746130ee8c2e5/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4", size = 8660492, upload-time = "2025-12-10T07:07:55.574Z" }, + { url = "https://files.pythonhosted.org/packages/97/74/b7a304feb2b49df9fafa9382d4d09061a96ee9a9449a7cbea7988dda0828/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a", size = 8931904, upload-time = "2025-12-10T07:07:57.666Z" }, + { url = "https://files.pythonhosted.org/packages/9f/c4/0ab22726a04ede56f689476b760f98f8f46607caecff993017ac1b64aa5d/scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809", size = 8019359, upload-time = "2025-12-10T07:07:59.838Z" }, + { url = "https://files.pythonhosted.org/packages/24/90/344a67811cfd561d7335c1b96ca21455e7e472d281c3c279c4d3f2300236/scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb", size = 7641898, upload-time = "2025-12-10T07:08:01.36Z" }, + { url = "https://files.pythonhosted.org/packages/03/aa/e22e0768512ce9255eba34775be2e85c2048da73da1193e841707f8f039c/scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a", size = 8513770, upload-time = "2025-12-10T07:08:03.251Z" }, + { url = "https://files.pythonhosted.org/packages/58/37/31b83b2594105f61a381fc74ca19e8780ee923be2d496fcd8d2e1147bd99/scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e", size = 8044458, upload-time = "2025-12-10T07:08:05.336Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5a/3f1caed8765f33eabb723596666da4ebbf43d11e96550fb18bdec42b467b/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57", size = 8610341, upload-time = "2025-12-10T07:08:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/38/cf/06896db3f71c75902a8e9943b444a56e727418f6b4b4a90c98c934f51ed4/scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e", size = 8900022, upload-time = "2025-12-10T07:08:09.862Z" }, + { url = "https://files.pythonhosted.org/packages/1c/f9/9b7563caf3ec8873e17a31401858efab6b39a882daf6c1bfa88879c0aa11/scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271", size = 7989409, upload-time = "2025-12-10T07:08:12.028Z" }, + { url = "https://files.pythonhosted.org/packages/49/bd/1f4001503650e72c4f6009ac0c4413cb17d2d601cef6f71c0453da2732fc/scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3", size = 7619760, upload-time = "2025-12-10T07:08:13.688Z" }, + { url = "https://files.pythonhosted.org/packages/d2/7d/a630359fc9dcc95496588c8d8e3245cc8fd81980251079bc09c70d41d951/scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735", size = 8826045, upload-time = "2025-12-10T07:08:15.215Z" }, + { url = "https://files.pythonhosted.org/packages/cc/56/a0c86f6930cfcd1c7054a2bc417e26960bb88d32444fe7f71d5c2cfae891/scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd", size = 8420324, upload-time = "2025-12-10T07:08:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/46/1e/05962ea1cebc1cf3876667ecb14c283ef755bf409993c5946ade3b77e303/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e", size = 8680651, upload-time = "2025-12-10T07:08:19.952Z" }, + { url = "https://files.pythonhosted.org/packages/fe/56/a85473cd75f200c9759e3a5f0bcab2d116c92a8a02ee08ccd73b870f8bb4/scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb", size = 8925045, upload-time = "2025-12-10T07:08:22.11Z" }, + { url = "https://files.pythonhosted.org/packages/cc/b7/64d8cfa896c64435ae57f4917a548d7ac7a44762ff9802f75a79b77cb633/scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702", size = 8507994, upload-time = "2025-12-10T07:08:23.943Z" }, + { url = "https://files.pythonhosted.org/packages/5e/37/e192ea709551799379958b4c4771ec507347027bb7c942662c7fbeba31cb/scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde", size = 7869518, upload-time = "2025-12-10T07:08:25.71Z" }, + { url = "https://files.pythonhosted.org/packages/24/05/1af2c186174cc92dcab2233f327336058c077d38f6fe2aceb08e6ab4d509/scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3", size = 8528667, upload-time = "2025-12-10T07:08:27.541Z" }, + { url = "https://files.pythonhosted.org/packages/a8/25/01c0af38fe969473fb292bba9dc2b8f9b451f3112ff242c647fee3d0dfe7/scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7", size = 8066524, upload-time = "2025-12-10T07:08:29.822Z" }, + { url = "https://files.pythonhosted.org/packages/be/ce/a0623350aa0b68647333940ee46fe45086c6060ec604874e38e9ab7d8e6c/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6", size = 8657133, upload-time = "2025-12-10T07:08:31.865Z" }, + { url = "https://files.pythonhosted.org/packages/b8/cb/861b41341d6f1245e6ca80b1c1a8c4dfce43255b03df034429089ca2a2c5/scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4", size = 8923223, upload-time = "2025-12-10T07:08:34.166Z" }, + { url = "https://files.pythonhosted.org/packages/76/18/a8def8f91b18cd1ba6e05dbe02540168cb24d47e8dcf69e8d00b7da42a08/scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6", size = 8096518, upload-time = "2025-12-10T07:08:36.339Z" }, + { url = "https://files.pythonhosted.org/packages/d1/77/482076a678458307f0deb44e29891d6022617b2a64c840c725495bee343f/scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242", size = 7754546, upload-time = "2025-12-10T07:08:38.128Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d1/ef294ca754826daa043b2a104e59960abfab4cf653891037d19dd5b6f3cf/scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7", size = 8848305, upload-time = "2025-12-10T07:08:41.013Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e2/b1f8b05138ee813b8e1a4149f2f0d289547e60851fd1bb268886915adbda/scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9", size = 8432257, upload-time = "2025-12-10T07:08:42.873Z" }, + { url = "https://files.pythonhosted.org/packages/26/11/c32b2138a85dcb0c99f6afd13a70a951bfdff8a6ab42d8160522542fb647/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f", size = 8678673, upload-time = "2025-12-10T07:08:45.362Z" }, + { url = "https://files.pythonhosted.org/packages/c7/57/51f2384575bdec454f4fe4e7a919d696c9ebce914590abf3e52d47607ab8/scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9", size = 8922467, upload-time = "2025-12-10T07:08:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/35/4d/748c9e2872637a57981a04adc038dacaa16ba8ca887b23e34953f0b3f742/scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2", size = 8774395, upload-time = "2025-12-10T07:08:49.337Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/d7b2ebe4704a5e50790ba089d5c2ae308ab6bb852719e6c3bd4f04c3a363/scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c", size = 8002647, upload-time = "2025-12-10T07:08:51.601Z" }, +] + [[package]] name = "scipy" version = "1.17.1" @@ -2731,6 +2898,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, ] +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + [[package]] name = "tiktoken" version = "0.12.0" @@ -3020,6 +3196,89 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, ] +[[package]] +name = "xxhash" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744, upload-time = "2025-10-02T14:34:34.622Z" }, + { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, + { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035, upload-time = "2025-10-02T14:34:37.354Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, + { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163, upload-time = "2025-10-02T14:34:39.872Z" }, + { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411, upload-time = "2025-10-02T14:34:41.569Z" }, + { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, + { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, + { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898, upload-time = "2025-10-02T14:34:46.302Z" }, + { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655, upload-time = "2025-10-02T14:34:47.571Z" }, + { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001, upload-time = "2025-10-02T14:34:49.273Z" }, + { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, + { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617, upload-time = "2025-10-02T14:34:51.954Z" }, + { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534, upload-time = "2025-10-02T14:34:53.276Z" }, + { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, + { url = "https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec", size = 32738, upload-time = "2025-10-02T14:34:55.839Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1", size = 30821, upload-time = "2025-10-02T14:34:57.219Z" }, + { url = "https://files.pythonhosted.org/packages/0c/ea/d387530ca7ecfa183cb358027f1833297c6ac6098223fd14f9782cd0015c/xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6", size = 194127, upload-time = "2025-10-02T14:34:59.21Z" }, + { url = "https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263", size = 212975, upload-time = "2025-10-02T14:35:00.816Z" }, + { url = "https://files.pythonhosted.org/packages/84/7a/c2b3d071e4bb4a90b7057228a99b10d51744878f4a8a6dd643c8bd897620/xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546", size = 212241, upload-time = "2025-10-02T14:35:02.207Z" }, + { url = "https://files.pythonhosted.org/packages/81/5f/640b6eac0128e215f177df99eadcd0f1b7c42c274ab6a394a05059694c5a/xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89", size = 445471, upload-time = "2025-10-02T14:35:03.61Z" }, + { url = "https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d", size = 193936, upload-time = "2025-10-02T14:35:05.013Z" }, + { url = "https://files.pythonhosted.org/packages/2c/bd/4a5f68381939219abfe1c22a9e3a5854a4f6f6f3c4983a87d255f21f2e5d/xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7", size = 210440, upload-time = "2025-10-02T14:35:06.239Z" }, + { url = "https://files.pythonhosted.org/packages/eb/37/b80fe3d5cfb9faff01a02121a0f4d565eb7237e9e5fc66e73017e74dcd36/xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db", size = 197990, upload-time = "2025-10-02T14:35:07.735Z" }, + { url = "https://files.pythonhosted.org/packages/d7/fd/2c0a00c97b9e18f72e1f240ad4e8f8a90fd9d408289ba9c7c495ed7dc05c/xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42", size = 210689, upload-time = "2025-10-02T14:35:09.438Z" }, + { url = "https://files.pythonhosted.org/packages/93/86/5dd8076a926b9a95db3206aba20d89a7fc14dd5aac16e5c4de4b56033140/xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11", size = 414068, upload-time = "2025-10-02T14:35:11.162Z" }, + { url = "https://files.pythonhosted.org/packages/af/3c/0bb129170ee8f3650f08e993baee550a09593462a5cddd8e44d0011102b1/xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd", size = 191495, upload-time = "2025-10-02T14:35:12.971Z" }, + { url = "https://files.pythonhosted.org/packages/e9/3a/6797e0114c21d1725e2577508e24006fd7ff1d8c0c502d3b52e45c1771d8/xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799", size = 30620, upload-time = "2025-10-02T14:35:14.129Z" }, + { url = "https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392", size = 31542, upload-time = "2025-10-02T14:35:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/39/c5/cc01e4f6188656e56112d6a8e0dfe298a16934b8c47a247236549a3f7695/xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6", size = 27880, upload-time = "2025-10-02T14:35:16.315Z" }, + { url = "https://files.pythonhosted.org/packages/f3/30/25e5321c8732759e930c555176d37e24ab84365482d257c3b16362235212/xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702", size = 32956, upload-time = "2025-10-02T14:35:17.413Z" }, + { url = "https://files.pythonhosted.org/packages/9f/3c/0573299560d7d9f8ab1838f1efc021a280b5ae5ae2e849034ef3dee18810/xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db", size = 31072, upload-time = "2025-10-02T14:35:18.844Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1c/52d83a06e417cd9d4137722693424885cc9878249beb3a7c829e74bf7ce9/xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54", size = 196409, upload-time = "2025-10-02T14:35:20.31Z" }, + { url = "https://files.pythonhosted.org/packages/e3/8e/c6d158d12a79bbd0b878f8355432075fc82759e356ab5a111463422a239b/xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f", size = 215736, upload-time = "2025-10-02T14:35:21.616Z" }, + { url = "https://files.pythonhosted.org/packages/bc/68/c4c80614716345d55071a396cf03d06e34b5f4917a467faf43083c995155/xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5", size = 214833, upload-time = "2025-10-02T14:35:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/7e/e9/ae27c8ffec8b953efa84c7c4a6c6802c263d587b9fc0d6e7cea64e08c3af/xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1", size = 448348, upload-time = "2025-10-02T14:35:25.111Z" }, + { url = "https://files.pythonhosted.org/packages/d7/6b/33e21afb1b5b3f46b74b6bd1913639066af218d704cc0941404ca717fc57/xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee", size = 196070, upload-time = "2025-10-02T14:35:26.586Z" }, + { url = "https://files.pythonhosted.org/packages/96/b6/fcabd337bc5fa624e7203aa0fa7d0c49eed22f72e93229431752bddc83d9/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd", size = 212907, upload-time = "2025-10-02T14:35:28.087Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d3/9ee6160e644d660fcf176c5825e61411c7f62648728f69c79ba237250143/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729", size = 200839, upload-time = "2025-10-02T14:35:29.857Z" }, + { url = "https://files.pythonhosted.org/packages/0d/98/e8de5baa5109394baf5118f5e72ab21a86387c4f89b0e77ef3e2f6b0327b/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292", size = 213304, upload-time = "2025-10-02T14:35:31.222Z" }, + { url = "https://files.pythonhosted.org/packages/7b/1d/71056535dec5c3177eeb53e38e3d367dd1d16e024e63b1cee208d572a033/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf", size = 416930, upload-time = "2025-10-02T14:35:32.517Z" }, + { url = "https://files.pythonhosted.org/packages/dc/6c/5cbde9de2cd967c322e651c65c543700b19e7ae3e0aae8ece3469bf9683d/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033", size = 193787, upload-time = "2025-10-02T14:35:33.827Z" }, + { url = "https://files.pythonhosted.org/packages/19/fa/0172e350361d61febcea941b0cc541d6e6c8d65d153e85f850a7b256ff8a/xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec", size = 30916, upload-time = "2025-10-02T14:35:35.107Z" }, + { url = "https://files.pythonhosted.org/packages/ad/e6/e8cf858a2b19d6d45820f072eff1bea413910592ff17157cabc5f1227a16/xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8", size = 31799, upload-time = "2025-10-02T14:35:36.165Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/064b197e855bfb7b343210e82490ae672f8bc7cdf3ddb02e92f64304ee8a/xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746", size = 28044, upload-time = "2025-10-02T14:35:37.195Z" }, + { url = "https://files.pythonhosted.org/packages/7e/5e/0138bc4484ea9b897864d59fce9be9086030825bc778b76cb5a33a906d37/xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e", size = 32754, upload-time = "2025-10-02T14:35:38.245Z" }, + { url = "https://files.pythonhosted.org/packages/18/d7/5dac2eb2ec75fd771957a13e5dda560efb2176d5203f39502a5fc571f899/xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405", size = 30846, upload-time = "2025-10-02T14:35:39.6Z" }, + { url = "https://files.pythonhosted.org/packages/fe/71/8bc5be2bb00deb5682e92e8da955ebe5fa982da13a69da5a40a4c8db12fb/xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3", size = 194343, upload-time = "2025-10-02T14:35:40.69Z" }, + { url = "https://files.pythonhosted.org/packages/e7/3b/52badfb2aecec2c377ddf1ae75f55db3ba2d321c5e164f14461c90837ef3/xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6", size = 213074, upload-time = "2025-10-02T14:35:42.29Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2b/ae46b4e9b92e537fa30d03dbc19cdae57ed407e9c26d163895e968e3de85/xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063", size = 212388, upload-time = "2025-10-02T14:35:43.929Z" }, + { url = "https://files.pythonhosted.org/packages/f5/80/49f88d3afc724b4ac7fbd664c8452d6db51b49915be48c6982659e0e7942/xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7", size = 445614, upload-time = "2025-10-02T14:35:45.216Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ba/603ce3961e339413543d8cd44f21f2c80e2a7c5cfe692a7b1f2cccf58f3c/xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b", size = 194024, upload-time = "2025-10-02T14:35:46.959Z" }, + { url = "https://files.pythonhosted.org/packages/78/d1/8e225ff7113bf81545cfdcd79eef124a7b7064a0bba53605ff39590b95c2/xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd", size = 210541, upload-time = "2025-10-02T14:35:48.301Z" }, + { url = "https://files.pythonhosted.org/packages/6f/58/0f89d149f0bad89def1a8dd38feb50ccdeb643d9797ec84707091d4cb494/xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0", size = 198305, upload-time = "2025-10-02T14:35:49.584Z" }, + { url = "https://files.pythonhosted.org/packages/11/38/5eab81580703c4df93feb5f32ff8fa7fe1e2c51c1f183ee4e48d4bb9d3d7/xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152", size = 210848, upload-time = "2025-10-02T14:35:50.877Z" }, + { url = "https://files.pythonhosted.org/packages/5e/6b/953dc4b05c3ce678abca756416e4c130d2382f877a9c30a20d08ee6a77c0/xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11", size = 414142, upload-time = "2025-10-02T14:35:52.15Z" }, + { url = "https://files.pythonhosted.org/packages/08/a9/238ec0d4e81a10eb5026d4a6972677cbc898ba6c8b9dbaec12ae001b1b35/xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5", size = 191547, upload-time = "2025-10-02T14:35:53.547Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ee/3cf8589e06c2164ac77c3bf0aa127012801128f1feebf2a079272da5737c/xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f", size = 31214, upload-time = "2025-10-02T14:35:54.746Z" }, + { url = "https://files.pythonhosted.org/packages/02/5d/a19552fbc6ad4cb54ff953c3908bbc095f4a921bc569433d791f755186f1/xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad", size = 32290, upload-time = "2025-10-02T14:35:55.791Z" }, + { url = "https://files.pythonhosted.org/packages/b1/11/dafa0643bc30442c887b55baf8e73353a344ee89c1901b5a5c54a6c17d39/xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679", size = 28795, upload-time = "2025-10-02T14:35:57.162Z" }, + { url = "https://files.pythonhosted.org/packages/2c/db/0e99732ed7f64182aef4a6fb145e1a295558deec2a746265dcdec12d191e/xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4", size = 32955, upload-time = "2025-10-02T14:35:58.267Z" }, + { url = "https://files.pythonhosted.org/packages/55/f4/2a7c3c68e564a099becfa44bb3d398810cc0ff6749b0d3cb8ccb93f23c14/xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67", size = 31072, upload-time = "2025-10-02T14:35:59.382Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d9/72a29cddc7250e8a5819dad5d466facb5dc4c802ce120645630149127e73/xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad", size = 196579, upload-time = "2025-10-02T14:36:00.838Z" }, + { url = "https://files.pythonhosted.org/packages/63/93/b21590e1e381040e2ca305a884d89e1c345b347404f7780f07f2cdd47ef4/xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b", size = 215854, upload-time = "2025-10-02T14:36:02.207Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b8/edab8a7d4fa14e924b29be877d54155dcbd8b80be85ea00d2be3413a9ed4/xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b", size = 214965, upload-time = "2025-10-02T14:36:03.507Z" }, + { url = "https://files.pythonhosted.org/packages/27/67/dfa980ac7f0d509d54ea0d5a486d2bb4b80c3f1bb22b66e6a05d3efaf6c0/xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca", size = 448484, upload-time = "2025-10-02T14:36:04.828Z" }, + { url = "https://files.pythonhosted.org/packages/8c/63/8ffc2cc97e811c0ca5d00ab36604b3ea6f4254f20b7bc658ca825ce6c954/xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a", size = 196162, upload-time = "2025-10-02T14:36:06.182Z" }, + { url = "https://files.pythonhosted.org/packages/4b/77/07f0e7a3edd11a6097e990f6e5b815b6592459cb16dae990d967693e6ea9/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99", size = 213007, upload-time = "2025-10-02T14:36:07.733Z" }, + { url = "https://files.pythonhosted.org/packages/ae/d8/bc5fa0d152837117eb0bef6f83f956c509332ce133c91c63ce07ee7c4873/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3", size = 200956, upload-time = "2025-10-02T14:36:09.106Z" }, + { url = "https://files.pythonhosted.org/packages/26/a5/d749334130de9411783873e9b98ecc46688dad5db64ca6e04b02acc8b473/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6", size = 213401, upload-time = "2025-10-02T14:36:10.585Z" }, + { url = "https://files.pythonhosted.org/packages/89/72/abed959c956a4bfc72b58c0384bb7940663c678127538634d896b1195c10/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93", size = 417083, upload-time = "2025-10-02T14:36:12.276Z" }, + { url = "https://files.pythonhosted.org/packages/0c/b3/62fd2b586283b7d7d665fb98e266decadf31f058f1cf6c478741f68af0cb/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518", size = 193913, upload-time = "2025-10-02T14:36:14.025Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/c19c42c5b3f5a4aad748a6d5b4f23df3bed7ee5445accc65a0fb3ff03953/xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119", size = 31586, upload-time = "2025-10-02T14:36:15.603Z" }, + { url = "https://files.pythonhosted.org/packages/03/d6/4cc450345be9924fd5dc8c590ceda1db5b43a0a889587b0ae81a95511360/xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f", size = 32526, upload-time = "2025-10-02T14:36:16.708Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/7243eb3f9eaabd1a88a5a5acadf06df2d83b100c62684b7425c6a11bcaa8/xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95", size = 28898, upload-time = "2025-10-02T14:36:17.843Z" }, +] + [[package]] name = "yarl" version = "1.22.0" From 41895534df4554e0f81c57e730bfd0419120bafc Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Thu, 2 Apr 2026 21:53:58 -0400 Subject: [PATCH 07/29] add summary of fetched study links --- src/scenarios/generator.py | 14 +++++++++++++- src/scenarios/utils.py | 5 +++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/scenarios/generator.py b/src/scenarios/generator.py index e1fb63f90..c3aa68721 100644 --- a/src/scenarios/generator.py +++ b/src/scenarios/generator.py @@ -260,7 +260,19 @@ async def build_asset_profile(self, asset_name: str, server_desc: dict) -> Asset # 1.2 Fetch studies using multi-query logic studies = fetch_arxiv_studies(queries, metadata_out=metadata) - self._write_log("arxiv_results", studies) + + # Format a summary header with titles and links + header = f"Asset: {asset_name}\n" + header += f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n" + header += f"Total Entries: {len(metadata.get('results_summary', []))}\n\n" + header += "========================================\n" + header += " SOURCES (TITLES & PDF LINKS)\n" + header += "========================================\n" + for i, res in enumerate(metadata.get('results_summary', []), 1): + header += f"{i}. {res['title']}\n -> {res['url']}\n" + header += "========================================\n\n" + + self._write_log("arxiv_results", header + studies) if self.show_workflow: status_summary = ", ".join(f"HTTP {s}" for s in metadata.get('status_codes', [])) diff --git a/src/scenarios/utils.py b/src/scenarios/utils.py index 12fbe160f..c001ae333 100644 --- a/src/scenarios/utils.py +++ b/src/scenarios/utils.py @@ -30,6 +30,7 @@ def fetch_arxiv_studies(search_queries: str | list[str], max_results_per_query: metadata_out['returned_entries'] = 0 metadata_out['pdf_urls'] = [] metadata_out['query_to_pdf'] = {} + metadata_out['results_summary'] = [] # List of (title, url) seen_ids = set() studies_text = [] @@ -101,6 +102,10 @@ def fetch_arxiv_studies(search_queries: str | list[str], max_results_per_query: _log.warning(f"Failed to fetch or parse PDF from {pdf_url}: {e}") pdf_text = f"[PDF Extraction Failed: {e}]" + if pdf_url: + if metadata_out is not None: + metadata_out['results_summary'].append({"title": t_text, "url": pdf_url}) + if pdf_url and pdf_text and "[PDF Extraction Failed" not in pdf_text: if metadata_out is not None: metadata_out['pdf_urls'].append(pdf_url) From b4156c350e5e96b0092c6ce34e351f35b94c8b43 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Thu, 2 Apr 2026 22:38:55 -0400 Subject: [PATCH 08/29] =?UTF-8?q?feat(scenarios):=20add=20Scenario=20Gener?= =?UTF-8?q?ator=20Agent=20=E2=80=94=20multi-phase=20LLM=20pipeline=20for?= =?UTF-8?q?=20benchmark=20scenario=20creation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduces a fully automated 4-phase scenario generation pipeline driven by LiteLLM: PHASE 1 — Asset Profile Construction - LLM generates targeted ArXiv search queries from the asset's canonical academic name - Fetches PDFs via ArXiv API (up to 2 per query, first 5 pages extracted via pypdf) - Synthesises sensor mappings, failure modes, ISO standards, and relevant tool mappings into an AssetProfile (Pydantic model); fatal if unparseable PHASE 2 — Scenario Budget Allocation - LLM dynamically distributes the total scenario count across 5 subagent categories (iot, fmsr, tsfm, wo, multiagent) based on the AssetProfile - Multiagent capped at 50% of total; fatal if allocation is unparseable PHASE 3 — Individual Agent Generation & Validation (iot / fmsr / tsfm / wo) - Fetches 2 typed few-shot examples from ibm-research/AssetOpsBench on HuggingFace - SCENARIO_GENERATOR_PROMPT produces raw scenario dicts per subagent - VALIDATE_REPAIR_PROMPT corrects schema, tool alignment, and characteristic_form quality - Validation diffs (before/after) written to numbered log files when --log is active PHASE 4 — Multi-Agent Combiner - MULTIAGENT_COMBINER_PROMPT seeds from up to 10 single-agent scenarios to produce complex cross-subagent orchestration scenarios (e.g. IoT → FMSR → WO) CLI (python -m scenarios.generator): --num-scenarios N Total scenarios to generate (default: 50) --output PATH Output JSON path (default: generated_scenarios.json) --model-id MODEL LiteLLM model override --show-workflow Granular phase-by-phase terminal output with diffs --log Dump all raw prompts + responses to logs/_/ Supporting additions: - models.py: AssetProfile, ScenarioBudget, Scenario Pydantic models - prompts.py: 6 prompt templates (PROFILE_BUILDER, SCENARIO_GENERATOR, VALIDATE_REPAIR, MULTIAGENT_COMBINER, RESEARCH_QUERY_GENERATOR, BUDGET_ALLOCATOR) - utils.py: fetch_arxiv_studies() with multi-query dedup + PDF extraction; fetch_hf_fewshot() with type-filtered HuggingFace loading + mock fallback - Log header includes ArXiv paper titles and PDF URLs for full traceability - src/scenarios/README.md: full usage docs, pipeline breakdown, output schema, troubleshooting table, and log file structure reference --- src/scenarios/README.md | 226 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 src/scenarios/README.md diff --git a/src/scenarios/README.md b/src/scenarios/README.md new file mode 100644 index 000000000..1a753105e --- /dev/null +++ b/src/scenarios/README.md @@ -0,0 +1,226 @@ +# Scenario Generator + +Automated LLM-driven pipeline that generates evaluation scenarios for AssetOpsBench. Given an asset name (e.g. `"Smart Grid Transformer"`), it produces a set of richly-typed benchmark scenarios covering IoT queries, failure-mode reasoning, time-series analysis, work-order decisions, and complex multi-agent workflows. + +--- + +## Directory Structure + +``` +src/scenarios/ +├── generator.py # Main orchestrator — ScenarioGeneratorAgent + CLI entry point +├── models.py # Pydantic models: AssetProfile, ScenarioBudget, Scenario +├── prompts.py # All LLM prompt templates (6 prompts) +├── utils.py # ArXiv fetch + HuggingFace few-shot helpers +├── local/ # Place custom local study PDFs / text files here +└── huggingface/ # HuggingFace dataset integration notes +``` + +--- + +## Prerequisites + +Install project dependencies (from repo root): + +```bash +uv sync +``` + +Set required environment variables in a `.env` file at the repo root: + +```bash +# .env +LITELLM_MODEL=gpt-4o # or any LiteLLM-compatible model ID +OPENAI_API_KEY=sk-... # or whichever provider key your model needs +``` + +> The generator reuses the same `LiteLLMBackend` and `Executor` as `plan-execute`, so any model already working with that CLI will work here. + +--- + +## Running the Generator + +The generator is invoked as a Python module from the **repo root**: + +```bash +python -m scenarios.generator "" [options] +``` + +### Minimum viable run + +```bash +python -m scenarios.generator "Smart Grid Transformer" +``` + +Generates 50 scenarios and writes them to `generated_scenarios.json`. + +--- + +## CLI Reference + +| Flag | Default | Description | +|---|---|---| +| `asset_name` *(positional)* | — | Name of the physical asset to generate scenarios for (e.g. `"Chiller"`, `"Wind Turbine"`, `"Smart Grid Transformer"`) | +| `--num-scenarios N` | `50` | Total number of scenarios to generate | +| `--output PATH` | `generated_scenarios.json` | Output file path for the resulting JSON | +| `--model-id MODEL` | project default | LiteLLM model ID override (e.g. `gpt-4o`, `claude-3-5-sonnet`) | +| `--show-workflow` | off | Print granular phase-by-phase progress to the terminal | +| `--log` | off | Dump raw prompts + LLM responses to a timestamped `logs/` directory | + +### Examples + +```bash +# Generate 20 scenarios with verbose workflow output +python -m scenarios.generator "Chiller" --num-scenarios 20 --show-workflow + +# Use a specific model and save to a custom path +python -m scenarios.generator "Wind Turbine" --model-id claude-3-5-sonnet-latest --output wind_turbine_scenarios.json + +# Full debug run: workflow + raw log files +python -m scenarios.generator "Smart Grid Transformer" --show-workflow --log + +# Minimal silent run (for CI/scripting) +python -m scenarios.generator "Pump" --num-scenarios 10 --output pump_eval.json +``` + +--- + +## Generation Pipeline + +The generator runs 5 sequential phases: + +``` +Phase 1 → Asset Profile Construction +Phase 2 → Scenario Budget Allocation +Phase 3 → Individual Agent Generation & Validation (iot / fmsr / tsfm / wo) +Phase 4 → Multi-Agent Scenario Construction + → Output JSON +``` + +### Phase 1 — Asset Profile Construction + +1. An LLM generates 3 targeted ArXiv search queries using the canonical academic name for the asset. +2. The ArXiv API is queried; PDFs are fetched and the first 5 pages of each are extracted. +3. A `PROFILE_BUILDER_PROMPT` synthesises an `AssetProfile` from the literature and the available MCP tool descriptions. + +**Output model (`AssetProfile`):** +```json +{ + "asset_name": "Smart Grid Transformer", + "description": "...", + "sensor_mappings": { "oil_temp": "Top-oil temperature sensor" }, + "known_failure_modes": ["insulation breakdown", "partial discharge"], + "relevant_tools": { "iot": [{"name": "get_sensor_reading", "reason": "..."}] }, + "iso_standards": ["ISO 14224", "IEC 60076"] +} +``` + +> **Critical:** If this phase fails to parse an `AssetProfile`, the process exits immediately with a fatal error. There is no fallback. + +### Phase 2 — Scenario Budget Allocation + +An LLM analyses the `AssetProfile` and distributes the `--num-scenarios` budget across 5 subagent categories: + +| Category | Focus | +|---|---| +| `iot` | Sensor data queries and telemetry | +| `fmsr` | Failure modes and structural reliability | +| `tsfm` | Time-series analysis and forecasting | +| `wo` | Work-order decision support | +| `multiagent` | Complex multi-step orchestration (capped at 50% of total) | + +> **Critical:** If budget allocation fails, the process exits immediately. + +### Phase 3 — Individual Agent Generation & Validation + +For each subagent with a non-zero budget: +1. **Few-shot examples** are fetched from `ibm-research/AssetOpsBench` on HuggingFace (filtered by `type`). +2. A `SCENARIO_GENERATOR_PROMPT` produces a JSON array of scenario dicts. +3. A `VALIDATE_REPAIR_PROMPT` validates and repairs each scenario for schema correctness and tool alignment. +4. Changed scenarios are diffed and written to log files (if `--log` is enabled). + +**Valid `category` values per subagent:** + +| Subagent | Allowed Categories | +|---|---| +| `iot` | Data Query, Knowledge Query | +| `fmsr` | Knowledge Query | +| `tsfm` | Knowledge Query, Anomaly Detection Query, Tuning Query, Inference Query, Complex Query | +| `wo` | Decision Support, Prediction, Knowledge Query | + +### Phase 4 — Multi-Agent Scenario Construction + +Uses up to 10 previously-generated single-agent scenarios as seed material to construct complex cross-agent workflows (e.g. detect anomaly via IoT → confirm history via FMSR → schedule via WO). + +--- + +## Output Schema + +The output JSON is an array of `Scenario` objects: + +```json +[ + { + "id": "smart_grid_transformer_iot_01", + "type": "iot", + "text": "What is the current oil temperature reading for transformer T-42?", + "category": "Data Query", + "characteristic_form": "The agent should call get_sensor_reading with asset_id='T-42' and sensor='oil_temp', then return the value with its unit." + } +] +``` + +| Field | Type | Description | +|---|---|---| +| `id` | `str` | Auto-assigned: `{asset}_{type}_{n:02d}` | +| `type` | `str` | Subagent category: `iot`, `fmsr`, `tsfm`, `wo`, `multiagent` | +| `text` | `str` | The natural-language query presented to the agent | +| `category` | `str` | Scenario category (see table above) | +| `characteristic_form` | `str` | Natural-language description of the expected agent response/tool flow | + +--- + +## Log Files (`--log`) + +When `--log` is passed, a timestamped directory is created: + +``` +logs/gen__/ +├── 01_research_queries_prompt.txt +├── 02_research_queries_response.txt +├── 03_arxiv_results.txt +├── 04_asset_profile_prompt.txt +├── 05_asset_profile_response.txt +├── 06_asset_profile__json.txt +├── 07_budget_allocation_prompt.txt +├── 08_budget_allocation_response.txt +├── 09_iot_generation_prompt.txt +├── 10_iot_generation_response.txt +├── 11_validate_repair_prompt.txt +├── 12_validate_repair_response.txt +├── 13_iot_validation_changes.txt ← diffs for changed scenarios +... +``` + +Logs are numbered sequentially in pipeline order, making it straightforward to trace exactly what the LLM received and returned at each step. + +--- + +## Troubleshooting + +| Symptom | Likely Cause | Fix | +|---|---|---| +| `[FATAL ERROR] Critical failure: Could not construct AssetProfile` | LLM returned unparseable JSON in Phase 1 | Run with `--log` and inspect `asset_profile_response.txt`; try a more capable model | +| `[FATAL ERROR] Critical failure: Could not dynamically allocate scenario budget` | Phase 2 parse failure | Same as above — check `budget_allocation_response.txt` | +| `[WARNING] No scenarios were successfully generated` | All subagent generation rounds returned empty | Check HuggingFace connectivity; run with `--show-workflow --log` | +| ArXiv fetch slow / hanging | ArXiv rate-limiting (3s between requests enforced) | Normal — each query + PDF fetch takes ~6–10s per paper | +| `datasets` ImportError | HuggingFace `datasets` library missing | Run `uv sync` from repo root | +| `pypdf` ImportError | PDF extraction library missing | Run `uv sync` from repo root | + +--- + +## Data Sources + +- **ArXiv** — Academic literature fetched live at runtime via `fetch_arxiv_studies()` in `utils.py`. Queries are LLM-generated, respecting ArXiv's 3-second rate limit. +- **HuggingFace** — Few-shot examples loaded from `ibm-research/AssetOpsBench` via `fetch_hf_fewshot()`. If the dataset is unavailable, a mock fallback is used automatically. +- **Local files** — Place domain-specific PDFs or text files in `src/scenarios/local/` for future integration (see `local/readme.md`). From f1a4ed4784b99e1bd961961d5cd3f3899df0515a Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Thu, 2 Apr 2026 22:43:34 -0400 Subject: [PATCH 09/29] add README.md for scenario generation pipeline --- src/scenarios/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/scenarios/README.md b/src/scenarios/README.md index 1a753105e..0362b4e56 100644 --- a/src/scenarios/README.md +++ b/src/scenarios/README.md @@ -139,7 +139,7 @@ For each subagent with a non-zero budget: 3. A `VALIDATE_REPAIR_PROMPT` validates and repairs each scenario for schema correctness and tool alignment. 4. Changed scenarios are diffed and written to log files (if `--log` is enabled). -**Valid `category` values per subagent:** +**Valid `category` values per subagent:** (extracted from HF examples) | Subagent | Allowed Categories | |---|---| @@ -222,5 +222,4 @@ Logs are numbered sequentially in pipeline order, making it straightforward to t ## Data Sources - **ArXiv** — Academic literature fetched live at runtime via `fetch_arxiv_studies()` in `utils.py`. Queries are LLM-generated, respecting ArXiv's 3-second rate limit. -- **HuggingFace** — Few-shot examples loaded from `ibm-research/AssetOpsBench` via `fetch_hf_fewshot()`. If the dataset is unavailable, a mock fallback is used automatically. -- **Local files** — Place domain-specific PDFs or text files in `src/scenarios/local/` for future integration (see `local/readme.md`). +- **HuggingFace** — Few-shot examples loaded from `ibm-research/AssetOpsBench` via `fetch_hf_fewshot()`. If the dataset is unavailable, a mock fallback is used automatically. \ No newline at end of file From 8f3fbc57343c98366e0628804b558a3093e05c03 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Fri, 3 Apr 2026 10:52:29 -0400 Subject: [PATCH 10/29] update workflow reference to agent --- src/scenarios/generator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scenarios/generator.py b/src/scenarios/generator.py index c3aa68721..1a945d6c4 100644 --- a/src/scenarios/generator.py +++ b/src/scenarios/generator.py @@ -22,8 +22,8 @@ # Reuse existing llm setup from llm.litellm import LiteLLMBackend -from workflow.executor import Executor -from workflow.cli import _DEFAULT_MODEL +from agent.plan_execute.executor import Executor +from agent.cli import _DEFAULT_MODEL _log = logging.getLogger(__name__) From 82b8fd4ec3a7b5268bebce95ee44d0b9df0fe293 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Fri, 3 Apr 2026 11:13:04 -0400 Subject: [PATCH 11/29] for validated scenarios add truncation to adhere to budget --- src/scenarios/generator.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/scenarios/generator.py b/src/scenarios/generator.py index 1a945d6c4..cb7ef78b4 100644 --- a/src/scenarios/generator.py +++ b/src/scenarios/generator.py @@ -396,6 +396,13 @@ def validate_and_repair(self, scenarios: list[dict], profile: AssetProfile) -> l parsed, parse_err = _parse_llm_json(response) if isinstance(parsed, list): + if len(parsed) > len(scenarios): + _log.warning( + "validate_and_repair returned %d scenarios but only %d were submitted — " + "truncating to prevent count inflation.", + len(parsed), len(scenarios), + ) + parsed = parsed[:len(scenarios)] return parsed self._handle_parse_failure("validate_repair", response, parse_err) return scenarios From 38ef49b0a6b36203b525a6d781d6b2af13ed0d0c Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Tue, 7 Apr 2026 14:21:33 -0400 Subject: [PATCH 12/29] Refine scenario retrieval and clean up generator flow --- src/scenarios/generator.py | 353 +++++------ src/scenarios/models.py | 56 +- src/scenarios/prompts.py | 115 +++- src/scenarios/retrieval.py | 878 +++++++++++++++++++++++++++ src/scenarios/utils.py | 116 ++-- src/servers/fmsr/main.py | 158 ++--- src/servers/fmsr/models.py | 62 +- src/servers/fmsr/tests/test_tools.py | 6 +- 8 files changed, 1326 insertions(+), 418 deletions(-) create mode 100644 src/scenarios/retrieval.py diff --git a/src/scenarios/generator.py b/src/scenarios/generator.py index cb7ef78b4..91c492815 100644 --- a/src/scenarios/generator.py +++ b/src/scenarios/generator.py @@ -4,99 +4,79 @@ import os import sys import argparse -from typing import Any from datetime import datetime from dotenv import load_dotenv from .models import AssetProfile, Scenario, ScenarioBudget -from .utils import fetch_arxiv_studies, fetch_hf_fewshot +from .retrieval import retrieve_asset_evidence +from .utils import fetch_hf_fewshot, parse_llm_json from .prompts import ( PROFILE_BUILDER_PROMPT, SCENARIO_GENERATOR_PROMPT, VALIDATE_REPAIR_PROMPT, MULTIAGENT_COMBINER_PROMPT, - RESEARCH_QUERY_GENERATOR_PROMPT, - BUDGET_ALLOCATOR_PROMPT + BUDGET_ALLOCATOR_PROMPT, ) -# Reuse existing llm setup from llm.litellm import LiteLLMBackend from agent.plan_execute.executor import Executor from agent.cli import _DEFAULT_MODEL _log = logging.getLogger(__name__) -def _parse_llm_json(raw: str) -> tuple[Any, str | None]: - """Helper to parse raw text response containing JSON. Returns (parsed_obj, error_msg).""" - text = raw.strip() - if text.startswith("```"): - lines = text.splitlines() - inner = lines[1:-1] if lines[-1].strip() == "```" else lines[1:] - text = "\n".join(inner) - if text.lower().startswith("json"): - text = text[4:] - - text = text.strip() - try: - return json.loads(text), None - except json.JSONDecodeError as e: - # Fallback to finding first brace/bracket - start_obj = text.find("{") - start_arr = text.find("[") - if start_obj == -1 and start_arr == -1: - return None, f"No JSON start character found. Error: {str(e)}" - - start = start_obj if (start_arr == -1 or (start_obj != -1 and start_obj < start_arr)) else start_arr - end_char = "}" if start == start_obj else "]" - end = text.rfind(end_char) + 1 - - if start != -1 and end > start: - try: - return json.loads(text[start:end]), None - except json.JSONDecodeError as e2: - return None, f"Failed to parse inner JSON block. Error: {str(e2)}" - return None, "Unknown parsing error." def _print_section(title: str) -> None: print(f"\n{'─' * 60}") print(f" {title}") print(f"{'─' * 60}") -def _print_step(phase: str, info: str, details: str = None, tool_info: str = None): + +def _print_step( + phase: str, + info: str, + details: str | None = None, + tool_info: str | None = None, +) -> None: print(f" [OK ] Step ({phase}): {info}") if tool_info: print(f" {tool_info}") if details: - indented = "\n".join(" " + line for line in details.splitlines()) # 8 spaces + indented = "\n".join(" " + line for line in details.splitlines()) print(indented) + def _format_diff(scenario_id: str, old: dict, new: dict) -> str: - """Format a visual diff of changed fields between two scenario dicts.""" lines = [f" [VALIDATED] Scenario: {scenario_id}"] for key in set(old.keys()) | set(new.keys()): if old.get(key) != new.get(key): v_old = json.dumps(old.get(key)) v_new = json.dumps(new.get(key)) - # Truncate long values for readability - if len(v_old) > 60: v_old = v_old[:57] + "..." - if len(v_new) > 60: v_new = v_new[:57] + "..." - + if len(v_old) > 60: + v_old = v_old[:57] + "..." + if len(v_new) > 60: + v_new = v_new[:57] + "..." + lines.append(f" {key}: {v_old}") lines.append(f" ↓") lines.append(f" {v_new}") return "\n".join(lines) + class ScenarioGeneratorAgent: - def __init__(self, model_id: str = _DEFAULT_MODEL, show_workflow: bool = False, log_dir: str = None): + def __init__( + self, + model_id: str = _DEFAULT_MODEL, + show_workflow: bool = False, + log_dir: str | None = None, + ) -> None: self.llm = LiteLLMBackend(model_id=model_id) - # We instantiate standard Executor just to get server descriptions easily self.executor = Executor(llm=self.llm) self.show_workflow = show_workflow self.log_dir = log_dir self._log_step = 1 - def _write_log(self, name: str, content: str): + def _write_log(self, name: str, content: str) -> None: if not self.log_dir: return os.makedirs(self.log_dir, exist_ok=True) @@ -105,8 +85,12 @@ def _write_log(self, name: str, content: str): f.write(content) self._log_step += 1 - def _handle_parse_failure(self, step_name: str, response: str, error_msg: str | None): - """Log and optionally print detailed failure information.""" + def _handle_parse_failure( + self, + step_name: str, + response: str, + error_msg: str | None, + ) -> None: _log.warning(f"Failed to parse LLM response for '{step_name}'. Error: {error_msg}") if self.show_workflow: print(f" [ERR!] Step ({step_name}): LLM output parsing failed.") @@ -118,113 +102,107 @@ def _handle_parse_failure(self, step_name: str, response: str, error_msg: str | async def run(self, asset_name: str, num_scenarios: int = 50) -> list[Scenario]: _log.info(f"Starting scenario generation for asset: {asset_name}") - + server_desc = await self.executor.get_server_descriptions() - - # 1. Build Asset Profile + if self.show_workflow: _print_section("Phase 1: Asset Profile Construction") asset_profile = await self.build_asset_profile(asset_name, server_desc) - - # 2. Budget Allocation + if self.show_workflow: _print_section("Phase 2: Scenario Budget Allocation") budget = await self.allocate_budget(asset_profile, total=num_scenarios) - + if self.show_workflow: _print_section("Phase 3: Individual Agent - Generation & Validation") - - # 3, 4. Subagent generation + Validation + all_scenarios = [] for subagent, count in budget.allocation.items(): if count == 0: continue - + if subagent == "multiagent": continue - + if self.show_workflow: - _print_section(f"{subagent.upper()} Agent") - + _print_section(f"{subagent.upper()} Agent") + _log.info(f"Generating {count} scenarios for subagent: {subagent}") - + if self.show_workflow: ds_query = f"HuggingFace dataset 'ibm-research/AssetOpsBench' target_type={subagent}" - _print_step(f"generate_{subagent}", f"Generating {count} scenarios for subagent: {subagent}", tool_info=f"src: {ds_query}") + _print_step( + f"generate_{subagent}", + f"Generating {count} scenarios for subagent: {subagent}", + tool_info=f"src: {ds_query}", + ) scenarios = self.generate_single_agent_scenarios(subagent, count, asset_profile, server_desc) - + _log.info(f"Validating {count} scenarios for subagent: {subagent}") valid_scenarios = self.validate_and_repair(scenarios, asset_profile) - - # Identify changes for logging + changed_indices = [] if len(scenarios) == len(valid_scenarios): for i, (s1, s2) in enumerate(zip(scenarios, valid_scenarios)): if json.dumps(s1, sort_keys=True) != json.dumps(s2, sort_keys=True): changed_indices.append(i) else: - # If counts differ, we consider them all potentially changed or just a major structural shift _log.warning(f"Scenario count mismatch after validation: {len(scenarios)} -> {len(valid_scenarios)}") - subagent_generated = [] + generated_count = 0 diff_logs = [] for i, s in enumerate(valid_scenarios): - s['type'] = subagent - s['id'] = f"{asset_name.replace(' ', '_').lower()}_{subagent}_{len(all_scenarios)+1:02d}" - - # Collect diff for logging if it changed + s["type"] = subagent + s["id"] = f"{asset_name.replace(' ', '_').lower()}_{subagent}_{len(all_scenarios)+1:02d}" + if i in changed_indices: - diff_logs.append(_format_diff(s['id'], scenarios[i], s)) + diff_logs.append(_format_diff(s["id"], scenarios[i], s)) - try: - all_scenarios.append(Scenario(**s)) - subagent_generated.append(s) - except Exception as e: - _log.warning(f"Skipping incorrectly formatted scenario dict: {s} - Error: {e}") + all_scenarios.append(Scenario(**s)) + generated_count += 1 if diff_logs: self._write_log(f"{subagent}_validation_changes", "\n\n".join(diff_logs)) if self.show_workflow: - _print_step(f"validate_{subagent}", f"Validated {len(subagent_generated)} scenarios (Made {len(changed_indices)} validation changes)") + _print_step( + f"validate_{subagent}", + f"Validated {generated_count} scenarios (Made {len(changed_indices)} validation changes)", + ) - # 5. Multiagent Combiner multiagent_count = budget.allocation.get("multiagent", 0) if multiagent_count > 0: if self.show_workflow: _print_section("Phase 4: Multi-Agent Scenario Construction") _log.info(f"Generating {multiagent_count} multiagent scenarios") single_dicts = [s.model_dump() for s in all_scenarios] - + if self.show_workflow: _print_step("generate_multiagent", f"Combining existing scenarios into {multiagent_count} multiagent scenarios.") - + multi_scenarios = self.construct_multiagent_scenarios(multiagent_count, single_dicts, asset_profile, server_desc) - + _log.info(f"Validating multiagent scenarios") valid_multi = self.validate_and_repair(multi_scenarios, asset_profile) - + changed_indices_multi = [] if len(multi_scenarios) == len(valid_multi): for i, (s1, s2) in enumerate(zip(multi_scenarios, valid_multi)): if json.dumps(s1, sort_keys=True) != json.dumps(s2, sort_keys=True): changed_indices_multi.append(i) - - multi_generated = [] + + multi_generated = 0 diff_logs_multi = [] for i, s in enumerate(valid_multi): - s['type'] = "multiagent" - s['id'] = f"{asset_name.replace(' ', '_').lower()}_multiagent_{len(all_scenarios)+1:02d}" - + s["type"] = "multiagent" + s["id"] = f"{asset_name.replace(' ', '_').lower()}_multiagent_{len(all_scenarios)+1:02d}" + if i in changed_indices_multi: - diff_logs_multi.append(_format_diff(s['id'], multi_scenarios[i], s)) - - try: - all_scenarios.append(Scenario(**s)) - multi_generated.append(s) - except Exception as e: - _log.warning(f"Skipping incorrectly formatted multiagent scenario dict: {s} - Error: {e}") + diff_logs_multi.append(_format_diff(s["id"], multi_scenarios[i], s)) + + all_scenarios.append(Scenario(**s)) + multi_generated += 1 if diff_logs_multi: self._write_log("multiagent_validation_changes", "\n\n".join(diff_logs_multi)) @@ -239,127 +217,102 @@ async def run(self, asset_name: str, num_scenarios: int = 50) -> list[Scenario]: return all_scenarios async def build_asset_profile(self, asset_name: str, server_desc: dict) -> AssetProfile: - metadata = {} - - # 1.1 Generate targeted queries - query_prompt = RESEARCH_QUERY_GENERATOR_PROMPT.format(asset_name=asset_name) - self._write_log("research_queries_prompt", query_prompt) if self.show_workflow: - _print_step("researcher_queries", f"Generating ArXiv search strategy for {asset_name}...") - - query_response = self.llm.generate(query_prompt) - self._write_log("research_queries_response", query_response) - queries, err = _parse_llm_json(query_response) - - if not queries or not isinstance(queries, list): - _log.warning(f"Failed to generate queries, falling back to simple asset name: {asset_name}") - queries = [f"{asset_name} maintenance sensors", f"{asset_name} failure modes reliability"] + _print_step("researcher_queries", f"Planning bounded ArXiv retrieval for {asset_name}...") + + evidence_bundle = retrieve_asset_evidence( + asset_name=asset_name, + server_desc=server_desc, + llm=self.llm, + log_writer=self._write_log, + ) if self.show_workflow: - _print_step("arxiv_search_plan", f"Researcher generated {len(queries)} targeted queries", details=json.dumps(queries, indent=2)) - - # 1.2 Fetch studies using multi-query logic - studies = fetch_arxiv_studies(queries, metadata_out=metadata) - - # Format a summary header with titles and links - header = f"Asset: {asset_name}\n" - header += f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n" - header += f"Total Entries: {len(metadata.get('results_summary', []))}\n\n" - header += "========================================\n" - header += " SOURCES (TITLES & PDF LINKS)\n" - header += "========================================\n" - for i, res in enumerate(metadata.get('results_summary', []), 1): - header += f"{i}. {res['title']}\n -> {res['url']}\n" - header += "========================================\n\n" - - self._write_log("arxiv_results", header + studies) - - if self.show_workflow: - status_summary = ", ".join(f"HTTP {s}" for s in metadata.get('status_codes', [])) - pdf_urls = metadata.get('pdf_urls', []) - query_to_pdf = metadata.get('query_to_pdf', {}) - - details = f"Queries: {len(queries)}\nStatus: {status_summary}\nReturned: {metadata.get('returned_entries', 0)} unique entries" - if query_to_pdf: - details += "\n\nQuery Results:" - for q, urls in query_to_pdf.items(): - details += f"\n - Q: \"{q}\"" - for u in urls: - details += f"\n -> {u}" - elif pdf_urls: - # Fallback if the mapping isn't populated for some reason - details += "\nFetched PDFs:\n" + "\n".join(f" - {u}" for u in pdf_urls) - - _print_step("arxiv_search_result", f"ArXiv Research phase complete", details=details) - + top_titles = "\n".join( + f" - {candidate.title} (judge_score={candidate.judge_score}/10)" + for candidate in evidence_bundle.candidates[:3] + ) or " - No ranked candidates" + details = ( + f"Canonical asset: {evidence_bundle.canonical_asset_name}\n" + f"Steps: {evidence_bundle.diagnostics.steps_run}\n" + f"Metadata requests: {evidence_bundle.diagnostics.metadata_requests}\n" + f"PDF requests: {evidence_bundle.diagnostics.pdf_requests}\n" + f"Cooldown: {evidence_bundle.diagnostics.cooldown_seconds:.1f}s\n" + f"Queries:\n" + + "\n".join(f" - {query}" for query in evidence_bundle.query_history) + + "\nTop Evidence:\n" + + top_titles + ) + if evidence_bundle.diagnostics.finish_reason: + details += f"\nFinish: {evidence_bundle.diagnostics.finish_reason}" + _print_step("arxiv_search_result", "ArXiv evidence retrieval complete", details=details) + tools_str = json.dumps(server_desc, indent=2) - + prompt = PROFILE_BUILDER_PROMPT.format( asset_name=asset_name, - arxiv_literature=studies, - tool_descriptions=tools_str + evidence_bundle_json=evidence_bundle.model_dump_json(indent=2), + tool_descriptions=tools_str, ) self._write_log("asset_profile_prompt", prompt) - + response = self.llm.generate(prompt) self._write_log("asset_profile_response", response) - parsed, parse_err = _parse_llm_json(response) - + parsed, parse_err = parse_llm_json(response) + if not parsed or not isinstance(parsed, dict): self._handle_parse_failure("build_profile", response, parse_err) raise RuntimeError(f"Critical failure: Could not construct AssetProfile for '{asset_name}'.") - else: - profile = AssetProfile(**parsed) - + profile = AssetProfile(**parsed) + if self.show_workflow: _print_step("build_profile", f"Successfully generated Asset Profile for '{asset_name}'.", profile.model_dump_json(indent=2)) - + self._write_log(f"asset_profile_{asset_name}_json", profile.model_dump_json(indent=2)) return profile async def allocate_budget(self, profile: AssetProfile, total: int = 50) -> ScenarioBudget: prompt = BUDGET_ALLOCATOR_PROMPT.format( total_scenarios=total, - asset_profile_json=profile.model_dump_json() + asset_profile_json=profile.model_dump_json(), ) self._write_log("budget_allocation_prompt", prompt) - + response = self.llm.generate(prompt) self._write_log("budget_allocation_response", response) - parsed, parse_err = _parse_llm_json(response) - + parsed, parse_err = parse_llm_json(response) + if not parsed or not isinstance(parsed, dict) or "allocation" not in parsed: self._handle_parse_failure("allocate_budget", response, parse_err) raise RuntimeError("Critical failure: Could not dynamically allocate scenario budget.") - else: - budget = ScenarioBudget( - total_scenarios=total, - allocation=parsed["allocation"], - reasoning=parsed.get("reasoning", "") - ) - + budget = ScenarioBudget( + total_scenarios=total, + allocation=parsed["allocation"], + reasoning=parsed.get("reasoning", ""), + ) + if self.show_workflow: details = f"Reasoning: {budget.reasoning}\n\nAllocation:\n" details += "\n".join(f" - {k}: {v}" for k, v in budget.allocation.items()) _print_step("allocate_budget", f"Successfully allocated {total} scenarios across agents.", details=details) - + return budget def generate_single_agent_scenarios(self, subagent: str, count: int, profile: AssetProfile, server_desc: dict) -> list[dict]: few_shots = fetch_hf_fewshot(split="scenarios", target_type=subagent, fallback_if_missing=True) few_shots_str = json.dumps(few_shots[:2], indent=2) - + category_map = { "iot": "Data Query, Knowledge Query", "fmsr": "Knowledge Query", "tsfm": "Knowledge Query, Anomaly Detection Query, Tuning Query, Inference Query, Complex Query", - "wo": "Decision Support, Prediction, Knowledge Query" + "wo": "Decision Support, Prediction, Knowledge Query", } category_options = category_map.get(subagent.lower(), "Knowledge Query") example_category = category_options.split(",")[0].strip() - + subagent_tools = json.dumps(server_desc.get(subagent, {}), indent=2) - + prompt = SCENARIO_GENERATOR_PROMPT.format( count=count, subagent_name=subagent, @@ -368,14 +321,14 @@ def generate_single_agent_scenarios(self, subagent: str, count: int, profile: As tool_definitions=subagent_tools, few_shot_examples=few_shots_str, category_options=category_options, - example_category=example_category + example_category=example_category, ) self._write_log(f"{subagent}_generation_prompt", prompt) - + response = self.llm.generate(prompt) self._write_log(f"{subagent}_generation_response", response) - parsed, parse_err = _parse_llm_json(response) - + parsed, parse_err = parse_llm_json(response) + if isinstance(parsed, list): return parsed self._handle_parse_failure(f"generate_{subagent}", response, parse_err) @@ -384,23 +337,23 @@ def generate_single_agent_scenarios(self, subagent: str, count: int, profile: As def validate_and_repair(self, scenarios: list[dict], profile: AssetProfile) -> list[dict]: if not scenarios: return [] - + prompt = VALIDATE_REPAIR_PROMPT.format( asset_profile_json=profile.model_dump_json(), - input_scenarios_json=json.dumps(scenarios, indent=2) + input_scenarios_json=json.dumps(scenarios, indent=2), ) self._write_log("validate_repair_prompt", prompt) - + response = self.llm.generate(prompt) self._write_log("validate_repair_response", response) - parsed, parse_err = _parse_llm_json(response) - + parsed, parse_err = parse_llm_json(response) + if isinstance(parsed, list): if len(parsed) > len(scenarios): _log.warning( - "validate_and_repair returned %d scenarios but only %d were submitted — " - "truncating to prevent count inflation.", - len(parsed), len(scenarios), + "validate_and_repair returned %d scenarios but only %d were submitted; truncating extras.", + len(parsed), + len(scenarios), ) parsed = parsed[:len(scenarios)] return parsed @@ -409,28 +362,29 @@ def validate_and_repair(self, scenarios: list[dict], profile: AssetProfile) -> l def construct_multiagent_scenarios(self, count: int, single_agents: list[dict], profile: AssetProfile, server_desc: dict) -> list[dict]: all_tools = json.dumps(server_desc, indent=2) - + prompt = MULTIAGENT_COMBINER_PROMPT.format( count=count, asset_name=profile.asset_name, asset_profile_json=profile.model_dump_json(), mcp_function_definitions=all_tools, - single_agent_scenarios_json=json.dumps(single_agents[:10], indent=2) + single_agent_scenarios_json=json.dumps(single_agents[:10], indent=2), ) self._write_log("multiagent_combiner_prompt", prompt) - + response = self.llm.generate(prompt) self._write_log("multiagent_combiner_response", response) - parsed, parse_err = _parse_llm_json(response) - + parsed, parse_err = parse_llm_json(response) + if isinstance(parsed, list): return parsed self._handle_parse_failure("multiagent_combiner", response, parse_err) return [] + def main(): load_dotenv() - + parser = argparse.ArgumentParser(description="Scenario Generator for AssetOpsBench") parser.add_argument("asset_name", help="Name of the asset (e.g. 'Chiller' or 'Wind Turbine')") parser.add_argument("--model-id", default=_DEFAULT_MODEL, help="Model ID for LiteLLM") @@ -438,13 +392,12 @@ def main(): parser.add_argument("--num-scenarios", type=int, default=50, help="Total number of scenarios to generate") parser.add_argument("--show-workflow", action="store_true", help="Show intermediate pipeline steps in the console") parser.add_argument("--log", action="store_true", help="Dump raw prompts and results to a log directory") - + args = parser.parse_args() - - # We reduce the noise in generic logger when we are controlling console formatting ourselves + level = logging.WARNING if args.show_workflow else logging.INFO logging.basicConfig(level=level, format="%(asctime)s %(levelname)s %(message)s") - + log_dir = None if args.log: timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") @@ -453,27 +406,25 @@ def main(): os.makedirs(log_dir, exist_ok=True) agent = ScenarioGeneratorAgent(model_id=args.model_id, show_workflow=args.show_workflow, log_dir=log_dir) - + try: final_scenarios = asyncio.run(agent.run(args.asset_name, num_scenarios=args.num_scenarios)) - except (RuntimeError, Exception) as e: - print(f"\n[FATAL ERROR] {e}") + except Exception as exc: + print(f"\n[FATAL ERROR] {exc}") sys.exit(1) - - # Check if we actually generated anything (for the final summary) + if not final_scenarios: print("\n[WARNING] No scenarios were successfully generated and validated.") - sys.exit(0) # Not necessarily a crash, but we didn't get results + sys.exit(0) with open(args.output, "w") as f: json.dump([s.to_dict() for s in final_scenarios], f, indent=2) - - # No explicit redundant success print if we already printed a summary in show-workflow + if not args.show_workflow: print(f"Success! Generated {len(final_scenarios)} scenarios at {args.output}") else: print(f"Scenarios saved to {args.output}") + if __name__ == "__main__": main() - diff --git a/src/scenarios/models.py b/src/scenarios/models.py index 05675bb7b..0d639e008 100644 --- a/src/scenarios/models.py +++ b/src/scenarios/models.py @@ -7,32 +7,74 @@ class AssetProfile(BaseModel): description: str sensor_mappings: dict[str, str] = Field(default_factory=dict) known_failure_modes: list[str] = Field(default_factory=list) - relevant_tools: dict[str, list[dict]] = Field(default_factory=dict) + relevant_tools: dict[str, list[dict[str, str]]] = Field(default_factory=dict) iso_standards: list[str] = Field(default_factory=list) +class RetrievalAction(BaseModel): + action: str = "search" + reason: str = "" + canonical_asset_name: str + queries: list[str] = Field(default_factory=list) + selected_ids: list[str] = Field(default_factory=list) + + +class EvidenceCandidate(BaseModel): + arxiv_id: str + title: str + summary: str + query: str + pdf_url: str | None = None + published: str | None = None + judge_score: int = 0 + judge_reason: str = "" + + +class EvidenceSnippet(BaseModel): + arxiv_id: str + title: str + url: str | None = None + source: str + text: str + + +class RetrievalDiagnostics(BaseModel): + steps_run: int = 1 + finish_reason: str = "" + metadata_requests: int = 0 + pdf_requests: int = 0 + cooldown_seconds: float = 3.1 + + +class EvidenceBundle(BaseModel): + asset_name: str + canonical_asset_name: str + query_history: list[str] = Field(default_factory=list) + selected_candidate_ids: list[str] = Field(default_factory=list) + candidates: list[EvidenceCandidate] = Field(default_factory=list) + snippets: list[EvidenceSnippet] = Field(default_factory=list) + diagnostics: RetrievalDiagnostics = Field(default_factory=RetrievalDiagnostics) + + class ScenarioBudget(BaseModel): total_scenarios: int = 50 allocation: dict[str, int] = Field(default_factory=dict) reasoning: str = "" - def __init__(self, **data): - super().__init__(**data) + def model_post_init(self, __context: Any) -> None: if not self.allocation: - # Equal distribution as a default types = ["iot", "fmsr", "tsfm", "wo", "multiagent"] per_type = self.total_scenarios // len(types) remainder = self.total_scenarios % len(types) - + self.allocation = {t: per_type for t in types} - # Add remainder to first type if remainder > 0: self.allocation[types[0]] += remainder class Scenario(BaseModel): id: str - type: str # e.g., iot, fmsr, wo, multiagent + type: str text: str category: str characteristic_form: str diff --git a/src/scenarios/prompts.py b/src/scenarios/prompts.py index 7e0b205bc..e04c73e16 100644 --- a/src/scenarios/prompts.py +++ b/src/scenarios/prompts.py @@ -1,12 +1,12 @@ PROFILE_BUILDER_PROMPT = """\ You are an expert Reliability Engineer preparing an Asset Profile. -Given the Asset Name, some recent literature/studies from ArXiv, the available subagents and their tools, and generic knowledge of ISO 55000 / ISO 14224 terms, create an Asset Profile in JSON format. +Given the Asset Name, a structured evidence bundle from ArXiv, the available subagents and their tools, and generic knowledge of ISO 55000 / ISO 14224 terms, create an Asset Profile in JSON format. Asset Name: {asset_name} -Recent ArXiv Literature: -{arxiv_literature} +Structured Evidence Bundle: +{evidence_bundle_json} Available Subagent Tools: {tool_descriptions} @@ -15,6 +15,13 @@ Produce a JSON matching the following schema exactly. CRITICAL: Output ONLY the raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. +Rules: +- Treat the evidence bundle as the primary source of truth. +- Only include sensor mappings, failure modes, and standards that are clearly supported by the evidence snippets or are directly aligned with the available tools. +- If evidence is sparse, stay conservative and generic rather than inventing highly specific details. +- Avoid ML-architecture concepts unless they are clearly about monitoring or operating the physical asset itself. +- The asset profile must represent the physical industrial asset class itself, not surrounding digital, grid, networking, cyber, or facility infrastructure. + {{ "asset_name": "{asset_name}", "description": "Short summary of the asset (1-2 sentences).", @@ -104,36 +111,104 @@ ] """ -RESEARCH_QUERY_GENERATOR_PROMPT = """\ -You are a Technical Researcher for AssetOps. +RETRIEVAL_QUERY_PLAN_PROMPT = """\ +You are a bounded ReAct retrieval agent for industrial asset research. + +You do not call ArXiv directly. The host executes searches for you and returns metadata summaries. +At each step, decide whether to search again or finish with the best candidates found so far. -Given an Asset Name, generate exactly 3 high-quality academic search queries for ArXiv. +Asset Name: {asset_name} +Current Step: {step_number} of {max_steps} +Current Canonical Asset Name: {canonical_asset_name} -IMPORTANT: -- First, convert the asset into its **canonical academic term** (e.g., "smart grid transformer" → "power transformer"). -- Use terminology commonly found in engineering research papers, NOT operational phrasing. +Available Subagent Tools: +{tool_descriptions} -Focus Areas: -1. Condition monitoring and diagnostics (use terms like "condition monitoring", "diagnostics", "measurement"). -2. Faults and failures (use terms like "fault diagnosis", "failure analysis", "failure mechanisms"). -3. Reliability and prognostics (use terms like "reliability", "prognostics", "degradation modeling"). +Previous Queries: +{previous_queries} + +Current Top Judged Results: +{current_results_summary} + +Return ONLY a raw JSON object in this shape: +{{ + "action": "search" or "finish", + "reason": "brief explanation", + "canonical_asset_name": "canonical industrial equipment term", + "queries": ["1 to 2 new ArXiv queries if action=search, otherwise []"], + "selected_ids": ["preferred arxiv ids if action=finish, otherwise []"] +}} Constraints: -- Keep queries SHORT (3–6 keywords max). -- Do NOT include too many AND/OR operators. -- Avoid generic words like "sensor", "maintenance" unless paired with academic terms. -- Prefer specific technical phrases (e.g., "dissolved gas analysis", "partial discharge"). +- Keep the process generic for any industrial asset class. +- An industrial asset class is a physical piece of equipment or subsystem that is monitored, maintained, and can fail. +- Examples of industrial asset classes: chiller, air handling unit, pump, motor, power transformer. +- Context words like smart grid, plant, facility, building, line, or substation describe the deployment environment, not the asset class itself. +- If the asset name is ambiguous, resolve it toward the physical equipment noun phrase, not an ML concept and not a broader system context. +- Normalize queries toward the physical equipment itself. For example, "smart grid transformer" should be treated as a transformer or power transformer in a smart-grid context, not as the smart grid itself. +- Queries should focus on physical asset monitoring, diagnostics, failures, maintenance, condition assessment, degradation, or reliability. +- Prefer equipment-specific queries such as "power transformer condition monitoring" or "power transformer fault diagnosis". +- Avoid broad or ambiguous queries like "transformer reliability" or "smart grid transformer monitoring" when a more equipment-specific query is possible. +- Do not drift into smart-grid cyberattacks, communications, networking, markets, data architecture, control systems, or generic ML "Transformer" papers. +- When action is "search", propose 1 to 2 short queries only. +- When action is "finish", prefer the strongest already judged metadata and do not propose new queries. +- Only finish early if the current top results already contain at least two clearly physical-asset-focused papers. +- Do not use advanced boolean syntax. +- Do not invent arxiv ids that are not present in Current Top Judged Results. +- Output ONLY raw JSON. +""" + +RETRIEVAL_METADATA_JUDGE_PROMPT = """\ +You are a relevance judge for ArXiv metadata retrieved for industrial asset scenario generation. + +Your task is to score how useful each metadata entry is for building an asset profile for the physical industrial asset below. +Judge from the title and summary only. Asset Name: {asset_name} +Canonical Asset Name: {canonical_asset_name} -Output ONLY a JSON array of 3 strings. -CRITICAL: Do NOT include markdown code blocks, Python code, or any conversational preamble. +Metadata Entries: +{metadata_entries_json} + +Return ONLY a raw JSON array. One object per metadata entry: +[ + {{ + "arxiv_id": "entry id", + "score_1_to_10": 8, + "reason": "short reason" + }} +] + +Scoring guide: +- Core question: would this paper help define the physical asset class itself and its maintenance, monitoring, sensing, degradation, diagnostics, or failure behavior? +- High score when the paper is clearly about the physical asset and would help populate sensor mappings, known failure modes, relevant tools, maintenance workflows, or standards. +- 9-10: directly about the physical asset and clearly useful for condition monitoring, fault diagnosis, degradation, insulation or thermal behavior, reliability, maintenance, standards, or physical measurements +- 6-8: relevant to the physical asset but somewhat indirect, narrower than ideal, or missing strong maintenance or diagnostics detail +- 3-5: mixed relevance, generic system context, or only weakly connected to the physical asset itself +- 1-2: not about the physical asset itself, clearly about a different asset family, or dominated by unrelated ML/system context +- Low-score examples: + - smart-grid cyberattacks or false-data-injection papers + - communications or networking papers + - grid data architecture, market, or control-system papers + - generic ML "Transformer" architecture papers + - papers about other asset families such as rotating machinery unless the target asset is actually that equipment +- High-score examples: + - condition monitoring + - fault diagnosis + - degradation, insulation, or thermal behavior + - reliability, maintenance, or standards + - sensors and measurements for the physical equipment +- In every reason, explicitly include either the phrase "physical asset focused" or the phrase "not physical asset focused". +- If the paper is off-target, say why in physical-asset terms. + +Be strict about generic smart-grid, networking, cybersecurity, market, or ML-architecture papers when the asset is a physical piece of equipment. +Output ONLY raw JSON. """ BUDGET_ALLOCATOR_PROMPT = """\ You are an expert Scenario Strategy Consultant for AssetOps Bench. -Given an Asset Profile (derived from technical literature) and a total number of scenarios to generate ({{total_scenarios}}), your task is to allocate this budget across the following five categories: +Given an Asset Profile (derived from technical literature) and a total number of scenarios to generate ({total_scenarios}), your task is to allocate this budget across the following five categories: 1. iot: Focusing on sensor data and basic telemetry. 2. fmsr: Focusing on failure modes and structural reliability. 3. tsfm: Focusing on time-series analysis and technical maintenance. diff --git a/src/scenarios/retrieval.py b/src/scenarios/retrieval.py new file mode 100644 index 000000000..fcfa27cb5 --- /dev/null +++ b/src/scenarios/retrieval.py @@ -0,0 +1,878 @@ +from __future__ import annotations + +import io +import json +import logging +import re +import ssl +import time +import urllib.error +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET +from typing import Callable + +from llm import LLMBackend + +from .models import ( + EvidenceBundle, + EvidenceCandidate, + EvidenceSnippet, + RetrievalAction, + RetrievalDiagnostics, +) +from .prompts import RETRIEVAL_METADATA_JUDGE_PROMPT, RETRIEVAL_QUERY_PLAN_PROMPT +from .utils import parse_llm_json + +_log = logging.getLogger(__name__) + +_ARXIV_COOLDOWN_SECONDS = 3.1 +_ARXIV_BASE_URL = "http://export.arxiv.org/api/query?" +_ARXIV_HEADERS = {"User-Agent": "AssetOpsBench/1.0 (mailto:admin@example.com)"} +_MAX_STEPS = 5 +_MAX_QUERIES_PER_STEP = 2 +_MAX_METADATA_RESULTS = 6 +_MAX_CANDIDATE_POOL = 8 +_TOP_PDF_DOWNLOADS = 3 +_MAX_PDF_PAGES = 5 +_MAX_SNIPPETS_PER_DOC = 3 + +_STOPWORDS = { + "a", + "an", + "and", + "asset", + "class", + "equipment", + "for", + "in", + "industrial", + "machine", + "of", + "on", + "or", + "plant", + "system", + "the", + "to", +} + +_DIAGNOSTIC_KEYWORDS = [ + "condition monitoring", + "diagnostic", + "diagnostics", + "fault", + "fault diagnosis", + "failure", + "failure analysis", + "degradation", + "health", + "inspection", + "maintenance", + "monitoring", + "prognostic", + "prognostics", + "reliability", +] + +_STANDARD_KEYWORDS = [ + "iec", + "ieee", + "iso", + "condition assessment", + "maintenance strategy", + "reliability centered maintenance", +] + +_ML_NEGATIVE_KEYWORDS = [ + "attention mechanism", + "bert", + "deep learning", + "federated learning", + "foundation model", + "language model", + "llm", + "mamba", + "neural network", + "nlp", + "time series transformer", + "transformer architecture", + "vision transformer", +] + +_OFF_TARGET_KEYWORDS = [ + "communications", + "control system", + "control systems", + "cyber attack", + "cyber security", + "cyberattack", + "cybersecurity", + "data architecture", + "false data injection", + "market", + "networking", + "smart grid", +] + +_PHYSICAL_REASON_MARKERS = [ + "physical asset focused", + "physical equipment focused", +] + +_OFF_TARGET_REASON_MARKERS = [ + "not physical asset focused", + "communications", + "control system", + "cyberattack", + "cybersecurity", + "data architecture", + "generic ml", + "indirect relevance", + "market", + "networking", + "not directly", + "not entirely physical asset focused", + "other asset family", + "somewhat indirect", + "somewhat relevant", + "smart-grid", + "system paper", + "transformer architecture", +] + + +def _normalise_text(text: str) -> str: + return re.sub(r"\s+", " ", text.strip().lower()) + + +def _tokenise(text: str) -> list[str]: + return re.findall(r"[a-z0-9]+", text.lower()) + + +def _default_canonical_asset_name(asset_name: str) -> str: + return _normalise_text(asset_name.replace("_", " ")) + + +def _unique_preserve_order(items: list[str]) -> list[str]: + seen: set[str] = set() + ordered: list[str] = [] + for item in items: + clean = item.strip() + if clean and clean not in seen: + ordered.append(clean) + seen.add(clean) + return ordered + + +def _asset_tokens(asset_name: str) -> list[str]: + return [ + token + for token in _tokenise(asset_name) + if len(token) > 2 and token not in _STOPWORDS + ] + + +class _ArxivExecutor: + """Single-entry executor that enforces a cooldown before every ArXiv request.""" + + def __init__(self, cooldown_seconds: float = _ARXIV_COOLDOWN_SECONDS) -> None: + self.cooldown_seconds = cooldown_seconds + self._last_request_at: float | None = None + self.metadata_requests = 0 + self.pdf_requests = 0 + self._ctx = ssl.create_default_context() + self._ctx.check_hostname = False + self._ctx.verify_mode = ssl.CERT_NONE + + def _wait_for_cooldown(self) -> None: + if self._last_request_at is None: + return + elapsed = time.monotonic() - self._last_request_at + if elapsed < self.cooldown_seconds: + time.sleep(self.cooldown_seconds - elapsed) + + def _open(self, url: str, timeout: int) -> bytes: + self._wait_for_cooldown() + req = urllib.request.Request(url, headers=_ARXIV_HEADERS) + with urllib.request.urlopen(req, timeout=timeout, context=self._ctx) as response: + data = response.read() + self._last_request_at = time.monotonic() + return data + + def fetch_metadata( + self, + query: str, + max_results: int = _MAX_METADATA_RESULTS, + ) -> list[EvidenceCandidate]: + safe_query = urllib.parse.quote(query) + url = f"{_ARXIV_BASE_URL}search_query={safe_query}&start=0&max_results={max_results}" + self.metadata_requests += 1 + + try: + data = self._open(url, timeout=10) + except urllib.error.HTTPError as exc: + _log.warning("HTTP error fetching ArXiv metadata for %r: %s", query, exc) + return [] + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch ArXiv metadata for %r: %s", query, exc) + return [] + + try: + root = ET.fromstring(data) + except ET.ParseError as exc: + _log.warning("Failed to parse ArXiv XML for %r: %s", query, exc) + return [] + + ns = {"atom": "http://www.w3.org/2005/Atom"} + candidates: list[EvidenceCandidate] = [] + for entry in root.findall("atom:entry", ns): + raw_id = entry.findtext("atom:id", default="", namespaces=ns).strip() + arxiv_id = raw_id.rsplit("/", 1)[-1] if raw_id else "" + title = entry.findtext("atom:title", default="No Title", namespaces=ns) + summary = entry.findtext("atom:summary", default="No Summary", namespaces=ns) + published = entry.findtext("atom:published", default="", namespaces=ns).strip() or None + + pdf_url = None + for link in entry.findall("atom:link", ns): + href = link.attrib.get("href") + if link.attrib.get("title") == "pdf" or link.attrib.get("type") == "application/pdf": + pdf_url = href + if pdf_url and not pdf_url.endswith(".pdf"): + pdf_url += ".pdf" + break + + candidates.append( + EvidenceCandidate( + arxiv_id=arxiv_id or title.strip(), + title=title.strip().replace("\n", " "), + summary=summary.strip().replace("\n", " "), + query=query, + pdf_url=pdf_url, + published=published, + ) + ) + return candidates + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: + self.pdf_requests += 1 + try: + pdf_bytes = self._open(pdf_url, timeout=15) + from pypdf import PdfReader + + reader = PdfReader(io.BytesIO(pdf_bytes)) + pages: list[str] = [] + for index, page in enumerate(reader.pages): + if index >= max_pages: + break + page_text = page.extract_text() + if page_text: + pages.append(page_text) + return "\n".join(pages) + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch or parse ArXiv PDF %s: %s", pdf_url, exc) + return "" + + +def _default_queries(canonical_asset_name: str) -> list[str]: + canonical = _default_canonical_asset_name(canonical_asset_name) + return [ + f"{canonical} condition monitoring", + f"{canonical} fault diagnosis", + ] + + +def _render_queries(queries: list[str]) -> str: + return "\n".join(f"- {query}" for query in queries) if queries else "(none yet)" + + +def _render_results_summary(candidates: list[EvidenceCandidate]) -> str: + if not candidates: + return "(no judged results yet)" + lines = [] + for candidate in candidates[:5]: + lines.append( + f"- [{candidate.judge_score}/10] {candidate.arxiv_id} | {candidate.title} | {candidate.judge_reason}" + ) + return "\n".join(lines) + + +def _summarise_metadata_for_judge(candidates: list[EvidenceCandidate]) -> str: + payload = [ + { + "arxiv_id": candidate.arxiv_id, + "title": candidate.title, + "summary": candidate.summary, + "query": candidate.query, + "published": candidate.published, + } + for candidate in candidates + ] + return json.dumps(payload, indent=2, ensure_ascii=True) + + +def _coerce_action( + parsed: object, + asset_name: str, + canonical_asset_name: str, + step_number: int, + has_candidates: bool, +) -> RetrievalAction: + fallback_canonical = canonical_asset_name or _default_canonical_asset_name(asset_name) + fallback_queries = _default_queries(fallback_canonical) + + if not isinstance(parsed, dict): + if has_candidates and step_number > 1: + return RetrievalAction( + action="finish", + reason="Fallback finish because the retrieval action could not be parsed.", + canonical_asset_name=fallback_canonical, + ) + return RetrievalAction( + action="search", + reason="Fallback search because the retrieval action could not be parsed.", + canonical_asset_name=fallback_canonical, + queries=fallback_queries, + ) + + action = str(parsed.get("action", "search")).strip().lower() + if action not in {"search", "finish"}: + action = "finish" if has_candidates and step_number > 1 else "search" + + action_obj = RetrievalAction( + action=action, + reason=str(parsed.get("reason", "")).strip() or "No reason provided.", + canonical_asset_name=str(parsed.get("canonical_asset_name") or fallback_canonical).strip() or fallback_canonical, + queries=[ + str(query).strip() + for query in parsed.get("queries", []) + if str(query).strip() + ][:_MAX_QUERIES_PER_STEP], + selected_ids=[ + str(arxiv_id).strip() + for arxiv_id in parsed.get("selected_ids", []) + if str(arxiv_id).strip() + ], + ) + + if action_obj.action == "search" and not action_obj.queries: + action_obj.queries = fallback_queries + + if action_obj.action == "finish": + action_obj.queries = [] + + return action_obj + + +def _judge_fallback( + candidate: EvidenceCandidate, + canonical_asset_name: str, +) -> tuple[int, str]: + text = _normalise_text(f"{candidate.title} {candidate.summary}") + asset_phrase = _normalise_text(canonical_asset_name) + asset_tokens = _asset_tokens(canonical_asset_name) + + score = 2 + reasons: list[str] = [] + + if asset_phrase and asset_phrase in text: + score += 4 + reasons.append("physical asset focused; mentions canonical asset") + else: + hits = sum(1 for token in asset_tokens if token in text) + if hits: + score += min(3, hits) + reasons.append("physical asset focused; partial asset overlap") + + if any(keyword in text for keyword in _DIAGNOSTIC_KEYWORDS): + score += 2 + reasons.append("physical asset focused; diagnostics or reliability terms") + + if any(keyword in text for keyword in _OFF_TARGET_KEYWORDS): + score -= 3 + reasons.append("not physical asset focused; system, cyber, networking, or smart-grid context") + + if any(keyword in text for keyword in _ML_NEGATIVE_KEYWORDS): + score -= 2 + reasons.append("not physical asset focused; contains generic ML framing") + + score = max(1, min(10, score)) + if not reasons: + reasons.append("not physical asset focused; fallback metadata relevance estimate") + reason = "; ".join(reasons) + return score, reason + + +def _judge_metadata_batch( + asset_name: str, + canonical_asset_name: str, + candidates: list[EvidenceCandidate], + llm: LLMBackend, +) -> list[EvidenceCandidate]: + if not candidates: + return [] + + prompt = RETRIEVAL_METADATA_JUDGE_PROMPT.format( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + metadata_entries_json=_summarise_metadata_for_judge(candidates), + ) + response = llm.generate(prompt) + parsed, _ = parse_llm_json(response) + + scored_by_id: dict[str, tuple[int, str]] = {} + if isinstance(parsed, list): + for entry in parsed: + if not isinstance(entry, dict): + continue + arxiv_id = str(entry.get("arxiv_id", "")).strip() + if not arxiv_id: + continue + raw_score = entry.get("score_1_to_10", 0) + try: + score = int(raw_score) + except (TypeError, ValueError): + score = 0 + score = max(1, min(10, score)) if score else 0 + reason = str(entry.get("reason", "")).strip() or "No judge reason provided." + if score: + scored_by_id[arxiv_id] = (score, reason) + + judged: list[EvidenceCandidate] = [] + for candidate in candidates: + score_reason = scored_by_id.get(candidate.arxiv_id) + if score_reason is None: + score_reason = _judge_fallback(candidate, canonical_asset_name) + candidate.judge_score = score_reason[0] + candidate.judge_reason = score_reason[1] + judged.append(candidate) + return judged + + +def _merge_pool( + pool: dict[str, EvidenceCandidate], + judged_candidates: list[EvidenceCandidate], +) -> None: + for candidate in judged_candidates: + existing = pool.get(candidate.arxiv_id) + if existing is None or candidate.judge_score > existing.judge_score: + pool[candidate.arxiv_id] = candidate + + +def _sorted_candidates(pool: dict[str, EvidenceCandidate]) -> list[EvidenceCandidate]: + return sorted( + pool.values(), + key=lambda candidate: (candidate.judge_score, candidate.title.lower()), + reverse=True, + ) + + +def _fallback_retry_queries( + canonical_asset_name: str, + query_history: list[str], +) -> list[str]: + canonical = _default_canonical_asset_name(canonical_asset_name) + candidates = [ + f"{canonical} condition monitoring", + f"{canonical} fault diagnosis", + f"{canonical} condition assessment", + f"{canonical} maintenance", + f"{canonical} degradation", + f"{canonical} physical measurements", + ] + return [ + query + for query in _unique_preserve_order(candidates) + if query not in query_history + ][:_MAX_QUERIES_PER_STEP] + + +def _candidate_reason_flags(reason: str) -> tuple[bool, bool]: + normalized = _normalise_text(reason) + is_off_target = any(marker in normalized for marker in _OFF_TARGET_REASON_MARKERS) + is_physical = ( + not is_off_target + and any(marker in normalized for marker in _PHYSICAL_REASON_MARKERS) + ) + return is_physical, is_off_target + + +def _candidate_focus_label(candidate: EvidenceCandidate) -> str: + is_physical, is_off_target = _candidate_reason_flags(candidate.judge_reason) + if candidate.judge_score >= 8 and is_physical: + return "accepted: physical asset focused" + if is_off_target or candidate.judge_score <= 4: + return "rejected: not physical asset focused" + return "mixed: uncertain physical asset focus" + + +def _evaluate_candidate_pool(candidates: list[EvidenceCandidate]) -> tuple[bool, str]: + if not candidates: + return False, "No judged candidates are available yet." + + top_candidates = candidates[:5] + strong_physical = 0 + off_target = 0 + + for candidate in top_candidates: + is_physical, is_off_target = _candidate_reason_flags(candidate.judge_reason) + if candidate.judge_score >= 8 and is_physical: + strong_physical += 1 + elif is_off_target or candidate.judge_score <= 4: + off_target += 1 + + if strong_physical < 2: + return ( + False, + f"Only {strong_physical} top candidates are clearly physical asset focused; need at least 2 before finishing early.", + ) + + if off_target >= strong_physical: + return ( + False, + "Top candidates are still dominated by system, cyber, networking, or ML-context papers.", + ) + + return ( + True, + f"Top pool contains {strong_physical} clearly physical-asset-focused papers.", + ) + + +def _extract_snippet_text(text: str, canonical_asset_name: str) -> str: + compact = re.sub(r"\s+", " ", text).strip() + if not compact: + return "" + + keywords = _unique_preserve_order( + [canonical_asset_name, *_DIAGNOSTIC_KEYWORDS, *_STANDARD_KEYWORDS] + ) + lowered = compact.lower() + windows: list[tuple[int, int]] = [] + for keyword in keywords: + norm = _normalise_text(keyword) + if not norm: + continue + idx = lowered.find(norm) + if idx == -1: + continue + start = max(0, idx - 220) + end = min(len(compact), idx + len(norm) + 220) + windows.append((start, end)) + if len(windows) >= _MAX_SNIPPETS_PER_DOC: + break + + if not windows: + return compact[:900] + + snippets = [compact[start:end].strip() for start, end in windows if compact[start:end].strip()] + return "\n...\n".join(snippets[:_MAX_SNIPPETS_PER_DOC]) + + +def _select_final_candidates( + pool: dict[str, EvidenceCandidate], + preferred_ids: list[str], +) -> tuple[list[EvidenceCandidate], list[str]]: + ordered_pool = _sorted_candidates(pool) + ordered_by_id = {candidate.arxiv_id: candidate for candidate in ordered_pool} + + selected: list[EvidenceCandidate] = [] + selected_ids: list[str] = [] + for arxiv_id in preferred_ids: + candidate = ordered_by_id.get(arxiv_id) + if candidate and arxiv_id not in selected_ids: + selected.append(candidate) + selected_ids.append(arxiv_id) + + for candidate in ordered_pool: + if candidate.arxiv_id in selected_ids: + continue + selected.append(candidate) + selected_ids.append(candidate.arxiv_id) + if len(selected) >= _TOP_PDF_DOWNLOADS: + break + + return selected[:_TOP_PDF_DOWNLOADS], selected_ids[:_TOP_PDF_DOWNLOADS] + + +def _render_step_log( + step_number: int, + action: RetrievalAction, + new_queries: list[str], + fetched_candidates: list[EvidenceCandidate], + pool: dict[str, EvidenceCandidate], + canonical_asset_name: str, +) -> str: + lines = [ + f"Step: {step_number}/{_MAX_STEPS}", + f"Action: {action.action}", + f"Canonical Asset: {canonical_asset_name}", + f"Reason: {action.reason}", + "", + "Queries:", + ] + if new_queries: + lines.extend(f"- {query}" for query in new_queries) + else: + lines.append("(no new queries)") + + lines.extend(["", "Fetched Metadata:"]) + if fetched_candidates: + for candidate in fetched_candidates: + lines.append( + f"- [{candidate.judge_score}/10] {candidate.title}" + ) + lines.append(f" id: {candidate.arxiv_id}") + lines.append(f" query: {candidate.query}") + lines.append(f" assessment: {_candidate_focus_label(candidate)}") + lines.append(f" reason: {candidate.judge_reason}") + else: + lines.append("(no metadata fetched)") + + lines.extend(["", "Current Top Candidates:"]) + top_candidates = _sorted_candidates(pool)[:5] + if top_candidates: + for candidate in top_candidates: + lines.append( + f"- [{candidate.judge_score}/10] {candidate.arxiv_id} | {candidate.title}" + ) + lines.append(f" assessment: {_candidate_focus_label(candidate)}") + lines.append(f" reason: {candidate.judge_reason}") + else: + lines.append("(no judged candidates in pool)") + + focused, focus_reason = _evaluate_candidate_pool(top_candidates) + lines.extend( + [ + "", + f"Physical Asset Focused: {'yes' if focused else 'no'}", + f"Focus Summary: {focus_reason}", + ] + ) + + return "\n".join(lines) + + +def _render_final_log( + bundle: EvidenceBundle, + selected_candidates: list[EvidenceCandidate], +) -> str: + focused, focus_reason = _evaluate_candidate_pool(bundle.candidates) + lines = [ + f"Asset: {bundle.asset_name}", + f"Canonical Asset: {bundle.canonical_asset_name}", + f"Steps Run: {bundle.diagnostics.steps_run}", + f"Finish Reason: {bundle.diagnostics.finish_reason}", + f"Metadata Requests: {bundle.diagnostics.metadata_requests}", + f"PDF Requests: {bundle.diagnostics.pdf_requests}", + f"Cooldown: {bundle.diagnostics.cooldown_seconds:.1f}s", + f"Physical Asset Focused: {'yes' if focused else 'no'}", + "", + "Query History:", + ] + if bundle.query_history: + lines.extend(f"- {query}" for query in bundle.query_history) + else: + lines.append("(none)") + + lines.extend(["", "Top Judged Candidates:"]) + if bundle.candidates: + for candidate in bundle.candidates: + lines.append( + f"- [{candidate.judge_score}/10] {candidate.arxiv_id} | {candidate.title}" + ) + lines.append(f" query: {candidate.query}") + lines.append(f" reason: {candidate.judge_reason}") + else: + lines.append("(none)") + + lines.extend(["", "Selected PDFs:"]) + if selected_candidates: + for candidate in selected_candidates: + lines.append( + f"- {candidate.arxiv_id} | {candidate.title}" + ) + lines.append(f" pdf: {candidate.pdf_url or '(no pdf url)'}") + else: + lines.append("(none)") + + lines.extend(["", f"Final Pool Assessment: {focus_reason}"]) + + return "\n".join(lines) + + +def retrieve_asset_evidence( + asset_name: str, + server_desc: dict[str, str], + llm: LLMBackend, + log_writer: Callable[[str, str], None] | None = None, +) -> EvidenceBundle: + executor = _ArxivExecutor(cooldown_seconds=_ARXIV_COOLDOWN_SECONDS) + canonical_asset_name = _default_canonical_asset_name(asset_name) + query_history: list[str] = [] + candidate_pool: dict[str, EvidenceCandidate] = {} + finish_reason = "Finished after reaching the step limit." + selected_ids: list[str] = [] + steps_run = 0 + + for step_number in range(1, _MAX_STEPS + 1): + steps_run = step_number + current_summary = _render_results_summary(_sorted_candidates(candidate_pool)) + previous_queries = _render_queries(query_history) + prompt = RETRIEVAL_QUERY_PLAN_PROMPT.format( + asset_name=asset_name, + step_number=step_number, + max_steps=_MAX_STEPS, + canonical_asset_name=canonical_asset_name, + tool_descriptions=json.dumps(server_desc, indent=2), + previous_queries=previous_queries, + current_results_summary=current_summary, + ) + response = llm.generate(prompt) + parsed, _ = parse_llm_json(response) + action = _coerce_action( + parsed=parsed, + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + step_number=step_number, + has_candidates=bool(candidate_pool), + ) + canonical_asset_name = action.canonical_asset_name or canonical_asset_name + + if action.action == "finish" and candidate_pool: + pool_focused, focus_reason = _evaluate_candidate_pool( + _sorted_candidates(candidate_pool) + ) + if pool_focused or step_number == _MAX_STEPS: + finish_reason = ( + action.reason + if pool_focused + else f"{action.reason} Finalizing at step limit. {focus_reason}" + ) + selected_ids = action.selected_ids + if log_writer: + log_writer( + f"retrieval_step_{step_number:02d}", + _render_step_log( + step_number=step_number, + action=action, + new_queries=[], + fetched_candidates=[], + pool=candidate_pool, + canonical_asset_name=canonical_asset_name, + ), + ) + break + + action = RetrievalAction( + action="search", + reason=f"Early finish blocked. {focus_reason}", + canonical_asset_name=canonical_asset_name, + queries=_fallback_retry_queries(canonical_asset_name, query_history), + ) + + new_queries = [ + query + for query in _unique_preserve_order(action.queries) + if query not in query_history + ][: _MAX_QUERIES_PER_STEP] + + if action.action == "search" and not new_queries: + new_queries = _fallback_retry_queries(canonical_asset_name, query_history) + + if not new_queries: + if candidate_pool: + finish_reason = action.reason or "No new queries remained; keeping the best-so-far pool." + if log_writer: + log_writer( + f"retrieval_step_{step_number:02d}", + _render_step_log( + step_number=step_number, + action=RetrievalAction( + action="finish", + reason=finish_reason, + canonical_asset_name=canonical_asset_name, + ), + new_queries=[], + fetched_candidates=[], + pool=candidate_pool, + canonical_asset_name=canonical_asset_name, + ), + ) + break + new_queries = _default_queries(canonical_asset_name) + + query_history.extend(new_queries) + fetched_candidates: list[EvidenceCandidate] = [] + for query in new_queries: + fetched_candidates.extend(executor.fetch_metadata(query)) + + judged_candidates = _judge_metadata_batch( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + candidates=fetched_candidates, + llm=llm, + ) + _merge_pool(candidate_pool, judged_candidates) + + if log_writer: + log_writer( + f"retrieval_step_{step_number:02d}", + _render_step_log( + step_number=step_number, + action=action, + new_queries=new_queries, + fetched_candidates=judged_candidates, + pool=candidate_pool, + canonical_asset_name=canonical_asset_name, + ), + ) + + top_candidates = _sorted_candidates(candidate_pool)[:_MAX_CANDIDATE_POOL] + selected_candidates, selected_candidate_ids = _select_final_candidates( + candidate_pool, + selected_ids, + ) + + snippets: list[EvidenceSnippet] = [] + for candidate in selected_candidates: + source = "summary" + text = candidate.summary + if candidate.pdf_url: + pdf_text = executor.fetch_pdf_text(candidate.pdf_url) + if pdf_text.strip(): + source = "pdf" + text = pdf_text + snippet_text = _extract_snippet_text(text, canonical_asset_name) + if not snippet_text: + continue + snippets.append( + EvidenceSnippet( + arxiv_id=candidate.arxiv_id, + title=candidate.title, + url=candidate.pdf_url, + source=source, + text=snippet_text, + ) + ) + + bundle = EvidenceBundle( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + query_history=query_history, + selected_candidate_ids=selected_candidate_ids, + candidates=top_candidates, + snippets=snippets, + diagnostics=RetrievalDiagnostics( + steps_run=steps_run, + finish_reason=finish_reason, + metadata_requests=executor.metadata_requests, + pdf_requests=executor.pdf_requests, + cooldown_seconds=_ARXIV_COOLDOWN_SECONDS, + ), + ) + + if log_writer: + log_writer("retrieval_summary", _render_final_log(bundle, selected_candidates)) + + return bundle diff --git a/src/scenarios/utils.py b/src/scenarios/utils.py index c001ae333..dc1793915 100644 --- a/src/scenarios/utils.py +++ b/src/scenarios/utils.py @@ -1,15 +1,52 @@ +import json import urllib.request import urllib.parse import xml.etree.ElementTree as ET import logging +from typing import Any _log = logging.getLogger(__name__) -def fetch_arxiv_studies(search_queries: str | list[str], max_results_per_query: int = 2, metadata_out: dict = None) -> str: - """Fetch relevant studies from ArXiv using their public API. - - If search_queries is a list, it will execute each search and combine unique results. - """ + +def parse_llm_json(raw: str) -> tuple[Any, str | None]: + """Parse an LLM response containing a JSON object or array.""" + text = raw.strip() + if text.startswith("```"): + lines = text.splitlines() + inner = lines[1:-1] if lines and lines[-1].strip() == "```" else lines[1:] + text = "\n".join(inner) + if text.lower().startswith("json"): + text = text[4:] + + text = text.strip() + try: + return json.loads(text), None + except json.JSONDecodeError as exc: + start_obj = text.find("{") + start_arr = text.find("[") + if start_obj == -1 and start_arr == -1: + return None, f"No JSON start character found. Error: {exc}" + + start = ( + start_obj + if start_arr == -1 or (start_obj != -1 and start_obj < start_arr) + else start_arr + ) + end_char = "}" if start == start_obj else "]" + end = text.rfind(end_char) + 1 + + if start != -1 and end > start: + try: + return json.loads(text[start:end]), None + except json.JSONDecodeError as inner_exc: + return None, f"Failed to parse inner JSON block. Error: {inner_exc}" + return None, "Unknown parsing error." + +def fetch_arxiv_studies( + search_queries: str | list[str], + max_results_per_query: int = 2, + metadata_out: dict | None = None, +) -> str: import time import ssl @@ -30,13 +67,12 @@ def fetch_arxiv_studies(search_queries: str | list[str], max_results_per_query: metadata_out['returned_entries'] = 0 metadata_out['pdf_urls'] = [] metadata_out['query_to_pdf'] = {} - metadata_out['results_summary'] = [] # List of (title, url) + metadata_out['results_summary'] = [] seen_ids = set() studies_text = [] for i, q in enumerate(queries): - # Respect ArXiv 3-second rule if doing multiple queries if i > 0: time.sleep(3.1) @@ -79,33 +115,32 @@ def fetch_arxiv_studies(search_queries: str | list[str], max_results_per_query: try: import io from pypdf import PdfReader - - # PDF extraction also has a 3-second rule + time.sleep(3.2) - + pdf_req = urllib.request.Request(pdf_url, headers=headers) with urllib.request.urlopen(pdf_req, timeout=15, context=ctx) as pdf_resp: pdf_bytes = pdf_resp.read() - + reader = PdfReader(io.BytesIO(pdf_bytes)) extracted = [] for j, page in enumerate(reader.pages): - if j > 4: break + if j > 4: + break page_text = page.extract_text() if page_text: extracted.append(page_text) - + pdf_text = "\n".join(extracted) if len(pdf_text) > 10000: pdf_text = pdf_text[:10000] + "\n...[TRUNCATED]" except Exception as e: _log.warning(f"Failed to fetch or parse PDF from {pdf_url}: {e}") - pdf_text = f"[PDF Extraction Failed: {e}]" + pdf_text = "" - if pdf_url: - if metadata_out is not None: - metadata_out['results_summary'].append({"title": t_text, "url": pdf_url}) - + if pdf_url and metadata_out is not None: + metadata_out['results_summary'].append({"title": t_text, "url": pdf_url}) + if pdf_url and pdf_text and "[PDF Extraction Failed" not in pdf_text: if metadata_out is not None: metadata_out['pdf_urls'].append(pdf_url) @@ -124,50 +159,43 @@ def fetch_arxiv_studies(search_queries: str | list[str], max_results_per_query: if metadata_out is not None: metadata_out['returned_entries'] = len(studies_text) - - return "\n\n".join(studies_text) if studies_text else "No recent studies found via ArXiv." - + return "\n\n".join(studies_text) if studies_text else "No recent studies found via ArXiv." -def fetch_hf_fewshot(dataset_id: str = "ibm-research/AssetOpsBench", split: str = "scenarios", target_type: str = None, fallback_if_missing: bool = True) -> list[dict]: - """Fetch few-shot scenarios from HuggingFace dataset.""" +def fetch_hf_fewshot( + dataset_id: str = "ibm-research/AssetOpsBench", + split: str = "scenarios", + target_type: str | None = None, + fallback_if_missing: bool = True, +) -> list[dict]: try: from datasets import load_dataset ds = load_dataset(dataset_id, split) - + examples = [] if "train" in ds: train_ds = ds["train"] else: train_ds = ds - + for item in train_ds: - if target_type: - if str(item.get("type", "")).lower() == target_type.lower(): - examples.append(item) - else: + if target_type is None or str(item.get("type", "")).lower() == target_type.lower(): examples.append(item) - + if len(examples) >= 3: break - - # Return only the relevant keys to keep context size manageable - clean_examples = [] - for e in examples: - clean_examples.append({ + + return [ + { "text": e.get("text", ""), "category": e.get("category", ""), - "characteristic_form": e.get("characteristic_form", "") - }) - - return clean_examples + "characteristic_form": e.get("characteristic_form", ""), + } + for e in examples + ] except ImportError: - _log.warning("HuggingFace 'datasets' library is not installed. Returning empty few-shots.") - if fallback_if_missing: - return [{"text": "Mock query", "category": "Knowledge Query", "characteristic_form": "Mock characteristic"}] + _log.warning("HuggingFace 'datasets' library is not installed.") return [] except Exception as e: _log.warning(f"Failed to load HuggingFace dataset: {e}") - if fallback_if_missing: - return [{"text": "Mock query", "category": "Knowledge Query", "characteristic_form": f"Mock. Error: {e}"}] return [] diff --git a/src/servers/fmsr/main.py b/src/servers/fmsr/main.py index 1db6befe3..fdae7abd9 100644 --- a/src/servers/fmsr/main.py +++ b/src/servers/fmsr/main.py @@ -97,61 +97,56 @@ def _parse_relevancy(text: str) -> dict: temporal = lines[2] if (answer == "Yes" and len(lines) >= 3) else "Unknown" return {"answer": answer, "reason": reason, "temporal_behavior": temporal} -def _parse_dga_response( - text: str -) -> dict: - """Parse a DGA interpretation response - into fault type, R1-R3 values, code, confidence, reasoning, and recommended action.""" +def _parse_dga_response(text: str) -> dict: result = {} for line in text.strip().splitlines(): if ":" in line: k, _, v = line.partition(":") result[k.strip()] = v.strip() return { - "fault_type": result.get("Fault Type", "Unknown"), - "r1": float(result.get("R1 (CH4/H2)", 0) or 0), - "r2": float(result.get("R2 (C2H2/C2H4)", 0) or 0), - "r3": float(result.get("R3 (C2H4/C2H6)", 0) or 0), - "code": result.get("Code (R1,R2,R3)", "Unknown"), - "confidence": result.get("Confidence", "Unknown"), - "reasoning": result.get("Reasoning", ""), + "fault_type": result.get("Fault Type", "Unknown"), + "r1": float(result.get("R1 (CH4/H2)", 0) or 0), + "r2": float(result.get("R2 (C2H2/C2H4)", 0) or 0), + "r3": float(result.get("R3 (C2H4/C2H6)", 0) or 0), + "code": result.get("Code (R1,R2,R3)", "Unknown"), + "confidence": result.get("Confidence", "Unknown"), + "reasoning": result.get("Reasoning", ""), "recommended_action": result.get("Recommended Action", ""), } + def _parse_winding_response(text: str) -> dict: - """Parse a winding temperature assessment response - into thermal status, ageing rate, and recommended action.""" result = {} for line in text.strip().splitlines(): if ":" in line: k, _, v = line.partition(":") result[k.strip()] = v.strip() return { - "thermal_status": result.get("Thermal Status", "Unknown"), - "hot_spot_rise_c": float(result.get("Hot-Spot Rise (C)", 0) or 0), - "ageing_rate": float(result.get("Ageing Rate", 1.0) or 1.0), - "alarm_active": result.get("Alarm Active", "No") == "Yes", - "trip_active": result.get("Trip Active", "No") == "Yes", - "risk_level": result.get("Risk Level", "Unknown"), - "reasoning": result.get("Reasoning", ""), + "thermal_status": result.get("Thermal Status", "Unknown"), + "hot_spot_rise_c": float(result.get("Hot-Spot Rise (C)", 0) or 0), + "ageing_rate": float(result.get("Ageing Rate", 1.0) or 1.0), + "alarm_active": result.get("Alarm Active", "No") == "Yes", + "trip_active": result.get("Trip Active", "No") == "Yes", + "risk_level": result.get("Risk Level", "Unknown"), + "reasoning": result.get("Reasoning", ""), "recommended_action": result.get("Recommended Action", ""), } + def _parse_load_response(text: str) -> dict: - """Parse a load profile response into load factor, imbalance, and recommended action.""" result = {} for line in text.strip().splitlines(): if ":" in line: k, _, v = line.partition(":") result[k.strip()] = v.strip() return { - "load_mva": float(result.get("Load MVA", 0) or 0), - "load_factor_pct": float(result.get("Load Factor (%)", 0) or 0), - "loading_status": result.get("Loading Status", "Unknown"), + "load_mva": float(result.get("Load MVA", 0) or 0), + "load_factor_pct": float(result.get("Load Factor (%)", 0) or 0), + "loading_status": result.get("Loading Status", "Unknown"), "current_imbalance_pct": float(result.get("Current Imbalance (%)", 0) or 0), - "neutral_current_flag": result.get("Neutral Current Flag", "No") == "Yes", - "reasoning": result.get("Reasoning", ""), - "recommended_action": result.get("Recommended Action", ""), + "neutral_current_flag": result.get("Neutral Current Flag", "No") == "Yes", + "reasoning": result.get("Reasoning", ""), + "recommended_action": result.get("Recommended Action", ""), } @@ -229,7 +224,6 @@ def _call_dga( ethylene: float, ethane: float, ) -> dict: - """Query the LLM to interpret DGA readings. Retries up to _MAX_RETRIES times.""" prompt = _INTERPRET_DGA_PROMPT.format( asset_name=asset_name, hydrogen=hydrogen, @@ -251,7 +245,6 @@ def _call_dga( def _call_winding( asset_name: str, wti: float, oti: float, ati: float, oti_a: int, oti_t: int ) -> dict: - """Query the LLM to assess winding temperature condition. Retries up to _MAX_RETRIES times.""" prompt = _ASSESS_WINDING_PROMPT.format( asset_name=asset_name, wti=wti, @@ -285,7 +278,6 @@ def _call_load( inut: float, rated_mva: float, ) -> dict: - """Query the LLM to assess load profile. Retries up to _MAX_RETRIES times.""" prompt = _ASSESS_LOAD_PROMPT.format( asset_name=asset_name, vl1=vl1, @@ -318,34 +310,38 @@ def _call_predict_health_index( dbds: float, power_factor: float, interfacial_v: float, dielectric_rigidity: float, water_content: float, ) -> float: - """Loads model and scalers from artifacts and predicts health index.""" - import pickle import numpy as np - from pathlib import Path base_path = Path(__file__).parent / "artifacts" - # Load model with (base_path / "health_index_model.pkl").open("rb") as f: model = pickle.load(f) - # Load scaler with (base_path / "health_index_scalers.pkl").open("rb") as f: scaler_X = pickle.load(f)["scaler_X"] - # Prepare features - feature_values = np.array([[ - hydrogen, oxygen, nitrogen, methane, co, co2, - ethylene, ethane, acetylene, dbds, - power_factor, interfacial_v, dielectric_rigidity, water_content - ]]) + feature_values = np.array( + [[ + hydrogen, + oxygen, + nitrogen, + methane, + co, + co2, + ethylene, + ethane, + acetylene, + dbds, + power_factor, + interfacial_v, + dielectric_rigidity, + water_content, + ]] + ) - # Scale and predict scaled = scaler_X.transform(feature_values) score = model.predict(scaled)[0] - - # Return score as percentage (0-100) return float(score) @@ -486,22 +482,7 @@ def interpret_dga( ethylene: float, ethane: float, ) -> Union[DGAInterpretationResult, ErrorResult]: - """Interprets dissolved gas analysis (DGA) readings for a transformer - using the IEC 60599 Rogers Ratio method to classify the fault type. - - Args: - asset_name: Name of the transformer asset (e.g. 'Transformer 1'). - hydrogen: Dissolved hydrogen (H2) concentration in oil (ppm). - methane: Dissolved methane (CH4) concentration in oil (ppm). - acetylene: Dissolved acetylene (C2H2) concentration in oil (ppm). - ethylene: Dissolved ethylene (C2H4) concentration in oil (ppm). - ethane: Dissolved ethane (C2H6) concentration in oil (ppm). - - Returns: - DGAInterpretationResult with fault type, Rogers Ratios, IEC code - combination, confidence, reasoning, and recommended action. - ErrorResult if the LLM is unavailable or all retries fail. - """ + """Interpret dissolved gas analysis readings for a transformer.""" if not asset_name: return ErrorResult(error="asset_name is required") @@ -528,24 +509,7 @@ def assess_winding_temperature( oti_a: int, oti_t: int, ) -> Union[WindingTemperatureResult, ErrorResult]: - """Assesses the thermal condition of a transformer winding using the - IEC 60076-7 thermal model. Computes hot-spot rise, insulation ageing - rate, and thermal risk level. - - Args: - asset_name: Name of the transformer asset (e.g. 'Transformer 1'). - wti: Winding Temperature Indicator reading (degrees C). - oti: Oil Temperature Indicator reading (degrees C). - ati: Ambient Temperature Indicator reading (degrees C). - oti_a: Oil Temperature Alarm flag (0 or 1). - oti_t: Oil Temperature Trip flag (0 or 1). - - Returns: - WindingTemperatureResult with thermal status, hot-spot rise, ageing - rate, alarm and trip flag status, risk level, reasoning, and - recommended action. - ErrorResult if the LLM is unavailable or all retries fail. - """ + """Assess transformer winding temperature condition.""" if not asset_name: return ErrorResult(error="asset_name is required") @@ -578,29 +542,7 @@ def assess_load_profile( inut: float, rated_mva: float, ) -> Union[LoadProfileResult, ErrorResult]: - """Assesses the electrical loading condition of a transformer using - IEC 60076-7 guidelines. - - Args: - asset_name: Name of the transformer asset (e.g. 'Transformer 1'). - vl1: Phase 1 line-to-neutral voltage (V). - vl2: Phase 2 line-to-neutral voltage (V). - vl3: Phase 3 line-to-neutral voltage (V). - il1: Phase 1 line current (A). - il2: Phase 2 line current (A). - il3: Phase 3 line current (A). - vl12: Line-to-line voltage between Phase 1 and Phase 2 (V). - vl23: Line-to-line voltage between Phase 2 and Phase 3 (V). - vl31: Line-to-line voltage between Phase 3 and Phase 1 (V). - inut: Neutral current (A). - rated_mva: Transformer rated capacity (MVA). - - Returns: - LoadProfileResult with derived load MVA, load factor percentage, - loading status, current imbalance percentage, neutral current flag, - reasoning, and recommended action. - ErrorResult if the LLM is unavailable or all retries fail. - """ + """Assess transformer loading condition.""" if not asset_name: return ErrorResult(error="asset_name is required") @@ -649,19 +591,10 @@ def predict_health_index( dielectric_rigidity: float, water_content: float, ) -> Union[HealthIndexResult, ErrorResult]: - """Predicts a health index for a transformer asset based on DGA and other sensor readings. - - Returns: - HealthIndexResult with a health index score (0-100) and condition category. - ErrorResult if the LLM is unavailable or all retries fail. - """ - + """Predict a transformer health index from condition data.""" if not asset_name: return ErrorResult(error="asset_name is required") - if not _llm_available: - return ErrorResult(error="LLM unavailable") - try: score = _call_predict_health_index( hydrogen, @@ -680,7 +613,6 @@ def predict_health_index( water_content, ) - # Determine condition based on score if score >= 85: condition = "Very Good" elif score >= 70: diff --git a/src/servers/fmsr/models.py b/src/servers/fmsr/models.py index 638052f5a..3bc91986d 100644 --- a/src/servers/fmsr/models.py +++ b/src/servers/fmsr/models.py @@ -1,42 +1,42 @@ from pydantic import BaseModel + class HealthIndexResult(BaseModel): - """Represents the health index result for a transformer asset.""" - asset_name: str - health_index: float - condition: str + asset_name: str + health_index: float + condition: str + class DGAInterpretationResult(BaseModel): - """Represents the DGA interpretation result for a transformer asset.""" - asset_name: str - fault_type: str - r1: float - r2: float - r3: float - code: str - confidence: str - reasoning: str + asset_name: str + fault_type: str + r1: float + r2: float + r3: float + code: str + confidence: str + reasoning: str recommended_action: str + class WindingTemperatureResult(BaseModel): - """Represents the winding temperature result for a transformer asset.""" - asset_name: str - thermal_status: str - hot_spot_rise_c: float - ageing_rate: float - alarm_active: bool - trip_active: bool - risk_level: str - reasoning: str + asset_name: str + thermal_status: str + hot_spot_rise_c: float + ageing_rate: float + alarm_active: bool + trip_active: bool + risk_level: str + reasoning: str recommended_action: str + class LoadProfileResult(BaseModel): - """Represents the load profile result for a transformer asset.""" - asset_name: str - load_mva: float - load_factor_pct: float - loading_status: str - current_imbalance_pct: float - neutral_current_flag: bool - reasoning: str - recommended_action: str \ No newline at end of file + asset_name: str + load_mva: float + load_factor_pct: float + loading_status: str + current_imbalance_pct: float + neutral_current_flag: bool + reasoning: str + recommended_action: str diff --git a/src/servers/fmsr/tests/test_tools.py b/src/servers/fmsr/tests/test_tools.py index 317cf5c8c..cd0b64993 100644 --- a/src/servers/fmsr/tests/test_tools.py +++ b/src/servers/fmsr/tests/test_tools.py @@ -337,12 +337,14 @@ async def test_missing_asset_name_returns_error(self): assert "error" in data @pytest.mark.anyio - async def test_llm_unavailable_returns_error(self, no_llm): + async def test_predicts_without_llm(self, no_llm): data = await call_tool(mcp, "predict_health_index", { "asset_name": "Transformer1", **self.VALID_FEATURES }) - assert "error" in data + assert "asset_name" in data + assert "health_index" in data + assert "condition" in data @requires_watsonx @pytest.mark.anyio From 974a63b61551926f158543ad8bb57a657007d89c Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Fri, 10 Apr 2026 20:02:05 -0400 Subject: [PATCH 13/29] llm: allow optional max_tokens override in LiteLLMBackend.generate --- src/llm/litellm.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/llm/litellm.py b/src/llm/litellm.py index 24a7a0620..5733066ed 100644 --- a/src/llm/litellm.py +++ b/src/llm/litellm.py @@ -31,14 +31,19 @@ class LiteLLMBackend(LLMBackend): def __init__(self, model_id: str) -> None: self._model_id = model_id - def generate(self, prompt: str, temperature: float = 0.0) -> str: + def generate( + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, + ) -> str: import litellm kwargs: dict = { "model": self._model_id, "messages": [{"role": "user", "content": prompt}], "temperature": temperature, - "max_tokens": 2048, + "max_tokens": max_tokens or 2048, } if self._model_id.startswith("watsonx/"): From 7d57037ae1603d57aef16315c31908c10529f2c3 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Fri, 10 Apr 2026 20:02:07 -0400 Subject: [PATCH 14/29] servers: add CouchDB coverage APIs, FMSR failure-mode aliases, and IoT get_* tools --- src/servers/fmsr/main.py | 35 +++++++- src/servers/iot/main.py | 105 ++++++++++++++++++++++++ src/servers/vibration/couchdb_client.py | 102 +++++++++++++++++++++++ 3 files changed, 241 insertions(+), 1 deletion(-) diff --git a/src/servers/fmsr/main.py b/src/servers/fmsr/main.py index fdae7abd9..21644f740 100644 --- a/src/servers/fmsr/main.py +++ b/src/servers/fmsr/main.py @@ -53,6 +53,9 @@ with _FAILURE_MODES_FILE.open() as _f: _ASSET_FAILURE_MODES: dict[str, list[str]] = yaml.safe_load(_f) +_ASSET_FAILURE_MODE_ALIASES = { + "transformer": "smart grid transformer", +} # ── Prompt templates ────────────────────────────────────────────────────────── @@ -84,6 +87,27 @@ def _parse_numbered_list(text: str) -> list[str]: return items +def _normalize_asset_key(asset_name: str) -> str: + """Normalize an asset name for curated failure-mode lookup.""" + normalized = re.sub(r"\d+", "", asset_name or "").strip().lower() + normalized = re.sub(r"[^a-z0-9]+", " ", normalized).strip() + return normalized + + +def _resolve_failure_mode_asset_key(asset_name: str) -> str: + """Resolve an asset name to a curated failure-mode key when possible.""" + asset_key = _normalize_asset_key(asset_name) + if asset_key in _ASSET_FAILURE_MODES: + return asset_key + if asset_key in _ASSET_FAILURE_MODE_ALIASES: + return _ASSET_FAILURE_MODE_ALIASES[asset_key] + + for known_key in _ASSET_FAILURE_MODES: + if asset_key and (asset_key in known_key or known_key in asset_key): + return known_key + return asset_key + + def _parse_relevancy(text: str) -> dict: """Parse a 3-line relevancy response into {answer, reason, temporal_behavior}.""" lines = [ln for ln in text.strip().splitlines() if ln.strip()] @@ -387,7 +411,7 @@ class FailureModeSensorMappingResult(BaseModel): def get_failure_modes(asset_name: str) -> Union[FailureModesResult, ErrorResult]: """Returns a list of known failure modes for the given asset. For chillers and AHUs returns a curated list. For other assets queries the LLM.""" - asset_key = re.sub(r"\d+", "", asset_name).strip().lower() + asset_key = _resolve_failure_mode_asset_key(asset_name) if not asset_key or asset_key == "none": return ErrorResult(error="asset_name is required") @@ -435,6 +459,15 @@ def get_failure_mode_sensor_mapping( fm2sensor: Dict[str, List[str]] = {} sensor2fm: Dict[str, List[str]] = {} + total_calls = len(failure_modes) * len(sensors) + logger.info( + "Starting FM-sensor mapping for asset '%s' with %d failure modes and %d sensors (%d total calls)", + asset_name, + len(failure_modes), + len(sensors), + total_calls, + ) + try: pairs = [(s, fm) for s in sensors for fm in failure_modes] with ThreadPoolExecutor() as executor: diff --git a/src/servers/iot/main.py b/src/servers/iot/main.py index 9e4732087..1ad2472a1 100644 --- a/src/servers/iot/main.py +++ b/src/servers/iot/main.py @@ -42,6 +42,8 @@ # Static site as per original requirement SITES = ["MAIN"] +_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} + class ErrorResult(BaseModel): error: str @@ -131,6 +133,109 @@ def get_sensor_list(asset_id: str) -> List[str]: return [] +def get_asset_time_range(asset_id: str) -> Dict[str, Any]: + """Return start/end timestamps and observation count for an asset. + + Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by + a per-document site field. + """ + if not db: + return {"start": None, "end": None, "total_observations": 0} + + try: + res = db.find( + {"asset_id": asset_id, "timestamp": {"$exists": True}}, + fields=["timestamp"], + limit=100000, + ) + timestamps = sorted( + doc["timestamp"] + for doc in res.get("docs", []) + if isinstance(doc, dict) and doc.get("timestamp") is not None + ) + if not timestamps: + return {"start": None, "end": None, "total_observations": 0} + return { + "start": timestamps[0], + "end": timestamps[-1], + "total_observations": len(timestamps), + } + except Exception as e: + logger.error(f"Error fetching time range for {asset_id}: {e}") + return {"start": None, "end": None, "total_observations": 0} + + +def get_asset_coverage() -> List[Dict[str, Any]]: + """Return discovered IoT coverage for all assets. + + Uses ``SITES[0]`` as the site label (single static site); documents are not read + for a site field. + """ + if not db: + return [] + + effective_site = SITES[0] + + try: + res = db.find({"asset_id": {"$exists": True}}, limit=100000) + except Exception as e: + logger.error(f"Error fetching asset coverage: {e}") + return [] + + grouped: Dict[tuple[str, str], Dict[str, Any]] = {} + for doc in res.get("docs", []): + if not isinstance(doc, dict): + continue + asset_id = str(doc.get("asset_id", "")).strip() + if not asset_id: + continue + + key = (effective_site, asset_id) + group = grouped.setdefault( + key, + { + "site_name": effective_site, + "asset_id": asset_id, + "sensors": set(), + "timestamps": [], + }, + ) + group["sensors"].update( + key for key in doc.keys() if key not in _ASSET_META_FIELDS + ) + timestamp = doc.get("timestamp") + if timestamp is None: + continue + if isinstance(timestamp, str): + if timestamp.strip(): + group["timestamps"].append(timestamp.strip()) + elif hasattr(timestamp, "isoformat"): + group["timestamps"].append(timestamp.isoformat()) + else: + group["timestamps"].append(str(timestamp)) + + coverage: List[Dict[str, Any]] = [] + for (_site_name, asset_id), group in grouped.items(): + timestamps = sorted(group["timestamps"]) + coverage.append( + { + "site_name": group["site_name"], + "asset_id": asset_id, + "sensors": sorted(group["sensors"]), + "time_range": { + "start": timestamps[0] if timestamps else None, + "end": timestamps[-1] if timestamps else None, + "total_observations": len(timestamps), + }, + } + ) + + return sorted( + coverage, + key=lambda item: (item["site_name"].lower(), item["asset_id"].lower()), + ) + + @mcp.tool(title="List Sites") def sites() -> SitesResult: """Retrieves a list of sites. Each site is represented by a name.""" diff --git a/src/servers/vibration/couchdb_client.py b/src/servers/vibration/couchdb_client.py index 04aa4a4a0..6e513a54b 100644 --- a/src/servers/vibration/couchdb_client.py +++ b/src/servers/vibration/couchdb_client.py @@ -24,6 +24,16 @@ COUCHDB_USER = os.environ.get("COUCHDB_USERNAME") COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD") +# Static site as per IoT benchmark; documents are not filtered by a per-document site field. +SITES = ["MAIN"] + +_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} + + +def get_site_list() -> list[str]: + """Sites accepted for vibration (aligned with IoT ``SITES``).""" + return list(SITES) + def _get_db() -> Optional[couchdb3.Database]: """Lazy CouchDB connection with error handling.""" @@ -143,3 +153,95 @@ def list_sensor_fields(asset_id: str) -> list[str]: except Exception as e: logger.error(f"Error listing sensors for {asset_id}: {e}") return [] + +def get_asset_time_range(asset_id: str) -> dict: + """Return start/end timestamps and observation count for an asset. + + Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by + a per-document site field. + """ + db = _get_db() + if not db: + return {"start": None, "end": None, "total_observations": 0} + try: + res = db.find( + {"asset_id": asset_id, "timestamp": {"$exists": True}}, + fields=["timestamp"], + limit=100000, + ) + timestamps = sorted( + doc["timestamp"] + for doc in res.get("docs", []) + if isinstance(doc, dict) + and doc.get("timestamp") + ) + if not timestamps: + return {"start": None, "end": None, "total_observations": 0} + return { + "start": timestamps[0], + "end": timestamps[-1], + "total_observations": len(timestamps), + } + except Exception as e: + logger.error(f"Error fetching vibration time range for {asset_id}: {e}") + return {"start": None, "end": None, "total_observations": 0} + + +def list_asset_coverage() -> list[dict]: + """Return vibration asset coverage, sensors, and time ranges. + + Uses ``SITES[0]`` as the site label (single static site); documents are not read + for a site field. + """ + db = _get_db() + if not db: + return [] + + effective_site = SITES[0] + + try: + res = db.find({"asset_id": {"$exists": True}}, limit=100000) + except Exception as e: + logger.error(f"Error fetching vibration asset coverage: {e}") + return [] + + grouped: dict[tuple[str, str], dict] = {} + for doc in res.get("docs", []): + if not isinstance(doc, dict): + continue + asset_id = str(doc.get("asset_id", "")).strip() + if not asset_id: + continue + + key = (effective_site, asset_id) + group = grouped.setdefault( + key, + { + "site_name": effective_site, + "asset_id": asset_id, + "sensors": set(), + "timestamps": [], + }, + ) + group["sensors"].update(k for k in doc.keys() if k not in _ASSET_META_FIELDS) + timestamp = doc.get("timestamp") + if isinstance(timestamp, str) and timestamp: + group["timestamps"].append(timestamp) + + coverage: list[dict] = [] + for (_site_name, asset_id), group in grouped.items(): + timestamps = sorted(group["timestamps"]) + coverage.append( + { + "site_name": group["site_name"], + "asset_id": asset_id, + "sensors": sorted(group["sensors"]), + "time_range": { + "start": timestamps[0] if timestamps else None, + "end": timestamps[-1] if timestamps else None, + "total_observations": len(timestamps), + }, + } + ) + + return sorted(coverage, key=lambda item: (item["site_name"].lower(), item["asset_id"].lower())) From aafb7b15a900343e2480fdd8a99d20591d64f264 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Fri, 10 Apr 2026 20:02:09 -0400 Subject: [PATCH 15/29] scenarios: modular generator with grounding, constraints, and split prompts/retrieval --- .gitignore | 6 +- src/scenarios/README.md | 431 +++++++---- src/scenarios/constraints/__init__.py | 35 + src/scenarios/constraints/policies.py | 182 +++++ src/scenarios/constraints/validation.py | 248 +++++++ src/scenarios/failure_mapping/.gitkeep | 0 .../failure_mapping/transformer.json | 556 ++++++++++++++ src/scenarios/generator.py | 430 ----------- src/scenarios/generator/__init__.py | 12 + src/scenarios/generator/__main__.py | 4 + src/scenarios/generator/agent.py | 700 ++++++++++++++++++ src/scenarios/generator/cli.py | 87 +++ src/scenarios/generator/prompt_helpers.py | 284 +++++++ src/scenarios/grounding.py | 272 +++++++ .../asset/compressor_utterance.jsonl | 15 + .../asset/hydrolicpump_utterance.jsonl | 17 + .../huggingface/scenarios/all_utterance.jsonl | 152 ++++ .../task/failure_mapping_senarios.jsonl | 88 +++ .../task/rule_monitoring_scenarios.jsonl | 120 +++ src/scenarios/models.py | 189 ++++- src/scenarios/prompts.py | 241 ------ src/scenarios/prompts/__init__.py | 20 + src/scenarios/prompts/asset_profile.py | 77 ++ src/scenarios/prompts/budget.py | 38 + src/scenarios/prompts/generation.py | 151 ++++ src/scenarios/prompts/retrieval.py | 95 +++ src/scenarios/retrieval/__init__.py | 5 + src/scenarios/retrieval/arxiv.py | 227 ++++++ .../{retrieval.py => retrieval/pipeline.py} | 374 ++-------- src/scenarios/text.py | 31 + src/scenarios/utils.py | 424 +++++++---- 31 files changed, 4193 insertions(+), 1318 deletions(-) create mode 100644 src/scenarios/constraints/__init__.py create mode 100644 src/scenarios/constraints/policies.py create mode 100644 src/scenarios/constraints/validation.py create mode 100644 src/scenarios/failure_mapping/.gitkeep create mode 100644 src/scenarios/failure_mapping/transformer.json delete mode 100644 src/scenarios/generator.py create mode 100644 src/scenarios/generator/__init__.py create mode 100644 src/scenarios/generator/__main__.py create mode 100644 src/scenarios/generator/agent.py create mode 100644 src/scenarios/generator/cli.py create mode 100644 src/scenarios/generator/prompt_helpers.py create mode 100644 src/scenarios/grounding.py create mode 100644 src/scenarios/huggingface/asset/compressor_utterance.jsonl create mode 100644 src/scenarios/huggingface/asset/hydrolicpump_utterance.jsonl create mode 100644 src/scenarios/huggingface/scenarios/all_utterance.jsonl create mode 100644 src/scenarios/huggingface/task/failure_mapping_senarios.jsonl create mode 100644 src/scenarios/huggingface/task/rule_monitoring_scenarios.jsonl delete mode 100644 src/scenarios/prompts.py create mode 100644 src/scenarios/prompts/__init__.py create mode 100644 src/scenarios/prompts/asset_profile.py create mode 100644 src/scenarios/prompts/budget.py create mode 100644 src/scenarios/prompts/generation.py create mode 100644 src/scenarios/prompts/retrieval.py create mode 100644 src/scenarios/retrieval/__init__.py create mode 100644 src/scenarios/retrieval/arxiv.py rename src/scenarios/{retrieval.py => retrieval/pipeline.py} (63%) create mode 100644 src/scenarios/text.py diff --git a/.gitignore b/.gitignore index 9b2248037..818e3f2f6 100644 --- a/.gitignore +++ b/.gitignore @@ -201,7 +201,7 @@ mcp/couchdb/sample_data/bulk_docs.json .env mcp/servers/tsfm/artifacts/tsfm_models/ src/tmp/ +src/scenarios/tmp/ -# ignore generated scenarios -generated_scenarios.json -logs/ \ No newline at end of file +# ignore generated scenario outputs and manual scenario analyses +generated/ diff --git a/src/scenarios/README.md b/src/scenarios/README.md index 0362b4e56..8ca14fa32 100644 --- a/src/scenarios/README.md +++ b/src/scenarios/README.md @@ -1,225 +1,342 @@ # Scenario Generator -Automated LLM-driven pipeline that generates evaluation scenarios for AssetOpsBench. Given an asset name (e.g. `"Smart Grid Transformer"`), it produces a set of richly-typed benchmark scenarios covering IoT queries, failure-mode reasoning, time-series analysis, work-order decisions, and complex multi-agent workflows. +LLM-driven pipeline for generating AssetOpsBench scenarios from an asset class such as `"Motor"`, `"Transformer"`, or `"Hydrolic Pump"`. ---- +The generator works in two modes: -## Directory Structure +- `closed_form`: self-contained scenarios where the query itself provides the needed values, rules, summaries, or dataset references. +- `open_form`: grounded scenarios that use live CouchDB-backed identifiers discovered from IoT and vibration coverage. -``` -src/scenarios/ -├── generator.py # Main orchestrator — ScenarioGeneratorAgent + CLI entry point -├── models.py # Pydantic models: AssetProfile, ScenarioBudget, Scenario -├── prompts.py # All LLM prompt templates (6 prompts) -├── utils.py # ArXiv fetch + HuggingFace few-shot helpers -├── local/ # Place custom local study PDFs / text files here -└── huggingface/ # HuggingFace dataset integration notes -``` +> **Open-form disclaimer:** For grounded `open_form` runs (`--data-in-couchdb`), configure `.env` (or the process environment) so **`IOT_DBNAME`**, **`WO_DBNAME`**, and **`VIBRATION_DBNAME`** each point to live CouchDB databases that actually contain data relevant to the **asset name** you pass on the CLI (for example `"Transformer"` or `"Motor"`). If these names point at the wrong or empty databases, IoT, work-order, and vibration grounding will be misleading or sparse for that asset. ---- -## Prerequisites +> For **new asset classes**, add or update **`_ASSET_FAILURE_MODE_ALIASES`** in [`src/servers/fmsr/main.py`](../servers/fmsr/main.py) when the CLI-facing name should map to a different curated failure-mode key in [`failure_modes.yaml`](../servers/fmsr/failure_modes.yaml); otherwise FMSR may fall back to LLM-only failure lists. See **Asset class → curated FMSR failure modes** below for the full picture. -Install project dependencies (from repo root): +The run writes a JSON **array** of scenarios. Each object has this shape: -```bash -uv sync +```json +{ + "id": "transformer_scenario_01", + "type": "fmsr", + "text": "…", + "category": "Diagnostic Assessment", + "characteristic_form": "…" +} ``` -Set required environment variables in a `.env` file at the repo root: +Allowed `type` values: `iot`, `fmsr`, `tsfm`, `wo`, `vibration`, `multiagent`. Few-shot source JSONL files under [`huggingface/`](huggingface/) still use their own `type` column labels (e.g. `IoT`, `Workorder`) when filtering examples; generated `scenarios.json` uses the canonical keys above. See [`models.py`](models.py) (`Scenario`, `ScenarioTypeKey`). + +## CLI + +From the **repository root**, use [uv](https://docs.astral.sh/uv/) so imports resolve for `scenarios`, `agent`, `llm`, and `servers` (same layout as `tool.pytest.ini_options.pythonpath` in `pyproject.toml`): ```bash -# .env -LITELLM_MODEL=gpt-4o # or any LiteLLM-compatible model ID -OPENAI_API_KEY=sk-... # or whichever provider key your model needs +uv run python -m scenarios.generator "" [options] ``` -> The generator reuses the same `LiteLLMBackend` and `Executor` as `plan-execute`, so any model already working with that CLI will work here. +Key flags: ---- +| Flag | Default | Description | +|---|---|---| +| `asset_name` | required | Asset class name, for example `"Motor"` or `"Transformer"` | +| `--num-scenarios N` | `50` | Total number of scenarios to generate | +| `--model-id MODEL` | project default | LiteLLM model override | +| `--data-in-couchdb` | off | Enable grounded open-form generation when live IoT inventory exists (requires `.env` DB names; see open-form disclaimer above) | +| `--show-workflow` | off | Print phase-by-phase progress, including live repair counts | +| `--log` | off | Write prompts and responses under `logs/` next to `scenarios.json` (same run folder) | -## Running the Generator +Output is always `generated/scenarios/_scenarios_/scenarios.json` (not configurable; slug from [`text.slugify_asset_name`](text.py)). -The generator is invoked as a Python module from the **repo root**: +Examples: ```bash -python -m scenarios.generator "" [options] -``` +# Run from the repository root +# Closed-form, self-contained scenarios only +uv run python -m scenarios.generator "Transformer" --num-scenarios 20 -### Minimum viable run +# Grounded open-form with CouchDB-backed IoT data, workflow output, and run logs +uv run python -m scenarios.generator "Transformer" --log --data-in-couchdb -```bash -python -m scenarios.generator "Smart Grid Transformer" +# Grounded open-form with verbose workflow (no --log) +uv run python -m scenarios.generator "Motor" --data-in-couchdb --show-workflow + +# Debug run with raw logs (hydraulic pump asset class) +uv run python -m scenarios.generator "Hydrolic Pump" --data-in-couchdb --show-workflow --log ``` -Generates 50 scenarios and writes them to `generated_scenarios.json`. +## Code layout + +Tree is rooted at `src/scenarios/` (this package). Comments describe each part. + +```text +scenarios/ +├── generator/ +│ ├── __main__.py +│ ├── cli.py # entry for python -m scenarios.generator +│ ├── agent.py # ScenarioGeneratorAgent +│ └── prompt_helpers.py # prompt fragments, default paths, workflow printing +├── grounding.py # IoT inventory, vibration overlay, FMSR mapping; optional failure_mapping/ cache +├── retrieval/ +│ ├── arxiv.py # ArXiv fetch +│ └── pipeline.py # LLM-ranked evidence; public API retrieve_asset_evidence +├── constraints/ +│ ├── policies.py # focus policies for prompts +│ └── validation.py # deterministic validation / repair loop +├── prompts/ +│ ├── asset_profile.py +│ ├── budget.py +│ ├── generation.py +│ └── retrieval.py +├── huggingface/ +│ ├── scenarios/ # e.g. all_utterance.jsonl +│ ├── asset/ # e.g. compressor / hydrolic pump utterances +│ └── task/ # e.g. failure mapping, rule monitoring JSONL +├── local/ +│ └── vibration_utterance.json # few-shot examples for vibration focus only +├── failure_mapping/ # on-disk FMSR fm2sensor / sensor2fm cache (e.g. .json) +├── models.py # AssetProfile, GroundingBundle, Scenario, … +├── utils.py # fetch_hf_fewshot, parse_llm_json +└── text.py # slugs, text normalization for dedup and prompts +``` ---- +## High-level flow -## CLI Reference +```mermaid +flowchart TD + A["CLI Input
asset class + flags"] --> B{"--data-in-couchdb?"} + B -->|No| C["Closed-form mode"] + B -->|Yes| D["Grounded discovery"] -| Flag | Default | Description | -|---|---|---| -| `asset_name` *(positional)* | — | Name of the physical asset to generate scenarios for (e.g. `"Chiller"`, `"Wind Turbine"`, `"Smart Grid Transformer"`) | -| `--num-scenarios N` | `50` | Total number of scenarios to generate | -| `--output PATH` | `generated_scenarios.json` | Output file path for the resulting JSON | -| `--model-id MODEL` | project default | LiteLLM model ID override (e.g. `gpt-4o`, `claude-3-5-sonnet`) | -| `--show-workflow` | off | Print granular phase-by-phase progress to the terminal | -| `--log` | off | Dump raw prompts + LLM responses to a timestamped `logs/` directory | + D --> D1["IoT asset coverage
sites, asset ids, sensors, time ranges"] + D --> D2["Vibration asset coverage
asset ids, sensors, time ranges"] + D --> D3["FMSR grounding
failure modes + failure/sensor mappings"] -### Examples + D1 --> E{"IoT inventory present?"} + D2 --> E + D3 --> E -```bash -# Generate 20 scenarios with verbose workflow output -python -m scenarios.generator "Chiller" --num-scenarios 20 --show-workflow + E -->|No| C + E -->|Yes| F["Open-form mode"] + + C --> G["ArXiv retrieval + evidence ranking"] + F --> G + + G --> H["Asset profile synthesis
description, grounded instances, tasks,
failure mappings, relevant tools, standards"] + H --> I["Budget allocation
iot / fmsr / tsfm / wo / vibration / multiagent"] + I --> J["Few-shot retrieval
HF JSONL pools + local vibration supplement"] -# Use a specific model and save to a custom path -python -m scenarios.generator "Wind Turbine" --model-id claude-3-5-sonnet-latest --output wind_turbine_scenarios.json + J --> K["Focused scenario generation"] + K --> K1["Closed-form rules:
embed values, rules, summaries, or datasets inline"] + K --> K2["Open-form rules:
use only grounded identifiers"] -# Full debug run: workflow + raw log files -python -m scenarios.generator "Smart Grid Transformer" --show-workflow --log + K1 --> L["Deterministic validation + repair"] + K2 --> L -# Minimal silent run (for CI/scripting) -python -m scenarios.generator "Pump" --num-scenarios 10 --output pump_eval.json + L --> M["Multiagent composition"] + M --> N["Final JSON output
id, type, text, category, characteristic_form"] ``` ---- +## Pipeline -## Generation Pipeline +### 1. Grounded discovery -The generator runs 5 sequential phases: +Runs when `--data-in-couchdb` is enabled. -``` -Phase 1 → Asset Profile Construction -Phase 2 → Scenario Budget Allocation -Phase 3 → Individual Agent Generation & Validation (iot / fmsr / tsfm / wo) -Phase 4 → Multi-Agent Scenario Construction - → Output JSON -``` +- Enumerates IoT assets via the IoT server (`get_asset_list`, sensors, time ranges). +- Joins vibration coverage by `(site_name, asset_id)`. +- Calls FMSR for failure modes and failure-to-sensor mapping (with optional cache files in [`failure_mapping/.json`](failure_mapping/)). +- If there is no IoT inventory at all, the run uses `closed_form` (`open_form_eligible` false). +- In grounded runs, focuses without live support can be allocated `0` budget instead of inventing identifiers. -### Phase 1 — Asset Profile Construction +### Asset-class mapping notes -1. An LLM generates 3 targeted ArXiv search queries using the canonical academic name for the asset. -2. The ArXiv API is queried; PDFs are fetched and the first 5 pages of each are extracted. -3. A `PROFILE_BUILDER_PROMPT` synthesises an `AssetProfile` from the literature and the available MCP tool descriptions. +Coherent open-form runs depend on the CLI `asset_name` aligning with how servers resolve assets: -**Output model (`AssetProfile`):** -```json -{ - "asset_name": "Smart Grid Transformer", - "description": "...", - "sensor_mappings": { "oil_temp": "Top-oil temperature sensor" }, - "known_failure_modes": ["insulation breakdown", "partial discharge"], - "relevant_tools": { "iot": [{"name": "get_sensor_reading", "reason": "..."}] }, - "iso_standards": ["ISO 14224", "IEC 60076"] -} -``` +#### 1. CLI label and IoT / vibration inventory -> **Critical:** If this phase fails to parse an `AssetProfile`, the process exits immediately with a fatal error. There is no fallback. +[`discover_grounding`](grounding.py) loads the full IoT inventory exposed by the IoT server; it does not substring-filter asset rows by the CLI string. Vibration rows are merged when `(site_name, asset_id)` matches. For scenarios that mention specific assets, use ids and sites that actually appear in the grounded bundle and profile. -### Phase 2 — Scenario Budget Allocation +#### 2. Asset class → curated FMSR failure modes -An LLM analyses the `AssetProfile` and distributes the `--num-scenarios` budget across 5 subagent categories: +FMSR failure-mode grounding is most reliable when the asset class maps to a curated key instead of falling back to the LLM. -| Category | Focus | -|---|---| -| `iot` | Sensor data queries and telemetry | -| `fmsr` | Failure modes and structural reliability | -| `tsfm` | Time-series analysis and forecasting | -| `wo` | Work-order decision support | -| `multiagent` | Complex multi-step orchestration (capped at 50% of total) | +Curated failure modes live in: -> **Critical:** If budget allocation fails, the process exits immediately. +- [`src/servers/fmsr/failure_modes.yaml`](../servers/fmsr/failure_modes.yaml) -### Phase 3 — Individual Agent Generation & Validation +Alias resolution for lookup lives in: -For each subagent with a non-zero budget: -1. **Few-shot examples** are fetched from `ibm-research/AssetOpsBench` on HuggingFace (filtered by `type`). -2. A `SCENARIO_GENERATOR_PROMPT` produces a JSON array of scenario dicts. -3. A `VALIDATE_REPAIR_PROMPT` validates and repairs each scenario for schema correctness and tool alignment. -4. Changed scenarios are diffed and written to log files (if `--log` is enabled). +- [`src/servers/fmsr/main.py`](../servers/fmsr/main.py) via `_ASSET_FAILURE_MODE_ALIASES` and `_resolve_failure_mode_asset_key()` -**Valid `category` values per subagent:** (extracted from HF examples) +Concrete example: -| Subagent | Allowed Categories | -|---|---| -| `iot` | Data Query, Knowledge Query | -| `fmsr` | Knowledge Query | -| `tsfm` | Knowledge Query, Anomaly Detection Query, Tuning Query, Inference Query, Complex Query | -| `wo` | Decision Support, Prediction, Knowledge Query | +- CLI input: `"Transformer"` +- IoT asset id: `"Transformer 1"` +- curated FMSR key: `"smart grid transformer"` -### Phase 4 — Multi-Agent Scenario Construction +That works because `Transformer -> smart grid transformer` is explicitly aliased in FMSR. -Uses up to 10 previously-generated single-agent scenarios as seed material to construct complex cross-agent workflows (e.g. detect anomaly via IoT → confirm history via FMSR → schedule via WO). +If you add a new asset class, make sure at least one of these is true: ---- +- the normalized CLI asset class exactly matches a key in `failure_modes.yaml` +- or there is an explicit alias in `_ASSET_FAILURE_MODE_ALIASES` +- or you are intentionally accepting slower, less deterministic LLM fallback behavior -## Output Schema +Recommended rule: -The output JSON is an array of `Scenario` objects: +- For production-ish grounded generation, prefer adding a curated `failure_modes.yaml` entry plus an alias if the CLI-facing name differs from the curated key. -```json -[ - { - "id": "smart_grid_transformer_iot_01", - "type": "iot", - "text": "What is the current oil temperature reading for transformer T-42?", - "category": "Data Query", - "characteristic_form": "The agent should call get_sensor_reading with asset_id='T-42' and sensor='oil_temp', then return the value with its unit." - } -] -``` +#### 3. Failure / sensor grounding -| Field | Type | Description | -|---|---|---| -| `id` | `str` | Auto-assigned: `{asset}_{type}_{n:02d}` | -| `type` | `str` | Subagent category: `iot`, `fmsr`, `tsfm`, `wo`, `multiagent` | -| `text` | `str` | The natural-language query presented to the agent | -| `category` | `str` | Scenario category (see table above) | -| `characteristic_form` | `str` | Natural-language description of the expected agent response/tool flow | +After failure modes are found, grounding builds failure-to-sensor views for scenario generation in [`grounding.py`](grounding.py): either from a cache file under `failure_mapping/` or from `get_failure_mode_sensor_mapping` (then written to cache). ---- +#### 4. Asset class → vibration coverage -## Log Files (`--log`) +`vibration` is only meaningful in open-form when the vibration database has rows for the same `(site_name, asset_id)` pairs as IoT. -When `--log` is passed, a timestamped directory is created: +Relevant code: -``` -logs/gen__/ -├── 01_research_queries_prompt.txt -├── 02_research_queries_response.txt -├── 03_arxiv_results.txt -├── 04_asset_profile_prompt.txt -├── 05_asset_profile_response.txt -├── 06_asset_profile__json.txt -├── 07_budget_allocation_prompt.txt -├── 08_budget_allocation_response.txt -├── 09_iot_generation_prompt.txt -├── 10_iot_generation_response.txt -├── 11_validate_repair_prompt.txt -├── 12_validate_repair_response.txt -├── 13_iot_validation_changes.txt ← diffs for changed scenarios -... +- [`src/servers/vibration/couchdb_client.py`](../servers/vibration/couchdb_client.py) +- [`src/scenarios/grounding.py`](grounding.py) + +Important consequence: + +- If IoT has `Transformer 1` but vibration has no matching row, grounded generation can still run, but vibration-focused scenarios may receive `0` budget if the profile has no vibration sensors. + +#### 5. Quick checklist when adding a new asset class + +- FMSR: curated `failure_modes.yaml` entry and/or alias, or accepted LLM fallback. +- IoT / vibration: asset ids and sites match what you want referenced in open-form text. +- Large sensor sets: consider caching under `failure_mapping/.json` after the first successful mapping. +- Few-shot pools include examples adjacent to the new class or focus (see [`utils.py`](utils.py)). + +#### 6. Troubleshooting example: Transformer + +For the transformer case, a typical mapping is: + +- CLI asset class: `"Transformer"` +- grounded IoT asset: `"Transformer 1"` +- grounded vibration assets: often none +- curated FMSR family: `"smart grid transformer"` + +Expected behavior: + +- open-form is enabled when IoT inventory exists +- `iot`, `fmsr`, `tsfm`, and `wo` can receive budget +- `vibration` may be `0` without vibration rows + +If a run stalls or falls back unexpectedly, inspect: + +- IoT DB content and IoT server behavior +- FMSR aliases for `Transformer` +- FMSR mapping cache and logs under `failure_mapping/` + +### 2. Asset profile synthesis + +The asset profile combines: + +- grounded live coverage when available +- ArXiv evidence about the physical asset class +- available tool descriptions from the MCP servers + +The profile includes: + +- asset-class description +- grounded per-instance coverage +- known failure modes +- failure-to-sensor and sensor-to-failure mappings +- relevant tools by focus +- operator-facing tasks +- manager-facing tasks +- standards and conventions + +### 3. Budget allocation + +Budget is allocated across: + +- `iot` +- `fmsr` +- `tsfm` +- `wo` +- `vibration` +- `multiagent` + +Special handling: + +- `vibration=0` when grounded open-form coverage does not include matching vibration-backed assets for the asset class. +- `multiagent` is capped at **75%** of the total budget (see `_multiagent_budget_cap` in [`generator/prompt_helpers.py`](generator/prompt_helpers.py)). + +### 4. Few-shot retrieval + +Few-shot examples are drawn from the JSONL files under [`huggingface/`](huggingface/) and, for vibration, from [`local/vibration_utterance.json`](local/vibration_utterance.json). Per-focus sourcing is implemented in [`utils.py`](utils.py) (`_build_candidate_pool`): + +- **iot / wo**: filtered rows from `huggingface/scenarios/all_utterance.jsonl` +- **fmsr**: `huggingface/task/failure_mapping_senarios.jsonl` (bucketed shapes) +- **tsfm**: `huggingface/task/rule_monitoring_scenarios.jsonl` (diverse entities) +- **vibration**: `local/vibration_utterance.json` +- **multiagent**: `huggingface/asset/compressor_utterance.jsonl`, `huggingface/asset/hydrolicpump_utterance.jsonl`, plus multiagent rows from `all_utterance.jsonl` + +Ranking considers: + +- asset/entity similarity +- focus similarity +- closed-form vs open-form fit +- operator or manager wording fit + +### 5. Scenario generation and validation + +Generation is budgeted and validated per focus lane; the same lane is serialized as `type` in the output. [`constraints`](constraints/) enforces: + +- required schema fields +- duplicate avoidance +- clear primary focus +- self-contained closed-form requests +- grounded identifiers for open-form requests +- at least two namespaces for multiagent workflows + +Cross-focus support is allowed as long as the primary focus remains clear. + +## Closed-form vs open-form + +### Closed-form + +Closed-form scenarios must be solvable from the query itself. They can include: + +- DGA readings +- rule definitions +- maintenance summaries +- sensor/value snippets +- dataset names and evaluation requests + +Example: + +```text +Interpret the DGA gas readings for transformer: Hydrogen 100 ppm, Methane 50 ppm, Acetylene 5 ppm, Ethylene 20 ppm, Ethane 10 ppm. ``` -Logs are numbered sequentially in pipeline order, making it straightforward to trace exactly what the LLM received and returned at each step. +### Open-form ---- +Open-form scenarios may require live retrieval, but every concrete identifier must come from grounded discovery. That includes: -## Troubleshooting +- site names +- asset ids +- sensor names +- explicit time bounds -| Symptom | Likely Cause | Fix | -|---|---|---| -| `[FATAL ERROR] Critical failure: Could not construct AssetProfile` | LLM returned unparseable JSON in Phase 1 | Run with `--log` and inspect `asset_profile_response.txt`; try a more capable model | -| `[FATAL ERROR] Critical failure: Could not dynamically allocate scenario budget` | Phase 2 parse failure | Same as above — check `budget_allocation_response.txt` | -| `[WARNING] No scenarios were successfully generated` | All subagent generation rounds returned empty | Check HuggingFace connectivity; run with `--show-workflow --log` | -| ArXiv fetch slow / hanging | ArXiv rate-limiting (3s between requests enforced) | Normal — each query + PDF fetch takes ~6–10s per paper | -| `datasets` ImportError | HuggingFace `datasets` library missing | Run `uv sync` from repo root | -| `pypdf` ImportError | PDF extraction library missing | Run `uv sync` from repo root | +## Output file + +`scenarios.json` is a JSON array of objects matching the schema at the top of this document. Field meanings: `id` (stable id), `type` (benchmark lane: `iot`, `fmsr`, `tsfm`, `wo`, `vibration`, or `multiagent`), `text` (user request), `category`, `characteristic_form` (expected tools and answer shape). + +## Logs + +When `--log` is enabled, prompts and raw responses are written under `generated/scenarios/_scenarios_/logs/`, next to `scenarios.json`. Stage-specific subdirectories mirror the pipeline steps. ---- +Typical files include: -## Data Sources +- `01_grounding/discovery.json` +- `02_retrieval/steps/*.txt` and `02_retrieval/summary.txt` +- `03_asset_profile/prompt.txt`, `03_asset_profile/response.json`, and `03_asset_profile/final_asset_profile.json` +- `04_budget/prompt.txt` and `04_budget/response.json` +- `05_generation//generation_prompt.txt`, `generation_response.json`, and validate/repair prompts under the same focus folder (including `multiagent`, which uses the multi-agent combiner prompt in the same layout as other focuses) +- optional `05_generation//deterministic_failures_attempt_*.json` when validation fails and retries -- **ArXiv** — Academic literature fetched live at runtime via `fetch_arxiv_studies()` in `utils.py`. Queries are LLM-generated, respecting ArXiv's 3-second rate limit. -- **HuggingFace** — Few-shot examples loaded from `ibm-research/AssetOpsBench` via `fetch_hf_fewshot()`. If the dataset is unavailable, a mock fallback is used automatically. \ No newline at end of file diff --git a/src/scenarios/constraints/__init__.py b/src/scenarios/constraints/__init__.py new file mode 100644 index 000000000..b1b3673df --- /dev/null +++ b/src/scenarios/constraints/__init__.py @@ -0,0 +1,35 @@ +"""Scenario focus policies and deterministic validation.""" + +from .policies import ( + FOCUS_ORDER, + FocusPolicy, + SCENARIO_POLICIES, + format_accepted_scenarios_for_prompt, + format_categories_for_prompt, + format_forbidden_patterns_for_prompt, + format_mode_requirements, + format_requirements_for_prompt, + get_scenario_policy, +) +from .validation import ( + ScenarioValidationFailure, + failure_payload, + validate_scenario, + validate_scenario_batch, +) + +__all__ = [ + "FOCUS_ORDER", + "FocusPolicy", + "SCENARIO_POLICIES", + "ScenarioValidationFailure", + "failure_payload", + "format_accepted_scenarios_for_prompt", + "format_categories_for_prompt", + "format_forbidden_patterns_for_prompt", + "format_mode_requirements", + "format_requirements_for_prompt", + "get_scenario_policy", + "validate_scenario", + "validate_scenario_batch", +] diff --git a/src/scenarios/constraints/policies.py b/src/scenarios/constraints/policies.py new file mode 100644 index 000000000..2beead935 --- /dev/null +++ b/src/scenarios/constraints/policies.py @@ -0,0 +1,182 @@ +"""Scenario focus policies and prompt-formatting helpers.""" + +from __future__ import annotations + +from collections.abc import Iterable +from dataclasses import dataclass +import json + +from ..models import AssetProfile + + +def _format_bullet_list(items: Iterable[str]) -> str: + return "\n".join(f"- {item}" for item in items) + + +# Shared across all focuses: injected into prompts via forbidden_patterns. +FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT = ( + "Do not put MCP tool names, function names, or parenthetical examples like " + '"e.g. get_failure_modes tool" in the scenario text; put those only in characteristic_form.' +) + +FOCUS_ORDER: tuple[str, ...] = ("iot", "fmsr", "tsfm", "wo", "vibration", "multiagent") + + +@dataclass(frozen=True) +class FocusPolicy: + """Prompt and validation guidance for one focus.""" + + categories: tuple[str, ...] + prompt_requirements: tuple[str, ...] + forbidden_patterns: tuple[str, ...] + + def format_categories(self) -> str: + return _format_bullet_list(self.categories) + + def format_requirements(self) -> str: + return _format_bullet_list(self.prompt_requirements) + + def format_forbidden_patterns(self) -> str: + return _format_bullet_list(self.forbidden_patterns) + + +SCENARIO_POLICIES: dict[str, FocusPolicy] = { + "iot": FocusPolicy( + categories=("Data Query", "Knowledge Query"), + prompt_requirements=( + "Keep the primary burden on telemetry retrieval, asset discovery, sensor discovery, or historical observations.", + "Supporting FMSR, TSFM, vibration, or WO steps are allowed, but IoT must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid turning a primary IoT scenario into a generic asset essay with no telemetry task.", + ), + ), + "fmsr": FocusPolicy( + categories=("Knowledge Query", "Diagnostic Assessment", "Recommendation"), + prompt_requirements=( + "Keep the primary burden on failure modes, failure-to-sensor reasoning, DGA interpretation, or engineering assessment.", + "Supporting IoT, TSFM, vibration, or WO steps are allowed, but FMSR must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid generic telemetry listing tasks with no failure, reliability, or engineering reasoning.", + ), + ), + "tsfm": FocusPolicy( + categories=( + "Inference Query", + "Anomaly Detection Query", + "Tuning Query", + "Complex Query", + ), + prompt_requirements=( + "Keep the primary burden on time-series forecasting, anomaly detection, model evaluation, or tuning.", + "Supporting IoT, vibration, FMSR, or WO steps are allowed, but TSFM must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid plain asset discovery or failure-list questions with no time-series analysis task.", + ), + ), + "wo": FocusPolicy( + categories=("Decision Support", "Prediction", "Knowledge Query"), + prompt_requirements=( + "Keep the primary burden on maintenance planning, alerts, events, work-order analysis, or maintenance decisions.", + "Supporting IoT, FMSR, TSFM, or vibration steps are allowed, but WO must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid plain sensor-list or standalone forecasting tasks with no maintenance decision component.", + ), + ), + "vibration": FocusPolicy( + categories=( + "Diagnostic Assessment", + "Bearing Analysis", + "Severity Assessment", + "Knowledge Query", + ), + prompt_requirements=( + "Keep the primary burden on vibration diagnostics, spectra, bearing reasoning, or severity assessment.", + "Supporting IoT, FMSR, TSFM, or WO steps are allowed, but vibration must remain the main focus.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid generic telemetry prompts that do not require vibration-specific tools or reasoning.", + ), + ), + "multiagent": FocusPolicy( + categories=("Knowledge Query", "Workflow Coordination"), + prompt_requirements=( + "Every multiagent scenario should require at least two distinct namespaces from iot, fmsr, tsfm, wo, and vibration.", + "The characteristic_form should mention a realistic coordinated workflow, not just a list of tool calls.", + ), + forbidden_patterns=( + FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, + "Avoid collapsing multiagent scenarios into a single-focus task.", + ), + ), +} + + +def get_scenario_policy(focus: str) -> FocusPolicy: + key = focus.lower() + if key not in SCENARIO_POLICIES: + raise KeyError(f"Unknown scenario policy for focus '{focus}'") + return SCENARIO_POLICIES[key] + + +def format_categories_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_categories() + + +def format_requirements_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_requirements() + + +def format_forbidden_patterns_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_forbidden_patterns() + + +def format_accepted_scenarios_for_prompt( + scenarios: Iterable[dict], limit: int = 12 +) -> str: + texts: list[str] = [] + for scenario in scenarios: + text = str(scenario.get("text", "")).strip() + if text: + texts.append(text) + if len(texts) >= limit: + break + return json.dumps(texts, indent=2) if texts else "[]" + + +def format_mode_requirements( + profile: AssetProfile, + focus: str, + generation_mode: str, +) -> str: + """Return prompt guidance for closed-form vs grounded open-form runs.""" + + if generation_mode == "open_form": + asset_ids = profile.grounded_asset_ids(focus) + sensors = profile.grounded_sensor_names(focus) + timestamps = profile.grounded_timestamps(focus) + lines = [ + "Use only grounded identifiers from the Asset Profile.", + f"Allowed sites: {', '.join(profile.grounded_sites()) or '(none)'}", + f"Allowed asset ids: {', '.join(asset_ids) or '(none)'}", + f"Allowed sensors: {', '.join(sensors[:20]) or '(none)'}", + f"Allowed timestamps: {', '.join(timestamps[:12]) or '(none)'}", + ] + return _format_bullet_list(lines) + + return _format_bullet_list( + ( + "Make the scenario self-contained. Do not assume hidden live site names, asset ids, sensor names, or timestamps.", + "In the scenario text, list concrete sensor measurements: for each channel, give the sensor name (or clear label), a numeric value, and a unit (e.g. ppm, %, Hz, mm/s, kV). Prefer names that appear under iot_sensors and vibration_sensors in the Asset Profile where applicable.", + 'Use operator-style phrasing such as: "What is the of a with the following sensor readings: , ..."', + "You may still embed rule text, short summaries, or dataset identifiers in the query when the task requires them.", + ) + ) diff --git a/src/scenarios/constraints/validation.py b/src/scenarios/constraints/validation.py new file mode 100644 index 000000000..192705733 --- /dev/null +++ b/src/scenarios/constraints/validation.py @@ -0,0 +1,248 @@ +"""Deterministic scenario validation.""" + +from __future__ import annotations + +from collections.abc import Iterable, Mapping +from dataclasses import dataclass +from difflib import SequenceMatcher +import json +import re + +from ..models import AssetProfile +from ..text import normalize_for_fuzzy_dedup + +_TOOL_PATTERN_TEMPLATE = r"(? dict: + return { + "index": index, + "text": str(self.scenario.get("text", "")), + "category": str(self.scenario.get("category", "")), + "reasons": list(self.reasons), + } + + +def failure_payload(failures: list[ScenarioValidationFailure]) -> str: + data = [ + failure.to_prompt_dict(index=index) for index, failure in enumerate(failures) + ] + return json.dumps(data, indent=2) + + +def validate_scenario_batch( + focus: str, + scenarios: list[dict], + accepted_scenarios: Iterable[dict] | None = None, + profile: AssetProfile | None = None, + generation_mode: str = "closed_form", + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None = None, +) -> tuple[list[dict], list[ScenarioValidationFailure]]: + prior_texts = [ + str(scenario.get("text", "")) + for scenario in (accepted_scenarios or []) + if str(scenario.get("text", "")).strip() + ] + valid: list[dict] = [] + failures: list[ScenarioValidationFailure] = [] + + for scenario in scenarios: + reasons = validate_scenario( + focus, + scenario, + accepted_texts=prior_texts + [str(item.get("text", "")) for item in valid], + profile=profile, + generation_mode=generation_mode, + tool_names_by_focus=tool_names_by_focus, + ) + if reasons: + failures.append( + ScenarioValidationFailure(scenario=scenario, reasons=tuple(reasons)) + ) + continue + valid.append(scenario) + + return valid, failures + + +def _flatten_tool_names( + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> tuple[str, ...]: + if not tool_names_by_focus: + return () + seen: set[str] = set() + ordered: list[str] = [] + for tools in tool_names_by_focus.values(): + for t in tools: + if t and t not in seen: + seen.add(t) + ordered.append(t) + return tuple(ordered) + + +def _validate_text_excludes_tool_names( + text: str, + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> list[str]: + if not tool_names_by_focus: + return [] + all_tools = _flatten_tool_names(tool_names_by_focus) + if not all_tools: + return [] + mentioned = _mentioned_tools(text, all_tools) + if not mentioned: + return [] + return [ + "scenario text must not name MCP tools or API functions " + f"(move tool names to characteristic_form only); found in text: {', '.join(mentioned)}" + ] + + +def validate_scenario( + focus: str, + scenario: dict, + accepted_texts: Iterable[str] | None = None, + profile: AssetProfile | None = None, + generation_mode: str = "closed_form", + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None = None, +) -> list[str]: + reasons = _validate_required_fields(scenario) + if reasons: + return reasons + + text = str(scenario["text"]).strip() + characteristic_form = str(scenario["characteristic_form"]).strip() + combined = f"{text}\n{characteristic_form}" + + reasons.extend(_validate_text_excludes_tool_names(text, tool_names_by_focus)) + + if _is_duplicate_text(text, accepted_texts or ()): + reasons.append( + f"text is a duplicate or near-duplicate of an already accepted scenario (threshold {_DUPLICATE_THRESHOLD:.2f})" + ) + + if focus == "multiagent": + reasons.extend( + _validate_multiagent_constraints(characteristic_form, tool_names_by_focus) + ) + else: + reasons.extend( + _validate_primary_focus(focus, characteristic_form, tool_names_by_focus) + ) + + if generation_mode == "open_form": + reasons.extend(_validate_open_form_grounding(focus, combined, profile)) + + return reasons + + +def _validate_required_fields(scenario: dict) -> list[str]: + reasons: list[str] = [] + for field in _REQUIRED_TEXT_FIELDS: + value = scenario.get(field) + if not isinstance(value, str) or not value.strip(): + reasons.append(f"field '{field}' must be a non-empty string") + return reasons + + +def _validate_primary_focus( + focus: str, + characteristic_form: str, + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> list[str]: + focus_tools = ( + tuple(tool_names_by_focus.get(focus, ())) if tool_names_by_focus else () + ) + if not focus_tools: + return [] + if _mentioned_tools(characteristic_form, focus_tools): + return [] + return [ + f"{focus} scenarios must explicitly mention at least one concrete {focus} tool in characteristic_form: " + + ", ".join(focus_tools) + ] + + +def _validate_multiagent_constraints( + characteristic_form: str, + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, +) -> list[str]: + if not tool_names_by_focus: + return [] + + mentioned_focuses = { + focus + for focus, tool_names in tool_names_by_focus.items() + if focus != "multiagent" and _mentioned_tools(characteristic_form, tool_names) + } + if len(mentioned_focuses) >= 2: + return [] + return [ + "multiagent scenarios must reference concrete tools from at least two distinct focuses in characteristic_form" + ] + + +def _validate_open_form_grounding( + focus: str, + combined: str, + profile: AssetProfile | None, +) -> list[str]: + if profile is None: + return ["open-form validation requires an Asset Profile"] + + allowed_identifiers = ( + profile.grounded_sites() + + profile.grounded_asset_ids(focus) + + profile.grounded_sensor_names(focus) + + profile.grounded_timestamps(focus) + ) + if not allowed_identifiers: + return [ + "open-form scenarios require grounded identifiers, but none were available in the profile" + ] + + lowered = combined.lower() + if any( + identifier.lower() in lowered + for identifier in allowed_identifiers + if identifier + ): + return [] + return [ + "open-form scenarios must use grounded site names, asset ids, sensors, or timestamps from the Asset Profile" + ] + + +def _is_duplicate_text(text: str, accepted_texts: Iterable[str]) -> bool: + normalized = normalize_for_fuzzy_dedup(text) + if not normalized: + return False + for accepted in accepted_texts: + accepted_normalized = normalize_for_fuzzy_dedup(accepted) + if not accepted_normalized: + continue + if ( + SequenceMatcher(None, normalized, accepted_normalized).ratio() + >= _DUPLICATE_THRESHOLD + ): + return True + return False + + +def _mentioned_tools(text: str, tools: Iterable[str]) -> list[str]: + lowered = text.lower() + hits: list[str] = [] + for tool in tools: + pattern = _TOOL_PATTERN_TEMPLATE.format(tool=re.escape(tool.lower())) + if re.search(pattern, lowered): + hits.append(tool) + return hits diff --git a/src/scenarios/failure_mapping/.gitkeep b/src/scenarios/failure_mapping/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/src/scenarios/failure_mapping/transformer.json b/src/scenarios/failure_mapping/transformer.json new file mode 100644 index 000000000..e3aed2dee --- /dev/null +++ b/src/scenarios/failure_mapping/transformer.json @@ -0,0 +1,556 @@ +{ + "asset_name": "Transformer", + "failure_modes": [ + "Partial Discharge in Oil", + "Thermal Fault \u2014 Oil Overheating", + "Thermal Fault \u2014 Core/Winding", + "Low-Energy Arcing (Sparking)", + "High-Energy Arcing", + "Tap Changer Mechanical Wear", + "Oil Contamination / Moisture Ingress", + "Cellulose Insulation Ageing", + "Oil Dielectric Degradation" + ], + "fm2sensor": { + "Cellulose Insulation Ageing": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il2", + "interfacial_v", + "inut", + "oti", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl2", + "water_content", + "wti" + ], + "High-Energy Arcing": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "wti" + ], + "Low-Energy Arcing (Sparking)": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl1", + "vl2", + "vl3", + "vl31", + "wti" + ], + "Oil Contamination / Moisture Ingress": [ + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "methane", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Oil Dielectric Degradation": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Partial Discharge in Oil": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "methane", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Tap Changer Mechanical Wear": [ + "ati", + "co", + "dbds", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "power_factor", + "rated_mva", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "wti" + ], + "Thermal Fault \u2014 Core/Winding": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ], + "Thermal Fault \u2014 Oil Overheating": [ + "acetylene", + "ati", + "co", + "dbds", + "dielectric_rigidity", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "oti", + "oti_a", + "oti_t", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "wti" + ] + }, + "sensor2fm": { + "acetylene": [ + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "ati": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "co": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "dbds": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "dielectric_rigidity": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "ethane": [ + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil" + ], + "ethylene": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "hydrogen": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "il1": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "il2": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "il3": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "interfacial_v": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "inut": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "methane": [ + "Oil Contamination / Moisture Ingress", + "Partial Discharge in Oil" + ], + "nitrogen": [ + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding" + ], + "oti": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "oti_a": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "oti_t": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "oxygen": [ + "Cellulose Insulation Ageing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil" + ], + "power_factor": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding" + ], + "rated_mva": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl1": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl12": [ + "High-Energy Arcing", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl2": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl23": [ + "High-Energy Arcing", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl3": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "vl31": [ + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ], + "water_content": [ + "Cellulose Insulation Ageing", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Thermal Fault \u2014 Core/Winding" + ], + "wti": [ + "Cellulose Insulation Ageing", + "High-Energy Arcing", + "Low-Energy Arcing (Sparking)", + "Oil Contamination / Moisture Ingress", + "Oil Dielectric Degradation", + "Partial Discharge in Oil", + "Tap Changer Mechanical Wear", + "Thermal Fault \u2014 Core/Winding", + "Thermal Fault \u2014 Oil Overheating" + ] + }, + "sensors": [ + "acetylene", + "ati", + "co", + "co2", + "dbds", + "dielectric_rigidity", + "ethane", + "ethylene", + "hydrogen", + "il1", + "il2", + "il3", + "interfacial_v", + "inut", + "methane", + "nitrogen", + "oti", + "oti_a", + "oti_t", + "oxygen", + "power_factor", + "rated_mva", + "vl1", + "vl12", + "vl2", + "vl23", + "vl3", + "vl31", + "water_content", + "wti" + ] +} \ No newline at end of file diff --git a/src/scenarios/generator.py b/src/scenarios/generator.py deleted file mode 100644 index 91c492815..000000000 --- a/src/scenarios/generator.py +++ /dev/null @@ -1,430 +0,0 @@ -import json -import logging -import asyncio -import os -import sys -import argparse -from datetime import datetime - -from dotenv import load_dotenv - -from .models import AssetProfile, Scenario, ScenarioBudget -from .retrieval import retrieve_asset_evidence -from .utils import fetch_hf_fewshot, parse_llm_json -from .prompts import ( - PROFILE_BUILDER_PROMPT, - SCENARIO_GENERATOR_PROMPT, - VALIDATE_REPAIR_PROMPT, - MULTIAGENT_COMBINER_PROMPT, - BUDGET_ALLOCATOR_PROMPT, -) - -from llm.litellm import LiteLLMBackend -from agent.plan_execute.executor import Executor -from agent.cli import _DEFAULT_MODEL - -_log = logging.getLogger(__name__) - - -def _print_section(title: str) -> None: - print(f"\n{'─' * 60}") - print(f" {title}") - print(f"{'─' * 60}") - - -def _print_step( - phase: str, - info: str, - details: str | None = None, - tool_info: str | None = None, -) -> None: - print(f" [OK ] Step ({phase}): {info}") - if tool_info: - print(f" {tool_info}") - if details: - indented = "\n".join(" " + line for line in details.splitlines()) - print(indented) - - -def _format_diff(scenario_id: str, old: dict, new: dict) -> str: - lines = [f" [VALIDATED] Scenario: {scenario_id}"] - for key in set(old.keys()) | set(new.keys()): - if old.get(key) != new.get(key): - v_old = json.dumps(old.get(key)) - v_new = json.dumps(new.get(key)) - if len(v_old) > 60: - v_old = v_old[:57] + "..." - if len(v_new) > 60: - v_new = v_new[:57] + "..." - - lines.append(f" {key}: {v_old}") - lines.append(f" ↓") - lines.append(f" {v_new}") - return "\n".join(lines) - - -class ScenarioGeneratorAgent: - def __init__( - self, - model_id: str = _DEFAULT_MODEL, - show_workflow: bool = False, - log_dir: str | None = None, - ) -> None: - self.llm = LiteLLMBackend(model_id=model_id) - self.executor = Executor(llm=self.llm) - self.show_workflow = show_workflow - self.log_dir = log_dir - self._log_step = 1 - - def _write_log(self, name: str, content: str) -> None: - if not self.log_dir: - return - os.makedirs(self.log_dir, exist_ok=True) - path = os.path.join(self.log_dir, f"{self._log_step:02d}_{name}.txt") - with open(path, "w") as f: - f.write(content) - self._log_step += 1 - - def _handle_parse_failure( - self, - step_name: str, - response: str, - error_msg: str | None, - ) -> None: - _log.warning(f"Failed to parse LLM response for '{step_name}'. Error: {error_msg}") - if self.show_workflow: - print(f" [ERR!] Step ({step_name}): LLM output parsing failed.") - print(f" Reason: {error_msg}") - if response: - print(f" Raw Response: {response}") - else: - print(f" Raw Response: ") - - async def run(self, asset_name: str, num_scenarios: int = 50) -> list[Scenario]: - _log.info(f"Starting scenario generation for asset: {asset_name}") - - server_desc = await self.executor.get_server_descriptions() - - if self.show_workflow: - _print_section("Phase 1: Asset Profile Construction") - asset_profile = await self.build_asset_profile(asset_name, server_desc) - - if self.show_workflow: - _print_section("Phase 2: Scenario Budget Allocation") - budget = await self.allocate_budget(asset_profile, total=num_scenarios) - - if self.show_workflow: - _print_section("Phase 3: Individual Agent - Generation & Validation") - - all_scenarios = [] - for subagent, count in budget.allocation.items(): - if count == 0: - continue - - if subagent == "multiagent": - continue - - if self.show_workflow: - _print_section(f"{subagent.upper()} Agent") - - _log.info(f"Generating {count} scenarios for subagent: {subagent}") - - if self.show_workflow: - ds_query = f"HuggingFace dataset 'ibm-research/AssetOpsBench' target_type={subagent}" - _print_step( - f"generate_{subagent}", - f"Generating {count} scenarios for subagent: {subagent}", - tool_info=f"src: {ds_query}", - ) - - scenarios = self.generate_single_agent_scenarios(subagent, count, asset_profile, server_desc) - - _log.info(f"Validating {count} scenarios for subagent: {subagent}") - valid_scenarios = self.validate_and_repair(scenarios, asset_profile) - - changed_indices = [] - if len(scenarios) == len(valid_scenarios): - for i, (s1, s2) in enumerate(zip(scenarios, valid_scenarios)): - if json.dumps(s1, sort_keys=True) != json.dumps(s2, sort_keys=True): - changed_indices.append(i) - else: - _log.warning(f"Scenario count mismatch after validation: {len(scenarios)} -> {len(valid_scenarios)}") - - generated_count = 0 - diff_logs = [] - for i, s in enumerate(valid_scenarios): - s["type"] = subagent - s["id"] = f"{asset_name.replace(' ', '_').lower()}_{subagent}_{len(all_scenarios)+1:02d}" - - if i in changed_indices: - diff_logs.append(_format_diff(s["id"], scenarios[i], s)) - - all_scenarios.append(Scenario(**s)) - generated_count += 1 - - if diff_logs: - self._write_log(f"{subagent}_validation_changes", "\n\n".join(diff_logs)) - - if self.show_workflow: - _print_step( - f"validate_{subagent}", - f"Validated {generated_count} scenarios (Made {len(changed_indices)} validation changes)", - ) - - multiagent_count = budget.allocation.get("multiagent", 0) - if multiagent_count > 0: - if self.show_workflow: - _print_section("Phase 4: Multi-Agent Scenario Construction") - _log.info(f"Generating {multiagent_count} multiagent scenarios") - single_dicts = [s.model_dump() for s in all_scenarios] - - if self.show_workflow: - _print_step("generate_multiagent", f"Combining existing scenarios into {multiagent_count} multiagent scenarios.") - - multi_scenarios = self.construct_multiagent_scenarios(multiagent_count, single_dicts, asset_profile, server_desc) - - _log.info(f"Validating multiagent scenarios") - valid_multi = self.validate_and_repair(multi_scenarios, asset_profile) - - changed_indices_multi = [] - if len(multi_scenarios) == len(valid_multi): - for i, (s1, s2) in enumerate(zip(multi_scenarios, valid_multi)): - if json.dumps(s1, sort_keys=True) != json.dumps(s2, sort_keys=True): - changed_indices_multi.append(i) - - multi_generated = 0 - diff_logs_multi = [] - for i, s in enumerate(valid_multi): - s["type"] = "multiagent" - s["id"] = f"{asset_name.replace(' ', '_').lower()}_multiagent_{len(all_scenarios)+1:02d}" - - if i in changed_indices_multi: - diff_logs_multi.append(_format_diff(s["id"], multi_scenarios[i], s)) - - all_scenarios.append(Scenario(**s)) - multi_generated += 1 - - if diff_logs_multi: - self._write_log("multiagent_validation_changes", "\n\n".join(diff_logs_multi)) - - if self.show_workflow: - _print_step("validate_multiagent", f"Validated {len(multi_generated)} multiagent scenarios (Made {len(changed_indices_multi)} validation changes)") - - if self.show_workflow: - _print_section("Summary") - print(f"Successfully generated {len(all_scenarios)} total scenarios for asset: {asset_name}.\n") - - return all_scenarios - - async def build_asset_profile(self, asset_name: str, server_desc: dict) -> AssetProfile: - if self.show_workflow: - _print_step("researcher_queries", f"Planning bounded ArXiv retrieval for {asset_name}...") - - evidence_bundle = retrieve_asset_evidence( - asset_name=asset_name, - server_desc=server_desc, - llm=self.llm, - log_writer=self._write_log, - ) - - if self.show_workflow: - top_titles = "\n".join( - f" - {candidate.title} (judge_score={candidate.judge_score}/10)" - for candidate in evidence_bundle.candidates[:3] - ) or " - No ranked candidates" - details = ( - f"Canonical asset: {evidence_bundle.canonical_asset_name}\n" - f"Steps: {evidence_bundle.diagnostics.steps_run}\n" - f"Metadata requests: {evidence_bundle.diagnostics.metadata_requests}\n" - f"PDF requests: {evidence_bundle.diagnostics.pdf_requests}\n" - f"Cooldown: {evidence_bundle.diagnostics.cooldown_seconds:.1f}s\n" - f"Queries:\n" - + "\n".join(f" - {query}" for query in evidence_bundle.query_history) - + "\nTop Evidence:\n" - + top_titles - ) - if evidence_bundle.diagnostics.finish_reason: - details += f"\nFinish: {evidence_bundle.diagnostics.finish_reason}" - _print_step("arxiv_search_result", "ArXiv evidence retrieval complete", details=details) - - tools_str = json.dumps(server_desc, indent=2) - - prompt = PROFILE_BUILDER_PROMPT.format( - asset_name=asset_name, - evidence_bundle_json=evidence_bundle.model_dump_json(indent=2), - tool_descriptions=tools_str, - ) - self._write_log("asset_profile_prompt", prompt) - - response = self.llm.generate(prompt) - self._write_log("asset_profile_response", response) - parsed, parse_err = parse_llm_json(response) - - if not parsed or not isinstance(parsed, dict): - self._handle_parse_failure("build_profile", response, parse_err) - raise RuntimeError(f"Critical failure: Could not construct AssetProfile for '{asset_name}'.") - profile = AssetProfile(**parsed) - - if self.show_workflow: - _print_step("build_profile", f"Successfully generated Asset Profile for '{asset_name}'.", profile.model_dump_json(indent=2)) - - self._write_log(f"asset_profile_{asset_name}_json", profile.model_dump_json(indent=2)) - return profile - - async def allocate_budget(self, profile: AssetProfile, total: int = 50) -> ScenarioBudget: - prompt = BUDGET_ALLOCATOR_PROMPT.format( - total_scenarios=total, - asset_profile_json=profile.model_dump_json(), - ) - self._write_log("budget_allocation_prompt", prompt) - - response = self.llm.generate(prompt) - self._write_log("budget_allocation_response", response) - parsed, parse_err = parse_llm_json(response) - - if not parsed or not isinstance(parsed, dict) or "allocation" not in parsed: - self._handle_parse_failure("allocate_budget", response, parse_err) - raise RuntimeError("Critical failure: Could not dynamically allocate scenario budget.") - budget = ScenarioBudget( - total_scenarios=total, - allocation=parsed["allocation"], - reasoning=parsed.get("reasoning", ""), - ) - - if self.show_workflow: - details = f"Reasoning: {budget.reasoning}\n\nAllocation:\n" - details += "\n".join(f" - {k}: {v}" for k, v in budget.allocation.items()) - _print_step("allocate_budget", f"Successfully allocated {total} scenarios across agents.", details=details) - - return budget - - def generate_single_agent_scenarios(self, subagent: str, count: int, profile: AssetProfile, server_desc: dict) -> list[dict]: - few_shots = fetch_hf_fewshot(split="scenarios", target_type=subagent, fallback_if_missing=True) - few_shots_str = json.dumps(few_shots[:2], indent=2) - - category_map = { - "iot": "Data Query, Knowledge Query", - "fmsr": "Knowledge Query", - "tsfm": "Knowledge Query, Anomaly Detection Query, Tuning Query, Inference Query, Complex Query", - "wo": "Decision Support, Prediction, Knowledge Query", - } - category_options = category_map.get(subagent.lower(), "Knowledge Query") - example_category = category_options.split(",")[0].strip() - - subagent_tools = json.dumps(server_desc.get(subagent, {}), indent=2) - - prompt = SCENARIO_GENERATOR_PROMPT.format( - count=count, - subagent_name=subagent, - asset_name=profile.asset_name, - asset_profile_json=profile.model_dump_json(), - tool_definitions=subagent_tools, - few_shot_examples=few_shots_str, - category_options=category_options, - example_category=example_category, - ) - self._write_log(f"{subagent}_generation_prompt", prompt) - - response = self.llm.generate(prompt) - self._write_log(f"{subagent}_generation_response", response) - parsed, parse_err = parse_llm_json(response) - - if isinstance(parsed, list): - return parsed - self._handle_parse_failure(f"generate_{subagent}", response, parse_err) - return [] - - def validate_and_repair(self, scenarios: list[dict], profile: AssetProfile) -> list[dict]: - if not scenarios: - return [] - - prompt = VALIDATE_REPAIR_PROMPT.format( - asset_profile_json=profile.model_dump_json(), - input_scenarios_json=json.dumps(scenarios, indent=2), - ) - self._write_log("validate_repair_prompt", prompt) - - response = self.llm.generate(prompt) - self._write_log("validate_repair_response", response) - parsed, parse_err = parse_llm_json(response) - - if isinstance(parsed, list): - if len(parsed) > len(scenarios): - _log.warning( - "validate_and_repair returned %d scenarios but only %d were submitted; truncating extras.", - len(parsed), - len(scenarios), - ) - parsed = parsed[:len(scenarios)] - return parsed - self._handle_parse_failure("validate_repair", response, parse_err) - return scenarios - - def construct_multiagent_scenarios(self, count: int, single_agents: list[dict], profile: AssetProfile, server_desc: dict) -> list[dict]: - all_tools = json.dumps(server_desc, indent=2) - - prompt = MULTIAGENT_COMBINER_PROMPT.format( - count=count, - asset_name=profile.asset_name, - asset_profile_json=profile.model_dump_json(), - mcp_function_definitions=all_tools, - single_agent_scenarios_json=json.dumps(single_agents[:10], indent=2), - ) - self._write_log("multiagent_combiner_prompt", prompt) - - response = self.llm.generate(prompt) - self._write_log("multiagent_combiner_response", response) - parsed, parse_err = parse_llm_json(response) - - if isinstance(parsed, list): - return parsed - self._handle_parse_failure("multiagent_combiner", response, parse_err) - return [] - - -def main(): - load_dotenv() - - parser = argparse.ArgumentParser(description="Scenario Generator for AssetOpsBench") - parser.add_argument("asset_name", help="Name of the asset (e.g. 'Chiller' or 'Wind Turbine')") - parser.add_argument("--model-id", default=_DEFAULT_MODEL, help="Model ID for LiteLLM") - parser.add_argument("--output", default="generated_scenarios.json", help="Path to output JSON file") - parser.add_argument("--num-scenarios", type=int, default=50, help="Total number of scenarios to generate") - parser.add_argument("--show-workflow", action="store_true", help="Show intermediate pipeline steps in the console") - parser.add_argument("--log", action="store_true", help="Dump raw prompts and results to a log directory") - - args = parser.parse_args() - - level = logging.WARNING if args.show_workflow else logging.INFO - logging.basicConfig(level=level, format="%(asctime)s %(levelname)s %(message)s") - - log_dir = None - if args.log: - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - log_dir = f"logs/gen_{args.asset_name.lower().replace(' ', '_')}_{timestamp}" - print(f"Logging session to: {log_dir}") - os.makedirs(log_dir, exist_ok=True) - - agent = ScenarioGeneratorAgent(model_id=args.model_id, show_workflow=args.show_workflow, log_dir=log_dir) - - try: - final_scenarios = asyncio.run(agent.run(args.asset_name, num_scenarios=args.num_scenarios)) - except Exception as exc: - print(f"\n[FATAL ERROR] {exc}") - sys.exit(1) - - if not final_scenarios: - print("\n[WARNING] No scenarios were successfully generated and validated.") - sys.exit(0) - - with open(args.output, "w") as f: - json.dump([s.to_dict() for s in final_scenarios], f, indent=2) - - if not args.show_workflow: - print(f"Success! Generated {len(final_scenarios)} scenarios at {args.output}") - else: - print(f"Scenarios saved to {args.output}") - - -if __name__ == "__main__": - main() diff --git a/src/scenarios/generator/__init__.py b/src/scenarios/generator/__init__.py new file mode 100644 index 000000000..0825da535 --- /dev/null +++ b/src/scenarios/generator/__init__.py @@ -0,0 +1,12 @@ +"""Scenario generation: orchestration, validation loop, and CLI (`python -m scenarios.generator`).""" + +from .agent import ScenarioGeneratorAgent +from .cli import main +from .prompt_helpers import DEFAULT_GENERATED_SCENARIOS_DIR, default_scenario_output_path + +__all__ = [ + "DEFAULT_GENERATED_SCENARIOS_DIR", + "ScenarioGeneratorAgent", + "default_scenario_output_path", + "main", +] diff --git a/src/scenarios/generator/__main__.py b/src/scenarios/generator/__main__.py new file mode 100644 index 000000000..9ae637f13 --- /dev/null +++ b/src/scenarios/generator/__main__.py @@ -0,0 +1,4 @@ +from .cli import main + +if __name__ == "__main__": + main() diff --git a/src/scenarios/generator/agent.py b/src/scenarios/generator/agent.py new file mode 100644 index 000000000..af5a79787 --- /dev/null +++ b/src/scenarios/generator/agent.py @@ -0,0 +1,700 @@ +"""Scenario generation orchestration and validation loop.""" + +from __future__ import annotations + +import json +import logging +from pathlib import Path + +from agent.cli import _DEFAULT_MODEL +from agent.plan_execute.executor import Executor +from llm.litellm import LiteLLMBackend + +from ..constraints import ( + FOCUS_ORDER, + ScenarioValidationFailure, + failure_payload, + format_accepted_scenarios_for_prompt, + format_categories_for_prompt, + format_forbidden_patterns_for_prompt, + format_mode_requirements, + format_requirements_for_prompt, + get_scenario_policy, + validate_scenario_batch, +) +from ..grounding import discover_grounding +from ..models import ( + AssetProfile, + GroundingBundle, + KeyDescription, + Scenario, + ScenarioBudget, + SensorNameDescription, +) +from ..prompts import ( + BUDGET_ALLOCATOR_PROMPT, + MULTIAGENT_COMBINER_PROMPT, + PROFILE_BUILDER_PROMPT, + SCENARIO_GENERATOR_PROMPT, + VALIDATE_REPAIR_PROMPT, +) +from ..retrieval import retrieve_asset_evidence +from ..text import slugify_asset_name +from ..utils import fetch_hf_fewshot, parse_llm_json +from .prompt_helpers import ( + _MULTIAGENT_MAX_TOKENS, + _MAX_FEWSHOT_EXAMPLES, + _MAX_SCENARIO_ATTEMPTS, + _PROFILE_MAX_TOKENS, + _asset_profile_json, + _evidence_summary_for_prompt, + _few_shot_examples_section, + _grounding_summary_for_prompt, + _invert_failure_mapping, + _label_desc_dict_from_list, + _multiagent_budget_cap, + _normalize_failure_sensor_mapping, + _normalize_string_list, + _ordered_descriptions, + _print_live_step, + _print_section, + _print_step, + _redact_logged_prompt, + _require_nonempty_list, + _require_nonempty_str, + _quiet_litellm_logging, + _tool_summary_for_prompt, + _validation_tool_names_by_focus, +) + +_log = logging.getLogger(__name__) + + +def _scenario_from_llm_row( + row: dict, + *, + scenario_type: str, + generation_mode: str, +) -> Scenario: + """Build a ``Scenario`` from parsed LLM JSON; drop any ``type`` key so the pipeline value wins.""" + + payload = dict(row) + payload.pop("type", None) + return Scenario(**payload, type=scenario_type, generation_mode=generation_mode) + + +class ScenarioGeneratorAgent: + def __init__( + self, + model_id: str = _DEFAULT_MODEL, + show_workflow: bool = False, + log_dir: str | None = None, + ) -> None: + _quiet_litellm_logging() + self.llm = LiteLLMBackend(model_id=model_id) + self.executor = Executor(llm=self.llm) + self.show_workflow = show_workflow + self.log_dir = log_dir + self._log_steps_by_subdir: dict[str, int] = {} + + def _log_path(self, name: str, *, step: int) -> Path: + if not self.log_dir: + raise RuntimeError("log_dir must be configured before writing logs") + relative = Path(name) + suffix = relative.suffix or ".txt" + stem = relative.stem if relative.suffix else relative.name + filename = f"{step:02d}_{stem}{suffix}" + return Path(self.log_dir) / relative.parent / filename + + def _write_log(self, name: str, content: str) -> None: + if not self.log_dir: + return + relative = Path(name) + dir_key = relative.parent.as_posix() if relative.parent != Path(".") else "" + step = self._log_steps_by_subdir.get(dir_key, 0) + 1 + path = self._log_path(name, step=step) + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("w") as handle: + handle.write(content) + self._log_steps_by_subdir[dir_key] = step + + def _write_json_log(self, name: str, payload: object) -> None: + log_name = name if name.endswith(".json") else f"{name}.json" + self._write_log(log_name, json.dumps(payload, indent=2)) + + async def run( + self, + asset_name: str, + num_scenarios: int = 50, + data_in_couchdb: bool = False, + ) -> list[Scenario]: + asset_name = asset_name.strip() + if not asset_name: + raise ValueError("Asset class name is empty after stripping whitespace.") + _log.info("Starting scenario generation for asset: %s", asset_name) + server_desc = await self.executor.get_server_descriptions() + + if self.show_workflow: + _print_section("Phase 1: Asset Profile Construction") + asset_profile = await self.build_asset_profile( + asset_name=asset_name, + server_desc=server_desc, + requested_open_form=data_in_couchdb, + ) + + if self.show_workflow: + _print_section("Phase 2: Scenario Budget Allocation") + budget = await self.allocate_budget(asset_profile, total=num_scenarios) + + if self.show_workflow: + _print_section("Phase 3: Focused Generation & Validation") + + all_scenarios: list[Scenario] = [] + validation_tool_names = _validation_tool_names_by_focus(server_desc) + for focus, count in budget.allocation.items(): + if count == 0 or focus == "multiagent": + continue + + if self.show_workflow: + _print_section(f"{focus.upper()} Focus") + _print_step( + f"generate_{focus}", + f"Generating {count} {focus} scenarios in {asset_profile.generation_mode}", + ) + + valid_scenarios = self.generate_validated_scenarios( + focus=focus, + count=count, + profile=asset_profile, + server_desc=server_desc, + accepted_scenarios=[scenario.to_dict() for scenario in all_scenarios], + validation_tool_names=validation_tool_names, + ) + + for scenario_data in valid_scenarios: + scenario_data["id"] = f"{slugify_asset_name(asset_name)}_scenario_{len(all_scenarios)+1:02d}" + all_scenarios.append( + _scenario_from_llm_row( + scenario_data, + scenario_type=focus, + generation_mode=asset_profile.generation_mode, + ) + ) + + if self.show_workflow: + _print_step( + f"validate_{focus}", + f"Validated {len(valid_scenarios)} {focus} scenarios", + ) + + multiagent_count = budget.allocation.get("multiagent", 0) + if multiagent_count > 0: + if self.show_workflow: + _print_section("Phase 4: Multi-Agent Scenario Construction") + valid_multi = self.generate_validated_scenarios( + focus="multiagent", + count=multiagent_count, + profile=asset_profile, + server_desc=server_desc, + accepted_scenarios=[scenario.to_dict() for scenario in all_scenarios], + single_agents=[scenario.to_dict() for scenario in all_scenarios], + validation_tool_names=validation_tool_names, + ) + + for scenario_data in valid_multi: + scenario_data["id"] = f"{slugify_asset_name(asset_name)}_scenario_{len(all_scenarios)+1:02d}" + all_scenarios.append( + _scenario_from_llm_row( + scenario_data, + scenario_type="multiagent", + generation_mode=asset_profile.generation_mode, + ) + ) + + if self.show_workflow: + _print_step("validate_multiagent", f"Validated {len(valid_multi)} multiagent scenarios") + + if self.show_workflow: + _print_section("Summary") + print( + f"Successfully generated {len(all_scenarios)} total scenarios for asset: {asset_name} " + f"in {asset_profile.generation_mode} mode.\n" + ) + + return all_scenarios + + async def build_asset_profile( + self, + asset_name: str, + server_desc: dict, + requested_open_form: bool = False, + ) -> AssetProfile: + asset_name = asset_name.strip() + if not asset_name: + raise ValueError("Asset class name is empty after stripping whitespace.") + if self.show_workflow: + _print_step( + "grounding_start", + f"Starting grounded discovery for {asset_name}...", + details="Inspecting IoT coverage, vibration coverage, and bounded FMSR grounding.", + ) + grounding = discover_grounding(asset_name, requested_open_form=requested_open_form) + self._write_json_log("01_grounding/discovery.json", grounding.model_dump()) + generation_mode = "open_form" if grounding.open_form_eligible else "closed_form" + + if self.show_workflow: + details = ( + f"Requested open form: {requested_open_form}\n" + f"Resolved generation mode: {generation_mode}\n" + f"Grounded instances: {len(grounding.asset_instances)}\n" + ) + _print_step("grounding", "Grounded discovery complete", details=details) + _print_step("researcher_queries", f"Planning bounded ArXiv retrieval for {asset_name}...") + + evidence_bundle = retrieve_asset_evidence( + asset_name=asset_name, + server_desc=server_desc, + llm=self.llm, + log_writer=self._write_log, + ) + + if self.show_workflow: + top_titles = "\n".join( + f" - {candidate.title} (judge_score={candidate.judge_score}/10)" + for candidate in evidence_bundle.candidates[:3] + ) or " - No ranked candidates" + details = ( + f"Canonical asset: {evidence_bundle.canonical_asset_name}\n" + f"Queries:\n" + + "\n".join(f" - {query}" for query in evidence_bundle.query_history) + + "\nTop Evidence:\n" + + top_titles + ) + _print_step("arxiv_search_result", "ArXiv evidence retrieval complete", details=details) + + prompt = PROFILE_BUILDER_PROMPT.format( + asset_name=asset_name, + generation_mode=generation_mode, + grounding_summary_json=_grounding_summary_for_prompt(grounding), + evidence_summary_json=_evidence_summary_for_prompt(evidence_bundle), + tool_descriptions=_tool_summary_for_prompt(server_desc), + ) + self._write_log("03_asset_profile/prompt.txt", prompt) + + response = self.llm.generate(prompt, max_tokens=_PROFILE_MAX_TOKENS) + parsed, parse_err = parse_llm_json(response) + if not parsed or not isinstance(parsed, dict): + raise RuntimeError( + f"Failed to parse asset profile JSON from LLM: {parse_err or 'response is not a JSON object'}" + ) + self._write_json_log("03_asset_profile/response.json", parsed) + + profile = self._merge_profile(parsed, grounding, generation_mode) + self._write_json_log("03_asset_profile/final_asset_profile.json", profile.model_dump()) + if self.show_workflow: + details: str | None = None + if self.log_dir: + details = "Full profile JSON is saved under 03_asset_profile/ in the log directory." + _print_step( + "build_profile", + f"Successfully generated Asset Profile for '{asset_name}'.", + details=details, + ) + return profile + + def _merge_profile( + self, + parsed_profile: dict, + grounding: GroundingBundle, + generation_mode: str, + ) -> AssetProfile: + merged = dict(parsed_profile) + merged["asset_name"] = grounding.asset_name + merged["generation_mode"] = generation_mode + merged["asset_instances"] = [instance.model_dump() for instance in grounding.asset_instances] + + merged_failure_mapping = _normalize_failure_sensor_mapping(merged.get("failure_sensor_mapping", {})) + if grounding.failure_sensor_mapping: + merged["failure_sensor_mapping"] = grounding.failure_sensor_mapping + merged_failure_mapping = grounding.failure_sensor_mapping + elif merged_failure_mapping: + merged["failure_sensor_mapping"] = merged_failure_mapping + else: + merged["failure_sensor_mapping"] = {} + + grounded_failure_modes = _normalize_string_list(grounding.failure_modes) + from_list_fm = _label_desc_dict_from_list( + merged.get("failure_modes"), + primary="key", + alternate="name", + ) + all_failure_mode_keys = list( + dict.fromkeys( + [ + *grounded_failure_modes, + *merged_failure_mapping.keys(), + *from_list_fm.keys(), + ] + ) + ) + + if grounding.sensor_failure_mapping: + merged["sensor_failure_mapping"] = grounding.sensor_failure_mapping + elif merged_failure_mapping: + merged["sensor_failure_mapping"] = _invert_failure_mapping(merged_failure_mapping) + else: + merged["sensor_failure_mapping"] = {} + + merged["description"] = _require_nonempty_str(merged.get("description"), field="description") + + req_iot = sorted(dict.fromkeys(str(s).strip() for s in grounding.iot_sensors if str(s).strip())) + req_vib = sorted(dict.fromkeys(str(s).strip() for s in grounding.vibration_sensors if str(s).strip())) + + iot_from_llm = _label_desc_dict_from_list(merged.get("iot_sensors"), primary="name", alternate="key") + vib_from_llm = _label_desc_dict_from_list(merged.get("vibration_sensors"), primary="name", alternate="key") + + merged["iot_sensors"] = _ordered_descriptions( + iot_from_llm, + req_iot, + field="iot_sensors", + build=lambda n, d: SensorNameDescription(name=n, description=d), + sort_when_ordered_empty=True, + ) + merged["vibration_sensors"] = _ordered_descriptions( + vib_from_llm, + req_vib, + field="vibration_sensors", + build=lambda n, d: SensorNameDescription(name=n, description=d), + sort_when_ordered_empty=True, + ) + + if not all_failure_mode_keys: + merged["failure_modes"] = [ + KeyDescription(key=k, description=from_list_fm[k]) + for k in sorted(from_list_fm.keys()) + ] + else: + merged["failure_modes"] = _ordered_descriptions( + from_list_fm, + all_failure_mode_keys, + field="failure_modes", + build=lambda k, d: KeyDescription(key=k, description=d), + ) + + if not isinstance(merged.get("relevant_tools"), dict): + raise ValueError("Asset profile field 'relevant_tools' must be an object keyed by focus") + tool_focuses = tuple(f for f in FOCUS_ORDER if f != "multiagent") + normalized_relevant: dict[str, list] = {} + for focus in tool_focuses: + tools = merged["relevant_tools"].get(focus) + if tools is None: + normalized_relevant[focus] = [] + continue + if not isinstance(tools, list): + raise ValueError( + f"Asset profile field 'relevant_tools.{focus}' must be a list " + f"(use [] when this subagent is not applicable)" + ) + normalized_relevant[focus] = tools + merged["relevant_tools"] = normalized_relevant + merged["operator_tasks"] = _require_nonempty_list(merged.get("operator_tasks"), field="operator_tasks") + merged["manager_tasks"] = _require_nonempty_list(merged.get("manager_tasks"), field="manager_tasks") + merged["iso_standards"] = _require_nonempty_list(merged.get("iso_standards"), field="iso_standards") + return AssetProfile(**merged) + + async def allocate_budget(self, profile: AssetProfile, total: int = 50) -> ScenarioBudget: + prompt = BUDGET_ALLOCATOR_PROMPT.format( + total_scenarios=total, + asset_profile_json=profile.model_dump_json(indent=2), + ) + self._write_log("04_budget/prompt.txt", prompt) + + response = self.llm.generate(prompt) + parsed, _ = parse_llm_json(response) + if not parsed or not isinstance(parsed, dict): + parsed = {} + self._write_json_log("04_budget/response.json", parsed) + + allocation = self._normalize_allocation(parsed.get("allocation", {}), total) + budget = ScenarioBudget( + total_scenarios=total, + allocation=allocation, + reasoning=str(parsed.get("reasoning", "")).strip(), + ) + + if self.show_workflow: + details = f"Reasoning: {budget.reasoning or '(not provided)'}\n\nAllocation:\n" + details += "\n".join(f" - {focus}: {count}" for focus, count in budget.allocation.items()) + _print_step("allocate_budget", f"Successfully allocated {total} scenarios across focuses.", details=details) + + return budget + + def _normalize_allocation(self, raw_allocation: dict, total: int) -> dict[str, int]: + allocation = { + focus: max(0, int(raw_allocation.get(focus, 0) or 0)) + for focus in FOCUS_ORDER + } + if not any(allocation.values()): + raise RuntimeError("Budget allocator returned an empty allocation; refusing to default.") + + allocation["multiagent"] = min( + allocation["multiagent"], _multiagent_budget_cap(total) + ) + current_total = sum(allocation.values()) + if current_total == 0: + raise RuntimeError("Budget allocator produced a zero-sum allocation; refusing to default.") + + if current_total > total: + overflow = current_total - total + for focus in ("multiagent", "wo", "vibration", "tsfm", "fmsr", "iot"): + if overflow <= 0: + break + reducible = min(allocation[focus], overflow) + allocation[focus] -= reducible + overflow -= reducible + elif current_total < total: + deficit = total - current_total + allowed = list(FOCUS_ORDER) + while deficit > 0 and allowed: + for focus in allowed: + if deficit <= 0: + break + if focus == "multiagent" and allocation["multiagent"] >= _multiagent_budget_cap( + total + ): + continue + allocation[focus] += 1 + deficit -= 1 + return allocation + + def generate_single_focus_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + ) -> list[dict]: + few_shots = fetch_hf_fewshot( + focus=focus, + max_examples=_MAX_FEWSHOT_EXAMPLES, + ) + profile_json = _asset_profile_json(profile) + prompt = SCENARIO_GENERATOR_PROMPT.format( + count=count, + subagent_name=focus, + asset_name=profile.asset_name, + generation_mode=profile.generation_mode, + asset_profile_json=profile_json, + tool_definitions=json.dumps(server_desc.get(focus, {}), indent=2), + few_shot_examples_section=_few_shot_examples_section(few_shots), + category_options=format_categories_for_prompt(focus), + specialization_requirements=format_requirements_for_prompt(focus), + forbidden_patterns=format_forbidden_patterns_for_prompt(focus), + mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + ) + self._write_log( + f"05_generation/{focus}/generation_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate(prompt) + parsed, _ = parse_llm_json(response) + if isinstance(parsed, list): + self._write_json_log(f"05_generation/{focus}/generation_response.json", parsed) + return parsed + self._write_json_log(f"05_generation/{focus}/generation_response.json", []) + return [] + + def validate_and_repair( + self, + focus: str, + scenarios: list[dict], + profile: AssetProfile, + accepted_scenarios: list[dict] | None = None, + failures: list[ScenarioValidationFailure] | None = None, + ) -> list[dict]: + if not scenarios: + return [] + + profile_json = _asset_profile_json(profile) + prompt = VALIDATE_REPAIR_PROMPT.format( + subagent_name=focus, + category_options=format_categories_for_prompt(focus), + specialization_requirements=format_requirements_for_prompt(focus), + forbidden_patterns=format_forbidden_patterns_for_prompt(focus), + mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), + asset_profile_json=profile_json, + input_scenarios_json=json.dumps(scenarios, indent=2), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + validation_failures_json=failure_payload(failures or []), + ) + self._write_log( + f"05_generation/{focus}/validate_repair_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate(prompt) + parsed, _ = parse_llm_json(response) + if isinstance(parsed, list): + repaired = parsed[: len(scenarios)] + self._write_json_log(f"05_generation/{focus}/validate_repair_response.json", repaired) + return repaired + self._write_json_log(f"05_generation/{focus}/validate_repair_response.json", scenarios) + return scenarios + + def construct_multiagent_scenarios( + self, + count: int, + single_agents: list[dict], + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + ) -> list[dict]: + profile_json = _asset_profile_json(profile) + prompt = MULTIAGENT_COMBINER_PROMPT.format( + count=count, + asset_name=profile.asset_name, + generation_mode=profile.generation_mode, + asset_profile_json=profile_json, + mcp_function_definitions=json.dumps(server_desc, indent=2), + single_agent_scenarios_json=json.dumps(single_agents[:10], indent=2), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + mode_requirements=format_mode_requirements(profile, "multiagent", profile.generation_mode), + forbidden_patterns=format_forbidden_patterns_for_prompt("multiagent"), + ) + self._write_log( + "05_generation/multiagent/generation_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate(prompt, max_tokens=_MULTIAGENT_MAX_TOKENS) + parsed, _ = parse_llm_json(response) + if isinstance(parsed, list): + self._write_json_log("05_generation/multiagent/generation_response.json", parsed) + return parsed + self._write_json_log("05_generation/multiagent/generation_response.json", []) + return [] + + def generate_validated_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + single_agents: list[dict] | None = None, + validation_tool_names: dict[str, tuple[str, ...]] | None = None, + ) -> list[dict]: + accepted_scenarios = list(accepted_scenarios or []) + valid_batch: list[dict] = [] + failure_notes: list[str] = [] + last_llm_was_validate_repair = False + + for attempt in range(1, _MAX_SCENARIO_ATTEMPTS + 1): + remaining = count - len(valid_batch) + if remaining <= 0: + break + + baseline = accepted_scenarios + valid_batch + generated = self._generate_attempt_batch( + focus=focus, + count=remaining, + profile=profile, + server_desc=server_desc, + accepted_scenarios=baseline, + single_agents=single_agents, + ) + if not generated: + failure_notes.append(f"attempt {attempt}: generator returned no parseable scenarios") + last_llm_was_validate_repair = False + continue + + valid_now, failures = validate_scenario_batch( + focus=focus, + scenarios=generated, + accepted_scenarios=baseline, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(valid_now) + + if failures: + self._write_log( + f"05_generation/{focus}/deterministic_failures_attempt_{attempt:02d}.json", + failure_payload(failures), + ) + if self.show_workflow: + _print_live_step( + f"repair_{focus}", + f"Repairing {len(failures)} scenario(s)", + ) + repaired_invalids = self.validate_and_repair( + focus=focus, + scenarios=[failure.scenario for failure in failures], + profile=profile, + accepted_scenarios=accepted_scenarios + valid_batch, + failures=failures, + ) + last_llm_was_validate_repair = True + repaired_valid, remaining_failures = validate_scenario_batch( + focus=focus, + scenarios=repaired_invalids, + accepted_scenarios=accepted_scenarios + valid_batch, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(repaired_valid) + if remaining_failures: + failure_notes.append( + f"attempt {attempt}: {len(remaining_failures)} scenario(s) still invalid after repair" + ) + self._write_log( + f"05_generation/{focus}/remaining_failures_attempt_{attempt:02d}.json", + failure_payload(remaining_failures), + ) + else: + last_llm_was_validate_repair = False + + if len(valid_batch) < count: + shortage = count - len(valid_batch) + summary = "; ".join(failure_notes) if failure_notes else "no detailed failure summary available" + raise RuntimeError( + f"Failed to generate {count} valid {focus} scenarios after {_MAX_SCENARIO_ATTEMPTS} attempts. " + f"Still missing {shortage}. Details: {summary}" + ) + final_for_focus = valid_batch[:count] + if last_llm_was_validate_repair: + self._write_json_log(f"05_generation/{focus}/final_scenarios.json", final_for_focus) + return final_for_focus + + def _generate_attempt_batch( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict], + single_agents: list[dict] | None = None, + ) -> list[dict]: + if focus == "multiagent": + if single_agents is None: + raise RuntimeError("single_agents are required when generating multiagent scenarios") + return self.construct_multiagent_scenarios( + count=count, + single_agents=single_agents, + profile=profile, + server_desc=server_desc, + accepted_scenarios=accepted_scenarios, + ) + + return self.generate_single_focus_scenarios( + focus=focus, + count=count, + profile=profile, + server_desc=server_desc, + accepted_scenarios=accepted_scenarios, + ) diff --git a/src/scenarios/generator/cli.py b/src/scenarios/generator/cli.py new file mode 100644 index 000000000..52949807f --- /dev/null +++ b/src/scenarios/generator/cli.py @@ -0,0 +1,87 @@ +"""CLI entry for `python -m scenarios.generator`.""" + +from __future__ import annotations + +import argparse +import asyncio +import json +import logging +import os +import sys + +from dotenv import load_dotenv + +from agent.cli import _DEFAULT_MODEL + +from .agent import ScenarioGeneratorAgent +from .prompt_helpers import default_scenario_output_path + + +def main() -> None: + load_dotenv() + + parser = argparse.ArgumentParser(description="Scenario Generator for AssetOpsBench") + parser.add_argument("asset_name", help="Asset class name (for example 'Chiller' or 'Wind Turbine')") + parser.add_argument("--model-id", default=_DEFAULT_MODEL, help="Model ID for LiteLLM") + parser.add_argument("--num-scenarios", type=int, default=50, help="Total number of scenarios to generate") + parser.add_argument("--show-workflow", action="store_true", help="Show intermediate pipeline steps in the console") + parser.add_argument("--log", action="store_true", help="Dump raw prompts and results to a log directory") + parser.add_argument( + "--data-in-couchdb", + action="store_true", + help="Use grounded open-form generation when matching live CouchDB-backed asset data is available", + ) + + args = parser.parse_args() + output_path = default_scenario_output_path(args.asset_name) + + # With --show-workflow alone, keep the root logger quiet (WARNING). When + # --data-in-couchdb is also set, Phase 1 runs FMSR mapping (per-pair LLM work + # inside the server); use INFO so `scenarios.grounding` can log progress. + if args.show_workflow and not args.data_in_couchdb: + level = logging.WARNING + else: + level = logging.INFO + # Imported MCP server modules (e.g. servers.fmsr.main) call basicConfig(WARNING) + # at import time; without force=True, this CLI's basicConfig would be a no-op. + logging.basicConfig( + level=level, + format="%(asctime)s %(levelname)s %(message)s", + force=True, + ) + if level == logging.INFO: + for noisy in ("httpx", "httpcore"): + logging.getLogger(noisy).setLevel(logging.WARNING) + + log_dir = None + if args.log: + log_dir = str(output_path.parent / "logs") + print(f"Logging session to: {log_dir}") + os.makedirs(log_dir, exist_ok=True) + + agent = ScenarioGeneratorAgent(model_id=args.model_id, show_workflow=args.show_workflow, log_dir=log_dir) + + try: + final_scenarios = asyncio.run( + agent.run( + args.asset_name, + num_scenarios=args.num_scenarios, + data_in_couchdb=args.data_in_couchdb, + ) + ) + except Exception as exc: # noqa: BLE001 + print(f"\n[FATAL ERROR] {exc}") + sys.exit(1) + + if not final_scenarios: + print("\n[WARNING] No scenarios were successfully generated and validated.") + sys.exit(0) + + output_path.parent.mkdir(parents=True, exist_ok=True) + with output_path.open("w") as handle: + json.dump([scenario.to_dict() for scenario in final_scenarios], handle, indent=2) + + if not args.show_workflow: + print(f"Success! Generated {len(final_scenarios)} scenarios at {output_path}") + else: + print(f"Scenarios saved to {output_path}") diff --git a/src/scenarios/generator/prompt_helpers.py b/src/scenarios/generator/prompt_helpers.py new file mode 100644 index 000000000..599d071ee --- /dev/null +++ b/src/scenarios/generator/prompt_helpers.py @@ -0,0 +1,284 @@ +"""Prompt construction and normalization helpers for scenario generation.""" + +from __future__ import annotations + +from collections.abc import Callable +from datetime import datetime +import json +import logging +from pathlib import Path +import re +from typing import TypeVar + +from ..constraints import FOCUS_ORDER +from ..models import AssetProfile, GroundingBundle +from ..text import slugify_asset_name + + +def _quiet_litellm_logging() -> None: + """Raise LiteLLM library loggers to WARNING. + + litellm._logging uses logger names ``LiteLLM``, ``LiteLLM Proxy``, and + ``LiteLLM Router`` (not ``litellm``). Those loggers attach their own + StreamHandler, so per-completion INFO lines appear even when the root + logger is WARNING unless these loggers are adjusted. + """ + + for name in ("LiteLLM", "LiteLLM Proxy", "LiteLLM Router"): + logging.getLogger(name).setLevel(logging.WARNING) + + +_MAX_SCENARIO_ATTEMPTS = 4 +_MAX_FEWSHOT_EXAMPLES = 6 + + +def _multiagent_budget_cap(total: int) -> int: + """Maximum multiagent scenarios: floor(75% of total).""" + if total <= 1: + return total + return (total * 3) // 4 + + +_PROFILE_MAX_TOKENS = 4096 +_MULTIAGENT_MAX_TOKENS = 4096 +_MAX_PROFILE_CANDIDATES = 5 +_MAX_PROFILE_SNIPPETS = 6 +_MAX_PROFILE_SNIPPET_CHARS = 700 +DEFAULT_GENERATED_SCENARIOS_DIR = Path("generated/scenarios") + + +def _print_section(title: str) -> None: + print(f"\n{'─' * 60}") + print(f" {title}") + print(f"{'─' * 60}") + + +def _print_step( + phase: str, + info: str, + details: str | None = None, + tool_info: str | None = None, +) -> None: + print(f" [OK ] Step ({phase}): {info}") + if tool_info: + print(f" {tool_info}") + if details: + indented = "\n".join(" " + line for line in details.splitlines()) + print(indented) + + +def _print_live_step(phase: str, info: str, details: str | None = None) -> None: + print(f" [....] Step ({phase}): {info}") + if details: + indented = "\n".join(" " + line for line in details.splitlines()) + print(indented) + + +def _log_timestamp() -> str: + return datetime.now().strftime("%Y%m%d_%H%M%S") + + +def default_scenario_output_path(asset_name: str) -> Path: + timestamp = _log_timestamp() + run_dir = DEFAULT_GENERATED_SCENARIOS_DIR / f"{slugify_asset_name(asset_name)}_scenarios_{timestamp}" + return run_dir / "scenarios.json" + + +def _asset_profile_json(profile: AssetProfile) -> str: + return profile.model_dump_json(indent=2) + + +def _few_shot_examples_section(few_shots: list[dict]) -> str: + if not few_shots: + return ( + "No benchmark few-shot examples were available for this focus. " + "Do not assume any hidden fallback examples." + ) + + return ( + "Benchmark few-shot examples (style and specificity only; follow Generation Mode for " + "closed-form vs open-form grounding):\n" + f"{json.dumps(few_shots, indent=2)}" + ) + + +def _tool_names_from_description(description: object) -> list[str]: + if not isinstance(description, str): + return [] + names: list[str] = [] + for line in description.splitlines(): + match = re.search(r"-\s*([a-zA-Z0-9_]+)\(", line) + if match: + names.append(match.group(1)) + return list(dict.fromkeys(names)) + + +def _normalize_string_list(raw_values: object | None) -> list[str]: + if not isinstance(raw_values, list): + return [] + return list(dict.fromkeys(str(value).strip() for value in raw_values if str(value).strip())) + + +def _normalize_failure_sensor_mapping(raw_mapping: object | None) -> dict[str, list[str]]: + if not isinstance(raw_mapping, dict): + return {} + normalized: dict[str, list[str]] = {} + for raw_failure_mode, raw_sensors in raw_mapping.items(): + if raw_failure_mode is None: + continue + failure_mode = str(raw_failure_mode).strip() + if not failure_mode or not isinstance(raw_sensors, list): + continue + sensors = sorted(dict.fromkeys(str(sensor).strip() for sensor in raw_sensors if str(sensor).strip())) + if sensors: + normalized[failure_mode] = sensors + return normalized + + +_TDesc = TypeVar("_TDesc") + + +def _label_desc_dict_from_list(raw: object, *, primary: str, alternate: str) -> dict[str, str]: + if not isinstance(raw, list): + return {} + out: dict[str, str] = {} + for item in raw: + if not isinstance(item, dict): + continue + raw_label = item.get(primary) + if raw_label is None: + raw_label = item.get(alternate) + if raw_label is None: + continue + label = str(raw_label).strip() + if not label: + continue + desc = str(item.get("description", "")).strip() + if desc: + out[label] = desc + return out + + +def _ordered_descriptions( + combined: dict[str, str], + ordered_names: list[str], + *, + field: str, + build: Callable[[str, str], _TDesc], + sort_when_ordered_empty: bool = False, +) -> list[_TDesc]: + if not ordered_names: + if sort_when_ordered_empty: + if not combined: + return [] + return [build(k, str(combined[k]).strip()) for k in sorted(combined.keys())] + raise ValueError(f"Asset profile field '{field}' requires a non-empty ordered name list") + missing = [k for k in ordered_names if k not in combined or not str(combined[k]).strip()] + if missing: + preview = ", ".join(missing[:8]) + suffix = "..." if len(missing) > 8 else "" + raise ValueError(f"Asset profile field '{field}' is missing names: {preview}{suffix}") + return [build(k, str(combined[k]).strip()) for k in ordered_names] + + +def _require_nonempty_str(value: object, *, field: str) -> str: + text = str(value or "").strip() + if not text: + raise ValueError(f"Asset profile is missing required non-empty field: '{field}'") + return text + + +def _require_nonempty_list(value: object, *, field: str) -> list[str]: + if not isinstance(value, list): + raise ValueError(f"Asset profile field '{field}' must be a list") + items = [str(item).strip() for item in value if str(item).strip()] + if not items: + raise ValueError(f"Asset profile is missing required non-empty list field: '{field}'") + return list(dict.fromkeys(items)) + + +def _invert_failure_mapping(failure_sensor_mapping: dict[str, list[str]]) -> dict[str, list[str]]: + sensor_failure_mapping: dict[str, list[str]] = {} + for failure_mode, sensors in failure_sensor_mapping.items(): + for sensor_name in sensors: + sensor_failure_mapping.setdefault(sensor_name, []).append(failure_mode) + return { + sensor_name: sorted(dict.fromkeys(failure_modes)) + for sensor_name, failure_modes in sensor_failure_mapping.items() + } + + +def _grounding_summary_for_prompt(grounding: GroundingBundle) -> str: + summary = { + "requested_open_form": grounding.requested_open_form, + "open_form_eligible": grounding.open_form_eligible, + "iot_sensors": grounding.iot_sensors, + "vibration_sensors": grounding.vibration_sensors, + "asset_instances": [ + { + "site_name": instance.site_name, + "asset_id": instance.asset_id, + "has_iot": instance.has_iot, + "has_vibration": instance.has_vibration, + "iot_time_range": instance.iot_time_range.model_dump() if instance.iot_time_range else None, + "vibration_time_range": ( + instance.vibration_time_range.model_dump() if instance.vibration_time_range else None + ), + } + for instance in grounding.asset_instances + ], + "failure_modes": grounding.failure_modes, + "failure_sensor_mapping": grounding.failure_sensor_mapping, + "sensor_failure_mapping": grounding.sensor_failure_mapping, + } + return json.dumps(summary, indent=2) + + +def _evidence_summary_for_prompt(evidence_bundle) -> str: + summary = { + "asset_name": evidence_bundle.asset_name, + "canonical_asset_name": evidence_bundle.canonical_asset_name, + "query_history": evidence_bundle.query_history, + "top_candidates": [ + { + "title": candidate.title, + "query": candidate.query, + "judge_score": candidate.judge_score, + "judge_reason": candidate.judge_reason, + "published": candidate.published, + } + for candidate in evidence_bundle.candidates[:_MAX_PROFILE_CANDIDATES] + ], + "snippets": [ + { + "title": snippet.title, + "source": snippet.source, + "text": snippet.text[:_MAX_PROFILE_SNIPPET_CHARS], + } + for snippet in evidence_bundle.snippets[:_MAX_PROFILE_SNIPPETS] + ], + } + return json.dumps(summary, indent=2) + + +def _tool_summary_for_prompt(server_desc: dict) -> str: + compact = { + focus: _tool_names_from_description(description) + for focus, description in server_desc.items() + if focus in {"iot", "fmsr", "tsfm", "wo", "vibration"} + } + return json.dumps(compact, indent=2) + + +def _validation_tool_names_by_focus(server_desc: dict) -> dict[str, tuple[str, ...]]: + return { + focus: tuple(_tool_names_from_description(server_desc.get(focus, ""))) + for focus in FOCUS_ORDER + if focus != "multiagent" + } + + +def _redact_logged_prompt(prompt: str, asset_profile_json: str) -> str: + if asset_profile_json and asset_profile_json in prompt: + return prompt.replace(asset_profile_json, ".redacted", 1) + return prompt diff --git a/src/scenarios/grounding.py b/src/scenarios/grounding.py new file mode 100644 index 000000000..0bad9d109 --- /dev/null +++ b/src/scenarios/grounding.py @@ -0,0 +1,272 @@ +"""Grounded asset discovery helpers for scenario generation.""" + +from __future__ import annotations + +import json +import logging +from pathlib import Path +from typing import Any + +from servers.fmsr.main import get_failure_mode_sensor_mapping, get_failure_modes +from servers.iot.main import SITES, get_asset_list, get_asset_time_range, get_sensor_list +from servers.vibration.couchdb_client import list_asset_coverage as get_vibration_asset_coverage + +from .models import AssetInstance, GroundedTimeRange, GroundingBundle +from .text import slugify_asset_name + +_log = logging.getLogger(__name__) + +# One JSON file per asset class name: ``failure_mapping/.json`` (next to this package). +_FAILURE_MAPPING_DIR = Path(__file__).resolve().parent / "failure_mapping" + + +def _normalize_string_list(values: list[Any]) -> list[str]: + return sorted(dict.fromkeys(str(value).strip() for value in values if str(value).strip())) + + +def _normalize_string_mapping(mapping: dict[str, list[str]]) -> dict[str, list[str]]: + normalized: dict[str, list[str]] = {} + for key, values in mapping.items(): + clean_key = str(key).strip() + clean_values = _normalize_string_list(values) + if clean_key and clean_values: + normalized[clean_key] = clean_values + return normalized + + +def _failure_mapping_path(asset_name: str) -> Path: + return _FAILURE_MAPPING_DIR / f"{slugify_asset_name(asset_name)}.json" + + +def _load_failure_mapping(asset_name: str) -> tuple[dict[str, list[str]], dict[str, list[str]]] | None: + path = _failure_mapping_path(asset_name) + if not path.is_file(): + return None + try: + payload = json.loads(path.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError) as exc: + _log.warning("Ignoring failure mapping file %s: %s", path, exc) + return None + if not isinstance(payload, dict): + return None + fm2sensor = _normalize_string_mapping(dict(payload.get("fm2sensor", {}) or {})) + sensor2fm = _normalize_string_mapping(dict(payload.get("sensor2fm", {}) or {})) + if not fm2sensor and not sensor2fm: + return None + _log.info("Loaded F2S/S2F mapping for %s from %s", asset_name, path) + return fm2sensor, sensor2fm + + +def _write_failure_mapping( + asset_name: str, + fm2sensor: dict[str, list[str]], + sensor2fm: dict[str, list[str]], +) -> None: + path = _failure_mapping_path(asset_name) + path.parent.mkdir(parents=True, exist_ok=True) + payload = {"fm2sensor": fm2sensor, "sensor2fm": sensor2fm} + tmp = path.with_suffix(path.suffix + ".tmp") + try: + tmp.write_text(json.dumps(payload, indent=2, sort_keys=True), encoding="utf-8") + tmp.replace(path) + _log.info("Wrote F2S/S2F mapping for %s to %s", asset_name, path) + except OSError as exc: + _log.warning("Failed to write failure mapping %s: %s", path, exc) + try: + tmp.unlink(missing_ok=True) + except OSError: + pass + + +def _as_mapping(result: Any) -> dict[str, Any]: + if hasattr(result, "model_dump"): + return result.model_dump() + if isinstance(result, dict): + return result + return {} + + +def _iot_timestamp_to_str(value: Any) -> str | None: + """Normalize CouchDB timestamp values for ``GroundedTimeRange`` (strings or datetimes).""" + if value is None: + return None + if isinstance(value, str): + stripped = value.strip() + return stripped or None + if hasattr(value, "isoformat"): + return value.isoformat() + return str(value) + + +def _discover_iot_inventory_and_instances() -> tuple[list[AssetInstance], list[str]]: + """At SITE_NAME: all CouchDB asset ids; IoT sensor names are unioned once (not per instance).""" + instances: list[AssetInstance] = [] + iot_union: set[str] = set() + + for asset_id in get_asset_list(): + sensors = get_sensor_list(asset_id) + for s in sensors: + if str(s).strip(): + iot_union.add(str(s).strip()) + tr_raw = get_asset_time_range(asset_id) + iot_time_range = GroundedTimeRange( + start=_iot_timestamp_to_str(tr_raw.get("start")), + end=_iot_timestamp_to_str(tr_raw.get("end")), + total_observations=int(tr_raw.get("total_observations") or 0), + ) + # Here, we assume the defintion of "MAIN" as the only site (as defined in IoT server) + instances.append( + AssetInstance( + site_name=SITES[0], + asset_id=asset_id, + has_iot=bool(sensors), + iot_time_range=iot_time_range, + ) + ) + + return instances, sorted(iot_union) + + +def _vibration_by_site_asset() -> dict[tuple[str, str], dict[str, Any]]: + rows = get_vibration_asset_coverage() + out: dict[tuple[str, str], dict[str, Any]] = {} + for row in rows: + site = str(row.get("site_name", "")).strip() + aid = str(row.get("asset_id", "")).strip() + if site and aid: + out[(site, aid)] = row + return out + + +def _overlay_vibration( + instances: list[AssetInstance], + vib_by_key: dict[tuple[str, str], dict[str, Any]], +) -> list[str]: + """Attach vibration time ranges per instance; return union of vibration sensor names.""" + vib_union: set[str] = set() + for inst in instances: + row = vib_by_key.get((inst.site_name, inst.asset_id)) + if not row: + continue + raw_sensors = row.get("sensors", []) or [] + for s in raw_sensors: + if str(s).strip(): + vib_union.add(str(s).strip()) + inst.has_vibration = bool(raw_sensors) + tr = dict(row.get("time_range", {})) + inst.vibration_time_range = GroundedTimeRange( + start=tr.get("start"), + end=tr.get("end"), + total_observations=int(tr.get("total_observations") or 0), + ) + + def _sort_weight(inst: AssetInstance) -> int: + vib_n = inst.vibration_time_range.total_observations if inst.vibration_time_range else 0 + return vib_n + + instances.sort( + key=lambda inst: ( + -_sort_weight(inst), + inst.asset_id.lower(), + ), + ) + return sorted(vib_union) + + +def _build_failure_sensor_grounding( + asset_name: str, + iot_sensors: list[str], + vibration_sensors: list[str], +) -> tuple[list[str], dict[str, list[str]], dict[str, list[str]]]: + raw_modes = _as_mapping(get_failure_modes(asset_name=asset_name)) + failure_modes = list(dict.fromkeys(raw_modes.get("failure_modes", []) or [])) + if not failure_modes: + return [], {}, {} + sensors = sorted( + dict.fromkeys( + str(s).strip() + for s in (*iot_sensors, *vibration_sensors) + if str(s).strip() + ) + ) + + if not sensors: + return failure_modes, {}, {} + + cached = _load_failure_mapping(asset_name) + if cached is not None: + fm2sensor, sensor2fm = cached + return failure_modes, fm2sensor, sensor2fm + + _log.info( + "Building FMSR grounding for %s using %d failure modes and %d sensors (one mapping call)", + asset_name, + len(failure_modes), + len(sensors), + ) + result = _as_mapping( + get_failure_mode_sensor_mapping( + asset_name=asset_name, + failure_modes=failure_modes, + sensors=sensors, + ) + ) + if "error" in result: + _log.info("FMSR sensor mapping failed for %s: %s", asset_name, result["error"]) + return failure_modes, {}, {} + + fm2sensor: dict[str, list[str]] = dict(result.get("fm2sensor", {}) or {}) + sensor2fm: dict[str, list[str]] = dict(result.get("sensor2fm", {}) or {}) + + normalized_fm2sensor = _normalize_string_mapping(fm2sensor) + normalized_sensor2fm = _normalize_string_mapping(sensor2fm) + _write_failure_mapping( + asset_name=asset_name, + fm2sensor=normalized_fm2sensor, + sensor2fm=normalized_sensor2fm, + ) + + return failure_modes, normalized_fm2sensor, normalized_sensor2fm + + +def discover_grounding(asset_name: str, requested_open_form: bool = False) -> GroundingBundle: + """Collect grounded asset coverage for open-form scenario generation. + + ``asset_name`` is the CLI asset label (used for FMSR and prompts). + """ + + if not requested_open_form: + return GroundingBundle(asset_name=asset_name, requested_open_form=False) + + asset_instances, iot_sensor_names = _discover_iot_inventory_and_instances() + + vib_by_key = _vibration_by_site_asset() + vibration_sensor_names = _overlay_vibration(asset_instances, vib_by_key) + + if not asset_instances: + return GroundingBundle( + asset_name=asset_name, + requested_open_form=True, + open_form_eligible=False, + ) + + failure_modes, failure_sensor_mapping, sensor_failure_mapping = _build_failure_sensor_grounding( + asset_name=asset_name, + iot_sensors=iot_sensor_names, + vibration_sensors=vibration_sensor_names, + ) + + return GroundingBundle( + asset_name=asset_name, + requested_open_form=True, + open_form_eligible=True, + iot_sensors=iot_sensor_names, + vibration_sensors=vibration_sensor_names, + asset_instances=asset_instances, + failure_modes=failure_modes, + failure_sensor_mapping=failure_sensor_mapping, + sensor_failure_mapping=sensor_failure_mapping, + ) + + +__all__ = ["discover_grounding"] diff --git a/src/scenarios/huggingface/asset/compressor_utterance.jsonl b/src/scenarios/huggingface/asset/compressor_utterance.jsonl new file mode 100644 index 000000000..3c1e67093 --- /dev/null +++ b/src/scenarios/huggingface/asset/compressor_utterance.jsonl @@ -0,0 +1,15 @@ +{"id": 1001, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Based on the compressor sensor readings from April 10 to April 17, 2020, is there a risk of an air leak failure occurring within the next 7 days? Should we schedule maintenance to prevent this issue?", "hint": "IoT Agent handles raw sensor data ingestion and cleaning; TSFM Agent is responsible for anomaly detection and predicting remaining useful life; FMSR Agent interprets failure modes; WO Agent plans potential maintenance actions.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "The response should identify subtle trends or deviations across sensor streams indicating degradation (e.g., pressure drops, valve irregularities). After data ingestion by the IoT Agent, the TSFM Agent detects anomalies and predicts the likelihood and timing of failure. The FMSR Agent diagnoses the fault mode consistent with air leak signatures, and the WO Agent recommends proactively scheduled maintenance within the prediction horizon. Success is confirmed by the failure occurring on April 18 and evaluating if proposed maintenance timing could prevent or mitigate it.", "failure_event": "Air Leak starting April 18, 2020", "note": ""} +{"id": 1002, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Looking at the compressor data collected on April 17, 2020, can we determine whether an air leak failure is imminent within the next 24 hours? What immediate actions should be planned?", "hint": "IoT Agent manages sensor data streams; TSFM Agent focuses on real-time anomaly detection; FMSR Agent narrows down failure signatures; WO Agent recommends urgent inspections or shutdowns.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "The response should detect rapid onset anomalies, such as spikes or correlated irregularities in pressure, motor current, and valve signals, processed by IoT and TSFM Agents. The FMSR Agent should infer probable air leak causes from these anomalies, and the WO Agent should propose immediate maintenance or operational responses. Effectiveness depends on timely and accurate prediction minimizing false positives.", "failure_event": "Air Leak starting April 18, 2020", "note": ""} +{"id": 1003, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. Following the air leak failure on April 18 and subsequent maintenance conducted on April 19, 2020, how has the compressor's operational health changed through April 20 to April 26? Is further intervention needed?", "hint": "IoT Agent compares pre- and post-maintenance sensor data; TSFM Agent looks for lingering anomalies; FMSR Agent assesses residual failure signatures; WO Agent advises on additional maintenance or monitoring.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "The response should effectively contrast sensor indicators before and after maintenance, identifying if anomalies persist or have resolved. Agents collaborate to determine if the repair fully restored asset health or if further actions are necessary. Correct assessment aligns with no subsequent failure events during the post-maintenance monitoring period.", "failure_event": "Air Leak starting April 18, 2020", "note": ""} +{"id": 1004, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Using sensor data from May 22 to May 28, 2020, can we predict whether the train's compressor is at risk of an air leak failure within the following 7 days? Should maintenance be scheduled?", "hint": "IoT Agent processes sensor inputs; TSFM Agent detects anomalies and forecasts failure risk; FMSR Agent analyzes fault modes; WO Agent plans possible maintenance interventions.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "The expected answer identifies early deviations from normal behavior through analysis of sensor data by IoT and TSFM Agents, links these to air leak failure modes via the FMSR Agent, and suggests appropriate preventive maintenance via the WO Agent. Confirmation with actual failure starting on May 29 validates the predictive accuracy.", "failure_event": "Air Leak starting May 29, 2020", "note": ""} +{"id": 1005, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Is there evidence from sensor streams on May 28, 2020, suggesting imminent air leak failure within 24 hours? What immediate maintenance actions are recommended?", "hint": "IoT and TSFM Agents focus on real-time anomaly detection; FMSR Agent interprets fault characteristics; WO Agent advises urgent response.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "The answer should reveal rapid anomaly emergence detected by the TSFM Agent from IoT data, with the FMSR Agent confirming air leak signatures and the WO Agent proposing critical maintenance. Timely detection and minimal false alarms are essential for success.", "failure_event": "Air Leak starting May 29, 2020", "note": ""} +{"id": 1006, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. After the maintenance performed on May 30, 2020, how has the compressor's condition evolved during May 31 to June 6? Are there any indications that further repair or monitoring is needed?", "hint": "IoT, TSFM, and FMSR Agents analyze pre- and post-maintenance data; WO Agent provides recommendations for follow-up maintenance or monitoring adjustments.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "This should identify whether sensor anomalies have been resolved or persist despite the repair. Effective reasoning by agents leads to actionable recommendations for additional maintenance or confirms successful restoration of health.", "failure_event": "Air Leak starting May 29, 2020", "note": ""} +{"id": 1007, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. From the compressor sensor data collected between May 29 and June 4, 2020, can we assess the likelihood of an air leak failure occurring within the subsequent week starting June 5? Is preventive maintenance advisable?", "hint": "IoT Agent performs data aggregation; TSFM Agent identifies subtle anomalies and forecasts risk; FMSR Agent diagnoses failure signatures; WO Agent plans maintenance.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "Expected reasoning includes detection of emerging deviations, interpretation as air leak precursors, actionable maintenance scheduling, and validation via actual failure timing on June 5.", "failure_event": "Air Leak starting June 5, 2020", "note": ""} +{"id": 1008, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Based on sensor data from June 4, 2020, can we predict if an air leak failure will occur within 24 hours? What are the recommended immediate actions?", "hint": "IoT and TSFM Agents handle fast anomaly detection; FMSR Agent confirms fault mode; WO Agent advises urgent maintenance.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "Response should detect salient rapid changes forefronting failure, interpret them correctly as air leak signals, and recommend timely maintenance actions to mitigate damage.", "failure_event": "Air Leak starting June 5, 2020", "note": ""} +{"id": 1009, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. How has the compressor\u2019s sensor profile changed between June 8 and June 14, 2020, following maintenance on June 8 at 16:00? Is there evidence the air leak repair was successful or is further follow-up necessary?", "hint": "IoT, TSFM, and FMSR Agents evaluate before/after sensor data; WO Agent provides health assessment and maintenance suggestions.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "Expected outcome distinguishes persistent anomalies from resolved faults, with actionable follow-up maintenance recommendations when needed, or confirmation of repair success.", "failure_event": "Air Leak starting June 5, 2020", "note": ""} +{"id": 1010, "type": "multiagent", "entity": "compressor", "group": "Predictive Maintenance", "text": "Consider asset mp_1. Using data from July 8 to July 14, 2020, can we assess the risk of an air leak failure occurring on or after July 15? Should maintenance be planned proactively?", "hint": "IoT Agent preprocesses data; TSFM Agent detects predictive anomalies; FMSR Agent diagnoses; WO Agent plans maintenance.", "category": "7-Day Ahead Failure Prediction", "labels": "pre-failure, prediction, 7-day", "characteristic_form": "Reasoning includes detection of fault precursors, assessment of failure risk, recommendation of proactive maintenance, and validation against actual failure occurrence.", "failure_event": "Air Leak starting July 15, 2020", "note": ""} +{"id": 1011, "type": "multiagent", "group": "Predictive Maintenance", "entity": "compressor", "text": "Consider asset mp_1. Is there any indication from sensor data on July 14, 2020, that an air leak failure is imminent within the next 24 hours? What immediate mitigations should be considered?", "hint": "IoT and TSFM Agents detect anomalies; FMSR Agent diagnoses fault mode; WO Agent advises urgent maintenance.", "category": "24-Hour Imminent Failure Warning", "labels": "pre-failure, prediction, 24-hour", "characteristic_form": "The response should identify sudden abnormal patterns signaling an imminent failure, contextualize using failure mode knowledge, and recommend immediate preventive or corrective measures.", "failure_event": "Air Leak starting July 15, 2020", "note": ""} +{"id": 1012, "type": "multiagent", "entity": "compressor", "group": "Maintenance Evaluation", "text": "Consider asset mp_1. Following maintenance on July 16, 2020, how has the compressor\u2019s health trended during July 16 to July 22? Should further repair or monitoring be pursued?", "hint": "IoT, TSFM, and FMSR Agents compare sensor data pre- and post-maintenance; WO Agent recommends further action or confirms restoration.", "category": "Post-Maintenance Health Assessment", "labels": "post-maintenance, health-check", "characteristic_form": "Expected is a clear differentiation of maintenance success or residual issues, with recommendations aligned to sensor data trends and operational context.", "failure_event": "Air Leak starting July 15, 2020", "note": ""} +{"id": 1013, "type": "multiagent", "group": "System Health Monitoring", "entity": "compressor", "text": "Consider asset mp_1. Based on compressor sensor data from February 1 to February 21, 2020, can we confirm that the system was operating normally during the following week, with no indications of upcoming failure? Is it safe to continue regular operations without scheduling maintenance?", "hint": "IoT Agent processes sensor data; TSFM Agent evaluates anomaly absence and system stability; FMSR Agent verifies no failure modes activated; WO Agent corroborates no work orders needed.", "category": "Healthy Operation - Weekly Monitor", "labels": "normal, healthy, no-failure", "characteristic_form": "The expected response reports stable sensor readings with no significant anomalies or degradation trends detected by the TSFM Agent after data ingestion by the IoT Agent. The FMSR Agent confirms absence of fault signatures, and the WO Agent concludes no maintenance is presently needed. The reasoning sequence is: data acquisition, anomaly absence confirmation, failure mode exclusion, and maintenance deferral recommendation.", "failure_event": "No failure - normal operation", "note": ""} +{"id": 1014, "type": "multiagent", "entity": "compressor", "group": "System Health Monitoring", "text": "Consider asset mp_1. Reviewing compressor data from June 20 to July 10, 2020\u2014after the June maintenance and before the July failure event\u2014does the system show stable operation without anomalies that would require maintenance intervention?", "hint": "IoT, TSFM, FMSR, and WO Agents collaborate to confirm operational health and maintenance on-hold.", "category": "Healthy Operation - Mid-Term Monitoring", "labels": "normal, healthy, no-failure", "characteristic_form": "The response should indicate consistent sensor patterns with no precursors to failure. Anomaly detection should yield negative results, failure diagnostics indicate no active faults, and maintenance planning agents advise continuity of normal operation. Clarity in confirming the asset\u2019s healthy condition strengthens confidence in monitoring processes.", "failure_event": "No failure - normal operation", "note": ""} +{"id": 1015, "type": "multiagent", "entity": "compressor", "group": "System Health Monitoring", "text": "Consider asset mp_1. Does the compressor data from July 23 to August 5, 2020, reflect stable and healthy operation, supporting continued service without urgent maintenance requirements?", "hint": "IoT & TSFM Agents analyze sensor stability; FMSR Agent confirms lack of failure mode activations; WO Agent endorses status quo.", "category": "Healthy Operation - Post-Maintenance Monitoring", "labels": "normal, healthy, no-failure", "characteristic_form": "Expected is an assessment confirming sensor stability and absence of anomaly flags. The failure mode analysis corroborates no fault activation, and the maintenance agent recommends continuation of routine monitoring without action. This supports operational decision-making by confirming equipment readiness.", "failure_event": "No failure - normal operation", "note": ""} diff --git a/src/scenarios/huggingface/asset/hydrolicpump_utterance.jsonl b/src/scenarios/huggingface/asset/hydrolicpump_utterance.jsonl new file mode 100644 index 000000000..c4d318e46 --- /dev/null +++ b/src/scenarios/huggingface/asset/hydrolicpump_utterance.jsonl @@ -0,0 +1,17 @@ +{"id": 2001, "type": "multiagent", "text": "For asset hp_1, using sensor data from the last 50 days leading up to and including 2023-01-28, can we detect that the valve condition is approaching total failure? What trends in the sensor data over this 50-day window indicate the degradation?", "hint": "IoT Agent collects multi-sensor data over the fixed window; TSFM Agent examines temporal feature shifts; FMSR Agent validates the trajectory to fault state; WO Agent plans action based on bounded trend analysis.", "category": "Fixed-Window Condition Detection (50 days)", "characteristic_form": "Detection should integrate pressure, flow, vibration, and temperature trends across dates 2022-12-10 to 2023-01-28. TSFM Agent flags sustained deviations; FMSR Agent matches the fixed window anomalies to valve degradation profiles; WO Agent uses detection output for timely maintenance scheduling.", "failure_event": "Valve close to total failure at date 2023-01-28", "entity": "hydrolic_pump", "deterministic": true, "asset_component": "valve", "labels": "valve, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2002, "type": "multiagent", "text": "For asset hp_1, using sensor data from the last 50 days leading up to and including 2024-03-13, can we detect the valve nearing total failure? Which sensor patterns over this window support this diagnosis?", "hint": "IoT aggregates valve-related sensor streams over the 50-day window; TSFM identifies evolving valve anomalies; FMSR confirms failure progression; WO recommends timely maintenance.", "category": "Fixed-Window Condition Detection (50 days)", "characteristic_form": "Detection is based on multi-day feature trends including pressure sensors PS1\u2013PS6, flow sensors FS1/FS2, and vibration VS1. The agents jointly identify and confirm progressive valve degeneration in dates 2024-01-24 to 2024-03-13.", "failure_event": "Valve close to total failure at date 2024-03-13", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2003, "type": "multiagent", "text": "For asset hp_1, analyzing the last 50 days leading up to and including 2026-05-14, can the sensor data reveal a worsening valve condition approaching failure? What temporal indicators support this?", "hint": "Multi-sensor sequence analysis performed over 2026-03-26 to 2026-05-14; TSFM and FMSR Agents detect and validate valve failure signatures; WO Agent plans repair.", "category": "Fixed-Window Condition Detection (50 days)", "characteristic_form": "Consistent anomalies in valve-switching-related sensor signals detected over the last 50 days before 2026-05-14 enable agents to detect failure onset and prioritize maintenance.", "failure_event": "Valve close to total failure at date 2026-05-14", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2004, "type": "multiagent", "text": "For asset hp_1, can severe internal pump leakage onset at 2023-01-27 be detected by analyzing sensor data from the last 100 days? Which sensor trends and patterns within this window indicate leakage development?", "hint": "IoT and TSFM Agents analyze pressure, flow, vibration, and motor power sensor data from days 2022-10-20 to 2023-01-27; FMSR Agent diagnoses leakage severity; WO Agent recommends intervention based on trend detection.", "category": "Fixed-Window Condition Detection (100 days)", "characteristic_form": "The agents jointly detect escalating pump leakage signatures manifested as temporal deviations in sensors PS1\u2013PS6, FS1/FS2, EPS1, and VS1 across the 100-day window before date 2023-01-27, enabling timely maintenance action recommendations.", "failure_event": "Severe pump leakage onset at date 2023-01-27", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2005, "type": "multiagent", "text": "For asset hp_1, using sensor data from the last 100 days leading up to and including 2023-06-09, can severe internal pump leakage be detected? What sensor evidence within this window is most critical for diagnosis?", "hint": "Pressure, flow, motor power, vibration, and temperature sensors are analyzed temporally over dates 2023-03-02 to 2023-06-09; Agents collaborate for fault classification and maintenance planning.", "category": "Fixed-Window Condition Detection (100 days)", "characteristic_form": "Multi-sensor signatures of pump leakage are tracked and interpreted from a 100-days historical window ending at 2023-06-09, supporting confident fault detection and prioritization of corrective action.", "failure_event": "Severe pump leakage onset at day 2023-06-09", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2006, "type": "multiagent", "text": "For asset hp_1, can severe internal pump leakage on 2024-01-31 be detected using sensor data from the preceding 100 days? Which sensor trends provide key clues within this timeframe?", "hint": "Agents monitor sensor streams representing pump performance and anomalies over the window from 2023-10-24 to 2024-01-31; FMSR and WO Agents localize fault and maintenance needs.", "category": "Fixed-Window Condition Detection (100-day window)", "characteristic_form": "Joint analysis of sensor deviations over the 100-day period before 2024-01-31 allows agents to support reliable detection of severe leakage and guide corresponding repairs.", "failure_event": "Severe pump leakage onset on 2024-01-31", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2007, "type": "multiagent", "text": "For asset hp_1, using the last 100 days up to and including 2027-01-30, can sensor data reveal the onset of severe internal pump leakage? Which sensor anomalies support this?", "hint": "Integrated multi-sensor data monitoring from 2026-10-22 to 2027-01-30 assists TSFM and FMSR Agents in detecting and classifying severe leakage; WO Agent coordinates timely maintenance intervention.", "category": "Fixed-Window Condition Detection (100-day window)", "characteristic_form": "Agents utilize densely sampled trends over the 100-day window to detect severe leakage onset reliably and recommend appropriate repair schedules.", "failure_event": "Severe pump leakage onset on 2027-01-30", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2008, "type": "multiagent", "text": "For asset hp_1, is the hydraulic accumulator\u2019s pressure near total failure detectable in sensor data from the prior 50 days leading up to and including 2024-01-22? What temporal sensor features indicate critical pressure decline?", "hint": "Pressure sensors monitored over the window from 2023-12-04 to 2024-01-22 provide key data; TSFM detects critical trends; FMSR assesses failure risk; WO advises urgent maintenance.", "category": "Fixed-Window Condition Detection (50-day window)", "characteristic_form": "Agents detect significant pressure decrease alongside corroborative anomalies in temperature and flow across 50 days, confirming the accumulator\u2019s critical condition and enabling timely maintenance decision-making.", "failure_event": "Accumulator close to failure on 2024-01-22", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2009, "type": "multiagent", "text": "For asset hp_1, using sensor data from the 50 days preceding and including 2026-03-23, can we detect critically low hydraulic accumulator pressure? Which sensor trends support this detection?", "hint": "Multi-sensor temporal analysis including pressure, flow, and temperature over the window from 2026-02-02 to 2026-03-23 supports multi-agent failure confirmation.", "category": "Fixed-Window Condition Detection (50-day window)", "characteristic_form": "Degradation patterns in pressure sensors and supporting data confirm near failure of the accumulator, prompting maintenance planning.", "failure_event": "Accumulator close to failure on 2026-03-23", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2010, "type": "multiagent", "text": "For asset hp_1, can sensor data covering the 50 days before and including 2028-03-11 confirm that the hydraulic accumulator is close to total failure? What temporal sensor signals are most indicative?", "hint": "Agents analyze sustained pressure drops and supporting temperature and flow trends over the window from 2028-01-21 to 2028-03-11; WO Agent plans detection-based intervention.", "category": "Fixed-Window Condition Detection (50-day window)", "characteristic_form": "Temporal sensor trends over the fixed window clearly reflect critical accumulator degradation, enabling agents to confirm failure mode and recommend immediate maintenance.", "failure_event": "Accumulator close to failure on 2028-03-11", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, fixed-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2101, "type": "multiagent", "text": "For asset hp_1, using sensor data spanning the days leading up to and including 2023-01-28, can we detect that the valve condition is approaching total failure? What evolving sensor trends support this diagnosis?", "hint": "IoT Agent aggregates multi-days sensor data; TSFM Agent analyzes valve switching anomalies over time; FMSR Agent confirms failure progression; WO Agent maps findings to maintenance scheduling.", "category": "Open-Window Condition Detection", "characteristic_form": "Agents integrate all relevant sensor data prior to and including 2023-01-28 to detect progressive valve degradation, emphasizing temporal patterns and cumulative anomalies supporting fault detection.", "failure_event": "Valve close to total failure around 2023-01-28", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2102, "type": "multiagent", "text": "For asset hp_1, can severe internal pump leakage at 2023-01-27 be detected by reviewing historical sensor data over the days leading up to this event? Which sensor anomalies are key?", "hint": "Multi-agent analysis aggregates pump-related sensor streams over an unbounded prior window to identify leakage onset and severity.", "category": "Open-Window Condition Detection", "characteristic_form": "Detection capitalizes on extended temporal context leveraging all available days before 2023-01-27, focusing on identifying trends in flow, pressure, motor power, and vibration signaling leakage onset.", "failure_event": "Severe pump leakage onset around 2023-01-27", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} +{"id": 2103, "type": "multiagent", "text": "Consider asset hp_1. Is valve near-total failure detectable in sensor data across the days leading up to and including 2024-03-13? How do sensor patterns evolve during this period?", "hint": "Agents review all available sensor data prior to and including 2024-03-13 to detect valve degradation and failure patterns.", "category": "Open-Window Condition Detection", "characteristic_form": "Temporal anomaly detection integrates long-term sensor trends, enabling confident detection of valve near-failure states informed by multiple data streams.", "failure_event": "Valve close to total failure around 2024-03-13", "entity": "hydrolic_pump", "asset_component": "valve", "deterministic": true, "labels": "valve, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, VS1"} +{"id": 2104, "type": "multiagent", "text": "Consider asset hp_1. At 2024-01-22, can the hydraulic accumulator close to total failure be detected by analyzing sensor data spanning previous days? What sensor signatures confirm this state?", "hint": "All pressure and supporting sensor data from prior days are evaluated; agents detect critical pressure decline and associated anomalies.", "category": "Open-Window Condition Detection", "characteristic_form": "Agents leverage as much historical data as needed to observe pressure degradation, ensuring reliable identification of accumulator failure risk and informing urgent maintenance.", "failure_event": "Accumulator close to failure around 2024-01-22", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2105, "type": "multiagent", "text": "Consider asset hp_1. Can sensor data over the days leading up to and including 2026-03-23 confirm that the hydraulic accumulator pressure has critically dropped? Which sensor patterns support this finding?", "hint": "Pressure, flow, and temperature data aggregated across preceding days; multi-agent collaboration interprets failure risk.", "category": "Open-Window Condition Detection", "characteristic_form": "Agents utilize flexible-length temporal context to corroborate failure mode activation and prioritize intervention.", "failure_event": "Accumulator close to failure around 2026-03-23", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2106, "type": "multiagent", "text": "For asset hp_1, is the hydraulic accumulator close to total failure on 2028-03-11 detectable using sensor data from all available prior days? What sensor evidence indicates this condition?", "hint": "Agents analyze long-term pressure sensor trends plus supporting signals to detect critical hydraulic accumulator failure.", "category": "Open-Window Condition Detection", "characteristic_form": "A complete historical view enables agents to detect and confirm the degradation leading to failure and to recommend timely preventive maintenance.", "failure_event": "Accumulator close to failure around 2028-03-11", "entity": "hydrolic_pump", "asset_component": "accumulator", "deterministic": true, "labels": "accumulator, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, TS1, TS2, TS3, TS4, FS1, FS2"} +{"id": 2107, "type": "multiagent", "text": "For asset hp_1, at 2023-06-09, can severe internal pump leakage be detected by considering sensor data over an extended window leading to this point? What sensor trends are most indicative?", "hint": "Agents combine multi-day sensor inputs for robust trend detection and classification of pump leakage severity.", "category": "Open-Window Condition Detection", "characteristic_form": "Use of long-term temporal context helps accurately identify leakage onset and severity from anomalies in pressure, flow, motor power, vibration, and temperature records.", "failure_event": "Severe pump leakage onset around 2023-06-09", "entity": "hydrolic_pump", "asset_component": "pump", "deterministic": true, "labels": "pump, open-window, pre-failure", "relevant_sensors": "PS1, PS2, PS3, PS4, PS5, PS6, FS1, FS2, EPS1, VS1"} diff --git a/src/scenarios/huggingface/scenarios/all_utterance.jsonl b/src/scenarios/huggingface/scenarios/all_utterance.jsonl new file mode 100644 index 000000000..0e41382c9 --- /dev/null +++ b/src/scenarios/huggingface/scenarios/all_utterance.jsonl @@ -0,0 +1,152 @@ +{"id":1,"type":"IoT","text":"What IoT sites are available?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value of all sites, either as text or as a reference to a file","group":"retrospective","entity":"Site","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":2,"type":"IoT","text":"Can you list the IoT sites?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value of all sites, either as text or as a reference to a file","group":"retrospective","entity":"Site","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":3,"type":"IoT","text":"What assets can be found at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value from querying the assets at the MAIN site. The response should be a reference to a file containing the list of assets","group":"retrospective","entity":"Site","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":4,"type":"IoT","text":"Which assets are located at the MAIN facility?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return value from querying the assets at the MAIN site. The response should be a reference to a file containing the list of assets","group":"retrospective","entity":"Equipment","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":5,"type":"IoT","text":"Retrieve metadata for Chiller 6 located at the MAIN site.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the metadata for asset 'Chiller 6' at the MAIN site. The metadata may be in the return value, or the may be returned as a reference to a file containing the metadata","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":6,"type":"IoT","text":"Get the asset details for Chiller 9 at the MAIN site.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the details for asset 'Chiller 9' at the MAIN site. The details may be in the return value, or the may be returned as a reference to a file containing the details","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":7,"type":"IoT","text":"Download the metadata for Chiller 3 at the MAIN facility.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the metadata for asset 'Chiller 3' as the MAIN site. The metadata may be in the return value, or the may be returned as a reference to a file containing the metadata","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":8,"type":"IoT","text":"Download sensor data for Chiller 6's Tonnage from the last week of 2020 at the MAIN site","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the tonnage data for last week of 2020 for 'Chiller 6' at the MAIN site. The response should be a reference to a file containing the list of tonnage values","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":9,"type":"IoT","text":"Retrieve sensor data for Chiller 6's % Loaded from June 2020 at MAIN.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the % Loaded measurements for the asset 'Chiller 6' at the MAIN site. It should include all recorded values for June 1, 2020 througb June 30, 2020 inclusive. The response should be a reference to a file containing the % Loaded data","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":10,"type":"IoT","text":"Get sensor data for both Chiller 6 and Chiller 9's Tonnage from first week of June 2020 at MAIN in a single file.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be the Tonnage values for both asset 'Chiller 6' and asset 'Chiller 9' at the MAIN site for last week. The values from both chillers should be merged into a single file. The return value should reference the file containing the merged Tonnage data from both chillers","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":11,"type":"IoT","text":"Download all sensor data for Chiller 6 from the last week of April '20 at the MAIN site.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be data from all sensors for asset 'Chiller 6' at the MAIN site for the past week. The return value should reference a file containing all the sensor data","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":12,"type":"IoT","text":"Retrieve sensor data for Chiller 6 from June 2020.","category":"Data Query","deterministic":true,"characteristic_form":"The expected response should be all sensor data for asset 'Chiller 6' for June 1, 2020 through June 30, 2020, inclusive. The return value should be a reference to a file containing all the sensor data.","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Data Query"} +{"id":41,"type":"IoT","text":"What was the latest supply humidity from CQPA AHU 1 at site MAIN on sept 3 2015? return in a file","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the latest value for the supply humidity on asset CQPA AHU 1 at the MAIN site, on Septemer 3, 2015. The return value should reference a file containing the supply humidity data","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":42,"type":"IoT","text":"what was the supply temperature from CQPA AHU 2B on sept 19, 2020 at quarter to midnight, at site MAIN? return in a file","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the supply temperature from asset CQPA AHU 2B at 11:45pm on September 19, 2015. The returned value should be a reference to a file containing the value","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":43,"type":"IoT","text":"how much power was CQPA AHU 1 (MAIN site) using on 6/14/20?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be either a list of power consumption values for asset CQPA AHU 1 at the MAIN site on June 14, 2016, or the average power consumption on June 14, 2016. The returned value should either be the average power consumption, or a reference to a file containing the power consumption values for the date June 14, 2016.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":44,"type":"IoT","text":"Can I list all the metrics monitored by CQPA AHU 2B? use site MAIN","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be a list of all the metrics which may be obtained for asset CQPA AHU 2B? at the MAIN site. The return value should be a reference to a file which lists the metrics.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":45,"type":"IoT","text":"What is the power consumption of CQPA AHU 1 on mar 13 '20, site MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be a list of the power consumption values for asset CQPA AHU 1 at the MAIN site for January 13, 2023, or the average power consumption for January 13, 2023. The returned value should be a reference to a file, or else a single average power number.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":46,"type":"IoT","text":"retrieve the supply temperature data recorded last week for Chiller 3 (MAIN site)?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the supply temperature for asset Chiller 3 for the site MAIN for last week. The returned value should be a reference to a file listing the supply temperatures.","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":47,"type":"IoT","text":"list all the chillers at site MAIN","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be a list of all chiller assets for the site MAIN. The returned value should be a reference to a file containing the list of chiller assets.","group":"retrospective","entity":"Chiller","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":48,"type":"IoT","text":"what was the return temperature from CQPA AHU 2B on sept 19, 2020 at 7pm, at site MAIN? return data in a file","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be the return temperature for asset CQPA AHU 2B at the MAIN site, for 7pm on September 19, 2015. The return value should reference a file that contains the return temperature.","group":"retrospective","entity":"AHU","note":"Source: IoT data operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":101,"type":"FMSR","text":"List all failure modes of asset Chiller.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes for Chiller are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":102,"type":"FMSR","text":"List all failure modes of asset Chiller 6.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes of asset Chiller 6 are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":103,"type":"FMSR","text":"List all failure modes of asset Wind Turbine.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain a list of meaningful failure modes for asset wind turbine.","group":"retrospective","entity":"WindTurbine","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":104,"type":"FMSR","text":"List all installed sensors of asset Chiller 6.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The installed sensors of asset Chiller 6 are: Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":105,"type":"FMSR","text":"Provide some sensors of asset Wind Turbine.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain a list of sensor names for asset wind turbine.","group":"retrospective","entity":"WindTurbine","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":106,"type":"FMSR","text":"List all failure modes of Chiller 6 that can be detected by Chiller 6 Supply Temperature.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":107,"type":"FMSR","text":"List all failure modes of Chiller 6 that can be detected by temperature sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":108,"type":"FMSR","text":"List all failure modes of Chiller 6 that can be detected by temperature sensors and power input sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":109,"type":"FMSR","text":"Get failure modes for Chiller 6 and only include in final response those that can be monitored using the available sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":110,"type":"FMSR","text":"Are there any failure modes of Chiller 6 that can be predicted by monitoring the vibration sensor data?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"predictive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":111,"type":"FMSR","text":"List all sensors of Chiller 6 that are potentially relevant to Compressor Overheating.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":112,"type":"FMSR","text":" If compressor overheating occurs for Chiller 6, which sensor should be prioritized for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.]","group":"prescriptive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":113,"type":"FMSR","text":" If Evaporator Water side fouling occurs for Chiller 6, which sensor is most relevant for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.] ","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":114,"type":"FMSR","text":"What are the failure modes of Chiller 6 that can be identified by analyzing the data from the available sensors?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":115,"type":"FMSR","text":"Purge unit of chiller 6 have possibility to excess purge, what is the plan by the maintenance experts to early detect the failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a plan by the maintenance experts to early detect the failure of purge unit of chiller 6. the answer should include the sensors that can be used to detect the failure of purge unit of chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":116,"type":"FMSR","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a machine learning recipe for detecting overheating failure for Chiller 6. the answer should include the sensors that can be used to detect the failure of overheating for Chiller 6","text":"Generate a machine learning recipe for detecting overheating failure for Chiller 6. Result should include feature sensors and target sensor.","group":"prescriptive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":117,"type":"FMSR","text":"When compressor motor of Chiller 6 fails, what is the temporal behavior of the power input?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should describe the temporal behavior of the power input of Chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":118,"type":"FMSR","text":"When power input of Chiller 6 drops, what is the potential failure that causes it?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":119,"type":"FMSR","text":"When the Liquid Refrigerant Evaporator Temperature of Chiller 6 drops, what failure is most likely to occur?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":120,"type":"FMSR","text":"I want to build an anomaly model for identifying a chiller trip failure for POKMAIN chiller 6. Provide me a list of sensors that I should use, along with the temporal behavior,","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain how to build an anomaly model for identifying a chiller trip failure for POKMAIN chiller 6. The answer should include sensors that I should use, along with the temporal behavior,","group":"prescriptive","entity":"Chiller","note":"Source: Failure mode analysis requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":201,"type":"TSFM","text":"What types of time series analysis are supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: the available AI tasks are [{task_id:'tsfm_integrated_tsad',task_description:'Time series Anomaly detection'},{task_id:'tsfm_forecasting',task_description:'Time series Multivariate Forecasting'},{task_id:'tsfm_forecasting_tune',task_description:'Finetuning of Multivariate Forecasting models'},{task_id:'tsfm_forecasting_evaluation',task_description:'Evaluation of Forecasting models'}]","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":202,"type":"TSFM","text":"What are time series pretrained models are available in system?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: The available pretrained models are [{model_id:'ttm_96_28', model_checkpoint:'data/tsfm_test_data/ttm_96_28', model_description:'Pretrained forecasting model with context length 96'},{model_id:'ttm_512_96', model_checkpoint:'data/tsfm_test_data/ttm_512_96', model_description:'Pretrained forecasting model with context length 512'},{model_id:'ttm_energy_96_28', model_checkpoint:'data/tsfm_test_data/ttm_energy_96_28', model_description:'Pretrained forecasting model tuned on energy data with context length 96'},{model_id:'ttm_energy_512_96', model_checkpoint:'data/tsfm_test_data/ttm_energy_512_96', model_description:'Pretrained forecasting model tuned on energy data with context length 512'}]","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":203,"type":"TSFM","text":"Are any time series forecasting models supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, several time series forecasting models are supported.","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":204,"type":"TSFM","text":"Is TTM (Tiny Time Mixture), a time series model supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, several TTM models are supported","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":205,"type":"TSFM","text":"Is LSTM model supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: LSTM model is not supported.","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":206,"type":"TSFM","text":"Is Chronos model supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: No, Chronos is not supported","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":207,"type":"TSFM","text":"Is Anomaly Detection supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, anomaly detection is supported in TSFM.","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":208,"type":"TSFM","text":"Is Time Series Classification supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Time Series Classification is not supported in TSFM","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":209,"type":"TSFM","text":"Is any model with context length 96 supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: Yes, there is a model with context length 96","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":210,"type":"TSFM","text":"Is any model with context length 1024 supported in TSFM?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: No, there is no model with context length 1024","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":211,"type":"TSFM","text":"Find a model for energy forecasting.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: [{model_id:'ttm_energy_96_28', model_checkpoint:'data/tsfm_test_data/ttm_energy_96_28', model_description:'Pretrained forecasting model tuned on energy data with context length 96'}, {model_id:'ttm_energy_512_96', model_checkpoint:'data/tsfm_test_data/ttm_energy_512_96', model_description:'Pretrained forecasting model tuned on energy data with context length 512'}]","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":212,"type":"TSFM","text":"Find a model for energy forecasting with context length 96 and nothing else.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: ttm_energy_96_28","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":213,"type":"TSFM","text":"Find all models with context length 96.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: [{model_id:'ttm_96_28', model_checkpoint:'data/tsfm_test_data/ttm_96_28', model_description:'Pretrained forecasting model with context length 96'}, {model_id:'ttm_energy_96_28', model_checkpoint:'data/tsfm_test_data/ttm_energy_96_28', model_description:'Pretrained forecasting model tuned on energy data with context length 96'}]","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":214,"type":"TSFM","text":"How many models with context length exactly 96 are supported?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: There are 2 models with a context length of 96","group":"retrospective","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":215,"type":"TSFM","text":"Does TSFM support time series regression tasks or any model for forecasting with context length 1024?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should be: TSFM does not support regression and there is no model with context length 1024","group":"predictive","entity":"Equipment","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":216,"type":"TSFM","text":"Forecast 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv'. Use parameter 'Timestamp' as a timestamp. Use the following parameters as inputs 'Chiller 9 Liquid Refrigerant Evaporator Temperature,Chiller 9 Return Temperature,Chiller 9 Tonnage,Chiller 9 Setpoint Temperature,Chiller 9 Supply Temperature,Chiller 9 Chiller % Loaded,Chiller 9 Condenser Water Supply To Chiller Temperature,Chiller 9 Power Input,Chiller 9 Chiller Efficiency'","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":217,"type":"TSFM","text":"Forecast 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv'. Use parameter 'Timestamp' as a timestamp.","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":218,"type":"TSFM","text":"Use data in 'chiller9_annotated_small_test.csv' to forecast 'Chiller 9 Condenser Water Flow' with 'Timestamp' as a timestamp.","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":219,"type":"TSFM","text":"Forecast 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv'. Use the following parameters as inputs 'Chiller 9 Liquid Refrigerant Evaporator Temperature,Chiller 9 Return Temperature,Chiller 9 Tonnage,Chiller 9 Setpoint Temperature,Chiller 9 Supply Temperature,Chiller 9 Chiller % Loaded,Chiller 9 Condenser Water Supply To Chiller Temperature,Chiller 9 Power Input,Chiller 9 Chiller Efficiency'","category":"Inference Query","deterministic":true,"characteristic_form":"The expected response should be: Forecasting results of 'Chiller 9 Condenser Water Flow' using data in 'chiller9_annotated_small_test.csv' are stored in json file","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Inference Query"} +{"id":220,"type":"TSFM","text":"Finetune a forecasting model for 'Chiller 9 Condenser Water Flow' using data in 'chiller9_finetuning_small.csv' with 'Timestamp' as a timestamp.","category":"Tuning Query","deterministic":true,"characteristic_form":"The finetuned forecasting model is saved in save_model_dir=tunedmodels with result stored in results_file. Results are saved: {%JSON_RESULT}","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Tuning Query"} +{"id":221,"type":"TSFM","text":"Finetune a forecasting model for 'Chiller 9 Condenser Water Flow' using data in 'chiller9_finetuning_small.csv' with 'Timestamp' as a timestamp. Use 1% of data for tuning","category":"Tuning Query","deterministic":true,"characteristic_form":"The finetuned forecasting model is saved in save_model_dir=tunedmodels with result stored in results_file. Results are saved: {%JSON_RESULT}","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Tuning Query"} +{"id":222,"type":"TSFM","text":"I need to perform Time Series anomaly detection of 'Chiller 9 Condenser Water Flow' using data in chiller9_tsad.csv","category":"Anomaly Detection Query","deterministic":true,"characteristic_form":"The anomaly detection results are stored in file data/tsfm_test_data/tsad_conformal.csv","group":"predictive","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Anomaly Detection Query"} +{"id":223,"type":"TSFM","text":"Find and run several methods to analyze data sensor 'Chiller 9 Condenser Water Flow' using data in 'data/tsfm_test_data/chiller9_tsad-small.csv'.","category":"Complex Query","deterministic":true,"characteristic_form":"The forecasting results for 'Chiller 9 Condenser Water Flow' using data in 'data/tsfm_test_data/chiller9_annotated_small_test.csv' are available in the json file and results of anomaly detection are stored in a csv file","group":"retrospective","entity":"Chiller","note":"Source: Time series forecasting needs; Deterministic query with single correct answer; Category: Complex Query"} +{"id":400,"text":"Get the work order of equipment CWC04013 for year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There will be 33 records. The expected response should retrieve all work orders for equipment CWC04013 in the year 2017, ensuring correct equipment ID and time filtering.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":401,"text":"I would like to check the work order distribution for the equipment labeled as CWC04013 for the year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"Work order with primary Code MT010 occurred 3 times and code MT013 occurred once. The expected response should retrieve and summarize work orders by type or month for equipment CWC04013 during 2017, ensuring correct year and equipment filtering.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":402,"text":"I would like to retrieve the preventive work order details for the equipment labeled as CWC04013 for the year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 31 preventive work orders for this utterance. The expected response should retrieve preventive maintenance work orders for CWC04013 in 2017, correctly filtering by asset, preventive work order type and year.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":403,"text":"I would like to retrieve the corrective work order details for the equipment labeled as CWC04013 for the year 2017.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"The output is two corrective work orders. The expected response should retrieve corrective maintenance work orders for CWC04013 during 2017, verifying correct work order type and year.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":404,"text":"Get the events of equipment CWC04009 for year 2019 and provide a summary based on the event group, such as work order event, alerts and anomaly events.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 14 work orders, 0 alert, and 0 anomaly. The expected response should retrieve all event types (work orders, alerts, anomalies) for CWC04009 in 2019 and summarize them by event group.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":405,"text":"Get all the events of equipment CWC04009 for the June of 2020 and provide a summary based on the event group for work order, alert, and anomaly.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 3 work order events, 30 alert events, and 30 anomaly events. The expected response should retrieve and summarize events (work order, alert, anomaly) for CWC04009 during June 2020, grouped correctly by event type and time range (June 2020).","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":406,"text":"Get the summary of the events of equipment CWC04009 for the June of 2020 and provide a summary based on the event group.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 30 alerts, 30 anomalies, and 3 work orders. The expected response should summarize events of CWC04009 in June 2020 by event group, ensuring complete event retrieval and correct categorization/grouping (alert, anomalies, and work order).","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":407,"text":"Get the daily count of the events of alert, anomaly for 2021 for equipment CWC04009.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 82 days have events. The expected response should retrieve daily counts of alerts and anomalies for CWC04009 throughout 2021, verifying correct aggregation over time (daily) and filtering of asset, event type (alert), and year.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":408,"text":"Get the daily count of the events of alert, anomaly for the May 2020 for equipment CWC04009.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 26 days have events. The expected response should retrieve daily counts of alerts and anomalies for CWC04009 for May 2020, verifying correct aggregation over time (daily) and filtering of asset, event type (alert, anomaly), and time range - May 2020.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":409,"text":"Get the daily count of alert, anomaly and work order event for the May 2020 for equipment CWC04009.","type":"Workorder","category":"Knowledge Query","deterministic":false,"characteristic_form":"There are 26 days with the records. Depending on the LLM used, the result could be daily total event summary or daily summary for each event type. The expected response should retrieve and summarize daily counts of alerts, anomalies, and work order events for CWC04009 for May 2020, verifying correct aggregation over time (daily) and filtering of asset, event type (alert, anomaly and work order), and time range - May 2020.","note":"We have both work order business data object and work order event as a group type in the event file. So we make a change of the utterance.","group":"retrospective","entity":"Equipment"} +{"id":410,"text":"Get all the events of equipment CWC04009 for the first week of June of 2020 and provide a summary based on the event group for work order event, alert, and anomaly.","type":"Workorder","category":"Knowledge Query","deterministic":true,"characteristic_form":"There are 6 alert records. The expected response should retrieve events for CWC04009 in the first week of June 2020 and group them by event type. verifying correct aggregation over time (daily) and filtering of asset, event type (alert, anomaly and work order), and time range - First week of May 2020.","group":"retrospective","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":411,"text":"Which corrective work orders for equipment CWC04009 in year 2017 can be bundled in the next maintenance window? A bundle means that several work orders are executed in a short period, say in two weeks.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"There are two bundles, one has 10, and another has 3 corrective work orders. The expected response should identify corrective work orders for CWC04009 in 2017 that can be bundled together for execution within a two-week maintenance window. Ensure the calculation and bundile is correct","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":412,"text":"I would like to predict the next work order probability for the equipment labeled as CWC04013.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"The expected response should be able to identify the next likely work order for CWC04013 based on historical work order patterns. It should be a list of work order with the probabilities (the summation of the probabilities should be one).","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":413,"text":"Assuming that the current date is 2018-01-02, can you predict next work order probability for me for equipment CWC04009 using predict_next_work_order_probability function?","type":"Workorder","category":"Prediction","deterministic":true,"characteristic_form":"Freon Management (code MT012) under Maintenance and Routine Checks has a probability of 0.2. The output should have the probability for primary code. For example, the highest probability of next work order. The expected response should be able to use historical work order data up to 2018-01-02 for CWC04009 to identify or predict the next work order probability, ensuring no cutoff of results. More specific, It should be a list of work order with the probabilities (the summation of the probabilities should be one).","note":"The output token size changed to 2000 to make sure there is no cut-off of the generated results.","group":"predictive","entity":"Equipment"} +{"id":414,"text":"Assuming that the current date is 2018-01-02, can you predict next work order probability for me for equipment CWC04009?","type":"Workorder","deterministic":true,"category":"Prediction","characteristic_form":"Failure codes MT012, MT008, and M013 each have a probability of 0.2. It will predict the next work order probability for CWC04009 using available data up to 2018-01-02. The expected response should be able to use historical work order data up to 2018-01-02 for CWC04009 to identify or predict the next work order probability, ensuring no cutoff of results. More specific, It should be a list of work order with the probabilities (the summation of the probabilities should be one).","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Deterministic query with single correct answer; Category: Prediction"} +{"id":415,"text":"When an anomaly happens for equipment CWC04009, can you recommend a list of candidate work orders and give me a summary of work order as percentage?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"An possible example is work orders are split evenly with 50% for MT010 and 50% for MT013 for equipment CWC04009.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":416,"text":"When an anomaly happens for equipment CWC04009, can you recommend top three work orders to address this problem?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"It gives a list of work order with a primary failure code. Based on an anomaly in CWC04009, recommend the top three most appropriate work orders for remediation.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":417,"text":"Just notice an anomaly 'KPI Cooling Load above upper bound' happens for equipment CWC04009, can you recommend top three work orders to address this problem?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a list of the primilar failure codes with three work order types. In more details, upon observing the 'KPI Cooling Load above upper bound' anomaly, suggest the top three corrective work orders for CWC04009.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":418,"text":"Just notice two anomalies 'KPI Cooling Load above upper bound' and 'KPI Delta Setpoint above upper bound' happened for equipment CWC04009, can you recommend top three work orders to address this problem?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a list of the primilar failure codes with three work order types. Upon observing two anomalies, recommend the top three corrective actions for CWC04009 to address both issues.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":419,"text":"Using your knowledge of the industrial asset, can you suggest me a work order for alert RUL0014 with the context of 'Chiller - Cooling Substance Delta T Low' for closed-loop water-cool chiller its load is higher than the upper bound?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a one or more the primilar failure codes with their work order types. Recommend an appropriate work order to address the alert RUL0014 for the cooling issue in the closed-loop water-cooled chiller.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":420,"text":"Assume today is early of July 2020, I would like to review the performance of chiller 9 with equipment ID CWC04009 for June 2020 and track any anomalies or operation violations as alerts.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"There were 30 alerts for 'Chiller - Evaporator Approach High', and anomalies were observed in Cooling Load (12 instances), Flow Efficiency (9), Delta Setpoint (6), and Delta Temperature (3). The LLM ReAct process is to review the operational performance and detect anomalies or alerts for Chiller 9 (CWC04009) during June 2020, confirming correct equipment ID and timeframe.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":421,"text":"In May and June of 2020, numerous anomalies and alerts have been reported for Chiller 9 with equipment ID CWC04009. Could you review them and suggest appropriate work orders or actions?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be a one or more the primilar failure codes. The LLM ReAct analyze anomalies and alerts for Chiller 9 (CWC04009) during May–June 2020 and recommend appropriate corrective work orders.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":422,"text":"After checking existing work orders, anomalies and alerts in May and June 2020 for Chiller 9 with equipment ID CWC04009, should I recommend a new work order or is it too early to decide for July 2020?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zeor or more the primilar failure codes recommendaed as possible work orders. Evaluate whether a new work order should be created for July 2020 based on the review of anomalies, alerts, and existing work orders from May–June 2020 for CWC04009.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":423,"text":"I am using historical work order information upto end of June 2020 for prioritizing maintenance. Which work orders should I prioritize first for Chiller 9 with equipment ID CWC04009 in July 2020?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zeor or more the primilar failure codes recommendaed as possible work orders with priorities. Use historical work order data up to June 2020 to prioritize the most urgent work orders for Chiller 9 (CWC04009) in July 2020.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":424,"text":"Can you provide guidance on bundling corrective work orders together to optimize the maintenance schedule for Chiller 9 with equipment ID CWC04009 covering years of 2017, 2018 and 2019, bundle has to be happen within two weeks and have at least two work orders, also tell the details of each bundle?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"There will be three bundles generated with the size of 15, 6 and 2 respectively. Suggest bundles of corrective work orders for CWC04009 across 2017–2019, ensuring each bundle contains at least two work orders scheduled within a two-week window.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":425,"text":"How can I analyze anomalies across multiple KPIs to better diagnose the root cause of these issues?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Based on the utilzied LLM, the process begins with collecting and cleaning historical KPI and maintenance data, followed by detecting anomalies across key performance indicators. These anomalies are then analyzed for correlations, leading to root cause hypotheses that are validated with logs and expert input, ultimately guiding the bundling of corrective work orders into optimized maintenance actions. Provide a method to analyze anomalies across multiple KPIs for more accurate root cause diagnosis.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":426,"text":"Could you identify any causal linkages between anomalies across KPIs to better understand the severity and interconnectedness?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The LLM ReAct identifies causal relationships between anomalies across KPIs to understand system-wide impact and severity. Two causal linkages were identified between anomalies across KPIs: one related to Misalignment under Structural and Mechanical Failures and another to Insufficient Insulation under Energy Efficiency. Each issue occurred once, suggesting distinct yet potentially impactful contributors to system performance degradation.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":427,"text":"Since we know 80% of alerts are likely spurious, can you identify the meaningful 20% for further analysis for any chillers?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The results may vary, and the actual outcome depends on the specific LLM used. Filter and prioritize the most meaningful 20% of alerts from chillers for detailed analysis, excluding the spurious ones.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":428,"text":"Could you generate rules that help distinguish meaningful alerts from spurious ones?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Depends on the LLM utuilzied, the outcome could be 1) Real thredholds for meaning alert; or 2) the steps to generate such rules. Develop rules or criteria to distinguish genuine alerts from spurious or false positives in operational monitoring.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":429,"text":"How can reasoning on operation alerts help in generating significant warning message to improve maintenance recommendations for Chiller 9 with equipment ID CWC04009?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be one or more the alter rule codes. Explain how operational alert reasoning can be used to improve the generation of actionable warning messages for Chiller 9 (CWC04009).","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":430,"text":"We are building an early detection and remediation system for potential failures, such as condenser water side fouling, for Chiller 9 with equipment ID CWC04009 at main site site with two month’s period from 2020-05-01T12:30:00 to 2022-06-30T19:30:00. We like to review the chiller’s performance of the period with any anomalies or operation violations as alerts, and provide the guideline on work order generation?","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be one or more the primilar failure codes with corresponding work order types. Review anomalies and alerts for Chiller 9 (CWC04009) at main site between 2020-05-01 and 2022-06-30, and provide work order generation guidelines.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":431,"text":"Assume today is early of July 2020, I would like to review the performance of chiller 9 with equipment ID CWC04009 for June 2020 and track any anomalies or operation violations as alerts. Tell me what corrective work orders have been scheduled, and whether new work order should generate.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zero or one the primilar failure code with corresponding work order type. The outcome dependes on the LLM utilzied. Review June 2020 anomalies and alerts for Chiller 9 (CWC04009), list scheduled corrective work orders, and determine if a new work order is needed.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":432,"text":"I would like to review the performance of chiller 9 with equipment ID CWC04009 at main site site for June 2020 and track any anomalies or operation alerts. Tell me what corrective work orders have been scheduled, and whether new work order should generate.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output will be zero or more the primilar failure code with corresponding work order type. The outcome dependes on the LLM utilzied. Review June 2020 performance of Chiller 9 (CWC04009) at main site, track anomalies and alerts, and evaluate corrective work order needs.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":433,"text":"We are building an early detection system for a potential failure condenser Water side fouling for Chiller 9. Monitor Chiller 9 at main site site from 2020-04-20T12:30:00 to 2020-05-12T19:30:00, identify anomalous behaviors and provide a work order recomendation.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output could be a description of anomalous for fouling and/or a work order recommendation. Monitor Chiller 9 (CWC04009) at main site between 2020-04-20 and 2020-05-12 for anomalies indicating condenser fouling and recommend a corrective work order.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":434,"text":"We are building an early detection system for a potential failure condenser Water side fouling for Chiller 9. Monitor Chiller 9 at main site site from 2020-04-20T12:30:00 to 2020-05-12T19:30:00, identify anomalous behaviors and provide a work order recommendation if there is no such corrective work order created already.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"The output could be a description of anomalous for fouling and/or a work order recommendation.. Detect condenser fouling anomalies for Chiller 9 (CWC04009) between 2020-04-20 and 2020-05-12, and recommend a work order only if none already exists.","group":"prescriptive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":435,"text":"Assume today is early of July 2020, I would like to review the alerts for chiller 9 with equipment ID CWC04009 for June 2020 and the work order should be generated based on the type of alerts.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Two work order recommendations are suggested due to structural and mechanical issues: one for compressor failure (M010) and another for deformation (M003). Analyze June 2020 alerts for Chiller 9 (CWC04009) and recommend generating appropriate work orders based on alert types.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":436,"text":"Build a predictive model from historical alerts and work orders of CWC04009 to forecast failures and replacement needs over the forthcoming 10-year horizon.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Leverage ALERT and WORK_ORDER records (features: description, event_group, event_category, event_time) for CWC04009 to train and validate a model that predicts the likelihood and timing of future failures or required replacements.","group":"retrospective;predictive;prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":437,"text":"Detect clusters of alerts and work orders on CWC04009 that signal elevated failure risk for the next planning cycle, guiding proactive maintenance budgeting.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Apply time-series burst or clustering analysis to event_time for ALERT + WORK_ORDER events of CWC04009; flag dense clusters as high-risk periods for long-term budgeting.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":438,"text":"Rank alert descriptions for CWC04009 by how strongly they predict subsequent corrective work orders, supporting long-term failure-risk mitigation.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"For each alert description on CWC04009, compute the conditional probability that a CM WORK_ORDER follows within a set window; sort descriptions by predictive strength.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":439,"text":"Analyse sequences where alerts precede corrective work orders on CWC04009 to improve failure anticipation over the asset’s remaining life-cycle.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Identify ALERT → CM WORK_ORDER pairs for CWC04009, measure lead-lag intervals, and summarise patterns that can inform proactive scheduling.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":440,"text":"Using historical counts, project how many preventive (PM) and corrective (CM) work orders each major description category is likely to generate for CWC04009 over the coming decade.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Aggregate yearly PM and CM WORK_ORDER counts for CWC04009 by description and extrapolate future volumes with a simple trend or time-series model.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":441,"text":"Determine which alert or work-order descriptions for CWC04009 exhibit the fastest growth trend, indicating components that may need early replacement in the life-cycle plan.","type":"Workorder","category":"Prediction","deterministic":false,"characteristic_form":"Compute year-over-year growth rates of event counts by description for CWC04009; highlight those with the steepest increases.","group":"predictive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Prediction"} +{"id":442,"text":"Examine whether the year-over-year increase in corrective maintenance for CWC04009 warrants shifting resources from annual repairs toward multi-year replacement planning.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Plot CM WORK_ORDER counts per year for CWC04009, assess the upward trend, and recommend budget reallocation if growth is significant.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":443,"text":"Measure typical time gaps between alerts and the corrective work orders they precede for CWC04009 to refine the life-cycle maintenance timeline.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"For each ALERT that is followed by a CM WORK_ORDER on CWC04009, calculate the time interval; summarise median, mean, and distribution to guide scheduling.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":444,"text":"Quantify how often alerts and corrective work orders cluster together for CWC04009 to identify high-risk operational periods in the years ahead.","type":"Workorder","deterministic":false,"category":"Decision Support","characteristic_form":"Use rolling windows on event_time to count co-occurrences of ALERT and CM WORK_ORDER events for CWC04009; flag windows with elevated counts.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":445,"text":"Identify which alert descriptions for CWC04009 show the steepest upward trend and therefore require priority in the 10-year capital-planning roadmap.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Group ALERT events for CWC04009 by description, compute yearly counts, calculate trend slopes, and list the descriptions with the largest positive slopes.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":446,"text":"Determine which alert or work-order descriptions account for the highest event counts on CWC04009 and should therefore drive allocation of funds in the next 10-year capital budget.","type":"Workorder","category":"Decision Support","deterministic":false,"characteristic_form":"Aggregate ALERT and WORK_ORDER events for CWC04009 by description, rank by total count, and provide the top contributors as budget-prioritisation drivers.","group":"prescriptive","entity":"Equipment","note":"Source: Maintenance operations; Non-deterministic query allowing multiple valid responses; Category: Decision Support"} +{"id":501,"type":"multiagent","text":"Is there any anomaly detected in Chiller 6's Tonnage in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions while ensuring the correct variables, including the asset (Chiller 6), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that IoTAgent was called to request and download the data, and TSFMAgent was properly utilized to perform Time Series anomaly detection on the Tonnage parameter. The response must also verify that the data was accurately stored in the designated file location, and that the analysis results were saved to a new file. Additionally, the response should explicitly confirm the detection of anomalies in Chiller 6's Tonnage during the specified timeframe at the MAIN site, as these anomalies were anticipated.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":502,"type":"multiagent","text":"What is the forecast for 'Chiller 9 Condenser Water Flow' in the week of 2020-04-27 based on data from the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct variables, including the asset ('Chiller 9'), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that the agent identified the sensors for the asset and site, then located the specific sensor, 'Chiller 9 Condenser Water Flow'. The response must confirm that the agent retrieved the time-series data for this sensor within the specified timeframe and provided the correct file path where the data is stored. Additionally, the response should verify that TSFMAgent was called to analyze the data and perform forecasting using the specified model checkpoint 'ttm_96_28'. The response should confirm that the agent successfully read the JSON file, performed the time-series forecasting, and stored the results in the designated file path.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":503,"type":"multiagent","text":"Have there been any anomalies in Chiller 6's Tonnage in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct variables, including the asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that the agent called IoTAgent to request and download the Chiller 6 Tonnage data for the specified week, and that the data was stored correctly. The response must also confirm that TSFMAgent was used to analyze the data for anomalies, and that the analysis results were saved in a separate file. Additionally, it should confirm that the dataset contained mote than 400 records and that around 20 anomalies were detected. Finally, the response must be clear, justified, and free from hallucinations, ensuring that all actions were executed accurately and anomalies in Chiller 6's Tonnage during the specified timeframe at MAIN were detected as expected.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":504,"type":"multiagent","text":"Can you forecast Chiller 6's performance for next week based on the data from 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent called IoTAgent to request and retrieve the necessary data (specially Chiller 6 Tonnage) for Chiller 6, then used TSFMAgent to analyze the data and generate a forecast for the following week. The response must also confirm that the forecasting results were stored in a designated file and that the model used for forecasting was specified as 'ttm_96_28'.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":505,"type":"multiagent","text":"What's the forecast for Chiller 6's Tonnage for next week based on the data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to retrieve the Chiller 6 Tonnage data for the week of 2020-04-27 at MAIN and attempt to forecast for the next week. It should specify that the agent identified an issue with the missing model checkpoint, but effectively queried available pretrained models using the tsfmmodels tool. The response must confirm that after selecting a suitable model, the agent successfully generated the forecast for the next week.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":506,"type":"multiagent","text":"Is there any anomaly detected in Chiller 9's Condenser Water Flow in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct variables, including the asset ('Chiller 9'), location (MAIN), and time range (week of 2020-04-27), were used for data retrieval and analysis. It should specify that the agent called IoTAgent to request and download the Condenser Water Flow data for Chiller 9 at the MAIN site for the specified week. The response must confirm that the agent analyzed the downloaded time-series data for anomalies using TSFMAgent. Additionally, the response should explicitly state that the agent provided the file path where the data is stored and that the analysis results were reviewed. The response must confirm that no anomalies were detected in Chiller 9's Condenser Water Flow during the specified week at the MAIN site.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":507,"type":"multiagent","text":"What is the predicted energy consumption for Chiller 9 in the week of 2020-04-27 based on data from the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 9'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent identified the sensor name (power input sensor) and retrieved the historical energy consumption data for Chiller 9 during the specified time period. The response must also explain that the agent attempted to analyze the data for energy consumption prediction, but was unable to do so due to insufficient data, as the power input for Chiller 9 was consistently 0.0 from 2020-04-20 to 2020-04-25, indicating that the chiller was not operating.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":508,"type":"multiagent","text":"Have there been any anomalies in Chiller 6's performance metrics from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent successfully retrieved the Chiller 6 Tonnage sensor data for the specified time range and location. The response must confirm that the agent called TSFMAgent to perform anomaly detection on the data and that the results were saved correctly. Additionally, it should explicitly mention that there were anomalies detected in the Chiller 6 Tonnage data during the specified week.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":509,"type":"multiagent","text":"Can you detect any anomalies in Chiller 6's Condenser Water Flow in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset ('Chiller 6'), location (MAIN), and time range (week of 2020-04-27) were used for data retrieval and analysis. It should specify that the agent successfully retrieved the Condenser Water Flow data for Chiller 6 at MAIN during the specified time period and then used TSFMAgent to analyze the data for anomalies. The response optionally explain that the agent encountered multiple errors but resolved them by providing the missing timestamp_column, increasing the n_calibration parameter, and adjusting the false_alarm parameter. Additionally, the response should confirm that the anomaly detection was successfully completed and that the results were saved to the specified file. The response must include the file location, the number of records (1 record), and the fact that 0 anomalies were detected in the dataset.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":510,"type":"multiagent","text":"What are the anomaly detection results for Chiller 9's Tonnage and Power Input in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm that the agent successfully executed all required actions to retrieve the time-series data for Chiller 9's Tonnage and Power Input at the MAIN site for the specified time range (2020-04-27 to 2020-05-03). It should specify that the agent determined the data does not exist for the requested time period. The response must also mention that the agent attempted multiple actions to retrieve the data and provided clear evidence of the error encountered during the process.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":511,"type":"multiagent","text":"Can you predict Chiller 9's energy usage for next week based on data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions, ensuring that the correct asset (Chiller 9) and location (MAIN site) were used for data retrieval and analysis. It should specify that the agent first identified the sensors for Chiller 9, then selected the Chiller 9 Power Input sensor, and successfully retrieved the energy usage data for the specified time period. The response should confirm that the agent provided the file path where the data is stored. Additionally, it should mention that although the agent initially encountered errors while analyzing the data and making predictions, it successfully corrected its mistakes and finetuned a Time Series Forecasting model using the provided data. The agent should have used the finetuned model to generate predictions for the next week, with the results being stored in the specified file.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":512,"type":"multiagent","text":"Has any anomaly been detected in Chiller 6's Return Temperature in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all necessary actions, ensuring that the correct asset (Chiller 6) and location (MAIN) were used to verify the availability of the dataset for the specified time range (week of 2020-04-27). It should specify that the agent queried the history for the Return Temperature sensor, found data observations.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":513,"type":"multiagent","text":"What is the forecast for Chiller 6's Setpoint Temperature for next week based on the week of 2020-04-27 data?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the question regarding the forecast for Chiller 6 Setpoint Temperature for the next week, based on data from the week of 2020-04-27. It should specify that the agent first requested and downloaded the data from IoTAgent, then used TSFMAgent to analyze the data and generate a forecast. The response should explain that the agent identified the data had a constant value of 45.5 and produced a forecast with the same constant value for the next week. Additionally, the response should mention that the agent handled the error encountered during the forecasting process by selecting a pretrained model, successfully completing the task.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":514,"type":"multiagent","text":"Can you detect any anomalies in Chiller 9's Condenser Water Flow in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the question regarding the detection of anomalies in Chiller 9's Condenser Water Flow during the week of 2020-04-27 at the MAIN site. It should specify that the agent first requested and downloaded the necessary Condenser Water Flow data. Then, it should explain that the agent used TSFMAgent to analyze the data for anomalies, encountered errors with the anomaly detection tool, but correctly identified that no anomalies were detected. The response must clearly state that no anomalies were found.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":515,"type":"multiagent","text":"Can you predict Chiller 9's performance for next week based on data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the question regarding the forecasting of Chiller 9's performance for the next week, using data from the specified time period and location. It should specify that the agent first retrieved the performance data for Chiller 9 and then used TSFMAgent to generate the prediction. The response must clarify that the forecasting results were successfully stored and the model used was 'ttm_96_28'.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":516,"type":"multiagent","text":"What's the forecast for Chiller 6's future energy consumption for next week based on data from the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task regarding the forecast for Chiller 6's future energy consumption. It should specify that the agent first identified any issues with the sensor name and provided a clear explanation. Then, it should explain that the agent retrieved the correct sensor data for Chiller 6 and used it to generate a forecast. The response must also confirm that the agent handled any exceptions, such as the absence of the required sensor, and provided a clear explanation for this. Additionally, the agent should verify that it successfully read the forecast file and provided the forecast for Chiller 6's future energy consumption, generated using the 'ttm_96_28' model. Finally, the response should clearly state the forecast for Chiller 6's future energy consumption and include any relevant details from the forecasting process.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":517,"type":"multiagent","text":"Are there any anomalies detected in Chiller 9's Tonnage in the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task of anomaly detection for Chiller 9's Tonnage sensor at the MAIN site during the week of 2020-04-27. It should specify that the agent first retrieved the asset history data for Chiller 9's Tonnage sensor for the specified time range. The agent then used TSFMAgent to analyze the data for anomalies and provided a detailed description of the dataset. Anomaly are detected for this query.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":518,"type":"multiagent","text":"Can you forecast energy usage for Chiller 9 for next week using data from the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task of forecasting Chiller 9's Power Input. It should specify that the agent first identified and resolved multiple issues, including the missing timestamp column, incorrect model checkpoint, and incorrect target column. After these issues were corrected, the agent used the pretrained model 'ttm_96_28' to generate the forecasting results. The response should emphasize that the agent successfully handled the corrections and produced the forecasting results, with no further errors encountered during the process.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":519,"type":"multiagent","text":"Is there any anomaly detected in Chiller 9's Power Input in the week of 2020-04-27 at MAIN?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task regarding the detection of anomalies in Chiller 9's Power Input. It should specify that the agent first requested and retrieved the necessary Chiller 9 Power Input data from IoTAgent, then used TSFMAgent to analyze the data for anomalies. The response should clarify that the agent successfully identified no anomalies and provide the file path where the data is stored, as well as the location of the output file containing the anomaly detection results.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":520,"type":"multiagent","text":"What is the forecast for Chiller 6's energy consumption for next week based on data from the week of 2020-04-27 at the MAIN site?","category":"Knowledge Query","deterministic":true,"characteristic_form":"The expected response should confirm the successful execution of all required actions to address the task of forecasting the energy consumption for the next week. It should specify that the agent first identified the relevant sensor for energy consumption and retrieved the historical data for the specified time range. The agent then verified the structure of the JSON file to ensure it contained the necessary columns, such as the target column 'Chiller 6 Power Input' and the timestamp column 'timestamp'. Despite initial issues with selecting the correct model and parameters, the agent successfully used the correct pretrained model 'ttm_energy_96_28' to analyze the time-series data and forecast the energy consumption. The forecasted results were stored in a file, and the agent provided the file path in the final response.","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":601,"type":"multiagent","text":"List all failure modes of asset Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes for Chiller 6 are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":602,"type":"multiagent","text":"List all failure modes of asset Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The failure modes of asset Chiller 6 are: ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":603,"type":"multiagent","text":"List all installed sensors of asset Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":true,"characteristic_form":"The installed sensors of asset Chiller 6 are: Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Deterministic query with single correct answer; Category: Knowledge Query"} +{"id":604,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by Chiller 6 Chiller Efficiency.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":605,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by temperature sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":606,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by temperature sensors and power input sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":607,"type":"multiagent","text":"Get failure modes for Chiller 6 at MAIN site and only include in final response those that can be monitored using the available sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":608,"type":"multiagent","text":"Are there any failure modes of Chiller 6 at MAIN site that can be predicted by monitoring the vibration sensor data?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":609,"type":"multiagent","text":"List all sensors of Chiller 6 at MAIN site that are potentially relevant to Compressor Overheating.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":610,"type":"multiagent","text":" If compressor overheating occurs for Chiller 6 at MAIN site, which sensor should be prioritized for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.] ","group":"prescriptive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":611,"type":"multiagent","text":" If Evaporator Water side fouling occurs for Chiller 6 at MAIN site, which sensor is most relevant for monitoring this specific failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one of more sensors of Chiller 6. The sensors of Chiller 6 need to be from the list [Chiller 6 Chiller % Loaded, Chiller 6 Chiller Efficiency, Chiller 6 Condenser Water Flow, Chiller 6 Condenser Water Return To Tower Temperature, Chiller 6 Liquid Refrigerant Evaporator Temperature, Chiller 6 Power Input, Chiller 6 Return Temperature, Chiller 6 Schedule, Chiller 6 Supply Temperature, Chiller 6 Tonnage.] ","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":612,"type":"multiagent","text":"What are the failure modes of Chiller 6 at MAIN site that can be identified by analyzing the data from the available sensors?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":613,"type":"multiagent","text":"Generate an anomaly detection recipe for detecting compressor motor failure for Chiller 6 at MAIN site.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a detailed anomaly detection recipe for detecting compressor motor failure for chiller","group":"predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":614,"type":"multiagent","text":"Purge unit of chiller 6 at MAIN site have possibility to excess purge, what is the plan by the maintenance experts to early detect the failure?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a plan by the maintenance experts to early detect the failure of purge unit of chiller 6. the answer should include the sensors that can be used to detect the failure of purge unit of chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":615,"type":"multiagent","text":"Generate a machine learning recipe for detecting overheating failure for Chiller 6 at MAIN site. Result should include feature sensors and target sensor.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should be a machine learning recipe for detecting overheating failure for Chiller 6. the answer should include the sensors that can be used to detect the failure of overheating for Chiller 6","group":"prescriptive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":616,"type":"multiagent","text":"List all failure modes of Chiller 6 at MAIN site that can be detected by temperature sensors and power input sensors.","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":617,"type":"multiagent","text":"When compressor motor of Chiller 6 at MAIN site fails, what is the temporal behavior of the power input?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should describe the temporal behavior of the power input of Chiller 6","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":618,"type":"multiagent","text":"When power input of Chiller 6 at MAIN site drops, what is the potential failure that causes it?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":619,"type":"multiagent","text":"When the Liquid Refrigerant Evaporator Temperature of Chiller 6 at MAIN site drops, what failure is most likely to occur?","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain one or more failure modes of Chiller 6. The failure modes of Chiller 6 need to be from the list ['Compressor Overheating: Failed due to Normal wear, overheating', 'Heat Exchangers: Fans: Degraded motor or worn bearing due to Normal use', 'Evaporator Water side fouling', 'Condenser Water side fouling', 'Condenser Improper water side flow rate', 'Purge Unit Excessive purge', 'Refrigerant Operated Control Valve Failed spring']","group":"retrospective","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":620,"type":"multiagent","text":"I want to build an anomaly model for identifying a chiller trip failure for MAIN chiller 6. Provide me a list of sensors that I should use, along with the temporal behavior,","category":"Knowledge Query","deterministic":false,"characteristic_form":"the answer should contain how to build an anomaly model for identifying a chiller trip failure for MAIN chiller 6. The answer should include sensors that I should use, along with the temporal behavior,","group":"prescriptive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":621,"type":"multiagent","text":"Can you check if there are any anomalies for chiller tonnage, and do you think I should create a work order after reviewing the anomalies?","category":"Knowledge Query","deterministic":false,"characteristic_form":"The process involves retrieving IoT sensor data, performing time-series anomaly detection, and using maintenance reasoning to decide whether a work order should be created.","group":"retrospective;predictive","entity":"Chiller","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} +{"id":622,"type":"multiagent","text":"Here is an output of anomaly model in file with absolute path '/tmp/tsad_conformal.csv', can you check if there are any anomalies, and do you think I should create a work order after reviewing the anomalies?","category":"Knowledge Query","deterministic":false,"characteristic_form":"The problem is solved by first checking if the anomaly file exists, then running anomaly detection if the data is available, and finally deciding whether a work order should be created based on the results.","group":"retrospective;predictive","entity":"Equipment","note":"Source: Multi-agent coordination requirements; Non-deterministic query allowing multiple valid responses; Category: Knowledge Query"} diff --git a/src/scenarios/huggingface/task/failure_mapping_senarios.jsonl b/src/scenarios/huggingface/task/failure_mapping_senarios.jsonl new file mode 100644 index 000000000..564780f4c --- /dev/null +++ b/src/scenarios/huggingface/task/failure_mapping_senarios.jsonl @@ -0,0 +1,88 @@ +{"id": 1, "type": "FMSR", "text": "List all failure modes of electric motor that can be detected by vibration, cooling gas, or axial flux.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [loss of input power phase, stator windings fault, bearing damage, insulation deterioration, eccentric rotor fault, misalignment, unbalance, brush(es) fault, rotor windings fault]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 2, "type": "FMSR", "text": "List all failure modes of electric motor that can be detected by monitoring the sensors power, current, and vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [brush(es) fault, rotor windings fault, loss of input power phase, eccentric rotor fault, bearing damage, misalignment, stator windings fault, insulation deterioration]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 3, "type": "FMSR", "text": "List all failure modes of steam turbine that can be detected by vibration, oil debris, or length measurement.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of steam turbine. The failure modes of steam turbine need to be from the list [bearing damage, unbalance, eccentric rotor, damaged rotor blade, hogging or sagging rotor, damaged labyrinth, misalignment, unequal expansion, bearing wear]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 4, "type": "FMSR", "text": "For a steam turbine, list all the failure modes that can be detected by monitoring the sensors vibration, oil debris, and temperature.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of steam turbine. The failure modes of steam turbine need to be from the list [bearing damage, misalignment, unequal expansion, damaged labyrinth, bearing wear, damaged rotor blade, hogging or sagging rotor, eccentric rotor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 5, "type": "FMSR", "text": "For aero gas turbine, list all the failure modes that can be detected or indicated by abnormal readings from vibration, speed, or fuel pressure/fuel flow.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of aero gas turbine. The failure modes of aero gas turbine need to be from the list [compressor damaged, power turbine dirty, compressor stall, misalignment, unbalance, seal leakage, combustion chamber holed, fuel filter blockage, air inlet blockage, burner blocked, compressor fouled, gear defects, power turbine damage, bearing wear/damage]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 6, "type": "FMSR", "text": "For aero gas turbine, list all the failure modes that can be detected by the sensors oil debris, compresor pressure/ pressure ratio, and air flow.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of aero gas turbine. The failure modes of aero gas turbine need to be from the list [power turbine damage, compressor stall, bearing wear/ damage, compressor damaged, seal leakage, power turbine dirty, air inlet blockage, compressor fouled, burner blocked, unbalance, misalignment, combustion chamber holed, gear defects, speed]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 7, "type": "FMSR", "text": "List all failure modes of industrial gas turbine that can be detected by abnormal readings in speed, air flow, exhaust temperature, fuel pressure/fuel flow, compressor efficiency, and vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of industrial gas turbine. The failure modes of industrial gas turbine need to be from the list [burner blocked, compressor fouled, bearing wear, misalignment, unbalance, compressor damaged, power turbine damaged, combustion chamber holed, air inlet blockage, fuel filter blockage]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 8, "type": "FMSR", "text": "List all failure modes of industrial gas turbine that can be detected by monitoring vibration, compressor pressure, and output power.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of industrial gas turbine. The failure modes of industrial gas turbine need to be from the list [unbalance, compressor fouled, combustion chamber holed, power turbine damaged, air inlet blockage, bearing wear, compressor damaged]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 9, "type": "FMSR", "text": "List all failure modes of pump that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of pump. The failure modes of pump need to be from the list [bearing damage, bearing wear, unbalance, misalignment, mounting fault, damaged impeller, eccentric impeller, damaged seals]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 10, "type": "FMSR", "text": "List all failure modes of pump that can be detected by vibration sensor.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of pump. The failure modes of pump need to be from the list [bearing damage, bearing wear, damaged impeller, eccentric impeller, misalignment, mounting fault, damaged seals]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 11, "type": "FMSR", "text": "What sensors can be used to detect winding deformation, oil leakage, or overheating in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation, oil leakage, or overheating in a power transformer. Example sensors: [Dissolved Gas Analyzer, Oil Level Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 12, "type": "FMSR", "text": "List all failure modes of compressor that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of compressor. The failure modes of compressor need to be from the list [eccentric impeller, compressor stall, unbalance, misalignment, damaged impeller, mounting fault, bearing wear, damaged seals, valve fault, fluid leakage, oil leakage, coast down time, cooling system fault, power, length measurement, pressure or vacuum, speed, oil debris, temperature]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 13, "type": "FMSR", "text": "For a compressor, list all the failure modes that can be detected or are irrelevant when the sensors pressure or vacuum, speed, and vibration show abnormal readings.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of compressor. The failure modes of compressor need to be from the list [damaged seals, damaged impeller, eccentric impeller, misalignment, compressor stall, unbalance, cooling system fault, valve fault, bearing wear, bearing damage, mounting fault]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 14, "type": "FMSR", "text": "List all failure modes of reciprocating internal combustion engine that can be detected by monitoring cylinder pressure, fuel flow, vibration, oil debris, or exhaust temperature.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of reciprocating internal combustion engine. The failure modes of reciprocating internal combustion engine need to be from the list [fuel injector fault, bearing wear, ignition fault, fuel filter blockage, unbalance, cooling system fault, piston ring fault]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 15, "type": "FMSR", "text": "List all failure modes of reciprocating internal combustion engine that can be detected by monitoring oil debris and cylinder pressure.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of reciprocating internal combustion engine. The failure modes of reciprocating internal combustion engine need to be from the list [piston ring fault, bearing wear, seal leakage, flywheel damage, gear defects, mounting fault, unbalance, ignition fault, fuel injector fault, air inlet blockage, fuel filter blockage, cooling system fault, misalignment]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 16, "type": "FMSR", "text": "List all failure modes of electric generator that can be detected by monitoring vibration and temperature.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric generator. The failure modes of electric generator need to be from the list [rotor windings fault, unbalance, eccentric rotor, brush(es) fault, loss of output power phase, misalignment, bearing damage, stator windings fault, insulation deterioration]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 17, "type": "FMSR", "text": "List all failure modes of electric generator that can be detected by vibration sensor.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric generator. The failure modes of electric generator need to be from the list [unbalance, bearing damage, stator windings fault, eccentric rotor, brush(es) fault, loss of output power phase, insulation deterioration]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 18, "type": "FMSR", "text": "List all failure modes of fan that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of fan. The failure modes of fan need to be from the list [bearing wear, damaged bellows, damaged oil seals, mounting fault, eccentric impeller, misalignment, rotor fouled, unbalance, damaged impeller]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 19, "type": "FMSR", "text": "List all failure modes of fan that can be detected by vibration.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of fan. The failure modes of fan need to be from the list [unbalance, misalignment, mounting fault, bearing damage, eccentric impeller, damaged impeller, rotor fouled]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 20, "type": "FMSR", "text": "List all failure modes of power transformer that can be detected by dissolved gas analysis, temperature, or ultrasound.", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [oil leak, winding distortion, through fault e.g. lightning strike, external damage/ disturbance, de-energized tap-changer condition/ fault, oil quality deterioration, core looseness, winding looseness, on-load tap-changer condition/ fault, moisture ingress/ content, arcing/ electrical discharge, supply faults, e.g. excessive harmonics and over fluxing, low oil level, insulation deterioration]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 21, "type": "FMSR", "text": "For a power transformer, list all the failure modes that can be detected or indicated by an abnormal reading from the sensor dissolved gas analysis or frequency response analysis (fra).", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [winding looseness, core looseness, external damage/ disturbance, de-energized tap-changer condition/ fault, on-load tap-changer condition/ fault, overheating/ auxiliary cooling system fault, oil quality deterioration, low oil level, through fault e.g. lightning strike, winding distortion, arcing/ electrical discharge, connection/ bushing faults, moisture ingress/ content, insulation deterioration]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 22, "type": "FMSR", "text": "What are the failure modes of an electric motor that can be identified using a combination of vibration analysis, temperature monitoring, and current signature analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [bearing failure, stator winding failure, rotor bar failure, misalignment, imbalance, lubrication issues]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 23, "type": "FMSR", "text": "What are the failure modes of an electric motor that can be identified using a combination of vibration analysis, temperature monitoring, and current signature analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of electric motor. The failure modes of electric motor need to be from the list [bearing failure, stator winding failure, rotor bar failure, misalignment, imbalance, lubrication issues]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 24, "type": "FMSR", "text": "What are the failure modes of an aero gas turbine that can be identified by monitoring the vibration, temperature, and fuel flow sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an aero gas turbine. The failure modes need to be from the list [bearing failure, blade damage, combustion issue, compressor stall, fuel system malfunction]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 25, "type": "FMSR", "text": "What are the failure modes of an aero gas turbine that can be identified using a combination of vibration, temperature, and oil pressure sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an aero gas turbine. The failure modes need to be from the list [bearing failure, blade damage, combustion issue, lubrication failure, compressor stall, turbine overheat]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 26, "type": "FMSR", "text": "What are the possible failure modes of the pump that can be identified using the vibration sensor, flow rate sensor, and pressure sensor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the pump. The failure modes of the pump need to be from the list [cavitation, bearing failure, impeller damage, seal leakage, motor overheating]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 27, "type": "FMSR", "text": "What are the possible failure modes of a pump that can be identified using a combination of vibration, pressure, and flow rate sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of pump. The failure modes of pump need to be from the list [cavitation, bearing failure, seal leakage, impeller damage, motor overheating]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 28, "type": "FMSR", "text": "What are the failure modes of the compressor that can be identified using the vibration sensor, pressure sensor, and temperature sensor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the compressor. The failure modes of the compressor need to be from the list [Bearing Failure, Impeller Damage, Seal Leakage, Valve Failure, Motor Overheating]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 29, "type": "FMSR", "text": "What are the failure modes of the compressor that can be identified using the vibration sensor, pressure sensor, and temperature sensor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the compressor. The failure modes of the compressor need to be from the list [Bearing Failure, Impeller Damage, Seal Leakage, Valve Failure, Motor Overheating]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 30, "type": "FMSR", "text": "What are the failure modes of a reciprocating internal combustion engine that can be identified using a combination of vibration analysis, temperature monitoring, and oil analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [Piston failure, Bearing failure, Valve failure, Crankshaft failure, Cylinder head failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 31, "type": "FMSR", "text": "What are the failure modes of a reciprocating internal combustion engine that can be identified using a combination of vibration, temperature, and pressure sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [Piston failure, Bearing failure, Valve failure, Crankshaft failure, Cylinder head failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 32, "type": "FMSR", "text": "What are the possible failure modes of an electric generator that can be identified using vibration analysis, temperature monitoring, and oil analysis?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the electric generator. The failure modes need to be from the list [Bearing Failure, Rotor Imbalance, Stator Winding Failure, Cooling System Failure, Fuel System Failure]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 33, "type": "FMSR", "text": "What are the failure modes of an electric generator that can be identified using a combination of vibration, temperature, and voltage sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of the electric generator. The failure modes need to be from the list [bearing failure, stator winding failure, rotor imbalance, voltage regulator failure, fuel system failure]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 34, "type": "FMSR", "text": "What are the possible failure modes of a fan that can be identified using data from vibration, noise, and temperature sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a fan. The failure modes of a fan need to be from the list [unbalanced blade, worn-out bearing, loose mounting, faulty motor, clogged airways]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 35, "type": "FMSR", "text": "What are the possible failure modes of a fan that can be identified using data from vibration, noise, and temperature sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a fan. The failure modes of a fan need to be from the list [unbalanced blades, worn-out bearings, loose mounting, faulty motor, misalignment]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 36, "type": "FMSR", "text": "What failure modes of a power transformer can be identified using a combination of dissolved gas analysis, oil level monitoring, and temperature monitoring?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [Insulation Failure, Overheating, Winding Deformation, Oil Leakage, Bushing Failure]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 37, "type": "FMSR", "text": "What failure modes of a power transformer can be identified using a combination of dissolved gas analysis and partial discharge measurement?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer. The failure modes of power transformer need to be from the list [insulation failure, winding deformation, overheating]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 38, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and overheating in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and overheating related failure modes in an electric motor. The sensors need to be from the list [vibration sensor, temperature sensor, thermographic sensor, current sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 39, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and temperature anomalies in a steam turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and temperature-related failure modes of a steam turbine. The sensors need to be from the list [Vibration Sensor, Temperature Sensor, Thermographic Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 40, "type": "FMSR", "text": "For an aero gas turbine, which failure modes can be detected using a combination of vibration analysis and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of aero gas turbine. The failure modes need to be from the list [bearing failure, blade failure, combustion instability, compressor stall, fuel system malfunction, high cycle fatigue, low cycle fatigue, oil leakage, shaft imbalance]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 41, "type": "FMSR", "text": "Which failure modes of an aero gas turbine can be detected using a combination of vibration analysis and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an aero gas turbine. The failure modes need to be from the list [bearing failure, blade failure, combustion instability, compressor stall, fuel system malfunction, high cycle fatigue, low cycle fatigue, oil leakage, rotor imbalance, turbine inlet temperature exceedance]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 42, "type": "FMSR", "text": "For an industrial gas turbine, which sensors are most effective for detecting failure modes related to vibration and high temperature?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors need to be from the list [Vibration Sensor, Temperature Sensor, Pressure Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 43, "type": "FMSR", "text": "For an industrial gas turbine, which sensors are most effective for detecting failure modes related to vibration and high temperature?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors related to industrial gas turbine. The sensors need to be from the list [Vibration Sensor, Thermographic Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 44, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and temperature anomalies in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and temperature-related failure modes of the compressor. The sensors need to be from the list [vibration sensor, temperature sensor, pressure sensor, thermographic sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 45, "type": "FMSR", "text": "Which sensors are most effective for detecting failure modes related to vibration and temperature anomalies in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors that can detect vibration and temperature-related failure modes of the compressor. The sensors need to be from the list [vibration sensor, temperature sensor, pressure sensor, thermographic sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 46, "type": "FMSR", "text": "Which failure modes of a reciprocating internal combustion engine can be detected using a combination of vibration and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [bearing failure, lubrication failure, cylinder head failure, piston ring failure, crankshaft failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 47, "type": "FMSR", "text": "Which failure modes of a reciprocating internal combustion engine can be detected using a combination of vibration and thermographic sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of a reciprocating internal combustion engine. The failure modes need to be from the list [bearing failure, lubrication failure, cylinder head failure, piston ring failure, crankshaft failure]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 48, "type": "FMSR", "text": "Which failure modes of an electric generator can be detected using a combination of vibration and temperature sensors?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of an electric generator. The failure modes need to be from the list [bearing failure, imbalance, misalignment, electrical fault, cooling system failure]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 49, "type": "FMSR", "text": "For a power transformer, which failure modes can be detected using a combination of thermographic and vibration sensors, and what are their corresponding detection reliabilities?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more failure modes of power transformer and their corresponding detection reliabilities. The failure modes need to be from the list [overheating, winding deformation, vibration failure, oil leakage, insulation failure]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 50, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, and stator winding faults in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, misalignment, and stator winding faults in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 51, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, and stator winding faults in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, misalignment, and stator winding faults in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 52, "type": "FMSR", "text": "What sensors can be used to detect or monitor the following failure modes in a steam turbine: vibration, overheating, and low oil pressure?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting vibration, overheating, and low oil pressure in a steam turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 53, "type": "FMSR", "text": "What are the relevant sensors for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine?", "category": "Recommendation", "characteristic_form": "The answer should contain a list of one or more sensors relevant for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Oil Level Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 54, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and high pressure turbine blade failure in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion instability and high pressure turbine blade failure in an aero gas turbine. Example sensors: [Exhaust Gas Temperature, Compressor Discharge Pressure, Fuel Flow]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 55, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and fuel system malfunction in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion instability and fuel system malfunction in an aero gas turbine. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 56, "type": "FMSR", "text": "What are the most relevant sensors for detecting combustion issues, such as flame instability or fuel starvation, in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion issues like flame instability or fuel starvation in an industrial gas turbine. Example sensors: [Exhaust Temperature Sensor, Flame Detector, Fuel Flow Meter]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 57, "type": "FMSR", "text": "What are the relevant sensors for detecting combustion issues, bearing failures, and compressor fouling in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting combustion issues, bearing failures, and compressor fouling in an industrial gas turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 58, "type": "FMSR", "text": "What are the relevant sensors for detecting cavitation, bearing failure, and seal leakage in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, bearing failure, and seal leakage in a pump. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 59, "type": "FMSR", "text": "What are the relevant sensors for detecting cavitation, impeller damage, and bearing failure in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, impeller damage, and bearing failure in a pump. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 60, "type": "FMSR", "text": "What are the relevant sensors for detecting failure modes related to mechanical issues or performance degradation in a compressor?", "category": "Recommendation", "characteristic_form": "The answer should list one or more sensors relevant for detecting mechanical issues or performance degradation in a compressor. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 61, "type": "FMSR", "text": "What are the sensors that can be used to detect failure modes related to mechanical issues or performance degradation in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting mechanical issues or performance degradation in a compressor. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 62, "type": "FMSR", "text": "What sensors can be used to detect abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Pressure Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 63, "type": "FMSR", "text": "What sensors can be used to detect abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Pressure Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 64, "type": "FMSR", "text": "What sensors can be used to identify potential issues with an electric generator, including overheating, vibration, and output voltage irregularities?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting issues like overheating, vibration, and output voltage irregularities in an electric generator. Example sensors: [Temperature Sensor, Vibration Sensor, Voltage Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 65, "type": "FMSR", "text": "What sensors can be used to identify potential issues with an electric generator, including overheating, vibration, and output voltage irregularities?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting issues like overheating, vibration, and output voltage irregularities in an electric generator. Example sensors: [Temperature Sensor, Vibration Sensor, Voltage Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 66, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Noise Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 67, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 68, "type": "FMSR", "text": "What sensors can be used to detect winding deformation and insulation degradation in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation and insulation degradation in a power transformer. Example sensors: [Dissolved Gas Analysis (DGA), Frequency Response Analysis (FRA), Partial Discharge (PD) monitoring]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 69, "type": "FMSR", "text": "What sensors can be used to detect winding deformation and oil leakage in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation and oil leakage in a power transformer. Example sensors: [Dissolved Gas Analyzer, Oil Level Sensor, Frequency Response Analyzer]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 70, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, or imbalance in an electric motor?", "category": "Recommendation", "characteristic_form": "The answer should list one or more sensors relevant for detecting bearing wear, misalignment, or imbalance in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 71, "type": "FMSR", "text": "What are the most relevant sensors for detecting bearing wear, misalignment, or imbalance in an electric motor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, misalignment, or imbalance in an electric motor. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric motor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 72, "type": "FMSR", "text": "What are the relevant sensors for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine?", "category": "Recommendation", "characteristic_form": "The answer should contain a list of one or more sensors relevant for detecting vibration, temperature anomalies, and lubrication issues in a steam turbine. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Oil Level Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 73, "type": "FMSR", "text": "What are the relevant sensors for detecting multiple failure modes, including vibration issues and lubrication problems, in a steam turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting vibration issues and lubrication problems in a steam turbine. Example sensors: [Vibration Sensor, Oil Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "steam turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 74, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and fuel system malfunction in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion instability and fuel system malfunction in an aero gas turbine. Example sensors: [Exhaust Gas Temperature, Fuel Flow Rate, Compressor Discharge Pressure]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 75, "type": "FMSR", "text": "What are the sensors that can be used to detect combustion instability and fuel system malfunction in an aero gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting combustion instability and fuel system malfunction in an aero gas turbine. Example sensors: [Exhaust Gas Temperature, Fuel Flow Rate, Compressor Discharge Pressure]", "deterministic": false, "note": null, "entity": "aero gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 76, "type": "FMSR", "text": "What are the most relevant sensors for detecting combustion issues, such as flame instability or fuel starvation, in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting combustion issues like flame instability or fuel starvation in an industrial gas turbine. Example sensors: [Exhaust Temperature Sensor, Combustion Chamber Pressure Sensor, Fuel Flow Meter]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 77, "type": "FMSR", "text": "What are the relevant sensors for detecting combustion issues, turbine blade damage, or compressor fouling in an industrial gas turbine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting combustion issues, turbine blade damage, or compressor fouling in an industrial gas turbine. Example sensors: [Exhaust Temperature Sensor, Vibration Sensor, Compressor Inlet Temperature Sensor]", "deterministic": false, "note": null, "entity": "industrial gas turbine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 78, "type": "FMSR", "text": "What are the sensors that can be used to detect cavitation, bearing failure, or seal leakage in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, bearing failure, or seal leakage in a pump. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Flow Rate Sensor, Acoustic Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 79, "type": "FMSR", "text": "What are the relevant sensors for detecting cavitation, impeller damage, and bearing failure in a pump?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting cavitation, impeller damage, and bearing failure in a pump. Example sensors: [Vibration Sensor, Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "pump", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 80, "type": "FMSR", "text": "What are the sensors that can be used to detect bearing failure, excessive vibration, or low lubrication in a compressor?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing failure, excessive vibration, or low lubrication in a compressor. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Level Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 81, "type": "FMSR", "text": "What sensors can be used to detect or monitor the following failure modes in a compressor: bearing failure, seal leakage, and excessive vibration?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting bearing failure, seal leakage, and excessive vibration in a compressor. Example sensors: [Vibration Sensor, Temperature Sensor, Pressure Sensor, Acoustic Sensor]", "deterministic": false, "note": null, "entity": "compressor", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 82, "type": "FMSR", "text": "What sensors can be used to detect abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting abnormal wear, overheating, or low lubrication in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Temperature Sensor, Oil Pressure Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 83, "type": "FMSR", "text": "What sensors can be used to identify abnormal wear or damage in a reciprocating internal combustion engine?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting abnormal wear or damage in a reciprocating internal combustion engine. Example sensors: [Vibration Sensor, Oil Pressure Sensor, Temperature Sensor]", "deterministic": false, "note": null, "entity": "reciprocating internal combustion engine", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 84, "type": "FMSR", "text": "What sensors can be used to detect or monitor the following failure modes in an electric generator: overheating, vibration, and electrical insulation breakdown?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting overheating, vibration, and electrical insulation breakdown in an electric generator. Example sensors: [Temperature Sensor, Vibration Sensor, Partial Discharge Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 85, "type": "FMSR", "text": "What sensors can be used to identify potential mechanical or electrical failures in an electric generator?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors relevant for detecting mechanical or electrical failures in an electric generator. Example sensors: [Vibration Sensor, Temperature Sensor, Current Sensor]", "deterministic": false, "note": null, "entity": "electric generator", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 86, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Noise Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_positive", "group": "prescriptive"} +{"id": 87, "type": "FMSR", "text": "What sensors can be used to detect bearing wear, imbalance, or misalignment in a fan?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting bearing wear, imbalance, or misalignment in a fan. Example sensors: [Vibration Sensor, Temperature Sensor, Noise Sensor]", "deterministic": false, "note": null, "entity": "fan", "question_type": "mcp1_negative", "group": "prescriptive"} +{"id": 88, "type": "FMSR", "text": "What sensors can be used to detect winding deformation and insulation degradation in a power transformer?", "category": "Recommendation", "characteristic_form": "the answer should contain one or more sensors. The sensors must be relevant for detecting winding deformation and insulation degradation in a power transformer. Example sensors: [Dissolved Gas Analysis (DGA), Frequency Response Analysis (FRA), Partial Discharge (PD) monitoring]", "deterministic": false, "note": null, "entity": "power transformer", "question_type": "mcp1_positive", "group": "prescriptive"} diff --git a/src/scenarios/huggingface/task/rule_monitoring_scenarios.jsonl b/src/scenarios/huggingface/task/rule_monitoring_scenarios.jsonl new file mode 100644 index 000000000..bf4d4712d --- /dev/null +++ b/src/scenarios/huggingface/task/rule_monitoring_scenarios.jsonl @@ -0,0 +1,120 @@ +{"id": 1000, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU HUR00118 between 2021-04-11T23:00:00.000Z and 2021-04-12T05:15:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is open at 5% or more, and either the heating valve or preheat valve is also open at 5% or more. At the same time, if reported, neither the heating nor cooling drained flags are active. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-04-11T23:00:00.000Z and 2021-04-12T05:15:00.000Z"} +{"id": 1001, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1156 between 2019-03-19T18:30:00.000Z and 2019-03-19T23:15:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is open at 5% or more, and either the heating valve or preheat valve is also open at 5% or more. At the same time, if reported, neither the heating nor cooling drained flags are active. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-19T18:30:00.000Z and 2019-03-19T23:15:00.000Z"} +{"id": 1002, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU Y15150AC between 2019-02-16T17:00:00.000Z and 2019-02-16T20:00:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is open at 5% or more, and either the heating valve or preheat valve is also open at 5% or more. At the same time, if reported, neither the heating nor cooling drained flags are active. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-16T17:00:00.000Z and 2019-02-16T20:00:00.000Z"} +{"id": 1003, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5044 between 2020-02-13T10:15:00.000Z and 2020-02-13T12:30:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The subtype is not VAV. (3) The outdoor air temperature minus the supply air temperature setpoint is greater than 5°F; or, if the supply air temperature setpoint is not reporting, the outdoor air temperature minus the supply air temperature is greater than 5°F. (4) Either the heating valve percentage is greater than 10 percent or the preheat valve percentage is greater than 10 percent. (5) The heating drained flag is equal to 1 if reporting. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-13T10:15:00.000Z and 2020-02-13T12:30:00.000Z"} +{"id": 1004, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU D15150BH between 2020-06-27T11:00:00.000Z and 2020-06-28T08:15:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The subtype is not VAV. (3) The outdoor air temperature minus the supply air temperature setpoint is greater than 5°F; or, if the supply air temperature setpoint is not reporting, the outdoor air temperature minus the supply air temperature is greater than 5°F. (4) Either the heating valve percentage is greater than 10 percent or the preheat valve percentage is greater than 10 percent. (5) The heating drained flag is equal to 1 if reporting. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-27T11:00:00.000Z and 2020-06-28T08:15:00.000Z"} +{"id": 1005, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004507 between 2020-02-03T16:00:00.000Z and 2020-02-03T22:59:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The subtype is not VAV. (3) The outdoor air temperature minus the supply air temperature setpoint is greater than 5°F; or, if the supply air temperature setpoint is not reporting, the outdoor air temperature minus the supply air temperature is greater than 5°F. (4) Either the heating valve percentage is greater than 10 percent or the preheat valve percentage is greater than 10 percent. (5) The heating drained flag is equal to 1 if reporting. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-03T16:00:00.000Z and 2020-02-03T22:59:00.000Z"} +{"id": 1006, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU NCAF028 between 2020-10-08T21:00:00.000Z and 2020-10-09T02:02:00.000Z according to: An anomaly is detected when the AHU is running, and either the filter differential pressure exceeds the supply filter static pressure setpoint, or the difference between post- and pre-filter bank pressures exceeds the setpoint (or 1.0 if the setpoint isn't available). At the same time, the supply fan output is above 50%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-10-08T21:00:00.000Z and 2020-10-09T02:02:00.000Z"} +{"id": 1007, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU NCAF028 between 2020-09-10T19:45:00.000Z and 2020-09-10T23:23:00.000Z according to: An anomaly is detected when the AHU is running, and either the filter differential pressure exceeds the supply filter static pressure setpoint, or the difference between post- and pre-filter bank pressures exceeds the setpoint (or 1.0 if the setpoint isn't available). At the same time, the supply fan output is above 50%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-09-10T19:45:00.000Z and 2020-09-10T23:23:00.000Z"} +{"id": 1008, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004511 between 2021-05-17T05:00:00.000Z and 2021-05-17T09:57:00.000Z according to: If the AHU (not of type MULTI) is off and the delta betweend the supply air temperature and the mixed air temperature is more than 20F while the outside temperature is greater than 35 degrees, all for more than 3hours than raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-05-17T05:00:00.000Z and 2021-05-17T09:57:00.000Z"} +{"id": 1009, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004507 between 2020-01-12T10:45:00.000Z and 2020-01-12T15:00:00.000Z according to: If the AHU (not of type MULTI) is off and the delta betweend the supply air temperature and the mixed air temperature is more than 20F while the outside temperature is greater than 35 degrees, all for more than 3hours than raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-01-12T10:45:00.000Z and 2020-01-12T15:00:00.000Z"} +{"id": 1010, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004511 between 2022-05-28T20:30:00.000Z and 2022-05-29T00:45:00.000Z according to: If the AHU (not of type MULTI) is off and the delta betweend the supply air temperature and the mixed air temperature is more than 20F while the outside temperature is greater than 35 degrees, all for more than 3hours than raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-28T20:30:00.000Z and 2022-05-29T00:45:00.000Z"} +{"id": 1011, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A038 between 2020-07-30T15:00:00.000Z and 2020-07-31T00:00:00.000Z according to: The condition has 8 parts. (1) The AHU is running. (2) The subtype is not OAU or FCU. (3) The economizer mode is equal to 0 if economizer mode is reporting. (4) The outdoor air temperature is greater than the return air temperature. (5) The return air CO2 is less than 1000 if return air CO2 is reporting. (6) The outside air damper percentage is greater than the outside air damper minimum percentage plus 2 percent; or, if the outside air damper minimum percentage is not reporting, the outside air damper percentage is greater than 15 percent. (7) The enthalpy is greater than the return enthalpy if reporting. (8) The rule is triggered when all eight parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-30T15:00:00.000Z and 2020-07-31T00:00:00.000Z"} +{"id": 1012, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU ILCACS3B between 2021-10-03T16:15:00.000Z and 2021-10-04T02:30:00.000Z according to: The condition has 8 parts. (1) The AHU is running. (2) The subtype is not OAU or FCU. (3) The economizer mode is equal to 0 if economizer mode is reporting. (4) The outdoor air temperature is greater than the return air temperature. (5) The return air CO2 is less than 1000 if return air CO2 is reporting. (6) The outside air damper percentage is greater than the outside air damper minimum percentage plus 2 percent; or, if the outside air damper minimum percentage is not reporting, the outside air damper percentage is greater than 15 percent. (7) The enthalpy is greater than the return enthalpy if reporting. (8) The rule is triggered when all eight parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-10-03T16:15:00.000Z and 2021-10-04T02:30:00.000Z"} +{"id": 1013, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A059 between 2020-07-30T16:30:00.000Z and 2020-07-31T00:15:00.000Z according to: The condition has 8 parts. (1) The AHU is running. (2) The subtype is not OAU or FCU. (3) The economizer mode is equal to 0 if economizer mode is reporting. (4) The outdoor air temperature is greater than the return air temperature. (5) The return air CO2 is less than 1000 if return air CO2 is reporting. (6) The outside air damper percentage is greater than the outside air damper minimum percentage plus 2 percent; or, if the outside air damper minimum percentage is not reporting, the outside air damper percentage is greater than 15 percent. (7) The enthalpy is greater than the return enthalpy if reporting. (8) The rule is triggered when all eight parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-30T16:30:00.000Z and 2020-07-31T00:15:00.000Z"} +{"id": 1014, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153CA between 2020-01-10T16:45:00.000Z and 2020-01-11T03:03:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The outdoor air temperature is between 10°F and the setpoint temperature; or, if the setpoint temperature is not reporting, it is between 10°F and the supply air temperature. (3) One of several heating valve combinations apply: heating, preheat, and reheat valve percentages are all less than 5%; or heating and preheat valve percentages are less than 5% and reheat valve is not reporting; or heating and reheat valve percentages are less than 5% and preheat valve is not reporting; or heating valve is less than 5% and preheat and reheat valves are not reporting; or preheat and reheat valves are less than 5% and heating valve is not reporting; or preheat valve is less than 5% and heating and reheat valves are not reporting; or reheat valve is less than 5% and heating and preheat valves are not reporting; or all heating, preheat, and reheat valves are not reporting. (4) The cooling valve percentage is less than 2%. (5) The mixed air temperature is greater than the supply air temperature by more than 7°F. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-01-10T16:45:00.000Z and 2020-01-11T03:03:00.000Z"} +{"id": 1015, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215150CE between 2020-04-29T00:45:00.000Z and 2020-04-29T11:00:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The outdoor air temperature is between 10°F and the setpoint temperature; or, if the setpoint temperature is not reporting, it is between 10°F and the supply air temperature. (3) One of several heating valve combinations apply: heating, preheat, and reheat valve percentages are all less than 5%; or heating and preheat valve percentages are less than 5% and reheat valve is not reporting; or heating and reheat valve percentages are less than 5% and preheat valve is not reporting; or heating valve is less than 5% and preheat and reheat valves are not reporting; or preheat and reheat valves are less than 5% and heating valve is not reporting; or preheat valve is less than 5% and heating and reheat valves are not reporting; or reheat valve is less than 5% and heating and preheat valves are not reporting; or all heating, preheat, and reheat valves are not reporting. (4) The cooling valve percentage is less than 2%. (5) The mixed air temperature is greater than the supply air temperature by more than 7°F. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-04-29T00:45:00.000Z and 2020-04-29T11:00:00.000Z"} +{"id": 1016, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 615153EA between 2020-02-11T11:45:00.000Z and 2020-02-11T23:33:00.000Z according to: The condition has 6 parts. (1) The AHU is running. (2) The outdoor air temperature is between 10°F and the setpoint temperature; or, if the setpoint temperature is not reporting, it is between 10°F and the supply air temperature. (3) One of several heating valve combinations apply: heating, preheat, and reheat valve percentages are all less than 5%; or heating and preheat valve percentages are less than 5% and reheat valve is not reporting; or heating and reheat valve percentages are less than 5% and preheat valve is not reporting; or heating valve is less than 5% and preheat and reheat valves are not reporting; or preheat and reheat valves are less than 5% and heating valve is not reporting; or preheat valve is less than 5% and heating and reheat valves are not reporting; or reheat valve is less than 5% and heating and preheat valves are not reporting; or all heating, preheat, and reheat valves are not reporting. (4) The cooling valve percentage is less than 2%. (5) The mixed air temperature is greater than the supply air temperature by more than 7°F. (6) The rule is triggered when all six parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-11T11:45:00.000Z and 2020-02-11T23:33:00.000Z"} +{"id": 1017, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004508 between 2019-02-25T16:00:00.000Z and 2019-02-25T18:15:00.000Z according to: If the AHU is running with the heating valve more than 5% open and cooling valve fully closed and the temperature delta between the mixed air and supply air is greater than 5 and this coditions persist for more than 2 hours then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-25T16:00:00.000Z and 2019-02-25T18:15:00.000Z"} +{"id": 1018, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004501 between 2021-12-08T13:00:00.000Z and 2021-12-08T16:45:00.000Z according to: If the AHU is running with the heating valve more than 5% open and cooling valve fully closed and the temperature delta between the mixed air and supply air is greater than 5 and this coditions persist for more than 2 hours then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-12-08T13:00:00.000Z and 2021-12-08T16:45:00.000Z"} +{"id": 1019, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004501 between 2022-04-27T12:00:00.000Z and 2022-04-27T14:30:00.000Z according to: If the AHU is running with the heating valve more than 5% open and cooling valve fully closed and the temperature delta between the mixed air and supply air is greater than 5 and this coditions persist for more than 2 hours then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-04-27T12:00:00.000Z and 2022-04-27T14:30:00.000Z"} +{"id": 1020, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1992 between 2019-02-14T14:15:00.000Z and 2019-02-16T13:45:00.000Z according to: An event is classified as anomlaous if the AHU is not an OAU and it is running, the outside air damper % is greater than the minimum damper % (if there's no minimum damper % available, assume the minimum is 15%) but less than 100% and the preheat valave is more than 5% open. If all the conditions persist from ore than 2 hourse it's an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-14T14:15:00.000Z and 2019-02-16T13:45:00.000Z"} +{"id": 1021, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1991 between 2019-01-09T10:30:00.000Z and 2019-01-09T16:13:00.000Z according to: An event is classified as anomlaous if the AHU is not an OAU and it is running, the outside air damper % is greater than the minimum damper % (if there's no minimum damper % available, assume the minimum is 15%) but less than 100% and the preheat valave is more than 5% open. If all the conditions persist from ore than 2 hourse it's an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-09T10:30:00.000Z and 2019-01-09T16:13:00.000Z"} +{"id": 1022, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5078 between 2020-12-28T15:45:00.000Z and 2020-12-28T18:45:00.000Z according to: An event is classified as anomlaous if the AHU is not an OAU and it is running, the outside air damper % is greater than the minimum damper % (if there's no minimum damper % available, assume the minimum is 15%) but less than 100% and the preheat valave is more than 5% open. If all the conditions persist from ore than 2 hourse it's an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-28T15:45:00.000Z and 2020-12-28T18:45:00.000Z"} +{"id": 1023, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU CHQACS3 between 2021-08-10T10:30:00.000Z and 2021-08-10T23:10:00.000Z according to: An anomaly is detected when the AHU is running, is not an OAU or FCU subtype, and the air enthalpy exceeds 29BTU/lb. At the same time, the system appears to be in economizer mode—either explicitly (economizer mode = 1), inferred from the outside air damper position being above its minimum, or if the damper is open more than 15% with no minimum or economizer mode data available. Additionally, return air CO₂ data is not being reported. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-08-10T10:30:00.000Z and 2021-08-10T23:10:00.000Z"} +{"id": 1024, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU BAU00015 between 2019-01-14T20:00:00.000Z and 2019-01-15T07:59:00.000Z according to: An anomaly is detected when the AHU is running, is not an OAU or FCU subtype, and the air enthalpy exceeds 29BTU/lb. At the same time, the system appears to be in economizer mode—either explicitly (economizer mode = 1), inferred from the outside air damper position being above its minimum, or if the damper is open more than 15% with no minimum or economizer mode data available. Additionally, return air CO₂ data is not being reported. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-14T20:00:00.000Z and 2019-01-15T07:59:00.000Z"} +{"id": 1025, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU BAU00016 between 2019-02-14T21:30:00.000Z and 2019-02-15T07:15:00.000Z according to: An anomaly is detected when the AHU is running, is not an OAU or FCU subtype, and the air enthalpy exceeds 29BTU/lb. At the same time, the system appears to be in economizer mode—either explicitly (economizer mode = 1), inferred from the outside air damper position being above its minimum, or if the damper is open more than 15% with no minimum or economizer mode data available. Additionally, return air CO₂ data is not being reported. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-14T21:30:00.000Z and 2019-02-15T07:15:00.000Z"} +{"id": 1026, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004510 between 2022-03-02T12:00:00.000Z and 2022-03-02T15:15:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is reporting, the heating valve is fully closed (0%), and the supply air temperature is more than 5°F higher than the mixed air temperature. These conditions must persist continuously for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-03-02T12:00:00.000Z and 2022-03-02T15:15:00.000Z"} +{"id": 1027, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004506B between 2022-01-26T19:15:00.000Z and 2022-01-26T21:51:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is reporting, the heating valve is fully closed (0%), and the supply air temperature is more than 5°F higher than the mixed air temperature. These conditions must persist continuously for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-01-26T19:15:00.000Z and 2022-01-26T21:51:00.000Z"} +{"id": 1028, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004510 between 2022-03-09T06:47:00.000Z and 2022-03-09T17:29:00.000Z according to: An anomaly is detected when the AHU is running, the cooling valve is reporting, the heating valve is fully closed (0%), and the supply air temperature is more than 5°F higher than the mixed air temperature. These conditions must persist continuously for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-03-09T06:47:00.000Z and 2022-03-09T17:29:00.000Z"} +{"id": 1029, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 315150BG between 2020-08-01T11:15:00.000Z and 2020-08-04T18:45:00.000Z according to: If the AHU is running for more than one hour while the enthalpy is greater than 29 and the humidification valve is more than 2%, this is anomalous.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-08-01T11:15:00.000Z and 2020-08-04T18:45:00.000Z"} +{"id": 1030, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 0104200000 between 2020-07-23T12:00:00.000Z and 2020-07-23T16:52:00.000Z according to: If the AHU is running for more than one hour while the enthalpy is greater than 29 and the humidification valve is more than 2%, this is anomalous.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-23T12:00:00.000Z and 2020-07-23T16:52:00.000Z"} +{"id": 1031, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 315150BG between 2020-08-17T19:30:00.000Z and 2020-08-18T08:30:00.000Z according to: If the AHU is running for more than one hour while the enthalpy is greater than 29 and the humidification valve is more than 2%, this is anomalous.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-08-17T19:30:00.000Z and 2020-08-18T08:30:00.000Z"} +{"id": 1032, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 2021010AHUF49 between 2022-05-22T14:00:00.000Z and 2022-05-25T20:15:00.000Z according to: In normal operation, while the AHU is running the humidification valve should be more than 5%, and the enthalpy should be more than 35 kJ/kg. If these conditions are not met for two hours or more, then raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-22T14:00:00.000Z and 2022-05-25T20:15:00.000Z"} +{"id": 1033, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 2021010AHUF49 between 2022-05-29T04:00:00.000Z and 2022-05-29T12:30:00.000Z according to: In normal operation, while the AHU is running the humidification valve should be more than 5%, and the enthalpy should be more than 35 kJ/kg. If these conditions are not met for two hours or more, then raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-29T04:00:00.000Z and 2022-05-29T12:30:00.000Z"} +{"id": 1034, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 2021010AHUF49 between 2020-10-21T17:15:00.000Z and 2020-10-21T19:51:00.000Z according to: In normal operation, while the AHU is running the humidification valve should be more than 5%, and the enthalpy should be more than 35 kJ/kg. If these conditions are not met for two hours or more, then raise an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-10-21T17:15:00.000Z and 2020-10-21T19:51:00.000Z"} +{"id": 1035, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 615153AI between 2019-04-15T23:30:00.000Z and 2019-04-16T04:00:00.000Z according to: The condition has 3 parts. (1) The AHU is running. (2) The Enthalpy is less than 15 BTUs per pound. (3) The difference between the Zone Relative Humidity % and the Supply Relative Humidity Setpoint % is more than 10%; or the difference between supply relative humidity % and the supply relative humidity setpoint percent is more than 10%. The rule is triggered when all 3 parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-04-15T23:30:00.000Z and 2019-04-16T04:00:00.000Z"} +{"id": 1036, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 615153EB between 2021-03-04T01:45:00.000Z and 2021-03-04T07:25:00.000Z according to: The condition has 3 parts. (1) The AHU is running. (2) The Enthalpy is less than 15 BTUs per pound. (3) The difference between the Zone Relative Humidity % and the Supply Relative Humidity Setpoint % is more than 10%; or the difference between supply relative humidity % and the supply relative humidity setpoint percent is more than 10%. The rule is triggered when all 3 parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-03-04T01:45:00.000Z and 2021-03-04T07:25:00.000Z"} +{"id": 1037, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215150CE between 2020-04-18T23:00:00.000Z and 2020-04-19T13:30:00.000Z according to: The condition has 3 parts. (1) The AHU is running. (2) The Enthalpy is less than 15 BTUs per pound. (3) The difference between the Zone Relative Humidity % and the Supply Relative Humidity Setpoint % is more than 10%; or the difference between supply relative humidity % and the supply relative humidity setpoint percent is more than 10%. The rule is triggered when all 3 parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-04-18T23:00:00.000Z and 2020-04-19T13:30:00.000Z"} +{"id": 1038, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153AS between 2020-02-13T12:15:00.000Z and 2020-02-13T22:15:00.000Z according to: An anomaly is detected when the AHU is running, the difference between the static pressure setpoint and actual static pressure exceeds 0.2 in H₂O, the static pressure setpoint is above zero, and the supply fan output is below 95%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-13T12:15:00.000Z and 2020-02-13T22:15:00.000Z"} +{"id": 1039, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153AS between 2020-03-06T12:15:00.000Z and 2020-03-06T22:15:00.000Z according to: An anomaly is detected when the AHU is running, the difference between the static pressure setpoint and actual static pressure exceeds 0.2 in H₂O, the static pressure setpoint is above zero, and the supply fan output is below 95%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-06T12:15:00.000Z and 2020-03-06T22:15:00.000Z"} +{"id": 1040, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 343101 between 2020-08-23T16:30:00.000Z and 2020-08-24T07:00:00.000Z according to: An anomaly is detected when the AHU is running, the difference between the static pressure setpoint and actual static pressure exceeds 0.2 in H₂O, the static pressure setpoint is above zero, and the supply fan output is below 95%. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-08-23T16:30:00.000Z and 2020-08-24T07:00:00.000Z"} +{"id": 1041, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004512 between 2019-02-22T13:30:00.000Z and 2019-02-23T01:16:00.000Z according to: The condition for the rule has eight parts. (1) The AHU is Running. (2) The SubType is not FCU or OAU. (3) The OAT is greater than 25 degrees F. (4) If the Heating Drained Flag is reporting and equal to 0. (5) The return Air Temperature is greater than the Setpoint Temperature; or if Setpoint Temperature is not Reporting, Return Air Temperature is greater than Supply Air Temperature. (6) The difference between the Outside Air Damper % and the Outside Air Damper Minimum % is greater than 10%; or if Outside Air Damper Minimum % is not reporting, Outside Air Dampter % greater than 10%. (7) The heating valve % is greater than 5% or the Preheat Valve % is greater than 5%. (8) CO2 is reporting and less than 1000 ppm. The rule is triggred when all eight parts of the condition are met for two hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-22T13:30:00.000Z and 2019-02-23T01:16:00.000Z"} +{"id": 1042, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU004512 between 2019-01-14T06:00:00.000Z and 2019-01-15T01:17:00.000Z according to: The condition for the rule has eight parts. (1) The AHU is Running. (2) The SubType is not FCU or OAU. (3) The OAT is greater than 25 degrees F. (4) If the Heating Drained Flag is reporting and equal to 0. (5) The return Air Temperature is greater than the Setpoint Temperature; or if Setpoint Temperature is not Reporting, Return Air Temperature is greater than Supply Air Temperature. (6) The difference between the Outside Air Damper % and the Outside Air Damper Minimum % is greater than 10%; or if Outside Air Damper Minimum % is not reporting, Outside Air Dampter % greater than 10%. (7) The heating valve % is greater than 5% or the Preheat Valve % is greater than 5%. (8) CO2 is reporting and less than 1000 ppm. The rule is triggred when all eight parts of the condition are met for two hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-14T06:00:00.000Z and 2019-01-15T01:17:00.000Z"} +{"id": 1043, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A068 between 2019-03-02T16:30:00.000Z and 2019-03-02T18:45:00.000Z according to: The condition for the rule has eight parts. (1) The AHU is Running. (2) The SubType is not FCU or OAU. (3) The OAT is greater than 25 degrees F. (4) If the Heating Drained Flag is reporting and equal to 0. (5) The return Air Temperature is greater than the Setpoint Temperature; or if Setpoint Temperature is not Reporting, Return Air Temperature is greater than Supply Air Temperature. (6) The difference between the Outside Air Damper % and the Outside Air Damper Minimum % is greater than 10%; or if Outside Air Damper Minimum % is not reporting, Outside Air Dampter % greater than 10%. (7) The heating valve % is greater than 5% or the Preheat Valve % is greater than 5%. (8) CO2 is reporting and less than 1000 ppm. The rule is triggred when all eight parts of the condition are met for two hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-02T16:30:00.000Z and 2019-03-02T18:45:00.000Z"} +{"id": 1044, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215150CH between 2020-02-19T22:02:00.000Z and 2020-02-20T11:46:00.000Z according to: The behaviour of non MULTI or non VAV type asset is anomalous if the supply fan is off and the static pressure in the duct is greater than .2 H2O for more than 3 hours straight.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-19T22:02:00.000Z and 2020-02-20T11:46:00.000Z"} +{"id": 1045, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 215153CE between 2019-01-27T05:00:00.000Z and 2019-01-28T14:40:00.000Z according to: The behaviour of non MULTI or non VAV type asset is anomalous if the supply fan is off and the static pressure in the duct is greater than .2 H2O for more than 3 hours straight.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-27T05:00:00.000Z and 2019-01-28T14:40:00.000Z"} +{"id": 1046, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU B010510000511 between 2022-08-30T15:45:00.000Z and 2022-08-31T04:15:00.000Z according to: The behaviour of non MULTI or non VAV type asset is anomalous if the supply fan is off and the static pressure in the duct is greater than .2 H2O for more than 3 hours straight.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-08-30T15:45:00.000Z and 2022-08-31T04:15:00.000Z"} +{"id": 1047, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU AHU090301 between 2019-03-01T11:58:00.000Z and 2019-03-01T22:43:00.000Z according to: An anomaly is detected when the supply fan is on, the system is not a MULTI or VAV subtype, and the duct static pressure is extremely low (below 0.01inH2O). If airflow data is available, the airflow is also low (less than 100CFM). These conditions must persist for at least 3 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-01T11:58:00.000Z and 2019-03-01T22:43:00.000Z"} +{"id": 1048, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 401A195 between 2021-02-11T11:00:00.000Z and 2021-02-12T00:00:00.000Z according to: An anomaly is detected when the supply fan is on, the system is not a MULTI or VAV subtype, and the duct static pressure is extremely low (below 0.01inH2O). If airflow data is available, the airflow is also low (less than 100CFM). These conditions must persist for at least 3 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-02-11T11:00:00.000Z and 2021-02-12T00:00:00.000Z"} +{"id": 1049, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 415153AS between 2020-04-03T21:15:00.000Z and 2020-04-04T16:00:00.000Z according to: An anomaly is detected when the supply fan is on, the system is not a MULTI or VAV subtype, and the duct static pressure is extremely low (below 0.01inH2O). If airflow data is available, the airflow is also low (less than 100CFM). These conditions must persist for at least 3 hours.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-04-03T21:15:00.000Z and 2020-04-04T16:00:00.000Z"} +{"id": 1050, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5024 between 2020-03-06T14:15:00.000Z and 2020-03-06T20:30:00.000Z according to: An alert should be raised for non-VAV units if for more than 3 hours, they supply fan is on but the current is less than 1 amp", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-06T14:15:00.000Z and 2020-03-06T20:30:00.000Z"} +{"id": 1051, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5041 between 2020-12-11T15:00:00.000Z and 2020-12-12T00:16:00.000Z according to: An alert should be raised for non-VAV units if for more than 3 hours, they supply fan is on but the current is less than 1 amp", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-11T15:00:00.000Z and 2020-12-12T00:16:00.000Z"} +{"id": 1052, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 5008 between 2021-02-17T05:00:00.000Z and 2021-02-17T23:55:00.000Z according to: An alert should be raised for non-VAV units if for more than 3 hours, they supply fan is on but the current is less than 1 amp", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-02-17T05:00:00.000Z and 2021-02-17T23:55:00.000Z"} +{"id": 1053, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1992 between 2019-02-21T17:00:00.000Z and 2019-02-23T05:00:00.000Z according to: if for more than 2 hours the AHU is functioning in economizer mode with a preheat valve more than 5% open and the outside air damper is greater than either 15% or the outside air damper min % if available, then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-21T17:00:00.000Z and 2019-02-23T05:00:00.000Z"} +{"id": 1054, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1991 between 2019-03-26T09:15:00.000Z and 2019-03-26T14:15:00.000Z according to: if for more than 2 hours the AHU is functioning in economizer mode with a preheat valve more than 5% open and the outside air damper is greater than either 15% or the outside air damper min % if available, then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-26T09:15:00.000Z and 2019-03-26T14:15:00.000Z"} +{"id": 1055, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset AHU 1992 between 2019-03-19T15:30:00.000Z and 2019-03-20T03:29:00.000Z according to: if for more than 2 hours the AHU is functioning in economizer mode with a preheat valve more than 5% open and the outside air damper is greater than either 15% or the outside air damper min % if available, then we have an anomaly.", "group": "retrospective", "entity": "AHU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-19T15:30:00.000Z and 2019-03-20T03:29:00.000Z"} +{"id": 1056, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2019-02-20T14:17:00.000Z and 2019-02-21T04:59:00.000Z according to: An anomaly is detected when the boiler is running and the flue gas oxygen percentage is higher than expected, based on the type of fuel being used. Specifically, the flue gas oxygen is: >3% when natural gas flow is above 5, >5% when fuel oil or propane flow is above 5, or simply >3% if no fuel flow data is available. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-20T14:17:00.000Z and 2019-02-21T04:59:00.000Z"} +{"id": 1057, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2019-01-29T21:15:00.000Z and 2019-01-30T10:45:00.000Z according to: An anomaly is detected when the boiler is running and the flue gas oxygen percentage is higher than expected, based on the type of fuel being used. Specifically, the flue gas oxygen is: >3% when natural gas flow is above 5, >5% when fuel oil or propane flow is above 5, or simply >3% if no fuel flow data is available. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-29T21:15:00.000Z and 2019-01-30T10:45:00.000Z"} +{"id": 1058, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02606 between 2019-01-14T16:15:00.000Z and 2019-01-15T12:30:00.000Z according to: An anomaly is detected when the boiler is running and the flue gas oxygen percentage is higher than expected, based on the type of fuel being used. Specifically, the flue gas oxygen is: >3% when natural gas flow is above 5, >5% when fuel oil or propane flow is above 5, or simply >3% if no fuel flow data is available. These conditions must persist for at least 2 hours.", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-14T16:15:00.000Z and 2019-01-15T12:30:00.000Z"} +{"id": 1059, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler OHOBOILER1 between 2020-05-06T21:45:00.000Z and 2020-05-07T01:00:00.000Z according to: If, for more than two hours, the boiler is running but the absolute difference between supply and return temperatures is less than 5F", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-06T21:45:00.000Z and 2020-05-07T01:00:00.000Z"} +{"id": 1060, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler OHOBOILER1 between 2020-05-08T04:30:00.000Z and 2020-05-08T06:45:00.000Z according to: If, for more than two hours, the boiler is running but the absolute difference between supply and return temperatures is less than 5F", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-08T04:30:00.000Z and 2020-05-08T06:45:00.000Z"} +{"id": 1061, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler OHOBOILER1 between 2020-05-08T00:45:00.000Z and 2020-05-08T03:30:00.000Z according to: If, for more than two hours, the boiler is running but the absolute difference between supply and return temperatures is less than 5F", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-08T00:45:00.000Z and 2020-05-08T03:30:00.000Z"} +{"id": 1062, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2021-03-20T05:15:00.000Z and 2021-03-20T10:00:00.000Z according to: In case the boiler is running but measuring a conductivity of 0.003 for more than 4 hours, alert the system", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-03-20T05:15:00.000Z and 2021-03-20T10:00:00.000Z"} +{"id": 1063, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2020-01-16T23:15:00.000Z and 2020-01-17T15:29:00.000Z according to: In case the boiler is running but measuring a conductivity of 0.003 for more than 4 hours, alert the system", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-01-16T23:15:00.000Z and 2020-01-17T15:29:00.000Z"} +{"id": 1064, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Boiler BR02607 between 2020-11-10T13:44:00.000Z and 2020-11-10T20:20:00.000Z according to: In case the boiler is running but measuring a conductivity of 0.003 for more than 4 hours, alert the system", "group": "retrospective", "entity": "Boiler", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-10T13:44:00.000Z and 2020-11-10T20:20:00.000Z"} +{"id": 1065, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 343514 between 2019-01-18T00:01:00.000Z and 2019-01-18T05:50:00.000Z according to: There is an anomaly in the CRAC if, for more than 4 hours, the CRAC is shown to be running (if uncertain we assume it's on) and the difference between return and supply temperature stays within 3 and 10 degrees.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-18T00:01:00.000Z and 2019-01-18T05:50:00.000Z"} +{"id": 1066, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710OC between 2020-12-15T05:00:00.000Z and 2020-12-15T15:15:00.000Z according to: There is an anomaly in the CRAC if, for more than 4 hours, the CRAC is shown to be running (if uncertain we assume it's on) and the difference between return and supply temperature stays within 3 and 10 degrees.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-15T05:00:00.000Z and 2020-12-15T15:15:00.000Z"} +{"id": 1067, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 343369 between 2019-03-28T14:46:00.000Z and 2019-03-29T06:59:00.000Z according to: There is an anomaly in the CRAC if, for more than 4 hours, the CRAC is shown to be running (if uncertain we assume it's on) and the difference between return and supply temperature stays within 3 and 10 degrees.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-28T14:46:00.000Z and 2019-03-29T06:59:00.000Z"} +{"id": 1068, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU71ETW between 2020-11-20T20:30:00.000Z and 2020-11-23T02:45:00.000Z according to: If the CRAC is running (or just assume it's on in case of uncertainty) but the valve that regulates the chilled water is less than 5% open and stays like so for more than 8h it's anomalous", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-20T20:30:00.000Z and 2020-11-23T02:45:00.000Z"} +{"id": 1069, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU71ETZ between 2021-01-13T05:00:00.000Z and 2021-02-05T05:00:00.000Z according to: If the CRAC is running (or just assume it's on in case of uncertainty) but the valve that regulates the chilled water is less than 5% open and stays like so for more than 8h it's anomalous", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-01-13T05:00:00.000Z and 2021-02-05T05:00:00.000Z"} +{"id": 1070, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710VN between 2020-06-24T14:25:00.000Z and 2020-07-25T21:21:00.000Z according to: If the CRAC is running (or just assume it's on in case of uncertainty) but the valve that regulates the chilled water is less than 5% open and stays like so for more than 8h it's anomalous", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-24T14:25:00.000Z and 2020-07-25T21:21:00.000Z"} +{"id": 1071, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710OA between 2020-10-20T13:30:00.000Z and 2020-10-20T18:15:00.000Z according to: If the CRAC is running or unknown, the difference between the supply air temp and the setpoint is greater than 3F, and the setpoint is less than 65F, all for three hours, raise an anomaly flag.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-10-20T13:30:00.000Z and 2020-10-20T18:15:00.000Z"} +{"id": 1072, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 5003E8CRA017 between 2019-03-14T22:15:00.000Z and 2019-03-15T17:00:00.000Z according to: If the CRAC is running or unknown, the difference between the supply air temp and the setpoint is greater than 3F, and the setpoint is less than 65F, all for three hours, raise an anomaly flag.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-14T22:15:00.000Z and 2019-03-15T17:00:00.000Z"} +{"id": 1073, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU012SJ between 2020-03-28T19:00:00.000Z and 2020-03-29T01:45:00.000Z according to: If the CRAC is running or unknown, the difference between the supply air temp and the setpoint is greater than 3F, and the setpoint is less than 65F, all for three hours, raise an anomaly flag.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-28T19:00:00.000Z and 2020-03-29T01:45:00.000Z"} +{"id": 1074, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC 5003D7CRA002 between 2019-02-11T18:30:00.000Z and 2019-02-12T14:15:00.000Z according to: If the CRAC is on or unknown, and the temperature setpoint is less than 65, and the difference between the temp setpoint and the supply air temp is more than 4F for more than 3 hours, raise an alert.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-11T18:30:00.000Z and 2019-02-12T14:15:00.000Z"} +{"id": 1075, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710ND between 2021-09-15T14:45:00.000Z and 2021-09-16T12:34:00.000Z according to: If the CRAC is on or unknown, and the temperature setpoint is less than 65, and the difference between the temp setpoint and the supply air temp is more than 4F for more than 3 hours, raise an alert.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-09-15T14:45:00.000Z and 2021-09-16T12:34:00.000Z"} +{"id": 1076, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset CRAC SU710NB between 2019-01-24T12:45:00.000Z and 2019-01-25T03:45:00.000Z according to: If the CRAC is on or unknown, and the temperature setpoint is less than 65, and the difference between the temp setpoint and the supply air temp is more than 4F for more than 3 hours, raise an alert.", "group": "retrospective", "entity": "CRAC", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-24T12:45:00.000Z and 2019-01-25T03:45:00.000Z"} +{"id": 1077, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller CU02006 between 2019-02-18T17:00:00.000Z and 2019-03-04T14:45:00.000Z according to: An alert needs to be raised in chase the chiller is running and the difference between supply and setpoint temperatures is greater than 5F for a consecutive period of 2 hours or more.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-18T17:00:00.000Z and 2019-03-04T14:45:00.000Z"} +{"id": 1078, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller CU02007 between 2021-09-16T16:30:00.000Z and 2021-09-20T16:30:00.000Z according to: An alert needs to be raised in chase the chiller is running and the difference between supply and setpoint temperatures is greater than 5F for a consecutive period of 2 hours or more.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-09-16T16:30:00.000Z and 2021-09-20T16:30:00.000Z"} +{"id": 1079, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 2021010GCME1 between 2020-09-28T15:26:00.000Z and 2020-09-28T22:15:00.000Z according to: An alert needs to be raised in chase the chiller is running and the difference between supply and setpoint temperatures is greater than 5F for a consecutive period of 2 hours or more.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-09-28T15:26:00.000Z and 2020-09-28T22:15:00.000Z"} +{"id": 1080, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 2021010GCME1 between 2021-08-04T14:27:00.000Z and 2021-08-05T03:59:00.000Z according to: There's an anomaly if the chiller is on and the setpoint temperature minus the supply is continuously greater than 2 degF for more than 2 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-08-04T14:27:00.000Z and 2021-08-05T03:59:00.000Z"} +{"id": 1081, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH05A between 2019-02-05T23:30:00.000Z and 2019-02-06T03:10:00.000Z according to: There's an anomaly if the chiller is on and the setpoint temperature minus the supply is continuously greater than 2 degF for more than 2 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-05T23:30:00.000Z and 2019-02-06T03:10:00.000Z"} +{"id": 1082, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 2021010GCME1 between 2021-08-31T17:10:00.000Z and 2021-09-01T03:59:00.000Z according to: There's an anomaly if the chiller is on and the setpoint temperature minus the supply is continuously greater than 2 degF for more than 2 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-08-31T17:10:00.000Z and 2021-09-01T03:59:00.000Z"} +{"id": 1083, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller CU02009 between 2020-07-14T23:30:00.000Z and 2020-07-15T07:45:00.000Z according to: More than 3 hours with the chiller on and and the difference between the supply and the refrigerant temperature in the evaporator greater than 4 F is anomalous", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-14T23:30:00.000Z and 2020-07-15T07:45:00.000Z"} +{"id": 1084, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH05A between 2020-11-05T07:00:00.000Z and 2020-11-06T02:10:00.000Z according to: More than 3 hours with the chiller on and and the difference between the supply and the refrigerant temperature in the evaporator greater than 4 F is anomalous", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-05T07:00:00.000Z and 2020-11-06T02:10:00.000Z"} +{"id": 1085, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH05A between 2019-01-10T18:15:00.000Z and 2019-01-11T02:35:00.000Z according to: More than 3 hours with the chiller on and and the difference between the supply and the refrigerant temperature in the evaporator greater than 4 F is anomalous", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-10T18:15:00.000Z and 2019-01-11T02:35:00.000Z"} +{"id": 1086, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 343137 between 2022-07-22T11:15:00.000Z and 2022-07-27T07:00:00.000Z according to: If the delta between the condenser temp and the return water to the tower is greater than 4 Farhenheit deg for at least 3 hours then raise an alert", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-07-22T11:15:00.000Z and 2022-07-27T07:00:00.000Z"} +{"id": 1087, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 343137 between 2021-06-02T14:45:00.000Z and 2021-06-03T07:00:00.000Z according to: If the delta between the condenser temp and the return water to the tower is greater than 4 Farhenheit deg for at least 3 hours then raise an alert", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-06-02T14:45:00.000Z and 2021-06-03T07:00:00.000Z"} +{"id": 1088, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH43 between 2020-05-25T06:00:00.000Z and 2020-05-25T13:30:00.000Z according to: If the delta between the condenser temp and the return water to the tower is greater than 4 Farhenheit deg for at least 3 hours then raise an alert", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-25T06:00:00.000Z and 2020-05-25T13:30:00.000Z"} +{"id": 1089, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 343137 between 2022-12-08T17:30:00.000Z and 2022-12-09T21:30:00.000Z according to: The condition has 3 parts. (1) The chiller is running. (2) The absolute difference between the coolant pressure difference and its setpoint is greater than 4 PSI; or, if coolant pressure difference is not reporting, the absolute difference between supply coolant pressure minus return coolant pressure and the setpoint is greater than 4 PSI. (3) The rule is triggered when all three parts of the condition are met for 3 hours.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-12-08T17:30:00.000Z and 2022-12-09T21:30:00.000Z"} +{"id": 1090, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH04 between 2019-02-23T03:00:00.000Z and 2019-02-23T07:00:00.000Z according to: If the chiller is not running, but the power input is larger than 5 kilowatts for more than 3 hours, raise an anomaly flag.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-23T03:00:00.000Z and 2019-02-23T07:00:00.000Z"} +{"id": 1091, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller J019600000611 between 2022-10-13T18:00:00.000Z and 2022-10-26T13:45:00.000Z according to: If the chiller is not running, but the power input is larger than 5 kilowatts for more than 3 hours, raise an anomaly flag.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-10-13T18:00:00.000Z and 2022-10-26T13:45:00.000Z"} +{"id": 1092, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Chiller 709CH04 between 2019-02-21T15:15:00.000Z and 2019-02-21T20:15:00.000Z according to: If the chiller is not running, but the power input is larger than 5 kilowatts for more than 3 hours, raise an anomaly flag.", "group": "retrospective", "entity": "Chiller", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-21T15:15:00.000Z and 2019-02-21T20:15:00.000Z"} +{"id": 1093, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower Q009610000610 between 2019-02-10T15:30:00.000Z and 2019-02-10T18:45:00.000Z according to: There is a cooling tower anomaly if the outside air temp is less than 95F, but the absolute difference between the condenser water pressure difference setpoint and the condenser water pressure difference is greater thaan 5 psi for two hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-02-10T15:30:00.000Z and 2019-02-10T18:45:00.000Z"} +{"id": 1094, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower Q009610000610 between 2019-01-19T18:45:00.000Z and 2019-01-19T22:45:00.000Z according to: There is a cooling tower anomaly if the outside air temp is less than 95F, but the absolute difference between the condenser water pressure difference setpoint and the condenser water pressure difference is greater thaan 5 psi for two hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-19T18:45:00.000Z and 2019-01-19T22:45:00.000Z"} +{"id": 1095, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower Q009610000610 between 2019-01-04T18:45:00.000Z and 2019-01-04T22:30:00.000Z according to: There is a cooling tower anomaly if the outside air temp is less than 95F, but the absolute difference between the condenser water pressure difference setpoint and the condenser water pressure difference is greater thaan 5 psi for two hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-04T18:45:00.000Z and 2019-01-04T22:30:00.000Z"} +{"id": 1096, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower 2021010CTME06 between 2022-07-30T22:30:00.000Z and 2022-07-31T16:00:00.000Z according to: It's anomalous that in days where the outside temp is less than 80 the difference between the temp of the condenser water supply to the chiller and its setpoint is greater than 6 for more than 2 consecutive hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-07-30T22:30:00.000Z and 2022-07-31T16:00:00.000Z"} +{"id": 1097, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower TC02701 between 2020-05-27T23:45:00.000Z and 2020-05-28T15:30:00.000Z according to: It's anomalous that in days where the outside temp is less than 80 the difference between the temp of the condenser water supply to the chiller and its setpoint is greater than 6 for more than 2 consecutive hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-05-27T23:45:00.000Z and 2020-05-28T15:30:00.000Z"} +{"id": 1098, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Cooling Tower TC02701 between 2021-03-30T17:00:00.000Z and 2021-03-31T00:45:00.000Z according to: It's anomalous that in days where the outside temp is less than 80 the difference between the temp of the condenser water supply to the chiller and its setpoint is greater than 6 for more than 2 consecutive hours", "group": "retrospective", "entity": "Cooling Tower", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-03-30T17:00:00.000Z and 2021-03-31T00:45:00.000Z"} +{"id": 1099, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CC between 2020-11-03T23:45:00.000Z and 2020-11-04T16:45:00.000Z according to: Whenever for more than 2 hours the heating valve is more than 50% open and the absolute difference between the hot water temperature and the hot water return temperature is less than 4 degrees, and if available the hot water system drained flag is 0; raise an anomaly.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-03T23:45:00.000Z and 2020-11-04T16:45:00.000Z"} +{"id": 1100, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CC between 2020-12-11T00:45:00.000Z and 2021-01-01T05:00:00.000Z according to: Whenever for more than 2 hours the heating valve is more than 50% open and the absolute difference between the hot water temperature and the hot water return temperature is less than 4 degrees, and if available the hot water system drained flag is 0; raise an anomaly.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-11T00:45:00.000Z and 2021-01-01T05:00:00.000Z"} +{"id": 1101, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CC between 2020-12-04T01:45:00.000Z and 2020-12-04T16:30:00.000Z according to: Whenever for more than 2 hours the heating valve is more than 50% open and the absolute difference between the hot water temperature and the hot water return temperature is less than 4 degrees, and if available the hot water system drained flag is 0; raise an anomaly.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-12-04T01:45:00.000Z and 2020-12-04T16:30:00.000Z"} +{"id": 1102, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 208085CB between 2021-02-22T11:30:00.000Z and 2021-02-22T15:15:00.000Z according to: Raise an alert if, for more than two hours, the heating valve is less than 5%, the hot water temp is more than 90F, and the system is not drained or unknown.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-02-22T11:30:00.000Z and 2021-02-22T15:15:00.000Z"} +{"id": 1103, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 406065BC between 2020-11-05T13:15:00.000Z and 2020-11-05T16:30:00.000Z according to: Raise an alert if, for more than two hours, the heating valve is less than 5%, the hot water temp is more than 90F, and the system is not drained or unknown.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-11-05T13:15:00.000Z and 2020-11-05T16:30:00.000Z"} +{"id": 1104, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU 606064AD between 2021-09-26T19:15:00.000Z and 2021-09-27T12:45:00.000Z according to: Raise an alert if, for more than two hours, the heating valve is less than 5%, the hot water temp is more than 90F, and the system is not drained or unknown.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-09-26T19:15:00.000Z and 2021-09-27T12:45:00.000Z"} +{"id": 1105, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU D08085CB between 2020-07-03T11:15:00.000Z and 2020-07-03T21:15:00.000Z according to: The condition for the rule has five parts. (1) Hot Water System Drained is reporting and equal to zero. (2) Heating System Status is on. (3) The OAT is greater than 65 degrees F. (4) The Heating Valve is less than 5%. (5) The Hot Water Temperature is greater than 90 degrees F. The rule is triggered when all five parts of the condition are met for two hours.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-03T11:15:00.000Z and 2020-07-03T21:15:00.000Z"} +{"id": 1106, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU Q08085AB between 2020-09-05T17:15:00.000Z and 2020-09-05T19:45:00.000Z according to: The condition for the rule has five parts. (1) Hot Water System Drained is reporting and equal to zero. (2) Heating System Status is on. (3) The OAT is greater than 65 degrees F. (4) The Heating Valve is less than 5%. (5) The Hot Water Temperature is greater than 90 degrees F. The rule is triggered when all five parts of the condition are met for two hours.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-09-05T17:15:00.000Z and 2020-09-05T19:45:00.000Z"} +{"id": 1107, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset HXU D08085CB between 2020-07-27T09:30:00.000Z and 2020-07-27T11:45:00.000Z according to: The condition for the rule has five parts. (1) Hot Water System Drained is reporting and equal to zero. (2) Heating System Status is on. (3) The OAT is greater than 65 degrees F. (4) The Heating Valve is less than 5%. (5) The Hot Water Temperature is greater than 90 degrees F. The rule is triggered when all five parts of the condition are met for two hours.", "group": "retrospective", "entity": "HXU", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-07-27T09:30:00.000Z and 2020-07-27T11:45:00.000Z"} +{"id": 1108, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset SVL PDU 16 between 2021-05-28T17:45:00.000Z and 2021-05-29T01:30:00.000Z according to: If power input is greater than 0.1kW but less than 5% of 650kW for 3 hours, raise an anomaly", "group": "retrospective", "entity": "", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2021-05-28T17:45:00.000Z and 2021-05-29T01:30:00.000Z"} +{"id": 1109, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset SVL PDU Q between 2022-05-13T23:15:00.000Z and 2022-05-15T06:30:00.000Z according to: If power input is greater than 0.1kW but less than 5% of 650kW for 3 hours, raise an anomaly", "group": "retrospective", "entity": "", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-13T23:15:00.000Z and 2022-05-15T06:30:00.000Z"} +{"id": 1110, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset SVL PDU 2 between 2022-05-13T23:00:00.000Z and 2022-05-15T05:00:00.000Z according to: If power input is greater than 0.1kW but less than 5% of 650kW for 3 hours, raise an anomaly", "group": "retrospective", "entity": "", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-05-13T23:00:00.000Z and 2022-05-15T05:00:00.000Z"} +{"id": 1111, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump NEASCHWP3 between 2020-03-27T16:45:00.000Z and 2020-03-28T01:45:00.000Z according to: The condition for the rule has three parts. (1) The Pump Status is 1 or the Pump Current in Amps is greater than 1. (2) The Pump Occupied flag is 0. (3) The OAT is greater than 55 degrees F. The rule is triggered when all three parts of the condition are met for two hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-27T16:45:00.000Z and 2020-03-28T01:45:00.000Z"} +{"id": 1112, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump NEASCHWP4 between 2020-06-08T09:15:00.000Z and 2020-06-10T15:30:00.000Z according to: The condition for the rule has three parts. (1) The Pump Status is 1 or the Pump Current in Amps is greater than 1. (2) The Pump Occupied flag is 0. (3) The OAT is greater than 55 degrees F. The rule is triggered when all three parts of the condition are met for two hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-08T09:15:00.000Z and 2020-06-10T15:30:00.000Z"} +{"id": 1113, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump NEASCHWP3 between 2020-03-28T17:30:00.000Z and 2020-03-28T23:45:00.000Z according to: The condition for the rule has three parts. (1) The Pump Status is 1 or the Pump Current in Amps is greater than 1. (2) The Pump Occupied flag is 0. (3) The OAT is greater than 55 degrees F. The rule is triggered when all three parts of the condition are met for two hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-03-28T17:30:00.000Z and 2020-03-28T23:45:00.000Z"} +{"id": 1114, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump J019600000711 between 2019-01-19T18:30:00.000Z and 2019-01-19T22:45:00.000Z according to: The condition has 5 parts. (1) The pump is running. (2) The pump VFD speed is reporting. (3) The outdoor air temperature is less than 95°F. (4) The absolute difference between the pump differential pressure and the pump differential pressure setpoint is greater than 4 PSI. (5) The rule is triggered when all five parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-01-19T18:30:00.000Z and 2019-01-19T22:45:00.000Z"} +{"id": 1115, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343162 between 2020-06-29T02:00:00.000Z and 2020-06-29T06:00:00.000Z according to: The condition has 5 parts. (1) The pump is running. (2) The pump VFD speed is reporting. (3) The outdoor air temperature is less than 95°F. (4) The absolute difference between the pump differential pressure and the pump differential pressure setpoint is greater than 4 PSI. (5) The rule is triggered when all five parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-06-29T02:00:00.000Z and 2020-06-29T06:00:00.000Z"} +{"id": 1116, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343142 between 2022-04-20T03:00:00.000Z and 2022-04-20T05:00:00.000Z according to: The condition has 5 parts. (1) The pump is running. (2) The pump VFD speed is reporting. (3) The outdoor air temperature is less than 95°F. (4) The absolute difference between the pump differential pressure and the pump differential pressure setpoint is greater than 4 PSI. (5) The rule is triggered when all five parts of the condition are met for 2 hours.", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2022-04-20T03:00:00.000Z and 2022-04-20T05:00:00.000Z"} +{"id": 1117, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343152 between 2019-03-16T20:15:00.000Z and 2019-03-17T01:45:00.000Z according to: If the outside air temp is more than 70F, and the pump is running for more than two hours, raise an alert for HW subtype", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2019-03-16T20:15:00.000Z and 2019-03-17T01:45:00.000Z"} +{"id": 1118, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343152 between 2020-02-24T22:45:00.000Z and 2020-02-25T01:00:00.000Z according to: If the outside air temp is more than 70F, and the pump is running for more than two hours, raise an alert for HW subtype", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-24T22:45:00.000Z and 2020-02-25T01:00:00.000Z"} +{"id": 1119, "type": "monitoring rule", "category": "Analysis & Inference", "text": "Please find anomalies for asset Pump 343152 between 2020-02-27T19:30:00.000Z and 2020-02-28T02:30:00.000Z according to: If the outside air temp is more than 70F, and the pump is running for more than two hours, raise an alert for HW subtype", "group": "retrospective", "entity": "Pump", "deterministic": true, "characteristic_form": "The expected response should be either a json string containing a time interval where the anomaly is present or a pointer to a jsonfile containing the anomaly period. This anomaly is identified between 2020-02-27T19:30:00.000Z and 2020-02-28T02:30:00.000Z"} diff --git a/src/scenarios/models.py b/src/scenarios/models.py index 0d639e008..be0ecd657 100644 --- a/src/scenarios/models.py +++ b/src/scenarios/models.py @@ -1,17 +1,141 @@ -from typing import Any +"""Pydantic models used by the scenario-generation pipeline.""" + +from __future__ import annotations + +from typing import Any, Literal + from pydantic import BaseModel, Field +ScenarioTypeKey = Literal["iot", "fmsr", "tsfm", "wo", "vibration", "multiagent"] + + +class KeyDescription(BaseModel): + """A named item with a short human-readable description.""" + + key: str + description: str + + +class GroundedTimeRange(BaseModel): + """Concrete time coverage discovered from a live data source.""" + + start: str | None = None + end: str | None = None + total_observations: int = 0 + + +class SensorNameDescription(BaseModel): + """One sensor channel with a human-readable description (from profile synthesis).""" + + name: str + description: str + + +class AssetInstance(BaseModel): + """One live asset id with per-instance coverage (time ranges). + + Sensor inventories are shared across instances and live on ``GroundingBundle`` as + ``iot_sensors`` / ``vibration_sensors`` (prior data for synthesis only). + """ + + site_name: str + asset_id: str + has_iot: bool = False + has_vibration: bool = False + iot_time_range: GroundedTimeRange | None = None + vibration_time_range: GroundedTimeRange | None = None + + +class GroundingBundle(BaseModel): + """Deterministic live grounding information collected before profile synthesis.""" + + asset_name: str + requested_open_form: bool = False + open_form_eligible: bool = False + iot_sensors: list[str] = Field(default_factory=list) + vibration_sensors: list[str] = Field(default_factory=list) + asset_instances: list[AssetInstance] = Field(default_factory=list) + failure_modes: list[str] = Field(default_factory=list) + failure_sensor_mapping: dict[str, list[str]] = Field(default_factory=dict) + sensor_failure_mapping: dict[str, list[str]] = Field(default_factory=dict) + + class AssetProfile(BaseModel): + """Structured knowledge about an asset and the tools relevant to it.""" + asset_name: str + generation_mode: str = "closed_form" description: str - sensor_mappings: dict[str, str] = Field(default_factory=dict) - known_failure_modes: list[str] = Field(default_factory=list) + iot_sensors: list[SensorNameDescription] = Field(default_factory=list) + vibration_sensors: list[SensorNameDescription] = Field(default_factory=list) + failure_modes: list[KeyDescription] = Field(default_factory=list) + asset_instances: list[AssetInstance] = Field(default_factory=list) + failure_sensor_mapping: dict[str, list[str]] = Field(default_factory=dict) + sensor_failure_mapping: dict[str, list[str]] = Field(default_factory=dict) relevant_tools: dict[str, list[dict[str, str]]] = Field(default_factory=dict) + operator_tasks: list[str] = Field(default_factory=list) + manager_tasks: list[str] = Field(default_factory=list) iso_standards: list[str] = Field(default_factory=list) + def instances_for_focus(self, focus: str) -> list[AssetInstance]: + """Return grounded instances that can support the requested focus.""" + + if focus == "iot": + return [instance for instance in self.asset_instances if instance.has_iot] + if focus == "vibration": + return [instance for instance in self.asset_instances if instance.has_vibration] + if focus in {"fmsr", "tsfm", "wo", "multiagent"}: + return [ + instance + for instance in self.asset_instances + if instance.has_iot or instance.has_vibration + ] + return list(self.asset_instances) + + def grounded_sites(self) -> list[str]: + """Return the distinct grounded site names.""" + + return sorted({instance.site_name for instance in self.asset_instances if instance.site_name}) + + def grounded_asset_ids(self, focus: str | None = None) -> list[str]: + """Return grounded asset ids, optionally filtered by focus.""" + + instances = self.instances_for_focus(focus) if focus else self.asset_instances + return sorted({instance.asset_id for instance in instances if instance.asset_id}) + + def grounded_sensor_names(self, focus: str | None = None) -> list[str]: + """Return sensor names from the profile for the requested focus (open-form validation).""" + + if focus == "vibration": + return sorted(dict.fromkeys(s.name for s in self.vibration_sensors if s.name)) + if focus == "iot": + return sorted(dict.fromkeys(s.name for s in self.iot_sensors if s.name)) + combined = [*(s.name for s in self.iot_sensors), *(s.name for s in self.vibration_sensors)] + return sorted(dict.fromkeys(n for n in combined if n)) + + def grounded_timestamps(self, focus: str | None = None) -> list[str]: + """Return explicit timestamp bounds discovered for grounded instances.""" + + instances = self.instances_for_focus(focus) if focus else self.asset_instances + timestamps: set[str] = set() + for instance in instances: + ranges = [] + if focus != "vibration" and instance.iot_time_range: + ranges.append(instance.iot_time_range) + if focus != "iot" and instance.vibration_time_range: + ranges.append(instance.vibration_time_range) + for time_range in ranges: + if time_range.start: + timestamps.add(time_range.start) + if time_range.end: + timestamps.add(time_range.end) + return sorted(timestamps) + class RetrievalAction(BaseModel): + """Next-step decision emitted by the retrieval planner.""" + action: str = "search" reason: str = "" canonical_asset_name: str @@ -20,6 +144,8 @@ class RetrievalAction(BaseModel): class EvidenceCandidate(BaseModel): + """Metadata for one potentially relevant paper or evidence source.""" + arxiv_id: str title: str summary: str @@ -31,6 +157,8 @@ class EvidenceCandidate(BaseModel): class EvidenceSnippet(BaseModel): + """Extracted evidence text used to justify an asset profile.""" + arxiv_id: str title: str url: str | None = None @@ -38,46 +166,59 @@ class EvidenceSnippet(BaseModel): text: str -class RetrievalDiagnostics(BaseModel): - steps_run: int = 1 - finish_reason: str = "" - metadata_requests: int = 0 - pdf_requests: int = 0 - cooldown_seconds: float = 3.1 - - class EvidenceBundle(BaseModel): + """All evidence collected for one asset profile build.""" + asset_name: str canonical_asset_name: str query_history: list[str] = Field(default_factory=list) selected_candidate_ids: list[str] = Field(default_factory=list) candidates: list[EvidenceCandidate] = Field(default_factory=list) snippets: list[EvidenceSnippet] = Field(default_factory=list) - diagnostics: RetrievalDiagnostics = Field(default_factory=RetrievalDiagnostics) class ScenarioBudget(BaseModel): + """Requested scenario count plus per-subagent allocation.""" + total_scenarios: int = 50 allocation: dict[str, int] = Field(default_factory=dict) reasoning: str = "" - def model_post_init(self, __context: Any) -> None: - if not self.allocation: - types = ["iot", "fmsr", "tsfm", "wo", "multiagent"] - per_type = self.total_scenarios // len(types) - remainder = self.total_scenarios % len(types) - - self.allocation = {t: per_type for t in types} - if remainder > 0: - self.allocation[types[0]] += remainder - class Scenario(BaseModel): + """One benchmark scenario emitted by the generator.""" + id: str - type: str text: str category: str characteristic_form: str + type: ScenarioTypeKey + generation_mode: str | None = Field(default=None, exclude=True) def to_dict(self) -> dict[str, Any]: - return self.model_dump() + """Return a plain dictionary representation for JSON export.""" + + return { + "id": self.id, + "type": self.type, + "text": self.text, + "category": self.category, + "characteristic_form": self.characteristic_form, + } + + +__all__ = [ + "AssetProfile", + "EvidenceBundle", + "EvidenceCandidate", + "EvidenceSnippet", + "AssetInstance", + "GroundedTimeRange", + "GroundingBundle", + "KeyDescription", + "RetrievalAction", + "Scenario", + "ScenarioBudget", + "ScenarioTypeKey", + "SensorNameDescription", +] diff --git a/src/scenarios/prompts.py b/src/scenarios/prompts.py deleted file mode 100644 index e04c73e16..000000000 --- a/src/scenarios/prompts.py +++ /dev/null @@ -1,241 +0,0 @@ -PROFILE_BUILDER_PROMPT = """\ -You are an expert Reliability Engineer preparing an Asset Profile. - -Given the Asset Name, a structured evidence bundle from ArXiv, the available subagents and their tools, and generic knowledge of ISO 55000 / ISO 14224 terms, create an Asset Profile in JSON format. - -Asset Name: {asset_name} - -Structured Evidence Bundle: -{evidence_bundle_json} - -Available Subagent Tools: -{tool_descriptions} - -Task: -Produce a JSON matching the following schema exactly. -CRITICAL: Output ONLY the raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. - -Rules: -- Treat the evidence bundle as the primary source of truth. -- Only include sensor mappings, failure modes, and standards that are clearly supported by the evidence snippets or are directly aligned with the available tools. -- If evidence is sparse, stay conservative and generic rather than inventing highly specific details. -- Avoid ML-architecture concepts unless they are clearly about monitoring or operating the physical asset itself. -- The asset profile must represent the physical industrial asset class itself, not surrounding digital, grid, networking, cyber, or facility infrastructure. - -{{ - "asset_name": "{asset_name}", - "description": "Short summary of the asset (1-2 sentences).", - "sensor_mappings": {{"sensor_name": "description of what it measures"}}, - "known_failure_modes": ["failure mode 1", "failure mode 2"], - "relevant_tools": {{"iot": [{{"name": "tool_name", "reason": "why we might use it for this asset"}}]}}, - "iso_standards": ["list 2-3 relevant ISO standards or engineering conventions"] -}} -""" - -SCENARIO_GENERATOR_PROMPT = """\ -You are an advanced Scenario Architect for AssetOps Bench. -We need you to generate {count} evaluation scenarios specifically tailored for the '{subagent_name}' subagent, focused on the asset: {asset_name}. - -Asset Profile Details: -{asset_profile_json} - -Available Subagent Tools (these are ALL the available tools for this subagent, but you MUST prioritize the tools explicitly mentioned in the Asset Profile's "relevant_tools" section): -{tool_definitions} - -Here are some Few-Shot examples from our benchmark dataset (for style and tone reference): -{few_shot_examples} - -Constraints: -1. Emphasize Reasoning and Tool Use: Scenarios should require the agent to perform domain-specific reasoning based on the available tools. -2. Emphasize Data Handling and Forecasting where applicable. -3. Every scenario must be highly specific, having a clear 'text' (the query to the agent), a 'category' (e.g. Knowledge Query, Data Query, Analytical Query), and a 'characteristic_form' (explaining in natural language what the agent should do to answer the query correctly). - -Task: Generate a JSON array of {count} scenarios. -CRITICAL: Output ONLY the raw JSON array. Do NOT include markdown code blocks, Python code, or any conversational preamble. - -Format exactly (raw JSON only): -[ - {{ - "text": "What IoT sites are available for the {asset_name}?", - "category": "{example_category}", - "characteristic_form": "The expected response should be the return value of all sites, either as text or as a reference to a tool call." - }} -] -""" - -VALIDATE_REPAIR_PROMPT = """\ -You are the Validator and Repair agent for the AssetOps Bench scenario generator. - -You are given a list of JSON scenarios and the corresponding Asset Profile. -Your job is to strictly validate and repair them based on: -1. Do they query realistic tools/data from the available toolset in the profile? -2. Do they fit exactly the JSON schema (text, category, characteristic_form)? -3. Does the characteristic_form accurately articulate what the ideal response/agent flow should look like? - -Asset Profile: -{asset_profile_json} - -Input Scenarios: -{input_scenarios_json} - -Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. -CRITICAL: Do not include any explanation, markdown formatting, or Python code. Output MUST be raw JSON text only. -""" - -MULTIAGENT_COMBINER_PROMPT = """\ -You are the Multiagent Scenario Combiner. -You generate complex multi-agent workflows that span across multiple subagents (e.g. IoT + WO + TSFM). -We need {count} multi-agent scenarios for {asset_name}. - -Asset Profile: -{asset_profile_json} - -Available MCP Function Definitions (these are ALL the tools across all subagents, but you MUST prioritize the tools explicitly mentioned in the Asset Profile's "relevant_tools" section): -{mcp_function_definitions} - -Here are some valid single-agent scenarios we generated earlier: -{single_agent_scenarios_json} - -Task: Use these single-agent pieces to construct cohesive multi-agent scenarios. A multiagent scenario tests Agent Communication and Coordination, Workflow Orchestration, and Decision-Making. -For instance, detecting an anomaly using IoT, confirming a historical failure with FMSR or TSFM, and creating a work order using WO. - -Return ONLY a JSON array of length {count}. -CRITICAL: Do NOT include markdown code blocks, Python code, or any conversational preamble. - -[ - {{ - "text": "Detect a temperature anomaly on the chiller, verify its past occurrences, and schedule a work order.", - "category": "Knowledge Query", - "characteristic_form": "The expected response should involve first utilizing the IoT tool to confirm the anomaly, then querying the WO tool to fetch history, before finalizing a work order creation." - }} -] -""" - -RETRIEVAL_QUERY_PLAN_PROMPT = """\ -You are a bounded ReAct retrieval agent for industrial asset research. - -You do not call ArXiv directly. The host executes searches for you and returns metadata summaries. -At each step, decide whether to search again or finish with the best candidates found so far. - -Asset Name: {asset_name} -Current Step: {step_number} of {max_steps} -Current Canonical Asset Name: {canonical_asset_name} - -Available Subagent Tools: -{tool_descriptions} - -Previous Queries: -{previous_queries} - -Current Top Judged Results: -{current_results_summary} - -Return ONLY a raw JSON object in this shape: -{{ - "action": "search" or "finish", - "reason": "brief explanation", - "canonical_asset_name": "canonical industrial equipment term", - "queries": ["1 to 2 new ArXiv queries if action=search, otherwise []"], - "selected_ids": ["preferred arxiv ids if action=finish, otherwise []"] -}} - -Constraints: -- Keep the process generic for any industrial asset class. -- An industrial asset class is a physical piece of equipment or subsystem that is monitored, maintained, and can fail. -- Examples of industrial asset classes: chiller, air handling unit, pump, motor, power transformer. -- Context words like smart grid, plant, facility, building, line, or substation describe the deployment environment, not the asset class itself. -- If the asset name is ambiguous, resolve it toward the physical equipment noun phrase, not an ML concept and not a broader system context. -- Normalize queries toward the physical equipment itself. For example, "smart grid transformer" should be treated as a transformer or power transformer in a smart-grid context, not as the smart grid itself. -- Queries should focus on physical asset monitoring, diagnostics, failures, maintenance, condition assessment, degradation, or reliability. -- Prefer equipment-specific queries such as "power transformer condition monitoring" or "power transformer fault diagnosis". -- Avoid broad or ambiguous queries like "transformer reliability" or "smart grid transformer monitoring" when a more equipment-specific query is possible. -- Do not drift into smart-grid cyberattacks, communications, networking, markets, data architecture, control systems, or generic ML "Transformer" papers. -- When action is "search", propose 1 to 2 short queries only. -- When action is "finish", prefer the strongest already judged metadata and do not propose new queries. -- Only finish early if the current top results already contain at least two clearly physical-asset-focused papers. -- Do not use advanced boolean syntax. -- Do not invent arxiv ids that are not present in Current Top Judged Results. -- Output ONLY raw JSON. -""" - -RETRIEVAL_METADATA_JUDGE_PROMPT = """\ -You are a relevance judge for ArXiv metadata retrieved for industrial asset scenario generation. - -Your task is to score how useful each metadata entry is for building an asset profile for the physical industrial asset below. -Judge from the title and summary only. - -Asset Name: {asset_name} -Canonical Asset Name: {canonical_asset_name} - -Metadata Entries: -{metadata_entries_json} - -Return ONLY a raw JSON array. One object per metadata entry: -[ - {{ - "arxiv_id": "entry id", - "score_1_to_10": 8, - "reason": "short reason" - }} -] - -Scoring guide: -- Core question: would this paper help define the physical asset class itself and its maintenance, monitoring, sensing, degradation, diagnostics, or failure behavior? -- High score when the paper is clearly about the physical asset and would help populate sensor mappings, known failure modes, relevant tools, maintenance workflows, or standards. -- 9-10: directly about the physical asset and clearly useful for condition monitoring, fault diagnosis, degradation, insulation or thermal behavior, reliability, maintenance, standards, or physical measurements -- 6-8: relevant to the physical asset but somewhat indirect, narrower than ideal, or missing strong maintenance or diagnostics detail -- 3-5: mixed relevance, generic system context, or only weakly connected to the physical asset itself -- 1-2: not about the physical asset itself, clearly about a different asset family, or dominated by unrelated ML/system context -- Low-score examples: - - smart-grid cyberattacks or false-data-injection papers - - communications or networking papers - - grid data architecture, market, or control-system papers - - generic ML "Transformer" architecture papers - - papers about other asset families such as rotating machinery unless the target asset is actually that equipment -- High-score examples: - - condition monitoring - - fault diagnosis - - degradation, insulation, or thermal behavior - - reliability, maintenance, or standards - - sensors and measurements for the physical equipment -- In every reason, explicitly include either the phrase "physical asset focused" or the phrase "not physical asset focused". -- If the paper is off-target, say why in physical-asset terms. - -Be strict about generic smart-grid, networking, cybersecurity, market, or ML-architecture papers when the asset is a physical piece of equipment. -Output ONLY raw JSON. -""" - -BUDGET_ALLOCATOR_PROMPT = """\ -You are an expert Scenario Strategy Consultant for AssetOps Bench. - -Given an Asset Profile (derived from technical literature) and a total number of scenarios to generate ({total_scenarios}), your task is to allocate this budget across the following five categories: -1. iot: Focusing on sensor data and basic telemetry. -2. fmsr: Focusing on failure modes and structural reliability. -3. tsfm: Focusing on time-series analysis and technical maintenance. -4. wo: Focusing on actual maintenance execution and work orders. -5. multiagent: Complex, multi-stage workflows involving orchestration of multiple agents. - -Asset Profile: -{asset_profile_json} - -Allocation Strategy: -- Prioritize agents that have more "relevant_tools" or "known_failure_modes" in the profile. -- If the asset mentions complex standards (ISO 14224, etc.), lean towards analytical categories (tsfm, fmsr). -- It is perfectly acceptable for a category to have 0 scenarios if the Asset Profile doesn't warrant it. -- Cap "multiagent" at a maximum of 50% of the total budget (e.g., max 25 if total is 50). -- The sum of all allocations MUST exactly equal {total_scenarios}. - -Output Format: -CRITICAL: Return ONLY a raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. - -{{ - "reasoning": "A brief explanation of why you chose this distribution based on the asset details.", - "allocation": {{ - "iot": int, - "fmsr": int, - "tsfm": int, - "wo": int, - "multiagent": int - }} -}} -""" diff --git a/src/scenarios/prompts/__init__.py b/src/scenarios/prompts/__init__.py new file mode 100644 index 000000000..662bc55b0 --- /dev/null +++ b/src/scenarios/prompts/__init__.py @@ -0,0 +1,20 @@ +"""Prompt templates used by the scenario-generation pipeline.""" + +from .asset_profile import PROFILE_BUILDER_PROMPT +from .budget import BUDGET_ALLOCATOR_PROMPT +from .generation import ( + MULTIAGENT_COMBINER_PROMPT, + SCENARIO_GENERATOR_PROMPT, + VALIDATE_REPAIR_PROMPT, +) +from .retrieval import RETRIEVAL_METADATA_JUDGE_PROMPT, RETRIEVAL_QUERY_PLAN_PROMPT + +__all__ = [ + "BUDGET_ALLOCATOR_PROMPT", + "MULTIAGENT_COMBINER_PROMPT", + "PROFILE_BUILDER_PROMPT", + "RETRIEVAL_METADATA_JUDGE_PROMPT", + "RETRIEVAL_QUERY_PLAN_PROMPT", + "SCENARIO_GENERATOR_PROMPT", + "VALIDATE_REPAIR_PROMPT", +] diff --git a/src/scenarios/prompts/asset_profile.py b/src/scenarios/prompts/asset_profile.py new file mode 100644 index 000000000..f9dc41190 --- /dev/null +++ b/src/scenarios/prompts/asset_profile.py @@ -0,0 +1,77 @@ +"""Prompt for constructing study-backed asset profile enrichment.""" + +PROFILE_BUILDER_PROMPT = """\ +You are an expert reliability engineer preparing study-backed enrichment for an Asset Profile used in scenario generation. + +The system will compose the final Asset Profile in code. Your job is to return only the study-derived fields that are not already deterministically grounded from CouchDB discovery. + +Asset Name: {asset_name} +Generation Mode: {generation_mode} + +Grounded Coverage Summary: +{grounding_summary_json} + +Structured Evidence Summary: +{evidence_summary_json} + +Available Subagent Tools: +{tool_descriptions} + +Task: +Produce a JSON object matching the following schema exactly. +CRITICAL: Output ONLY the raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +Rules: +- Keep the response concise. Do NOT restate asset instances, asset_name, or generation_mode. +- In open_form mode, treat grounded live coverage as the source of truth for concrete site names, asset ids, sensor keys (listed under `iot_sensors` / `vibration_sensors` in the summary), per-asset time ranges, and timestamps. +- In closed_form mode, assume scenarios must be self-contained: the query text should list explicit sensor readings (sensor name, numeric value, unit), and may include rules or dataset names when relevant. +- Use the evidence summary as the primary source of truth for asset-class understanding, operator workflows, monitoring practices, and standards. +- Do NOT return `failure_sensor_mapping` or `sensor_failure_mapping`. +- Use `iot_sensors` and `vibration_sensors` as separate lists of objects, each with `name` and `description` (what it measures). The system merges these with sensor name strings from the grounding summary in code (every IoT name from the summary must appear under `iot_sensors`; every vibration name from the summary under `vibration_sensors`). +- Use `failure_modes` the same way as before: list of `{{"key": "...", "description": "..."}}`. The system merges with grounded failure modes and F2S/S2F mappings in code (mappings use keys only). +- Include multiple relevant tools per focus when the toolset clearly supports more than one important action for that focus. +- Use an empty array [] for `vibration_sensors` when vibration sensing does not apply; use [] for `iot_sensors` only when the asset truly has no IoT channels in the grounded summary. +- Only include sensor descriptions, failure mode descriptions, task types, and standards that are clearly supported by the evidence summary, grounded coverage summary, or tool definitions. +- If evidence is sparse, stay conservative rather than inventing highly specific details. +- The profile must represent the physical industrial asset class itself, not surrounding digital, networking, cyber, or facility infrastructure. +- Add realistic tasks from the point of view of industrial asset operator and the operator's manager. +- Include vibration tools only when vibration analysis is relevant to the asset class or grounded data; otherwise use [] for "vibration". + +{{ + "description": "Short summary of the asset class (1-2 sentences).", + "iot_sensors": [ + {{"name": "sensor_name", "description": "what it measures"}} + ], + "vibration_sensors": [ + {{"name": "sensor_name", "description": "what it measures"}} + ], + "failure_modes": [ + {{"key": "failure_mode_name", "description": "why it matters for this asset"}} + ], + "relevant_tools": {{ + "iot": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "fmsr": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "tsfm": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "wo": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ], + "vibration": [ + {{"name": "tool_name_a", "reason": "why this tool matters for the asset"}}, + {{"name": "tool_name_b", "reason": "why this tool matters for the asset"}} + ] + }}, + "operator_tasks": ["task phrased from the operator point of view"], + "manager_tasks": ["task phrased from the manager point of view"], + "iso_standards": ["list 2-3 relevant ISO, IEC, IEEE, or engineering conventions"] +}} +""" diff --git a/src/scenarios/prompts/budget.py b/src/scenarios/prompts/budget.py new file mode 100644 index 000000000..50ee4ad47 --- /dev/null +++ b/src/scenarios/prompts/budget.py @@ -0,0 +1,38 @@ +"""Prompt for allocating scenario counts across subagents.""" + +BUDGET_ALLOCATOR_PROMPT = """\ +You are an expert Scenario Strategy Consultant for AssetOps Bench. + +Given an Asset Profile and a total number of scenarios to generate ({total_scenarios}), your task is to allocate this budget across the following six focus areas: +1. iot: Focusing on sensor data and basic telemetry. +2. fmsr: Focusing on failure modes and structural reliability. +3. tsfm: Focusing on time-series analysis and technical maintenance. +4. wo: Focusing on actual maintenance execution and work orders. +5. vibration: Focusing on vibration diagnostics, severity assessment, FFT/envelope workflows, and bearing-related reasoning. +6. multiagent: Complex, multi-stage workflows involving orchestration of multiple agents. + +Asset Profile: +{asset_profile_json} + +Allocation Strategy: +- Prioritize agents that have more "relevant_tools" or richer "failure_modes" / "iot_sensors" / "vibration_sensors" entries in the profile. +- If the asset mentions complex standards (ISO 14224, etc.), lean towards analytical categories (tsfm, fmsr, vibration where appropriate). +- It is perfectly acceptable for a category to have 0 scenarios if the Asset Profile doesn't warrant it. +- Cap "multiagent" at a maximum of 75% of the total budget (e.g., max 37 if total is 50). +- The sum of all allocations MUST exactly equal {total_scenarios}. + +Output Format: +CRITICAL: Return ONLY a raw JSON object. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +{{ + "reasoning": "A brief explanation of why you chose this distribution based on the asset details.", + "allocation": {{ + "iot": int, + "fmsr": int, + "tsfm": int, + "wo": int, + "vibration": int, + "multiagent": int + }} +}} +""" diff --git a/src/scenarios/prompts/generation.py b/src/scenarios/prompts/generation.py new file mode 100644 index 000000000..06a14a593 --- /dev/null +++ b/src/scenarios/prompts/generation.py @@ -0,0 +1,151 @@ +"""Prompts for single-agent and multi-agent scenario generation.""" + +SCENARIO_GENERATOR_PROMPT = """\ +You are an advanced industrial agent Scenario Architect for AssetOps Bench. +We need you to generate {count} evaluation scenarios with primary focus '{subagent_name}' for the asset class: {asset_name}. + +Generation Mode: +{generation_mode} + +Asset Profile (full JSON): +{asset_profile_json} + +Available Focus Tools: +{tool_definitions} + +{few_shot_examples_section} + +When generating scenarios, use the Generation Mode and Mode-specific grounding rules (not the few-shot rows) to decide whether each scenario must embed readings, rules, summaries, or dataset identifiers in the query text. + +Suggested category values for this focus: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Avoid these bad patterns: +{forbidden_patterns} + +Mode-specific grounding rules: +{mode_requirements} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Constraints: +1. Every scenario must read like a realistic request from an industrial operator or the operator's manager. +2. The scenario may involve supporting work from other agents, but the main burden should stay on the primary focus '{subagent_name}'. +3. Every scenario must be highly specific, having a clear 'text', a 'category', and a 'characteristic_form'. +4. The characteristic_form must explicitly mention the concrete MCP tool names needed to solve the task. +5. The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers, or add parenthetical hints such as "e.g. get_failure_modes tool". Reserve every concrete tool name for 'characteristic_form' only. +6. Closed-form scenarios must embed explicit inline sensor readings in the query text: for each measurement, sensor name (or label), numeric value, and unit (e.g. ppm, %, Hz, mm/s). You may also embed rule text, summaries, or dataset identifiers when the task requires them. +7. Open-form scenarios must use only grounded identifiers present in the Asset Profile. +8. Do not output Unsupported. + +Task: Generate a JSON array of {count} scenarios. +CRITICAL: Output ONLY the raw JSON array. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +Format exactly (raw JSON only): +[ + {{ + "text": "...", + "category": "...", + "characteristic_form": "..." + }} +] +""" + +VALIDATE_REPAIR_PROMPT = """\ +You are the Validator and Repair agent for the AssetOps Bench scenario generator. + +You are given a list of JSON scenarios and the corresponding Asset Profile. +Your job is to strictly validate and repair them based on: +1. Do they fit exactly the JSON schema (text, category, characteristic_form)? +2. Does the characteristic_form name the concrete MCP tool names needed to solve the task? +3. Does the 'text' field contain only natural operator language, with no MCP tool names, function identifiers, or parenthetical hints like "e.g. get_failure_modes tool"? If any appear in 'text', remove or rewrite them and keep tool names in characteristic_form only. +4. Does each scenario clearly satisfy the prompt rules for primary focus '{subagent_name}' even if it uses supporting cross-agent steps? +5. In closed_form mode, does each scenario text include explicit inline sensor readings (name, value, unit) per Mode-specific grounding rules? Are there duplicates, near-duplicates, or (for open_form) ungrounded identifiers? +6. Fix every deterministic validation failure listed below. + +Target Focus: +{subagent_name} + +Suggested Categories: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Avoid these bad patterns: +{forbidden_patterns} + +Mode-specific grounding rules: +{mode_requirements} + +Asset Profile: +{asset_profile_json} + +Input Scenarios: +{input_scenarios_json} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Deterministic validation failures that MUST be fixed: +{validation_failures_json} + +Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. +CRITICAL: Do not include any explanation, markdown formatting, or Python code. Output MUST be raw JSON text only. +""" + +MULTIAGENT_COMBINER_PROMPT = """\ +You are the Multiagent Scenario Combiner. +You generate complex multi-agent workflows that span across multiple focused capabilities (e.g. IoT + WO + TSFM + vibration). +We need {count} multi-agent scenarios for {asset_name}. + +Generation Mode: +{generation_mode} + +Asset Profile: +{asset_profile_json} + +Available MCP Function Definitions (these are ALL the tools across all subagents, but you MUST prioritize the tools explicitly mentioned in the Asset Profile's "relevant_tools" section): +{mcp_function_definitions} + +Here are some valid single-agent scenarios we generated earlier: +{single_agent_scenarios_json} + +Follow Generation Mode: closed-form runs must inline explicit sensor readings (name, value, unit) in operator-facing text, plus any rule text, summaries, or dataset references the task needs. + +Already accepted multiagent scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Mode-specific grounding rules: +{mode_requirements} + +Avoid these bad patterns: +{forbidden_patterns} + +Task: Use these single-agent pieces to construct cohesive multi-agent scenarios from the point of view of an operator or the operator's manager. +A multiagent scenario tests agent communication, workflow orchestration, and decision-making. +For instance, detecting an anomaly using IoT, confirming a failure signature with FMSR or vibration, projecting impact with TSFM, and planning action with WO. + +Requirements: +- The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers, or add parenthetical hints such as "e.g. get_failure_modes tool". Put concrete tool names only in characteristic_form. +- Every multiagent characteristic_form must mention at least two distinct namespaces chosen from iot, fmsr, tsfm, wo, and vibration. +- Every multiagent characteristic_form must mention concrete MCP tool names from those namespaces. +- Open-form scenarios must only use grounded identifiers from the Asset Profile. +- Closed-form scenarios must contain explicit inline sensor readings (name, value, unit) in the text, and may include summaries, rule text, or dataset identifiers when needed. +- Do not output Unsupported. + +Return ONLY a JSON array of length {count}. +CRITICAL: Do NOT include markdown code blocks, Python code, or any conversational preamble. + +[ + {{ + "text": "Detect a temperature anomaly on the chiller, verify its past occurrences, and schedule a work order.", + "category": "Knowledge Query", + "characteristic_form": "The expected response should involve first utilizing the IoT tool to confirm the anomaly, then querying the WO tool to fetch history, before finalizing a work order creation." + }} +] +""" diff --git a/src/scenarios/prompts/retrieval.py b/src/scenarios/prompts/retrieval.py new file mode 100644 index 000000000..fb14ddf96 --- /dev/null +++ b/src/scenarios/prompts/retrieval.py @@ -0,0 +1,95 @@ +"""Prompts used by the bounded ArXiv retrieval workflow.""" + +RETRIEVAL_QUERY_PLAN_PROMPT = """\ +You are a bounded ReAct retrieval agent for industrial asset research. + +You do not call ArXiv directly. The host executes searches for you and returns metadata summaries. +At each step, decide whether to search again or finish with the best candidates found so far. + +Asset Name: {asset_name} +Current Step: {step_number} of {max_steps} +Current Canonical Asset Name: {canonical_asset_name} + +Available Subagent Tools: +{tool_descriptions} + +Previous Queries: +{previous_queries} + +Current Top Judged Results: +{current_results_summary} + +Return ONLY a raw JSON object in this shape: +{{ + "action": "search" or "finish", + "reason": "brief explanation", + "canonical_asset_name": "canonical industrial equipment term", + "queries": ["1 to 2 new ArXiv queries if action=search, otherwise []"], + "selected_ids": ["preferred arxiv ids if action=finish, otherwise []"] +}} + +Constraints: +- Keep the process generic for any industrial asset class. +- An industrial asset class is a physical piece of equipment or subsystem that is monitored, maintained, and can fail. +- Examples of industrial asset classes: chiller, air handling unit, pump, motor, power transformer. +- Context words like smart grid, plant, facility, building, line, or substation describe the deployment environment, not the asset class itself. +- If the asset name is ambiguous, resolve it toward the physical equipment noun phrase, not an ML concept and not a broader system context. +- Normalize queries toward the physical equipment itself. For example, "smart grid transformer" should be treated as a transformer or power transformer in a smart-grid context, not as the smart grid itself. +- Queries should focus on physical asset monitoring, diagnostics, failures, maintenance, condition assessment, degradation, or reliability. +- Prefer equipment-specific queries such as "power transformer condition monitoring" or "power transformer fault diagnosis". +- Avoid broad or ambiguous queries like "transformer reliability" or "smart grid transformer monitoring" when a more equipment-specific query is possible. +- Do not drift into smart-grid cyberattacks, communications, networking, markets, data architecture, control systems, or generic ML "Transformer" papers. +- When action is "search", propose 1 to 2 short queries only. +- When action is "finish", prefer the strongest already judged metadata and do not propose new queries. +- Only finish early if the current top results already contain at least two clearly physical-asset-focused papers. +- Do not use advanced boolean syntax. +- Do not invent arxiv ids that are not present in Current Top Judged Results. +- Output ONLY raw JSON. +""" + +RETRIEVAL_METADATA_JUDGE_PROMPT = """\ +You are a relevance judge for ArXiv metadata retrieved for industrial asset scenario generation. + +Your task is to score how useful each metadata entry is for building an asset profile for the physical industrial asset below. +Judge from the title and summary only. + +Asset Name: {asset_name} +Canonical Asset Name: {canonical_asset_name} + +Metadata Entries: +{metadata_entries_json} + +Return ONLY a raw JSON array. One object per metadata entry: +[ + {{ + "arxiv_id": "entry id", + "score_1_to_10": 8, + "reason": "short reason" + }} +] + +Scoring guide: +- Core question: would this paper help define the physical asset class itself and its maintenance, monitoring, sensing, degradation, diagnostics, or failure behavior? +- High score when the paper is clearly about the physical asset and would help populate sensor mappings, known failure modes, relevant tools, maintenance workflows, or standards. +- 9-10: directly about the physical asset and clearly useful for condition monitoring, fault diagnosis, degradation, insulation or thermal behavior, reliability, maintenance, standards, or physical measurements +- 6-8: relevant to the physical asset but somewhat indirect, narrower than ideal, or missing strong maintenance or diagnostics detail +- 3-5: mixed relevance, generic system context, or only weakly connected to the physical asset itself +- 1-2: not about the physical asset itself, clearly about a different asset family, or dominated by unrelated ML/system context +- Low-score examples: + - smart-grid cyberattacks or false-data-injection papers + - communications or networking papers + - grid data architecture, market, or control-system papers + - generic ML "Transformer" architecture papers + - papers about other asset families such as rotating machinery unless the target asset is actually that equipment +- High-score examples: + - condition monitoring + - fault diagnosis + - degradation, insulation, or thermal behavior + - reliability, maintenance, or standards + - sensors and measurements for the physical equipment +- In every reason, explicitly include either the phrase "physical asset focused" or the phrase "not physical asset focused". +- If the paper is off-target, say why in physical-asset terms. + +Be strict about generic smart-grid, networking, cybersecurity, market, or ML-architecture papers when the asset is a physical piece of equipment. +Output ONLY raw JSON. +""" diff --git a/src/scenarios/retrieval/__init__.py b/src/scenarios/retrieval/__init__.py new file mode 100644 index 000000000..fdc9c831b --- /dev/null +++ b/src/scenarios/retrieval/__init__.py @@ -0,0 +1,5 @@ +"""Evidence retrieval stage for scenario generation.""" + +from .pipeline import retrieve_asset_evidence + +__all__ = ["retrieve_asset_evidence"] diff --git a/src/scenarios/retrieval/arxiv.py b/src/scenarios/retrieval/arxiv.py new file mode 100644 index 000000000..c00e6b1b7 --- /dev/null +++ b/src/scenarios/retrieval/arxiv.py @@ -0,0 +1,227 @@ +"""ArXiv HTTP client and retrieval keyword constants.""" + +from __future__ import annotations + +import io +import logging +import ssl +import time +import urllib.error +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET + +from ..models import EvidenceCandidate + +_log = logging.getLogger(__name__) + +_ARXIV_COOLDOWN_SECONDS = 3.1 +_ARXIV_BASE_URL = "http://export.arxiv.org/api/query?" +_ARXIV_HEADERS = {"User-Agent": "AssetOpsBench/1.0 (mailto:admin@example.com)"} +_MAX_METADATA_RESULTS = 6 +_MAX_PDF_PAGES = 10 + +_STOPWORDS = { + "a", + "an", + "and", + "asset", + "class", + "equipment", + "for", + "in", + "industrial", + "machine", + "of", + "on", + "or", + "plant", + "system", + "the", + "to", +} + +_DIAGNOSTIC_KEYWORDS = [ + "condition monitoring", + "diagnostic", + "diagnostics", + "fault", + "fault diagnosis", + "failure", + "failure analysis", + "degradation", + "health", + "inspection", + "maintenance", + "monitoring", + "prognostic", + "prognostics", + "reliability", +] + +_STANDARD_KEYWORDS = [ + "iec", + "ieee", + "iso", + "condition assessment", + "maintenance strategy", + "reliability centered maintenance", +] + +_ML_NEGATIVE_KEYWORDS = [ + "attention mechanism", + "bert", + "deep learning", + "federated learning", + "foundation model", + "language model", + "llm", + "mamba", + "neural network", + "nlp", + "time series transformer", + "transformer architecture", + "vision transformer", +] + +_OFF_TARGET_KEYWORDS = [ + "communications", + "control system", + "control systems", + "cyber attack", + "cyber security", + "cyberattack", + "cybersecurity", + "data architecture", + "false data injection", + "market", + "networking", + "smart grid", +] + +_PHYSICAL_REASON_MARKERS = [ + "physical asset focused", + "physical equipment focused", +] + +_OFF_TARGET_REASON_MARKERS = [ + "not physical asset focused", + "communications", + "control system", + "cyberattack", + "cybersecurity", + "data architecture", + "generic ml", + "indirect relevance", + "market", + "networking", + "not directly", + "not entirely physical asset focused", + "other asset family", + "somewhat indirect", + "somewhat relevant", + "smart-grid", + "system paper", + "transformer architecture", +] + + +class _ArxivExecutor: + """Single-entry executor that enforces a cooldown before every ArXiv request.""" + + def __init__(self, cooldown_seconds: float = _ARXIV_COOLDOWN_SECONDS) -> None: + self.cooldown_seconds = cooldown_seconds + self._last_request_at: float | None = None + self.metadata_requests = 0 + self.pdf_requests = 0 + self._ctx = ssl.create_default_context() + self._ctx.check_hostname = False + self._ctx.verify_mode = ssl.CERT_NONE + + def _wait_for_cooldown(self) -> None: + if self._last_request_at is None: + return + elapsed = time.monotonic() - self._last_request_at + if elapsed < self.cooldown_seconds: + time.sleep(self.cooldown_seconds - elapsed) + + def _open(self, url: str, timeout: int) -> bytes: + self._wait_for_cooldown() + req = urllib.request.Request(url, headers=_ARXIV_HEADERS) + with urllib.request.urlopen(req, timeout=timeout, context=self._ctx) as response: + data = response.read() + self._last_request_at = time.monotonic() + return data + + def fetch_metadata( + self, + query: str, + max_results: int = _MAX_METADATA_RESULTS, + ) -> list[EvidenceCandidate]: + safe_query = urllib.parse.quote(query) + url = f"{_ARXIV_BASE_URL}search_query={safe_query}&start=0&max_results={max_results}" + self.metadata_requests += 1 + + try: + data = self._open(url, timeout=10) + except urllib.error.HTTPError as exc: + _log.warning("HTTP error fetching ArXiv metadata for %r: %s", query, exc) + return [] + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch ArXiv metadata for %r: %s", query, exc) + return [] + + try: + root = ET.fromstring(data) + except ET.ParseError as exc: + _log.warning("Failed to parse ArXiv XML for %r: %s", query, exc) + return [] + + ns = {"atom": "http://www.w3.org/2005/Atom"} + candidates: list[EvidenceCandidate] = [] + for entry in root.findall("atom:entry", ns): + raw_id = entry.findtext("atom:id", default="", namespaces=ns).strip() + arxiv_id = raw_id.rsplit("/", 1)[-1] if raw_id else "" + title = entry.findtext("atom:title", default="No Title", namespaces=ns) + summary = entry.findtext("atom:summary", default="No Summary", namespaces=ns) + published = entry.findtext("atom:published", default="", namespaces=ns).strip() or None + + pdf_url = None + for link in entry.findall("atom:link", ns): + href = link.attrib.get("href") + if link.attrib.get("title") == "pdf" or link.attrib.get("type") == "application/pdf": + pdf_url = href + if pdf_url and not pdf_url.endswith(".pdf"): + pdf_url += ".pdf" + break + + candidates.append( + EvidenceCandidate( + arxiv_id=arxiv_id or title.strip(), + title=title.strip().replace("\n", " "), + summary=summary.strip().replace("\n", " "), + query=query, + pdf_url=pdf_url, + published=published, + ) + ) + return candidates + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: + self.pdf_requests += 1 + try: + pdf_bytes = self._open(pdf_url, timeout=15) + from pypdf import PdfReader + + reader = PdfReader(io.BytesIO(pdf_bytes)) + pages: list[str] = [] + for index, page in enumerate(reader.pages): + if index >= max_pages: + break + page_text = page.extract_text() + if page_text: + pages.append(page_text) + return "\n".join(pages) + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch or parse ArXiv PDF %s: %s", pdf_url, exc) + return "" diff --git a/src/scenarios/retrieval.py b/src/scenarios/retrieval/pipeline.py similarity index 63% rename from src/scenarios/retrieval.py rename to src/scenarios/retrieval/pipeline.py index fcfa27cb5..352190c97 100644 --- a/src/scenarios/retrieval.py +++ b/src/scenarios/retrieval/pipeline.py @@ -1,157 +1,47 @@ +"""LLM-orchestrated evidence retrieval using ArXiv.""" + from __future__ import annotations -import io import json -import logging import re -import ssl -import time -import urllib.error -import urllib.parse -import urllib.request -import xml.etree.ElementTree as ET from typing import Callable from llm import LLMBackend -from .models import ( +from ..models import ( EvidenceBundle, EvidenceCandidate, EvidenceSnippet, RetrievalAction, - RetrievalDiagnostics, ) -from .prompts import RETRIEVAL_METADATA_JUDGE_PROMPT, RETRIEVAL_QUERY_PLAN_PROMPT -from .utils import parse_llm_json - -_log = logging.getLogger(__name__) +from ..prompts import RETRIEVAL_METADATA_JUDGE_PROMPT, RETRIEVAL_QUERY_PLAN_PROMPT +from ..text import collapse_whitespace_lower +from ..utils import parse_llm_json +from .arxiv import ( + _ARXIV_COOLDOWN_SECONDS, + _ArxivExecutor, + _DIAGNOSTIC_KEYWORDS, + _ML_NEGATIVE_KEYWORDS, + _OFF_TARGET_KEYWORDS, + _OFF_TARGET_REASON_MARKERS, + _PHYSICAL_REASON_MARKERS, + _STANDARD_KEYWORDS, + _STOPWORDS, +) -_ARXIV_COOLDOWN_SECONDS = 3.1 -_ARXIV_BASE_URL = "http://export.arxiv.org/api/query?" -_ARXIV_HEADERS = {"User-Agent": "AssetOpsBench/1.0 (mailto:admin@example.com)"} _MAX_STEPS = 5 _MAX_QUERIES_PER_STEP = 2 -_MAX_METADATA_RESULTS = 6 _MAX_CANDIDATE_POOL = 8 _TOP_PDF_DOWNLOADS = 3 -_MAX_PDF_PAGES = 5 _MAX_SNIPPETS_PER_DOC = 3 -_STOPWORDS = { - "a", - "an", - "and", - "asset", - "class", - "equipment", - "for", - "in", - "industrial", - "machine", - "of", - "on", - "or", - "plant", - "system", - "the", - "to", -} - -_DIAGNOSTIC_KEYWORDS = [ - "condition monitoring", - "diagnostic", - "diagnostics", - "fault", - "fault diagnosis", - "failure", - "failure analysis", - "degradation", - "health", - "inspection", - "maintenance", - "monitoring", - "prognostic", - "prognostics", - "reliability", -] - -_STANDARD_KEYWORDS = [ - "iec", - "ieee", - "iso", - "condition assessment", - "maintenance strategy", - "reliability centered maintenance", -] - -_ML_NEGATIVE_KEYWORDS = [ - "attention mechanism", - "bert", - "deep learning", - "federated learning", - "foundation model", - "language model", - "llm", - "mamba", - "neural network", - "nlp", - "time series transformer", - "transformer architecture", - "vision transformer", -] - -_OFF_TARGET_KEYWORDS = [ - "communications", - "control system", - "control systems", - "cyber attack", - "cyber security", - "cyberattack", - "cybersecurity", - "data architecture", - "false data injection", - "market", - "networking", - "smart grid", -] - -_PHYSICAL_REASON_MARKERS = [ - "physical asset focused", - "physical equipment focused", -] - -_OFF_TARGET_REASON_MARKERS = [ - "not physical asset focused", - "communications", - "control system", - "cyberattack", - "cybersecurity", - "data architecture", - "generic ml", - "indirect relevance", - "market", - "networking", - "not directly", - "not entirely physical asset focused", - "other asset family", - "somewhat indirect", - "somewhat relevant", - "smart-grid", - "system paper", - "transformer architecture", -] - - -def _normalise_text(text: str) -> str: - return re.sub(r"\s+", " ", text.strip().lower()) - def _tokenise(text: str) -> list[str]: return re.findall(r"[a-z0-9]+", text.lower()) def _default_canonical_asset_name(asset_name: str) -> str: - return _normalise_text(asset_name.replace("_", " ")) + return collapse_whitespace_lower(asset_name.replace("_", " ")) def _unique_preserve_order(items: list[str]) -> list[str]: @@ -173,115 +63,6 @@ def _asset_tokens(asset_name: str) -> list[str]: ] -class _ArxivExecutor: - """Single-entry executor that enforces a cooldown before every ArXiv request.""" - - def __init__(self, cooldown_seconds: float = _ARXIV_COOLDOWN_SECONDS) -> None: - self.cooldown_seconds = cooldown_seconds - self._last_request_at: float | None = None - self.metadata_requests = 0 - self.pdf_requests = 0 - self._ctx = ssl.create_default_context() - self._ctx.check_hostname = False - self._ctx.verify_mode = ssl.CERT_NONE - - def _wait_for_cooldown(self) -> None: - if self._last_request_at is None: - return - elapsed = time.monotonic() - self._last_request_at - if elapsed < self.cooldown_seconds: - time.sleep(self.cooldown_seconds - elapsed) - - def _open(self, url: str, timeout: int) -> bytes: - self._wait_for_cooldown() - req = urllib.request.Request(url, headers=_ARXIV_HEADERS) - with urllib.request.urlopen(req, timeout=timeout, context=self._ctx) as response: - data = response.read() - self._last_request_at = time.monotonic() - return data - - def fetch_metadata( - self, - query: str, - max_results: int = _MAX_METADATA_RESULTS, - ) -> list[EvidenceCandidate]: - safe_query = urllib.parse.quote(query) - url = f"{_ARXIV_BASE_URL}search_query={safe_query}&start=0&max_results={max_results}" - self.metadata_requests += 1 - - try: - data = self._open(url, timeout=10) - except urllib.error.HTTPError as exc: - _log.warning("HTTP error fetching ArXiv metadata for %r: %s", query, exc) - return [] - except Exception as exc: # noqa: BLE001 - _log.warning("Failed to fetch ArXiv metadata for %r: %s", query, exc) - return [] - - try: - root = ET.fromstring(data) - except ET.ParseError as exc: - _log.warning("Failed to parse ArXiv XML for %r: %s", query, exc) - return [] - - ns = {"atom": "http://www.w3.org/2005/Atom"} - candidates: list[EvidenceCandidate] = [] - for entry in root.findall("atom:entry", ns): - raw_id = entry.findtext("atom:id", default="", namespaces=ns).strip() - arxiv_id = raw_id.rsplit("/", 1)[-1] if raw_id else "" - title = entry.findtext("atom:title", default="No Title", namespaces=ns) - summary = entry.findtext("atom:summary", default="No Summary", namespaces=ns) - published = entry.findtext("atom:published", default="", namespaces=ns).strip() or None - - pdf_url = None - for link in entry.findall("atom:link", ns): - href = link.attrib.get("href") - if link.attrib.get("title") == "pdf" or link.attrib.get("type") == "application/pdf": - pdf_url = href - if pdf_url and not pdf_url.endswith(".pdf"): - pdf_url += ".pdf" - break - - candidates.append( - EvidenceCandidate( - arxiv_id=arxiv_id or title.strip(), - title=title.strip().replace("\n", " "), - summary=summary.strip().replace("\n", " "), - query=query, - pdf_url=pdf_url, - published=published, - ) - ) - return candidates - - def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: - self.pdf_requests += 1 - try: - pdf_bytes = self._open(pdf_url, timeout=15) - from pypdf import PdfReader - - reader = PdfReader(io.BytesIO(pdf_bytes)) - pages: list[str] = [] - for index, page in enumerate(reader.pages): - if index >= max_pages: - break - page_text = page.extract_text() - if page_text: - pages.append(page_text) - return "\n".join(pages) - except Exception as exc: # noqa: BLE001 - _log.warning("Failed to fetch or parse ArXiv PDF %s: %s", pdf_url, exc) - return "" - - -def _default_queries(canonical_asset_name: str) -> list[str]: - canonical = _default_canonical_asset_name(canonical_asset_name) - return [ - f"{canonical} condition monitoring", - f"{canonical} fault diagnosis", - ] - - def _render_queries(queries: list[str]) -> str: return "\n".join(f"- {query}" for query in queries) if queries else "(none yet)" @@ -311,38 +92,26 @@ def _summarise_metadata_for_judge(candidates: list[EvidenceCandidate]) -> str: return json.dumps(payload, indent=2, ensure_ascii=True) -def _coerce_action( - parsed: object, - asset_name: str, - canonical_asset_name: str, - step_number: int, - has_candidates: bool, -) -> RetrievalAction: - fallback_canonical = canonical_asset_name or _default_canonical_asset_name(asset_name) - fallback_queries = _default_queries(fallback_canonical) - +def _coerce_action(parsed: object) -> RetrievalAction: if not isinstance(parsed, dict): - if has_candidates and step_number > 1: - return RetrievalAction( - action="finish", - reason="Fallback finish because the retrieval action could not be parsed.", - canonical_asset_name=fallback_canonical, - ) - return RetrievalAction( - action="search", - reason="Fallback search because the retrieval action could not be parsed.", - canonical_asset_name=fallback_canonical, - queries=fallback_queries, - ) + raise ValueError("Retrieval planner response could not be parsed as an object.") - action = str(parsed.get("action", "search")).strip().lower() + action = str(parsed.get("action", "")).strip().lower() if action not in {"search", "finish"}: - action = "finish" if has_candidates and step_number > 1 else "search" + raise ValueError(f"Retrieval planner returned invalid action: {action!r}") + + reason = str(parsed.get("reason", "")).strip() + if not reason: + raise ValueError("Retrieval planner is missing required non-empty field: 'reason'") + + canonical = str(parsed.get("canonical_asset_name", "")).strip() + if not canonical: + raise ValueError("Retrieval planner is missing required non-empty field: 'canonical_asset_name'") action_obj = RetrievalAction( action=action, - reason=str(parsed.get("reason", "")).strip() or "No reason provided.", - canonical_asset_name=str(parsed.get("canonical_asset_name") or fallback_canonical).strip() or fallback_canonical, + reason=reason, + canonical_asset_name=canonical, queries=[ str(query).strip() for query in parsed.get("queries", []) @@ -355,9 +124,6 @@ def _coerce_action( ], ) - if action_obj.action == "search" and not action_obj.queries: - action_obj.queries = fallback_queries - if action_obj.action == "finish": action_obj.queries = [] @@ -368,8 +134,8 @@ def _judge_fallback( candidate: EvidenceCandidate, canonical_asset_name: str, ) -> tuple[int, str]: - text = _normalise_text(f"{candidate.title} {candidate.summary}") - asset_phrase = _normalise_text(canonical_asset_name) + text = collapse_whitespace_lower(f"{candidate.title} {candidate.summary}") + asset_phrase = collapse_whitespace_lower(canonical_asset_name) asset_tokens = _asset_tokens(canonical_asset_name) score = 2 @@ -488,7 +254,7 @@ def _fallback_retry_queries( def _candidate_reason_flags(reason: str) -> tuple[bool, bool]: - normalized = _normalise_text(reason) + normalized = collapse_whitespace_lower(reason) is_off_target = any(marker in normalized for marker in _OFF_TARGET_REASON_MARKERS) is_physical = ( not is_off_target @@ -550,7 +316,7 @@ def _extract_snippet_text(text: str, canonical_asset_name: str) -> str: lowered = compact.lower() windows: list[tuple[int, int]] = [] for keyword in keywords: - norm = _normalise_text(keyword) + norm = collapse_whitespace_lower(keyword) if not norm: continue idx = lowered.find(norm) @@ -661,11 +427,6 @@ def _render_final_log( lines = [ f"Asset: {bundle.asset_name}", f"Canonical Asset: {bundle.canonical_asset_name}", - f"Steps Run: {bundle.diagnostics.steps_run}", - f"Finish Reason: {bundle.diagnostics.finish_reason}", - f"Metadata Requests: {bundle.diagnostics.metadata_requests}", - f"PDF Requests: {bundle.diagnostics.pdf_requests}", - f"Cooldown: {bundle.diagnostics.cooldown_seconds:.1f}s", f"Physical Asset Focused: {'yes' if focused else 'no'}", "", "Query History:", @@ -713,10 +474,8 @@ def retrieve_asset_evidence( candidate_pool: dict[str, EvidenceCandidate] = {} finish_reason = "Finished after reaching the step limit." selected_ids: list[str] = [] - steps_run = 0 for step_number in range(1, _MAX_STEPS + 1): - steps_run = step_number current_summary = _render_results_summary(_sorted_candidates(candidate_pool)) previous_queries = _render_queries(query_history) prompt = RETRIEVAL_QUERY_PLAN_PROMPT.format( @@ -730,14 +489,8 @@ def retrieve_asset_evidence( ) response = llm.generate(prompt) parsed, _ = parse_llm_json(response) - action = _coerce_action( - parsed=parsed, - asset_name=asset_name, - canonical_asset_name=canonical_asset_name, - step_number=step_number, - has_candidates=bool(candidate_pool), - ) - canonical_asset_name = action.canonical_asset_name or canonical_asset_name + action = _coerce_action(parsed) + canonical_asset_name = action.canonical_asset_name if action.action == "finish" and candidate_pool: pool_focused, focus_reason = _evaluate_candidate_pool( @@ -752,7 +505,7 @@ def retrieve_asset_evidence( selected_ids = action.selected_ids if log_writer: log_writer( - f"retrieval_step_{step_number:02d}", + f"02_retrieval/steps/step_{step_number:02d}.txt", _render_step_log( step_number=step_number, action=action, @@ -777,30 +530,30 @@ def retrieve_asset_evidence( if query not in query_history ][: _MAX_QUERIES_PER_STEP] - if action.action == "search" and not new_queries: - new_queries = _fallback_retry_queries(canonical_asset_name, query_history) - if not new_queries: if candidate_pool: finish_reason = action.reason or "No new queries remained; keeping the best-so-far pool." - if log_writer: - log_writer( - f"retrieval_step_{step_number:02d}", - _render_step_log( - step_number=step_number, - action=RetrievalAction( - action="finish", - reason=finish_reason, - canonical_asset_name=canonical_asset_name, - ), - new_queries=[], - fetched_candidates=[], - pool=candidate_pool, + else: + finish_reason = action.reason or ( + "No new queries from planner and no evidence pool yet; proceeding with empty evidence." + ) + if log_writer: + log_writer( + f"02_retrieval/steps/step_{step_number:02d}.txt", + _render_step_log( + step_number=step_number, + action=RetrievalAction( + action="finish", + reason=finish_reason, canonical_asset_name=canonical_asset_name, ), - ) - break - new_queries = _default_queries(canonical_asset_name) + new_queries=[], + fetched_candidates=[], + pool=candidate_pool, + canonical_asset_name=canonical_asset_name, + ), + ) + break query_history.extend(new_queries) fetched_candidates: list[EvidenceCandidate] = [] @@ -817,7 +570,7 @@ def retrieve_asset_evidence( if log_writer: log_writer( - f"retrieval_step_{step_number:02d}", + f"02_retrieval/steps/step_{step_number:02d}.txt", _render_step_log( step_number=step_number, action=action, @@ -863,16 +616,9 @@ def retrieve_asset_evidence( selected_candidate_ids=selected_candidate_ids, candidates=top_candidates, snippets=snippets, - diagnostics=RetrievalDiagnostics( - steps_run=steps_run, - finish_reason=finish_reason, - metadata_requests=executor.metadata_requests, - pdf_requests=executor.pdf_requests, - cooldown_seconds=_ARXIV_COOLDOWN_SECONDS, - ), ) if log_writer: - log_writer("retrieval_summary", _render_final_log(bundle, selected_candidates)) + log_writer("02_retrieval/summary.txt", _render_final_log(bundle, selected_candidates)) return bundle diff --git a/src/scenarios/text.py b/src/scenarios/text.py new file mode 100644 index 000000000..b7a628521 --- /dev/null +++ b/src/scenarios/text.py @@ -0,0 +1,31 @@ +"""Shared text normalization and slug helpers for the scenario pipeline.""" + +from __future__ import annotations + +import re + + +def slugify_asset_name(name: str) -> str: + slug = re.sub(r"[^a-z0-9]+", "_", name.strip().lower()).strip("_") + return slug or "asset" + + +def collapse_whitespace_lower(text: str) -> str: + return re.sub(r"\s+", " ", text.strip().lower()) + + +def normalize_for_fuzzy_dedup(text: str) -> str: + normalized = re.sub(r"[^a-z0-9]+", " ", text.lower()).strip() + return re.sub(r"\s+", " ", normalized) + + +def normalize_example_fingerprint(text: str) -> str: + return " ".join(str(text).lower().split()) + + +__all__ = [ + "collapse_whitespace_lower", + "normalize_example_fingerprint", + "normalize_for_fuzzy_dedup", + "slugify_asset_name", +] diff --git a/src/scenarios/utils.py b/src/scenarios/utils.py index dc1793915..b22d94864 100644 --- a/src/scenarios/utils.py +++ b/src/scenarios/utils.py @@ -1,12 +1,57 @@ +"""Scenario-generation utilities shared across pipeline stages.""" + +from __future__ import annotations + import json -import urllib.request -import urllib.parse -import xml.etree.ElementTree as ET import logging +import random +import re +from pathlib import Path from typing import Any +from .text import normalize_example_fingerprint + _log = logging.getLogger(__name__) +_SCENARIOS_ROOT = Path(__file__).resolve().parent + +_HF = _SCENARIOS_ROOT / "huggingface" +_ALL_UTTERANCE = _HF / "scenarios" / "all_utterance.jsonl" +_FAILURE_MAPPING = _HF / "task" / "failure_mapping_senarios.jsonl" +_RULE_MONITORING = _HF / "task" / "rule_monitoring_scenarios.jsonl" +_COMPRESSOR = _HF / "asset" / "compressor_utterance.jsonl" +_HYDRAULIC_PUMP = _HF / "asset" / "hydrolicpump_utterance.jsonl" +_LOCAL_VIBRATION = _SCENARIOS_ROOT / "local" / "vibration_utterance.json" + +_ASSET_KEYWORD_SUBSTRINGS = ( + "chiller", + "ahu", + "wind turbine", + "equipment", +) +_ASSET_ID_PATTERN = re.compile(r"\b[A-Z]{2,6}\d{4,}\b") + +# Generic benchmark queries to exclude from all_utterance (substring match, lowercased). +_GENERIC_UTTERANCE_DENYLIST = ( + "what iot sites are available", + "can you list the iot sites", + "list the iot sites", + "is lstm model supported", + "lstm model supported in tsfm", + "what sites are available", +) + +_TSFM_ENTITY_ORDER = ( + "Chiller", + "CRAC", + "Boiler", + "AHU", + "Cooling Tower", + "HXU", + "Pump", + "SVL", +) + def parse_llm_json(raw: str) -> tuple[Any, str | None]: """Parse an LLM response containing a JSON object or array.""" @@ -35,167 +80,248 @@ def parse_llm_json(raw: str) -> tuple[Any, str | None]: end_char = "}" if start == start_obj else "]" end = text.rfind(end_char) + 1 - if start != -1 and end > start: + if start != -1 and end > 0: try: return json.loads(text[start:end]), None except json.JSONDecodeError as inner_exc: return None, f"Failed to parse inner JSON block. Error: {inner_exc}" return None, "Unknown parsing error." -def fetch_arxiv_studies( - search_queries: str | list[str], - max_results_per_query: int = 2, - metadata_out: dict | None = None, -) -> str: - import time - import ssl - - if isinstance(search_queries, str): - queries = [search_queries] - else: - queries = search_queries - - base_url = "http://export.arxiv.org/api/query?" - headers = {'User-Agent': 'AssetOpsBench/1.0 (mailto:admin@example.com)'} - ctx = ssl.create_default_context() - ctx.check_hostname = False - ctx.verify_mode = ssl.CERT_NONE - - if metadata_out is not None: - metadata_out['queries'] = queries - metadata_out['status_codes'] = [] - metadata_out['returned_entries'] = 0 - metadata_out['pdf_urls'] = [] - metadata_out['query_to_pdf'] = {} - metadata_out['results_summary'] = [] - - seen_ids = set() - studies_text = [] - - for i, q in enumerate(queries): - if i > 0: - time.sleep(3.1) - - safe_query = urllib.parse.quote(q) - url = f"{base_url}search_query={safe_query}&start=0&max_results={max_results_per_query}" - + +def _load_jsonl(path: Path) -> list[dict[str, Any]]: + if not path.exists(): + _log.warning("Few-shot file missing: %s", path) + return [] + rows: list[dict[str, Any]] = [] + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line: + continue try: - req = urllib.request.Request(url, headers=headers) - with urllib.request.urlopen(req, timeout=10, context=ctx) as response: - status = response.getcode() - if metadata_out is not None: - metadata_out['status_codes'].append(status) - data = response.read() - - root = ET.fromstring(data) - ns = {'atom': 'http://www.w3.org/2005/Atom'} - - for entry in root.findall('atom:entry', ns): - arxiv_id = entry.find('atom:id', ns).text - if arxiv_id in seen_ids: - continue - seen_ids.add(arxiv_id) - - title = entry.find('atom:title', ns) - summary = entry.find('atom:summary', ns) - - t_text = title.text.strip().replace('\n', ' ') if title is not None else "No Title" - s_text = summary.text.strip().replace('\n', ' ') if summary is not None else "No Summary" - - pdf_url = None - for link in entry.findall('atom:link', ns): - if link.attrib.get('title') == 'pdf' or link.attrib.get('type') == 'application/pdf': - pdf_url = link.attrib.get('href') - if pdf_url and not pdf_url.endswith('.pdf'): - pdf_url += '.pdf' - break - - pdf_text = "" - if pdf_url: - try: - import io - from pypdf import PdfReader - - time.sleep(3.2) - - pdf_req = urllib.request.Request(pdf_url, headers=headers) - with urllib.request.urlopen(pdf_req, timeout=15, context=ctx) as pdf_resp: - pdf_bytes = pdf_resp.read() - - reader = PdfReader(io.BytesIO(pdf_bytes)) - extracted = [] - for j, page in enumerate(reader.pages): - if j > 4: - break - page_text = page.extract_text() - if page_text: - extracted.append(page_text) - - pdf_text = "\n".join(extracted) - if len(pdf_text) > 10000: - pdf_text = pdf_text[:10000] + "\n...[TRUNCATED]" - except Exception as e: - _log.warning(f"Failed to fetch or parse PDF from {pdf_url}: {e}") - pdf_text = "" - - if pdf_url and metadata_out is not None: - metadata_out['results_summary'].append({"title": t_text, "url": pdf_url}) - - if pdf_url and pdf_text and "[PDF Extraction Failed" not in pdf_text: - if metadata_out is not None: - metadata_out['pdf_urls'].append(pdf_url) - if q not in metadata_out['query_to_pdf']: - metadata_out['query_to_pdf'][q] = [] - metadata_out['query_to_pdf'][q].append(pdf_url) - - studies_text.append(f"Title: {t_text}\nSummary: {s_text}\n\nPDF Content Extracted (First 5 pages):\n{pdf_text}") - - except urllib.error.HTTPError as e: - if metadata_out is not None: - metadata_out['status_codes'].append(e.code) - _log.warning(f"HTTP Error {e.code} fetching ArXiv query '{q}': {e}") - except Exception as e: - _log.warning(f"Failed to fetch ArXiv query '{q}': {e}") - - if metadata_out is not None: - metadata_out['returned_entries'] = len(studies_text) - - return "\n\n".join(studies_text) if studies_text else "No recent studies found via ArXiv." + rows.append(json.loads(line)) + except json.JSONDecodeError as exc: + _log.warning("Skip bad JSONL line in %s: %s", path, exc) + return rows -def fetch_hf_fewshot( - dataset_id: str = "ibm-research/AssetOpsBench", - split: str = "scenarios", - target_type: str | None = None, - fallback_if_missing: bool = True, -) -> list[dict]: + +def _load_local_vibration_list() -> list[dict[str, Any]]: + if not _LOCAL_VIBRATION.exists(): + return [] try: - from datasets import load_dataset - ds = load_dataset(dataset_id, split) + raw = json.loads(_LOCAL_VIBRATION.read_text(encoding="utf-8")) + except Exception as exc: + _log.warning("Failed to load local vibration few-shot file: %s", exc) + return [] + items = raw if isinstance(raw, list) else raw.get("train", []) + return [dict(item) for item in items] if isinstance(items, list) else [] + + +def _is_asset_specific_utterance(text: str) -> bool: + """Filter for all_utterance: asset-specific vs generic site/capability questions.""" + tl = text.lower() + for phrase in _GENERIC_UTTERANCE_DENYLIST: + if phrase in tl: + return False + if any(k in tl for k in _ASSET_KEYWORD_SUBSTRINGS): + return True + if _ASSET_ID_PATTERN.search(text): + return True + return False + + +# Failure-mapping few-shot: one example per utterance shape (covers all rows in the JSONL). +_FMSR_FEWSHOT_BUCKET_ORDER: tuple[str, ...] = ( + "list_all", # "List all failure modes of …" + "for_list_all", # "For a compressor, list all the failure modes …" + "what", # "What sensors can be …", "What are the failure modes …", etc. + "which", # "Which failure modes …", "Which sensors are most …" (sentence starts with Which) + "for_which", # "For an aero gas turbine, which failure modes …" (For …, which …) +) + + +def _failure_mapping_bucket(text: str) -> str | None: + """Classify failure_mapping_senarios.jsonl rows by question prefix / shape.""" + s = text.strip() + sl = s.lower() + if sl.startswith("list all"): + return "list_all" + if sl.startswith("for ") and "list all" in sl: + return "for_list_all" + if sl.startswith("what "): + return "what" + if sl.startswith("which "): + return "which" + if sl.startswith("for ") and re.search(r"\bwhich\b", sl): + return "for_which" + return None + + +def _pick_failure_mapping_examples(rows: list[dict[str, Any]]) -> list[dict[str, Any]]: + buckets: dict[str, list[dict[str, Any]]] = {key: [] for key in _FMSR_FEWSHOT_BUCKET_ORDER} + for row in rows: + text = str(row.get("text", "")) + b = _failure_mapping_bucket(text) + if b and b in buckets: + buckets[b].append(row) + out: list[dict[str, Any]] = [] + for key in _FMSR_FEWSHOT_BUCKET_ORDER: + if buckets[key]: + out.append(random.choice(buckets[key])) + return out - examples = [] - if "train" in ds: - train_ds = ds["train"] + +def _pick_rule_monitoring_diverse(rows: list[dict[str, Any]]) -> list[dict[str, Any]]: + """One row per target asset class (entity field or SVL in text).""" + picked: list[dict[str, Any]] = [] + used_ids: set[int | str] = set() + + for target in _TSFM_ENTITY_ORDER: + candidates: list[dict[str, Any]] = [] + if target == "SVL": + for row in rows: + rid = row.get("id") + if rid in used_ids: + continue + t = str(row.get("text", "")) + if re.search(r"\bSVL\b", t, re.IGNORECASE): + candidates.append(row) else: - train_ds = ds + for row in rows: + rid = row.get("id") + if rid in used_ids: + continue + if str(row.get("entity", "")).strip() == target: + candidates.append(row) + if candidates: + choice = random.choice(candidates) + picked.append(choice) + used_ids.add(choice.get("id")) + return picked + + +def _normalize_fewshot_row( + row: dict[str, Any], source_config: str +) -> dict[str, Any]: + text = str(row.get("text", "")).strip() + category = str(row.get("category", "")).strip() or "Knowledge Query" + characteristic_form = str(row.get("characteristic_form", "")).strip() + return { + "id": row.get("id"), + "text": text, + "category": category, + "characteristic_form": characteristic_form, + "entity": str(row.get("entity", "") or "").strip(), + "group": str(row.get("group", "") or "").strip(), + "note": str(row.get("note", "") or "").strip(), + "hint": str(row.get("hint", "") or "").strip(), + "source_config": source_config, + "source_type": str(row.get("type", "") or "").strip(), + } - for item in train_ds: - if target_type is None or str(item.get("type", "")).lower() == target_type.lower(): - examples.append(item) - if len(examples) >= 3: - break +def _to_prompt_dict(example: dict[str, Any]) -> dict[str, Any]: + return { + "text": example.get("text", ""), + "category": example.get("category", ""), + "characteristic_form": example.get("characteristic_form", ""), + "source_config": example.get("source_config", ""), + } + +def _build_candidate_pool( + focus: str, +) -> list[dict[str, Any]]: + focus_lower = (focus or "").lower() + if focus_lower == "iot": + rows = _load_jsonl(_ALL_UTTERANCE) + pool: list[dict[str, Any]] = [] + for row in rows: + if str(row.get("type", "")).strip() != "IoT": + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + pool.append(_normalize_fewshot_row(row, "all_utterance_iot")) + return pool + + if focus_lower == "fmsr": + rows = _load_jsonl(_FAILURE_MAPPING) + picked = _pick_failure_mapping_examples(rows) + return [_normalize_fewshot_row(r, "failure_mapping") for r in picked] + + if focus_lower == "tsfm": + rows = _load_jsonl(_RULE_MONITORING) + picked = _pick_rule_monitoring_diverse(rows) + return [_normalize_fewshot_row(r, "rule_monitoring") for r in picked] + + if focus_lower == "wo": + rows = _load_jsonl(_ALL_UTTERANCE) + pool = [] + for row in rows: + if str(row.get("type", "")).strip() != "Workorder": + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + pool.append(_normalize_fewshot_row(row, "all_utterance_wo")) + return pool + + if focus_lower == "vibration": + items = _load_local_vibration_list() return [ - { - "text": e.get("text", ""), - "category": e.get("category", ""), - "characteristic_form": e.get("characteristic_form", ""), - } - for e in examples + _normalize_fewshot_row(dict(item), "local_vibration") for item in items ] - except ImportError: - _log.warning("HuggingFace 'datasets' library is not installed.") + + if focus_lower == "multiagent": + pool = [] + for path, tag in ( + (_COMPRESSOR, "compressor_utterance"), + (_HYDRAULIC_PUMP, "hydrolicpump_utterance"), + ): + for row in _load_jsonl(path): + pool.append(_normalize_fewshot_row(row, tag)) + for row in _load_jsonl(_ALL_UTTERANCE): + if str(row.get("type", "")).strip() != "multiagent": + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + pool.append(_normalize_fewshot_row(row, "all_utterance_multiagent")) + return pool + + _log.warning("Unknown focus %r for few-shot; returning empty pool.", focus) + return [] + + +def fetch_hf_fewshot( + focus: str | None = None, + max_examples: int = 6, + seed: int | None = None, +) -> list[dict]: + if max_examples <= 0: return [] - except Exception as e: - _log.warning(f"Failed to load HuggingFace dataset: {e}") + + if seed is not None: + random.seed(seed) + + pool = _build_candidate_pool(focus) + if not pool: + _log.info("No few-shot examples were available for focus %r.", focus) return [] + + # Dedupe by normalized text fingerprint + seen: set[str] = set() + unique: list[dict[str, Any]] = [] + for example in pool: + fp = normalize_example_fingerprint(example.get("text", "")) + if not fp or fp in seen: + continue + seen.add(fp) + unique.append(example) + + random.shuffle(unique) + selected = unique[:max_examples] + return [_to_prompt_dict(ex) for ex in selected] + + +__all__ = ["fetch_hf_fewshot", "parse_llm_json"] From ede66d18bbb28c61ff838594e6f9ec9e9e8e18d3 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Fri, 10 Apr 2026 22:21:40 -0400 Subject: [PATCH 16/29] Add certifi dependency for verified HTTPS in retrieval --- pyproject.toml | 1 + uv.lock | 2 ++ 2 files changed, 3 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 5de94beaa..b20e5e498 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,6 +12,7 @@ description = "Add your description here" readme = "INSTRUCTIONS.md" requires-python = ">=3.12" dependencies = [ + "certifi>=2024.8.30", "couchdb3>=2.0.2", "fastmcp>=2.14.5", "mcp[cli]>=1.26.0", diff --git a/uv.lock b/uv.lock index 75205656c..290b1429e 100644 --- a/uv.lock +++ b/uv.lock @@ -153,6 +153,7 @@ name = "assetopsbench-mcp" version = "0.1.0" source = { editable = "." } dependencies = [ + { name = "certifi" }, { name = "claude-agent-sdk" }, { name = "couchdb3" }, { name = "datasets" }, @@ -184,6 +185,7 @@ tsfm = [ [package.metadata] requires-dist = [ + { name = "certifi", specifier = ">=2024.8.30" }, { name = "claude-agent-sdk", specifier = ">=0.0.14" }, { name = "couchdb3", specifier = ">=2.0.2" }, { name = "datasets", specifier = ">=4.8.4" }, From 379fd1384d7c4b6fd741ceaa6f77e570722af7d1 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Fri, 10 Apr 2026 22:21:43 -0400 Subject: [PATCH 17/29] Add Semantic Scholar retrieval, research digest synthesis, and PDF probing --- src/scenarios/README.md | 62 ++-- src/scenarios/constraints/policies.py | 5 - src/scenarios/constraints/validation.py | 2 - src/scenarios/generator/agent.py | 144 +++++++-- src/scenarios/generator/cli.py | 49 ++- src/scenarios/generator/prompt_helpers.py | 39 --- src/scenarios/grounding.py | 10 - src/scenarios/models.py | 10 +- src/scenarios/prompts/__init__.py | 21 +- src/scenarios/prompts/asset_profile.py | 13 +- src/scenarios/prompts/research_digest.py | 73 +++++ src/scenarios/prompts/retrieval.py | 75 ++++- src/scenarios/retrieval/__init__.py | 10 +- src/scenarios/retrieval/arxiv.py | 54 +++- src/scenarios/retrieval/base.py | 20 ++ src/scenarios/retrieval/digest.py | 150 +++++++++ src/scenarios/retrieval/pdf_http.py | 58 ++++ src/scenarios/retrieval/pipeline.py | 279 ++++++++++++----- src/scenarios/retrieval/semantic_scholar.py | 322 ++++++++++++++++++++ src/scenarios/text.py | 8 + src/scenarios/utils.py | 17 +- 21 files changed, 1196 insertions(+), 225 deletions(-) create mode 100644 src/scenarios/prompts/research_digest.py create mode 100644 src/scenarios/retrieval/base.py create mode 100644 src/scenarios/retrieval/digest.py create mode 100644 src/scenarios/retrieval/pdf_http.py create mode 100644 src/scenarios/retrieval/semantic_scholar.py diff --git a/src/scenarios/README.md b/src/scenarios/README.md index 8ca14fa32..34bc6c7ec 100644 --- a/src/scenarios/README.md +++ b/src/scenarios/README.md @@ -9,6 +9,11 @@ The generator works in two modes: > **Open-form disclaimer:** For grounded `open_form` runs (`--data-in-couchdb`), configure `.env` (or the process environment) so **`IOT_DBNAME`**, **`WO_DBNAME`**, and **`VIBRATION_DBNAME`** each point to live CouchDB databases that actually contain data relevant to the **asset name** you pass on the CLI (for example `"Transformer"` or `"Motor"`). If these names point at the wrong or empty databases, IoT, work-order, and vibration grounding will be misleading or sparse for that asset. +> **Academic retrieval and research digest:** Asset profile construction (Phase 1) runs **grounded discovery** first (full CouchDB IoT/vibration/FMSR discovery only when **`--data-in-couchdb`** is set), then **academic evidence retrieval**, then a **two-step research digest** (per-paper structured extraction, then merge into one Markdown brief), unless you supply a precomputed digest (see below). The `--retriever` flag selects the search backend; default is **`arxiv`**. Use **`--retriever semantic_scholar`** for Semantic Scholar instead. +> +> **Semantic Scholar retrieval:** When using `--retriever semantic_scholar`, set **`SEMANTIC_SCHOLAR_API_KEY`** in `.env` (optional but recommended for higher API rate limits). The CLI does not accept the key as a flag; only the environment variable is read. If unset, the public rate limits apply. +> +> **Precomputed research digest:** Pass **`--research-digest PATH`** to a Markdown file that already contains the merged research brief. If that path exists, the run **skips** academic search, PDF/snippet retrieval, and digest LLM calls, and feeds that file straight into asset profile construction. If the path does not exist, the CLI exits with an error. > For **new asset classes**, add or update **`_ASSET_FAILURE_MODE_ALIASES`** in [`src/servers/fmsr/main.py`](../servers/fmsr/main.py) when the CLI-facing name should map to a different curated failure-mode key in [`failure_modes.yaml`](../servers/fmsr/failure_modes.yaml); otherwise FMSR may fall back to LLM-only failure lists. See **Asset class → curated FMSR failure modes** below for the full picture. @@ -41,8 +46,10 @@ Key flags: | `asset_name` | required | Asset class name, for example `"Motor"` or `"Transformer"` | | `--num-scenarios N` | `50` | Total number of scenarios to generate | | `--model-id MODEL` | project default | LiteLLM model override | +| `--retriever {arxiv,semantic_scholar}` | `arxiv` | Academic search backend for evidence retrieval (omit flag for default) | +| `--research-digest PATH` | unset | If set and the file exists, skip retrieval and digest LLM steps; load this Markdown as the research brief for the asset profile | | `--data-in-couchdb` | off | Enable grounded open-form generation when live IoT inventory exists (requires `.env` DB names; see open-form disclaimer above) | -| `--show-workflow` | off | Print phase-by-phase progress, including live repair counts | +| `--show-workflow` | off | Print phase-by-phase progress (Phases 1–4: asset profile → budget → per-focus generation → multiagent), including live repair counts | | `--log` | off | Write prompts and responses under `logs/` next to `scenarios.json` (same run folder) | Output is always `generated/scenarios/_scenarios_/scenarios.json` (not configurable; slug from [`text.slugify_asset_name`](text.py)). @@ -54,12 +61,15 @@ Examples: # Closed-form, self-contained scenarios only uv run python -m scenarios.generator "Transformer" --num-scenarios 20 -# Grounded open-form with CouchDB-backed IoT data, workflow output, and run logs -uv run python -m scenarios.generator "Transformer" --log --data-in-couchdb +# Grounded open-form: Semantic Scholar retrieval, CouchDB grounding, console workflow, and full disk logs +uv run python -m scenarios.generator "Transformer" --show-workflow --log --data-in-couchdb --retriever "semantic_scholar" # Grounded open-form with verbose workflow (no --log) uv run python -m scenarios.generator "Motor" --data-in-couchdb --show-workflow +# Reuse a saved research digest (skips academic retrieval and digest synthesis) +uv run python -m scenarios.generator "Transformer" --research-digest ./my_digest.md + # Debug run with raw logs (hydraulic pump asset class) uv run python -m scenarios.generator "Hydrolic Pump" --data-in-couchdb --show-workflow --log ``` @@ -77,12 +87,17 @@ scenarios/ │ └── prompt_helpers.py # prompt fragments, default paths, workflow printing ├── grounding.py # IoT inventory, vibration overlay, FMSR mapping; optional failure_mapping/ cache ├── retrieval/ -│ ├── arxiv.py # ArXiv fetch -│ └── pipeline.py # LLM-ranked evidence; public API retrieve_asset_evidence +│ ├── base.py # EvidenceMetadataExecutor protocol +│ ├── arxiv.py # ArXiv metadata + PDF text +│ ├── semantic_scholar.py # Semantic Scholar Graph API +│ ├── pdf_http.py # PDF URL probing and fetch helpers +│ ├── digest.py # synthesize_research_digest (per-paper + merge LLM steps) +│ └── pipeline.py # retrieve_asset_evidence: section-wise search loops, snippets ├── constraints/ │ ├── policies.py # focus policies for prompts │ └── validation.py # deterministic validation / repair loop ├── prompts/ +│ ├── research_digest.py # digest section headings and per-paper / merge prompts │ ├── asset_profile.py │ ├── budget.py │ ├── generation.py @@ -118,10 +133,16 @@ flowchart TD E -->|No| C E -->|Yes| F["Open-form mode"] - C --> G["ArXiv retrieval + evidence ranking"] - F --> G + C --> Rd{"--research-digest
points to existing file?"} + F --> Rd + + Rd -->|Yes| Gp["Load Markdown digest
(skip academic retrieval + digest LLM)"] + Rd -->|No| G["Academic retrieval: bounded search per digest section,
metadata judge, PDF probe, top-PDF snippets"] + + G --> Gm["Research digest: per-paper extraction
then merged Markdown brief"] - G --> H["Asset profile synthesis
description, grounded instances, tasks,
failure mappings, relevant tools, standards"] + Gm --> H["Asset profile synthesis (LLM JSON)
description, grounded instances, tasks,
failure mappings, relevant tools, standards"] + Gp --> H H --> I["Budget allocation
iot / fmsr / tsfm / wo / vibration / multiagent"] I --> J["Few-shot retrieval
HF JSONL pools + local vibration supplement"] @@ -233,13 +254,18 @@ If a run stalls or falls back unexpectedly, inspect: ### 2. Asset profile synthesis -The asset profile combines: +Phase 1 always runs [`discover_grounding`](grounding.py) first (full CouchDB IoT/vibration/FMSR work only when `--data-in-couchdb` is set; otherwise the bundle stays in closed-form shape). Then literature and digest steps depend on **`--research-digest`**: + +- **Precomputed digest:** If `--research-digest PATH` is set and the file exists, academic retrieval and digest LLM calls are skipped; that Markdown is passed into the profile builder as the research brief. +- **Live pipeline:** Otherwise [`retrieve_asset_evidence`](retrieval/pipeline.py) runs. For each merge-section heading in [`prompts/research_digest.py`](prompts/research_digest.py) (for example condition monitoring, maintenance context, sensor modalities, failure modes, standards, operator/manager tasks), the planner issues bounded search queries against the configured backend (`arxiv` default or `semantic_scholar`), judges metadata relevance, keeps candidates whose PDF URLs pass an HTTP probe, downloads up to a few top PDFs, and builds text snippets. [`synthesize_research_digest`](retrieval/digest.py) then runs **per-paper** structured extraction followed by a **merge** pass into one Markdown digest. + +The final [`PROFILE_BUILDER_PROMPT`](prompts/asset_profile.py) call combines: -- grounded live coverage when available -- ArXiv evidence about the physical asset class +- the grounding summary (JSON) +- the merged research digest (Markdown) - available tool descriptions from the MCP servers -The profile includes: +The resulting asset profile includes: - asset-class description - grounded per-instance coverage @@ -331,12 +357,14 @@ Open-form scenarios may require live retrieval, but every concrete identifier mu When `--log` is enabled, prompts and raw responses are written under `generated/scenarios/_scenarios_/logs/`, next to `scenarios.json`. Stage-specific subdirectories mirror the pipeline steps. -Typical files include: +Typical files include (within each stage folder, filenames are prefixed with a per-folder step counter such as `01_`, `02_`): -- `01_grounding/discovery.json` -- `02_retrieval/steps/*.txt` and `02_retrieval/summary.txt` -- `03_asset_profile/prompt.txt`, `03_asset_profile/response.json`, and `03_asset_profile/final_asset_profile.json` -- `04_budget/prompt.txt` and `04_budget/response.json` +- `01_grounding/` — grounded bundle JSON (`discovery.json` stem) +- `02_retrieval/paper_search//step_*.txt` — one bounded ReAct loop per research-digest section; `02_retrieval/paper_search/summary.txt` — final ranked pool and selected PDFs +- optional `02_retrieval/paper_search/raw_arxiv.json` or `raw_semantic_scholar.json` — raw API payloads when using those backends +- `02_retrieval/paper_digest/per_paper_*.txt` and `merged.txt` — produced by live digest synthesis; with **`--research-digest`** there are no per-paper steps, but **`--log`** still writes `merged.txt` from the loaded file +- `03_asset_profile/prompt.txt`, `response.json`, and `final_asset_profile.json` +- `04_budget/prompt.txt` and `response.json` - `05_generation//generation_prompt.txt`, `generation_response.json`, and validate/repair prompts under the same focus folder (including `multiagent`, which uses the multi-agent combiner prompt in the same layout as other focuses) - optional `05_generation//deterministic_failures_attempt_*.json` when validation fails and retries diff --git a/src/scenarios/constraints/policies.py b/src/scenarios/constraints/policies.py index 2beead935..beeb9a193 100644 --- a/src/scenarios/constraints/policies.py +++ b/src/scenarios/constraints/policies.py @@ -13,7 +13,6 @@ def _format_bullet_list(items: Iterable[str]) -> str: return "\n".join(f"- {item}" for item in items) -# Shared across all focuses: injected into prompts via forbidden_patterns. FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT = ( "Do not put MCP tool names, function names, or parenthetical examples like " '"e.g. get_failure_modes tool" in the scenario text; put those only in characteristic_form.' @@ -24,8 +23,6 @@ def _format_bullet_list(items: Iterable[str]) -> str: @dataclass(frozen=True) class FocusPolicy: - """Prompt and validation guidance for one focus.""" - categories: tuple[str, ...] prompt_requirements: tuple[str, ...] forbidden_patterns: tuple[str, ...] @@ -157,8 +154,6 @@ def format_mode_requirements( focus: str, generation_mode: str, ) -> str: - """Return prompt guidance for closed-form vs grounded open-form runs.""" - if generation_mode == "open_form": asset_ids = profile.grounded_asset_ids(focus) sensors = profile.grounded_sensor_names(focus) diff --git a/src/scenarios/constraints/validation.py b/src/scenarios/constraints/validation.py index 192705733..73dd7ab6c 100644 --- a/src/scenarios/constraints/validation.py +++ b/src/scenarios/constraints/validation.py @@ -18,8 +18,6 @@ @dataclass(frozen=True) class ScenarioValidationFailure: - """A scenario plus the deterministic reasons it failed validation.""" - scenario: dict reasons: tuple[str, ...] diff --git a/src/scenarios/generator/agent.py b/src/scenarios/generator/agent.py index af5a79787..f50cc9a23 100644 --- a/src/scenarios/generator/agent.py +++ b/src/scenarios/generator/agent.py @@ -25,8 +25,10 @@ from ..grounding import discover_grounding from ..models import ( AssetProfile, + EvidenceCandidate, GroundingBundle, KeyDescription, + RetrieverMode, Scenario, ScenarioBudget, SensorNameDescription, @@ -38,8 +40,8 @@ SCENARIO_GENERATOR_PROMPT, VALIDATE_REPAIR_PROMPT, ) -from ..retrieval import retrieve_asset_evidence -from ..text import slugify_asset_name +from ..retrieval import retrieve_asset_evidence, synthesize_research_digest +from ..text import slugify_asset_name, truncate_title_one_line from ..utils import fetch_hf_fewshot, parse_llm_json from .prompt_helpers import ( _MULTIAGENT_MAX_TOKENS, @@ -47,7 +49,6 @@ _MAX_SCENARIO_ATTEMPTS, _PROFILE_MAX_TOKENS, _asset_profile_json, - _evidence_summary_for_prompt, _few_shot_examples_section, _grounding_summary_for_prompt, _invert_failure_mapping, @@ -76,8 +77,6 @@ def _scenario_from_llm_row( scenario_type: str, generation_mode: str, ) -> Scenario: - """Build a ``Scenario`` from parsed LLM JSON; drop any ``type`` key so the pipeline value wins.""" - payload = dict(row) payload.pop("type", None) return Scenario(**payload, type=scenario_type, generation_mode=generation_mode) @@ -89,12 +88,17 @@ def __init__( model_id: str = _DEFAULT_MODEL, show_workflow: bool = False, log_dir: str | None = None, + *, + retriever: RetrieverMode = "arxiv", + research_digest_path: str | None = None, ) -> None: _quiet_litellm_logging() self.llm = LiteLLMBackend(model_id=model_id) self.executor = Executor(llm=self.llm) self.show_workflow = show_workflow self.log_dir = log_dir + self.retriever = retriever + self.research_digest_path = research_digest_path self._log_steps_by_subdir: dict[str, int] = {} def _log_path(self, name: str, *, step: int) -> Path: @@ -131,7 +135,7 @@ async def run( asset_name = asset_name.strip() if not asset_name: raise ValueError("Asset class name is empty after stripping whitespace.") - _log.info("Starting scenario generation for asset: %s", asset_name) + _log.debug("Starting scenario generation for asset: %s", asset_name) server_desc = await self.executor.get_server_descriptions() if self.show_workflow: @@ -249,34 +253,121 @@ async def build_asset_profile( f"Grounded instances: {len(grounding.asset_instances)}\n" ) _print_step("grounding", "Grounded discovery complete", details=details) - _print_step("researcher_queries", f"Planning bounded ArXiv retrieval for {asset_name}...") - evidence_bundle = retrieve_asset_evidence( - asset_name=asset_name, - server_desc=server_desc, - llm=self.llm, - log_writer=self._write_log, - ) + preload = self.research_digest_path + if preload: + digest_path = Path(preload) + if not digest_path.is_file(): + raise FileNotFoundError( + f"Research digest file not found: {digest_path}. " + "Omit --research-digest or provide a valid path to skip retrieval." + ) + research_digest = digest_path.read_text(encoding="utf-8") + if self.log_dir: + self._write_log( + "02_retrieval/paper_digest/merged.txt", + research_digest.strip(), + ) + if self.show_workflow: + _print_step( + "research_digest", + "Loaded precomputed research digest (retrieval and digest LLM steps skipped)", + details=str(digest_path.resolve()), + ) + else: + if self.show_workflow: + _print_step( + "researcher_queries", + f"Planning bounded academic literature retrieval for {asset_name}...", + ) - if self.show_workflow: - top_titles = "\n".join( - f" - {candidate.title} (judge_score={candidate.judge_score}/10)" - for candidate in evidence_bundle.candidates[:3] - ) or " - No ranked candidates" - details = ( - f"Canonical asset: {evidence_bundle.canonical_asset_name}\n" - f"Queries:\n" - + "\n".join(f" - {query}" for query in evidence_bundle.query_history) - + "\nTop Evidence:\n" - + top_titles + on_pdf_workflow = None + on_academic_query = None + if self.show_workflow: + _pdf_ok_logged: set[str] = set() + + def _on_academic_query(query: str, n_results: int) -> None: + _print_step( + "academic_query", + f"Query: {query!r}", + details=f"Results: {n_results} paper(s) from metadata search", + ) + + def _on_pdf_workflow( + candidate: EvidenceCandidate, phase: str, outcome: str + ) -> None: + title = truncate_title_one_line(candidate.title) + pid = candidate.paper_id + if outcome == "ok": + if pid in _pdf_ok_logged: + return + _pdf_ok_logged.add(pid) + _print_step( + "pdf_fetch", + f'Paper "{title}" — PDF text loaded', + details=f"paper_id={pid}\nphase={phase}", + ) + return + label = { + "no_pdf_url": "No PDF URL (no open-access direct link resolved from metadata)", + "fetch_failed": "PDF fetch failed or URL not a usable PDF stream", + "empty_text": "PDF downloaded but extractable text is empty", + }.get(outcome, outcome) + _print_step( + "pdf_fetch", + f'Paper "{title}" — {label}', + details=f"paper_id={pid}\nphase={phase}\noutcome={outcome}", + ) + + on_pdf_workflow = _on_pdf_workflow + on_academic_query = _on_academic_query + + evidence_bundle = retrieve_asset_evidence( + asset_name=asset_name, + server_desc=server_desc, + llm=self.llm, + log_writer=self._write_log, + retriever=self.retriever, + on_pdf_workflow=on_pdf_workflow, + on_academic_query=on_academic_query, ) - _print_step("arxiv_search_result", "ArXiv evidence retrieval complete", details=details) + + if self.show_workflow: + top_titles = "\n".join( + f" - {candidate.title} (judge_score={candidate.judge_score}/10)" + for candidate in evidence_bundle.candidates[:3] + ) or " - No ranked candidates" + details = ( + f"Canonical asset: {evidence_bundle.canonical_asset_name}\n" + f"Queries:\n" + + "\n".join(f" - {query}" for query in evidence_bundle.query_history) + + "\nTop Evidence:\n" + + top_titles + ) + _print_step( + "evidence_retrieval", + "Academic search engine evidence retrieval complete", + details=details, + ) + + research_digest = synthesize_research_digest( + evidence_bundle, + self.llm, + retriever=self.retriever, + log_writer=self._write_log, + on_pdf_workflow=on_pdf_workflow, + ) + if self.show_workflow: + _print_step( + "research_digest", + "Research digest synthesis complete (per-paper extraction + merge)", + ) prompt = PROFILE_BUILDER_PROMPT.format( asset_name=asset_name, generation_mode=generation_mode, grounding_summary_json=_grounding_summary_for_prompt(grounding), - evidence_summary_json=_evidence_summary_for_prompt(evidence_bundle), + research_digest=research_digest, tool_descriptions=_tool_summary_for_prompt(server_desc), ) self._write_log("03_asset_profile/prompt.txt", prompt) @@ -399,7 +490,6 @@ def _merge_profile( merged["relevant_tools"] = normalized_relevant merged["operator_tasks"] = _require_nonempty_list(merged.get("operator_tasks"), field="operator_tasks") merged["manager_tasks"] = _require_nonempty_list(merged.get("manager_tasks"), field="manager_tasks") - merged["iso_standards"] = _require_nonempty_list(merged.get("iso_standards"), field="iso_standards") return AssetProfile(**merged) async def allocate_budget(self, profile: AssetProfile, total: int = 50) -> ScenarioBudget: diff --git a/src/scenarios/generator/cli.py b/src/scenarios/generator/cli.py index 52949807f..8db214e35 100644 --- a/src/scenarios/generator/cli.py +++ b/src/scenarios/generator/cli.py @@ -25,23 +25,51 @@ def main() -> None: parser.add_argument("--model-id", default=_DEFAULT_MODEL, help="Model ID for LiteLLM") parser.add_argument("--num-scenarios", type=int, default=50, help="Total number of scenarios to generate") parser.add_argument("--show-workflow", action="store_true", help="Show intermediate pipeline steps in the console") - parser.add_argument("--log", action="store_true", help="Dump raw prompts and results to a log directory") + parser.add_argument( + "--log", + action="store_true", + help=( + "Write prompts and pipeline artifacts under the run directory (generated/scenarios/.../logs/). " + "Does not change console output; use --show-workflow for step-by-step terminal output." + ), + ) parser.add_argument( "--data-in-couchdb", action="store_true", help="Use grounded open-form generation when matching live CouchDB-backed asset data is available", ) + parser.add_argument( + "--retriever", + choices=("arxiv", "semantic_scholar"), + default="arxiv", + help=( + "Optional. Academic search backend for Phase 1 evidence retrieval. " + "Default is arxiv when this flag is omitted." + ), + ) + parser.add_argument( + "--research-digest", + metavar="PATH", + default=None, + help=( + "Optional. Path to a precomputed research digest (Markdown). When set and the file exists, " + "skips academic retrieval and digest LLM steps; loads this text for asset profile construction." + ), + ) args = parser.parse_args() output_path = default_scenario_output_path(args.asset_name) - # With --show-workflow alone, keep the root logger quiet (WARNING). When - # --data-in-couchdb is also set, Phase 1 runs FMSR mapping (per-pair LLM work - # inside the server); use INFO so `scenarios.grounding` can log progress. - if args.show_workflow and not args.data_in_couchdb: + # stderr: `--show-workflow` owns the console (`_print_step`); keep root at + # WARNING so `_log.info(...)` from agent/grounding/retrieval never mixes in. + # Without `--show-workflow`, `--data-in-couchdb` raises to INFO so + # `scenarios.grounding` can emit FMSR/discovery progress on stderr. + if args.show_workflow: level = logging.WARNING - else: + elif args.data_in_couchdb: level = logging.INFO + else: + level = logging.WARNING # Imported MCP server modules (e.g. servers.fmsr.main) call basicConfig(WARNING) # at import time; without force=True, this CLI's basicConfig would be a no-op. logging.basicConfig( @@ -56,10 +84,15 @@ def main() -> None: log_dir = None if args.log: log_dir = str(output_path.parent / "logs") - print(f"Logging session to: {log_dir}") os.makedirs(log_dir, exist_ok=True) - agent = ScenarioGeneratorAgent(model_id=args.model_id, show_workflow=args.show_workflow, log_dir=log_dir) + agent = ScenarioGeneratorAgent( + model_id=args.model_id, + show_workflow=args.show_workflow, + log_dir=log_dir, + retriever=args.retriever, + research_digest_path=args.research_digest, + ) try: final_scenarios = asyncio.run( diff --git a/src/scenarios/generator/prompt_helpers.py b/src/scenarios/generator/prompt_helpers.py index 599d071ee..dbc1186c4 100644 --- a/src/scenarios/generator/prompt_helpers.py +++ b/src/scenarios/generator/prompt_helpers.py @@ -16,14 +16,6 @@ def _quiet_litellm_logging() -> None: - """Raise LiteLLM library loggers to WARNING. - - litellm._logging uses logger names ``LiteLLM``, ``LiteLLM Proxy``, and - ``LiteLLM Router`` (not ``litellm``). Those loggers attach their own - StreamHandler, so per-completion INFO lines appear even when the root - logger is WARNING unless these loggers are adjusted. - """ - for name in ("LiteLLM", "LiteLLM Proxy", "LiteLLM Router"): logging.getLogger(name).setLevel(logging.WARNING) @@ -33,7 +25,6 @@ def _quiet_litellm_logging() -> None: def _multiagent_budget_cap(total: int) -> int: - """Maximum multiagent scenarios: floor(75% of total).""" if total <= 1: return total return (total * 3) // 4 @@ -41,9 +32,6 @@ def _multiagent_budget_cap(total: int) -> int: _PROFILE_MAX_TOKENS = 4096 _MULTIAGENT_MAX_TOKENS = 4096 -_MAX_PROFILE_CANDIDATES = 5 -_MAX_PROFILE_SNIPPETS = 6 -_MAX_PROFILE_SNIPPET_CHARS = 700 DEFAULT_GENERATED_SCENARIOS_DIR = Path("generated/scenarios") @@ -234,33 +222,6 @@ def _grounding_summary_for_prompt(grounding: GroundingBundle) -> str: return json.dumps(summary, indent=2) -def _evidence_summary_for_prompt(evidence_bundle) -> str: - summary = { - "asset_name": evidence_bundle.asset_name, - "canonical_asset_name": evidence_bundle.canonical_asset_name, - "query_history": evidence_bundle.query_history, - "top_candidates": [ - { - "title": candidate.title, - "query": candidate.query, - "judge_score": candidate.judge_score, - "judge_reason": candidate.judge_reason, - "published": candidate.published, - } - for candidate in evidence_bundle.candidates[:_MAX_PROFILE_CANDIDATES] - ], - "snippets": [ - { - "title": snippet.title, - "source": snippet.source, - "text": snippet.text[:_MAX_PROFILE_SNIPPET_CHARS], - } - for snippet in evidence_bundle.snippets[:_MAX_PROFILE_SNIPPETS] - ], - } - return json.dumps(summary, indent=2) - - def _tool_summary_for_prompt(server_desc: dict) -> str: compact = { focus: _tool_names_from_description(description) diff --git a/src/scenarios/grounding.py b/src/scenarios/grounding.py index 0bad9d109..187724a63 100644 --- a/src/scenarios/grounding.py +++ b/src/scenarios/grounding.py @@ -16,7 +16,6 @@ _log = logging.getLogger(__name__) -# One JSON file per asset class name: ``failure_mapping/.json`` (next to this package). _FAILURE_MAPPING_DIR = Path(__file__).resolve().parent / "failure_mapping" @@ -87,7 +86,6 @@ def _as_mapping(result: Any) -> dict[str, Any]: def _iot_timestamp_to_str(value: Any) -> str | None: - """Normalize CouchDB timestamp values for ``GroundedTimeRange`` (strings or datetimes).""" if value is None: return None if isinstance(value, str): @@ -99,7 +97,6 @@ def _iot_timestamp_to_str(value: Any) -> str | None: def _discover_iot_inventory_and_instances() -> tuple[list[AssetInstance], list[str]]: - """At SITE_NAME: all CouchDB asset ids; IoT sensor names are unioned once (not per instance).""" instances: list[AssetInstance] = [] iot_union: set[str] = set() @@ -114,7 +111,6 @@ def _discover_iot_inventory_and_instances() -> tuple[list[AssetInstance], list[s end=_iot_timestamp_to_str(tr_raw.get("end")), total_observations=int(tr_raw.get("total_observations") or 0), ) - # Here, we assume the defintion of "MAIN" as the only site (as defined in IoT server) instances.append( AssetInstance( site_name=SITES[0], @@ -142,7 +138,6 @@ def _overlay_vibration( instances: list[AssetInstance], vib_by_key: dict[tuple[str, str], dict[str, Any]], ) -> list[str]: - """Attach vibration time ranges per instance; return union of vibration sensor names.""" vib_union: set[str] = set() for inst in instances: row = vib_by_key.get((inst.site_name, inst.asset_id)) @@ -230,11 +225,6 @@ def _build_failure_sensor_grounding( def discover_grounding(asset_name: str, requested_open_form: bool = False) -> GroundingBundle: - """Collect grounded asset coverage for open-form scenario generation. - - ``asset_name`` is the CLI asset label (used for FMSR and prompts). - """ - if not requested_open_form: return GroundingBundle(asset_name=asset_name, requested_open_form=False) diff --git a/src/scenarios/models.py b/src/scenarios/models.py index be0ecd657..3afaeb651 100644 --- a/src/scenarios/models.py +++ b/src/scenarios/models.py @@ -9,6 +9,10 @@ ScenarioTypeKey = Literal["iot", "fmsr", "tsfm", "wo", "vibration", "multiagent"] +RetrieverMode = Literal["arxiv", "semantic_scholar"] + +PdfTextOutcome = Literal["ok", "fetch_failed", "empty_text"] + class KeyDescription(BaseModel): """A named item with a short human-readable description.""" @@ -76,7 +80,6 @@ class AssetProfile(BaseModel): relevant_tools: dict[str, list[dict[str, str]]] = Field(default_factory=dict) operator_tasks: list[str] = Field(default_factory=list) manager_tasks: list[str] = Field(default_factory=list) - iso_standards: list[str] = Field(default_factory=list) def instances_for_focus(self, focus: str) -> list[AssetInstance]: """Return grounded instances that can support the requested focus.""" @@ -146,7 +149,7 @@ class RetrievalAction(BaseModel): class EvidenceCandidate(BaseModel): """Metadata for one potentially relevant paper or evidence source.""" - arxiv_id: str + paper_id: str title: str summary: str query: str @@ -159,7 +162,7 @@ class EvidenceCandidate(BaseModel): class EvidenceSnippet(BaseModel): """Extracted evidence text used to justify an asset profile.""" - arxiv_id: str + paper_id: str title: str url: str | None = None source: str @@ -217,6 +220,7 @@ def to_dict(self) -> dict[str, Any]: "GroundingBundle", "KeyDescription", "RetrievalAction", + "RetrieverMode", "Scenario", "ScenarioBudget", "ScenarioTypeKey", diff --git a/src/scenarios/prompts/__init__.py b/src/scenarios/prompts/__init__.py index 662bc55b0..627269ca0 100644 --- a/src/scenarios/prompts/__init__.py +++ b/src/scenarios/prompts/__init__.py @@ -7,14 +7,33 @@ SCENARIO_GENERATOR_PROMPT, VALIDATE_REPAIR_PROMPT, ) -from .retrieval import RETRIEVAL_METADATA_JUDGE_PROMPT, RETRIEVAL_QUERY_PLAN_PROMPT +from .research_digest import ( + RESEARCH_DIGEST_HEADINGS_MARKDOWN, + RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN, + RESEARCH_DIGEST_MERGE_SECTION_HEADINGS, + RESEARCH_DIGEST_SECTION_HEADINGS, + RESEARCH_MERGE_PROMPT, + RESEARCH_PER_PAPER_PROMPT, +) +from .retrieval import ( + RETRIEVAL_METADATA_JUDGE_PROMPT, + RETRIEVAL_QUERY_PLAN_PROMPT, + RETRIEVAL_QUERY_PLAN_PROMPT_SECTION, +) __all__ = [ "BUDGET_ALLOCATOR_PROMPT", "MULTIAGENT_COMBINER_PROMPT", "PROFILE_BUILDER_PROMPT", + "RESEARCH_DIGEST_HEADINGS_MARKDOWN", + "RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN", + "RESEARCH_DIGEST_MERGE_SECTION_HEADINGS", + "RESEARCH_DIGEST_SECTION_HEADINGS", + "RESEARCH_MERGE_PROMPT", + "RESEARCH_PER_PAPER_PROMPT", "RETRIEVAL_METADATA_JUDGE_PROMPT", "RETRIEVAL_QUERY_PLAN_PROMPT", + "RETRIEVAL_QUERY_PLAN_PROMPT_SECTION", "SCENARIO_GENERATOR_PROMPT", "VALIDATE_REPAIR_PROMPT", ] diff --git a/src/scenarios/prompts/asset_profile.py b/src/scenarios/prompts/asset_profile.py index f9dc41190..64c56562a 100644 --- a/src/scenarios/prompts/asset_profile.py +++ b/src/scenarios/prompts/asset_profile.py @@ -11,8 +11,8 @@ Grounded Coverage Summary: {grounding_summary_json} -Structured Evidence Summary: -{evidence_summary_json} +Research Digest: +{research_digest} Available Subagent Tools: {tool_descriptions} @@ -25,14 +25,14 @@ - Keep the response concise. Do NOT restate asset instances, asset_name, or generation_mode. - In open_form mode, treat grounded live coverage as the source of truth for concrete site names, asset ids, sensor keys (listed under `iot_sensors` / `vibration_sensors` in the summary), per-asset time ranges, and timestamps. - In closed_form mode, assume scenarios must be self-contained: the query text should list explicit sensor readings (sensor name, numeric value, unit), and may include rules or dataset names when relevant. -- Use the evidence summary as the primary source of truth for asset-class understanding, operator workflows, monitoring practices, and standards. +- Use the research digest as the primary source of truth for asset-class understanding, operator workflows, monitoring practices, and standards. - Do NOT return `failure_sensor_mapping` or `sensor_failure_mapping`. - Use `iot_sensors` and `vibration_sensors` as separate lists of objects, each with `name` and `description` (what it measures). The system merges these with sensor name strings from the grounding summary in code (every IoT name from the summary must appear under `iot_sensors`; every vibration name from the summary under `vibration_sensors`). - Use `failure_modes` the same way as before: list of `{{"key": "...", "description": "..."}}`. The system merges with grounded failure modes and F2S/S2F mappings in code (mappings use keys only). - Include multiple relevant tools per focus when the toolset clearly supports more than one important action for that focus. - Use an empty array [] for `vibration_sensors` when vibration sensing does not apply; use [] for `iot_sensors` only when the asset truly has no IoT channels in the grounded summary. -- Only include sensor descriptions, failure mode descriptions, task types, and standards that are clearly supported by the evidence summary, grounded coverage summary, or tool definitions. -- If evidence is sparse, stay conservative rather than inventing highly specific details. +- Only include sensor descriptions, failure mode descriptions, and task types that are clearly supported by the research digest, grounded coverage summary, or tool definitions. +- If the research digest is sparse, stay conservative rather than inventing highly specific details. - The profile must represent the physical industrial asset class itself, not surrounding digital, networking, cyber, or facility infrastructure. - Add realistic tasks from the point of view of industrial asset operator and the operator's manager. - Include vibration tools only when vibration analysis is relevant to the asset class or grounded data; otherwise use [] for "vibration". @@ -71,7 +71,6 @@ ] }}, "operator_tasks": ["task phrased from the operator point of view"], - "manager_tasks": ["task phrased from the manager point of view"], - "iso_standards": ["list 2-3 relevant ISO, IEC, IEEE, or engineering conventions"] + "manager_tasks": ["task phrased from the manager point of view"] }} """ diff --git a/src/scenarios/prompts/research_digest.py b/src/scenarios/prompts/research_digest.py new file mode 100644 index 000000000..90cf904a8 --- /dev/null +++ b/src/scenarios/prompts/research_digest.py @@ -0,0 +1,73 @@ +"""Research digest section headings and merge/per-paper prompts.""" + +from __future__ import annotations + +RESEARCH_DIGEST_SECTION_HEADINGS: tuple[str, ...] = ( + "Condition monitoring, diagnostics, and degradation indicators", + "Maintenance practices, scheduling, and work-order–relevant context", + "Sensor modalities, measurements, and signal interpretation", + "Failure modes, faults, and operational risks", + "Applicable standards, norms, or industry conventions (when mentioned)", + "Operator- and manager-style tasks phrased in natural language", + "Gaps / not supported by this paper", +) + +RESEARCH_DIGEST_HEADINGS_MARKDOWN = "\n".join(f"## {title}\n" for title in RESEARCH_DIGEST_SECTION_HEADINGS) + +RESEARCH_DIGEST_MERGE_SECTION_HEADINGS: tuple[str, ...] = RESEARCH_DIGEST_SECTION_HEADINGS[:-1] +RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN = "\n".join(f"## {title}\n" for title in RESEARCH_DIGEST_MERGE_SECTION_HEADINGS) + +RESEARCH_PER_PAPER_PROMPT = """\ +You are extracting industrial asset lifecycle management (IALM) knowledge from one academic paper +(condition monitoring, maintenance, sensors, work orders, failure modes, standards) for downstream +scenario generation. + +Asset class name: {asset_name} +Canonical asset name: {canonical_asset_name} + +Use ONLY the source text below. Do not invent citations, paper titles, or external paper/repository IDs. +If a section has no relevant content in the source, write a short line such as "Not supported by this +paper." under that heading. + +Output MUST use exactly these section headings (Markdown ##), in this order: + +{headings_markdown} + +Under each heading, use short bullet points or 1–2 sentences. No JSON. + +--- SOURCE TEXT (may be truncated) --- +{body_text} +--- END SOURCE TEXT --- +""" + +RESEARCH_MERGE_PROMPT = """\ +You merge several per-paper research digests into one coherent research brief for the same asset class. + +Asset class name: {asset_name} +Canonical asset name: {canonical_asset_name} + +Goals: +- Deduplicate overlapping facts; reconcile minor contradictions conservatively (prefer explicit wording + from the digests; if sources conflict, say so briefly). +- Every section below must have substantive content. Where the per-paper digests are empty, sparse, or + only say things like "Not supported by this paper" for a heading, fill that section to the best of + your general knowledge for this asset class and typical industrial IALM practice. Do not leave + sections blank or stub-only when you can reasonably supply domain-appropriate detail; do not + contradict what the digests do state. When you supplement beyond the papers, keep wording factual + and typical (not speculative edge cases); you may briefly note that a point is general domain + context if it was not clearly grounded in the digests. +- Keep content focused on physical industrial assets, operations, and IALM (not generic ML methods, + cyber-only, or unrelated domains). +- Produce text that will help generate realistic operator/manager natural-language scenarios + (including plausible sensor interpretations, tasks, and failure contexts). + +Output format: Markdown with exactly these top-level section headings (##), in this order: + +{merge_headings_markdown} + +Do not include paper titles, database IDs, or DOIs in the output. + +--- PER-PAPER DIGESTS --- +{per_paper_digests} +--- END PER-PAPER DIGESTS --- +""" diff --git a/src/scenarios/prompts/retrieval.py b/src/scenarios/prompts/retrieval.py index fb14ddf96..6795f3b47 100644 --- a/src/scenarios/prompts/retrieval.py +++ b/src/scenarios/prompts/retrieval.py @@ -1,9 +1,9 @@ -"""Prompts used by the bounded ArXiv retrieval workflow.""" +"""Prompts used by the bounded academic-search retrieval workflow.""" RETRIEVAL_QUERY_PLAN_PROMPT = """\ You are a bounded ReAct retrieval agent for industrial asset research. -You do not call ArXiv directly. The host executes searches for you and returns metadata summaries. +You do not call an academic search engine directly. The host runs searches for you and returns paper metadata summaries. At each step, decide whether to search again or finish with the best candidates found so far. Asset Name: {asset_name} @@ -24,8 +24,8 @@ "action": "search" or "finish", "reason": "brief explanation", "canonical_asset_name": "canonical industrial equipment term", - "queries": ["1 to 2 new ArXiv queries if action=search, otherwise []"], - "selected_ids": ["preferred arxiv ids if action=finish, otherwise []"] + "queries": ["1 to 2 new search queries for the academic search engine if action=search, otherwise []"], + "selected_ids": ["preferred paper_id values if action=finish, otherwise []"] }} Constraints: @@ -36,6 +36,7 @@ - If the asset name is ambiguous, resolve it toward the physical equipment noun phrase, not an ML concept and not a broader system context. - Normalize queries toward the physical equipment itself. For example, "smart grid transformer" should be treated as a transformer or power transformer in a smart-grid context, not as the smart grid itself. - Queries should focus on physical asset monitoring, diagnostics, failures, maintenance, condition assessment, degradation, or reliability. +- When it fits the asset class, prefer query ingredients such as: Industry 4.0 or IIoT in a plant context; physical sensors (e.g. vibration, temperature, pressure, current, partial discharge); and relevant standards (ISO, IEC, IEEE) only when tied to that equipment—do not stuff acronyms into every query. - Prefer equipment-specific queries such as "power transformer condition monitoring" or "power transformer fault diagnosis". - Avoid broad or ambiguous queries like "transformer reliability" or "smart grid transformer monitoring" when a more equipment-specific query is possible. - Do not drift into smart-grid cyberattacks, communications, networking, markets, data architecture, control systems, or generic ML "Transformer" papers. @@ -43,12 +44,65 @@ - When action is "finish", prefer the strongest already judged metadata and do not propose new queries. - Only finish early if the current top results already contain at least two clearly physical-asset-focused papers. - Do not use advanced boolean syntax. -- Do not invent arxiv ids that are not present in Current Top Judged Results. +- Do not invent paper_id values that are not present in Current Top Judged Results. +- Output ONLY raw JSON. +""" + +RETRIEVAL_QUERY_PLAN_PROMPT_SECTION = """\ +You are a bounded ReAct retrieval agent for industrial asset research. + +You do not call an academic search engine directly. The host runs searches for you and returns paper metadata summaries. +At each step, decide whether to search again or finish with the best candidates found so far. + +This retrieval pass is scoped to ONE subsection of a downstream research digest. Bias every search query toward +that facet of knowledge (not generic background). You will run again for other subsections separately. + +Section focus (this pass only): {section_heading} + +Asset Name: {asset_name} +Current Step: {step_number} of {max_steps} +Current Canonical Asset Name: {canonical_asset_name} + +Available Subagent Tools: +{tool_descriptions} + +Previous Queries (this section only): +{previous_queries} + +Current Top Judged Results (this section only): +{current_results_summary} + +Return ONLY a raw JSON object in this shape: +{{ + "action": "search" or "finish", + "reason": "brief explanation", + "canonical_asset_name": "canonical industrial equipment term", + "queries": ["1 to 2 new search queries for the academic search engine if action=search, otherwise []"], + "selected_ids": ["preferred paper_id values if action=finish, otherwise []"] +}} + +Constraints: +- Keep the process generic for any industrial asset class. +- An industrial asset class is a physical piece of equipment or subsystem that is monitored, maintained, and can fail. +- Examples of industrial asset classes: chiller, air handling unit, pump, motor, power transformer. +- Context words like smart grid, plant, facility, building, line, or substation describe the deployment environment, not the asset class itself. +- If the asset name is ambiguous, resolve it toward the physical equipment noun phrase, not an ML concept and not a broader system context. +- Normalize queries toward the physical equipment itself. For example, "smart grid transformer" should be treated as a transformer or power transformer in a smart-grid context, not as the smart grid itself. +- Queries in this pass must align with the section focus above (e.g. maintenance scheduling vs sensor modalities vs failure modes vs standards). Still describe the physical asset explicitly. +- When it fits the asset class, prefer query ingredients such as: Industry 4.0 or IIoT in a plant context; physical sensors (e.g. vibration, temperature, pressure, current, partial discharge); and relevant standards (ISO, IEC, IEEE) only when tied to that equipment—do not stuff acronyms into every query. +- Prefer equipment-specific queries such as "power transformer condition monitoring" or "power transformer fault diagnosis". +- Avoid broad or ambiguous queries like "transformer reliability" or "smart grid transformer monitoring" when a more equipment-specific query is possible. +- Do not drift into smart-grid cyberattacks, communications, networking, markets, data architecture, control systems, or generic ML "Transformer" papers. +- When action is "search", propose 1 to 2 short queries only. +- When action is "finish", prefer the strongest already judged metadata and do not propose new queries. +- Only finish early if the current top results already contain at least two clearly physical-asset-focused papers. +- Do not use advanced boolean syntax. +- Do not invent paper_id values that are not present in Current Top Judged Results. - Output ONLY raw JSON. """ RETRIEVAL_METADATA_JUDGE_PROMPT = """\ -You are a relevance judge for ArXiv metadata retrieved for industrial asset scenario generation. +You are a relevance judge for paper metadata from an academic search engine, retrieved for industrial asset scenario generation. Your task is to score how useful each metadata entry is for building an asset profile for the physical industrial asset below. Judge from the title and summary only. @@ -62,7 +116,7 @@ Return ONLY a raw JSON array. One object per metadata entry: [ {{ - "arxiv_id": "entry id", + "paper_id": "entry id (must match the paper_id in the metadata entry)", "score_1_to_10": 8, "reason": "short reason" }} @@ -70,8 +124,8 @@ Scoring guide: - Core question: would this paper help define the physical asset class itself and its maintenance, monitoring, sensing, degradation, diagnostics, or failure behavior? -- High score when the paper is clearly about the physical asset and would help populate sensor mappings, known failure modes, relevant tools, maintenance workflows, or standards. -- 9-10: directly about the physical asset and clearly useful for condition monitoring, fault diagnosis, degradation, insulation or thermal behavior, reliability, maintenance, standards, or physical measurements +- High score when the paper is clearly about the physical asset and would help populate sensor mappings (modalities, placement, or signal interpretation), known failure modes, relevant tools, maintenance workflows, or applicable standards for that equipment. +- 9-10: directly about the physical asset and clearly useful for condition monitoring, fault diagnosis, degradation, insulation or thermal behavior, reliability, maintenance, standards (ISO/IEC/IEEE where relevant), physical measurements, or industrial sensing/IIoT for the asset—not generic ML method papers - 6-8: relevant to the physical asset but somewhat indirect, narrower than ideal, or missing strong maintenance or diagnostics detail - 3-5: mixed relevance, generic system context, or only weakly connected to the physical asset itself - 1-2: not about the physical asset itself, clearly about a different asset family, or dominated by unrelated ML/system context @@ -86,7 +140,8 @@ - fault diagnosis - degradation, insulation, or thermal behavior - reliability, maintenance, or standards - - sensors and measurements for the physical equipment + - sensors and measurements for the physical equipment (including vibration, thermal, electrical, or process variables as they relate to the asset) + - Industry 4.0 or IIoT when the work centers on the physical asset and its monitoring, not on abstract IT architecture alone - In every reason, explicitly include either the phrase "physical asset focused" or the phrase "not physical asset focused". - If the paper is off-target, say why in physical-asset terms. diff --git a/src/scenarios/retrieval/__init__.py b/src/scenarios/retrieval/__init__.py index fdc9c831b..f0a5a6c8f 100644 --- a/src/scenarios/retrieval/__init__.py +++ b/src/scenarios/retrieval/__init__.py @@ -1,5 +1,13 @@ """Evidence retrieval stage for scenario generation.""" +from ..models import RetrieverMode +from .base import EvidenceMetadataExecutor +from .digest import synthesize_research_digest from .pipeline import retrieve_asset_evidence -__all__ = ["retrieve_asset_evidence"] +__all__ = [ + "EvidenceMetadataExecutor", + "RetrieverMode", + "retrieve_asset_evidence", + "synthesize_research_digest", +] diff --git a/src/scenarios/retrieval/arxiv.py b/src/scenarios/retrieval/arxiv.py index c00e6b1b7..022ae3cc4 100644 --- a/src/scenarios/retrieval/arxiv.py +++ b/src/scenarios/retrieval/arxiv.py @@ -3,7 +3,9 @@ from __future__ import annotations import io +import json import logging +from collections.abc import Callable import ssl import time import urllib.error @@ -11,7 +13,8 @@ import urllib.request import xml.etree.ElementTree as ET -from ..models import EvidenceCandidate +from ..models import EvidenceCandidate, PdfTextOutcome +from .pdf_http import fetch_pdf_bytes _log = logging.getLogger(__name__) @@ -64,6 +67,8 @@ "ieee", "iso", "condition assessment", + "industry 4.0", + "iiot", "maintenance strategy", "reliability centered maintenance", ] @@ -127,9 +132,12 @@ class _ArxivExecutor: - """Single-entry executor that enforces a cooldown before every ArXiv request.""" - - def __init__(self, cooldown_seconds: float = _ARXIV_COOLDOWN_SECONDS) -> None: + def __init__( + self, + cooldown_seconds: float = _ARXIV_COOLDOWN_SECONDS, + *, + log_writer: Callable[[str, str], None] | None = None, + ) -> None: self.cooldown_seconds = cooldown_seconds self._last_request_at: float | None = None self.metadata_requests = 0 @@ -137,6 +145,7 @@ def __init__(self, cooldown_seconds: float = _ARXIV_COOLDOWN_SECONDS) -> None: self._ctx = ssl.create_default_context() self._ctx.check_hostname = False self._ctx.verify_mode = ssl.CERT_NONE + self._log_writer = log_writer def _wait_for_cooldown(self) -> None: if self._last_request_at is None: @@ -171,6 +180,22 @@ def fetch_metadata( _log.warning("Failed to fetch ArXiv metadata for %r: %s", query, exc) return [] + if self._log_writer: + self._log_writer( + "02_retrieval/paper_search/raw_arxiv.json", + json.dumps( + { + "backend": "arxiv", + "query": query, + "request_url": url, + "content_type": "application/atom+xml", + "raw_response": data.decode("utf-8", errors="replace"), + }, + indent=2, + ensure_ascii=False, + ), + ) + try: root = ET.fromstring(data) except ET.ParseError as exc: @@ -181,7 +206,7 @@ def fetch_metadata( candidates: list[EvidenceCandidate] = [] for entry in root.findall("atom:entry", ns): raw_id = entry.findtext("atom:id", default="", namespaces=ns).strip() - arxiv_id = raw_id.rsplit("/", 1)[-1] if raw_id else "" + paper_id = raw_id.rsplit("/", 1)[-1] if raw_id else "" title = entry.findtext("atom:title", default="No Title", namespaces=ns) summary = entry.findtext("atom:summary", default="No Summary", namespaces=ns) published = entry.findtext("atom:published", default="", namespaces=ns).strip() or None @@ -197,7 +222,7 @@ def fetch_metadata( candidates.append( EvidenceCandidate( - arxiv_id=arxiv_id or title.strip(), + paper_id=paper_id or title.strip(), title=title.strip().replace("\n", " "), summary=summary.strip().replace("\n", " "), query=query, @@ -207,10 +232,12 @@ def fetch_metadata( ) return candidates - def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: + def fetch_pdf_text_detail( + self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES + ) -> tuple[str, PdfTextOutcome]: self.pdf_requests += 1 try: - pdf_bytes = self._open(pdf_url, timeout=15) + pdf_bytes = fetch_pdf_bytes(pdf_url, timeout=15) from pypdf import PdfReader reader = PdfReader(io.BytesIO(pdf_bytes)) @@ -221,7 +248,14 @@ def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: page_text = page.extract_text() if page_text: pages.append(page_text) - return "\n".join(pages) + text = "\n".join(pages) + if text.strip(): + return text, "ok" + return "", "empty_text" except Exception as exc: # noqa: BLE001 _log.warning("Failed to fetch or parse ArXiv PDF %s: %s", pdf_url, exc) - return "" + return "", "fetch_failed" + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: + text, _ = self.fetch_pdf_text_detail(pdf_url, max_pages) + return text diff --git a/src/scenarios/retrieval/base.py b/src/scenarios/retrieval/base.py new file mode 100644 index 000000000..fc856ccbf --- /dev/null +++ b/src/scenarios/retrieval/base.py @@ -0,0 +1,20 @@ +"""Protocol for evidence metadata executors (ArXiv, Semantic Scholar, etc.).""" + +from __future__ import annotations + +from typing import Protocol + +from ..models import EvidenceCandidate, PdfTextOutcome + + +class EvidenceMetadataExecutor(Protocol): + def fetch_metadata(self, query: str, max_results: int = 6) -> list[EvidenceCandidate]: + ... + + def fetch_pdf_text_detail( + self, pdf_url: str, max_pages: int = 10 + ) -> tuple[str, PdfTextOutcome]: + ... + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = 10) -> str: + ... diff --git a/src/scenarios/retrieval/digest.py b/src/scenarios/retrieval/digest.py new file mode 100644 index 000000000..aae37316e --- /dev/null +++ b/src/scenarios/retrieval/digest.py @@ -0,0 +1,150 @@ +"""Synthesize merged research digest from retrieved papers.""" + +from __future__ import annotations + +import logging +from collections.abc import Callable + +from llm import LLMBackend + +from ..models import EvidenceBundle, EvidenceCandidate, RetrieverMode +from ..text import truncate_title_one_line +from ..prompts.research_digest import ( + RESEARCH_DIGEST_HEADINGS_MARKDOWN, + RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN, + RESEARCH_MERGE_PROMPT, + RESEARCH_PER_PAPER_PROMPT, +) +from .arxiv import _MAX_PDF_PAGES +from .pipeline import _make_executor + +_log = logging.getLogger(__name__) + +_MAX_DIGEST_BODY_CHARS = 28_000 +_DIGEST_PER_PAPER_MAX_TOKENS = 4096 +_DIGEST_MERGE_MAX_TOKENS = 4096 + + +def _candidates_for_digest(bundle: EvidenceBundle) -> list[EvidenceCandidate]: + by_id = {c.paper_id: c for c in bundle.candidates} + ordered: list[EvidenceCandidate] = [] + for aid in bundle.selected_candidate_ids: + if aid in by_id: + ordered.append(by_id[aid]) + if ordered: + return ordered + return list(bundle.candidates[:3]) + + +def _truncate_body(text: str) -> str: + text = text.strip() + if len(text) <= _MAX_DIGEST_BODY_CHARS: + return text + return text[:_MAX_DIGEST_BODY_CHARS] + "\n\n[... truncated for digest input ...]" + + +def _body_text_for_candidate( + executor, + candidate: EvidenceCandidate, + *, + on_pdf_fetched: Callable[[EvidenceCandidate], None] | None = None, + on_pdf_workflow: Callable[[EvidenceCandidate, str, str], None] | None = None, +) -> tuple[str, str]: + pdf_unavailable = False + if not candidate.pdf_url: + if on_pdf_workflow: + on_pdf_workflow(candidate, "digest", "no_pdf_url") + else: + pdf_text, pdf_outcome = executor.fetch_pdf_text_detail( + candidate.pdf_url, max_pages=_MAX_PDF_PAGES + ) + if pdf_outcome == "ok": + if on_pdf_fetched: + on_pdf_fetched(candidate) + if on_pdf_workflow: + on_pdf_workflow(candidate, "digest", "ok") + return "pdf", _truncate_body(pdf_text) + pdf_unavailable = True + if on_pdf_workflow: + on_pdf_workflow(candidate, "digest", pdf_outcome) + + summary = (candidate.summary or "").strip() + if summary: + if pdf_unavailable: + _log.info( + "Using abstract text (PDF unavailable) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + return "abstract", _truncate_body(summary) + + if pdf_unavailable: + _log.info( + "No extractable text (PDF unavailable, empty abstract) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + else: + _log.info( + "No extractable text (no PDF URL, empty abstract) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + return "abstract", "(no extractable text)" + + +def synthesize_research_digest( + bundle: EvidenceBundle, + llm: LLMBackend, + *, + retriever: RetrieverMode = "arxiv", + log_writer: Callable[[str, str], None] | None = None, + on_pdf_fetched: Callable[[EvidenceCandidate], None] | None = None, + on_pdf_workflow: Callable[[EvidenceCandidate, str, str], None] | None = None, +) -> str: + executor = _make_executor(retriever) + asset_name = bundle.asset_name + canonical = bundle.canonical_asset_name + candidates = _candidates_for_digest(bundle) + + if not candidates: + merged = ( + "## Note\n\nNo ranked papers were available after retrieval; " + "the research digest is empty. Stay conservative in the asset profile." + ) + if log_writer: + log_writer("02_retrieval/paper_digest/merged.txt", merged) + return merged + + per_paper_digests: list[str] = [] + for index, candidate in enumerate(candidates, start=1): + source_kind, body_text = _body_text_for_candidate( + executor, + candidate, + on_pdf_fetched=on_pdf_fetched, + on_pdf_workflow=on_pdf_workflow, + ) + prompt = RESEARCH_PER_PAPER_PROMPT.format( + asset_name=asset_name, + canonical_asset_name=canonical, + headings_markdown=RESEARCH_DIGEST_HEADINGS_MARKDOWN, + body_text=body_text, + ) + digest = llm.generate(prompt, max_tokens=_DIGEST_PER_PAPER_MAX_TOKENS) + block = ( + f"### Paper {index} (source: {source_kind})\n{digest.strip()}" + ) + per_paper_digests.append(block) + if log_writer: + log_writer(f"02_retrieval/paper_digest/per_paper_{index:02d}.txt", digest.strip()) + + merge_prompt = RESEARCH_MERGE_PROMPT.format( + asset_name=asset_name, + canonical_asset_name=canonical, + merge_headings_markdown=RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN, + per_paper_digests="\n\n".join(per_paper_digests), + ) + merged = llm.generate(merge_prompt, max_tokens=_DIGEST_MERGE_MAX_TOKENS).strip() + if log_writer: + log_writer("02_retrieval/paper_digest/merged.txt", merged) + return merged diff --git a/src/scenarios/retrieval/pdf_http.py b/src/scenarios/retrieval/pdf_http.py new file mode 100644 index 000000000..3da5c0af4 --- /dev/null +++ b/src/scenarios/retrieval/pdf_http.py @@ -0,0 +1,58 @@ +"""Plain HTTP GET for PDF bytes (browser-like headers).""" + +from __future__ import annotations + +import requests + +_BROWSER_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" +_PDF_HEADERS = { + "User-Agent": _BROWSER_UA, + "Accept": "application/pdf,*/*", +} + + +def probe_pdf_url(url: str, *, timeout: float = 15.0) -> bool: + cleaned = (url or "").strip() + if not cleaned: + return False + + session = requests.Session() + try: + response = session.head( + cleaned, + headers=_PDF_HEADERS, + timeout=timeout, + allow_redirects=True, + ) + if response.status_code == 200: + content_type = (response.headers.get("Content-Type") or "").lower() + if "pdf" in content_type: + return True + if "octet-stream" in content_type: + return True + except (requests.RequestException, OSError): + pass + + try: + response = session.get( + cleaned, + headers=_PDF_HEADERS, + timeout=timeout, + allow_redirects=True, + stream=True, + ) + response.raise_for_status() + chunk = next(response.iter_content(4096), b"") + response.close() + return len(chunk) >= 4 and chunk[:4] == b"%PDF" + except (requests.RequestException, OSError, StopIteration): + return False + + +def fetch_pdf_bytes(url: str, *, timeout: float = 20) -> bytes: + session = requests.Session() + headers = dict(_PDF_HEADERS) + headers["Accept"] = "application/pdf" + response = session.get(url, headers=headers, timeout=timeout, allow_redirects=True) + response.raise_for_status() + return response.content diff --git a/src/scenarios/retrieval/pipeline.py b/src/scenarios/retrieval/pipeline.py index 352190c97..64c57859e 100644 --- a/src/scenarios/retrieval/pipeline.py +++ b/src/scenarios/retrieval/pipeline.py @@ -1,8 +1,10 @@ -"""LLM-orchestrated evidence retrieval using ArXiv.""" +"""LLM-orchestrated evidence retrieval (academic search engine backends).""" from __future__ import annotations import json +import logging +import os import re from typing import Callable @@ -13,9 +15,14 @@ EvidenceCandidate, EvidenceSnippet, RetrievalAction, + RetrieverMode, ) -from ..prompts import RETRIEVAL_METADATA_JUDGE_PROMPT, RETRIEVAL_QUERY_PLAN_PROMPT -from ..text import collapse_whitespace_lower +from ..prompts import ( + RETRIEVAL_METADATA_JUDGE_PROMPT, + RETRIEVAL_QUERY_PLAN_PROMPT_SECTION, +) +from ..prompts.research_digest import RESEARCH_DIGEST_MERGE_SECTION_HEADINGS +from ..text import collapse_whitespace_lower, truncate_title_one_line from ..utils import parse_llm_json from .arxiv import ( _ARXIV_COOLDOWN_SECONDS, @@ -28,6 +35,9 @@ _STANDARD_KEYWORDS, _STOPWORDS, ) +from .base import EvidenceMetadataExecutor +from .pdf_http import probe_pdf_url +from .semantic_scholar import SemanticScholarExecutor _MAX_STEPS = 5 _MAX_QUERIES_PER_STEP = 2 @@ -35,6 +45,8 @@ _TOP_PDF_DOWNLOADS = 3 _MAX_SNIPPETS_PER_DOC = 3 +_log = logging.getLogger(__name__) + def _tokenise(text: str) -> list[str]: return re.findall(r"[a-z0-9]+", text.lower()) @@ -73,7 +85,7 @@ def _render_results_summary(candidates: list[EvidenceCandidate]) -> str: lines = [] for candidate in candidates[:5]: lines.append( - f"- [{candidate.judge_score}/10] {candidate.arxiv_id} | {candidate.title} | {candidate.judge_reason}" + f"- [{candidate.judge_score}/10] paper_id={candidate.paper_id} | {candidate.title} | {candidate.judge_reason}" ) return "\n".join(lines) @@ -81,7 +93,7 @@ def _render_results_summary(candidates: list[EvidenceCandidate]) -> str: def _summarise_metadata_for_judge(candidates: list[EvidenceCandidate]) -> str: payload = [ { - "arxiv_id": candidate.arxiv_id, + "paper_id": candidate.paper_id, "title": candidate.title, "summary": candidate.summary, "query": candidate.query, @@ -118,9 +130,9 @@ def _coerce_action(parsed: object) -> RetrievalAction: if str(query).strip() ][:_MAX_QUERIES_PER_STEP], selected_ids=[ - str(arxiv_id).strip() - for arxiv_id in parsed.get("selected_ids", []) - if str(arxiv_id).strip() + str(pid).strip() + for pid in parsed.get("selected_ids", []) + if str(pid).strip() ], ) @@ -191,8 +203,8 @@ def _judge_metadata_batch( for entry in parsed: if not isinstance(entry, dict): continue - arxiv_id = str(entry.get("arxiv_id", "")).strip() - if not arxiv_id: + paper_id = str(entry.get("paper_id", "")).strip() + if not paper_id: continue raw_score = entry.get("score_1_to_10", 0) try: @@ -202,11 +214,11 @@ def _judge_metadata_batch( score = max(1, min(10, score)) if score else 0 reason = str(entry.get("reason", "")).strip() or "No judge reason provided." if score: - scored_by_id[arxiv_id] = (score, reason) + scored_by_id[paper_id] = (score, reason) judged: list[EvidenceCandidate] = [] for candidate in candidates: - score_reason = scored_by_id.get(candidate.arxiv_id) + score_reason = scored_by_id.get(candidate.paper_id) if score_reason is None: score_reason = _judge_fallback(candidate, canonical_asset_name) candidate.judge_score = score_reason[0] @@ -220,9 +232,9 @@ def _merge_pool( judged_candidates: list[EvidenceCandidate], ) -> None: for candidate in judged_candidates: - existing = pool.get(candidate.arxiv_id) + existing = pool.get(candidate.paper_id) if existing is None or candidate.judge_score > existing.judge_score: - pool[candidate.arxiv_id] = candidate + pool[candidate.paper_id] = candidate def _sorted_candidates(pool: dict[str, EvidenceCandidate]) -> list[EvidenceCandidate]: @@ -233,18 +245,55 @@ def _sorted_candidates(pool: dict[str, EvidenceCandidate]) -> list[EvidenceCandi ) -def _fallback_retry_queries( +def _section_slug(section_heading: str) -> str: + slug = re.sub(r"[^a-zA-Z0-9]+", "_", section_heading.lower()).strip("_") + return slug[:80] if slug else "section" + + +def _merge_global_pools( + global_pool: dict[str, EvidenceCandidate], + section_pool: dict[str, EvidenceCandidate], +) -> None: + for paper_id, candidate in section_pool.items(): + existing = global_pool.get(paper_id) + if existing is None or candidate.judge_score > existing.judge_score: + global_pool[paper_id] = candidate + + +def _filter_fetchable_candidates(raw: list[EvidenceCandidate]) -> list[EvidenceCandidate]: + kept: list[EvidenceCandidate] = [] + for candidate in raw: + if not candidate.pdf_url: + continue + if probe_pdf_url(candidate.pdf_url): + kept.append(candidate) + else: + _log.debug( + "Dropped candidate (PDF probe failed): %s | %s", + candidate.paper_id, + (candidate.pdf_url or "")[:120], + ) + return kept + + +def _fallback_retry_queries_section( canonical_asset_name: str, query_history: list[str], + section_heading: str, ) -> list[str]: canonical = _default_canonical_asset_name(canonical_asset_name) + snippet = section_heading.split(",")[0].strip().lower() + if len(snippet) > 48: + snippet = snippet[:45] + "..." candidates = [ - f"{canonical} condition monitoring", - f"{canonical} fault diagnosis", - f"{canonical} condition assessment", - f"{canonical} maintenance", - f"{canonical} degradation", - f"{canonical} physical measurements", + f"{canonical} condition monitoring {snippet}", + f"{canonical} fault diagnosis {snippet}", + f"{canonical} condition assessment {snippet}", + f"{canonical} maintenance {snippet}", + f"{canonical} degradation {snippet}", + f"{canonical} physical measurements {snippet}", + f"{canonical} sensor monitoring {snippet}", + f"{canonical} IIoT {snippet}", ] return [ query @@ -340,21 +389,21 @@ def _select_final_candidates( preferred_ids: list[str], ) -> tuple[list[EvidenceCandidate], list[str]]: ordered_pool = _sorted_candidates(pool) - ordered_by_id = {candidate.arxiv_id: candidate for candidate in ordered_pool} + ordered_by_id = {candidate.paper_id: candidate for candidate in ordered_pool} selected: list[EvidenceCandidate] = [] selected_ids: list[str] = [] - for arxiv_id in preferred_ids: - candidate = ordered_by_id.get(arxiv_id) - if candidate and arxiv_id not in selected_ids: + for pid in preferred_ids: + candidate = ordered_by_id.get(pid) + if candidate and pid not in selected_ids: selected.append(candidate) - selected_ids.append(arxiv_id) + selected_ids.append(pid) for candidate in ordered_pool: - if candidate.arxiv_id in selected_ids: + if candidate.paper_id in selected_ids: continue selected.append(candidate) - selected_ids.append(candidate.arxiv_id) + selected_ids.append(candidate.paper_id) if len(selected) >= _TOP_PDF_DOWNLOADS: break @@ -368,27 +417,40 @@ def _render_step_log( fetched_candidates: list[EvidenceCandidate], pool: dict[str, EvidenceCandidate], canonical_asset_name: str, + *, + section_heading: str | None = None, + metadata_rows_before_probe: int | None = None, ) -> str: - lines = [ - f"Step: {step_number}/{_MAX_STEPS}", - f"Action: {action.action}", - f"Canonical Asset: {canonical_asset_name}", - f"Reason: {action.reason}", - "", - "Queries:", - ] + lines = [] + if section_heading: + lines.append(f"Section: {section_heading}") + lines.extend( + [ + f"Step: {step_number}/{_MAX_STEPS}", + f"Action: {action.action}", + f"Canonical Asset: {canonical_asset_name}", + f"Reason: {action.reason}", + "", + "Queries:", + ] + ) if new_queries: lines.extend(f"- {query}" for query in new_queries) else: lines.append("(no new queries)") lines.extend(["", "Fetched Metadata:"]) + if metadata_rows_before_probe is not None: + lines.append( + f"(metadata rows: {metadata_rows_before_probe}, " + f"fetchable PDF after probe: {len(fetched_candidates)})" + ) if fetched_candidates: for candidate in fetched_candidates: lines.append( f"- [{candidate.judge_score}/10] {candidate.title}" ) - lines.append(f" id: {candidate.arxiv_id}") + lines.append(f" paper_id: {candidate.paper_id}") lines.append(f" query: {candidate.query}") lines.append(f" assessment: {_candidate_focus_label(candidate)}") lines.append(f" reason: {candidate.judge_reason}") @@ -400,7 +462,7 @@ def _render_step_log( if top_candidates: for candidate in top_candidates: lines.append( - f"- [{candidate.judge_score}/10] {candidate.arxiv_id} | {candidate.title}" + f"- [{candidate.judge_score}/10] paper_id={candidate.paper_id} | {candidate.title}" ) lines.append(f" assessment: {_candidate_focus_label(candidate)}") lines.append(f" reason: {candidate.judge_reason}") @@ -440,7 +502,7 @@ def _render_final_log( if bundle.candidates: for candidate in bundle.candidates: lines.append( - f"- [{candidate.judge_score}/10] {candidate.arxiv_id} | {candidate.title}" + f"- [{candidate.judge_score}/10] paper_id={candidate.paper_id} | {candidate.title}" ) lines.append(f" query: {candidate.query}") lines.append(f" reason: {candidate.judge_reason}") @@ -451,7 +513,7 @@ def _render_final_log( if selected_candidates: for candidate in selected_candidates: lines.append( - f"- {candidate.arxiv_id} | {candidate.title}" + f"- paper_id={candidate.paper_id} | {candidate.title}" ) lines.append(f" pdf: {candidate.pdf_url or '(no pdf url)'}") else: @@ -462,23 +524,25 @@ def _render_final_log( return "\n".join(lines) -def retrieve_asset_evidence( +def _retrieve_for_section( asset_name: str, + canonical_asset_name: str, + section_heading: str, + section_slug: str, server_desc: dict[str, str], llm: LLMBackend, - log_writer: Callable[[str, str], None] | None = None, -) -> EvidenceBundle: - executor = _ArxivExecutor(cooldown_seconds=_ARXIV_COOLDOWN_SECONDS) - canonical_asset_name = _default_canonical_asset_name(asset_name) + executor: EvidenceMetadataExecutor, + log_writer: Callable[[str, str], None] | None, + on_academic_query: Callable[[str, int], None] | None, +) -> tuple[str, dict[str, EvidenceCandidate], list[str]]: query_history: list[str] = [] candidate_pool: dict[str, EvidenceCandidate] = {} - finish_reason = "Finished after reaching the step limit." - selected_ids: list[str] = [] + log_prefix = f"02_retrieval/paper_search/{section_slug}" for step_number in range(1, _MAX_STEPS + 1): current_summary = _render_results_summary(_sorted_candidates(candidate_pool)) previous_queries = _render_queries(query_history) - prompt = RETRIEVAL_QUERY_PLAN_PROMPT.format( + prompt = RETRIEVAL_QUERY_PLAN_PROMPT_SECTION.format( asset_name=asset_name, step_number=step_number, max_steps=_MAX_STEPS, @@ -486,6 +550,7 @@ def retrieve_asset_evidence( tool_descriptions=json.dumps(server_desc, indent=2), previous_queries=previous_queries, current_results_summary=current_summary, + section_heading=section_heading, ) response = llm.generate(prompt) parsed, _ = parse_llm_json(response) @@ -497,15 +562,9 @@ def retrieve_asset_evidence( _sorted_candidates(candidate_pool) ) if pool_focused or step_number == _MAX_STEPS: - finish_reason = ( - action.reason - if pool_focused - else f"{action.reason} Finalizing at step limit. {focus_reason}" - ) - selected_ids = action.selected_ids if log_writer: log_writer( - f"02_retrieval/steps/step_{step_number:02d}.txt", + f"{log_prefix}/step_{step_number:02d}.txt", _render_step_log( step_number=step_number, action=action, @@ -513,6 +572,7 @@ def retrieve_asset_evidence( fetched_candidates=[], pool=candidate_pool, canonical_asset_name=canonical_asset_name, + section_heading=section_heading, ), ) break @@ -521,7 +581,9 @@ def retrieve_asset_evidence( action="search", reason=f"Early finish blocked. {focus_reason}", canonical_asset_name=canonical_asset_name, - queries=_fallback_retry_queries(canonical_asset_name, query_history), + queries=_fallback_retry_queries_section( + canonical_asset_name, query_history, section_heading + ), ) new_queries = [ @@ -531,46 +593,52 @@ def retrieve_asset_evidence( ][: _MAX_QUERIES_PER_STEP] if not new_queries: - if candidate_pool: - finish_reason = action.reason or "No new queries remained; keeping the best-so-far pool." - else: - finish_reason = action.reason or ( - "No new queries from planner and no evidence pool yet; proceeding with empty evidence." - ) if log_writer: log_writer( - f"02_retrieval/steps/step_{step_number:02d}.txt", + f"{log_prefix}/step_{step_number:02d}.txt", _render_step_log( step_number=step_number, action=RetrievalAction( action="finish", - reason=finish_reason, + reason=action.reason + or ( + "No new queries remained; keeping the best-so-far pool." + if candidate_pool + else "No new queries from planner and no evidence pool yet." + ), canonical_asset_name=canonical_asset_name, ), new_queries=[], fetched_candidates=[], pool=candidate_pool, canonical_asset_name=canonical_asset_name, + section_heading=section_heading, ), ) break query_history.extend(new_queries) - fetched_candidates: list[EvidenceCandidate] = [] + merged_raw: list[EvidenceCandidate] = [] for query in new_queries: - fetched_candidates.extend(executor.fetch_metadata(query)) + rows = executor.fetch_metadata(query) + merged_raw.extend(rows) + if on_academic_query: + on_academic_query(query, len(rows)) + + raw_count = len(merged_raw) + fetchable = _filter_fetchable_candidates(merged_raw) judged_candidates = _judge_metadata_batch( asset_name=asset_name, canonical_asset_name=canonical_asset_name, - candidates=fetched_candidates, + candidates=fetchable, llm=llm, ) _merge_pool(candidate_pool, judged_candidates) if log_writer: log_writer( - f"02_retrieval/steps/step_{step_number:02d}.txt", + f"{log_prefix}/step_{step_number:02d}.txt", _render_step_log( step_number=step_number, action=action, @@ -578,13 +646,61 @@ def retrieve_asset_evidence( fetched_candidates=judged_candidates, pool=candidate_pool, canonical_asset_name=canonical_asset_name, + section_heading=section_heading, + metadata_rows_before_probe=raw_count, ), ) + return canonical_asset_name, candidate_pool, query_history + + +def _make_executor( + retriever: RetrieverMode, + log_writer: Callable[[str, str], None] | None = None, +) -> EvidenceMetadataExecutor: + if retriever == "semantic_scholar": + key = os.environ.get("SEMANTIC_SCHOLAR_API_KEY") + return SemanticScholarExecutor(api_key=key, log_writer=log_writer) + return _ArxivExecutor(cooldown_seconds=_ARXIV_COOLDOWN_SECONDS, log_writer=log_writer) + + +def retrieve_asset_evidence( + asset_name: str, + server_desc: dict[str, str], + llm: LLMBackend, + log_writer: Callable[[str, str], None] | None = None, + *, + retriever: RetrieverMode = "arxiv", + on_pdf_fetched: Callable[[EvidenceCandidate], None] | None = None, + on_pdf_workflow: Callable[[EvidenceCandidate, str, str], None] | None = None, + on_academic_query: Callable[[str, int], None] | None = None, +) -> EvidenceBundle: + executor = _make_executor(retriever, log_writer=log_writer) + canonical_asset_name = _default_canonical_asset_name(asset_name) + query_history: list[str] = [] + candidate_pool: dict[str, EvidenceCandidate] = {} + + for section_heading in RESEARCH_DIGEST_MERGE_SECTION_HEADINGS: + section_slug = _section_slug(section_heading) + canonical_asset_name, section_pool, section_queries = _retrieve_for_section( + asset_name=asset_name, + canonical_asset_name=canonical_asset_name, + section_heading=section_heading, + section_slug=section_slug, + server_desc=server_desc, + llm=llm, + executor=executor, + log_writer=log_writer, + on_academic_query=on_academic_query, + ) + for query in section_queries: + query_history.append(f"[{section_heading}] {query}") + _merge_global_pools(candidate_pool, section_pool) + top_candidates = _sorted_candidates(candidate_pool)[:_MAX_CANDIDATE_POOL] selected_candidates, selected_candidate_ids = _select_final_candidates( candidate_pool, - selected_ids, + [], ) snippets: list[EvidenceSnippet] = [] @@ -592,16 +708,30 @@ def retrieve_asset_evidence( source = "summary" text = candidate.summary if candidate.pdf_url: - pdf_text = executor.fetch_pdf_text(candidate.pdf_url) - if pdf_text.strip(): + pdf_text, pdf_outcome = executor.fetch_pdf_text_detail(candidate.pdf_url) + if pdf_outcome == "ok": source = "pdf" text = pdf_text + if on_pdf_workflow: + on_pdf_workflow(candidate, "snippet", "ok") + if on_pdf_fetched: + on_pdf_fetched(candidate) + else: + _log.info( + "Using abstract/summary for evidence snippet (PDF unavailable) — %s | %s", + candidate.paper_id, + truncate_title_one_line(candidate.title), + ) + if on_pdf_workflow: + on_pdf_workflow(candidate, "snippet", pdf_outcome) + elif on_pdf_workflow: + on_pdf_workflow(candidate, "snippet", "no_pdf_url") snippet_text = _extract_snippet_text(text, canonical_asset_name) if not snippet_text: continue snippets.append( EvidenceSnippet( - arxiv_id=candidate.arxiv_id, + paper_id=candidate.paper_id, title=candidate.title, url=candidate.pdf_url, source=source, @@ -619,6 +749,9 @@ def retrieve_asset_evidence( ) if log_writer: - log_writer("02_retrieval/summary.txt", _render_final_log(bundle, selected_candidates)) + log_writer( + "02_retrieval/paper_search/summary.txt", + _render_final_log(bundle, selected_candidates), + ) return bundle diff --git a/src/scenarios/retrieval/semantic_scholar.py b/src/scenarios/retrieval/semantic_scholar.py new file mode 100644 index 000000000..00aae53a2 --- /dev/null +++ b/src/scenarios/retrieval/semantic_scholar.py @@ -0,0 +1,322 @@ +"""Semantic Scholar Graph API client (paper search, PDF fetch; 1 Graph API req/s in-process).""" + +from __future__ import annotations + +import io +import json +import logging +from collections.abc import Callable +import re +import ssl +import threading +import time +import urllib.error +import urllib.parse +import urllib.request + +import certifi + +from ..models import EvidenceCandidate, PdfTextOutcome +from .arxiv import _MAX_METADATA_RESULTS, _MAX_PDF_PAGES +from .pdf_http import fetch_pdf_bytes + +_log = logging.getLogger(__name__) + +_S2_SEARCH_URL = "https://api.semanticscholar.org/graph/v1/paper/search" +_S2_API_HOST = "api.semanticscholar.org" +_S2_MIN_INTERVAL_SECONDS = 1.0 +_S2_USER_AGENT = "AssetOpsBench/1.0 (mailto:admin@example.com)" + +_SEARCH_FIELDS = "paperId,title,abstract,year,openAccessPdf,externalIds" + +_s2_api_rate_lock = threading.Lock() +_s2_last_api_request_at: float | None = None + + +def _is_doi_or_non_pdf_landing_url(url: str) -> bool: + try: + parsed = urllib.parse.urlparse(url) + host = (parsed.hostname or "").lower() + except Exception: # noqa: BLE001 + return True + if host in {"doi.org", "dx.doi.org"} or host.endswith(".doi.org"): + return True + if "link.springer.com" in host and "/article/" in (parsed.path or ""): + return True + if "nature.com" in host and "/articles/" in (parsed.path or "") and not (parsed.path or "").lower().endswith(".pdf"): + return True + return False + + +def _is_likely_direct_pdf_url(url: str) -> bool: + if _is_doi_or_non_pdf_landing_url(url): + return False + try: + parsed = urllib.parse.urlparse(url) + host = (parsed.hostname or "").lower() + path = (parsed.path or "").lower() + except Exception: # noqa: BLE001 + return False + if path.endswith(".pdf"): + return True + if "arxiv.org" in host and "/pdf/" in path: + return True + if host == "pdfs.semanticscholar.org": + return True + if "pmc.ncbi.nlm.nih.gov" in host and "pdf" in path: + return True + return False + + +def _arxiv_external_id_to_pdf_url(raw: str) -> str | None: + aid = raw.strip() + if not aid: + return None + lower = aid.lower() + if lower.startswith("arxiv:"): + aid = aid.split(":", 1)[1].strip() + if aid.startswith("http"): + try: + parsed = urllib.parse.urlparse(aid) + if "arxiv.org" in (parsed.hostname or "").lower() and "/abs/" in (parsed.path or ""): + tail = (parsed.path or "").split("/abs/", 1)[-1].rstrip("/") + if tail: + return f"https://arxiv.org/pdf/{tail}.pdf" + except Exception: # noqa: BLE001 + return None + return None + return f"https://arxiv.org/pdf/{aid}.pdf" + + +def _pdf_url_from_external_ids(ext: object) -> str | None: + if not isinstance(ext, dict): + return None + for key in ("ArXiv", "arXiv", "arxiv"): + raw = ext.get(key) + if isinstance(raw, str) and raw.strip(): + return _arxiv_external_id_to_pdf_url(raw) + return None + + +def _normalize_open_access_url(url: str) -> str: + u = url.strip().split("#")[0] + if "arxiv.org/abs/" not in u: + return u + tail = u.split("/abs/", 1)[-1].rstrip("/") + if not tail: + return u + return f"https://arxiv.org/pdf/{tail}.pdf" + + +def _resolve_pdf_url_for_paper(row: dict) -> str | None: + oa = row.get("openAccessPdf") + oa_url: str | None = None + if isinstance(oa, dict): + u = oa.get("url") + if isinstance(u, str) and u.strip(): + oa_url = _normalize_open_access_url(u.strip()) + + if oa_url and _is_doi_or_non_pdf_landing_url(oa_url): + oa_url = None + + ext_pdf = _pdf_url_from_external_ids(row.get("externalIds")) + + if oa_url and _is_likely_direct_pdf_url(oa_url): + return oa_url + + if ext_pdf: + return ext_pdf + + if oa_url: + return oa_url + + return None + + +def _normalize_s2_query(query: str) -> str: + return re.sub(r"\s*-\s*", " ", query).strip() + + +def _ssl_context() -> ssl.SSLContext: + return ssl.create_default_context(cafile=certifi.where()) + + +def _is_semantic_scholar_api_url(url: str) -> bool: + try: + host = (urllib.parse.urlparse(url).hostname or "").lower() + except Exception: # noqa: BLE001 — urlparse is defensive for odd strings + return False + return host == _S2_API_HOST + + +def _http_get(url: str, *, timeout: int, ctx: ssl.SSLContext, headers: dict[str, str]) -> bytes: + req = urllib.request.Request(url, headers=headers) + with urllib.request.urlopen(req, timeout=timeout, context=ctx) as response: + return response.read() + + +def _semantic_scholar_api_get(url: str, *, timeout: int, ctx: ssl.SSLContext, headers: dict[str, str]) -> bytes: + global _s2_last_api_request_at + with _s2_api_rate_lock: + if _s2_last_api_request_at is not None: + elapsed = time.monotonic() - _s2_last_api_request_at + if elapsed < _S2_MIN_INTERVAL_SECONDS: + time.sleep(_S2_MIN_INTERVAL_SECONDS - elapsed) + data = _http_get(url, timeout=timeout, ctx=ctx, headers=headers) + _s2_last_api_request_at = time.monotonic() + return data + + +class SemanticScholarExecutor: + def __init__( + self, + *, + api_key: str | None = None, + log_writer: Callable[[str, str], None] | None = None, + ) -> None: + self._api_key = (api_key or "").strip() or None + self.metadata_requests = 0 + self.pdf_requests = 0 + self._ctx = _ssl_context() + self._log_writer = log_writer + + def _s2_headers(self) -> dict[str, str]: + headers = {"User-Agent": _S2_USER_AGENT, "Accept": "application/json"} + if self._api_key: + headers["x-api-key"] = self._api_key + return headers + + def _open(self, url: str, timeout: int) -> bytes: + if not _is_semantic_scholar_api_url(url): + raise ValueError(f"Expected Semantic Scholar API URL, got {url!r}") + return _semantic_scholar_api_get(url, timeout=timeout, ctx=self._ctx, headers=self._s2_headers()) + + def fetch_metadata( + self, + query: str, + max_results: int = _MAX_METADATA_RESULTS, + ) -> list[EvidenceCandidate]: + q = _normalize_s2_query(query) + limit = max(1, min(max_results, 100)) + params = urllib.parse.urlencode( + { + "query": q, + "limit": str(limit), + "fields": _SEARCH_FIELDS, + } + ) + search_url = f"{_S2_SEARCH_URL}?{params}" + self.metadata_requests += 1 + + try: + raw = self._open(search_url, timeout=15) + except urllib.error.HTTPError as exc: + _log.warning("HTTP error fetching Semantic Scholar paper search for %r: %s", query, exc) + return [] + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch Semantic Scholar paper search for %r: %s", query, exc) + return [] + + payload_text = raw.decode("utf-8", errors="replace") + try: + payload = json.loads(payload_text) + except json.JSONDecodeError as exc: + if self._log_writer: + self._log_writer( + "02_retrieval/paper_search/raw_semantic_scholar.json", + json.dumps( + { + "backend": "semantic_scholar", + "query": query, + "request_url": search_url, + "raw_response": payload_text, + "json_decode_error": str(exc), + }, + indent=2, + ensure_ascii=False, + ), + ) + _log.warning("Failed to parse Semantic Scholar search JSON for %r: %s", query, exc) + return [] + + if self._log_writer: + self._log_writer( + "02_retrieval/paper_search/raw_semantic_scholar.json", + json.dumps( + { + "backend": "semantic_scholar", + "query": query, + "request_url": search_url, + "raw_response": payload, + }, + indent=2, + ensure_ascii=False, + ), + ) + + rows = payload.get("data") + if not isinstance(rows, list) or not rows: + return [] + + candidates: list[EvidenceCandidate] = [] + for row in rows: + if not isinstance(row, dict): + continue + pid = str(row.get("paperId") or "").strip() + title = str(row.get("title") or "No Title").strip().replace("\n", " ") + abstract_raw = row.get("abstract") + abstract = ( + str(abstract_raw).strip().replace("\n", " ") + if abstract_raw is not None + else "" + ) + year = row.get("year") + published = str(year) if year is not None else None + + pdf_url = _resolve_pdf_url_for_paper(row) + + if not pid: + pid = title or "unknown" + + candidates.append( + EvidenceCandidate( + paper_id=pid, + title=title, + summary=abstract or "No Summary", + query=query, + pdf_url=pdf_url, + published=published, + ) + ) + if len(candidates) >= max_results: + break + + return candidates + + def fetch_pdf_text_detail( + self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES + ) -> tuple[str, PdfTextOutcome]: + self.pdf_requests += 1 + try: + pdf_bytes = fetch_pdf_bytes(pdf_url, timeout=20) + from pypdf import PdfReader + + reader = PdfReader(io.BytesIO(pdf_bytes)) + pages: list[str] = [] + for index, page in enumerate(reader.pages): + if index >= max_pages: + break + page_text = page.extract_text() + if page_text: + pages.append(page_text) + text = "\n".join(pages) + if text.strip(): + return text, "ok" + return "", "empty_text" + except Exception as exc: # noqa: BLE001 + _log.warning("Failed to fetch or parse PDF %s: %s", pdf_url, exc) + return "", "fetch_failed" + + def fetch_pdf_text(self, pdf_url: str, max_pages: int = _MAX_PDF_PAGES) -> str: + text, _ = self.fetch_pdf_text_detail(pdf_url, max_pages) + return text diff --git a/src/scenarios/text.py b/src/scenarios/text.py index b7a628521..9a9572b25 100644 --- a/src/scenarios/text.py +++ b/src/scenarios/text.py @@ -23,9 +23,17 @@ def normalize_example_fingerprint(text: str) -> str: return " ".join(str(text).lower().split()) +def truncate_title_one_line(title: str | None, *, max_len: int = 90) -> str: + t = (title or "").strip().replace("\n", " ") + if len(t) > max_len: + return t[: max_len - 3] + "..." + return t or "(no title)" + + __all__ = [ "collapse_whitespace_lower", "normalize_example_fingerprint", "normalize_for_fuzzy_dedup", "slugify_asset_name", + "truncate_title_one_line", ] diff --git a/src/scenarios/utils.py b/src/scenarios/utils.py index b22d94864..738c240f2 100644 --- a/src/scenarios/utils.py +++ b/src/scenarios/utils.py @@ -31,7 +31,6 @@ ) _ASSET_ID_PATTERN = re.compile(r"\b[A-Z]{2,6}\d{4,}\b") -# Generic benchmark queries to exclude from all_utterance (substring match, lowercased). _GENERIC_UTTERANCE_DENYLIST = ( "what iot sites are available", "can you list the iot sites", @@ -54,7 +53,6 @@ def parse_llm_json(raw: str) -> tuple[Any, str | None]: - """Parse an LLM response containing a JSON object or array.""" text = raw.strip() if text.startswith("```"): lines = text.splitlines() @@ -117,7 +115,6 @@ def _load_local_vibration_list() -> list[dict[str, Any]]: def _is_asset_specific_utterance(text: str) -> bool: - """Filter for all_utterance: asset-specific vs generic site/capability questions.""" tl = text.lower() for phrase in _GENERIC_UTTERANCE_DENYLIST: if phrase in tl: @@ -129,18 +126,16 @@ def _is_asset_specific_utterance(text: str) -> bool: return False -# Failure-mapping few-shot: one example per utterance shape (covers all rows in the JSONL). _FMSR_FEWSHOT_BUCKET_ORDER: tuple[str, ...] = ( - "list_all", # "List all failure modes of …" - "for_list_all", # "For a compressor, list all the failure modes …" - "what", # "What sensors can be …", "What are the failure modes …", etc. - "which", # "Which failure modes …", "Which sensors are most …" (sentence starts with Which) - "for_which", # "For an aero gas turbine, which failure modes …" (For …, which …) + "list_all", + "for_list_all", + "what", + "which", + "for_which", ) def _failure_mapping_bucket(text: str) -> str | None: - """Classify failure_mapping_senarios.jsonl rows by question prefix / shape.""" s = text.strip() sl = s.lower() if sl.startswith("list all"): @@ -171,7 +166,6 @@ def _pick_failure_mapping_examples(rows: list[dict[str, Any]]) -> list[dict[str, def _pick_rule_monitoring_diverse(rows: list[dict[str, Any]]) -> list[dict[str, Any]]: - """One row per target asset class (entity field or SVL in text).""" picked: list[dict[str, Any]] = [] used_ids: set[int | str] = set() @@ -309,7 +303,6 @@ def fetch_hf_fewshot( _log.info("No few-shot examples were available for focus %r.", focus) return [] - # Dedupe by normalized text fingerprint seen: set[str] = set() unique: list[dict[str, Any]] = [] for example in pool: From f7d7b7992e190cbd80d7aaf468a8b9ab628c2e5a Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Fri, 10 Apr 2026 23:28:08 -0400 Subject: [PATCH 18/29] convert scenarios to package --- src/scenarios/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/scenarios/__init__.py diff --git a/src/scenarios/__init__.py b/src/scenarios/__init__.py new file mode 100644 index 000000000..e69de29bb From cf7f47013115210399cb44ff1a0bd5919b7ca983 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Sat, 11 Apr 2026 23:27:02 -0400 Subject: [PATCH 19/29] feat(llm): return LLMResult with optional usage from generate() --- src/llm/__init__.py | 4 ++-- src/llm/base.py | 27 +++++++++++++++++++++++++-- src/llm/litellm.py | 30 +++++++++++++++++++++++++++--- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/llm/__init__.py b/src/llm/__init__.py index b56faeedb..ebe96d90b 100644 --- a/src/llm/__init__.py +++ b/src/llm/__init__.py @@ -1,6 +1,6 @@ """LLM backend for AssetOpsBench MCP.""" -from .base import LLMBackend +from .base import LLMBackend, LLMResult, LLMUsage from .litellm import LiteLLMBackend -__all__ = ["LLMBackend", "LiteLLMBackend"] +__all__ = ["LLMBackend", "LLMResult", "LLMUsage", "LiteLLMBackend"] diff --git a/src/llm/base.py b/src/llm/base.py index ff91091a2..7cb27a709 100644 --- a/src/llm/base.py +++ b/src/llm/base.py @@ -3,12 +3,35 @@ from __future__ import annotations from abc import ABC, abstractmethod +from dataclasses import dataclass + + +@dataclass(frozen=True) +class LLMUsage: + """Token usage for a single completion (OpenAI-compatible fields).""" + + prompt_tokens: int | None = None + completion_tokens: int | None = None + total_tokens: int | None = None + + +@dataclass(frozen=True) +class LLMResult: + """LLM output text plus optional provider usage metadata.""" + + text: str + usage: LLMUsage | None = None class LLMBackend(ABC): """Abstract interface for LLM backends.""" @abstractmethod - def generate(self, prompt: str, temperature: float = 0.0) -> str: - """Generate text given a prompt.""" + def generate( + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, + ) -> LLMResult: + """Generate text given a prompt; includes usage when the backend provides it.""" ... diff --git a/src/llm/litellm.py b/src/llm/litellm.py index 5733066ed..5403e0186 100644 --- a/src/llm/litellm.py +++ b/src/llm/litellm.py @@ -14,9 +14,12 @@ from __future__ import annotations +import logging import os -from .base import LLMBackend +from .base import LLMBackend, LLMResult, LLMUsage + +_log = logging.getLogger(__name__) class LiteLLMBackend(LLMBackend): @@ -36,7 +39,7 @@ def generate( prompt: str, temperature: float = 0.0, max_tokens: int | None = None, - ) -> str: + ) -> LLMResult: import litellm kwargs: dict = { @@ -56,4 +59,25 @@ def generate( kwargs["api_base"] = os.environ["LITELLM_BASE_URL"] response = litellm.completion(**kwargs) - return response.choices[0].message.content + text = response.choices[0].message.content or "" + usage: LLMUsage | None = None + raw_usage = getattr(response, "usage", None) + if raw_usage is not None: + usage = LLMUsage( + prompt_tokens=getattr(raw_usage, "prompt_tokens", None), + completion_tokens=getattr(raw_usage, "completion_tokens", None), + total_tokens=getattr(raw_usage, "total_tokens", None), + ) + _log.info( + "LLM usage model=%s prompt_tokens=%s completion_tokens=%s total_tokens=%s", + self._model_id, + usage.prompt_tokens, + usage.completion_tokens, + usage.total_tokens, + ) + else: + _log.info( + "LLM completion model=%s (no usage object from provider)", + self._model_id, + ) + return LLMResult(text=text, usage=usage) From e90d9aeb2cedd64c15357204e74ba12f052feca6 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Sat, 11 Apr 2026 23:27:03 -0400 Subject: [PATCH 20/29] refactor(agent): consume LLMResult.text in plan-execute and tests --- src/agent/plan_execute/executor.py | 4 ++-- src/agent/plan_execute/planner.py | 4 ++-- src/agent/plan_execute/runner.py | 2 +- src/agent/tests/conftest.py | 27 ++++++++++++++++++++++----- src/agent/tests/test_runner.py | 8 ++++++-- 5 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/agent/plan_execute/executor.py b/src/agent/plan_execute/executor.py index 10409ad47..283d06d90 100644 --- a/src/agent/plan_execute/executor.py +++ b/src/agent/plan_execute/executor.py @@ -218,11 +218,11 @@ async def _resolve_args_with_llm( .replace("{context}", context_text or "(none)") ) raw = llm.generate(prompt) - resolved = _parse_json(raw) + resolved = _parse_json(raw.text) if resolved is None: _log.warning( "Tool '%s': arg resolution returned no parseable JSON (response: %r…)", - tool, raw[:120], + tool, raw.text[:120], ) return {} return resolved diff --git a/src/agent/plan_execute/planner.py b/src/agent/plan_execute/planner.py index 8c683943a..e6e86b82a 100644 --- a/src/agent/plan_execute/planner.py +++ b/src/agent/plan_execute/planner.py @@ -127,5 +127,5 @@ def generate_plan( f"{name}:\n{desc}" for name, desc in server_descriptions.items() ) prompt = _PLAN_PROMPT.format(servers=servers_text, question=question) - raw = self._llm.generate(prompt) - return parse_plan(raw) + result = self._llm.generate(prompt) + return parse_plan(result.text) diff --git a/src/agent/plan_execute/runner.py b/src/agent/plan_execute/runner.py index c3e9f3f8c..012264573 100644 --- a/src/agent/plan_execute/runner.py +++ b/src/agent/plan_execute/runner.py @@ -104,7 +104,7 @@ async def run(self, question: str) -> OrchestratorResult: ) answer = self._llm.generate( _SUMMARIZE_PROMPT.format(question=question, results=results_text) - ) + ).text return OrchestratorResult( question=question, diff --git a/src/agent/tests/conftest.py b/src/agent/tests/conftest.py index b3827ce6a..7cdc3b3c2 100644 --- a/src/agent/tests/conftest.py +++ b/src/agent/tests/conftest.py @@ -2,7 +2,7 @@ import pytest -from llm import LLMBackend +from llm import LLMBackend, LLMResult, LLMUsage class MockLLM(LLMBackend): @@ -11,8 +11,16 @@ class MockLLM(LLMBackend): def __init__(self, response: str = "") -> None: self._response = response - def generate(self, prompt: str, temperature: float = 0.0) -> str: - return self._response + def generate( + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, + ) -> LLMResult: + return LLMResult( + text=self._response, + usage=LLMUsage(prompt_tokens=1, completion_tokens=1, total_tokens=2), + ) class SequentialMockLLM(LLMBackend): @@ -21,8 +29,17 @@ class SequentialMockLLM(LLMBackend): def __init__(self, responses: list[str]) -> None: self._responses = iter(responses) - def generate(self, prompt: str, temperature: float = 0.0) -> str: - return next(self._responses, "") + def generate( + self, + prompt: str, + temperature: float = 0.0, + max_tokens: int | None = None, + ) -> LLMResult: + text = next(self._responses, "") + return LLMResult( + text=text, + usage=LLMUsage(prompt_tokens=1, completion_tokens=1, total_tokens=2), + ) @pytest.fixture diff --git a/src/agent/tests/test_runner.py b/src/agent/tests/test_runner.py index 98647f3a8..5d7c27549 100644 --- a/src/agent/tests/test_runner.py +++ b/src/agent/tests/test_runner.py @@ -16,6 +16,7 @@ ) from agent.plan_execute.models import Plan, PlanStep, StepResult from agent.plan_execute.runner import PlanExecuteRunner +from llm import LLMResult, LLMUsage # ── shared plan strings ─────────────────────────────────────────────────────── @@ -82,9 +83,12 @@ def __init__(self, response: str = "{}") -> None: self.prompts: list[str] = [] self._response = response - def generate(self, prompt: str, **_kw) -> str: + def generate(self, prompt: str, **_kw) -> LLMResult: self.prompts.append(prompt) - return self._response + return LLMResult( + text=self._response, + usage=LLMUsage(prompt_tokens=1, completion_tokens=1, total_tokens=2), + ) # ── orchestrator tests ──────────────────────────────────────────────────────── From b45af081e034af77bf1e93ebb2fd624e22195bc6 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Sat, 11 Apr 2026 23:27:33 -0400 Subject: [PATCH 21/29] refactor: use LLMResult.text in scenario pipeline and FMSR server --- src/scenarios/generator/agent.py | 10 +++++----- src/scenarios/retrieval/digest.py | 4 ++-- src/scenarios/retrieval/pipeline.py | 4 ++-- src/servers/fmsr/main.py | 10 +++++----- src/servers/iot/main.py | 8 ++++---- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/scenarios/generator/agent.py b/src/scenarios/generator/agent.py index f50cc9a23..9d3146d7c 100644 --- a/src/scenarios/generator/agent.py +++ b/src/scenarios/generator/agent.py @@ -373,7 +373,7 @@ def _on_pdf_workflow( self._write_log("03_asset_profile/prompt.txt", prompt) response = self.llm.generate(prompt, max_tokens=_PROFILE_MAX_TOKENS) - parsed, parse_err = parse_llm_json(response) + parsed, parse_err = parse_llm_json(response.text) if not parsed or not isinstance(parsed, dict): raise RuntimeError( f"Failed to parse asset profile JSON from LLM: {parse_err or 'response is not a JSON object'}" @@ -500,7 +500,7 @@ async def allocate_budget(self, profile: AssetProfile, total: int = 50) -> Scena self._write_log("04_budget/prompt.txt", prompt) response = self.llm.generate(prompt) - parsed, _ = parse_llm_json(response) + parsed, _ = parse_llm_json(response.text) if not parsed or not isinstance(parsed, dict): parsed = {} self._write_json_log("04_budget/response.json", parsed) @@ -590,7 +590,7 @@ def generate_single_focus_scenarios( ) response = self.llm.generate(prompt) - parsed, _ = parse_llm_json(response) + parsed, _ = parse_llm_json(response.text) if isinstance(parsed, list): self._write_json_log(f"05_generation/{focus}/generation_response.json", parsed) return parsed @@ -626,7 +626,7 @@ def validate_and_repair( ) response = self.llm.generate(prompt) - parsed, _ = parse_llm_json(response) + parsed, _ = parse_llm_json(response.text) if isinstance(parsed, list): repaired = parsed[: len(scenarios)] self._write_json_log(f"05_generation/{focus}/validate_repair_response.json", repaired) @@ -660,7 +660,7 @@ def construct_multiagent_scenarios( ) response = self.llm.generate(prompt, max_tokens=_MULTIAGENT_MAX_TOKENS) - parsed, _ = parse_llm_json(response) + parsed, _ = parse_llm_json(response.text) if isinstance(parsed, list): self._write_json_log("05_generation/multiagent/generation_response.json", parsed) return parsed diff --git a/src/scenarios/retrieval/digest.py b/src/scenarios/retrieval/digest.py index aae37316e..9d86045ca 100644 --- a/src/scenarios/retrieval/digest.py +++ b/src/scenarios/retrieval/digest.py @@ -130,7 +130,7 @@ def synthesize_research_digest( headings_markdown=RESEARCH_DIGEST_HEADINGS_MARKDOWN, body_text=body_text, ) - digest = llm.generate(prompt, max_tokens=_DIGEST_PER_PAPER_MAX_TOKENS) + digest = llm.generate(prompt, max_tokens=_DIGEST_PER_PAPER_MAX_TOKENS).text block = ( f"### Paper {index} (source: {source_kind})\n{digest.strip()}" ) @@ -144,7 +144,7 @@ def synthesize_research_digest( merge_headings_markdown=RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN, per_paper_digests="\n\n".join(per_paper_digests), ) - merged = llm.generate(merge_prompt, max_tokens=_DIGEST_MERGE_MAX_TOKENS).strip() + merged = llm.generate(merge_prompt, max_tokens=_DIGEST_MERGE_MAX_TOKENS).text.strip() if log_writer: log_writer("02_retrieval/paper_digest/merged.txt", merged) return merged diff --git a/src/scenarios/retrieval/pipeline.py b/src/scenarios/retrieval/pipeline.py index 64c57859e..35fa3adcb 100644 --- a/src/scenarios/retrieval/pipeline.py +++ b/src/scenarios/retrieval/pipeline.py @@ -196,7 +196,7 @@ def _judge_metadata_batch( metadata_entries_json=_summarise_metadata_for_judge(candidates), ) response = llm.generate(prompt) - parsed, _ = parse_llm_json(response) + parsed, _ = parse_llm_json(response.text) scored_by_id: dict[str, tuple[int, str]] = {} if isinstance(parsed, list): @@ -553,7 +553,7 @@ def _retrieve_for_section( section_heading=section_heading, ) response = llm.generate(prompt) - parsed, _ = parse_llm_json(response) + parsed, _ = parse_llm_json(response.text) action = _coerce_action(parsed) canonical_asset_name = action.canonical_asset_name diff --git a/src/servers/fmsr/main.py b/src/servers/fmsr/main.py index 21644f740..f136906ab 100644 --- a/src/servers/fmsr/main.py +++ b/src/servers/fmsr/main.py @@ -219,7 +219,7 @@ def _call_asset2fm(asset_name: str) -> list[str]: last_exc: Exception | None = None for _ in range(_MAX_RETRIES): try: - result = _parse_numbered_list(_llm.generate(prompt)) + result = _parse_numbered_list(_llm.generate(prompt).text) _asset2fm_cache[asset_name] = result return result except Exception as exc: @@ -235,7 +235,7 @@ def _call_relevancy(asset_name: str, failure_mode: str, sensor: str) -> dict: last_exc: Exception | None = None for _ in range(_MAX_RETRIES): try: - return _parse_relevancy(_llm.generate(prompt)) + return _parse_relevancy(_llm.generate(prompt).text) except Exception as exc: last_exc = exc raise last_exc @@ -260,7 +260,7 @@ def _call_dga( last_exc: Exception | None = None for _ in range(_MAX_RETRIES): try: - raw = _llm.generate(prompt) + raw = _llm.generate(prompt).text return _parse_dga_response(raw) except Exception as exc: last_exc = exc @@ -281,7 +281,7 @@ def _call_winding( last_exc: Exception | None = None for _ in range(_MAX_RETRIES): try: - raw = _llm.generate(prompt) + raw = _llm.generate(prompt).text return _parse_winding_response(raw) except Exception as exc: last_exc = exc @@ -320,7 +320,7 @@ def _call_load( last_exc: Exception | None = None for _ in range(_MAX_RETRIES): try: - raw = _llm.generate(prompt) + raw = _llm.generate(prompt).text return _parse_load_response(raw) except Exception as exc: last_exc = exc diff --git a/src/servers/iot/main.py b/src/servers/iot/main.py index 1ad2472a1..79e786b0b 100644 --- a/src/servers/iot/main.py +++ b/src/servers/iot/main.py @@ -237,13 +237,13 @@ def get_asset_coverage() -> List[Dict[str, Any]]: @mcp.tool(title="List Sites") -def sites() -> SitesResult: +def get_sites() -> SitesResult: """Retrieves a list of sites. Each site is represented by a name.""" return SitesResult(sites=SITES) @mcp.tool(title="List Assets") -def assets(site_name: str) -> Union[AssetsResult, ErrorResult]: +def get_assets(site_name: str) -> Union[AssetsResult, ErrorResult]: """Returns a list of assets for a given site. Each asset includes an id and a name.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -258,7 +258,7 @@ def assets(site_name: str) -> Union[AssetsResult, ErrorResult]: @mcp.tool(title="List Sensors") -def sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: +def get_sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: """Lists the sensors available for a specified asset at a given site.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -277,7 +277,7 @@ def sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: @mcp.tool(title="Get Sensor History") -def history( +def get_history( site_name: str, asset_id: str, start: str, final: Optional[str] = None ) -> Union[HistoryResult, ErrorResult]: """Returns a list of historical sensor values for the specified asset(s) at a site within a given time range (start to final).""" From 6353d0a9a251a996726c1fc1e4a0506d97b6f51e Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Sat, 11 Apr 2026 23:38:15 -0400 Subject: [PATCH 22/29] docs: list IoT MCP tools as get_sites, get_assets, get_sensors, get_history --- INSTRUCTIONS.md | 14 +++++++------- README.md | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index 76cb7df5f..7ac5fd1a7 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -135,12 +135,12 @@ uv run vibration-mcp-server **Path:** `src/servers/iot/main.py` **Requires:** CouchDB (`COUCHDB_URL`, `COUCHDB_USERNAME`, `COUCHDB_PASSWORD`, `IOT_DBNAME`) -| Tool | Arguments | Description | -| --------- | ------------------------------------------ | ----------------------------------------------------------------------- | -| `sites` | — | List all available sites | -| `assets` | `site_name` | List all asset IDs for a site | -| `sensors` | `site_name`, `asset_id` | List sensor names for an asset | -| `history` | `site_name`, `asset_id`, `start`, `final?` | Fetch historical sensor readings for a time range (ISO 8601 timestamps) | +| Tool | Arguments | Description | +| ------------- | ------------------------------------------ | ----------------------------------------------------------------------- | +| `get_sites` | — | List all available sites | +| `get_assets` | `site_name` | List all asset IDs for a site | +| `get_sensors` | `site_name`, `asset_id` | List sensor names for an asset | +| `get_history` | `site_name`, `asset_id`, `start`, `final?` | Fetch historical sensor readings for a time range (ISO 8601 timestamps) | ### utilities — Utilities @@ -316,7 +316,7 @@ Expected plan (3 parallel steps, no dependencies): ``` [1] utilities : current_date_time() -[2] iot : assets(site_name="MAIN") +[2] iot : get_assets(site_name="MAIN") [3] fmsr : get_failure_modes(asset_name="chiller") ``` diff --git a/README.md b/README.md index b4867f425..393ef0943 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ Explore all scenarios [HF-Dataset](https://huggingface.co/datasets/ibm-research/ ## AI Agents ### Domain-Specific Agents (Important tools) - **IoT Agent**: `get_sites`, `get_history`, `get_assets`, `get_sensors` -- **FMSR Agent**: `get_sensors`, `get_failure_modes`, `get_failure_sensor_mapping` +- **FMSR Agent**: `get_failure_modes`, `get_failure_mode_sensor_mapping`, … - **TSFM Agent**: `forecasting`, `timeseries_anomaly_detection` - **WO Agent**: `generate_work_order` From e930acd7b81721b1e80c2d13378724c3ca483013 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Sat, 11 Apr 2026 23:38:16 -0400 Subject: [PATCH 23/29] test: align plan-execute and Claude runner tests with IoT get_* tool names --- src/agent/claude_agent/tests/test_runner.py | 8 +-- src/agent/tests/test_models.py | 2 +- src/agent/tests/test_planner.py | 37 +++++++------ src/agent/tests/test_runner.py | 58 ++++++++++----------- 4 files changed, 55 insertions(+), 50 deletions(-) diff --git a/src/agent/claude_agent/tests/test_runner.py b/src/agent/claude_agent/tests/test_runner.py index b90c9b348..2f0a8fe3f 100644 --- a/src/agent/claude_agent/tests/test_runner.py +++ b/src/agent/claude_agent/tests/test_runner.py @@ -130,7 +130,7 @@ async def test_run_collects_trajectory(): from claude_agent_sdk import AssistantMessage, ResultMessage, TextBlock, ToolUseBlock mock_tool = MagicMock(spec=ToolUseBlock) - mock_tool.name = "sensors" + mock_tool.name = "get_sensors" mock_tool.input = {"asset_id": "CH-6"} mock_tool.id = "tu_123" @@ -159,7 +159,7 @@ async def fake_query(prompt, options): turn = traj.turns[0] assert turn.text == "Calling sensors tool..." assert len(turn.tool_calls) == 1 - assert turn.tool_calls[0].name == "sensors" + assert turn.tool_calls[0].name == "get_sensors" assert turn.tool_calls[0].input == {"asset_id": "CH-6"} assert turn.input_tokens == 100 assert turn.output_tokens == 20 @@ -174,7 +174,7 @@ async def test_run_tool_output_captured(): from claude_agent_sdk import AssistantMessage, ResultMessage, TextBlock, ToolUseBlock mock_tool = MagicMock(spec=ToolUseBlock) - mock_tool.name = "sensors" + mock_tool.name = "get_sensors" mock_tool.input = {"asset_id": "CH-6"} mock_tool.id = "tu_456" @@ -223,7 +223,7 @@ async def test_run_tool_output_string_response(): from claude_agent_sdk import AssistantMessage, ResultMessage, TextBlock, ToolUseBlock mock_tool = MagicMock(spec=ToolUseBlock) - mock_tool.name = "sites" + mock_tool.name = "get_sites" mock_tool.input = {} mock_tool.id = "tu_789" diff --git a/src/agent/tests/test_models.py b/src/agent/tests/test_models.py index b9ce43f00..f00e235f7 100644 --- a/src/agent/tests/test_models.py +++ b/src/agent/tests/test_models.py @@ -8,7 +8,7 @@ def _step(n: int, deps: list[int] | None = None) -> PlanStep: step_number=n, task=f"Task {n}", server="iot", - tool="sites", + tool="get_sites", tool_args={}, dependencies=deps or [], expected_output="output", diff --git a/src/agent/tests/test_planner.py b/src/agent/tests/test_planner.py index 77bc4497d..825a3834f 100644 --- a/src/agent/tests/test_planner.py +++ b/src/agent/tests/test_planner.py @@ -5,20 +5,20 @@ _TWO_STEP = """\ #Task1: List all available IoT sites #Server1: iot -#Tool1: sites +#Tool1: get_sites #Dependency1: None #ExpectedOutput1: A list of site names #Task2: Get assets at site MAIN #Server2: iot -#Tool2: assets +#Tool2: get_assets #Dependency2: #S1 #ExpectedOutput2: A list of asset IDs""" _MULTI_DEP = """\ #Task1: Get sites #Server1: iot -#Tool1: sites +#Tool1: get_sites #Dependency1: None #ExpectedOutput1: Sites @@ -59,8 +59,8 @@ def test_server_names(self): def test_tool_names(self): plan = parse_plan(_TWO_STEP) - assert plan.steps[0].tool == "sites" - assert plan.steps[1].tool == "assets" + assert plan.steps[0].tool == "get_sites" + assert plan.steps[1].tool == "get_assets" def test_tool_name_signature_stripped(self): """LLM sometimes copies the 'tool(params)' format from server descriptions. @@ -70,18 +70,18 @@ def test_tool_name_signature_stripped(self): raw = ( "#Task1: Get sites\n" "#Server1: iot\n" - "#Tool1: sites()\n" + "#Tool1: get_sites()\n" "#Dependency1: None\n" "#ExpectedOutput1: Sites\n\n" "#Task2: Get assets\n" "#Server2: iot\n" - "#Tool2: assets(site_name: string)\n" + "#Tool2: get_assets(site_name: string)\n" "#Dependency2: #S1\n" "#ExpectedOutput2: Assets" ) plan = parse_plan(raw) - assert plan.steps[0].tool == "sites" - assert plan.steps[1].tool == "assets" + assert plan.steps[0].tool == "get_sites" + assert plan.steps[1].tool == "get_assets" def test_tool_args_always_empty(self): """Planner no longer generates args — tool_args is always {}.""" @@ -122,13 +122,13 @@ def test_args_lines_in_raw_are_ignored(self): raw = ( "#Task1: Get sites\n" "#Server1: iot\n" - "#Tool1: sites\n" + "#Tool1: get_sites\n" "#Args1: {}\n" "#Dependency1: None\n" "#ExpectedOutput1: Sites\n\n" "#Task2: Get assets\n" "#Server2: iot\n" - "#Tool2: assets\n" + "#Tool2: get_assets\n" '#Args2: {"site_name": "MAIN"}\n' "#Dependency2: #S1\n" "#ExpectedOutput2: Assets" @@ -144,11 +144,13 @@ def test_generate_plan_uses_llm_output(self, mock_llm): planner = Planner(llm) plan = planner.generate_plan( "List all assets", - {"iot": " - sites(): List sites\n - assets(site_name: string): List assets"}, + { + "iot": " - get_sites(): List sites\n - get_assets(site_name: string): List assets" + }, ) assert len(plan.steps) == 2 assert plan.steps[0].server == "iot" - assert plan.steps[1].tool == "assets" + assert plan.steps[1].tool == "get_assets" def test_generate_plan_prompt_contains_question(self, mock_llm, monkeypatch): captured = [] @@ -158,7 +160,7 @@ def test_generate_plan_prompt_contains_question(self, mock_llm, monkeypatch): Planner(llm).generate_plan( "What sensors exist for CH-1?", - {"iot": " - sites(): List sites"}, + {"iot": " - get_sites(): List sites"}, ) assert "What sensors exist for CH-1?" in captured[0] @@ -170,7 +172,10 @@ def test_generate_plan_prompt_contains_agent_names(self, mock_llm, monkeypatch): Planner(llm).generate_plan( "Q", - {"iot": " - sites(): List sites", "utilities": " - current_date_time(): Get time"}, + { + "iot": " - get_sites(): List sites", + "utilities": " - current_date_time(): Get time", + }, ) assert "iot" in captured[0] assert "utilities" in captured[0] @@ -182,5 +187,5 @@ def test_generate_plan_prompt_does_not_mention_args(self, mock_llm): original = llm.generate llm.generate = lambda p, **kw: (captured.append(p), original(p))[1] - Planner(llm).generate_plan("Q", {"iot": " - sites(): List sites"}) + Planner(llm).generate_plan("Q", {"iot": " - get_sites(): List sites"}) assert "#Args" not in captured[0] diff --git a/src/agent/tests/test_runner.py b/src/agent/tests/test_runner.py index 5d7c27549..9a571e5f3 100644 --- a/src/agent/tests/test_runner.py +++ b/src/agent/tests/test_runner.py @@ -23,7 +23,7 @@ _TWO_STEP_PLAN = """\ #Task1: Get IoT sites #Server1: iot -#Tool1: sites +#Tool1: get_sites #Dependency1: None #ExpectedOutput1: List of site names @@ -36,7 +36,7 @@ _FINAL_ANSWER = "Sites: MAIN. Current time: 2026-02-18T13:00:00." _MOCK_TOOLS = [ - {"name": "sites", "description": "List IoT sites", "parameters": []}, + {"name": "get_sites", "description": "List IoT sites", "parameters": []}, {"name": "current_date_time", "description": "Get current datetime", "parameters": []}, ] _TOOL_RESPONSE = json.dumps({"sites": ["MAIN"]}) @@ -61,7 +61,7 @@ def _patch_mcp(tool_response: str = _TOOL_RESPONSE): def _make_step( n: int, server: str = "iot", - tool: str = "sites", + tool: str = "get_sites", deps: list[int] | None = None, expected_output: str = "", ) -> PlanStep: @@ -213,7 +213,7 @@ async def test_executor_step_result_carries_resolved_args(sequential_llm): llm = sequential_llm(['{"site_name": "MAIN"}']) executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) - step = _make_step(1, tool="assets") + step = _make_step(1, tool="get_assets") with ( patch("agent.plan_execute.executor._list_tools", new=AsyncMock(return_value=_MOCK_TOOLS)), patch("agent.plan_execute.executor._call_tool", new=AsyncMock(return_value="{}")), @@ -231,7 +231,7 @@ async def test_executor_tool_call_exception_recorded_as_error(sequential_llm): llm = sequential_llm(['{}']) executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) - step = _make_step(1, tool="sites") + step = _make_step(1, tool="get_sites") with ( patch("agent.plan_execute.executor._list_tools", new=AsyncMock(return_value=_MOCK_TOOLS)), patch("agent.plan_execute.executor._call_tool", new=AsyncMock(side_effect=RuntimeError("timeout"))), @@ -248,15 +248,15 @@ async def test_executor_calls_llm_to_generate_args(sequential_llm): from pathlib import Path llm = sequential_llm([ - '{}', # step 1: sites (no args) - '{"site_name": "MAIN", "asset_id": "CH-1"}', # step 2: sensors + '{}', # step 1: get_sites (no args) + '{"site_name": "MAIN", "asset_id": "CH-1"}', # step 2: get_sensors ]) executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) plan = Plan( steps=[ - _make_step(1, tool="sites"), - _make_step(2, tool="sensors", deps=[1]), + _make_step(1, tool="get_sites"), + _make_step(2, tool="get_sensors", deps=[1]), ], raw="", ) @@ -286,8 +286,8 @@ async def test_executor_prior_step_results_in_llm_prompt(): plan = Plan( steps=[ - _make_step(1, tool="sites"), - _make_step(2, tool="sensors", deps=[1]), + _make_step(1, tool="get_sites"), + _make_step(2, tool="get_sensors", deps=[1]), ], raw="", ) @@ -311,7 +311,7 @@ async def test_executor_no_prior_context_shows_none_in_prompt(): llm = _CapturingLLM('{}') executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) # type: ignore[arg-type] - step = _make_step(1, tool="sites") + step = _make_step(1, tool="get_sites") with ( patch("agent.plan_execute.executor._list_tools", new=AsyncMock(return_value=_MOCK_TOOLS)), patch("agent.plan_execute.executor._call_tool", new=AsyncMock(return_value="{}")), @@ -331,9 +331,9 @@ async def test_executor_context_accumulates_across_steps(): plan = Plan( steps=[ - _make_step(1, tool="sites"), - _make_step(2, tool="assets", deps=[1]), - _make_step(3, tool="sensors", deps=[2]), + _make_step(1, tool="get_sites"), + _make_step(2, tool="get_assets", deps=[1]), + _make_step(3, tool="get_sensors", deps=[2]), ], raw="", ) @@ -356,18 +356,18 @@ async def test_pipeline_uses_llm_args_for_each_step(sequential_llm): planner_output = ( "#Task1: Get IoT sites\n" "#Server1: iot\n" - "#Tool1: sites\n" + "#Tool1: get_sites\n" "#Dependency1: None\n" "#ExpectedOutput1: List of site names\n\n" "#Task2: Get assets at the site from step 1\n" "#Server2: iot\n" - "#Tool2: assets\n" + "#Tool2: get_assets\n" "#Dependency2: #S1\n" "#ExpectedOutput2: List of assets" ) llm = sequential_llm([ planner_output, # planner call - '{}', # arg resolution for step 1 (sites needs no args) + '{}', # arg resolution for step 1 (get_sites needs no args) '{"site_name": "MAIN"}', # arg resolution for step 2 (uses step 1 result) "Final answer.", # summarisation ]) @@ -393,7 +393,7 @@ async def test_resolve_args_with_llm_uses_context(mock_llm): ctx = {1: StepResult(step_number=1, task="t", server="a", response='{"assets": ["CH-1", "CH-2"]}')} result = await _resolve_args_with_llm( - "What sensors does CH-1 have?", "get sensors", "sensors", "", ctx, llm, + "What sensors does CH-1 have?", "get sensors", "get_sensors", "", ctx, llm, ) assert result["asset_id"] == "CH-1" @@ -410,7 +410,7 @@ async def test_resolve_args_with_llm_fallback_on_bad_json(mock_llm): async def test_resolve_args_with_llm_question_in_prompt(): llm = _CapturingLLM('{"site_name": "MAIN"}') await _resolve_args_with_llm( - "What sites exist?", "List sites", "sites", "", {}, llm # type: ignore[arg-type] + "What sites exist?", "List sites", "get_sites", "", {}, llm # type: ignore[arg-type] ) assert "What sites exist?" in llm.prompts[0] @@ -418,8 +418,8 @@ async def test_resolve_args_with_llm_question_in_prompt(): @pytest.mark.anyio async def test_resolve_args_with_llm_tool_in_prompt(): llm = _CapturingLLM('{}') - await _resolve_args_with_llm("Q", "List IoT sites", "sites", "", {}, llm) # type: ignore[arg-type] - assert "sites" in llm.prompts[0] + await _resolve_args_with_llm("Q", "List IoT sites", "get_sites", "", {}, llm) # type: ignore[arg-type] + assert "get_sites" in llm.prompts[0] @pytest.mark.anyio @@ -427,7 +427,7 @@ async def test_resolve_args_with_llm_schema_in_prompt(): """Tool parameter schema appears in the prompt so LLM uses correct names.""" llm = _CapturingLLM('{"site_name": "MAIN"}') await _resolve_args_with_llm( # type: ignore[arg-type] - "Q", "List assets", "assets", "site_name: string", {}, llm + "Q", "List assets", "get_assets", "site_name: string", {}, llm ) assert "site_name: string" in llm.prompts[0] @@ -507,16 +507,16 @@ def test_parse_json_empty_object_returns_empty_dict(): def test_parse_tool_call_plain_json(): - raw = '{"tool": "sites", "args": {}}' + raw = '{"tool": "get_sites", "args": {}}' result = _parse_tool_call(raw) - assert result["tool"] == "sites" + assert result["tool"] == "get_sites" assert result["args"] == {} def test_parse_tool_call_with_markdown_fence(): - raw = '```json\n{"tool": "history", "args": {"site_name": "MAIN"}}\n```' + raw = '```json\n{"tool": "get_history", "args": {"site_name": "MAIN"}}\n```' result = _parse_tool_call(raw) - assert result["tool"] == "history" + assert result["tool"] == "get_history" assert result["args"]["site_name"] == "MAIN" @@ -528,9 +528,9 @@ def test_parse_tool_call_null_tool(): def test_parse_tool_call_embedded_json(): - raw = 'Here is my response: {"tool": "sites", "args": {}} done.' + raw = 'Here is my response: {"tool": "get_sites", "args": {}} done.' result = _parse_tool_call(raw) - assert result["tool"] == "sites" + assert result["tool"] == "get_sites" def test_parse_tool_call_unrecoverable_returns_direct_answer(): From 563c2b18b5e885a8a15a7b4d34490eeddf9fd8e6 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Sat, 11 Apr 2026 23:38:18 -0400 Subject: [PATCH 24/29] test: call IoT MCP tools by get_sites, get_assets, get_sensors, get_history --- src/servers/iot/tests/test_tools.py | 38 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/servers/iot/tests/test_tools.py b/src/servers/iot/tests/test_tools.py index 20b24b593..d22f48ef4 100644 --- a/src/servers/iot/tests/test_tools.py +++ b/src/servers/iot/tests/test_tools.py @@ -10,26 +10,26 @@ # --------------------------------------------------------------------------- -# sites +# get_sites # --------------------------------------------------------------------------- class TestSites: @pytest.mark.anyio async def test_returns_main(self): - data = await call_tool(mcp, "sites", {}) + data = await call_tool(mcp, "get_sites", {}) assert data["sites"] == ["MAIN"] # --------------------------------------------------------------------------- -# assets +# get_assets # --------------------------------------------------------------------------- class TestAssets: @pytest.mark.anyio async def test_invalid_site(self): - data = await call_tool(mcp, "assets", {"site_name": "INVALID"}) + data = await call_tool(mcp, "get_assets", {"site_name": "INVALID"}) assert "error" in data assert "unknown site" in data["error"] @@ -38,7 +38,7 @@ async def test_with_mock_db(self, mock_db): mock_db.find.return_value = { "docs": [{"asset_id": "Chiller 1"}, {"asset_id": "Chiller 2"}] } - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) assert data["total_assets"] == 2 assert "Chiller 1" in data["assets"] @@ -47,21 +47,21 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_db_disconnected(self, no_db): - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) # Should still return valid JSON (empty assets), not crash assert "assets" in data or "error" in data @requires_couchdb @pytest.mark.anyio async def test_discovery_integration(self): - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) assert "assets" in data assert "Chiller 6" in data["assets"] assert data["total_assets"] > 0 # --------------------------------------------------------------------------- -# sensors +# get_sensors # --------------------------------------------------------------------------- @@ -69,14 +69,14 @@ class TestSensors: @pytest.mark.anyio async def test_invalid_site(self): data = await call_tool( - mcp, "sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} + mcp, "get_sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} ) assert "error" in data @pytest.mark.anyio async def test_unknown_asset(self): data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "INVALID"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "INVALID"} ) assert "error" in data assert "no sensors found" in data["error"] @@ -96,7 +96,7 @@ async def test_with_mock_db(self, mock_db): ] } data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} ) assert data["total_sensors"] == 2 @@ -110,7 +110,7 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_success_integration(self): data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} ) assert "sensors" in data assert len(data["sensors"]) > 0 @@ -118,7 +118,7 @@ async def test_success_integration(self): # --------------------------------------------------------------------------- -# history +# get_history # --------------------------------------------------------------------------- @@ -127,7 +127,7 @@ class TestHistory: async def test_invalid_date_range(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -142,7 +142,7 @@ async def test_invalid_date_range(self): async def test_malformed_date(self): data = await call_tool( mcp, - "history", + "get_history", {"site_name": "MAIN", "asset_id": "Chiller 6", "start": "not-a-date"}, ) assert "error" in data @@ -151,7 +151,7 @@ async def test_malformed_date(self): async def test_db_disconnected(self, no_db): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -171,7 +171,7 @@ async def test_with_mock_db(self, mock_db): } data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 1", @@ -188,7 +188,7 @@ async def test_with_mock_db(self, mock_db): async def test_open_ended_integration(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -203,7 +203,7 @@ async def test_open_ended_integration(self): async def test_bounded_range_integration(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", From de56fbc736e39db083fbfd377a9a66b54aea64c0 Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Mon, 20 Apr 2026 23:09:06 -0400 Subject: [PATCH 25/29] feat(scenarios): add negative scenario track with stricter hardness and validation --- src/scenarios/README.md | 96 +++++---- src/scenarios/constraints/__init__.py | 6 + src/scenarios/constraints/policies.py | 32 +++ src/scenarios/constraints/validation.py | 234 +++++++++++++++++++++ src/scenarios/generator/__init__.py | 7 +- src/scenarios/generator/agent.py | 241 ++++++++++++++++++++-- src/scenarios/generator/cli.py | 26 ++- src/scenarios/generator/prompt_helpers.py | 16 +- src/scenarios/models.py | 8 + src/scenarios/prompts/__init__.py | 4 + src/scenarios/prompts/generation.py | 140 +++++++++++-- src/scenarios/utils.py | 188 ++++++++++++++++- 12 files changed, 920 insertions(+), 78 deletions(-) diff --git a/src/scenarios/README.md b/src/scenarios/README.md index 34bc6c7ec..7f42939b5 100644 --- a/src/scenarios/README.md +++ b/src/scenarios/README.md @@ -7,15 +7,15 @@ The generator works in two modes: - `closed_form`: self-contained scenarios where the query itself provides the needed values, rules, summaries, or dataset references. - `open_form`: grounded scenarios that use live CouchDB-backed identifiers discovered from IoT and vibration coverage. -> **Open-form disclaimer:** For grounded `open_form` runs (`--data-in-couchdb`), configure `.env` (or the process environment) so **`IOT_DBNAME`**, **`WO_DBNAME`**, and **`VIBRATION_DBNAME`** each point to live CouchDB databases that actually contain data relevant to the **asset name** you pass on the CLI (for example `"Transformer"` or `"Motor"`). If these names point at the wrong or empty databases, IoT, work-order, and vibration grounding will be misleading or sparse for that asset. +> **Open-form disclaimer:** For grounded `open_form` runs (`--data-in-couchdb`), configure `.env` (or the process environment) so `**IOT_DBNAME`**, `**WO_DBNAME**`, and `**VIBRATION_DBNAME**` each point to live CouchDB databases that actually contain data relevant to the **asset name** you pass on the CLI (for example `"Transformer"` or `"Motor"`). If these names point at the wrong or empty databases, IoT, work-order, and vibration grounding will be misleading or sparse for that asset. -> **Academic retrieval and research digest:** Asset profile construction (Phase 1) runs **grounded discovery** first (full CouchDB IoT/vibration/FMSR discovery only when **`--data-in-couchdb`** is set), then **academic evidence retrieval**, then a **two-step research digest** (per-paper structured extraction, then merge into one Markdown brief), unless you supply a precomputed digest (see below). The `--retriever` flag selects the search backend; default is **`arxiv`**. Use **`--retriever semantic_scholar`** for Semantic Scholar instead. +> **Academic retrieval and research digest:** Asset profile construction (Phase 1) runs **grounded discovery** first (full CouchDB IoT/vibration/FMSR discovery only when `**--data-in-couchdb`** is set), then **academic evidence retrieval**, then a **two-step research digest** (per-paper structured extraction, then merge into one Markdown brief), unless you supply a precomputed digest (see below). The `--retriever` flag selects the search backend; default is `**arxiv`**. Use `**--retriever semantic_scholar**` for Semantic Scholar instead. > -> **Semantic Scholar retrieval:** When using `--retriever semantic_scholar`, set **`SEMANTIC_SCHOLAR_API_KEY`** in `.env` (optional but recommended for higher API rate limits). The CLI does not accept the key as a flag; only the environment variable is read. If unset, the public rate limits apply. +> **Semantic Scholar retrieval:** When using `--retriever semantic_scholar`, set `**SEMANTIC_SCHOLAR_API_KEY`** in `.env` (optional but recommended for higher API rate limits). The CLI does not accept the key as a flag; only the environment variable is read. If unset, the public rate limits apply. > -> **Precomputed research digest:** Pass **`--research-digest PATH`** to a Markdown file that already contains the merged research brief. If that path exists, the run **skips** academic search, PDF/snippet retrieval, and digest LLM calls, and feeds that file straight into asset profile construction. If the path does not exist, the CLI exits with an error. +> **Precomputed research digest:** Pass `**--research-digest PATH`** to a Markdown file that already contains the merged research brief. If that path exists, the run **skips** academic search, PDF/snippet retrieval, and digest LLM calls, and feeds that file straight into asset profile construction. If the path does not exist, the CLI exits with an error. -> For **new asset classes**, add or update **`_ASSET_FAILURE_MODE_ALIASES`** in [`src/servers/fmsr/main.py`](../servers/fmsr/main.py) when the CLI-facing name should map to a different curated failure-mode key in [`failure_modes.yaml`](../servers/fmsr/failure_modes.yaml); otherwise FMSR may fall back to LLM-only failure lists. See **Asset class → curated FMSR failure modes** below for the full picture. +> For **new asset classes**, add or update `**_ASSET_FAILURE_MODE_ALIASES`** in `[src/servers/fmsr/main.py](../servers/fmsr/main.py)` when the CLI-facing name should map to a different curated failure-mode key in `[failure_modes.yaml](../servers/fmsr/failure_modes.yaml)`; otherwise FMSR may fall back to LLM-only failure lists. See **Asset class → curated FMSR failure modes** below for the full picture. The run writes a JSON **array** of scenarios. Each object has this shape: @@ -29,7 +29,9 @@ The run writes a JSON **array** of scenarios. Each object has this shape: } ``` -Allowed `type` values: `iot`, `fmsr`, `tsfm`, `wo`, `vibration`, `multiagent`. Few-shot source JSONL files under [`huggingface/`](huggingface/) still use their own `type` column labels (e.g. `IoT`, `Workorder`) when filtering examples; generated `scenarios.json` uses the canonical keys above. See [`models.py`](models.py) (`Scenario`, `ScenarioTypeKey`). +Allowed `type` values: `iot`, `fmsr`, `tsfm`, `wo`, `vibration`, `multiagent`. Few-shot source JSONL files under `[huggingface/](huggingface/)` still use their own `type` column labels (e.g. `IoT`, `Workorder`) when filtering examples; generated `scenarios.json` uses the canonical keys above. See `[models.py](models.py)` (`Scenario`, `ScenarioTypeKey`). + +When negative generation is enabled, the run also writes a sibling `negative_scenarios.json` file with the same schema. Those scenarios are intentionally unanswerable and expect an explicit insufficiency/refusal-style answer rather than a hallucinated best effort. ## CLI @@ -41,18 +43,21 @@ uv run python -m scenarios.generator "" [options] Key flags: -| Flag | Default | Description | -|---|---|---| -| `asset_name` | required | Asset class name, for example `"Motor"` or `"Transformer"` | -| `--num-scenarios N` | `50` | Total number of scenarios to generate | -| `--model-id MODEL` | project default | LiteLLM model override | -| `--retriever {arxiv,semantic_scholar}` | `arxiv` | Academic search backend for evidence retrieval (omit flag for default) | -| `--research-digest PATH` | unset | If set and the file exists, skip retrieval and digest LLM steps; load this Markdown as the research brief for the asset profile | -| `--data-in-couchdb` | off | Enable grounded open-form generation when live IoT inventory exists (requires `.env` DB names; see open-form disclaimer above) | -| `--show-workflow` | off | Print phase-by-phase progress (Phases 1–4: asset profile → budget → per-focus generation → multiagent), including live repair counts | -| `--log` | off | Write prompts and responses under `logs/` next to `scenarios.json` (same run folder) | -Output is always `generated/scenarios/_scenarios_/scenarios.json` (not configurable; slug from [`text.slugify_asset_name`](text.py)). +| Flag | Default | Description | +| -------------------------------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `asset_name` | required | Asset class name, for example `"Motor"` or `"Transformer"` | +| `--num-scenarios N` | `50` | Total number of scenarios to generate | +| `--num-negative-scenarios N` | `2` | Total number of intentionally unanswerable negative scenarios to generate; use `0` to disable | +| `--model-id MODEL` | project default | LiteLLM model override | +| `--retriever {arxiv,semantic_scholar}` | `arxiv` | Academic search backend for evidence retrieval (omit flag for default) | +| `--research-digest PATH` | unset | If set and the file exists, skip retrieval and digest LLM steps; load this Markdown as the research brief for the asset profile | +| `--data-in-couchdb` | off | Enable grounded open-form generation when live IoT inventory exists (requires `.env` DB names; see open-form disclaimer above) | +| `--show-workflow` | off | Print phase-by-phase progress (Phases 1–5: asset profile → budget → per-focus generation → multiagent → negative scenarios), including live repair counts | +| `--log` | off | Write prompts and responses under `logs/` next to `scenarios.json` (same run folder) | + + +Output always includes `generated/scenarios/_scenarios_/scenarios.json` (not configurable; slug from `[text.slugify_asset_name](text.py)`). When negative generation is enabled, the same run directory also contains `negative_scenarios.json`. Examples: @@ -157,6 +162,8 @@ flowchart TD M --> N["Final JSON output
id, type, text, category, characteristic_form"] ``` + + ## Pipeline ### 1. Grounded discovery @@ -165,7 +172,7 @@ Runs when `--data-in-couchdb` is enabled. - Enumerates IoT assets via the IoT server (`get_asset_list`, sensors, time ranges). - Joins vibration coverage by `(site_name, asset_id)`. -- Calls FMSR for failure modes and failure-to-sensor mapping (with optional cache files in [`failure_mapping/.json`](failure_mapping/)). +- Calls FMSR for failure modes and failure-to-sensor mapping (with optional cache files in `[failure_mapping/.json](failure_mapping/)`). - If there is no IoT inventory at all, the run uses `closed_form` (`open_form_eligible` false). - In grounded runs, focuses without live support can be allocated `0` budget instead of inventing identifiers. @@ -175,7 +182,7 @@ Coherent open-form runs depend on the CLI `asset_name` aligning with how servers #### 1. CLI label and IoT / vibration inventory -[`discover_grounding`](grounding.py) loads the full IoT inventory exposed by the IoT server; it does not substring-filter asset rows by the CLI string. Vibration rows are merged when `(site_name, asset_id)` matches. For scenarios that mention specific assets, use ids and sites that actually appear in the grounded bundle and profile. +`[discover_grounding](grounding.py)` loads the full IoT inventory exposed by the IoT server; it does not substring-filter asset rows by the CLI string. Vibration rows are merged when `(site_name, asset_id)` matches. For scenarios that mention specific assets, use ids and sites that actually appear in the grounded bundle and profile. #### 2. Asset class → curated FMSR failure modes @@ -183,11 +190,11 @@ FMSR failure-mode grounding is most reliable when the asset class maps to a cura Curated failure modes live in: -- [`src/servers/fmsr/failure_modes.yaml`](../servers/fmsr/failure_modes.yaml) +- `[src/servers/fmsr/failure_modes.yaml](../servers/fmsr/failure_modes.yaml)` Alias resolution for lookup lives in: -- [`src/servers/fmsr/main.py`](../servers/fmsr/main.py) via `_ASSET_FAILURE_MODE_ALIASES` and `_resolve_failure_mode_asset_key()` +- `[src/servers/fmsr/main.py](../servers/fmsr/main.py)` via `_ASSET_FAILURE_MODE_ALIASES` and `_resolve_failure_mode_asset_key()` Concrete example: @@ -209,7 +216,7 @@ Recommended rule: #### 3. Failure / sensor grounding -After failure modes are found, grounding builds failure-to-sensor views for scenario generation in [`grounding.py`](grounding.py): either from a cache file under `failure_mapping/` or from `get_failure_mode_sensor_mapping` (then written to cache). +After failure modes are found, grounding builds failure-to-sensor views for scenario generation in `[grounding.py](grounding.py)`: either from a cache file under `failure_mapping/` or from `get_failure_mode_sensor_mapping` (then written to cache). #### 4. Asset class → vibration coverage @@ -217,8 +224,8 @@ After failure modes are found, grounding builds failure-to-sensor views for scen Relevant code: -- [`src/servers/vibration/couchdb_client.py`](../servers/vibration/couchdb_client.py) -- [`src/scenarios/grounding.py`](grounding.py) +- `[src/servers/vibration/couchdb_client.py](../servers/vibration/couchdb_client.py)` +- `[src/scenarios/grounding.py](grounding.py)` Important consequence: @@ -229,7 +236,7 @@ Important consequence: - FMSR: curated `failure_modes.yaml` entry and/or alias, or accepted LLM fallback. - IoT / vibration: asset ids and sites match what you want referenced in open-form text. - Large sensor sets: consider caching under `failure_mapping/.json` after the first successful mapping. -- Few-shot pools include examples adjacent to the new class or focus (see [`utils.py`](utils.py)). +- Few-shot pools include examples adjacent to the new class or focus (see `[utils.py](utils.py)`). #### 6. Troubleshooting example: Transformer @@ -254,12 +261,12 @@ If a run stalls or falls back unexpectedly, inspect: ### 2. Asset profile synthesis -Phase 1 always runs [`discover_grounding`](grounding.py) first (full CouchDB IoT/vibration/FMSR work only when `--data-in-couchdb` is set; otherwise the bundle stays in closed-form shape). Then literature and digest steps depend on **`--research-digest`**: +Phase 1 always runs `[discover_grounding](grounding.py)` first (full CouchDB IoT/vibration/FMSR work only when `--data-in-couchdb` is set; otherwise the bundle stays in closed-form shape). Then literature and digest steps depend on `**--research-digest**`: - **Precomputed digest:** If `--research-digest PATH` is set and the file exists, academic retrieval and digest LLM calls are skipped; that Markdown is passed into the profile builder as the research brief. -- **Live pipeline:** Otherwise [`retrieve_asset_evidence`](retrieval/pipeline.py) runs. For each merge-section heading in [`prompts/research_digest.py`](prompts/research_digest.py) (for example condition monitoring, maintenance context, sensor modalities, failure modes, standards, operator/manager tasks), the planner issues bounded search queries against the configured backend (`arxiv` default or `semantic_scholar`), judges metadata relevance, keeps candidates whose PDF URLs pass an HTTP probe, downloads up to a few top PDFs, and builds text snippets. [`synthesize_research_digest`](retrieval/digest.py) then runs **per-paper** structured extraction followed by a **merge** pass into one Markdown digest. +- **Live pipeline:** Otherwise `[retrieve_asset_evidence](retrieval/pipeline.py)` runs. For each merge-section heading in `[prompts/research_digest.py](prompts/research_digest.py)` (for example condition monitoring, maintenance context, sensor modalities, failure modes, standards, operator/manager tasks), the planner issues bounded search queries against the configured backend (`arxiv` default or `semantic_scholar`), judges metadata relevance, keeps candidates whose PDF URLs pass an HTTP probe, downloads up to a few top PDFs, and builds text snippets. `[synthesize_research_digest](retrieval/digest.py)` then runs **per-paper** structured extraction followed by a **merge** pass into one Markdown digest. -The final [`PROFILE_BUILDER_PROMPT`](prompts/asset_profile.py) call combines: +The final `[PROFILE_BUILDER_PROMPT](prompts/asset_profile.py)` call combines: - the grounding summary (JSON) - the merged research digest (Markdown) @@ -290,11 +297,11 @@ Budget is allocated across: Special handling: - `vibration=0` when grounded open-form coverage does not include matching vibration-backed assets for the asset class. -- `multiagent` is capped at **75%** of the total budget (see `_multiagent_budget_cap` in [`generator/prompt_helpers.py`](generator/prompt_helpers.py)). +- `multiagent` is capped at **75%** of the total budget (see `_multiagent_budget_cap` in `[generator/prompt_helpers.py](generator/prompt_helpers.py)`). ### 4. Few-shot retrieval -Few-shot examples are drawn from the JSONL files under [`huggingface/`](huggingface/) and, for vibration, from [`local/vibration_utterance.json`](local/vibration_utterance.json). Per-focus sourcing is implemented in [`utils.py`](utils.py) (`_build_candidate_pool`): +Few-shot examples are drawn from the JSONL files under `[huggingface/](huggingface/)` and, for vibration, from `[local/vibration_utterance.json](local/vibration_utterance.json)`. Per-focus sourcing is implemented in `[utils.py](utils.py)` (`_build_candidate_pool`): - **iot / wo**: filtered rows from `huggingface/scenarios/all_utterance.jsonl` - **fmsr**: `huggingface/task/failure_mapping_senarios.jsonl` (bucketed shapes) @@ -302,16 +309,22 @@ Few-shot examples are drawn from the JSONL files under [`huggingface/`](huggingf - **vibration**: `local/vibration_utterance.json` - **multiagent**: `huggingface/asset/compressor_utterance.jsonl`, `huggingface/asset/hydrolicpump_utterance.jsonl`, plus multiagent rows from `all_utterance.jsonl` -Ranking considers: +Selection now mixes two kinds of references: + +- structurally hard examples from the focus-specific pool (for example TSFM rule-monitoring prompts) +- more natural end-user examples from `all_utterance.jsonl`, compressor/hydraulic-pump asset prompts, and local vibration prompts -- asset/entity similarity -- focus similarity -- closed-form vs open-form fit -- operator or manager wording fit +Ranking and selection consider: + +- structural difficulty (multi-part asks, constraints, if/else or fallback language) +- end-user-centric wording fit +- focus relevance from the local corpus + +Prompt instructions explicitly treat legacy few-shots as structure references only and prefer direct operator/manager phrasing in the generated output. ### 5. Scenario generation and validation -Generation is budgeted and validated per focus lane; the same lane is serialized as `type` in the output. [`constraints`](constraints/) enforces: +Generation is budgeted and validated per focus lane; the same lane is serialized as `type` in the output. `[constraints](constraints/)` enforces: - required schema fields - duplicate avoidance @@ -320,6 +333,10 @@ Generation is budgeted and validated per focus lane; the same lane is serialized - grounded identifiers for open-form requests - at least two namespaces for multiagent workflows +The valid generation loop now runs an always-on LLM validate/repair pass before deterministic validation so the batch can be rewritten toward harder, more user-centric prompts even when the raw JSON is already parseable. + +The default negative track runs separately after valid generation. Negative scenarios are not counted against `--num-scenarios`; they are validated to reject accidentally answerable prompts and are written to `negative_scenarios.json`. + Cross-focus support is allowed as long as the primary focus remains clear. ## Closed-form vs open-form @@ -349,10 +366,12 @@ Open-form scenarios may require live retrieval, but every concrete identifier mu - sensor names - explicit time bounds -## Output file +## Output files `scenarios.json` is a JSON array of objects matching the schema at the top of this document. Field meanings: `id` (stable id), `type` (benchmark lane: `iot`, `fmsr`, `tsfm`, `wo`, `vibration`, or `multiagent`), `text` (user request), `category`, `characteristic_form` (expected tools and answer shape). +`negative_scenarios.json` uses the same object shape. Its entries are intentionally unanswerable and expect the system to explain what is missing or unsupported instead of fabricating an answer. + ## Logs When `--log` is enabled, prompts and raw responses are written under `generated/scenarios/_scenarios_/logs/`, next to `scenarios.json`. Stage-specific subdirectories mirror the pipeline steps. @@ -362,9 +381,10 @@ Typical files include (within each stage folder, filenames are prefixed with a p - `01_grounding/` — grounded bundle JSON (`discovery.json` stem) - `02_retrieval/paper_search//step_*.txt` — one bounded ReAct loop per research-digest section; `02_retrieval/paper_search/summary.txt` — final ranked pool and selected PDFs - optional `02_retrieval/paper_search/raw_arxiv.json` or `raw_semantic_scholar.json` — raw API payloads when using those backends -- `02_retrieval/paper_digest/per_paper_*.txt` and `merged.txt` — produced by live digest synthesis; with **`--research-digest`** there are no per-paper steps, but **`--log`** still writes `merged.txt` from the loaded file +- `02_retrieval/paper_digest/per_paper_*.txt` and `merged.txt` — produced by live digest synthesis; with `**--research-digest**` there are no per-paper steps, but `**--log**` still writes `merged.txt` from the loaded file - `03_asset_profile/prompt.txt`, `response.json`, and `final_asset_profile.json` - `04_budget/prompt.txt` and `response.json` - `05_generation//generation_prompt.txt`, `generation_response.json`, and validate/repair prompts under the same focus folder (including `multiagent`, which uses the multi-agent combiner prompt in the same layout as other focuses) - optional `05_generation//deterministic_failures_attempt_*.json` when validation fails and retries +- `06_negative_generation//generation_prompt.txt`, `generation_response.json`, and validate/repair artifacts for negative scenarios when the negative track is enabled diff --git a/src/scenarios/constraints/__init__.py b/src/scenarios/constraints/__init__.py index b1b3673df..3445fe1d7 100644 --- a/src/scenarios/constraints/__init__.py +++ b/src/scenarios/constraints/__init__.py @@ -7,6 +7,7 @@ format_accepted_scenarios_for_prompt, format_categories_for_prompt, format_forbidden_patterns_for_prompt, + format_hardness_guidance_for_prompt, format_mode_requirements, format_requirements_for_prompt, get_scenario_policy, @@ -14,6 +15,8 @@ from .validation import ( ScenarioValidationFailure, failure_payload, + validate_negative_scenario, + validate_negative_scenario_batch, validate_scenario, validate_scenario_batch, ) @@ -27,9 +30,12 @@ "format_accepted_scenarios_for_prompt", "format_categories_for_prompt", "format_forbidden_patterns_for_prompt", + "format_hardness_guidance_for_prompt", "format_mode_requirements", "format_requirements_for_prompt", "get_scenario_policy", + "validate_negative_scenario", + "validate_negative_scenario_batch", "validate_scenario", "validate_scenario_batch", ] diff --git a/src/scenarios/constraints/policies.py b/src/scenarios/constraints/policies.py index beeb9a193..0ea1bcc17 100644 --- a/src/scenarios/constraints/policies.py +++ b/src/scenarios/constraints/policies.py @@ -26,6 +26,7 @@ class FocusPolicy: categories: tuple[str, ...] prompt_requirements: tuple[str, ...] forbidden_patterns: tuple[str, ...] + hardness_guidance: tuple[str, ...] def format_categories(self) -> str: return _format_bullet_list(self.categories) @@ -36,6 +37,9 @@ def format_requirements(self) -> str: def format_forbidden_patterns(self) -> str: return _format_bullet_list(self.forbidden_patterns) + def format_hardness_guidance(self) -> str: + return _format_bullet_list(self.hardness_guidance) + SCENARIO_POLICIES: dict[str, FocusPolicy] = { "iot": FocusPolicy( @@ -48,6 +52,10 @@ def format_forbidden_patterns(self) -> str: FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, "Avoid turning a primary IoT scenario into a generic asset essay with no telemetry task.", ), + hardness_guidance=( + "Make hard IoT scenarios combine telemetry retrieval with at least one follow-up comparison, prioritization, or summary request.", + "Use fallback clauses for missing or conflicting channels, such as asking for an alternate signal or a secondary comparison if a sensor is unavailable.", + ), ), "fmsr": FocusPolicy( categories=("Knowledge Query", "Diagnostic Assessment", "Recommendation"), @@ -59,6 +67,10 @@ def format_forbidden_patterns(self) -> str: FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, "Avoid generic telemetry listing tasks with no failure, reliability, or engineering reasoning.", ), + hardness_guidance=( + "Make hard FMSR scenarios combine a diagnosis or failure-mode assessment with a ranked explanation, confidence framing, or recommended next check.", + "Use fallback clauses for incomplete evidence, such as asking what to conclude if one reading is missing or two fault signatures disagree.", + ), ), "tsfm": FocusPolicy( categories=( @@ -75,6 +87,10 @@ def format_forbidden_patterns(self) -> str: FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, "Avoid plain asset discovery or failure-list questions with no time-series analysis task.", ), + hardness_guidance=( + "Make hard TSFM scenarios combine a forecast, anomaly check, or model comparison with at least one decision-oriented follow-up such as escalation, confidence, or threshold interpretation.", + "Use fallback clauses for missing channels, alternate horizons, or alternate baselines when the preferred signal or window is unavailable.", + ), ), "wo": FocusPolicy( categories=("Decision Support", "Prediction", "Knowledge Query"), @@ -86,6 +102,10 @@ def format_forbidden_patterns(self) -> str: FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, "Avoid plain sensor-list or standalone forecasting tasks with no maintenance decision component.", ), + hardness_guidance=( + "Make hard WO scenarios combine review of alerts/events/history with a scheduling, bundling, or prioritization decision.", + "Use fallback clauses such as recommending a plan only if no similar corrective work order already exists, otherwise comparing with the existing plan.", + ), ), "vibration": FocusPolicy( categories=( @@ -102,6 +122,10 @@ def format_forbidden_patterns(self) -> str: FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, "Avoid generic telemetry prompts that do not require vibration-specific tools or reasoning.", ), + hardness_guidance=( + "Make hard vibration scenarios combine a spectrum or severity assessment with a likely fault interpretation and an operating/maintenance recommendation.", + "Use fallback clauses for alternate machine context, such as what to do if the RPM, bearing model, or severity zone is uncertain.", + ), ), "multiagent": FocusPolicy( categories=("Knowledge Query", "Workflow Coordination"), @@ -113,6 +137,10 @@ def format_forbidden_patterns(self) -> str: FORBIDDEN_MCP_NAMES_IN_SCENARIO_TEXT, "Avoid collapsing multiagent scenarios into a single-focus task.", ), + hardness_guidance=( + "Make hard multiagent scenarios require at least two distinct intermediate findings before a final decision, with one step informing the next.", + "Use fallback clauses when those findings disagree, such as escalating only if both diagnostics and planning signals point to risk, otherwise recommending additional checks.", + ), ), } @@ -136,6 +164,10 @@ def format_forbidden_patterns_for_prompt(focus: str) -> str: return get_scenario_policy(focus).format_forbidden_patterns() +def format_hardness_guidance_for_prompt(focus: str) -> str: + return get_scenario_policy(focus).format_hardness_guidance() + + def format_accepted_scenarios_for_prompt( scenarios: Iterable[dict], limit: int = 12 ) -> str: diff --git a/src/scenarios/constraints/validation.py b/src/scenarios/constraints/validation.py index 73dd7ab6c..7dc8da820 100644 --- a/src/scenarios/constraints/validation.py +++ b/src/scenarios/constraints/validation.py @@ -4,6 +4,7 @@ from collections.abc import Iterable, Mapping from dataclasses import dataclass +from datetime import datetime from difflib import SequenceMatcher import json import re @@ -14,6 +15,46 @@ _TOOL_PATTERN_TEMPLATE = r"(? tuple[list[dict], list[ScenarioValidationFailure]]: + prior_texts = [ + str(scenario.get("text", "")) + for scenario in (accepted_scenarios or []) + if str(scenario.get("text", "")).strip() + ] + valid: list[dict] = [] + failures: list[ScenarioValidationFailure] = [] + + for scenario in scenarios: + reasons = validate_negative_scenario( + focus, + scenario, + accepted_texts=prior_texts + [str(item.get("text", "")) for item in valid], + profile=profile, + generation_mode=generation_mode, + tool_names_by_focus=tool_names_by_focus, + ) + if reasons: + failures.append( + ScenarioValidationFailure(scenario=scenario, reasons=tuple(reasons)) + ) + continue + valid.append(scenario) + + return valid, failures + + def _flatten_tool_names( tool_names_by_focus: Mapping[str, tuple[str, ...]] | None, ) -> tuple[str, ...]: @@ -143,6 +219,36 @@ def validate_scenario( return reasons +def validate_negative_scenario( + focus: str, + scenario: dict, + accepted_texts: Iterable[str] | None = None, + profile: AssetProfile | None = None, + generation_mode: str = "closed_form", + tool_names_by_focus: Mapping[str, tuple[str, ...]] | None = None, +) -> list[str]: + reasons = _validate_required_fields(scenario) + if reasons: + return reasons + + text = str(scenario["text"]).strip() + characteristic_form = str(scenario["characteristic_form"]).strip() + combined = f"{text}\n{characteristic_form}" + + reasons.extend(_validate_text_excludes_tool_names(text, tool_names_by_focus)) + + reasons.extend(_validate_negative_expectation(characteristic_form)) + reasons.extend( + _validate_negative_answerability( + focus, + combined, + profile=profile, + generation_mode=generation_mode, + ) + ) + return reasons + + def _validate_required_fields(scenario: dict) -> list[str]: reasons: list[str] = [] for field in _REQUIRED_TEXT_FIELDS: @@ -152,6 +258,15 @@ def _validate_required_fields(scenario: dict) -> list[str]: return reasons +def _validate_negative_expectation(characteristic_form: str) -> list[str]: + lowered = characteristic_form.lower() + if any(hint in lowered for hint in _NEGATIVE_EXPECTATION_HINTS): + return [] + return [ + "negative scenarios must require an explicit insufficiency/refusal response in characteristic_form" + ] + + def _validate_primary_focus( focus: str, characteristic_form: str, @@ -220,6 +335,125 @@ def _validate_open_form_grounding( ] +def _validate_negative_answerability( + focus: str, + combined: str, + *, + profile: AssetProfile | None, + generation_mode: str, +) -> list[str]: + if _has_unsupported_external_dependency(combined): + return [] + if _has_out_of_range_time_reference(combined, profile, focus): + return [] + if _has_unknown_identifier_reference(combined, profile, focus): + return [] + if generation_mode == "closed_form" and _LONG_HORIZON_PATTERN.search(combined): + return [] + return [ + "negative scenario appears answerable; include a concrete unsupported condition such as an unknown identifier, out-of-range time reference, or unavailable external dependency" + ] + + +def _has_unsupported_external_dependency(text: str) -> bool: + lowered = text.lower() + return any(re.search(pattern, lowered) for pattern in _UNSUPPORTED_DEPENDENCY_PATTERNS) + + +def _parse_timestamp(value: str) -> datetime | None: + candidate = value.strip() + if not candidate: + return None + try: + if "T" in candidate: + normalized = candidate.replace("Z", "+00:00") + return datetime.fromisoformat(normalized) + return datetime.fromisoformat(candidate) + except ValueError: + return None + + +def _grounded_time_bounds(profile: AssetProfile | None, focus: str) -> tuple[datetime, datetime] | None: + if profile is None: + return None + parsed = [ + timestamp + for timestamp in ( + _parse_timestamp(value) for value in profile.grounded_timestamps(focus) + ) + if timestamp is not None + ] + if not parsed: + return None + return min(parsed), max(parsed) + + +def _has_out_of_range_time_reference( + text: str, + profile: AssetProfile | None, + focus: str, +) -> bool: + bounds = _grounded_time_bounds(profile, focus) + if bounds is None: + return False + start, end = bounds + for raw in _ISO_TIMESTAMP_PATTERN.findall(text): + parsed = _parse_timestamp(raw) + if parsed is None: + continue + if parsed < start or parsed > end: + return True + for raw_year in _YEAR_PATTERN.findall(text): + year = int(raw_year) + if year < start.year or year > end.year: + return True + return False + + +def _extract_identifier_mentions(text: str) -> list[str]: + mentions: list[str] = [] + for pattern in _EXPLICIT_IDENTIFIER_PATTERNS: + for match in pattern.finditer(text): + mentions.append(match.group(1).strip(" ,.;:!?")) + mentions.extend(_ASSET_TOKEN_PATTERN.findall(text)) + deduped: list[str] = [] + seen: set[str] = set() + for mention in mentions: + lowered = mention.lower() + if lowered in seen: + continue + seen.add(lowered) + deduped.append(mention) + return deduped + + +def _has_unknown_identifier_reference( + text: str, + profile: AssetProfile | None, + focus: str, +) -> bool: + if profile is None: + return False + allowed = { + identifier.lower() + for identifier in ( + profile.grounded_sites() + + profile.grounded_asset_ids(focus) + + profile.grounded_sensor_names(focus) + ) + if identifier + } + if not allowed: + return False + for mention in _extract_identifier_mentions(text): + lowered = mention.lower() + if lowered in allowed: + continue + if any(char.isdigit() for char in mention) or "site " in text.lower(): + return True + return False + + def _is_duplicate_text(text: str, accepted_texts: Iterable[str]) -> bool: normalized = normalize_for_fuzzy_dedup(text) if not normalized: diff --git a/src/scenarios/generator/__init__.py b/src/scenarios/generator/__init__.py index 0825da535..7adcf7f2d 100644 --- a/src/scenarios/generator/__init__.py +++ b/src/scenarios/generator/__init__.py @@ -2,11 +2,16 @@ from .agent import ScenarioGeneratorAgent from .cli import main -from .prompt_helpers import DEFAULT_GENERATED_SCENARIOS_DIR, default_scenario_output_path +from .prompt_helpers import ( + DEFAULT_GENERATED_SCENARIOS_DIR, + default_scenario_output_path, + negative_scenario_output_path, +) __all__ = [ "DEFAULT_GENERATED_SCENARIOS_DIR", "ScenarioGeneratorAgent", "default_scenario_output_path", + "negative_scenario_output_path", "main", ] diff --git a/src/scenarios/generator/agent.py b/src/scenarios/generator/agent.py index 9d3146d7c..d1031d963 100644 --- a/src/scenarios/generator/agent.py +++ b/src/scenarios/generator/agent.py @@ -17,9 +17,10 @@ format_accepted_scenarios_for_prompt, format_categories_for_prompt, format_forbidden_patterns_for_prompt, + format_hardness_guidance_for_prompt, format_mode_requirements, format_requirements_for_prompt, - get_scenario_policy, + validate_negative_scenario_batch, validate_scenario_batch, ) from ..grounding import discover_grounding @@ -30,12 +31,15 @@ KeyDescription, RetrieverMode, Scenario, + ScenarioGenerationResult, ScenarioBudget, SensorNameDescription, ) from ..prompts import ( BUDGET_ALLOCATOR_PROMPT, MULTIAGENT_COMBINER_PROMPT, + NEGATIVE_SCENARIO_GENERATOR_PROMPT, + NEGATIVE_VALIDATE_REPAIR_PROMPT, PROFILE_BUILDER_PROMPT, SCENARIO_GENERATOR_PROMPT, VALIDATE_REPAIR_PROMPT, @@ -51,6 +55,7 @@ _asset_profile_json, _few_shot_examples_section, _grounding_summary_for_prompt, + hard_scenario_target, _invert_failure_mapping, _label_desc_dict_from_list, _multiagent_budget_cap, @@ -131,7 +136,8 @@ async def run( asset_name: str, num_scenarios: int = 50, data_in_couchdb: bool = False, - ) -> list[Scenario]: + num_negative_scenarios: int = 2, + ) -> ScenarioGenerationResult: asset_name = asset_name.strip() if not asset_name: raise ValueError("Asset class name is empty after stripping whitespace.") @@ -225,7 +231,22 @@ async def run( f"in {asset_profile.generation_mode} mode.\n" ) - return all_scenarios + negative_scenarios: list[Scenario] = [] + if num_negative_scenarios > 0: + if self.show_workflow: + _print_section("Phase 5: Negative Scenario Construction") + negative_scenarios = self.generate_negative_scenarios( + count=num_negative_scenarios, + profile=asset_profile, + server_desc=server_desc, + accepted_scenarios=[scenario.to_dict() for scenario in all_scenarios], + validation_tool_names=validation_tool_names, + ) + + return ScenarioGenerationResult( + scenarios=all_scenarios, + negative_scenarios=negative_scenarios, + ) async def build_asset_profile( self, @@ -580,6 +601,8 @@ def generate_single_focus_scenarios( few_shot_examples_section=_few_shot_examples_section(few_shots), category_options=format_categories_for_prompt(focus), specialization_requirements=format_requirements_for_prompt(focus), + hard_target_count=hard_scenario_target(count), + hardness_guidance=format_hardness_guidance_for_prompt(focus), forbidden_patterns=format_forbidden_patterns_for_prompt(focus), mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), @@ -604,15 +627,21 @@ def validate_and_repair( profile: AssetProfile, accepted_scenarios: list[dict] | None = None, failures: list[ScenarioValidationFailure] | None = None, + *, + negative: bool = False, ) -> list[dict]: if not scenarios: return [] profile_json = _asset_profile_json(profile) - prompt = VALIDATE_REPAIR_PROMPT.format( + prompt_template = NEGATIVE_VALIDATE_REPAIR_PROMPT if negative else VALIDATE_REPAIR_PROMPT + prompt = prompt_template.format( subagent_name=focus, category_options=format_categories_for_prompt(focus), specialization_requirements=format_requirements_for_prompt(focus), + hard_target_count=hard_scenario_target(len(scenarios)), + batch_size=len(scenarios), + hardness_guidance=format_hardness_guidance_for_prompt(focus), forbidden_patterns=format_forbidden_patterns_for_prompt(focus), mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), asset_profile_json=profile_json, @@ -621,7 +650,7 @@ def validate_and_repair( validation_failures_json=failure_payload(failures or []), ) self._write_log( - f"05_generation/{focus}/validate_repair_prompt.txt", + f"{'06_negative_generation' if negative else '05_generation'}/{focus}/validate_repair_prompt.txt", _redact_logged_prompt(prompt, profile_json), ) @@ -629,9 +658,15 @@ def validate_and_repair( parsed, _ = parse_llm_json(response.text) if isinstance(parsed, list): repaired = parsed[: len(scenarios)] - self._write_json_log(f"05_generation/{focus}/validate_repair_response.json", repaired) + self._write_json_log( + f"{'06_negative_generation' if negative else '05_generation'}/{focus}/validate_repair_response.json", + repaired, + ) return repaired - self._write_json_log(f"05_generation/{focus}/validate_repair_response.json", scenarios) + self._write_json_log( + f"{'06_negative_generation' if negative else '05_generation'}/{focus}/validate_repair_response.json", + scenarios, + ) return scenarios def construct_multiagent_scenarios( @@ -651,6 +686,8 @@ def construct_multiagent_scenarios( mcp_function_definitions=json.dumps(server_desc, indent=2), single_agent_scenarios_json=json.dumps(single_agents[:10], indent=2), accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + hard_target_count=hard_scenario_target(count), + hardness_guidance=format_hardness_guidance_for_prompt("multiagent"), mode_requirements=format_mode_requirements(profile, "multiagent", profile.generation_mode), forbidden_patterns=format_forbidden_patterns_for_prompt("multiagent"), ) @@ -680,7 +717,6 @@ def generate_validated_scenarios( accepted_scenarios = list(accepted_scenarios or []) valid_batch: list[dict] = [] failure_notes: list[str] = [] - last_llm_was_validate_repair = False for attempt in range(1, _MAX_SCENARIO_ATTEMPTS + 1): remaining = count - len(valid_batch) @@ -698,9 +734,14 @@ def generate_validated_scenarios( ) if not generated: failure_notes.append(f"attempt {attempt}: generator returned no parseable scenarios") - last_llm_was_validate_repair = False continue + generated = self.validate_and_repair( + focus=focus, + scenarios=generated, + profile=profile, + accepted_scenarios=baseline, + ) valid_now, failures = validate_scenario_batch( focus=focus, scenarios=generated, @@ -728,7 +769,6 @@ def generate_validated_scenarios( accepted_scenarios=accepted_scenarios + valid_batch, failures=failures, ) - last_llm_was_validate_repair = True repaired_valid, remaining_failures = validate_scenario_batch( focus=focus, scenarios=repaired_invalids, @@ -746,8 +786,6 @@ def generate_validated_scenarios( f"05_generation/{focus}/remaining_failures_attempt_{attempt:02d}.json", failure_payload(remaining_failures), ) - else: - last_llm_was_validate_repair = False if len(valid_batch) < count: shortage = count - len(valid_batch) @@ -757,10 +795,185 @@ def generate_validated_scenarios( f"Still missing {shortage}. Details: {summary}" ) final_for_focus = valid_batch[:count] - if last_llm_was_validate_repair: - self._write_json_log(f"05_generation/{focus}/final_scenarios.json", final_for_focus) + self._write_json_log(f"05_generation/{focus}/final_scenarios.json", final_for_focus) return final_for_focus + def generate_negative_focus_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + ) -> list[dict]: + profile_json = _asset_profile_json(profile) + prompt = NEGATIVE_SCENARIO_GENERATOR_PROMPT.format( + count=count, + subagent_name=focus, + asset_name=profile.asset_name, + generation_mode=profile.generation_mode, + asset_profile_json=profile_json, + tool_definitions=json.dumps(server_desc.get(focus, {}), indent=2), + category_options=format_categories_for_prompt(focus), + specialization_requirements=format_requirements_for_prompt(focus), + mode_requirements=format_mode_requirements(profile, focus, profile.generation_mode), + accepted_scenario_texts=format_accepted_scenarios_for_prompt(accepted_scenarios or []), + ) + self._write_log( + f"06_negative_generation/{focus}/generation_prompt.txt", + _redact_logged_prompt(prompt, profile_json), + ) + + response = self.llm.generate(prompt) + parsed, _ = parse_llm_json(response.text) + if isinstance(parsed, list): + self._write_json_log(f"06_negative_generation/{focus}/generation_response.json", parsed) + return parsed + self._write_json_log(f"06_negative_generation/{focus}/generation_response.json", []) + return [] + + def generate_validated_negative_scenarios( + self, + focus: str, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + validation_tool_names: dict[str, tuple[str, ...]] | None = None, + ) -> list[dict]: + accepted_scenarios = list(accepted_scenarios or []) + valid_batch: list[dict] = [] + failure_notes: list[str] = [] + + for attempt in range(1, _MAX_SCENARIO_ATTEMPTS + 1): + remaining = count - len(valid_batch) + if remaining <= 0: + break + + baseline = accepted_scenarios + valid_batch + generated = self.generate_negative_focus_scenarios( + focus=focus, + count=remaining, + profile=profile, + server_desc=server_desc, + accepted_scenarios=baseline, + ) + if not generated: + failure_notes.append(f"attempt {attempt}: negative generator returned no parseable scenarios") + continue + + generated = self.validate_and_repair( + focus=focus, + scenarios=generated, + profile=profile, + accepted_scenarios=baseline, + negative=True, + ) + valid_now, failures = validate_negative_scenario_batch( + focus=focus, + scenarios=generated, + accepted_scenarios=baseline, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(valid_now) + + if failures: + self._write_log( + f"06_negative_generation/{focus}/deterministic_failures_attempt_{attempt:02d}.json", + failure_payload(failures), + ) + repaired_invalids = self.validate_and_repair( + focus=focus, + scenarios=[failure.scenario for failure in failures], + profile=profile, + accepted_scenarios=accepted_scenarios + valid_batch, + failures=failures, + negative=True, + ) + repaired_valid, remaining_failures = validate_negative_scenario_batch( + focus=focus, + scenarios=repaired_invalids, + accepted_scenarios=accepted_scenarios + valid_batch, + profile=profile, + generation_mode=profile.generation_mode, + tool_names_by_focus=validation_tool_names, + ) + valid_batch.extend(repaired_valid) + if remaining_failures: + failure_notes.append( + f"attempt {attempt}: {len(remaining_failures)} negative scenario(s) still invalid after repair" + ) + self._write_log( + f"06_negative_generation/{focus}/remaining_failures_attempt_{attempt:02d}.json", + failure_payload(remaining_failures), + ) + + if len(valid_batch) < count: + shortage = count - len(valid_batch) + summary = "; ".join(failure_notes) if failure_notes else "no detailed failure summary available" + raise RuntimeError( + f"Failed to generate {count} negative {focus} scenarios after {_MAX_SCENARIO_ATTEMPTS} attempts. " + f"Still missing {shortage}. Details: {summary}" + ) + final_for_focus = valid_batch[:count] + self._write_json_log(f"06_negative_generation/{focus}/final_scenarios.json", final_for_focus) + return final_for_focus + + def generate_negative_scenarios( + self, + count: int, + profile: AssetProfile, + server_desc: dict, + accepted_scenarios: list[dict] | None = None, + validation_tool_names: dict[str, tuple[str, ...]] | None = None, + ) -> list[Scenario]: + accepted_scenarios = list(accepted_scenarios or []) + if count <= 0: + return [] + + focuses = self._negative_focus_order(profile, validation_tool_names) + negative_scenarios: list[Scenario] = [] + for index in range(count): + focus = focuses[index % len(focuses)] + negative_rows = self.generate_validated_negative_scenarios( + focus=focus, + count=1, + profile=profile, + server_desc=server_desc, + accepted_scenarios=accepted_scenarios + [scenario.to_dict() for scenario in negative_scenarios], + validation_tool_names=validation_tool_names, + ) + for scenario_data in negative_rows: + scenario_data["id"] = ( + f"{slugify_asset_name(profile.asset_name)}_negative_scenario_{len(negative_scenarios)+1:02d}" + ) + negative_scenarios.append( + _scenario_from_llm_row( + scenario_data, + scenario_type=focus, + generation_mode=profile.generation_mode, + ) + ) + + return negative_scenarios + + def _negative_focus_order( + self, + profile: AssetProfile, + validation_tool_names: dict[str, tuple[str, ...]] | None, + ) -> list[str]: + ordered: list[str] = [] + for focus in FOCUS_ORDER: + if focus == "multiagent": + continue + if (validation_tool_names and validation_tool_names.get(focus)) or profile.relevant_tools.get(focus): + ordered.append(focus) + if ordered: + return ordered + return [focus for focus in FOCUS_ORDER if focus != "multiagent"] + def _generate_attempt_batch( self, focus: str, diff --git a/src/scenarios/generator/cli.py b/src/scenarios/generator/cli.py index 8db214e35..c80b427a6 100644 --- a/src/scenarios/generator/cli.py +++ b/src/scenarios/generator/cli.py @@ -14,7 +14,7 @@ from agent.cli import _DEFAULT_MODEL from .agent import ScenarioGeneratorAgent -from .prompt_helpers import default_scenario_output_path +from .prompt_helpers import default_scenario_output_path, negative_scenario_output_path def main() -> None: @@ -24,6 +24,12 @@ def main() -> None: parser.add_argument("asset_name", help="Asset class name (for example 'Chiller' or 'Wind Turbine')") parser.add_argument("--model-id", default=_DEFAULT_MODEL, help="Model ID for LiteLLM") parser.add_argument("--num-scenarios", type=int, default=50, help="Total number of scenarios to generate") + parser.add_argument( + "--num-negative-scenarios", + type=int, + default=2, + help="Total number of intentionally unanswerable negative scenarios to generate (0 disables the negative track)", + ) parser.add_argument("--show-workflow", action="store_true", help="Show intermediate pipeline steps in the console") parser.add_argument( "--log", @@ -95,17 +101,21 @@ def main() -> None: ) try: - final_scenarios = asyncio.run( + generation_result = asyncio.run( agent.run( args.asset_name, num_scenarios=args.num_scenarios, data_in_couchdb=args.data_in_couchdb, + num_negative_scenarios=args.num_negative_scenarios, ) ) except Exception as exc: # noqa: BLE001 print(f"\n[FATAL ERROR] {exc}") sys.exit(1) + final_scenarios = generation_result.scenarios + negative_scenarios = generation_result.negative_scenarios + if not final_scenarios: print("\n[WARNING] No scenarios were successfully generated and validated.") sys.exit(0) @@ -114,7 +124,17 @@ def main() -> None: with output_path.open("w") as handle: json.dump([scenario.to_dict() for scenario in final_scenarios], handle, indent=2) + if negative_scenarios: + negative_output_path = negative_scenario_output_path(output_path) + with negative_output_path.open("w") as handle: + json.dump([scenario.to_dict() for scenario in negative_scenarios], handle, indent=2) + if not args.show_workflow: - print(f"Success! Generated {len(final_scenarios)} scenarios at {output_path}") + suffix = ( + f" and {len(negative_scenarios)} negative scenarios at {negative_scenario_output_path(output_path)}" + if negative_scenarios + else "" + ) + print(f"Success! Generated {len(final_scenarios)} scenarios at {output_path}{suffix}") else: print(f"Scenarios saved to {output_path}") diff --git a/src/scenarios/generator/prompt_helpers.py b/src/scenarios/generator/prompt_helpers.py index dbc1186c4..10b09bb65 100644 --- a/src/scenarios/generator/prompt_helpers.py +++ b/src/scenarios/generator/prompt_helpers.py @@ -4,6 +4,7 @@ from collections.abc import Callable from datetime import datetime +import math import json import logging from pathlib import Path @@ -72,6 +73,16 @@ def default_scenario_output_path(asset_name: str) -> Path: return run_dir / "scenarios.json" +def negative_scenario_output_path(scenarios_path: Path) -> Path: + return scenarios_path.with_name("negative_scenarios.json") + + +def hard_scenario_target(count: int, ratio: float = 0.7) -> int: + if count <= 0: + return 0 + return max(1, math.ceil(count * ratio)) + + def _asset_profile_json(profile: AssetProfile) -> str: return profile.model_dump_json(indent=2) @@ -84,8 +95,9 @@ def _few_shot_examples_section(few_shots: list[dict]) -> str: ) return ( - "Benchmark few-shot examples (style and specificity only; follow Generation Mode for " - "closed-form vs open-form grounding):\n" + "Benchmark few-shot examples (style, complexity, and specificity references only; " + "follow Generation Mode for closed-form vs open-form grounding, and always prefer " + "direct operator/manager wording over any legacy benchmark phrasing):\n" f"{json.dumps(few_shots, indent=2)}" ) diff --git a/src/scenarios/models.py b/src/scenarios/models.py index 3afaeb651..0e7359c9e 100644 --- a/src/scenarios/models.py +++ b/src/scenarios/models.py @@ -210,6 +210,13 @@ def to_dict(self) -> dict[str, Any]: } +class ScenarioGenerationResult(BaseModel): + """Final output of one scenario-generation run.""" + + scenarios: list[Scenario] = Field(default_factory=list) + negative_scenarios: list[Scenario] = Field(default_factory=list) + + __all__ = [ "AssetProfile", "EvidenceBundle", @@ -222,6 +229,7 @@ def to_dict(self) -> dict[str, Any]: "RetrievalAction", "RetrieverMode", "Scenario", + "ScenarioGenerationResult", "ScenarioBudget", "ScenarioTypeKey", "SensorNameDescription", diff --git a/src/scenarios/prompts/__init__.py b/src/scenarios/prompts/__init__.py index 627269ca0..6c09061f9 100644 --- a/src/scenarios/prompts/__init__.py +++ b/src/scenarios/prompts/__init__.py @@ -4,6 +4,8 @@ from .budget import BUDGET_ALLOCATOR_PROMPT from .generation import ( MULTIAGENT_COMBINER_PROMPT, + NEGATIVE_SCENARIO_GENERATOR_PROMPT, + NEGATIVE_VALIDATE_REPAIR_PROMPT, SCENARIO_GENERATOR_PROMPT, VALIDATE_REPAIR_PROMPT, ) @@ -24,6 +26,8 @@ __all__ = [ "BUDGET_ALLOCATOR_PROMPT", "MULTIAGENT_COMBINER_PROMPT", + "NEGATIVE_SCENARIO_GENERATOR_PROMPT", + "NEGATIVE_VALIDATE_REPAIR_PROMPT", "PROFILE_BUILDER_PROMPT", "RESEARCH_DIGEST_HEADINGS_MARKDOWN", "RESEARCH_DIGEST_MERGE_HEADINGS_MARKDOWN", diff --git a/src/scenarios/prompts/generation.py b/src/scenarios/prompts/generation.py index 06a14a593..92c0994a9 100644 --- a/src/scenarios/prompts/generation.py +++ b/src/scenarios/prompts/generation.py @@ -1,4 +1,4 @@ -"""Prompts for single-agent and multi-agent scenario generation.""" +"""Prompts for valid and negative scenario generation.""" SCENARIO_GENERATOR_PROMPT = """\ You are an advanced industrial agent Scenario Architect for AssetOps Bench. @@ -23,6 +23,12 @@ Primary-focus requirements: {specialization_requirements} +Hard-scenario contract for this batch: +- At least {hard_target_count} of the {count} scenarios should satisfy the hard rubric. +- Hard rubric: ask for at least two distinct outputs or actions, include at least one explicit constraint, and include an if/else, fallback, or missing-data instruction. +- Focus-specific hard patterns: +{hardness_guidance} + Avoid these bad patterns: {forbidden_patterns} @@ -33,14 +39,16 @@ {accepted_scenario_texts} Constraints: -1. Every scenario must read like a realistic request from an industrial operator or the operator's manager. -2. The scenario may involve supporting work from other agents, but the main burden should stay on the primary focus '{subagent_name}'. -3. Every scenario must be highly specific, having a clear 'text', a 'category', and a 'characteristic_form'. -4. The characteristic_form must explicitly mention the concrete MCP tool names needed to solve the task. -5. The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers, or add parenthetical hints such as "e.g. get_failure_modes tool". Reserve every concrete tool name for 'characteristic_form' only. -6. Closed-form scenarios must embed explicit inline sensor readings in the query text: for each measurement, sensor name (or label), numeric value, and unit (e.g. ppm, %, Hz, mm/s). You may also embed rule text, summaries, or dataset identifiers when the task requires them. -7. Open-form scenarios must use only grounded identifiers present in the Asset Profile. -8. Do not output Unsupported. +1. Every scenario must read like a realistic direct request from an industrial operator or the operator's manager. +2. Prefer end-user-centric wording such as "Will my transformer's health be okay tomorrow?" over tool-centric or benchmark-centric wording such as "predict transformer health". +3. The scenario may involve supporting work from other agents, but the main burden should stay on the primary focus '{subagent_name}'. +4. Every scenario must be highly specific, having a clear 'text', a 'category', and a 'characteristic_form'. +5. The characteristic_form must explicitly mention the concrete MCP tool names needed to solve the task. +6. The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers, or add parenthetical hints such as "e.g. get_failure_modes tool". Reserve every concrete tool name for 'characteristic_form' only. +7. Most scenarios should be multi-part and instruction-following rather than short one-liners. +8. Closed-form scenarios must embed explicit inline sensor readings in the query text: for each measurement, sensor name (or label), numeric value, and unit (e.g. ppm, %, Hz, mm/s). You may also embed rule text, summaries, or dataset identifiers when the task requires them. +9. Open-form scenarios must use only grounded identifiers present in the Asset Profile. +10. Do not output Unsupported. Task: Generate a JSON array of {count} scenarios. CRITICAL: Output ONLY the raw JSON array. Do NOT include markdown code blocks, Python code, or any conversational preamble. @@ -59,13 +67,15 @@ You are the Validator and Repair agent for the AssetOps Bench scenario generator. You are given a list of JSON scenarios and the corresponding Asset Profile. -Your job is to strictly validate and repair them based on: +Your job is to validate and repair them based on: 1. Do they fit exactly the JSON schema (text, category, characteristic_form)? 2. Does the characteristic_form name the concrete MCP tool names needed to solve the task? 3. Does the 'text' field contain only natural operator language, with no MCP tool names, function identifiers, or parenthetical hints like "e.g. get_failure_modes tool"? If any appear in 'text', remove or rewrite them and keep tool names in characteristic_form only. 4. Does each scenario clearly satisfy the prompt rules for primary focus '{subagent_name}' even if it uses supporting cross-agent steps? 5. In closed_form mode, does each scenario text include explicit inline sensor readings (name, value, unit) per Mode-specific grounding rules? Are there duplicates, near-duplicates, or (for open_form) ungrounded identifiers? -6. Fix every deterministic validation failure listed below. +6. Are the scenarios phrased like direct end-user requests rather than internal benchmark instructions? +7. Does this batch satisfy the hard-scenario contract: at least {hard_target_count} of the {batch_size} scenarios should ask for at least two outputs or actions, include an explicit constraint, and include an if/else, fallback, or missing-data instruction? +8. Fix every deterministic validation failure listed below. Target Focus: {subagent_name} @@ -76,6 +86,12 @@ Primary-focus requirements: {specialization_requirements} +Hard-scenario contract: +- At least {hard_target_count} of the {batch_size} scenarios should satisfy the hard rubric. +- Hard rubric: ask for at least two distinct outputs or actions, include at least one explicit constraint, and include an if/else, fallback, or missing-data instruction. +- Focus-specific hard patterns: +{hardness_guidance} + Avoid these bad patterns: {forbidden_patterns} @@ -94,7 +110,97 @@ Deterministic validation failures that MUST be fixed: {validation_failures_json} -Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. +Always review the full batch for end-user-centric phrasing and hardness, even when the deterministic failure list is empty. +Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. +CRITICAL: Do not include any explanation, markdown formatting, or Python code. Output MUST be raw JSON text only. +""" + +NEGATIVE_SCENARIO_GENERATOR_PROMPT = """\ +You are an advanced industrial agent Scenario Architect for AssetOps Bench. +We need you to generate {count} intentionally unanswerable evaluation scenarios with primary focus '{subagent_name}' for the asset class: {asset_name}. + +Generation Mode: +{generation_mode} + +Asset Profile (full JSON): +{asset_profile_json} + +Available Focus Tools: +{tool_definitions} + +Suggested category values for this focus: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Mode-specific grounding rules: +{mode_requirements} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Task: +Generate realistic operator- or manager-facing requests that cannot be answered safely from the available grounded data and tools. + +Negative-pattern guidance: +- Use grounded-adjacent realism: the question should sound like a plausible user request, not an adversarial puzzle. +- Make the scenario unanswerable because of one of these causes: missing or non-existent asset/site/sensor identifiers, time windows outside the available data range, unsupported external data joins, or contradictory instructions that prevent a safe grounded answer. +- It is acceptable for open-form negative scenarios to intentionally mention an ungrounded identifier or an out-of-range timestamp when that is exactly what makes the request unanswerable. +- The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers. +- The characteristic_form must describe the expected insufficiency/refusal behavior: it should explicitly say that a correct answer explains why the request cannot be answered from the available data/tools and does not hallucinate missing information. +- Do not output a scenario that is secretly answerable from the Asset Profile and available tools. + +Task: Generate a JSON array of {count} scenarios. +CRITICAL: Output ONLY the raw JSON array. Do NOT include markdown code blocks, Python code, or any conversational preamble. + +Format exactly (raw JSON only): +[ + {{ + "text": "...", + "category": "...", + "characteristic_form": "..." + }} +] +""" + +NEGATIVE_VALIDATE_REPAIR_PROMPT = """\ +You are the Validator and Repair agent for negative AssetOps Bench scenarios. + +You are given a list of intentionally unanswerable JSON scenarios and the corresponding Asset Profile. +Your job is to validate and repair them based on: +1. Do they fit exactly the JSON schema (text, category, characteristic_form)? +2. Does the 'text' field stay in natural operator or manager language, with no MCP tool names or API identifiers? +3. Does each scenario remain realistically user-centric while still being unanswerable from the available data/tools? +4. Does each characteristic_form explicitly require an insufficiency/refusal-style answer that explains what is missing or unsupported? +5. Fix every deterministic validation failure listed below. + +Target Focus: +{subagent_name} + +Suggested Categories: +{category_options} + +Primary-focus requirements: +{specialization_requirements} + +Mode-specific grounding rules: +{mode_requirements} + +Asset Profile: +{asset_profile_json} + +Input Scenarios: +{input_scenarios_json} + +Already accepted scenario texts. Avoid duplicates or near-duplicates of any of them: +{accepted_scenario_texts} + +Deterministic validation failures that MUST be fixed: +{validation_failures_json} + +Always preserve the fact that these scenarios are intentionally unanswerable. +Return ONLY the corrected and repaired JSON array. If a scenario is perfectly fine, keep it as is. CRITICAL: Do not include any explanation, markdown formatting, or Python code. Output MUST be raw JSON text only. """ @@ -120,6 +226,12 @@ Already accepted multiagent scenario texts. Avoid duplicates or near-duplicates of any of them: {accepted_scenario_texts} +Hard-scenario contract for this batch: +- At least {hard_target_count} of the {count} scenarios should satisfy the hard rubric. +- Hard rubric: ask for at least two distinct outputs or actions, include at least one explicit constraint, and include an if/else, fallback, or missing-data instruction. +- Focus-specific hard patterns: +{hardness_guidance} + Mode-specific grounding rules: {mode_requirements} @@ -132,13 +244,15 @@ Requirements: - The 'text' field must stay natural operator language only: do not name MCP tools, API or function identifiers, or add parenthetical hints such as "e.g. get_failure_modes tool". Put concrete tool names only in characteristic_form. +- Phrase the text like a direct end-user request, not an internal workflow description. +- Most scenarios should be multi-part and instruction-following rather than short one-liners. - Every multiagent characteristic_form must mention at least two distinct namespaces chosen from iot, fmsr, tsfm, wo, and vibration. - Every multiagent characteristic_form must mention concrete MCP tool names from those namespaces. - Open-form scenarios must only use grounded identifiers from the Asset Profile. - Closed-form scenarios must contain explicit inline sensor readings (name, value, unit) in the text, and may include summaries, rule text, or dataset identifiers when needed. - Do not output Unsupported. -Return ONLY a JSON array of length {count}. +Return ONLY a JSON array of length {count}. CRITICAL: Do NOT include markdown code blocks, Python code, or any conversational preamble. [ diff --git a/src/scenarios/utils.py b/src/scenarios/utils.py index 738c240f2..e7fb97be8 100644 --- a/src/scenarios/utils.py +++ b/src/scenarios/utils.py @@ -222,6 +222,138 @@ def _to_prompt_dict(example: dict[str, Any]) -> dict[str, Any]: } +_NATURAL_STYLE_SOURCES = { + "all_utterance_iot", + "all_utterance_wo", + "all_utterance_multiagent", + "compressor_utterance", + "hydrolicpump_utterance", + "local_vibration", +} + + +def _complexity_score(example: dict[str, Any]) -> int: + text = str(example.get("text", "")).strip() + lowered = text.lower() + score = 0 + score += 2 * sum( + 1 + for marker in ( + " and ", + " also ", + " then ", + " before ", + " after ", + " while ", + " compare ", + " summarize ", + " recommend ", + " justify ", + " prioritize ", + " along with ", + ) + if marker in lowered + ) + score += 4 * len( + re.findall(r"\bif\b|\botherwise\b|\belse\b|\bunless\b|\bif available\b|\bif not\b", lowered) + ) + score += 2 * len( + re.findall( + r"\bwithin\b|\bbetween\b|\bat least\b|\bat most\b|\btop\b|\bonly\b|\blast\b|\bnext\b|\bfirst\b|\bhighest\b|\blowest\b", + lowered, + ) + ) + score += min(text.count(","), 3) + word_count = len(text.split()) + if word_count >= 18: + score += 1 + if word_count >= 32: + score += 1 + return score + + +def _user_centric_score(example: dict[str, Any]) -> int: + text = str(example.get("text", "")).strip() + lowered = text.lower() + score = 0 + if str(example.get("source_config", "")).strip() in _NATURAL_STYLE_SOURCES: + score += 3 + if re.search( + r"\b(can you|could you|please|should i|should we|i would like|we need|we are building|after|for asset|consider asset)\b", + lowered, + ): + score += 2 + if "?" in text: + score += 1 + return score + + +def _sorted_prompt_examples( + examples: list[dict[str, Any]], + *, + prioritize_natural: bool = False, +) -> list[dict[str, Any]]: + return sorted( + examples, + key=lambda example: ( + _user_centric_score(example) if prioritize_natural else 0, + _complexity_score(example), + _user_centric_score(example), + len(str(example.get("text", "")).split()), + str(example.get("source_config", "")), + str(example.get("text", "")), + ), + reverse=True, + ) + + +def _select_examples( + ordered: list[dict[str, Any]], + *, + limit: int, + selected_fingerprints: set[str], +) -> list[dict[str, Any]]: + picked: list[dict[str, Any]] = [] + for example in ordered: + fingerprint = normalize_example_fingerprint(example.get("text", "")) + if not fingerprint or fingerprint in selected_fingerprints: + continue + selected_fingerprints.add(fingerprint) + picked.append(example) + if len(picked) >= limit: + break + return picked + + +def _build_style_reference_pool() -> list[dict[str, Any]]: + pool: list[dict[str, Any]] = [] + for row in _load_jsonl(_ALL_UTTERANCE): + row_type = str(row.get("type", "")).strip() + if row_type not in {"IoT", "Workorder", "multiagent"}: + continue + text = str(row.get("text", "")) + if not _is_asset_specific_utterance(text): + continue + source_config = { + "IoT": "all_utterance_iot", + "Workorder": "all_utterance_wo", + "multiagent": "all_utterance_multiagent", + }[row_type] + pool.append(_normalize_fewshot_row(row, source_config)) + + for path, tag in ( + (_COMPRESSOR, "compressor_utterance"), + (_HYDRAULIC_PUMP, "hydrolicpump_utterance"), + ): + for row in _load_jsonl(path): + pool.append(_normalize_fewshot_row(row, tag)) + + for item in _load_local_vibration_list(): + pool.append(_normalize_fewshot_row(dict(item), "local_vibration")) + + return pool + + def _build_candidate_pool( focus: str, ) -> list[dict[str, Any]]: @@ -298,22 +430,64 @@ def fetch_hf_fewshot( if seed is not None: random.seed(seed) - pool = _build_candidate_pool(focus) - if not pool: + focus_pool = _build_candidate_pool(focus) + if not focus_pool: _log.info("No few-shot examples were available for focus %r.", focus) return [] seen: set[str] = set() - unique: list[dict[str, Any]] = [] - for example in pool: + unique_focus: list[dict[str, Any]] = [] + for example in focus_pool: + fp = normalize_example_fingerprint(example.get("text", "")) + if not fp or fp in seen: + continue + seen.add(fp) + unique_focus.append(example) + + style_pool = _build_style_reference_pool() + unique_style: list[dict[str, Any]] = [] + for example in style_pool: fp = normalize_example_fingerprint(example.get("text", "")) if not fp or fp in seen: continue seen.add(fp) - unique.append(example) + unique_style.append(example) + + rng = random.Random(seed) if seed is not None else random + rng.shuffle(unique_focus) + rng.shuffle(unique_style) + + anchor_quota = min(len(unique_focus), max(1, max_examples // 3)) + natural_target = max(1, max_examples // 3) if max_examples > 1 else 0 + natural_quota = min(len(unique_style), max(0, min(natural_target, max_examples - anchor_quota))) + selected_fingerprints: set[str] = set() + + selected: list[dict[str, Any]] = [] + selected.extend( + _select_examples( + _sorted_prompt_examples(unique_focus), + limit=anchor_quota, + selected_fingerprints=selected_fingerprints, + ) + ) + selected.extend( + _select_examples( + _sorted_prompt_examples(unique_style, prioritize_natural=True), + limit=natural_quota, + selected_fingerprints=selected_fingerprints, + ) + ) + + combined_fill = unique_focus + unique_style + rng.shuffle(combined_fill) + selected.extend( + _select_examples( + _sorted_prompt_examples(combined_fill, prioritize_natural=True), + limit=max_examples - len(selected), + selected_fingerprints=selected_fingerprints, + ) + ) - random.shuffle(unique) - selected = unique[:max_examples] return [_to_prompt_dict(ex) for ex in selected] From 9837baae7f5c65828546ad24985f2029007749ba Mon Sep 17 00:00:00 2001 From: Sagar Chethan Kumar Date: Sat, 25 Apr 2026 22:40:54 -0400 Subject: [PATCH 26/29] update README.md --- src/scenarios/README.md | 480 +++++++++++++--------------------------- 1 file changed, 148 insertions(+), 332 deletions(-) diff --git a/src/scenarios/README.md b/src/scenarios/README.md index 7f42939b5..77ae57f19 100644 --- a/src/scenarios/README.md +++ b/src/scenarios/README.md @@ -1,390 +1,206 @@ # Scenario Generator -LLM-driven pipeline for generating AssetOpsBench scenarios from an asset class such as `"Motor"`, `"Transformer"`, or `"Hydrolic Pump"`. +The scenario generator builds AssetOpsBench prompts for an asset class (for example, `"Motor"` or `"Transformer"`). +Output is a JSON array of validated scenarios with canonical lane types: +`iot`, `fmsr`, `tsfm`, `wo`, `vibration`, `multiagent`. -The generator works in two modes: +The pipeline supports two generation modes: -- `closed_form`: self-contained scenarios where the query itself provides the needed values, rules, summaries, or dataset references. -- `open_form`: grounded scenarios that use live CouchDB-backed identifiers discovered from IoT and vibration coverage. +- `closed_form`: the request is fully answerable from text in the prompt itself. +- `open_form`: the request is grounded in live identifiers discovered from IoT/vibration/FMSR sources. -> **Open-form disclaimer:** For grounded `open_form` runs (`--data-in-couchdb`), configure `.env` (or the process environment) so `**IOT_DBNAME`**, `**WO_DBNAME**`, and `**VIBRATION_DBNAME**` each point to live CouchDB databases that actually contain data relevant to the **asset name** you pass on the CLI (for example `"Transformer"` or `"Motor"`). If these names point at the wrong or empty databases, IoT, work-order, and vibration grounding will be misleading or sparse for that asset. - -> **Academic retrieval and research digest:** Asset profile construction (Phase 1) runs **grounded discovery** first (full CouchDB IoT/vibration/FMSR discovery only when `**--data-in-couchdb`** is set), then **academic evidence retrieval**, then a **two-step research digest** (per-paper structured extraction, then merge into one Markdown brief), unless you supply a precomputed digest (see below). The `--retriever` flag selects the search backend; default is `**arxiv`**. Use `**--retriever semantic_scholar**` for Semantic Scholar instead. -> -> **Semantic Scholar retrieval:** When using `--retriever semantic_scholar`, set `**SEMANTIC_SCHOLAR_API_KEY`** in `.env` (optional but recommended for higher API rate limits). The CLI does not accept the key as a flag; only the environment variable is read. If unset, the public rate limits apply. -> -> **Precomputed research digest:** Pass `**--research-digest PATH`** to a Markdown file that already contains the merged research brief. If that path exists, the run **skips** academic search, PDF/snippet retrieval, and digest LLM calls, and feeds that file straight into asset profile construction. If the path does not exist, the CLI exits with an error. - -> For **new asset classes**, add or update `**_ASSET_FAILURE_MODE_ALIASES`** in `[src/servers/fmsr/main.py](../servers/fmsr/main.py)` when the CLI-facing name should map to a different curated failure-mode key in `[failure_modes.yaml](../servers/fmsr/failure_modes.yaml)`; otherwise FMSR may fall back to LLM-only failure lists. See **Asset class → curated FMSR failure modes** below for the full picture. - -The run writes a JSON **array** of scenarios. Each object has this shape: - -```json -{ - "id": "transformer_scenario_01", - "type": "fmsr", - "text": "…", - "category": "Diagnostic Assessment", - "characteristic_form": "…" -} -``` - -Allowed `type` values: `iot`, `fmsr`, `tsfm`, `wo`, `vibration`, `multiagent`. Few-shot source JSONL files under `[huggingface/](huggingface/)` still use their own `type` column labels (e.g. `IoT`, `Workorder`) when filtering examples; generated `scenarios.json` uses the canonical keys above. See `[models.py](models.py)` (`Scenario`, `ScenarioTypeKey`). - -When negative generation is enabled, the run also writes a sibling `negative_scenarios.json` file with the same schema. Those scenarios are intentionally unanswerable and expect an explicit insufficiency/refusal-style answer rather than a hallucinated best effort. - -## CLI - -From the **repository root**, use [uv](https://docs.astral.sh/uv/) so imports resolve for `scenarios`, `agent`, `llm`, and `servers` (same layout as `tool.pytest.ini_options.pythonpath` in `pyproject.toml`): - -```bash -uv run python -m scenarios.generator "" [options] -``` - -Key flags: - - -| Flag | Default | Description | -| -------------------------------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `asset_name` | required | Asset class name, for example `"Motor"` or `"Transformer"` | -| `--num-scenarios N` | `50` | Total number of scenarios to generate | -| `--num-negative-scenarios N` | `2` | Total number of intentionally unanswerable negative scenarios to generate; use `0` to disable | -| `--model-id MODEL` | project default | LiteLLM model override | -| `--retriever {arxiv,semantic_scholar}` | `arxiv` | Academic search backend for evidence retrieval (omit flag for default) | -| `--research-digest PATH` | unset | If set and the file exists, skip retrieval and digest LLM steps; load this Markdown as the research brief for the asset profile | -| `--data-in-couchdb` | off | Enable grounded open-form generation when live IoT inventory exists (requires `.env` DB names; see open-form disclaimer above) | -| `--show-workflow` | off | Print phase-by-phase progress (Phases 1–5: asset profile → budget → per-focus generation → multiagent → negative scenarios), including live repair counts | -| `--log` | off | Write prompts and responses under `logs/` next to `scenarios.json` (same run folder) | - - -Output always includes `generated/scenarios/_scenarios_/scenarios.json` (not configurable; slug from `[text.slugify_asset_name](text.py)`). When negative generation is enabled, the same run directory also contains `negative_scenarios.json`. - -Examples: - -```bash -# Run from the repository root -# Closed-form, self-contained scenarios only -uv run python -m scenarios.generator "Transformer" --num-scenarios 20 - -# Grounded open-form: Semantic Scholar retrieval, CouchDB grounding, console workflow, and full disk logs -uv run python -m scenarios.generator "Transformer" --show-workflow --log --data-in-couchdb --retriever "semantic_scholar" - -# Grounded open-form with verbose workflow (no --log) -uv run python -m scenarios.generator "Motor" --data-in-couchdb --show-workflow - -# Reuse a saved research digest (skips academic retrieval and digest synthesis) -uv run python -m scenarios.generator "Transformer" --research-digest ./my_digest.md - -# Debug run with raw logs (hydraulic pump asset class) -uv run python -m scenarios.generator "Hydrolic Pump" --data-in-couchdb --show-workflow --log -``` - -## Code layout - -Tree is rooted at `src/scenarios/` (this package). Comments describe each part. - -```text -scenarios/ -├── generator/ -│ ├── __main__.py -│ ├── cli.py # entry for python -m scenarios.generator -│ ├── agent.py # ScenarioGeneratorAgent -│ └── prompt_helpers.py # prompt fragments, default paths, workflow printing -├── grounding.py # IoT inventory, vibration overlay, FMSR mapping; optional failure_mapping/ cache -├── retrieval/ -│ ├── base.py # EvidenceMetadataExecutor protocol -│ ├── arxiv.py # ArXiv metadata + PDF text -│ ├── semantic_scholar.py # Semantic Scholar Graph API -│ ├── pdf_http.py # PDF URL probing and fetch helpers -│ ├── digest.py # synthesize_research_digest (per-paper + merge LLM steps) -│ └── pipeline.py # retrieve_asset_evidence: section-wise search loops, snippets -├── constraints/ -│ ├── policies.py # focus policies for prompts -│ └── validation.py # deterministic validation / repair loop -├── prompts/ -│ ├── research_digest.py # digest section headings and per-paper / merge prompts -│ ├── asset_profile.py -│ ├── budget.py -│ ├── generation.py -│ └── retrieval.py -├── huggingface/ -│ ├── scenarios/ # e.g. all_utterance.jsonl -│ ├── asset/ # e.g. compressor / hydrolic pump utterances -│ └── task/ # e.g. failure mapping, rule monitoring JSONL -├── local/ -│ └── vibration_utterance.json # few-shot examples for vibration focus only -├── failure_mapping/ # on-disk FMSR fm2sensor / sensor2fm cache (e.g. .json) -├── models.py # AssetProfile, GroundingBundle, Scenario, … -├── utils.py # fetch_hf_fewshot, parse_llm_json -└── text.py # slugs, text normalization for dedup and prompts -``` - -## High-level flow +## Module-level Architecture ```mermaid -flowchart TD - A["CLI Input
asset class + flags"] --> B{"--data-in-couchdb?"} - B -->|No| C["Closed-form mode"] - B -->|Yes| D["Grounded discovery"] - - D --> D1["IoT asset coverage
sites, asset ids, sensors, time ranges"] - D --> D2["Vibration asset coverage
asset ids, sensors, time ranges"] - D --> D3["FMSR grounding
failure modes + failure/sensor mappings"] - - D1 --> E{"IoT inventory present?"} - D2 --> E - D3 --> E - - E -->|No| C - E -->|Yes| F["Open-form mode"] - - C --> Rd{"--research-digest
points to existing file?"} - F --> Rd - - Rd -->|Yes| Gp["Load Markdown digest
(skip academic retrieval + digest LLM)"] - Rd -->|No| G["Academic retrieval: bounded search per digest section,
metadata judge, PDF probe, top-PDF snippets"] - - G --> Gm["Research digest: per-paper extraction
then merged Markdown brief"] - - Gm --> H["Asset profile synthesis (LLM JSON)
description, grounded instances, tasks,
failure mappings, relevant tools, standards"] - Gp --> H - H --> I["Budget allocation
iot / fmsr / tsfm / wo / vibration / multiagent"] - I --> J["Few-shot retrieval
HF JSONL pools + local vibration supplement"] - - J --> K["Focused scenario generation"] - K --> K1["Closed-form rules:
embed values, rules, summaries, or datasets inline"] - K --> K2["Open-form rules:
use only grounded identifiers"] - - K1 --> L["Deterministic validation + repair"] - K2 --> L - - L --> M["Multiagent composition"] - M --> N["Final JSON output
id, type, text, category, characteristic_form"] +flowchart LR + I["Input
asset_name + scenario_budget + flags"] + + subgraph P1["(1) Asset Profiling"] + G["Grounding Discovery
IoT + Vibration + FMSR"] + R["Research Retrieval
ArXiv or Semantic Scholar"] + D["Digest Synthesizer
Per-paper then merge"] + AP["AssetProfile Builder"] + G --> AP + R --> D --> AP + end + + subgraph P2["(2) Planning"] + B["Budget Allocator
coverage-aware quotas"] + end + + subgraph P3["(3) Scenario Generation"] + F["Focus Generators
IoT/FMSR/TSFM/WO/Vibration"] + V["Validate + Repair
LLM pass + deterministic checks"] + M["Multiagent Composer"] + N["Negative Track (optional)"] + F --> V --> M --> N + end + + O["Outputs
scenarios.json
negative_scenarios.json (optional)"] + + I --> P1 --> P2 --> P3 --> O ``` -## Pipeline +## End-to-end Flow -### 1. Grounded discovery +1. **Grounding (optional for open-form)** + If `--data-in-couchdb` is set, the system discovers asset instances, sensors, time ranges, and failure mappings. This step defines which concrete identifiers are allowed in open-form prompts. +2. **Evidence and digest** + If `--research-digest PATH` exists, it is loaded directly. Otherwise, bounded academic retrieval runs, then a two-step digest synthesis (per-paper extraction + merge). This keeps profile synthesis evidence-backed. +3. **Asset profile construction** + The profile merges grounded data, research digest content, and tool descriptions. This is the single structured context used by all downstream generators. +4. **Budget allocation** + Scenarios are allocated across focus lanes. `multiagent` is capped at 75% of total budget to preserve lane diversity. +5. **Generation and validation** + Per-focus scenarios are generated, repaired, and deterministically validated for schema, grounding, and uniqueness requirements. +6. **Multiagent composition** + Multiagent scenarios are generated from validated single-focus candidates to build cross-tool workflows. +7. **Negative scenario generation (optional)** + Controlled by `--num-negative-scenarios`; generated strictly after multiagent composition and not counted against `--num-scenarios`. -Runs when `--data-in-couchdb` is enabled. +## Operational Configuration -- Enumerates IoT assets via the IoT server (`get_asset_list`, sensors, time ranges). -- Joins vibration coverage by `(site_name, asset_id)`. -- Calls FMSR for failure modes and failure-to-sensor mapping (with optional cache files in `[failure_mapping/.json](failure_mapping/)`). -- If there is no IoT inventory at all, the run uses `closed_form` (`open_form_eligible` false). -- In grounded runs, focuses without live support can be allocated `0` budget instead of inventing identifiers. +### Required `.env` keys for grounded runs -### Asset-class mapping notes +When `--data-in-couchdb` is enabled, these environment variables must point to real, populated databases for the selected asset family: -Coherent open-form runs depend on the CLI `asset_name` aligning with how servers resolve assets: +- `IOT_DBNAME` +- `WO_DBNAME` +- `VIBRATION_DBNAME` -#### 1. CLI label and IoT / vibration inventory +If these values are missing, empty, or mismatched to the asset class, open-form grounding quality degrades (and falls back to closed-form when IoT inventory is empty). -`[discover_grounding](grounding.py)` loads the full IoT inventory exposed by the IoT server; it does not substring-filter asset rows by the CLI string. Vibration rows are merged when `(site_name, asset_id)` matches. For scenarios that mention specific assets, use ids and sites that actually appear in the grounded bundle and profile. +### Retriever configuration -#### 2. Asset class → curated FMSR failure modes +- `--retriever arxiv` requires no additional key. +- `--retriever semantic_scholar` should use `SEMANTIC_SCHOLAR_API_KEY` (optional but recommended for better rate limits). -FMSR failure-mode grounding is most reliable when the asset class maps to a curated key instead of falling back to the LLM. +### Runtime constants and limits -Curated failure modes live in: +- Output root is fixed to `generated/scenarios/` (`DEFAULT_GENERATED_SCENARIOS_DIR`). +- `multiagent` allocation cap is `75%` of requested total (`_multiagent_budget_cap`). +- Validation/retry loops are bounded (`_MAX_SCENARIO_ATTEMPTS`). +- Canonical lane ordering follows `FOCUS_ORDER` in constraints. -- `[src/servers/fmsr/failure_modes.yaml](../servers/fmsr/failure_modes.yaml)` - -Alias resolution for lookup lives in: - -- `[src/servers/fmsr/main.py](../servers/fmsr/main.py)` via `_ASSET_FAILURE_MODE_ALIASES` and `_resolve_failure_mode_asset_key()` - -Concrete example: - -- CLI input: `"Transformer"` -- IoT asset id: `"Transformer 1"` -- curated FMSR key: `"smart grid transformer"` - -That works because `Transformer -> smart grid transformer` is explicitly aliased in FMSR. - -If you add a new asset class, make sure at least one of these is true: - -- the normalized CLI asset class exactly matches a key in `failure_modes.yaml` -- or there is an explicit alias in `_ASSET_FAILURE_MODE_ALIASES` -- or you are intentionally accepting slower, less deterministic LLM fallback behavior - -Recommended rule: - -- For production-ish grounded generation, prefer adding a curated `failure_modes.yaml` entry plus an alias if the CLI-facing name differs from the curated key. - -#### 3. Failure / sensor grounding - -After failure modes are found, grounding builds failure-to-sensor views for scenario generation in `[grounding.py](grounding.py)`: either from a cache file under `failure_mapping/` or from `get_failure_mode_sensor_mapping` (then written to cache). - -#### 4. Asset class → vibration coverage - -`vibration` is only meaningful in open-form when the vibration database has rows for the same `(site_name, asset_id)` pairs as IoT. - -Relevant code: - -- `[src/servers/vibration/couchdb_client.py](../servers/vibration/couchdb_client.py)` -- `[src/scenarios/grounding.py](grounding.py)` - -Important consequence: - -- If IoT has `Transformer 1` but vibration has no matching row, grounded generation can still run, but vibration-focused scenarios may receive `0` budget if the profile has no vibration sensors. - -#### 5. Quick checklist when adding a new asset class - -- FMSR: curated `failure_modes.yaml` entry and/or alias, or accepted LLM fallback. -- IoT / vibration: asset ids and sites match what you want referenced in open-form text. -- Large sensor sets: consider caching under `failure_mapping/.json` after the first successful mapping. -- Few-shot pools include examples adjacent to the new class or focus (see `[utils.py](utils.py)`). - -#### 6. Troubleshooting example: Transformer - -For the transformer case, a typical mapping is: - -- CLI asset class: `"Transformer"` -- grounded IoT asset: `"Transformer 1"` -- grounded vibration assets: often none -- curated FMSR family: `"smart grid transformer"` - -Expected behavior: - -- open-form is enabled when IoT inventory exists -- `iot`, `fmsr`, `tsfm`, and `wo` can receive budget -- `vibration` may be `0` without vibration rows - -If a run stalls or falls back unexpectedly, inspect: - -- IoT DB content and IoT server behavior -- FMSR aliases for `Transformer` -- FMSR mapping cache and logs under `failure_mapping/` - -### 2. Asset profile synthesis - -Phase 1 always runs `[discover_grounding](grounding.py)` first (full CouchDB IoT/vibration/FMSR work only when `--data-in-couchdb` is set; otherwise the bundle stays in closed-form shape). Then literature and digest steps depend on `**--research-digest**`: +## CLI -- **Precomputed digest:** If `--research-digest PATH` is set and the file exists, academic retrieval and digest LLM calls are skipped; that Markdown is passed into the profile builder as the research brief. -- **Live pipeline:** Otherwise `[retrieve_asset_evidence](retrieval/pipeline.py)` runs. For each merge-section heading in `[prompts/research_digest.py](prompts/research_digest.py)` (for example condition monitoring, maintenance context, sensor modalities, failure modes, standards, operator/manager tasks), the planner issues bounded search queries against the configured backend (`arxiv` default or `semantic_scholar`), judges metadata relevance, keeps candidates whose PDF URLs pass an HTTP probe, downloads up to a few top PDFs, and builds text snippets. `[synthesize_research_digest](retrieval/digest.py)` then runs **per-paper** structured extraction followed by a **merge** pass into one Markdown digest. +Run from repository root: -The final `[PROFILE_BUILDER_PROMPT](prompts/asset_profile.py)` call combines: +```bash +uv run python -m scenarios.generator "" [options] +``` -- the grounding summary (JSON) -- the merged research digest (Markdown) -- available tool descriptions from the MCP servers +### Key arguments -The resulting asset profile includes: -- asset-class description -- grounded per-instance coverage -- known failure modes -- failure-to-sensor and sensor-to-failure mappings -- relevant tools by focus -- operator-facing tasks -- manager-facing tasks -- standards and conventions +| Flag | Default | Description | +| -------------------------------------- | --------------- | ------------------------------------------------------- | +| `asset_name` | required | Asset class name | +| `--num-scenarios N` | `50` | Number of validated scenarios | +| `--num-negative-scenarios N` | `2` | Number of negative scenarios (`0` disables) | +| `--model-id MODEL` | project default | LiteLLM model override | +| `--retriever {arxiv,semantic_scholar}` | `arxiv` | Academic backend | +| `--research-digest PATH` | unset | Use precomputed digest, skip retrieval+digest synthesis | +| `--data-in-couchdb` | off | Enable grounded open-form discovery | +| `--show-workflow` | off | Print phase-level progress | +| `--log` | off | Write prompts/artifacts under run `logs/` | -### 3. Budget allocation -Budget is allocated across: +### Retrieval notes -- `iot` -- `fmsr` -- `tsfm` -- `wo` -- `vibration` -- `multiagent` +- With `--retriever semantic_scholar`, set `SEMANTIC_SCHOLAR_API_KEY` (env var) for higher rate limits. +- If `--research-digest PATH` is provided and the file is missing, the run exits with an error. -Special handling: +### Open-form data requirements -- `vibration=0` when grounded open-form coverage does not include matching vibration-backed assets for the asset class. -- `multiagent` is capped at **75%** of the total budget (see `_multiagent_budget_cap` in `[generator/prompt_helpers.py](generator/prompt_helpers.py)`). +For grounded runs, set `IOT_DBNAME`, `WO_DBNAME`, and `VIBRATION_DBNAME` to live CouchDB databases for the selected asset class. +If IoT inventory is empty, generation falls back to `closed_form`. -### 4. Few-shot retrieval +### CLI examples -Few-shot examples are drawn from the JSONL files under `[huggingface/](huggingface/)` and, for vibration, from `[local/vibration_utterance.json](local/vibration_utterance.json)`. Per-focus sourcing is implemented in `[utils.py](utils.py)` (`_build_candidate_pool`): +```bash +# 1) Closed-form baseline: generate 20 validated scenarios. +uv run python -m scenarios.generator "Transformer" --num-scenarios 20 -- **iot / wo**: filtered rows from `huggingface/scenarios/all_utterance.jsonl` -- **fmsr**: `huggingface/task/failure_mapping_senarios.jsonl` (bucketed shapes) -- **tsfm**: `huggingface/task/rule_monitoring_scenarios.jsonl` (diverse entities) -- **vibration**: `local/vibration_utterance.json` -- **multiagent**: `huggingface/asset/compressor_utterance.jsonl`, `huggingface/asset/hydrolicpump_utterance.jsonl`, plus multiagent rows from `all_utterance.jsonl` +# 2) Grounded open-form run: discover live identifiers from CouchDB and generate 30 scenarios. +uv run python -m scenarios.generator "Motor" --data-in-couchdb --num-scenarios 30 -Selection now mixes two kinds of references: +# 3) Grounded run with workflow output: print phase-by-phase progress in the console. +uv run python -m scenarios.generator "Transformer" --data-in-couchdb --show-workflow -- structurally hard examples from the focus-specific pool (for example TSFM rule-monitoring prompts) -- more natural end-user examples from `all_utterance.jsonl`, compressor/hydraulic-pump asset prompts, and local vibration prompts +# 4) Grounded run with persisted logs: write prompts and artifacts under generated/.../logs/. +uv run python -m scenarios.generator "Transformer" --data-in-couchdb --show-workflow --log -Ranking and selection consider: +# 5) Semantic Scholar backend: use Semantic Scholar for academic retrieval. +uv run python -m scenarios.generator "Transformer" --retriever semantic_scholar --data-in-couchdb -- structural difficulty (multi-part asks, constraints, if/else or fallback language) -- end-user-centric wording fit -- focus relevance from the local corpus +# 6) Reuse a precomputed digest: skip retrieval and digest synthesis. +uv run python -m scenarios.generator "Transformer" --research-digest ./my_digest.md -Prompt instructions explicitly treat legacy few-shots as structure references only and prefer direct operator/manager phrasing in the generated output. +# 7) Disable negative track: produce only scenarios.json. +uv run python -m scenarios.generator "Hydrolic Pump" --num-negative-scenarios 0 -### 5. Scenario generation and validation +# 8) Evaluation run: generate 80 positive scenarios and 10 negative scenarios. +uv run python -m scenarios.generator "Transformer" --num-scenarios 80 --num-negative-scenarios 10 --data-in-couchdb --log +``` -Generation is budgeted and validated per focus lane; the same lane is serialized as `type` in the output. `[constraints](constraints/)` enforces: +## Outputs -- required schema fields -- duplicate avoidance -- clear primary focus -- self-contained closed-form requests -- grounded identifiers for open-form requests -- at least two namespaces for multiagent workflows +Each run writes: -The valid generation loop now runs an always-on LLM validate/repair pass before deterministic validation so the batch can be rewritten toward harder, more user-centric prompts even when the raw JSON is already parseable. +- `generated/scenarios/_scenarios_/scenarios.json` +- optional `negative_scenarios.json` in the same directory -The default negative track runs separately after valid generation. Negative scenarios are not counted against `--num-scenarios`; they are validated to reject accidentally answerable prompts and are written to `negative_scenarios.json`. +Scenario object schema: -Cross-focus support is allowed as long as the primary focus remains clear. +```json +{ + "id": "transformer_scenario_01", + "type": "fmsr", + "text": "...", + "category": "Diagnostic Assessment", + "characteristic_form": "..." +} +``` -## Closed-form vs open-form +## Logs (when `--log` is enabled) -### Closed-form +Artifacts are written under: +`generated/scenarios/_scenarios_/logs/` -Closed-form scenarios must be solvable from the query itself. They can include: +Main folders: -- DGA readings -- rule definitions -- maintenance summaries -- sensor/value snippets -- dataset names and evaluation requests +- `01_grounding/` +- `02_retrieval/` (`paper_search`, `paper_digest`) +- `03_asset_profile/` +- `04_budget/` +- `05_generation//` +- `06_negative_generation//` (if enabled) -Example: +## Source Layout ```text -Interpret the DGA gas readings for transformer: Hydrogen 100 ppm, Methane 50 ppm, Acetylene 5 ppm, Ethylene 20 ppm, Ethane 10 ppm. +scenarios/ +├── generator/ # CLI + orchestration +├── grounding.py # IoT/vibration/FMSR grounding + cache +├── retrieval/ # metadata search, PDF handling, digest synthesis +├── constraints/ # validation and repair constraints +├── prompts/ # prompt templates by stage +├── huggingface/ # few-shot corpora +├── local/ # local few-shot supplements +├── failure_mapping/# cached FMSR mappings +├── models.py +├── utils.py +└── text.py ``` -### Open-form - -Open-form scenarios may require live retrieval, but every concrete identifier must come from grounded discovery. That includes: - -- site names -- asset ids -- sensor names -- explicit time bounds - -## Output files - -`scenarios.json` is a JSON array of objects matching the schema at the top of this document. Field meanings: `id` (stable id), `type` (benchmark lane: `iot`, `fmsr`, `tsfm`, `wo`, `vibration`, or `multiagent`), `text` (user request), `category`, `characteristic_form` (expected tools and answer shape). - -`negative_scenarios.json` uses the same object shape. Its entries are intentionally unanswerable and expect the system to explain what is missing or unsupported instead of fabricating an answer. - -## Logs - -When `--log` is enabled, prompts and raw responses are written under `generated/scenarios/_scenarios_/logs/`, next to `scenarios.json`. Stage-specific subdirectories mirror the pipeline steps. +## Asset-class Mapping Guidance -Typical files include (within each stage folder, filenames are prefixed with a per-folder step counter such as `01_`, `02_`): +For reliable grounded FMSR behavior on new asset classes: -- `01_grounding/` — grounded bundle JSON (`discovery.json` stem) -- `02_retrieval/paper_search//step_*.txt` — one bounded ReAct loop per research-digest section; `02_retrieval/paper_search/summary.txt` — final ranked pool and selected PDFs -- optional `02_retrieval/paper_search/raw_arxiv.json` or `raw_semantic_scholar.json` — raw API payloads when using those backends -- `02_retrieval/paper_digest/per_paper_*.txt` and `merged.txt` — produced by live digest synthesis; with `**--research-digest**` there are no per-paper steps, but `**--log**` still writes `merged.txt` from the loaded file -- `03_asset_profile/prompt.txt`, `response.json`, and `final_asset_profile.json` -- `04_budget/prompt.txt` and `response.json` -- `05_generation//generation_prompt.txt`, `generation_response.json`, and validate/repair prompts under the same focus folder (including `multiagent`, which uses the multi-agent combiner prompt in the same layout as other focuses) -- optional `05_generation//deterministic_failures_attempt_*.json` when validation fails and retries -- `06_negative_generation//generation_prompt.txt`, `generation_response.json`, and validate/repair artifacts for negative scenarios when the negative track is enabled +- add a curated key in `src/servers/fmsr/failure_modes.yaml`, and/or +- add an alias in `src/servers/fmsr/main.py` (`_ASSET_FAILURE_MODE_ALIASES`) +Without this, the system may rely on less deterministic fallback behavior. \ No newline at end of file From 8d0f6eb269a7221ce468d5cec1dfc15fedd63fc8 Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Wed, 6 May 2026 22:08:31 -0400 Subject: [PATCH 27/29] revert some changes --- INSTRUCTIONS.md | 28 +++---- README.md | 2 +- src/agent/claude_agent/tests/test_runner.py | 8 +- src/agent/plan_execute/executor.py | 4 +- src/agent/plan_execute/planner.py | 4 +- src/agent/plan_execute/runner.py | 26 +++--- src/agent/tests/conftest.py | 31 ++------ src/agent/tests/test_models.py | 2 +- src/agent/tests/test_planner.py | 37 ++++----- src/agent/tests/test_runner.py | 88 ++++++++------------- 10 files changed, 84 insertions(+), 146 deletions(-) diff --git a/INSTRUCTIONS.md b/INSTRUCTIONS.md index d38daeeee..8eede3877 100644 --- a/INSTRUCTIONS.md +++ b/INSTRUCTIONS.md @@ -4,25 +4,15 @@ This directory contains the MCP servers and infrastructure for the AssetOpsBench ## Contents -- [AssetOpsBench MCP Environment](#assetopsbench-mcp-environment) - - [Contents](#contents) - - [Prerequisites](#prerequisites) - - [Quick Start](#quick-start) - - [1. Install dependencies](#1-install-dependencies) - - [2. Configure environment](#2-configure-environment) - - [3. Start CouchDB](#3-start-couchdb) - - [4. Run an agent](#4-run-an-agent) - - [Environment Variables](#environment-variables) - - [MCP Servers](#mcp-servers) - - [Example queries](#example-queries) - - [Agents](#agents) - - [Usage](#usage) - - [Common flags](#common-flags) - - [Runner-specific flags](#runner-specific-flags) - - [Examples](#examples) - - [Observability](#observability) - - [Running Tests](#running-tests) - - [Architecture](#architecture) +- [Prerequisites](#prerequisites) +- [Quick Start](#quick-start) +- [Environment Variables](#environment-variables) +- [MCP Servers](#mcp-servers) — full reference in [docs/mcp-servers.md](docs/mcp-servers.md) +- [Example queries](#example-queries) +- [Agents](#agents) +- [Observability](#observability) +- [Running Tests](#running-tests) +- [Architecture](#architecture) --- diff --git a/README.md b/README.md index 393ef0943..b4867f425 100644 --- a/README.md +++ b/README.md @@ -137,7 +137,7 @@ Explore all scenarios [HF-Dataset](https://huggingface.co/datasets/ibm-research/ ## AI Agents ### Domain-Specific Agents (Important tools) - **IoT Agent**: `get_sites`, `get_history`, `get_assets`, `get_sensors` -- **FMSR Agent**: `get_failure_modes`, `get_failure_mode_sensor_mapping`, … +- **FMSR Agent**: `get_sensors`, `get_failure_modes`, `get_failure_sensor_mapping` - **TSFM Agent**: `forecasting`, `timeseries_anomaly_detection` - **WO Agent**: `generate_work_order` diff --git a/src/agent/claude_agent/tests/test_runner.py b/src/agent/claude_agent/tests/test_runner.py index b73040eed..3c4ddbc59 100644 --- a/src/agent/claude_agent/tests/test_runner.py +++ b/src/agent/claude_agent/tests/test_runner.py @@ -116,7 +116,7 @@ async def test_run_collects_trajectory(): from claude_agent_sdk import AssistantMessage, ResultMessage, TextBlock, ToolUseBlock mock_tool = MagicMock(spec=ToolUseBlock) - mock_tool.name = "get_sensors" + mock_tool.name = "sensors" mock_tool.input = {"asset_id": "CH-6"} mock_tool.id = "tu_123" @@ -145,7 +145,7 @@ async def fake_query(prompt, options): turn = traj.turns[0] assert turn.text == "Calling sensors tool..." assert len(turn.tool_calls) == 1 - assert turn.tool_calls[0].name == "get_sensors" + assert turn.tool_calls[0].name == "sensors" assert turn.tool_calls[0].input == {"asset_id": "CH-6"} assert turn.input_tokens == 100 assert turn.output_tokens == 20 @@ -160,7 +160,7 @@ async def test_run_tool_output_captured(): from claude_agent_sdk import AssistantMessage, ResultMessage, TextBlock, ToolUseBlock mock_tool = MagicMock(spec=ToolUseBlock) - mock_tool.name = "get_sensors" + mock_tool.name = "sensors" mock_tool.input = {"asset_id": "CH-6"} mock_tool.id = "tu_456" @@ -209,7 +209,7 @@ async def test_run_tool_output_string_response(): from claude_agent_sdk import AssistantMessage, ResultMessage, TextBlock, ToolUseBlock mock_tool = MagicMock(spec=ToolUseBlock) - mock_tool.name = "get_sites" + mock_tool.name = "sites" mock_tool.input = {} mock_tool.id = "tu_789" diff --git a/src/agent/plan_execute/executor.py b/src/agent/plan_execute/executor.py index eac5e00bc..2e27b5144 100644 --- a/src/agent/plan_execute/executor.py +++ b/src/agent/plan_execute/executor.py @@ -210,11 +210,11 @@ async def _resolve_args_with_llm( .replace("{context}", context_text or "(none)") ) raw = llm.generate(prompt) - resolved = _parse_json(raw.text) + resolved = _parse_json(raw) if resolved is None: _log.warning( "Tool '%s': arg resolution returned no parseable JSON (response: %r…)", - tool, raw.text[:120], + tool, raw[:120], ) return {} return resolved diff --git a/src/agent/plan_execute/planner.py b/src/agent/plan_execute/planner.py index e6e86b82a..8c683943a 100644 --- a/src/agent/plan_execute/planner.py +++ b/src/agent/plan_execute/planner.py @@ -127,5 +127,5 @@ def generate_plan( f"{name}:\n{desc}" for name, desc in server_descriptions.items() ) prompt = _PLAN_PROMPT.format(servers=servers_text, question=question) - result = self._llm.generate(prompt) - return parse_plan(result.text) + raw = self._llm.generate(prompt) + return parse_plan(raw) diff --git a/src/agent/plan_execute/runner.py b/src/agent/plan_execute/runner.py index 7c55d05d5..ea684a650 100644 --- a/src/agent/plan_execute/runner.py +++ b/src/agent/plan_execute/runner.py @@ -28,9 +28,9 @@ class _TokenMeter(LLMBackend): """Wraps an :class:`LLMBackend` and sums token usage across calls. - ``Planner`` / ``Executor`` call :meth:`generate` and use :attr:`LLMResult.text`; - this wrapper transparently accumulates token fields from the inner backend's - :meth:`generate_with_usage` on every call. Totals are + ``Planner`` / ``Executor`` call ``generate()`` and only need a string; + this wrapper transparently pulls usage from the inner backend's + ``generate_with_usage()`` and accumulates it in-place. Totals are reset at the start of each :meth:`PlanExecuteRunner.run` call so per-run span attributes reflect that run alone. """ @@ -44,24 +44,16 @@ def reset(self) -> None: self.input_tokens = 0 self.output_tokens = 0 - def generate( - self, - prompt: str, - temperature: float = 0.0, - max_tokens: int | None = None, - ) -> LLMResult: - result = self._inner.generate_with_usage(prompt, temperature, max_tokens) + def generate(self, prompt: str, temperature: float = 0.0) -> str: + result = self._inner.generate_with_usage(prompt, temperature) self.input_tokens += result.input_tokens self.output_tokens += result.output_tokens - return result + return result.text def generate_with_usage( - self, - prompt: str, - temperature: float = 0.0, - max_tokens: int | None = None, + self, prompt: str, temperature: float = 0.0 ) -> LLMResult: - result = self._inner.generate_with_usage(prompt, temperature, max_tokens) + result = self._inner.generate_with_usage(prompt, temperature) self.input_tokens += result.input_tokens self.output_tokens += result.output_tokens return result @@ -162,7 +154,7 @@ async def run(self, question: str) -> OrchestratorResult: summarization_started = time.perf_counter() answer = self._meter.generate( _SUMMARIZE_PROMPT.format(question=question, results=results_text) - ).text + ) summarization_ms = (time.perf_counter() - summarization_started) * 1000 duration_ms = (time.perf_counter() - run_started) * 1000 diff --git a/src/agent/tests/conftest.py b/src/agent/tests/conftest.py index 1baeb4275..b3827ce6a 100644 --- a/src/agent/tests/conftest.py +++ b/src/agent/tests/conftest.py @@ -2,7 +2,7 @@ import pytest -from llm import LLMBackend, LLMResult +from llm import LLMBackend class MockLLM(LLMBackend): @@ -11,18 +11,8 @@ class MockLLM(LLMBackend): def __init__(self, response: str = "") -> None: self._response = response - def generate( - self, - prompt: str, - temperature: float = 0.0, - max_tokens: int | None = None, - ) -> LLMResult: - return LLMResult( - text=self._response, - input_tokens=1, - output_tokens=1, - total_tokens=2, - ) + def generate(self, prompt: str, temperature: float = 0.0) -> str: + return self._response class SequentialMockLLM(LLMBackend): @@ -31,19 +21,8 @@ class SequentialMockLLM(LLMBackend): def __init__(self, responses: list[str]) -> None: self._responses = iter(responses) - def generate( - self, - prompt: str, - temperature: float = 0.0, - max_tokens: int | None = None, - ) -> LLMResult: - text = next(self._responses, "") - return LLMResult( - text=text, - input_tokens=1, - output_tokens=1, - total_tokens=2, - ) + def generate(self, prompt: str, temperature: float = 0.0) -> str: + return next(self._responses, "") @pytest.fixture diff --git a/src/agent/tests/test_models.py b/src/agent/tests/test_models.py index f00e235f7..b9ce43f00 100644 --- a/src/agent/tests/test_models.py +++ b/src/agent/tests/test_models.py @@ -8,7 +8,7 @@ def _step(n: int, deps: list[int] | None = None) -> PlanStep: step_number=n, task=f"Task {n}", server="iot", - tool="get_sites", + tool="sites", tool_args={}, dependencies=deps or [], expected_output="output", diff --git a/src/agent/tests/test_planner.py b/src/agent/tests/test_planner.py index 825a3834f..77bc4497d 100644 --- a/src/agent/tests/test_planner.py +++ b/src/agent/tests/test_planner.py @@ -5,20 +5,20 @@ _TWO_STEP = """\ #Task1: List all available IoT sites #Server1: iot -#Tool1: get_sites +#Tool1: sites #Dependency1: None #ExpectedOutput1: A list of site names #Task2: Get assets at site MAIN #Server2: iot -#Tool2: get_assets +#Tool2: assets #Dependency2: #S1 #ExpectedOutput2: A list of asset IDs""" _MULTI_DEP = """\ #Task1: Get sites #Server1: iot -#Tool1: get_sites +#Tool1: sites #Dependency1: None #ExpectedOutput1: Sites @@ -59,8 +59,8 @@ def test_server_names(self): def test_tool_names(self): plan = parse_plan(_TWO_STEP) - assert plan.steps[0].tool == "get_sites" - assert plan.steps[1].tool == "get_assets" + assert plan.steps[0].tool == "sites" + assert plan.steps[1].tool == "assets" def test_tool_name_signature_stripped(self): """LLM sometimes copies the 'tool(params)' format from server descriptions. @@ -70,18 +70,18 @@ def test_tool_name_signature_stripped(self): raw = ( "#Task1: Get sites\n" "#Server1: iot\n" - "#Tool1: get_sites()\n" + "#Tool1: sites()\n" "#Dependency1: None\n" "#ExpectedOutput1: Sites\n\n" "#Task2: Get assets\n" "#Server2: iot\n" - "#Tool2: get_assets(site_name: string)\n" + "#Tool2: assets(site_name: string)\n" "#Dependency2: #S1\n" "#ExpectedOutput2: Assets" ) plan = parse_plan(raw) - assert plan.steps[0].tool == "get_sites" - assert plan.steps[1].tool == "get_assets" + assert plan.steps[0].tool == "sites" + assert plan.steps[1].tool == "assets" def test_tool_args_always_empty(self): """Planner no longer generates args — tool_args is always {}.""" @@ -122,13 +122,13 @@ def test_args_lines_in_raw_are_ignored(self): raw = ( "#Task1: Get sites\n" "#Server1: iot\n" - "#Tool1: get_sites\n" + "#Tool1: sites\n" "#Args1: {}\n" "#Dependency1: None\n" "#ExpectedOutput1: Sites\n\n" "#Task2: Get assets\n" "#Server2: iot\n" - "#Tool2: get_assets\n" + "#Tool2: assets\n" '#Args2: {"site_name": "MAIN"}\n' "#Dependency2: #S1\n" "#ExpectedOutput2: Assets" @@ -144,13 +144,11 @@ def test_generate_plan_uses_llm_output(self, mock_llm): planner = Planner(llm) plan = planner.generate_plan( "List all assets", - { - "iot": " - get_sites(): List sites\n - get_assets(site_name: string): List assets" - }, + {"iot": " - sites(): List sites\n - assets(site_name: string): List assets"}, ) assert len(plan.steps) == 2 assert plan.steps[0].server == "iot" - assert plan.steps[1].tool == "get_assets" + assert plan.steps[1].tool == "assets" def test_generate_plan_prompt_contains_question(self, mock_llm, monkeypatch): captured = [] @@ -160,7 +158,7 @@ def test_generate_plan_prompt_contains_question(self, mock_llm, monkeypatch): Planner(llm).generate_plan( "What sensors exist for CH-1?", - {"iot": " - get_sites(): List sites"}, + {"iot": " - sites(): List sites"}, ) assert "What sensors exist for CH-1?" in captured[0] @@ -172,10 +170,7 @@ def test_generate_plan_prompt_contains_agent_names(self, mock_llm, monkeypatch): Planner(llm).generate_plan( "Q", - { - "iot": " - get_sites(): List sites", - "utilities": " - current_date_time(): Get time", - }, + {"iot": " - sites(): List sites", "utilities": " - current_date_time(): Get time"}, ) assert "iot" in captured[0] assert "utilities" in captured[0] @@ -187,5 +182,5 @@ def test_generate_plan_prompt_does_not_mention_args(self, mock_llm): original = llm.generate llm.generate = lambda p, **kw: (captured.append(p), original(p))[1] - Planner(llm).generate_plan("Q", {"iot": " - get_sites(): List sites"}) + Planner(llm).generate_plan("Q", {"iot": " - sites(): List sites"}) assert "#Args" not in captured[0] diff --git a/src/agent/tests/test_runner.py b/src/agent/tests/test_runner.py index 002c2dc40..6bdbac98b 100644 --- a/src/agent/tests/test_runner.py +++ b/src/agent/tests/test_runner.py @@ -23,7 +23,7 @@ _TWO_STEP_PLAN = """\ #Task1: Get IoT sites #Server1: iot -#Tool1: get_sites +#Tool1: sites #Dependency1: None #ExpectedOutput1: List of site names @@ -36,7 +36,7 @@ _FINAL_ANSWER = "Sites: MAIN. Current time: 2026-02-18T13:00:00." _MOCK_TOOLS = [ - {"name": "get_sites", "description": "List IoT sites", "parameters": []}, + {"name": "sites", "description": "List IoT sites", "parameters": []}, {"name": "current_date_time", "description": "Get current datetime", "parameters": []}, ] _TOOL_RESPONSE = json.dumps({"sites": ["MAIN"]}) @@ -61,7 +61,7 @@ def _patch_mcp(tool_response: str = _TOOL_RESPONSE): def _make_step( n: int, server: str = "iot", - tool: str = "get_sites", + tool: str = "sites", deps: list[int] | None = None, expected_output: str = "", ) -> PlanStep: @@ -83,14 +83,9 @@ def __init__(self, response: str = "{}") -> None: self.prompts: list[str] = [] self._response = response - def generate(self, prompt: str, **_kw) -> LLMResult: + def generate(self, prompt: str, **_kw) -> str: self.prompts.append(prompt) - return LLMResult( - text=self._response, - input_tokens=1, - output_tokens=1, - total_tokens=2, - ) + return self._response # ── orchestrator tests ──────────────────────────────────────────────────────── @@ -147,27 +142,14 @@ class _UsageReportingLLM(LLMBackend): def __init__(self, items: list[tuple[str, int, int]]) -> None: self._items = iter(items) - def generate( - self, - prompt: str, - temperature: float = 0.0, - max_tokens: int | None = None, - ) -> LLMResult: - return self.generate_with_usage(prompt, temperature, max_tokens) + def generate(self, prompt: str, temperature: float = 0.0) -> str: + return self.generate_with_usage(prompt, temperature).text def generate_with_usage( - self, - prompt: str, - temperature: float = 0.0, - max_tokens: int | None = None, + self, prompt: str, temperature: float = 0.0 ) -> LLMResult: text, in_tok, out_tok = next(self._items, ("", 0, 0)) - return LLMResult( - text=text, - input_tokens=in_tok, - output_tokens=out_tok, - total_tokens=in_tok + out_tok, - ) + return LLMResult(text=text, input_tokens=in_tok, output_tokens=out_tok) @pytest.mark.anyio @@ -261,7 +243,7 @@ async def test_executor_step_result_carries_resolved_args(sequential_llm): llm = sequential_llm(['{"site_name": "MAIN"}']) executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) - step = _make_step(1, tool="get_assets") + step = _make_step(1, tool="assets") with ( patch("agent.plan_execute.executor._list_tools", new=AsyncMock(return_value=_MOCK_TOOLS)), patch("agent.plan_execute.executor._call_tool", new=AsyncMock(return_value="{}")), @@ -279,7 +261,7 @@ async def test_executor_tool_call_exception_recorded_as_error(sequential_llm): llm = sequential_llm(['{}']) executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) - step = _make_step(1, tool="get_sites") + step = _make_step(1, tool="sites") with ( patch("agent.plan_execute.executor._list_tools", new=AsyncMock(return_value=_MOCK_TOOLS)), patch("agent.plan_execute.executor._call_tool", new=AsyncMock(side_effect=RuntimeError("timeout"))), @@ -296,15 +278,15 @@ async def test_executor_calls_llm_to_generate_args(sequential_llm): from pathlib import Path llm = sequential_llm([ - '{}', # step 1: get_sites (no args) - '{"site_name": "MAIN", "asset_id": "CH-1"}', # step 2: get_sensors + '{}', # step 1: sites (no args) + '{"site_name": "MAIN", "asset_id": "CH-1"}', # step 2: sensors ]) executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) plan = Plan( steps=[ - _make_step(1, tool="get_sites"), - _make_step(2, tool="get_sensors", deps=[1]), + _make_step(1, tool="sites"), + _make_step(2, tool="sensors", deps=[1]), ], raw="", ) @@ -334,8 +316,8 @@ async def test_executor_prior_step_results_in_llm_prompt(): plan = Plan( steps=[ - _make_step(1, tool="get_sites"), - _make_step(2, tool="get_sensors", deps=[1]), + _make_step(1, tool="sites"), + _make_step(2, tool="sensors", deps=[1]), ], raw="", ) @@ -359,7 +341,7 @@ async def test_executor_no_prior_context_shows_none_in_prompt(): llm = _CapturingLLM('{}') executor = Executor(llm, server_paths={"iot": Path("/fake/server.py")}) # type: ignore[arg-type] - step = _make_step(1, tool="get_sites") + step = _make_step(1, tool="sites") with ( patch("agent.plan_execute.executor._list_tools", new=AsyncMock(return_value=_MOCK_TOOLS)), patch("agent.plan_execute.executor._call_tool", new=AsyncMock(return_value="{}")), @@ -379,9 +361,9 @@ async def test_executor_context_accumulates_across_steps(): plan = Plan( steps=[ - _make_step(1, tool="get_sites"), - _make_step(2, tool="get_assets", deps=[1]), - _make_step(3, tool="get_sensors", deps=[2]), + _make_step(1, tool="sites"), + _make_step(2, tool="assets", deps=[1]), + _make_step(3, tool="sensors", deps=[2]), ], raw="", ) @@ -404,18 +386,18 @@ async def test_pipeline_uses_llm_args_for_each_step(sequential_llm): planner_output = ( "#Task1: Get IoT sites\n" "#Server1: iot\n" - "#Tool1: get_sites\n" + "#Tool1: sites\n" "#Dependency1: None\n" "#ExpectedOutput1: List of site names\n\n" "#Task2: Get assets at the site from step 1\n" "#Server2: iot\n" - "#Tool2: get_assets\n" + "#Tool2: assets\n" "#Dependency2: #S1\n" "#ExpectedOutput2: List of assets" ) llm = sequential_llm([ planner_output, # planner call - '{}', # arg resolution for step 1 (get_sites needs no args) + '{}', # arg resolution for step 1 (sites needs no args) '{"site_name": "MAIN"}', # arg resolution for step 2 (uses step 1 result) "Final answer.", # summarisation ]) @@ -441,7 +423,7 @@ async def test_resolve_args_with_llm_uses_context(mock_llm): ctx = {1: StepResult(step_number=1, task="t", server="a", response='{"assets": ["CH-1", "CH-2"]}')} result = await _resolve_args_with_llm( - "What sensors does CH-1 have?", "get sensors", "get_sensors", "", ctx, llm, + "What sensors does CH-1 have?", "get sensors", "sensors", "", ctx, llm, ) assert result["asset_id"] == "CH-1" @@ -458,7 +440,7 @@ async def test_resolve_args_with_llm_fallback_on_bad_json(mock_llm): async def test_resolve_args_with_llm_question_in_prompt(): llm = _CapturingLLM('{"site_name": "MAIN"}') await _resolve_args_with_llm( - "What sites exist?", "List sites", "get_sites", "", {}, llm # type: ignore[arg-type] + "What sites exist?", "List sites", "sites", "", {}, llm # type: ignore[arg-type] ) assert "What sites exist?" in llm.prompts[0] @@ -466,8 +448,8 @@ async def test_resolve_args_with_llm_question_in_prompt(): @pytest.mark.anyio async def test_resolve_args_with_llm_tool_in_prompt(): llm = _CapturingLLM('{}') - await _resolve_args_with_llm("Q", "List IoT sites", "get_sites", "", {}, llm) # type: ignore[arg-type] - assert "get_sites" in llm.prompts[0] + await _resolve_args_with_llm("Q", "List IoT sites", "sites", "", {}, llm) # type: ignore[arg-type] + assert "sites" in llm.prompts[0] @pytest.mark.anyio @@ -475,7 +457,7 @@ async def test_resolve_args_with_llm_schema_in_prompt(): """Tool parameter schema appears in the prompt so LLM uses correct names.""" llm = _CapturingLLM('{"site_name": "MAIN"}') await _resolve_args_with_llm( # type: ignore[arg-type] - "Q", "List assets", "get_assets", "site_name: string", {}, llm + "Q", "List assets", "assets", "site_name: string", {}, llm ) assert "site_name: string" in llm.prompts[0] @@ -555,16 +537,16 @@ def test_parse_json_empty_object_returns_empty_dict(): def test_parse_tool_call_plain_json(): - raw = '{"tool": "get_sites", "args": {}}' + raw = '{"tool": "sites", "args": {}}' result = _parse_tool_call(raw) - assert result["tool"] == "get_sites" + assert result["tool"] == "sites" assert result["args"] == {} def test_parse_tool_call_with_markdown_fence(): - raw = '```json\n{"tool": "get_history", "args": {"site_name": "MAIN"}}\n```' + raw = '```json\n{"tool": "history", "args": {"site_name": "MAIN"}}\n```' result = _parse_tool_call(raw) - assert result["tool"] == "get_history" + assert result["tool"] == "history" assert result["args"]["site_name"] == "MAIN" @@ -576,9 +558,9 @@ def test_parse_tool_call_null_tool(): def test_parse_tool_call_embedded_json(): - raw = 'Here is my response: {"tool": "get_sites", "args": {}} done.' + raw = 'Here is my response: {"tool": "sites", "args": {}} done.' result = _parse_tool_call(raw) - assert result["tool"] == "get_sites" + assert result["tool"] == "sites" def test_parse_tool_call_unrecoverable_returns_direct_answer(): From 64f0ae61610fcca22b947e03142652180cfc2dd7 Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Wed, 6 May 2026 22:13:03 -0400 Subject: [PATCH 28/29] revert some more changes --- src/servers/iot/main.py | 113 +----------------------- src/servers/iot/tests/test_tools.py | 38 ++++---- src/servers/vibration/couchdb_client.py | 102 --------------------- 3 files changed, 23 insertions(+), 230 deletions(-) diff --git a/src/servers/iot/main.py b/src/servers/iot/main.py index 79e786b0b..9e4732087 100644 --- a/src/servers/iot/main.py +++ b/src/servers/iot/main.py @@ -42,8 +42,6 @@ # Static site as per original requirement SITES = ["MAIN"] -_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} - class ErrorResult(BaseModel): error: str @@ -133,117 +131,14 @@ def get_sensor_list(asset_id: str) -> List[str]: return [] -def get_asset_time_range(asset_id: str) -> Dict[str, Any]: - """Return start/end timestamps and observation count for an asset. - - Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by - a per-document site field. - """ - if not db: - return {"start": None, "end": None, "total_observations": 0} - - try: - res = db.find( - {"asset_id": asset_id, "timestamp": {"$exists": True}}, - fields=["timestamp"], - limit=100000, - ) - timestamps = sorted( - doc["timestamp"] - for doc in res.get("docs", []) - if isinstance(doc, dict) and doc.get("timestamp") is not None - ) - if not timestamps: - return {"start": None, "end": None, "total_observations": 0} - return { - "start": timestamps[0], - "end": timestamps[-1], - "total_observations": len(timestamps), - } - except Exception as e: - logger.error(f"Error fetching time range for {asset_id}: {e}") - return {"start": None, "end": None, "total_observations": 0} - - -def get_asset_coverage() -> List[Dict[str, Any]]: - """Return discovered IoT coverage for all assets. - - Uses ``SITES[0]`` as the site label (single static site); documents are not read - for a site field. - """ - if not db: - return [] - - effective_site = SITES[0] - - try: - res = db.find({"asset_id": {"$exists": True}}, limit=100000) - except Exception as e: - logger.error(f"Error fetching asset coverage: {e}") - return [] - - grouped: Dict[tuple[str, str], Dict[str, Any]] = {} - for doc in res.get("docs", []): - if not isinstance(doc, dict): - continue - asset_id = str(doc.get("asset_id", "")).strip() - if not asset_id: - continue - - key = (effective_site, asset_id) - group = grouped.setdefault( - key, - { - "site_name": effective_site, - "asset_id": asset_id, - "sensors": set(), - "timestamps": [], - }, - ) - group["sensors"].update( - key for key in doc.keys() if key not in _ASSET_META_FIELDS - ) - timestamp = doc.get("timestamp") - if timestamp is None: - continue - if isinstance(timestamp, str): - if timestamp.strip(): - group["timestamps"].append(timestamp.strip()) - elif hasattr(timestamp, "isoformat"): - group["timestamps"].append(timestamp.isoformat()) - else: - group["timestamps"].append(str(timestamp)) - - coverage: List[Dict[str, Any]] = [] - for (_site_name, asset_id), group in grouped.items(): - timestamps = sorted(group["timestamps"]) - coverage.append( - { - "site_name": group["site_name"], - "asset_id": asset_id, - "sensors": sorted(group["sensors"]), - "time_range": { - "start": timestamps[0] if timestamps else None, - "end": timestamps[-1] if timestamps else None, - "total_observations": len(timestamps), - }, - } - ) - - return sorted( - coverage, - key=lambda item: (item["site_name"].lower(), item["asset_id"].lower()), - ) - - @mcp.tool(title="List Sites") -def get_sites() -> SitesResult: +def sites() -> SitesResult: """Retrieves a list of sites. Each site is represented by a name.""" return SitesResult(sites=SITES) @mcp.tool(title="List Assets") -def get_assets(site_name: str) -> Union[AssetsResult, ErrorResult]: +def assets(site_name: str) -> Union[AssetsResult, ErrorResult]: """Returns a list of assets for a given site. Each asset includes an id and a name.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -258,7 +153,7 @@ def get_assets(site_name: str) -> Union[AssetsResult, ErrorResult]: @mcp.tool(title="List Sensors") -def get_sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: +def sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: """Lists the sensors available for a specified asset at a given site.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -277,7 +172,7 @@ def get_sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResu @mcp.tool(title="Get Sensor History") -def get_history( +def history( site_name: str, asset_id: str, start: str, final: Optional[str] = None ) -> Union[HistoryResult, ErrorResult]: """Returns a list of historical sensor values for the specified asset(s) at a site within a given time range (start to final).""" diff --git a/src/servers/iot/tests/test_tools.py b/src/servers/iot/tests/test_tools.py index d22f48ef4..20b24b593 100644 --- a/src/servers/iot/tests/test_tools.py +++ b/src/servers/iot/tests/test_tools.py @@ -10,26 +10,26 @@ # --------------------------------------------------------------------------- -# get_sites +# sites # --------------------------------------------------------------------------- class TestSites: @pytest.mark.anyio async def test_returns_main(self): - data = await call_tool(mcp, "get_sites", {}) + data = await call_tool(mcp, "sites", {}) assert data["sites"] == ["MAIN"] # --------------------------------------------------------------------------- -# get_assets +# assets # --------------------------------------------------------------------------- class TestAssets: @pytest.mark.anyio async def test_invalid_site(self): - data = await call_tool(mcp, "get_assets", {"site_name": "INVALID"}) + data = await call_tool(mcp, "assets", {"site_name": "INVALID"}) assert "error" in data assert "unknown site" in data["error"] @@ -38,7 +38,7 @@ async def test_with_mock_db(self, mock_db): mock_db.find.return_value = { "docs": [{"asset_id": "Chiller 1"}, {"asset_id": "Chiller 2"}] } - data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) assert data["total_assets"] == 2 assert "Chiller 1" in data["assets"] @@ -47,21 +47,21 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_db_disconnected(self, no_db): - data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) # Should still return valid JSON (empty assets), not crash assert "assets" in data or "error" in data @requires_couchdb @pytest.mark.anyio async def test_discovery_integration(self): - data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) assert "assets" in data assert "Chiller 6" in data["assets"] assert data["total_assets"] > 0 # --------------------------------------------------------------------------- -# get_sensors +# sensors # --------------------------------------------------------------------------- @@ -69,14 +69,14 @@ class TestSensors: @pytest.mark.anyio async def test_invalid_site(self): data = await call_tool( - mcp, "get_sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} + mcp, "sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} ) assert "error" in data @pytest.mark.anyio async def test_unknown_asset(self): data = await call_tool( - mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "INVALID"} + mcp, "sensors", {"site_name": "MAIN", "asset_id": "INVALID"} ) assert "error" in data assert "no sensors found" in data["error"] @@ -96,7 +96,7 @@ async def test_with_mock_db(self, mock_db): ] } data = await call_tool( - mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} + mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} ) assert data["total_sensors"] == 2 @@ -110,7 +110,7 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_success_integration(self): data = await call_tool( - mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} + mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} ) assert "sensors" in data assert len(data["sensors"]) > 0 @@ -118,7 +118,7 @@ async def test_success_integration(self): # --------------------------------------------------------------------------- -# get_history +# history # --------------------------------------------------------------------------- @@ -127,7 +127,7 @@ class TestHistory: async def test_invalid_date_range(self): data = await call_tool( mcp, - "get_history", + "history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -142,7 +142,7 @@ async def test_invalid_date_range(self): async def test_malformed_date(self): data = await call_tool( mcp, - "get_history", + "history", {"site_name": "MAIN", "asset_id": "Chiller 6", "start": "not-a-date"}, ) assert "error" in data @@ -151,7 +151,7 @@ async def test_malformed_date(self): async def test_db_disconnected(self, no_db): data = await call_tool( mcp, - "get_history", + "history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -171,7 +171,7 @@ async def test_with_mock_db(self, mock_db): } data = await call_tool( mcp, - "get_history", + "history", { "site_name": "MAIN", "asset_id": "Chiller 1", @@ -188,7 +188,7 @@ async def test_with_mock_db(self, mock_db): async def test_open_ended_integration(self): data = await call_tool( mcp, - "get_history", + "history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -203,7 +203,7 @@ async def test_open_ended_integration(self): async def test_bounded_range_integration(self): data = await call_tool( mcp, - "get_history", + "history", { "site_name": "MAIN", "asset_id": "Chiller 6", diff --git a/src/servers/vibration/couchdb_client.py b/src/servers/vibration/couchdb_client.py index 6e513a54b..04aa4a4a0 100644 --- a/src/servers/vibration/couchdb_client.py +++ b/src/servers/vibration/couchdb_client.py @@ -24,16 +24,6 @@ COUCHDB_USER = os.environ.get("COUCHDB_USERNAME") COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD") -# Static site as per IoT benchmark; documents are not filtered by a per-document site field. -SITES = ["MAIN"] - -_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} - - -def get_site_list() -> list[str]: - """Sites accepted for vibration (aligned with IoT ``SITES``).""" - return list(SITES) - def _get_db() -> Optional[couchdb3.Database]: """Lazy CouchDB connection with error handling.""" @@ -153,95 +143,3 @@ def list_sensor_fields(asset_id: str) -> list[str]: except Exception as e: logger.error(f"Error listing sensors for {asset_id}: {e}") return [] - -def get_asset_time_range(asset_id: str) -> dict: - """Return start/end timestamps and observation count for an asset. - - Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by - a per-document site field. - """ - db = _get_db() - if not db: - return {"start": None, "end": None, "total_observations": 0} - try: - res = db.find( - {"asset_id": asset_id, "timestamp": {"$exists": True}}, - fields=["timestamp"], - limit=100000, - ) - timestamps = sorted( - doc["timestamp"] - for doc in res.get("docs", []) - if isinstance(doc, dict) - and doc.get("timestamp") - ) - if not timestamps: - return {"start": None, "end": None, "total_observations": 0} - return { - "start": timestamps[0], - "end": timestamps[-1], - "total_observations": len(timestamps), - } - except Exception as e: - logger.error(f"Error fetching vibration time range for {asset_id}: {e}") - return {"start": None, "end": None, "total_observations": 0} - - -def list_asset_coverage() -> list[dict]: - """Return vibration asset coverage, sensors, and time ranges. - - Uses ``SITES[0]`` as the site label (single static site); documents are not read - for a site field. - """ - db = _get_db() - if not db: - return [] - - effective_site = SITES[0] - - try: - res = db.find({"asset_id": {"$exists": True}}, limit=100000) - except Exception as e: - logger.error(f"Error fetching vibration asset coverage: {e}") - return [] - - grouped: dict[tuple[str, str], dict] = {} - for doc in res.get("docs", []): - if not isinstance(doc, dict): - continue - asset_id = str(doc.get("asset_id", "")).strip() - if not asset_id: - continue - - key = (effective_site, asset_id) - group = grouped.setdefault( - key, - { - "site_name": effective_site, - "asset_id": asset_id, - "sensors": set(), - "timestamps": [], - }, - ) - group["sensors"].update(k for k in doc.keys() if k not in _ASSET_META_FIELDS) - timestamp = doc.get("timestamp") - if isinstance(timestamp, str) and timestamp: - group["timestamps"].append(timestamp) - - coverage: list[dict] = [] - for (_site_name, asset_id), group in grouped.items(): - timestamps = sorted(group["timestamps"]) - coverage.append( - { - "site_name": group["site_name"], - "asset_id": asset_id, - "sensors": sorted(group["sensors"]), - "time_range": { - "start": timestamps[0] if timestamps else None, - "end": timestamps[-1] if timestamps else None, - "total_observations": len(timestamps), - }, - } - ) - - return sorted(coverage, key=lambda item: (item["site_name"].lower(), item["asset_id"].lower())) From 711d9f11309f48c8d483898410d3f23f40a90967 Mon Sep 17 00:00:00 2001 From: Rohith Kanathur Date: Wed, 6 May 2026 22:24:07 -0400 Subject: [PATCH 29/29] Revert "revert some more changes" This reverts commit 64f0ae61610fcca22b947e03142652180cfc2dd7. --- src/servers/iot/main.py | 113 +++++++++++++++++++++++- src/servers/iot/tests/test_tools.py | 38 ++++---- src/servers/vibration/couchdb_client.py | 102 +++++++++++++++++++++ 3 files changed, 230 insertions(+), 23 deletions(-) diff --git a/src/servers/iot/main.py b/src/servers/iot/main.py index 9e4732087..79e786b0b 100644 --- a/src/servers/iot/main.py +++ b/src/servers/iot/main.py @@ -42,6 +42,8 @@ # Static site as per original requirement SITES = ["MAIN"] +_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} + class ErrorResult(BaseModel): error: str @@ -131,14 +133,117 @@ def get_sensor_list(asset_id: str) -> List[str]: return [] +def get_asset_time_range(asset_id: str) -> Dict[str, Any]: + """Return start/end timestamps and observation count for an asset. + + Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by + a per-document site field. + """ + if not db: + return {"start": None, "end": None, "total_observations": 0} + + try: + res = db.find( + {"asset_id": asset_id, "timestamp": {"$exists": True}}, + fields=["timestamp"], + limit=100000, + ) + timestamps = sorted( + doc["timestamp"] + for doc in res.get("docs", []) + if isinstance(doc, dict) and doc.get("timestamp") is not None + ) + if not timestamps: + return {"start": None, "end": None, "total_observations": 0} + return { + "start": timestamps[0], + "end": timestamps[-1], + "total_observations": len(timestamps), + } + except Exception as e: + logger.error(f"Error fetching time range for {asset_id}: {e}") + return {"start": None, "end": None, "total_observations": 0} + + +def get_asset_coverage() -> List[Dict[str, Any]]: + """Return discovered IoT coverage for all assets. + + Uses ``SITES[0]`` as the site label (single static site); documents are not read + for a site field. + """ + if not db: + return [] + + effective_site = SITES[0] + + try: + res = db.find({"asset_id": {"$exists": True}}, limit=100000) + except Exception as e: + logger.error(f"Error fetching asset coverage: {e}") + return [] + + grouped: Dict[tuple[str, str], Dict[str, Any]] = {} + for doc in res.get("docs", []): + if not isinstance(doc, dict): + continue + asset_id = str(doc.get("asset_id", "")).strip() + if not asset_id: + continue + + key = (effective_site, asset_id) + group = grouped.setdefault( + key, + { + "site_name": effective_site, + "asset_id": asset_id, + "sensors": set(), + "timestamps": [], + }, + ) + group["sensors"].update( + key for key in doc.keys() if key not in _ASSET_META_FIELDS + ) + timestamp = doc.get("timestamp") + if timestamp is None: + continue + if isinstance(timestamp, str): + if timestamp.strip(): + group["timestamps"].append(timestamp.strip()) + elif hasattr(timestamp, "isoformat"): + group["timestamps"].append(timestamp.isoformat()) + else: + group["timestamps"].append(str(timestamp)) + + coverage: List[Dict[str, Any]] = [] + for (_site_name, asset_id), group in grouped.items(): + timestamps = sorted(group["timestamps"]) + coverage.append( + { + "site_name": group["site_name"], + "asset_id": asset_id, + "sensors": sorted(group["sensors"]), + "time_range": { + "start": timestamps[0] if timestamps else None, + "end": timestamps[-1] if timestamps else None, + "total_observations": len(timestamps), + }, + } + ) + + return sorted( + coverage, + key=lambda item: (item["site_name"].lower(), item["asset_id"].lower()), + ) + + @mcp.tool(title="List Sites") -def sites() -> SitesResult: +def get_sites() -> SitesResult: """Retrieves a list of sites. Each site is represented by a name.""" return SitesResult(sites=SITES) @mcp.tool(title="List Assets") -def assets(site_name: str) -> Union[AssetsResult, ErrorResult]: +def get_assets(site_name: str) -> Union[AssetsResult, ErrorResult]: """Returns a list of assets for a given site. Each asset includes an id and a name.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -153,7 +258,7 @@ def assets(site_name: str) -> Union[AssetsResult, ErrorResult]: @mcp.tool(title="List Sensors") -def sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: +def get_sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: """Lists the sensors available for a specified asset at a given site.""" if site_name not in SITES: return ErrorResult(error=f"unknown site {site_name}") @@ -172,7 +277,7 @@ def sensors(site_name: str, asset_id: str) -> Union[SensorsResult, ErrorResult]: @mcp.tool(title="Get Sensor History") -def history( +def get_history( site_name: str, asset_id: str, start: str, final: Optional[str] = None ) -> Union[HistoryResult, ErrorResult]: """Returns a list of historical sensor values for the specified asset(s) at a site within a given time range (start to final).""" diff --git a/src/servers/iot/tests/test_tools.py b/src/servers/iot/tests/test_tools.py index 20b24b593..d22f48ef4 100644 --- a/src/servers/iot/tests/test_tools.py +++ b/src/servers/iot/tests/test_tools.py @@ -10,26 +10,26 @@ # --------------------------------------------------------------------------- -# sites +# get_sites # --------------------------------------------------------------------------- class TestSites: @pytest.mark.anyio async def test_returns_main(self): - data = await call_tool(mcp, "sites", {}) + data = await call_tool(mcp, "get_sites", {}) assert data["sites"] == ["MAIN"] # --------------------------------------------------------------------------- -# assets +# get_assets # --------------------------------------------------------------------------- class TestAssets: @pytest.mark.anyio async def test_invalid_site(self): - data = await call_tool(mcp, "assets", {"site_name": "INVALID"}) + data = await call_tool(mcp, "get_assets", {"site_name": "INVALID"}) assert "error" in data assert "unknown site" in data["error"] @@ -38,7 +38,7 @@ async def test_with_mock_db(self, mock_db): mock_db.find.return_value = { "docs": [{"asset_id": "Chiller 1"}, {"asset_id": "Chiller 2"}] } - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) assert data["total_assets"] == 2 assert "Chiller 1" in data["assets"] @@ -47,21 +47,21 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_db_disconnected(self, no_db): - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) # Should still return valid JSON (empty assets), not crash assert "assets" in data or "error" in data @requires_couchdb @pytest.mark.anyio async def test_discovery_integration(self): - data = await call_tool(mcp, "assets", {"site_name": "MAIN"}) + data = await call_tool(mcp, "get_assets", {"site_name": "MAIN"}) assert "assets" in data assert "Chiller 6" in data["assets"] assert data["total_assets"] > 0 # --------------------------------------------------------------------------- -# sensors +# get_sensors # --------------------------------------------------------------------------- @@ -69,14 +69,14 @@ class TestSensors: @pytest.mark.anyio async def test_invalid_site(self): data = await call_tool( - mcp, "sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} + mcp, "get_sensors", {"site_name": "INVALID", "asset_id": "Chiller 6"} ) assert "error" in data @pytest.mark.anyio async def test_unknown_asset(self): data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "INVALID"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "INVALID"} ) assert "error" in data assert "no sensors found" in data["error"] @@ -96,7 +96,7 @@ async def test_with_mock_db(self, mock_db): ] } data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 1"} ) assert data["total_sensors"] == 2 @@ -110,7 +110,7 @@ async def test_with_mock_db(self, mock_db): @pytest.mark.anyio async def test_success_integration(self): data = await call_tool( - mcp, "sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} + mcp, "get_sensors", {"site_name": "MAIN", "asset_id": "Chiller 6"} ) assert "sensors" in data assert len(data["sensors"]) > 0 @@ -118,7 +118,7 @@ async def test_success_integration(self): # --------------------------------------------------------------------------- -# history +# get_history # --------------------------------------------------------------------------- @@ -127,7 +127,7 @@ class TestHistory: async def test_invalid_date_range(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -142,7 +142,7 @@ async def test_invalid_date_range(self): async def test_malformed_date(self): data = await call_tool( mcp, - "history", + "get_history", {"site_name": "MAIN", "asset_id": "Chiller 6", "start": "not-a-date"}, ) assert "error" in data @@ -151,7 +151,7 @@ async def test_malformed_date(self): async def test_db_disconnected(self, no_db): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -171,7 +171,7 @@ async def test_with_mock_db(self, mock_db): } data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 1", @@ -188,7 +188,7 @@ async def test_with_mock_db(self, mock_db): async def test_open_ended_integration(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", @@ -203,7 +203,7 @@ async def test_open_ended_integration(self): async def test_bounded_range_integration(self): data = await call_tool( mcp, - "history", + "get_history", { "site_name": "MAIN", "asset_id": "Chiller 6", diff --git a/src/servers/vibration/couchdb_client.py b/src/servers/vibration/couchdb_client.py index 04aa4a4a0..6e513a54b 100644 --- a/src/servers/vibration/couchdb_client.py +++ b/src/servers/vibration/couchdb_client.py @@ -24,6 +24,16 @@ COUCHDB_USER = os.environ.get("COUCHDB_USERNAME") COUCHDB_PASSWORD = os.environ.get("COUCHDB_PASSWORD") +# Static site as per IoT benchmark; documents are not filtered by a per-document site field. +SITES = ["MAIN"] + +_ASSET_META_FIELDS = {"_id", "_rev", "asset_id", "timestamp", "site_name"} + + +def get_site_list() -> list[str]: + """Sites accepted for vibration (aligned with IoT ``SITES``).""" + return list(SITES) + def _get_db() -> Optional[couchdb3.Database]: """Lazy CouchDB connection with error handling.""" @@ -143,3 +153,95 @@ def list_sensor_fields(asset_id: str) -> list[str]: except Exception as e: logger.error(f"Error listing sensors for {asset_id}: {e}") return [] + +def get_asset_time_range(asset_id: str) -> dict: + """Return start/end timestamps and observation count for an asset. + + Uses the static ``SITES`` list (single-site benchmark); rows are not filtered by + a per-document site field. + """ + db = _get_db() + if not db: + return {"start": None, "end": None, "total_observations": 0} + try: + res = db.find( + {"asset_id": asset_id, "timestamp": {"$exists": True}}, + fields=["timestamp"], + limit=100000, + ) + timestamps = sorted( + doc["timestamp"] + for doc in res.get("docs", []) + if isinstance(doc, dict) + and doc.get("timestamp") + ) + if not timestamps: + return {"start": None, "end": None, "total_observations": 0} + return { + "start": timestamps[0], + "end": timestamps[-1], + "total_observations": len(timestamps), + } + except Exception as e: + logger.error(f"Error fetching vibration time range for {asset_id}: {e}") + return {"start": None, "end": None, "total_observations": 0} + + +def list_asset_coverage() -> list[dict]: + """Return vibration asset coverage, sensors, and time ranges. + + Uses ``SITES[0]`` as the site label (single static site); documents are not read + for a site field. + """ + db = _get_db() + if not db: + return [] + + effective_site = SITES[0] + + try: + res = db.find({"asset_id": {"$exists": True}}, limit=100000) + except Exception as e: + logger.error(f"Error fetching vibration asset coverage: {e}") + return [] + + grouped: dict[tuple[str, str], dict] = {} + for doc in res.get("docs", []): + if not isinstance(doc, dict): + continue + asset_id = str(doc.get("asset_id", "")).strip() + if not asset_id: + continue + + key = (effective_site, asset_id) + group = grouped.setdefault( + key, + { + "site_name": effective_site, + "asset_id": asset_id, + "sensors": set(), + "timestamps": [], + }, + ) + group["sensors"].update(k for k in doc.keys() if k not in _ASSET_META_FIELDS) + timestamp = doc.get("timestamp") + if isinstance(timestamp, str) and timestamp: + group["timestamps"].append(timestamp) + + coverage: list[dict] = [] + for (_site_name, asset_id), group in grouped.items(): + timestamps = sorted(group["timestamps"]) + coverage.append( + { + "site_name": group["site_name"], + "asset_id": asset_id, + "sensors": sorted(group["sensors"]), + "time_range": { + "start": timestamps[0] if timestamps else None, + "end": timestamps[-1] if timestamps else None, + "total_observations": len(timestamps), + }, + } + ) + + return sorted(coverage, key=lambda item: (item["site_name"].lower(), item["asset_id"].lower()))

dj4be`CcgZuSusq$IRXNjSPz~ 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%0Dmv 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