diff --git a/.env.example b/.env.example index 49824354..d1cb1c8d 100644 --- a/.env.example +++ b/.env.example @@ -4,7 +4,7 @@ GOOGLE_API_KEY="..." # Used by google-adk # Model selection (see https://ai.google.dev/gemini-api/docs/models) # Stable: gemini-2.5-pro, gemini-2.5-flash, gemini-2.5-flash-lite -# Preview: gemini-3-pro-preview, gemini-3-flash-preview +# Preview: gemini-3.1-pro-preview, gemini-3.1-flash-preview DEFAULT_PLANNER_MODEL="gemini-2.5-pro" DEFAULT_WORKER_MODEL="gemini-2.5-flash" DEFAULT_EVALUATOR_MODEL="gemini-2.5-pro" diff --git a/aieng-eval-agents/aieng/agent_evals/tools/sql_database.py b/aieng-eval-agents/aieng/agent_evals/tools/sql_database.py index d63f33ec..ef0496d9 100644 --- a/aieng-eval-agents/aieng/agent_evals/tools/sql_database.py +++ b/aieng-eval-agents/aieng/agent_evals/tools/sql_database.py @@ -166,9 +166,9 @@ def _is_safe_readonly_query(self, query: str) -> bool: return is_safe except Exception as e: - logger.error("SQL Parsing Error: %s", e) + logger.exception("SQL Parsing Error: %s", e) # If we can't parse it, we don't run it. - return False + raise e def get_schema_info(self, table_names: Optional[list[str]] = None) -> str: """Return schema for specific tables/views or all if None. @@ -296,6 +296,7 @@ def execute(self, query: str) -> str: return "\n".join(output) except Exception as e: + logger.exception("Error executing query: %s", e) error_msg = str(e) return f"Query Error: {error_msg}" diff --git a/aieng-eval-agents/tests/aieng/agent_evals/tools/test_sql_database.py b/aieng-eval-agents/tests/aieng/agent_evals/tools/test_sql_database.py index 5ef21ce0..92ceca49 100644 --- a/aieng-eval-agents/tests/aieng/agent_evals/tools/test_sql_database.py +++ b/aieng-eval-agents/tests/aieng/agent_evals/tools/test_sql_database.py @@ -3,6 +3,7 @@ from __future__ import annotations import pytest +import sqlglot from aieng.agent_evals.tools import ReadOnlySqlDatabase, ReadOnlySqlPolicy, sql_database from sqlalchemy import create_engine @@ -154,13 +155,11 @@ def test_is_safe_readonly_query_blocks_forbidden_nodes_even_if_root_is_allowed(s assert db._is_safe_readonly_query("DELETE FROM customers") is False -def test_is_safe_readonly_query_returns_false_on_parse_errors( - sqlite_db_uri: str, monkeypatch: pytest.MonkeyPatch -) -> None: - """Return False (fail closed) if parsing raises.""" - db = ReadOnlySqlDatabase(connection_uri=sqlite_db_uri) - monkeypatch.setattr("aieng.agent_evals.tools.sql_database.sqlglot.parse", lambda _query: 1 / 0) - assert db._is_safe_readonly_query("SELECT 1") is False +def test_is_safe_readonly_query_returns_exception_on_parse_errors(sqlite_db_uri: str) -> None: + """Return exception if parsing raises an exception.""" + with pytest.raises(sqlglot.errors.ParseError): + db = ReadOnlySqlDatabase(connection_uri=sqlite_db_uri) + assert db._is_safe_readonly_query("SERECT 1") is False def test_get_schema_info_includes_tables_and_views(default_db: ReadOnlySqlDatabase) -> None: