from arcade.sdk import ToolCatalog from arcade.sdk.eval import ( EvalRubric, EvalSuite, ExpectedToolCall, tool_eval, ) from arcade.sdk.eval.critic import BinaryCritic import arcade_confluence from arcade_confluence.tools import ( search_content, ) from evals.critics import ListCritic # Evaluation rubric rubric = EvalRubric( fail_threshold=0.85, warn_threshold=0.95, ) catalog = ToolCatalog() catalog.add_module(arcade_confluence) @tool_eval() def confluence_search_eval_suite() -> EvalSuite: suite = EvalSuite( name="Confluence search content tool evaluation", system_message="You are an AI assistant with access to Confluence tools.", catalog=catalog, rubric=rubric, ) suite.add_case( name="Search for content - easy case", user_message="Find all pages that contain 'Arcade.dev'", expected_tool_calls=[ ExpectedToolCall(func=search_content, args={"can_contain_any": ["Arcade.dev"]}) ], rubric=rubric, critics=[ BinaryCritic(critic_field="can_contain_any", weight=1), ], ) suite.add_case( name="Search for content - medium case", user_message=("Find 20 pages that contain 'Arcade' or 'AI', or 'tool calls'"), expected_tool_calls=[ ExpectedToolCall( func=search_content, args={ "can_contain_any": ["Arcade", "AI", "tool calls"], "limit": 20, }, ) ], rubric=rubric, critics=[ ListCritic( critic_field="can_contain_any", weight=0.9, case_sensitive=False, order_matters=False, ), BinaryCritic(critic_field="limit", weight=0.1), ], ) suite.add_case( name="Search for content - hard case", user_message=( "Look for 25 databases that have 'How to', " "and also have 'carborator' in the content and " "also has one of the following: 'money', 'redbull gives you wings', " "'honey hole', 'don't snap the pasta!'." ), expected_tool_calls=[ ExpectedToolCall( func=search_content, args={ "must_contain_all": ["carborator", "How to"], "can_contain_any": [ "money", "redbull gives you wings", "honey hole", "don't snap the pasta!", ], }, ), ], rubric=rubric, critics=[ ListCritic( critic_field="must_contain_all", weight=0.5, case_sensitive=False, order_matters=False, ), ListCritic( critic_field="can_contain_any", weight=0.5, case_sensitive=False, order_matters=False, ), ], ) return suite