Skip to content

Commit 8b5fa12

Browse files
authored
chore: release 2.5.13 (agno-agi#7258)
## Improvements: - **ReliabilityEval**: Add subset matching, argument validation, and missing tool call tracking with multi-round tool call collection fixes. - **AgentOS**: Enhance /sessions list API to return additional fields (user_id, agent_id, team_id, workflow_id, session_summary, metrics, total_tokens, metadata). - **AgentOS**: Add /info API endpoint to return agent, team, and workflow count as lightweight, unauthenticated instance metadata. - **ChromaDB**: Implement dynamic batch splitting for large upsert/query operations. - **Reader**: Propagate chunk_size to default chunking strategies in reader classes. - **Slack** **Interface**: Add show_member_tool_calls param and automatic card overflow rotation — rotates to a new message when text exceeds a threshold ## Bug Fixes: - **VertexAI/Bedrock Claude**: Support `messages` parameter in `_prepare_request_kwargs` for Claude sub classes - **Workflows**: Fix continue_run to correctly pause at Condition, Loop, and Router HITL steps — previously only Step instances were checked. - **AgentOS**: Exclude interface routes (Slack, Telegram, WhatsApp, A2A) from JWT middleware so webhook deliveries are not rejected with 401. - **Tracing**: Fix trace session stats grouping to use session_id only, preventing duplicate rows when a session has runs from different users. - **SurrealDB**: Fix trace session stats to use array::first() instead of math::max() for string fields. - **ReliabilityEval**: Fix multi-round tool call extraction so all rounds are collected; fix mutation bug modifying original RunOutput.messages; fix arun() using wrong ID for file save.
1 parent f5bf625 commit 8b5fa12

4 files changed

Lines changed: 16 additions & 605 deletions

File tree

libs/agno/tests/integration/agent/human_in_the_loop/test_multi_round_user_input.py

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def ask_question(question: str, answer: str = ""):
3232
)
3333

3434
session_id = "test_multi_round_decorator"
35+
answers = ["John", "25", "NYC"]
3536

3637
# Round 1
3738
response = agent.run("Start the survey", session_id=session_id)
@@ -40,44 +41,24 @@ def ask_question(question: str, answer: str = ""):
4041
assert len(response.active_requirements) == 1, "Should have 1 active requirement"
4142
assert response.active_requirements[0].needs_user_input
4243

43-
# Fill in first answer
44-
response.active_requirements[0].user_input_schema[0].value = "John" # type: ignore
45-
46-
# Round 2
47-
response = agent.continue_run(
48-
run_id=response.run_id,
49-
requirements=response.requirements,
50-
session_id=session_id,
51-
)
52-
53-
if response.is_paused:
54-
# Verify we have a NEW active requirement
55-
assert len(response.active_requirements) >= 1, "Should have at least 1 active requirement for the new question"
56-
assert response.active_requirements[0].needs_user_input
44+
round_num = 0
45+
max_rounds = 6 # Safety limit
5746

58-
# Fill in second answer
59-
response.active_requirements[0].user_input_schema[0].value = "25" # type: ignore
47+
while response.is_paused and round_num < max_rounds:
48+
# Fill in the answer for the active requirement
49+
answer = answers[min(round_num, len(answers) - 1)]
50+
response.active_requirements[0].user_input_schema[0].value = answer # type: ignore
6051

61-
# Round 3
6252
response = agent.continue_run(
6353
run_id=response.run_id,
6454
requirements=response.requirements,
6555
session_id=session_id,
6656
)
67-
68-
if response.is_paused:
69-
assert len(response.active_requirements) >= 1
70-
response.active_requirements[0].user_input_schema[0].value = "NYC" # type: ignore
71-
72-
# Final round
73-
response = agent.continue_run(
74-
run_id=response.run_id,
75-
requirements=response.requirements,
76-
session_id=session_id,
77-
)
57+
round_num += 1
7858

7959
# Final response should not be paused
8060
assert not response.is_paused, "Final response should not be paused"
61+
assert round_num <= max_rounds, f"Test didn't complete within {max_rounds} rounds"
8162

8263

8364
def test_multi_round_user_control_flow_tools(shared_db):

libs/agno/tests/integration/agent/test_tool_hooks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def test_confirmation_hook_allows_mul_tool():
9494

9595

9696
def test_logger_hook_invocation_add_tool():
97-
agent = Agent(tools=[add], tool_hooks=[logger_hook])
97+
agent = Agent(tools=[add], tool_hooks=[logger_hook], instructions="Always use the add tool to compute sums.")
9898

9999
with patch.object(type(logger), "info", wraps=logger.info) as mock_info:
100100
response: RunOutput = agent.run("Compute 4 + 5")

libs/agno/tests/integration/teams/test_event_streaming.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ def test_intermediate_steps_with_member_agents():
833833
RunEvent.reasoning_started,
834834
RunEvent.reasoning_step,
835835
RunEvent.reasoning_completed,
836-
RunEvent.run_content,
836+
TeamRunEvent.run_intermediate_content,
837837
RunEvent.run_content_completed,
838838
RunEvent.run_completed,
839839
TeamRunEvent.tool_call_completed,
@@ -870,7 +870,7 @@ def test_intermediate_steps_with_member_agents():
870870
assert len(events[RunEvent.reasoning_started]) == 1
871871
assert len(events[RunEvent.reasoning_completed]) == 1
872872
assert len(events[RunEvent.reasoning_step]) > 1
873-
assert len(events[RunEvent.run_content]) > 1
873+
assert len(events[TeamRunEvent.run_intermediate_content]) > 1
874874
assert len(events[RunEvent.run_content_completed]) >= 1
875875

876876

@@ -906,7 +906,7 @@ def test_intermediate_steps_with_member_agents_only_member_events():
906906
RunEvent.model_request_completed,
907907
RunEvent.tool_call_started,
908908
RunEvent.tool_call_completed,
909-
RunEvent.run_content,
909+
TeamRunEvent.run_intermediate_content,
910910
RunEvent.run_content_completed,
911911
RunEvent.run_completed,
912912
TeamRunEvent.run_content,
@@ -929,7 +929,7 @@ def test_intermediate_steps_with_member_agents_only_member_events():
929929
# Lots of member tool calls
930930
assert len(events[RunEvent.tool_call_started]) == 1
931931
assert len(events[RunEvent.tool_call_completed]) == 1
932-
assert len(events[RunEvent.run_content]) > 1
932+
assert len(events[TeamRunEvent.run_intermediate_content]) > 1
933933
assert len(events[RunEvent.run_content_completed]) == 1
934934

935935

@@ -972,7 +972,7 @@ def test_intermediate_steps_with_member_agents_nested_team():
972972
RunEvent.run_started.value,
973973
RunEvent.model_request_started.value,
974974
RunEvent.model_request_completed.value,
975-
RunEvent.run_content.value,
975+
TeamRunEvent.run_intermediate_content.value,
976976
RunEvent.run_content_completed.value,
977977
RunEvent.run_completed.value,
978978
TeamRunEvent.run_content.value,
@@ -1114,7 +1114,7 @@ def get_news_from_duckduckgo(query: str):
11141114
# Assert expected events from members
11151115
assert len(events[RunEvent.run_started]) == 2
11161116
assert len(events[RunEvent.run_completed]) == 2
1117-
assert len(events[RunEvent.run_content]) > 1
1117+
assert len(events[TeamRunEvent.run_intermediate_content]) > 1
11181118

11191119

11201120
def test_tool_parent_run_id():

0 commit comments

Comments
 (0)