From 146bf415d4d551b3f210fd482ab25f09cedc951b Mon Sep 17 00:00:00 2001 From: aaravbaphna Date: Sun, 17 May 2026 00:37:14 -0700 Subject: [PATCH] Validate output filter references --- cli/planoai/config_generator.py | 16 ++++++++-------- cli/test/test_config_generator.py | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/cli/planoai/config_generator.py b/cli/planoai/config_generator.py index cb07767e..c46b8917 100644 --- a/cli/planoai/config_generator.py +++ b/cli/planoai/config_generator.py @@ -562,15 +562,15 @@ def validate_and_render_schema(): "Please provide model_providers either under listeners or at root level, not both. Currently we don't support multiple listeners with model_providers" ) - # Validate input_filters IDs on listeners reference valid agent/filter IDs + # Validate listener-level filter IDs reference valid agent/filter IDs. for listener in listeners: - listener_input_filters = listener.get("input_filters", []) - for fc_id in listener_input_filters: - if fc_id not in agent_id_keys: - raise Exception( - f"Listener '{listener.get('name', 'unknown')}' references input_filters id '{fc_id}' " - f"which is not defined in agents or filters. Available ids: {', '.join(sorted(agent_id_keys))}" - ) + for filter_field in ("input_filters", "output_filters"): + for fc_id in listener.get(filter_field, []): + if fc_id not in agent_id_keys: + raise Exception( + f"Listener '{listener.get('name', 'unknown')}' references {filter_field} id '{fc_id}' " + f"which is not defined in agents or filters. Available ids: {', '.join(sorted(agent_id_keys))}" + ) # Validate model aliases if present if "model_aliases" in config_yaml: diff --git a/cli/test/test_config_generator.py b/cli/test/test_config_generator.py index 77b5b480..0b2add4c 100644 --- a/cli/test/test_config_generator.py +++ b/cli/test/test_config_generator.py @@ -327,6 +327,33 @@ routing_preferences: tracing: random_sampling: 100 +""", + }, + { + "id": "unknown_listener_output_filter", + "expected_error": "references output_filters id 'missing_output_guard'", + "plano_config": """ +version: v0.4.0 + +filters: + - id: input_guard + url: http://localhost:10500 + type: http + +listeners: + - name: llm + type: model + port: 12000 + input_filters: + - input_guard + output_filters: + - missing_output_guard + +model_providers: + - model: openai/gpt-4o-mini + access_key: $OPENAI_API_KEY + default: true + """, }, ]