agno 2.0.1__py3-none-any.whl → 2.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/agent/agent.py +6015 -2823
- agno/api/api.py +2 -0
- agno/api/os.py +1 -1
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +385 -6
- agno/db/dynamo/dynamo.py +388 -81
- agno/db/dynamo/schemas.py +47 -10
- agno/db/dynamo/utils.py +63 -4
- agno/db/firestore/firestore.py +435 -64
- agno/db/firestore/schemas.py +11 -0
- agno/db/firestore/utils.py +102 -4
- agno/db/gcs_json/gcs_json_db.py +384 -42
- agno/db/gcs_json/utils.py +60 -26
- agno/db/in_memory/in_memory_db.py +351 -66
- agno/db/in_memory/utils.py +60 -2
- agno/db/json/json_db.py +339 -48
- agno/db/json/utils.py +60 -26
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +510 -37
- agno/db/migrations/versions/__init__.py +0 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +15 -1
- agno/db/mongo/async_mongo.py +2036 -0
- agno/db/mongo/mongo.py +653 -76
- agno/db/mongo/schemas.py +13 -0
- agno/db/mongo/utils.py +80 -8
- agno/db/mysql/mysql.py +687 -25
- agno/db/mysql/schemas.py +61 -37
- agno/db/mysql/utils.py +60 -2
- agno/db/postgres/__init__.py +2 -1
- agno/db/postgres/async_postgres.py +2001 -0
- agno/db/postgres/postgres.py +676 -57
- agno/db/postgres/schemas.py +43 -18
- agno/db/postgres/utils.py +164 -2
- agno/db/redis/redis.py +344 -38
- agno/db/redis/schemas.py +18 -0
- agno/db/redis/utils.py +60 -2
- agno/db/schemas/__init__.py +2 -1
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/memory.py +13 -0
- agno/db/singlestore/schemas.py +26 -1
- agno/db/singlestore/singlestore.py +687 -53
- agno/db/singlestore/utils.py +60 -2
- agno/db/sqlite/__init__.py +2 -1
- agno/db/sqlite/async_sqlite.py +2371 -0
- agno/db/sqlite/schemas.py +24 -0
- agno/db/sqlite/sqlite.py +774 -85
- agno/db/sqlite/utils.py +168 -5
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1361 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +50 -22
- agno/eval/accuracy.py +50 -43
- agno/eval/performance.py +6 -3
- agno/eval/reliability.py +6 -3
- agno/eval/utils.py +33 -16
- agno/exceptions.py +68 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/discord/client.py +1 -0
- agno/knowledge/chunking/agentic.py +13 -10
- agno/knowledge/chunking/fixed.py +1 -1
- agno/knowledge/chunking/semantic.py +40 -8
- agno/knowledge/chunking/strategy.py +59 -15
- agno/knowledge/embedder/aws_bedrock.py +9 -4
- agno/knowledge/embedder/azure_openai.py +54 -0
- agno/knowledge/embedder/base.py +2 -0
- agno/knowledge/embedder/cohere.py +184 -5
- agno/knowledge/embedder/fastembed.py +1 -1
- agno/knowledge/embedder/google.py +79 -1
- agno/knowledge/embedder/huggingface.py +9 -4
- agno/knowledge/embedder/jina.py +63 -0
- agno/knowledge/embedder/mistral.py +78 -11
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/ollama.py +13 -0
- agno/knowledge/embedder/openai.py +37 -65
- agno/knowledge/embedder/sentence_transformer.py +8 -4
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +69 -16
- agno/knowledge/knowledge.py +594 -186
- agno/knowledge/reader/base.py +9 -2
- agno/knowledge/reader/csv_reader.py +8 -10
- agno/knowledge/reader/docx_reader.py +5 -6
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/json_reader.py +6 -5
- agno/knowledge/reader/markdown_reader.py +13 -13
- agno/knowledge/reader/pdf_reader.py +43 -68
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +51 -6
- agno/knowledge/reader/s3_reader.py +3 -15
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +13 -13
- agno/knowledge/reader/web_search_reader.py +2 -43
- agno/knowledge/reader/website_reader.py +43 -25
- agno/knowledge/reranker/__init__.py +2 -8
- agno/knowledge/types.py +9 -0
- agno/knowledge/utils.py +20 -0
- agno/media.py +72 -0
- agno/memory/manager.py +336 -82
- agno/models/aimlapi/aimlapi.py +2 -2
- agno/models/anthropic/claude.py +183 -37
- agno/models/aws/bedrock.py +52 -112
- agno/models/aws/claude.py +33 -1
- agno/models/azure/ai_foundry.py +33 -15
- agno/models/azure/openai_chat.py +25 -8
- agno/models/base.py +999 -519
- agno/models/cerebras/cerebras.py +19 -13
- agno/models/cerebras/cerebras_openai.py +8 -5
- agno/models/cohere/chat.py +27 -1
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/dashscope.py +1 -0
- agno/models/deepinfra/deepinfra.py +2 -2
- agno/models/deepseek/deepseek.py +2 -2
- agno/models/fireworks/fireworks.py +2 -2
- agno/models/google/gemini.py +103 -31
- agno/models/groq/groq.py +28 -11
- agno/models/huggingface/huggingface.py +2 -1
- agno/models/internlm/internlm.py +2 -2
- agno/models/langdb/langdb.py +4 -4
- agno/models/litellm/chat.py +18 -1
- agno/models/litellm/litellm_openai.py +2 -2
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/message.py +139 -0
- agno/models/meta/llama.py +27 -10
- agno/models/meta/llama_openai.py +5 -17
- agno/models/nebius/nebius.py +6 -6
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/nvidia.py +2 -2
- agno/models/ollama/chat.py +59 -5
- agno/models/openai/chat.py +69 -29
- agno/models/openai/responses.py +103 -106
- agno/models/openrouter/openrouter.py +41 -3
- agno/models/perplexity/perplexity.py +4 -5
- agno/models/portkey/portkey.py +3 -3
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +77 -1
- agno/models/sambanova/sambanova.py +2 -2
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/together.py +2 -2
- agno/models/utils.py +254 -8
- agno/models/vercel/v0.py +2 -2
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +96 -0
- agno/models/vllm/vllm.py +1 -0
- agno/models/xai/xai.py +3 -2
- agno/os/app.py +543 -178
- agno/os/auth.py +24 -14
- agno/os/config.py +1 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/agui.py +23 -7
- agno/os/interfaces/agui/router.py +27 -3
- agno/os/interfaces/agui/utils.py +242 -142
- agno/os/interfaces/base.py +6 -2
- agno/os/interfaces/slack/router.py +81 -23
- agno/os/interfaces/slack/slack.py +29 -14
- agno/os/interfaces/whatsapp/router.py +11 -4
- agno/os/interfaces/whatsapp/whatsapp.py +14 -7
- agno/os/mcp.py +111 -54
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +556 -139
- agno/os/routers/evals/evals.py +71 -34
- agno/os/routers/evals/schemas.py +31 -31
- agno/os/routers/evals/utils.py +6 -5
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/knowledge.py +185 -38
- agno/os/routers/knowledge/schemas.py +82 -22
- agno/os/routers/memory/memory.py +158 -53
- agno/os/routers/memory/schemas.py +20 -16
- agno/os/routers/metrics/metrics.py +20 -8
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +499 -38
- agno/os/schema.py +308 -198
- agno/os/utils.py +401 -41
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +2 -2
- agno/reasoning/deepseek.py +2 -2
- agno/reasoning/default.py +3 -1
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +2 -2
- agno/reasoning/ollama.py +2 -2
- agno/reasoning/openai.py +7 -2
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +248 -94
- agno/run/base.py +44 -5
- agno/run/team.py +238 -97
- agno/run/workflow.py +144 -33
- agno/session/agent.py +105 -89
- agno/session/summary.py +65 -25
- agno/session/team.py +176 -96
- agno/session/workflow.py +406 -40
- agno/team/team.py +3854 -1610
- agno/tools/dalle.py +2 -4
- agno/tools/decorator.py +4 -2
- agno/tools/duckduckgo.py +15 -11
- agno/tools/e2b.py +14 -7
- agno/tools/eleven_labs.py +23 -25
- agno/tools/exa.py +21 -16
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +350 -0
- agno/tools/firecrawl.py +4 -4
- agno/tools/function.py +250 -30
- agno/tools/gmail.py +238 -14
- agno/tools/google_drive.py +270 -0
- agno/tools/googlecalendar.py +36 -8
- agno/tools/googlesheets.py +20 -5
- agno/tools/jira.py +20 -0
- agno/tools/knowledge.py +3 -3
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +11 -17
- agno/tools/memori.py +1 -53
- agno/tools/memory.py +419 -0
- agno/tools/models/nebius.py +5 -5
- agno/tools/models_labs.py +20 -10
- agno/tools/notion.py +204 -0
- agno/tools/parallel.py +314 -0
- agno/tools/scrapegraph.py +58 -31
- agno/tools/searxng.py +2 -2
- agno/tools/serper.py +2 -2
- agno/tools/slack.py +18 -3
- agno/tools/spider.py +2 -2
- agno/tools/tavily.py +146 -0
- agno/tools/whatsapp.py +1 -1
- agno/tools/workflow.py +278 -0
- agno/tools/yfinance.py +12 -11
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +27 -0
- agno/utils/common.py +90 -1
- agno/utils/events.py +217 -2
- agno/utils/gemini.py +180 -22
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +111 -0
- agno/utils/knowledge.py +12 -5
- agno/utils/log.py +1 -0
- agno/utils/mcp.py +92 -2
- agno/utils/media.py +188 -10
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +60 -0
- agno/utils/models/claude.py +40 -11
- agno/utils/print_response/agent.py +105 -21
- agno/utils/print_response/team.py +103 -38
- agno/utils/print_response/workflow.py +251 -34
- agno/utils/reasoning.py +22 -1
- agno/utils/serialize.py +32 -0
- agno/utils/streamlit.py +16 -10
- agno/utils/string.py +41 -0
- agno/utils/team.py +98 -9
- agno/utils/tools.py +1 -1
- agno/vectordb/base.py +23 -4
- agno/vectordb/cassandra/cassandra.py +65 -9
- agno/vectordb/chroma/chromadb.py +182 -38
- agno/vectordb/clickhouse/clickhousedb.py +64 -11
- agno/vectordb/couchbase/couchbase.py +105 -10
- agno/vectordb/lancedb/lance_db.py +124 -133
- agno/vectordb/langchaindb/langchaindb.py +25 -7
- agno/vectordb/lightrag/lightrag.py +17 -3
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +46 -7
- agno/vectordb/milvus/milvus.py +126 -9
- agno/vectordb/mongodb/__init__.py +7 -1
- agno/vectordb/mongodb/mongodb.py +112 -7
- agno/vectordb/pgvector/pgvector.py +142 -21
- agno/vectordb/pineconedb/pineconedb.py +80 -8
- agno/vectordb/qdrant/qdrant.py +125 -39
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/singlestore/singlestore.py +111 -25
- agno/vectordb/surrealdb/surrealdb.py +31 -5
- agno/vectordb/upstashdb/upstashdb.py +76 -8
- agno/vectordb/weaviate/weaviate.py +86 -15
- agno/workflow/__init__.py +2 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +112 -18
- agno/workflow/loop.py +69 -10
- agno/workflow/parallel.py +266 -118
- agno/workflow/router.py +110 -17
- agno/workflow/step.py +638 -129
- agno/workflow/steps.py +65 -6
- agno/workflow/types.py +61 -23
- agno/workflow/workflow.py +2085 -272
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/METADATA +182 -58
- agno-2.3.0.dist-info/RECORD +577 -0
- agno/knowledge/reader/url_reader.py +0 -128
- agno/tools/googlesearch.py +0 -98
- agno/tools/mcp.py +0 -610
- agno/utils/models/aws_claude.py +0 -170
- agno-2.0.1.dist-info/RECORD +0 -515
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/WHEEL +0 -0
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/licenses/LICENSE +0 -0
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/top_level.txt +0 -0
|
@@ -2,6 +2,7 @@ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Set, Unio
|
|
|
2
2
|
|
|
3
3
|
from pydantic import BaseModel
|
|
4
4
|
|
|
5
|
+
from agno.filters import FilterExpr
|
|
5
6
|
from agno.media import Audio, File, Image, Video
|
|
6
7
|
from agno.models.message import Message
|
|
7
8
|
from agno.models.response import ToolExecution
|
|
@@ -24,6 +25,7 @@ def print_response(
|
|
|
24
25
|
show_message: bool = True,
|
|
25
26
|
show_reasoning: bool = True,
|
|
26
27
|
show_full_reasoning: bool = False,
|
|
28
|
+
show_member_responses: Optional[bool] = None,
|
|
27
29
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
28
30
|
session_id: Optional[str] = None,
|
|
29
31
|
session_state: Optional[Dict[str, Any]] = None,
|
|
@@ -33,9 +35,11 @@ def print_response(
|
|
|
33
35
|
videos: Optional[Sequence[Video]] = None,
|
|
34
36
|
files: Optional[Sequence[File]] = None,
|
|
35
37
|
markdown: bool = False,
|
|
36
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
38
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
37
39
|
add_history_to_context: Optional[bool] = None,
|
|
38
40
|
dependencies: Optional[Dict[str, Any]] = None,
|
|
41
|
+
add_dependencies_to_context: Optional[bool] = None,
|
|
42
|
+
add_session_state_to_context: Optional[bool] = None,
|
|
39
43
|
metadata: Optional[Dict[str, Any]] = None,
|
|
40
44
|
debug_mode: Optional[bool] = None,
|
|
41
45
|
**kwargs: Any,
|
|
@@ -82,18 +86,35 @@ def print_response(
|
|
|
82
86
|
videos=videos,
|
|
83
87
|
files=files,
|
|
84
88
|
stream=False,
|
|
89
|
+
stream_events=True,
|
|
85
90
|
session_id=session_id,
|
|
86
91
|
session_state=session_state,
|
|
87
92
|
user_id=user_id,
|
|
88
93
|
knowledge_filters=knowledge_filters,
|
|
89
94
|
add_history_to_context=add_history_to_context,
|
|
90
95
|
dependencies=dependencies,
|
|
96
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
97
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
91
98
|
metadata=metadata,
|
|
92
99
|
debug_mode=debug_mode,
|
|
93
100
|
**kwargs,
|
|
94
101
|
)
|
|
95
102
|
response_timer.stop()
|
|
96
103
|
|
|
104
|
+
if run_response.input is not None and run_response.input.input_content != input:
|
|
105
|
+
# Input was modified during the run
|
|
106
|
+
panels = [status]
|
|
107
|
+
if show_message:
|
|
108
|
+
# Convert message to a panel
|
|
109
|
+
message_content = get_text_from_message(run_response.input.input_content)
|
|
110
|
+
message_panel = create_panel(
|
|
111
|
+
content=Text(message_content, style="green"),
|
|
112
|
+
title="Message",
|
|
113
|
+
border_style="cyan",
|
|
114
|
+
)
|
|
115
|
+
panels.append(message_panel) # type: ignore
|
|
116
|
+
live_console.update(Group(*panels))
|
|
117
|
+
|
|
97
118
|
team_markdown = False
|
|
98
119
|
member_markdown = {}
|
|
99
120
|
if markdown:
|
|
@@ -121,7 +142,7 @@ def print_response(
|
|
|
121
142
|
panels.append(reasoning_panel)
|
|
122
143
|
live_console.update(Group(*panels))
|
|
123
144
|
|
|
124
|
-
if isinstance(run_response, TeamRunOutput) and run_response.reasoning_content is not None:
|
|
145
|
+
if isinstance(run_response, TeamRunOutput) and run_response.reasoning_content is not None and show_reasoning:
|
|
125
146
|
# Create panel for thinking
|
|
126
147
|
thinking_panel = create_panel(
|
|
127
148
|
content=Text(run_response.reasoning_content),
|
|
@@ -133,7 +154,7 @@ def print_response(
|
|
|
133
154
|
|
|
134
155
|
if isinstance(run_response, TeamRunOutput):
|
|
135
156
|
# Handle member responses
|
|
136
|
-
if
|
|
157
|
+
if show_member_responses:
|
|
137
158
|
for member_response in run_response.member_responses:
|
|
138
159
|
# Handle member reasoning
|
|
139
160
|
reasoning_steps = []
|
|
@@ -304,6 +325,7 @@ def print_response_stream(
|
|
|
304
325
|
show_message: bool = True,
|
|
305
326
|
show_reasoning: bool = True,
|
|
306
327
|
show_full_reasoning: bool = False,
|
|
328
|
+
show_member_responses: Optional[bool] = None,
|
|
307
329
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
308
330
|
session_id: Optional[str] = None,
|
|
309
331
|
session_state: Optional[Dict[str, Any]] = None,
|
|
@@ -313,10 +335,13 @@ def print_response_stream(
|
|
|
313
335
|
videos: Optional[Sequence[Video]] = None,
|
|
314
336
|
files: Optional[Sequence[File]] = None,
|
|
315
337
|
markdown: bool = False,
|
|
338
|
+
stream_events: bool = False,
|
|
316
339
|
stream_intermediate_steps: bool = False, # type: ignore
|
|
317
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
340
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
318
341
|
add_history_to_context: Optional[bool] = None,
|
|
319
342
|
dependencies: Optional[Dict[str, Any]] = None,
|
|
343
|
+
add_dependencies_to_context: Optional[bool] = None,
|
|
344
|
+
add_session_state_to_context: Optional[bool] = None,
|
|
320
345
|
metadata: Optional[Dict[str, Any]] = None,
|
|
321
346
|
debug_mode: Optional[bool] = None,
|
|
322
347
|
**kwargs: Any,
|
|
@@ -335,7 +360,7 @@ def print_response_stream(
|
|
|
335
360
|
if not tags_to_include_in_markdown:
|
|
336
361
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
337
362
|
|
|
338
|
-
|
|
363
|
+
stream_events = True # With streaming print response, we need to stream intermediate steps
|
|
339
364
|
|
|
340
365
|
_response_content: str = ""
|
|
341
366
|
_response_reasoning_content: str = ""
|
|
@@ -379,19 +404,23 @@ def print_response_stream(
|
|
|
379
404
|
videos=videos,
|
|
380
405
|
files=files,
|
|
381
406
|
stream=True,
|
|
382
|
-
|
|
407
|
+
stream_events=stream_events,
|
|
383
408
|
session_id=session_id,
|
|
384
409
|
session_state=session_state,
|
|
385
410
|
user_id=user_id,
|
|
386
411
|
knowledge_filters=knowledge_filters,
|
|
387
412
|
add_history_to_context=add_history_to_context,
|
|
388
413
|
dependencies=dependencies,
|
|
414
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
415
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
389
416
|
metadata=metadata,
|
|
390
417
|
debug_mode=debug_mode,
|
|
391
|
-
|
|
418
|
+
yield_run_output=True,
|
|
392
419
|
**kwargs,
|
|
393
420
|
)
|
|
394
421
|
|
|
422
|
+
input_content = get_text_from_message(input)
|
|
423
|
+
|
|
395
424
|
team_markdown = None
|
|
396
425
|
member_markdown = {}
|
|
397
426
|
|
|
@@ -427,6 +456,10 @@ def print_response_stream(
|
|
|
427
456
|
if hasattr(resp, "reasoning_steps") and resp.reasoning_steps is not None: # type: ignore
|
|
428
457
|
reasoning_steps = resp.reasoning_steps # type: ignore
|
|
429
458
|
|
|
459
|
+
if resp.event == TeamRunEvent.pre_hook_completed: # type: ignore
|
|
460
|
+
if resp.run_input is not None: # type: ignore
|
|
461
|
+
input_content = get_text_from_message(resp.run_input.input_content) # type: ignore
|
|
462
|
+
|
|
430
463
|
# Collect team tool calls, avoiding duplicates
|
|
431
464
|
if resp.event == TeamRunEvent.tool_call_completed and resp.tool: # type: ignore
|
|
432
465
|
tool = resp.tool # type: ignore
|
|
@@ -440,7 +473,7 @@ def print_response_stream(
|
|
|
440
473
|
team_tool_calls.append(tool)
|
|
441
474
|
|
|
442
475
|
# Collect member tool calls, avoiding duplicates
|
|
443
|
-
if hasattr(resp, "member_responses") and resp.member_responses:
|
|
476
|
+
if show_member_responses and hasattr(resp, "member_responses") and resp.member_responses:
|
|
444
477
|
for member_response in resp.member_responses:
|
|
445
478
|
member_id = None
|
|
446
479
|
if isinstance(member_response, RunOutput) and member_response.agent_id is not None:
|
|
@@ -471,12 +504,11 @@ def print_response_stream(
|
|
|
471
504
|
# Create new panels for each chunk
|
|
472
505
|
panels = []
|
|
473
506
|
|
|
474
|
-
if
|
|
507
|
+
if input_content and show_message:
|
|
475
508
|
render = True
|
|
476
509
|
# Convert message to a panel
|
|
477
|
-
message_content = get_text_from_message(input)
|
|
478
510
|
message_panel = create_panel(
|
|
479
|
-
content=Text(
|
|
511
|
+
content=Text(input_content, style="green"),
|
|
480
512
|
title="Message",
|
|
481
513
|
border_style="cyan",
|
|
482
514
|
)
|
|
@@ -489,7 +521,7 @@ def print_response_stream(
|
|
|
489
521
|
reasoning_panel = build_reasoning_step_panel(i, step, show_full_reasoning)
|
|
490
522
|
panels.append(reasoning_panel)
|
|
491
523
|
|
|
492
|
-
if len(_response_reasoning_content) > 0:
|
|
524
|
+
if len(_response_reasoning_content) > 0 and show_reasoning:
|
|
493
525
|
render = True
|
|
494
526
|
# Create panel for thinking
|
|
495
527
|
thinking_panel = create_panel(
|
|
@@ -503,7 +535,9 @@ def print_response_stream(
|
|
|
503
535
|
panels.append(status)
|
|
504
536
|
|
|
505
537
|
# Process member responses and their tool calls
|
|
506
|
-
for member_response in
|
|
538
|
+
for member_response in (
|
|
539
|
+
resp.member_responses if show_member_responses and hasattr(resp, "member_responses") else []
|
|
540
|
+
):
|
|
507
541
|
member_id = None
|
|
508
542
|
member_name = "Team Member"
|
|
509
543
|
if isinstance(member_response, RunOutput) and member_response.agent_id is not None:
|
|
@@ -536,7 +570,7 @@ def print_response_stream(
|
|
|
536
570
|
panels.append(member_tool_calls_panel)
|
|
537
571
|
|
|
538
572
|
# Process member response content
|
|
539
|
-
if
|
|
573
|
+
if show_member_responses and member_id is not None:
|
|
540
574
|
show_markdown = False
|
|
541
575
|
if markdown:
|
|
542
576
|
show_markdown = True
|
|
@@ -655,10 +689,9 @@ def print_response_stream(
|
|
|
655
689
|
final_panels = []
|
|
656
690
|
|
|
657
691
|
# Start with the message
|
|
658
|
-
if
|
|
659
|
-
message_content = get_text_from_message(input)
|
|
692
|
+
if input_content and show_message:
|
|
660
693
|
message_panel = create_panel(
|
|
661
|
-
content=Text(
|
|
694
|
+
content=Text(input_content, style="green"),
|
|
662
695
|
title="Message",
|
|
663
696
|
border_style="cyan",
|
|
664
697
|
)
|
|
@@ -671,7 +704,7 @@ def print_response_stream(
|
|
|
671
704
|
final_panels.append(reasoning_panel)
|
|
672
705
|
|
|
673
706
|
# Add thinking panel if available
|
|
674
|
-
if _response_reasoning_content:
|
|
707
|
+
if _response_reasoning_content and show_reasoning:
|
|
675
708
|
thinking_panel = create_panel(
|
|
676
709
|
content=Text(_response_reasoning_content),
|
|
677
710
|
title=f"Thinking ({response_timer.elapsed:.1f}s)",
|
|
@@ -680,7 +713,7 @@ def print_response_stream(
|
|
|
680
713
|
final_panels.append(thinking_panel)
|
|
681
714
|
|
|
682
715
|
# Add member tool calls and responses in correct order
|
|
683
|
-
if run_response is not None and hasattr(run_response, "member_responses"):
|
|
716
|
+
if show_member_responses and run_response is not None and hasattr(run_response, "member_responses"):
|
|
684
717
|
for i, member_response in enumerate(run_response.member_responses): # type: ignore
|
|
685
718
|
member_id = None
|
|
686
719
|
if isinstance(member_response, RunOutput) and member_response.agent_id is not None:
|
|
@@ -829,6 +862,7 @@ async def aprint_response(
|
|
|
829
862
|
show_message: bool = True,
|
|
830
863
|
show_reasoning: bool = True,
|
|
831
864
|
show_full_reasoning: bool = False,
|
|
865
|
+
show_member_responses: Optional[bool] = None,
|
|
832
866
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
833
867
|
session_id: Optional[str] = None,
|
|
834
868
|
session_state: Optional[Dict[str, Any]] = None,
|
|
@@ -838,9 +872,11 @@ async def aprint_response(
|
|
|
838
872
|
videos: Optional[Sequence[Video]] = None,
|
|
839
873
|
files: Optional[Sequence[File]] = None,
|
|
840
874
|
markdown: bool = False,
|
|
841
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
875
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
842
876
|
add_history_to_context: Optional[bool] = None,
|
|
843
877
|
dependencies: Optional[Dict[str, Any]] = None,
|
|
878
|
+
add_dependencies_to_context: Optional[bool] = None,
|
|
879
|
+
add_session_state_to_context: Optional[bool] = None,
|
|
844
880
|
metadata: Optional[Dict[str, Any]] = None,
|
|
845
881
|
debug_mode: Optional[bool] = None,
|
|
846
882
|
**kwargs: Any,
|
|
@@ -887,18 +923,35 @@ async def aprint_response(
|
|
|
887
923
|
videos=videos,
|
|
888
924
|
files=files,
|
|
889
925
|
stream=False,
|
|
926
|
+
stream_events=True,
|
|
890
927
|
session_id=session_id,
|
|
891
928
|
session_state=session_state,
|
|
892
929
|
user_id=user_id,
|
|
893
930
|
knowledge_filters=knowledge_filters,
|
|
894
931
|
add_history_to_context=add_history_to_context,
|
|
895
932
|
dependencies=dependencies,
|
|
933
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
934
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
896
935
|
metadata=metadata,
|
|
897
936
|
debug_mode=debug_mode,
|
|
898
937
|
**kwargs,
|
|
899
938
|
)
|
|
900
939
|
response_timer.stop()
|
|
901
940
|
|
|
941
|
+
if run_response.input is not None and run_response.input.input_content != input:
|
|
942
|
+
# Input was modified during the run
|
|
943
|
+
panels = [status]
|
|
944
|
+
if show_message:
|
|
945
|
+
# Convert message to a panel
|
|
946
|
+
message_content = get_text_from_message(run_response.input.input_content)
|
|
947
|
+
message_panel = create_panel(
|
|
948
|
+
content=Text(message_content, style="green"),
|
|
949
|
+
title="Message",
|
|
950
|
+
border_style="cyan",
|
|
951
|
+
)
|
|
952
|
+
panels.append(message_panel) # type: ignore
|
|
953
|
+
live_console.update(Group(*panels))
|
|
954
|
+
|
|
902
955
|
team_markdown = False
|
|
903
956
|
member_markdown = {}
|
|
904
957
|
if markdown:
|
|
@@ -926,7 +979,7 @@ async def aprint_response(
|
|
|
926
979
|
panels.append(reasoning_panel)
|
|
927
980
|
live_console.update(Group(*panels))
|
|
928
981
|
|
|
929
|
-
if isinstance(run_response, TeamRunOutput) and run_response.reasoning_content is not None:
|
|
982
|
+
if isinstance(run_response, TeamRunOutput) and run_response.reasoning_content is not None and show_reasoning:
|
|
930
983
|
# Create panel for thinking
|
|
931
984
|
thinking_panel = create_panel(
|
|
932
985
|
content=Text(run_response.reasoning_content),
|
|
@@ -938,7 +991,7 @@ async def aprint_response(
|
|
|
938
991
|
|
|
939
992
|
if isinstance(run_response, TeamRunOutput):
|
|
940
993
|
# Handle member responses
|
|
941
|
-
if
|
|
994
|
+
if show_member_responses:
|
|
942
995
|
for member_response in run_response.member_responses:
|
|
943
996
|
# Handle member reasoning
|
|
944
997
|
reasoning_steps = []
|
|
@@ -1107,6 +1160,7 @@ async def aprint_response_stream(
|
|
|
1107
1160
|
show_message: bool = True,
|
|
1108
1161
|
show_reasoning: bool = True,
|
|
1109
1162
|
show_full_reasoning: bool = False,
|
|
1163
|
+
show_member_responses: Optional[bool] = None,
|
|
1110
1164
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
1111
1165
|
session_id: Optional[str] = None,
|
|
1112
1166
|
session_state: Optional[Dict[str, Any]] = None,
|
|
@@ -1116,10 +1170,13 @@ async def aprint_response_stream(
|
|
|
1116
1170
|
videos: Optional[Sequence[Video]] = None,
|
|
1117
1171
|
files: Optional[Sequence[File]] = None,
|
|
1118
1172
|
markdown: bool = False,
|
|
1173
|
+
stream_events: bool = False,
|
|
1119
1174
|
stream_intermediate_steps: bool = False, # type: ignore
|
|
1120
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
1175
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
1121
1176
|
add_history_to_context: Optional[bool] = None,
|
|
1122
1177
|
dependencies: Optional[Dict[str, Any]] = None,
|
|
1178
|
+
add_dependencies_to_context: Optional[bool] = None,
|
|
1179
|
+
add_session_state_to_context: Optional[bool] = None,
|
|
1123
1180
|
metadata: Optional[Dict[str, Any]] = None,
|
|
1124
1181
|
debug_mode: Optional[bool] = None,
|
|
1125
1182
|
**kwargs: Any,
|
|
@@ -1136,7 +1193,7 @@ async def aprint_response_stream(
|
|
|
1136
1193
|
if not tags_to_include_in_markdown:
|
|
1137
1194
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
1138
1195
|
|
|
1139
|
-
|
|
1196
|
+
stream_events = True # With streaming print response, we need to stream intermediate steps
|
|
1140
1197
|
|
|
1141
1198
|
_response_content: str = ""
|
|
1142
1199
|
_response_reasoning_content: str = ""
|
|
@@ -1182,6 +1239,8 @@ async def aprint_response_stream(
|
|
|
1182
1239
|
# Dict to track member response panels by member_id
|
|
1183
1240
|
member_response_panels = {}
|
|
1184
1241
|
|
|
1242
|
+
input_content = get_text_from_message(input)
|
|
1243
|
+
|
|
1185
1244
|
final_run_response = None
|
|
1186
1245
|
async for resp in team.arun( # type: ignore
|
|
1187
1246
|
input=input,
|
|
@@ -1190,16 +1249,18 @@ async def aprint_response_stream(
|
|
|
1190
1249
|
videos=videos,
|
|
1191
1250
|
files=files,
|
|
1192
1251
|
stream=True,
|
|
1193
|
-
|
|
1252
|
+
stream_events=stream_events,
|
|
1194
1253
|
session_id=session_id,
|
|
1195
1254
|
session_state=session_state,
|
|
1196
1255
|
user_id=user_id,
|
|
1197
1256
|
knowledge_filters=knowledge_filters,
|
|
1198
1257
|
add_history_to_context=add_history_to_context,
|
|
1258
|
+
add_dependencies_to_context=add_dependencies_to_context,
|
|
1259
|
+
add_session_state_to_context=add_session_state_to_context,
|
|
1199
1260
|
dependencies=dependencies,
|
|
1200
1261
|
metadata=metadata,
|
|
1201
1262
|
debug_mode=debug_mode,
|
|
1202
|
-
|
|
1263
|
+
yield_run_output=True,
|
|
1203
1264
|
**kwargs,
|
|
1204
1265
|
):
|
|
1205
1266
|
if team_markdown is None:
|
|
@@ -1229,6 +1290,10 @@ async def aprint_response_stream(
|
|
|
1229
1290
|
if hasattr(resp, "reasoning_steps") and resp.reasoning_steps is not None: # type: ignore
|
|
1230
1291
|
reasoning_steps = resp.reasoning_steps # type: ignore
|
|
1231
1292
|
|
|
1293
|
+
if resp.event == TeamRunEvent.pre_hook_completed: # type: ignore
|
|
1294
|
+
if resp.run_input is not None: # type: ignore
|
|
1295
|
+
input_content = get_text_from_message(resp.run_input.input_content) # type: ignore
|
|
1296
|
+
|
|
1232
1297
|
# Collect team tool calls, avoiding duplicates
|
|
1233
1298
|
if resp.event == TeamRunEvent.tool_call_completed and resp.tool: # type: ignore
|
|
1234
1299
|
tool = resp.tool # type: ignore
|
|
@@ -1242,7 +1307,7 @@ async def aprint_response_stream(
|
|
|
1242
1307
|
team_tool_calls.append(tool)
|
|
1243
1308
|
|
|
1244
1309
|
# Collect member tool calls, avoiding duplicates
|
|
1245
|
-
if hasattr(resp, "member_responses") and resp.member_responses:
|
|
1310
|
+
if show_member_responses and hasattr(resp, "member_responses") and resp.member_responses:
|
|
1246
1311
|
for member_response in resp.member_responses:
|
|
1247
1312
|
member_id = None
|
|
1248
1313
|
if isinstance(member_response, RunOutput) and member_response.agent_id is not None:
|
|
@@ -1272,12 +1337,11 @@ async def aprint_response_stream(
|
|
|
1272
1337
|
# Create new panels for each chunk
|
|
1273
1338
|
panels = []
|
|
1274
1339
|
|
|
1275
|
-
if
|
|
1340
|
+
if input_content and show_message:
|
|
1276
1341
|
render = True
|
|
1277
1342
|
# Convert message to a panel
|
|
1278
|
-
message_content = get_text_from_message(input)
|
|
1279
1343
|
message_panel = create_panel(
|
|
1280
|
-
content=Text(
|
|
1344
|
+
content=Text(input_content, style="green"),
|
|
1281
1345
|
title="Message",
|
|
1282
1346
|
border_style="cyan",
|
|
1283
1347
|
)
|
|
@@ -1290,7 +1354,7 @@ async def aprint_response_stream(
|
|
|
1290
1354
|
reasoning_panel = build_reasoning_step_panel(i, step, show_full_reasoning)
|
|
1291
1355
|
panels.append(reasoning_panel)
|
|
1292
1356
|
|
|
1293
|
-
if len(_response_reasoning_content) > 0:
|
|
1357
|
+
if len(_response_reasoning_content) > 0 and show_reasoning:
|
|
1294
1358
|
render = True
|
|
1295
1359
|
# Create panel for thinking
|
|
1296
1360
|
thinking_panel = create_panel(
|
|
@@ -1304,7 +1368,9 @@ async def aprint_response_stream(
|
|
|
1304
1368
|
panels.append(status)
|
|
1305
1369
|
|
|
1306
1370
|
# Process member responses and their tool calls
|
|
1307
|
-
for member_response in
|
|
1371
|
+
for member_response in (
|
|
1372
|
+
resp.member_responses if show_member_responses and hasattr(resp, "member_responses") else []
|
|
1373
|
+
):
|
|
1308
1374
|
member_id = None
|
|
1309
1375
|
member_name = "Team Member"
|
|
1310
1376
|
if isinstance(member_response, RunOutput) and member_response.agent_id is not None:
|
|
@@ -1337,7 +1403,7 @@ async def aprint_response_stream(
|
|
|
1337
1403
|
panels.append(member_tool_calls_panel)
|
|
1338
1404
|
|
|
1339
1405
|
# Process member response content
|
|
1340
|
-
if
|
|
1406
|
+
if show_member_responses and member_id is not None:
|
|
1341
1407
|
show_markdown = False
|
|
1342
1408
|
if markdown:
|
|
1343
1409
|
show_markdown = True
|
|
@@ -1457,10 +1523,9 @@ async def aprint_response_stream(
|
|
|
1457
1523
|
final_panels = []
|
|
1458
1524
|
|
|
1459
1525
|
# Start with the message
|
|
1460
|
-
if
|
|
1461
|
-
message_content = get_text_from_message(input)
|
|
1526
|
+
if input_content and show_message:
|
|
1462
1527
|
message_panel = create_panel(
|
|
1463
|
-
content=Text(
|
|
1528
|
+
content=Text(input_content, style="green"),
|
|
1464
1529
|
title="Message",
|
|
1465
1530
|
border_style="cyan",
|
|
1466
1531
|
)
|
|
@@ -1473,7 +1538,7 @@ async def aprint_response_stream(
|
|
|
1473
1538
|
final_panels.append(reasoning_panel)
|
|
1474
1539
|
|
|
1475
1540
|
# Add thinking panel if available
|
|
1476
|
-
if _response_reasoning_content:
|
|
1541
|
+
if _response_reasoning_content and show_reasoning:
|
|
1477
1542
|
thinking_panel = create_panel(
|
|
1478
1543
|
content=Text(_response_reasoning_content),
|
|
1479
1544
|
title=f"Thinking ({response_timer.elapsed:.1f}s)",
|
|
@@ -1482,7 +1547,7 @@ async def aprint_response_stream(
|
|
|
1482
1547
|
final_panels.append(thinking_panel)
|
|
1483
1548
|
|
|
1484
1549
|
# Add member tool calls and responses in correct order
|
|
1485
|
-
if run_response is not None and hasattr(run_response, "member_responses"):
|
|
1550
|
+
if show_member_responses and run_response is not None and hasattr(run_response, "member_responses"):
|
|
1486
1551
|
for i, member_response in enumerate(run_response.member_responses):
|
|
1487
1552
|
member_id = None
|
|
1488
1553
|
if isinstance(member_response, RunOutput) and member_response.agent_id is not None:
|