agno 2.2.13__py3-none-any.whl → 2.4.3__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/__init__.py +6 -0
- agno/agent/agent.py +5252 -3145
- agno/agent/remote.py +525 -0
- agno/api/api.py +2 -0
- agno/client/__init__.py +3 -0
- agno/client/a2a/__init__.py +10 -0
- agno/client/a2a/client.py +554 -0
- agno/client/a2a/schemas.py +112 -0
- agno/client/a2a/utils.py +369 -0
- agno/client/os.py +2669 -0
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/manager.py +2 -2
- agno/db/base.py +927 -6
- agno/db/dynamo/dynamo.py +788 -2
- agno/db/dynamo/schemas.py +128 -0
- agno/db/dynamo/utils.py +26 -3
- agno/db/firestore/firestore.py +674 -50
- agno/db/firestore/schemas.py +41 -0
- agno/db/firestore/utils.py +25 -10
- agno/db/gcs_json/gcs_json_db.py +506 -3
- agno/db/gcs_json/utils.py +14 -2
- agno/db/in_memory/in_memory_db.py +203 -4
- agno/db/in_memory/utils.py +14 -2
- agno/db/json/json_db.py +498 -2
- agno/db/json/utils.py +14 -2
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/utils.py +19 -0
- agno/db/migrations/v1_to_v2.py +54 -16
- agno/db/migrations/versions/__init__.py +0 -0
- agno/db/migrations/versions/v2_3_0.py +977 -0
- agno/db/mongo/async_mongo.py +1013 -39
- agno/db/mongo/mongo.py +684 -4
- agno/db/mongo/schemas.py +48 -0
- agno/db/mongo/utils.py +17 -0
- agno/db/mysql/__init__.py +2 -1
- agno/db/mysql/async_mysql.py +2958 -0
- agno/db/mysql/mysql.py +722 -53
- agno/db/mysql/schemas.py +77 -11
- agno/db/mysql/utils.py +151 -8
- agno/db/postgres/async_postgres.py +1254 -137
- agno/db/postgres/postgres.py +2316 -93
- agno/db/postgres/schemas.py +153 -21
- agno/db/postgres/utils.py +22 -7
- agno/db/redis/redis.py +531 -3
- agno/db/redis/schemas.py +36 -0
- agno/db/redis/utils.py +31 -15
- agno/db/schemas/evals.py +1 -0
- agno/db/schemas/memory.py +20 -9
- agno/db/singlestore/schemas.py +70 -1
- agno/db/singlestore/singlestore.py +737 -74
- agno/db/singlestore/utils.py +13 -3
- agno/db/sqlite/async_sqlite.py +1069 -89
- agno/db/sqlite/schemas.py +133 -1
- agno/db/sqlite/sqlite.py +2203 -165
- agno/db/sqlite/utils.py +21 -11
- agno/db/surrealdb/models.py +25 -0
- agno/db/surrealdb/surrealdb.py +603 -1
- agno/db/utils.py +60 -0
- agno/eval/__init__.py +26 -3
- agno/eval/accuracy.py +25 -12
- agno/eval/agent_as_judge.py +871 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +10 -4
- agno/eval/reliability.py +22 -13
- agno/eval/utils.py +2 -1
- agno/exceptions.py +42 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/client.py +13 -2
- agno/knowledge/__init__.py +4 -0
- agno/knowledge/chunking/code.py +90 -0
- agno/knowledge/chunking/document.py +65 -4
- agno/knowledge/chunking/fixed.py +4 -1
- agno/knowledge/chunking/markdown.py +102 -11
- agno/knowledge/chunking/recursive.py +2 -2
- agno/knowledge/chunking/semantic.py +130 -48
- agno/knowledge/chunking/strategy.py +18 -0
- agno/knowledge/embedder/azure_openai.py +0 -1
- agno/knowledge/embedder/google.py +1 -1
- agno/knowledge/embedder/mistral.py +1 -1
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/openai.py +16 -12
- agno/knowledge/filesystem.py +412 -0
- agno/knowledge/knowledge.py +4261 -1199
- agno/knowledge/protocol.py +134 -0
- agno/knowledge/reader/arxiv_reader.py +3 -2
- agno/knowledge/reader/base.py +9 -7
- agno/knowledge/reader/csv_reader.py +91 -42
- agno/knowledge/reader/docx_reader.py +9 -10
- agno/knowledge/reader/excel_reader.py +225 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +38 -48
- agno/knowledge/reader/firecrawl_reader.py +3 -2
- agno/knowledge/reader/json_reader.py +16 -22
- agno/knowledge/reader/markdown_reader.py +15 -14
- agno/knowledge/reader/pdf_reader.py +33 -28
- agno/knowledge/reader/pptx_reader.py +9 -10
- agno/knowledge/reader/reader_factory.py +135 -1
- agno/knowledge/reader/s3_reader.py +8 -16
- agno/knowledge/reader/tavily_reader.py +3 -3
- agno/knowledge/reader/text_reader.py +15 -14
- agno/knowledge/reader/utils/__init__.py +17 -0
- agno/knowledge/reader/utils/spreadsheet.py +114 -0
- agno/knowledge/reader/web_search_reader.py +8 -65
- agno/knowledge/reader/website_reader.py +16 -13
- agno/knowledge/reader/wikipedia_reader.py +36 -3
- agno/knowledge/reader/youtube_reader.py +3 -2
- agno/knowledge/remote_content/__init__.py +33 -0
- agno/knowledge/remote_content/config.py +266 -0
- agno/knowledge/remote_content/remote_content.py +105 -17
- agno/knowledge/utils.py +76 -22
- agno/learn/__init__.py +71 -0
- agno/learn/config.py +463 -0
- agno/learn/curate.py +185 -0
- agno/learn/machine.py +725 -0
- agno/learn/schemas.py +1114 -0
- agno/learn/stores/__init__.py +38 -0
- agno/learn/stores/decision_log.py +1156 -0
- agno/learn/stores/entity_memory.py +3275 -0
- agno/learn/stores/learned_knowledge.py +1583 -0
- agno/learn/stores/protocol.py +117 -0
- agno/learn/stores/session_context.py +1217 -0
- agno/learn/stores/user_memory.py +1495 -0
- agno/learn/stores/user_profile.py +1220 -0
- agno/learn/utils.py +209 -0
- agno/media.py +22 -6
- agno/memory/__init__.py +14 -1
- agno/memory/manager.py +223 -8
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/aimlapi.py +17 -0
- agno/models/anthropic/claude.py +434 -59
- agno/models/aws/bedrock.py +121 -20
- agno/models/aws/claude.py +131 -274
- agno/models/azure/ai_foundry.py +10 -6
- agno/models/azure/openai_chat.py +33 -10
- agno/models/base.py +1162 -561
- agno/models/cerebras/cerebras.py +120 -24
- agno/models/cerebras/cerebras_openai.py +21 -2
- agno/models/cohere/chat.py +65 -6
- agno/models/cometapi/cometapi.py +18 -1
- agno/models/dashscope/dashscope.py +2 -3
- agno/models/deepinfra/deepinfra.py +18 -1
- agno/models/deepseek/deepseek.py +69 -3
- agno/models/fireworks/fireworks.py +18 -1
- agno/models/google/gemini.py +959 -89
- agno/models/google/utils.py +22 -0
- agno/models/groq/groq.py +48 -18
- agno/models/huggingface/huggingface.py +17 -6
- agno/models/ibm/watsonx.py +16 -6
- agno/models/internlm/internlm.py +18 -1
- agno/models/langdb/langdb.py +13 -1
- agno/models/litellm/chat.py +88 -9
- agno/models/litellm/litellm_openai.py +18 -1
- agno/models/message.py +24 -5
- agno/models/meta/llama.py +40 -13
- agno/models/meta/llama_openai.py +22 -21
- agno/models/metrics.py +12 -0
- agno/models/mistral/mistral.py +8 -4
- agno/models/n1n/__init__.py +3 -0
- agno/models/n1n/n1n.py +57 -0
- agno/models/nebius/nebius.py +6 -7
- agno/models/nvidia/nvidia.py +20 -3
- agno/models/ollama/__init__.py +2 -0
- agno/models/ollama/chat.py +17 -6
- agno/models/ollama/responses.py +100 -0
- agno/models/openai/__init__.py +2 -0
- agno/models/openai/chat.py +117 -26
- agno/models/openai/open_responses.py +46 -0
- agno/models/openai/responses.py +110 -32
- agno/models/openrouter/__init__.py +2 -0
- agno/models/openrouter/openrouter.py +67 -2
- agno/models/openrouter/responses.py +146 -0
- agno/models/perplexity/perplexity.py +19 -1
- agno/models/portkey/portkey.py +7 -6
- agno/models/requesty/requesty.py +19 -2
- agno/models/response.py +20 -2
- agno/models/sambanova/sambanova.py +20 -3
- agno/models/siliconflow/siliconflow.py +19 -2
- agno/models/together/together.py +20 -3
- agno/models/vercel/v0.py +20 -3
- agno/models/vertexai/claude.py +124 -4
- agno/models/vllm/vllm.py +19 -14
- agno/models/xai/xai.py +19 -2
- agno/os/app.py +467 -137
- agno/os/auth.py +253 -5
- agno/os/config.py +22 -0
- agno/os/interfaces/a2a/a2a.py +7 -6
- agno/os/interfaces/a2a/router.py +635 -26
- agno/os/interfaces/a2a/utils.py +32 -33
- agno/os/interfaces/agui/agui.py +5 -3
- agno/os/interfaces/agui/router.py +26 -16
- agno/os/interfaces/agui/utils.py +97 -57
- agno/os/interfaces/base.py +7 -7
- agno/os/interfaces/slack/router.py +16 -7
- agno/os/interfaces/slack/slack.py +7 -7
- agno/os/interfaces/whatsapp/router.py +35 -7
- agno/os/interfaces/whatsapp/security.py +3 -1
- agno/os/interfaces/whatsapp/whatsapp.py +11 -8
- agno/os/managers.py +326 -0
- agno/os/mcp.py +652 -79
- agno/os/middleware/__init__.py +4 -0
- agno/os/middleware/jwt.py +718 -115
- agno/os/middleware/trailing_slash.py +27 -0
- agno/os/router.py +105 -1558
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +655 -0
- agno/os/routers/agents/schema.py +288 -0
- agno/os/routers/components/__init__.py +3 -0
- agno/os/routers/components/components.py +475 -0
- agno/os/routers/database.py +155 -0
- agno/os/routers/evals/evals.py +111 -18
- agno/os/routers/evals/schemas.py +38 -5
- agno/os/routers/evals/utils.py +80 -11
- agno/os/routers/health.py +3 -3
- agno/os/routers/knowledge/knowledge.py +284 -35
- agno/os/routers/knowledge/schemas.py +14 -2
- agno/os/routers/memory/memory.py +274 -11
- agno/os/routers/memory/schemas.py +44 -3
- agno/os/routers/metrics/metrics.py +30 -15
- agno/os/routers/metrics/schemas.py +10 -6
- agno/os/routers/registry/__init__.py +3 -0
- agno/os/routers/registry/registry.py +337 -0
- agno/os/routers/session/session.py +143 -14
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +550 -0
- agno/os/routers/teams/schema.py +280 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +549 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +757 -0
- agno/os/routers/workflows/schema.py +139 -0
- agno/os/schema.py +157 -584
- agno/os/scopes.py +469 -0
- agno/os/settings.py +3 -0
- agno/os/utils.py +574 -185
- agno/reasoning/anthropic.py +85 -1
- agno/reasoning/azure_ai_foundry.py +93 -1
- agno/reasoning/deepseek.py +102 -2
- agno/reasoning/default.py +6 -7
- agno/reasoning/gemini.py +87 -3
- agno/reasoning/groq.py +109 -2
- agno/reasoning/helpers.py +6 -7
- agno/reasoning/manager.py +1238 -0
- agno/reasoning/ollama.py +93 -1
- agno/reasoning/openai.py +115 -1
- agno/reasoning/vertexai.py +85 -1
- agno/registry/__init__.py +3 -0
- agno/registry/registry.py +68 -0
- agno/remote/__init__.py +3 -0
- agno/remote/base.py +581 -0
- agno/run/__init__.py +2 -4
- agno/run/agent.py +134 -19
- agno/run/base.py +49 -1
- agno/run/cancel.py +65 -52
- agno/run/cancellation_management/__init__.py +9 -0
- agno/run/cancellation_management/base.py +78 -0
- agno/run/cancellation_management/in_memory_cancellation_manager.py +100 -0
- agno/run/cancellation_management/redis_cancellation_manager.py +236 -0
- agno/run/requirement.py +181 -0
- agno/run/team.py +111 -19
- agno/run/workflow.py +2 -1
- agno/session/agent.py +57 -92
- agno/session/summary.py +1 -1
- agno/session/team.py +62 -115
- agno/session/workflow.py +353 -57
- agno/skills/__init__.py +17 -0
- agno/skills/agent_skills.py +377 -0
- agno/skills/errors.py +32 -0
- agno/skills/loaders/__init__.py +4 -0
- agno/skills/loaders/base.py +27 -0
- agno/skills/loaders/local.py +216 -0
- agno/skills/skill.py +65 -0
- agno/skills/utils.py +107 -0
- agno/skills/validator.py +277 -0
- agno/table.py +10 -0
- agno/team/__init__.py +5 -1
- agno/team/remote.py +447 -0
- agno/team/team.py +3769 -2202
- agno/tools/brandfetch.py +27 -18
- agno/tools/browserbase.py +225 -16
- agno/tools/crawl4ai.py +3 -0
- agno/tools/duckduckgo.py +25 -71
- agno/tools/exa.py +0 -21
- agno/tools/file.py +14 -13
- agno/tools/file_generation.py +12 -6
- agno/tools/firecrawl.py +15 -7
- agno/tools/function.py +94 -113
- agno/tools/google_bigquery.py +11 -2
- agno/tools/google_drive.py +4 -3
- agno/tools/knowledge.py +9 -4
- agno/tools/mcp/mcp.py +301 -18
- agno/tools/mcp/multi_mcp.py +269 -14
- agno/tools/mem0.py +11 -10
- agno/tools/memory.py +47 -46
- agno/tools/mlx_transcribe.py +10 -7
- agno/tools/models/nebius.py +5 -5
- agno/tools/models_labs.py +20 -10
- agno/tools/nano_banana.py +151 -0
- agno/tools/parallel.py +0 -7
- agno/tools/postgres.py +76 -36
- agno/tools/python.py +14 -6
- agno/tools/reasoning.py +30 -23
- agno/tools/redshift.py +406 -0
- agno/tools/shopify.py +1519 -0
- agno/tools/spotify.py +919 -0
- agno/tools/tavily.py +4 -1
- agno/tools/toolkit.py +253 -18
- agno/tools/websearch.py +93 -0
- agno/tools/website.py +1 -1
- agno/tools/wikipedia.py +1 -1
- agno/tools/workflow.py +56 -48
- agno/tools/yfinance.py +12 -11
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +161 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +112 -0
- agno/utils/agent.py +251 -10
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +264 -7
- agno/utils/hooks.py +111 -3
- agno/utils/http.py +161 -2
- agno/utils/mcp.py +49 -8
- agno/utils/media.py +22 -1
- agno/utils/models/ai_foundry.py +9 -2
- agno/utils/models/claude.py +20 -5
- agno/utils/models/cohere.py +9 -2
- agno/utils/models/llama.py +9 -2
- agno/utils/models/mistral.py +4 -2
- agno/utils/os.py +0 -0
- agno/utils/print_response/agent.py +99 -16
- agno/utils/print_response/team.py +223 -24
- agno/utils/print_response/workflow.py +0 -2
- agno/utils/prompts.py +8 -6
- agno/utils/remote.py +23 -0
- agno/utils/response.py +1 -13
- agno/utils/string.py +91 -2
- agno/utils/team.py +62 -12
- agno/utils/tokens.py +657 -0
- agno/vectordb/base.py +15 -2
- agno/vectordb/cassandra/cassandra.py +1 -1
- agno/vectordb/chroma/__init__.py +2 -1
- agno/vectordb/chroma/chromadb.py +468 -23
- agno/vectordb/clickhouse/clickhousedb.py +1 -1
- agno/vectordb/couchbase/couchbase.py +6 -2
- agno/vectordb/lancedb/lance_db.py +7 -38
- agno/vectordb/lightrag/lightrag.py +7 -6
- agno/vectordb/milvus/milvus.py +118 -84
- agno/vectordb/mongodb/__init__.py +2 -1
- agno/vectordb/mongodb/mongodb.py +14 -31
- agno/vectordb/pgvector/pgvector.py +120 -66
- agno/vectordb/pineconedb/pineconedb.py +2 -19
- agno/vectordb/qdrant/__init__.py +2 -1
- agno/vectordb/qdrant/qdrant.py +33 -56
- agno/vectordb/redis/__init__.py +2 -1
- agno/vectordb/redis/redisdb.py +19 -31
- agno/vectordb/singlestore/singlestore.py +17 -9
- agno/vectordb/surrealdb/surrealdb.py +2 -38
- agno/vectordb/weaviate/__init__.py +2 -1
- agno/vectordb/weaviate/weaviate.py +7 -3
- agno/workflow/__init__.py +5 -1
- agno/workflow/agent.py +2 -2
- agno/workflow/condition.py +12 -10
- agno/workflow/loop.py +28 -9
- agno/workflow/parallel.py +21 -13
- agno/workflow/remote.py +362 -0
- agno/workflow/router.py +12 -9
- agno/workflow/step.py +261 -36
- agno/workflow/steps.py +12 -8
- agno/workflow/types.py +40 -77
- agno/workflow/workflow.py +939 -213
- {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/METADATA +134 -181
- agno-2.4.3.dist-info/RECORD +677 -0
- {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/WHEEL +1 -1
- agno/tools/googlesearch.py +0 -98
- agno/tools/memori.py +0 -339
- agno-2.2.13.dist-info/RECORD +0 -575
- {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/licenses/LICENSE +0 -0
- {agno-2.2.13.dist-info → agno-2.4.3.dist-info}/top_level.txt +0 -0
|
@@ -30,12 +30,11 @@ def print_response_stream(
|
|
|
30
30
|
session_id: Optional[str] = None,
|
|
31
31
|
session_state: Optional[Dict[str, Any]] = None,
|
|
32
32
|
user_id: Optional[str] = None,
|
|
33
|
+
run_id: Optional[str] = None,
|
|
33
34
|
audio: Optional[Sequence[Audio]] = None,
|
|
34
35
|
images: Optional[Sequence[Image]] = None,
|
|
35
36
|
videos: Optional[Sequence[Video]] = None,
|
|
36
37
|
files: Optional[Sequence[File]] = None,
|
|
37
|
-
stream_events: bool = False,
|
|
38
|
-
stream_intermediate_steps: bool = False,
|
|
39
38
|
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
40
39
|
debug_mode: Optional[bool] = None,
|
|
41
40
|
markdown: bool = False,
|
|
@@ -82,20 +81,17 @@ def print_response_stream(
|
|
|
82
81
|
|
|
83
82
|
input_content = get_text_from_message(input)
|
|
84
83
|
|
|
85
|
-
# Consider both stream_events and stream_intermediate_steps (deprecated)
|
|
86
|
-
stream_events = stream_events or stream_intermediate_steps
|
|
87
|
-
|
|
88
84
|
for response_event in agent.run(
|
|
89
85
|
input=input,
|
|
90
86
|
session_id=session_id,
|
|
91
87
|
session_state=session_state,
|
|
92
88
|
user_id=user_id,
|
|
89
|
+
run_id=run_id,
|
|
93
90
|
audio=audio,
|
|
94
91
|
images=images,
|
|
95
92
|
videos=videos,
|
|
96
93
|
files=files,
|
|
97
94
|
stream=True,
|
|
98
|
-
stream_events=stream_events,
|
|
99
95
|
knowledge_filters=knowledge_filters,
|
|
100
96
|
debug_mode=debug_mode,
|
|
101
97
|
add_history_to_context=add_history_to_context,
|
|
@@ -137,6 +133,11 @@ def print_response_stream(
|
|
|
137
133
|
)
|
|
138
134
|
except Exception as e:
|
|
139
135
|
log_warning(f"Failed to convert response to JSON: {e}")
|
|
136
|
+
elif agent.output_schema is not None and isinstance(response_event.content, dict):
|
|
137
|
+
try:
|
|
138
|
+
response_content_batch = JSON(json.dumps(response_event.content), indent=2) # type: ignore
|
|
139
|
+
except Exception as e:
|
|
140
|
+
log_warning(f"Failed to convert response to JSON: {e}")
|
|
140
141
|
else:
|
|
141
142
|
try:
|
|
142
143
|
response_content_batch = JSON(json.dumps(response_event.content), indent=4)
|
|
@@ -144,6 +145,12 @@ def print_response_stream(
|
|
|
144
145
|
log_warning(f"Failed to convert response to JSON: {e}")
|
|
145
146
|
if hasattr(response_event, "reasoning_content") and response_event.reasoning_content is not None: # type: ignore
|
|
146
147
|
_response_reasoning_content += response_event.reasoning_content # type: ignore
|
|
148
|
+
|
|
149
|
+
# Handle streaming reasoning content delta events
|
|
150
|
+
if response_event.event == RunEvent.reasoning_content_delta: # type: ignore
|
|
151
|
+
if hasattr(response_event, "reasoning_content") and response_event.reasoning_content is not None: # type: ignore
|
|
152
|
+
_response_reasoning_content += response_event.reasoning_content # type: ignore
|
|
153
|
+
|
|
147
154
|
if hasattr(response_event, "reasoning_steps") and response_event.reasoning_steps is not None: # type: ignore
|
|
148
155
|
reasoning_steps = response_event.reasoning_steps # type: ignore
|
|
149
156
|
|
|
@@ -184,6 +191,7 @@ def print_response_stream(
|
|
|
184
191
|
show_reasoning=show_reasoning,
|
|
185
192
|
show_full_reasoning=show_full_reasoning,
|
|
186
193
|
accumulated_tool_calls=accumulated_tool_calls,
|
|
194
|
+
compression_manager=agent.compression_manager,
|
|
187
195
|
)
|
|
188
196
|
panels.extend(additional_panels)
|
|
189
197
|
if panels:
|
|
@@ -209,6 +217,10 @@ def print_response_stream(
|
|
|
209
217
|
live_log.update(Group(*panels))
|
|
210
218
|
agent.session_summary_manager.summaries_updated = False
|
|
211
219
|
|
|
220
|
+
# Clear compression stats after final display
|
|
221
|
+
if agent.compression_manager is not None:
|
|
222
|
+
agent.compression_manager.stats.clear()
|
|
223
|
+
|
|
212
224
|
response_timer.stop()
|
|
213
225
|
|
|
214
226
|
# Final update to remove the "Thinking..." status
|
|
@@ -222,12 +234,11 @@ async def aprint_response_stream(
|
|
|
222
234
|
session_id: Optional[str] = None,
|
|
223
235
|
session_state: Optional[Dict[str, Any]] = None,
|
|
224
236
|
user_id: Optional[str] = None,
|
|
237
|
+
run_id: Optional[str] = None,
|
|
225
238
|
audio: Optional[Sequence[Audio]] = None,
|
|
226
239
|
images: Optional[Sequence[Image]] = None,
|
|
227
240
|
videos: Optional[Sequence[Video]] = None,
|
|
228
241
|
files: Optional[Sequence[File]] = None,
|
|
229
|
-
stream_events: bool = False,
|
|
230
|
-
stream_intermediate_steps: bool = False,
|
|
231
242
|
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
232
243
|
debug_mode: Optional[bool] = None,
|
|
233
244
|
markdown: bool = False,
|
|
@@ -272,20 +283,17 @@ async def aprint_response_stream(
|
|
|
272
283
|
if render:
|
|
273
284
|
live_log.update(Group(*panels))
|
|
274
285
|
|
|
275
|
-
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
276
|
-
stream_events = stream_events or stream_intermediate_steps
|
|
277
|
-
|
|
278
286
|
result = agent.arun(
|
|
279
287
|
input=input,
|
|
280
288
|
session_id=session_id,
|
|
281
289
|
session_state=session_state,
|
|
282
290
|
user_id=user_id,
|
|
291
|
+
run_id=run_id,
|
|
283
292
|
audio=audio,
|
|
284
293
|
images=images,
|
|
285
294
|
videos=videos,
|
|
286
295
|
files=files,
|
|
287
296
|
stream=True,
|
|
288
|
-
stream_events=stream_events,
|
|
289
297
|
knowledge_filters=knowledge_filters,
|
|
290
298
|
debug_mode=debug_mode,
|
|
291
299
|
add_history_to_context=add_history_to_context,
|
|
@@ -327,6 +335,11 @@ async def aprint_response_stream(
|
|
|
327
335
|
response_content_batch = JSON(resp.content.model_dump_json(exclude_none=True), indent=2) # type: ignore
|
|
328
336
|
except Exception as e:
|
|
329
337
|
log_warning(f"Failed to convert response to JSON: {e}")
|
|
338
|
+
elif agent.output_schema is not None and isinstance(resp.content, dict):
|
|
339
|
+
try:
|
|
340
|
+
response_content_batch = JSON(json.dumps(resp.content), indent=2) # type: ignore
|
|
341
|
+
except Exception as e:
|
|
342
|
+
log_warning(f"Failed to convert response to JSON: {e}")
|
|
330
343
|
else:
|
|
331
344
|
try:
|
|
332
345
|
response_content_batch = JSON(json.dumps(resp.content), indent=4)
|
|
@@ -335,6 +348,11 @@ async def aprint_response_stream(
|
|
|
335
348
|
if resp.reasoning_content is not None: # type: ignore
|
|
336
349
|
_response_reasoning_content += resp.reasoning_content # type: ignore
|
|
337
350
|
|
|
351
|
+
# Handle streaming reasoning content delta events
|
|
352
|
+
if resp.event == RunEvent.reasoning_content_delta: # type: ignore
|
|
353
|
+
if hasattr(resp, "reasoning_content") and resp.reasoning_content is not None: # type: ignore
|
|
354
|
+
_response_reasoning_content += resp.reasoning_content # type: ignore
|
|
355
|
+
|
|
338
356
|
if hasattr(resp, "reasoning_steps") and resp.reasoning_steps is not None: # type: ignore
|
|
339
357
|
reasoning_steps = resp.reasoning_steps # type: ignore
|
|
340
358
|
|
|
@@ -377,6 +395,7 @@ async def aprint_response_stream(
|
|
|
377
395
|
show_reasoning=show_reasoning,
|
|
378
396
|
show_full_reasoning=show_full_reasoning,
|
|
379
397
|
accumulated_tool_calls=accumulated_tool_calls,
|
|
398
|
+
compression_manager=agent.compression_manager,
|
|
380
399
|
)
|
|
381
400
|
panels.extend(additional_panels)
|
|
382
401
|
if panels:
|
|
@@ -402,6 +421,10 @@ async def aprint_response_stream(
|
|
|
402
421
|
live_log.update(Group(*panels))
|
|
403
422
|
agent.session_summary_manager.summaries_updated = False
|
|
404
423
|
|
|
424
|
+
# Clear compression stats after final display
|
|
425
|
+
if agent.compression_manager is not None:
|
|
426
|
+
agent.compression_manager.stats.clear()
|
|
427
|
+
|
|
405
428
|
response_timer.stop()
|
|
406
429
|
|
|
407
430
|
# Final update to remove the "Thinking..." status
|
|
@@ -418,6 +441,7 @@ def build_panels_stream(
|
|
|
418
441
|
show_reasoning: bool = True,
|
|
419
442
|
show_full_reasoning: bool = False,
|
|
420
443
|
accumulated_tool_calls: Optional[List] = None,
|
|
444
|
+
compression_manager: Optional[Any] = None,
|
|
421
445
|
):
|
|
422
446
|
panels = []
|
|
423
447
|
|
|
@@ -458,8 +482,18 @@ def build_panels_stream(
|
|
|
458
482
|
for formatted_tool_call in formatted_tool_calls:
|
|
459
483
|
tool_calls_content.append(f"• {formatted_tool_call}\n")
|
|
460
484
|
|
|
485
|
+
tool_calls_text = tool_calls_content.plain.rstrip()
|
|
486
|
+
|
|
487
|
+
# Add compression stats if available (don't clear - caller will clear after final display)
|
|
488
|
+
if compression_manager is not None and compression_manager.stats:
|
|
489
|
+
stats = compression_manager.stats
|
|
490
|
+
saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
|
|
491
|
+
orig = stats.get("original_size", 1)
|
|
492
|
+
if stats.get("tool_results_compressed", 0) > 0:
|
|
493
|
+
tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
|
|
494
|
+
|
|
461
495
|
tool_calls_panel = create_panel(
|
|
462
|
-
content=
|
|
496
|
+
content=tool_calls_text,
|
|
463
497
|
title="Tool Calls",
|
|
464
498
|
border_style="yellow",
|
|
465
499
|
)
|
|
@@ -480,11 +514,23 @@ def build_panels_stream(
|
|
|
480
514
|
and response_event.citations is not None
|
|
481
515
|
and response_event.citations.urls is not None
|
|
482
516
|
):
|
|
483
|
-
|
|
517
|
+
md_lines = []
|
|
518
|
+
|
|
519
|
+
# Add search queries if present
|
|
520
|
+
if response_event.citations.search_queries:
|
|
521
|
+
md_lines.append("**Search Queries:**")
|
|
522
|
+
for query in response_event.citations.search_queries:
|
|
523
|
+
md_lines.append(f"- {query}")
|
|
524
|
+
md_lines.append("") # Empty line before URLs
|
|
525
|
+
|
|
526
|
+
# Add URL citations
|
|
527
|
+
md_lines.extend(
|
|
484
528
|
f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
|
|
485
529
|
for i, citation in enumerate(response_event.citations.urls)
|
|
486
530
|
if citation.url # Only include citations with valid URLs
|
|
487
531
|
)
|
|
532
|
+
|
|
533
|
+
md_content = "\n".join(md_lines)
|
|
488
534
|
if md_content: # Only create panel if there are citations
|
|
489
535
|
citations_panel = create_panel(
|
|
490
536
|
content=Markdown(md_content),
|
|
@@ -502,6 +548,7 @@ def print_response(
|
|
|
502
548
|
session_id: Optional[str] = None,
|
|
503
549
|
session_state: Optional[Dict[str, Any]] = None,
|
|
504
550
|
user_id: Optional[str] = None,
|
|
551
|
+
run_id: Optional[str] = None,
|
|
505
552
|
audio: Optional[Sequence[Audio]] = None,
|
|
506
553
|
images: Optional[Sequence[Image]] = None,
|
|
507
554
|
videos: Optional[Sequence[Video]] = None,
|
|
@@ -546,11 +593,13 @@ def print_response(
|
|
|
546
593
|
session_id=session_id,
|
|
547
594
|
session_state=session_state,
|
|
548
595
|
user_id=user_id,
|
|
596
|
+
run_id=run_id,
|
|
549
597
|
audio=audio,
|
|
550
598
|
images=images,
|
|
551
599
|
videos=videos,
|
|
552
600
|
files=files,
|
|
553
601
|
stream=False,
|
|
602
|
+
stream_events=True,
|
|
554
603
|
knowledge_filters=knowledge_filters,
|
|
555
604
|
debug_mode=debug_mode,
|
|
556
605
|
add_history_to_context=add_history_to_context,
|
|
@@ -584,6 +633,7 @@ def print_response(
|
|
|
584
633
|
show_full_reasoning=show_full_reasoning,
|
|
585
634
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
586
635
|
markdown=markdown,
|
|
636
|
+
compression_manager=agent.compression_manager,
|
|
587
637
|
)
|
|
588
638
|
panels.extend(additional_panels)
|
|
589
639
|
|
|
@@ -618,6 +668,7 @@ async def aprint_response(
|
|
|
618
668
|
session_id: Optional[str] = None,
|
|
619
669
|
session_state: Optional[Dict[str, Any]] = None,
|
|
620
670
|
user_id: Optional[str] = None,
|
|
671
|
+
run_id: Optional[str] = None,
|
|
621
672
|
audio: Optional[Sequence[Audio]] = None,
|
|
622
673
|
images: Optional[Sequence[Image]] = None,
|
|
623
674
|
videos: Optional[Sequence[Video]] = None,
|
|
@@ -662,11 +713,13 @@ async def aprint_response(
|
|
|
662
713
|
session_id=session_id,
|
|
663
714
|
session_state=session_state,
|
|
664
715
|
user_id=user_id,
|
|
716
|
+
run_id=run_id,
|
|
665
717
|
audio=audio,
|
|
666
718
|
images=images,
|
|
667
719
|
videos=videos,
|
|
668
720
|
files=files,
|
|
669
721
|
stream=False,
|
|
722
|
+
stream_events=True,
|
|
670
723
|
knowledge_filters=knowledge_filters,
|
|
671
724
|
debug_mode=debug_mode,
|
|
672
725
|
add_history_to_context=add_history_to_context,
|
|
@@ -700,6 +753,7 @@ async def aprint_response(
|
|
|
700
753
|
show_full_reasoning=show_full_reasoning,
|
|
701
754
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
702
755
|
markdown=markdown,
|
|
756
|
+
compression_manager=agent.compression_manager,
|
|
703
757
|
)
|
|
704
758
|
panels.extend(additional_panels)
|
|
705
759
|
|
|
@@ -736,6 +790,7 @@ def build_panels(
|
|
|
736
790
|
show_full_reasoning: bool = False,
|
|
737
791
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
738
792
|
markdown: bool = False,
|
|
793
|
+
compression_manager: Optional[Any] = None,
|
|
739
794
|
):
|
|
740
795
|
panels = []
|
|
741
796
|
|
|
@@ -787,8 +842,19 @@ def build_panels(
|
|
|
787
842
|
for formatted_tool_call in formatted_tool_calls:
|
|
788
843
|
tool_calls_content.append(f"• {formatted_tool_call}\n")
|
|
789
844
|
|
|
845
|
+
tool_calls_text = tool_calls_content.plain.rstrip()
|
|
846
|
+
|
|
847
|
+
# Add compression stats if available
|
|
848
|
+
if compression_manager is not None and compression_manager.stats:
|
|
849
|
+
stats = compression_manager.stats
|
|
850
|
+
saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
|
|
851
|
+
orig = stats.get("original_size", 1)
|
|
852
|
+
if stats.get("tool_results_compressed", 0) > 0:
|
|
853
|
+
tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
|
|
854
|
+
compression_manager.stats.clear()
|
|
855
|
+
|
|
790
856
|
tool_calls_panel = create_panel(
|
|
791
|
-
content=
|
|
857
|
+
content=tool_calls_text,
|
|
792
858
|
title="Tool Calls",
|
|
793
859
|
border_style="yellow",
|
|
794
860
|
)
|
|
@@ -807,6 +873,11 @@ def build_panels(
|
|
|
807
873
|
response_content_batch = JSON(run_response.content.model_dump_json(exclude_none=True), indent=2)
|
|
808
874
|
except Exception as e:
|
|
809
875
|
log_warning(f"Failed to convert response to JSON: {e}")
|
|
876
|
+
elif output_schema is not None and isinstance(run_response.content, dict):
|
|
877
|
+
try:
|
|
878
|
+
response_content_batch = JSON(json.dumps(run_response.content), indent=2)
|
|
879
|
+
except Exception as e:
|
|
880
|
+
log_warning(f"Failed to convert response to JSON: {e}")
|
|
810
881
|
else:
|
|
811
882
|
try:
|
|
812
883
|
response_content_batch = JSON(json.dumps(run_response.content), indent=4)
|
|
@@ -826,11 +897,23 @@ def build_panels(
|
|
|
826
897
|
and run_response.citations is not None
|
|
827
898
|
and run_response.citations.urls is not None
|
|
828
899
|
):
|
|
829
|
-
|
|
900
|
+
md_lines = []
|
|
901
|
+
|
|
902
|
+
# Add search queries if present
|
|
903
|
+
if run_response.citations.search_queries:
|
|
904
|
+
md_lines.append("**Search Queries:**")
|
|
905
|
+
for query in run_response.citations.search_queries:
|
|
906
|
+
md_lines.append(f"- {query}")
|
|
907
|
+
md_lines.append("") # Empty line before URLs
|
|
908
|
+
|
|
909
|
+
# Add URL citations
|
|
910
|
+
md_lines.extend(
|
|
830
911
|
f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
|
|
831
912
|
for i, citation in enumerate(run_response.citations.urls)
|
|
832
913
|
if citation.url # Only include citations with valid URLs
|
|
833
914
|
)
|
|
915
|
+
|
|
916
|
+
md_content = "\n".join(md_lines)
|
|
834
917
|
if md_content: # Only create panel if there are citations
|
|
835
918
|
citations_panel = create_panel(
|
|
836
919
|
content=Markdown(md_content),
|