agno 2.1.2__py3-none-any.whl → 2.3.13__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 +5540 -2273
- agno/api/api.py +2 -0
- agno/api/os.py +1 -1
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +689 -6
- agno/db/dynamo/dynamo.py +933 -37
- agno/db/dynamo/schemas.py +174 -10
- agno/db/dynamo/utils.py +63 -4
- agno/db/firestore/firestore.py +831 -9
- agno/db/firestore/schemas.py +51 -0
- agno/db/firestore/utils.py +102 -4
- agno/db/gcs_json/gcs_json_db.py +660 -12
- agno/db/gcs_json/utils.py +60 -26
- agno/db/in_memory/in_memory_db.py +287 -14
- agno/db/in_memory/utils.py +60 -2
- agno/db/json/json_db.py +590 -14
- agno/db/json/utils.py +60 -26
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +43 -13
- 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 +2760 -0
- agno/db/mongo/mongo.py +879 -11
- agno/db/mongo/schemas.py +42 -0
- agno/db/mongo/utils.py +80 -8
- agno/db/mysql/__init__.py +2 -1
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +946 -68
- agno/db/mysql/schemas.py +72 -10
- agno/db/mysql/utils.py +198 -7
- agno/db/postgres/__init__.py +2 -1
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +942 -57
- agno/db/postgres/schemas.py +81 -18
- agno/db/postgres/utils.py +164 -2
- agno/db/redis/redis.py +671 -7
- agno/db/redis/schemas.py +50 -0
- agno/db/redis/utils.py +65 -7
- agno/db/schemas/__init__.py +2 -1
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +1 -0
- agno/db/schemas/memory.py +17 -2
- agno/db/singlestore/schemas.py +63 -0
- agno/db/singlestore/singlestore.py +949 -83
- agno/db/singlestore/utils.py +60 -2
- agno/db/sqlite/__init__.py +2 -1
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +62 -0
- agno/db/sqlite/sqlite.py +965 -46
- agno/db/sqlite/utils.py +169 -8
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +2 -0
- agno/eval/__init__.py +10 -0
- agno/eval/accuracy.py +75 -55
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +16 -7
- agno/eval/reliability.py +28 -16
- agno/eval/utils.py +35 -17
- agno/exceptions.py +27 -2
- agno/filters.py +354 -0
- agno/guardrails/prompt_injection.py +1 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/client.py +1 -1
- agno/knowledge/chunking/agentic.py +13 -10
- agno/knowledge/chunking/fixed.py +4 -1
- agno/knowledge/chunking/semantic.py +9 -4
- agno/knowledge/chunking/strategy.py +59 -15
- agno/knowledge/embedder/fastembed.py +1 -1
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/ollama.py +8 -0
- agno/knowledge/embedder/openai.py +8 -8
- agno/knowledge/embedder/sentence_transformer.py +6 -2
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/knowledge.py +1618 -318
- agno/knowledge/reader/base.py +6 -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 +16 -20
- agno/knowledge/reader/json_reader.py +5 -4
- agno/knowledge/reader/markdown_reader.py +8 -8
- agno/knowledge/reader/pdf_reader.py +17 -19
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +32 -3
- agno/knowledge/reader/s3_reader.py +3 -3
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +22 -10
- agno/knowledge/reader/web_search_reader.py +1 -48
- agno/knowledge/reader/website_reader.py +10 -10
- agno/knowledge/reader/wikipedia_reader.py +33 -1
- agno/knowledge/types.py +1 -0
- agno/knowledge/utils.py +72 -7
- agno/media.py +22 -6
- agno/memory/__init__.py +14 -1
- agno/memory/manager.py +544 -83
- 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 +515 -40
- agno/models/aws/bedrock.py +102 -21
- agno/models/aws/claude.py +131 -274
- agno/models/azure/ai_foundry.py +41 -19
- agno/models/azure/openai_chat.py +39 -8
- agno/models/base.py +1249 -525
- agno/models/cerebras/cerebras.py +91 -21
- agno/models/cerebras/cerebras_openai.py +21 -2
- agno/models/cohere/chat.py +40 -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 +877 -80
- agno/models/google/utils.py +22 -0
- agno/models/groq/groq.py +51 -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 +44 -9
- agno/models/litellm/litellm_openai.py +18 -1
- agno/models/message.py +28 -5
- agno/models/meta/llama.py +47 -14
- agno/models/meta/llama_openai.py +22 -17
- agno/models/mistral/mistral.py +8 -4
- agno/models/nebius/nebius.py +6 -7
- agno/models/nvidia/nvidia.py +20 -3
- agno/models/ollama/chat.py +24 -8
- agno/models/openai/chat.py +104 -29
- agno/models/openai/responses.py +101 -81
- agno/models/openrouter/openrouter.py +60 -3
- agno/models/perplexity/perplexity.py +17 -1
- agno/models/portkey/portkey.py +7 -6
- agno/models/requesty/requesty.py +24 -4
- agno/models/response.py +73 -2
- agno/models/sambanova/sambanova.py +20 -3
- agno/models/siliconflow/siliconflow.py +19 -2
- agno/models/together/together.py +20 -3
- agno/models/utils.py +254 -8
- agno/models/vercel/v0.py +20 -3
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/vllm.py +19 -14
- agno/models/xai/xai.py +19 -2
- agno/os/app.py +549 -152
- agno/os/auth.py +190 -3
- agno/os/config.py +23 -0
- agno/os/interfaces/a2a/router.py +8 -11
- agno/os/interfaces/a2a/utils.py +1 -1
- agno/os/interfaces/agui/router.py +18 -3
- agno/os/interfaces/agui/utils.py +152 -39
- agno/os/interfaces/slack/router.py +55 -37
- agno/os/interfaces/slack/slack.py +9 -1
- agno/os/interfaces/whatsapp/router.py +0 -1
- agno/os/interfaces/whatsapp/security.py +3 -1
- agno/os/mcp.py +110 -52
- agno/os/middleware/__init__.py +2 -0
- agno/os/middleware/jwt.py +676 -112
- agno/os/router.py +40 -1478
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/evals.py +96 -39
- agno/os/routers/evals/schemas.py +65 -33
- agno/os/routers/evals/utils.py +80 -10
- agno/os/routers/health.py +10 -4
- agno/os/routers/knowledge/knowledge.py +196 -38
- agno/os/routers/knowledge/schemas.py +82 -22
- agno/os/routers/memory/memory.py +279 -52
- agno/os/routers/memory/schemas.py +46 -17
- agno/os/routers/metrics/metrics.py +20 -8
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +462 -34
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +256 -693
- agno/os/scopes.py +469 -0
- agno/os/utils.py +514 -36
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/openai.py +5 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +155 -32
- agno/run/base.py +55 -3
- agno/run/requirement.py +181 -0
- agno/run/team.py +125 -38
- agno/run/workflow.py +72 -18
- agno/session/agent.py +102 -89
- agno/session/summary.py +56 -15
- agno/session/team.py +164 -90
- agno/session/workflow.py +405 -40
- agno/table.py +10 -0
- agno/team/team.py +3974 -1903
- agno/tools/dalle.py +2 -4
- agno/tools/eleven_labs.py +23 -25
- agno/tools/exa.py +21 -16
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +16 -10
- agno/tools/firecrawl.py +15 -7
- agno/tools/function.py +193 -38
- agno/tools/gmail.py +238 -14
- agno/tools/google_drive.py +271 -0
- agno/tools/googlecalendar.py +36 -8
- agno/tools/googlesheets.py +20 -5
- agno/tools/jira.py +20 -0
- 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 +3 -3
- agno/tools/models/nebius.py +5 -5
- agno/tools/models_labs.py +20 -10
- agno/tools/nano_banana.py +151 -0
- agno/tools/notion.py +204 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +76 -36
- agno/tools/redshift.py +406 -0
- agno/tools/scrapegraph.py +1 -1
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +18 -3
- agno/tools/spotify.py +919 -0
- agno/tools/tavily.py +146 -0
- agno/tools/toolkit.py +25 -0
- agno/tools/workflow.py +8 -1
- agno/tools/yfinance.py +12 -11
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +151 -3
- agno/utils/gemini.py +15 -5
- agno/utils/hooks.py +118 -4
- agno/utils/http.py +113 -2
- agno/utils/knowledge.py +12 -5
- agno/utils/log.py +1 -0
- agno/utils/mcp.py +92 -2
- agno/utils/media.py +187 -1
- agno/utils/merge_dict.py +3 -3
- agno/utils/message.py +60 -0
- agno/utils/models/ai_foundry.py +9 -2
- agno/utils/models/claude.py +49 -14
- agno/utils/models/cohere.py +9 -2
- agno/utils/models/llama.py +9 -2
- agno/utils/models/mistral.py +4 -2
- agno/utils/print_response/agent.py +109 -16
- agno/utils/print_response/team.py +223 -30
- agno/utils/print_response/workflow.py +251 -34
- agno/utils/streamlit.py +1 -1
- agno/utils/team.py +98 -9
- agno/utils/tokens.py +657 -0
- agno/vectordb/base.py +39 -7
- agno/vectordb/cassandra/cassandra.py +21 -5
- agno/vectordb/chroma/chromadb.py +43 -12
- agno/vectordb/clickhouse/clickhousedb.py +21 -5
- agno/vectordb/couchbase/couchbase.py +29 -5
- agno/vectordb/lancedb/lance_db.py +92 -181
- agno/vectordb/langchaindb/langchaindb.py +24 -4
- agno/vectordb/lightrag/lightrag.py +17 -3
- agno/vectordb/llamaindex/llamaindexdb.py +25 -5
- agno/vectordb/milvus/milvus.py +50 -37
- agno/vectordb/mongodb/__init__.py +7 -1
- agno/vectordb/mongodb/mongodb.py +36 -30
- agno/vectordb/pgvector/pgvector.py +201 -77
- agno/vectordb/pineconedb/pineconedb.py +41 -23
- agno/vectordb/qdrant/qdrant.py +67 -54
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/singlestore.py +50 -29
- agno/vectordb/surrealdb/surrealdb.py +31 -41
- agno/vectordb/upstashdb/upstashdb.py +34 -6
- agno/vectordb/weaviate/weaviate.py +53 -14
- agno/workflow/__init__.py +2 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +120 -18
- agno/workflow/loop.py +77 -10
- agno/workflow/parallel.py +231 -143
- agno/workflow/router.py +118 -17
- agno/workflow/step.py +609 -170
- agno/workflow/steps.py +73 -6
- agno/workflow/types.py +96 -21
- agno/workflow/workflow.py +2039 -262
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/METADATA +201 -66
- agno-2.3.13.dist-info/RECORD +613 -0
- agno/tools/googlesearch.py +0 -98
- agno/tools/mcp.py +0 -679
- agno/tools/memori.py +0 -339
- agno-2.1.2.dist-info/RECORD +0 -543
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +0 -0
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/licenses/LICENSE +0 -0
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/utils/models/llama.py
CHANGED
|
@@ -19,13 +19,17 @@ TOOL_CALL_ROLE_MAP = {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
|
|
22
|
-
def format_message(
|
|
22
|
+
def format_message(
|
|
23
|
+
message: Message, openai_like: bool = False, tool_calls: bool = False, compress_tool_results: bool = False
|
|
24
|
+
) -> Dict[str, Any]:
|
|
23
25
|
"""
|
|
24
26
|
Format a message into the format expected by Llama API.
|
|
25
27
|
|
|
26
28
|
Args:
|
|
27
29
|
message (Message): The message to format.
|
|
28
30
|
openai_like (bool): Whether to format the message as an OpenAI-like message.
|
|
31
|
+
tool_calls (bool): Whether tool calls are present.
|
|
32
|
+
compress_tool_results: Whether to compress tool results.
|
|
29
33
|
|
|
30
34
|
Returns:
|
|
31
35
|
Dict[str, Any]: The formatted message.
|
|
@@ -52,10 +56,13 @@ def format_message(message: Message, openai_like: bool = False, tool_calls: bool
|
|
|
52
56
|
log_warning("Audio input is currently unsupported.")
|
|
53
57
|
|
|
54
58
|
if message.role == "tool":
|
|
59
|
+
# Use compressed content if compression is active
|
|
60
|
+
content = message.get_content(use_compressed_content=compress_tool_results)
|
|
61
|
+
|
|
55
62
|
message_dict = {
|
|
56
63
|
"role": "tool",
|
|
57
64
|
"tool_call_id": message.tool_call_id,
|
|
58
|
-
"content":
|
|
65
|
+
"content": content,
|
|
59
66
|
}
|
|
60
67
|
|
|
61
68
|
if message.role == "assistant":
|
agno/utils/models/mistral.py
CHANGED
|
@@ -48,7 +48,7 @@ def _format_image_for_message(image: Image) -> Optional[ImageURLChunk]:
|
|
|
48
48
|
return None
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
def format_messages(messages: List[Message]) -> List[MistralMessage]:
|
|
51
|
+
def format_messages(messages: List[Message], compress_tool_results: bool = False) -> List[MistralMessage]:
|
|
52
52
|
mistral_messages: List[MistralMessage] = []
|
|
53
53
|
|
|
54
54
|
for message in messages:
|
|
@@ -84,7 +84,9 @@ def format_messages(messages: List[Message]) -> List[MistralMessage]:
|
|
|
84
84
|
elif message.role == "system":
|
|
85
85
|
mistral_message = SystemMessage(role="system", content=message.content)
|
|
86
86
|
elif message.role == "tool":
|
|
87
|
-
|
|
87
|
+
# Get compressed content if compression is active
|
|
88
|
+
tool_content = message.get_content(use_compressed_content=compress_tool_results)
|
|
89
|
+
mistral_message = ToolMessage(name="tool", content=tool_content, tool_call_id=message.tool_call_id)
|
|
88
90
|
else:
|
|
89
91
|
raise ValueError(f"Unknown role: {message.role}")
|
|
90
92
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import json
|
|
2
|
+
import warnings
|
|
2
3
|
from collections.abc import Set
|
|
3
4
|
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence, Union, cast, get_args
|
|
4
5
|
|
|
@@ -10,6 +11,7 @@ from rich.markdown import Markdown
|
|
|
10
11
|
from rich.status import Status
|
|
11
12
|
from rich.text import Text
|
|
12
13
|
|
|
14
|
+
from agno.filters import FilterExpr
|
|
13
15
|
from agno.media import Audio, File, Image, Video
|
|
14
16
|
from agno.models.message import Message
|
|
15
17
|
from agno.reasoning.step import ReasoningStep
|
|
@@ -29,12 +31,12 @@ def print_response_stream(
|
|
|
29
31
|
session_id: Optional[str] = None,
|
|
30
32
|
session_state: Optional[Dict[str, Any]] = None,
|
|
31
33
|
user_id: Optional[str] = None,
|
|
34
|
+
run_id: Optional[str] = None,
|
|
32
35
|
audio: Optional[Sequence[Audio]] = None,
|
|
33
36
|
images: Optional[Sequence[Image]] = None,
|
|
34
37
|
videos: Optional[Sequence[Video]] = None,
|
|
35
38
|
files: Optional[Sequence[File]] = None,
|
|
36
|
-
|
|
37
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
39
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
38
40
|
debug_mode: Optional[bool] = None,
|
|
39
41
|
markdown: bool = False,
|
|
40
42
|
show_message: bool = True,
|
|
@@ -85,12 +87,12 @@ def print_response_stream(
|
|
|
85
87
|
session_id=session_id,
|
|
86
88
|
session_state=session_state,
|
|
87
89
|
user_id=user_id,
|
|
90
|
+
run_id=run_id,
|
|
88
91
|
audio=audio,
|
|
89
92
|
images=images,
|
|
90
93
|
videos=videos,
|
|
91
94
|
files=files,
|
|
92
95
|
stream=True,
|
|
93
|
-
stream_intermediate_steps=stream_intermediate_steps,
|
|
94
96
|
knowledge_filters=knowledge_filters,
|
|
95
97
|
debug_mode=debug_mode,
|
|
96
98
|
add_history_to_context=add_history_to_context,
|
|
@@ -179,6 +181,7 @@ def print_response_stream(
|
|
|
179
181
|
show_reasoning=show_reasoning,
|
|
180
182
|
show_full_reasoning=show_full_reasoning,
|
|
181
183
|
accumulated_tool_calls=accumulated_tool_calls,
|
|
184
|
+
compression_manager=agent.compression_manager,
|
|
182
185
|
)
|
|
183
186
|
panels.extend(additional_panels)
|
|
184
187
|
if panels:
|
|
@@ -204,6 +207,10 @@ def print_response_stream(
|
|
|
204
207
|
live_log.update(Group(*panels))
|
|
205
208
|
agent.session_summary_manager.summaries_updated = False
|
|
206
209
|
|
|
210
|
+
# Clear compression stats after final display
|
|
211
|
+
if agent.compression_manager is not None:
|
|
212
|
+
agent.compression_manager.stats.clear()
|
|
213
|
+
|
|
207
214
|
response_timer.stop()
|
|
208
215
|
|
|
209
216
|
# Final update to remove the "Thinking..." status
|
|
@@ -217,12 +224,12 @@ async def aprint_response_stream(
|
|
|
217
224
|
session_id: Optional[str] = None,
|
|
218
225
|
session_state: Optional[Dict[str, Any]] = None,
|
|
219
226
|
user_id: Optional[str] = None,
|
|
227
|
+
run_id: Optional[str] = None,
|
|
220
228
|
audio: Optional[Sequence[Audio]] = None,
|
|
221
229
|
images: Optional[Sequence[Image]] = None,
|
|
222
230
|
videos: Optional[Sequence[Video]] = None,
|
|
223
231
|
files: Optional[Sequence[File]] = None,
|
|
224
|
-
|
|
225
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
232
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
226
233
|
debug_mode: Optional[bool] = None,
|
|
227
234
|
markdown: bool = False,
|
|
228
235
|
show_message: bool = True,
|
|
@@ -271,12 +278,12 @@ async def aprint_response_stream(
|
|
|
271
278
|
session_id=session_id,
|
|
272
279
|
session_state=session_state,
|
|
273
280
|
user_id=user_id,
|
|
281
|
+
run_id=run_id,
|
|
274
282
|
audio=audio,
|
|
275
283
|
images=images,
|
|
276
284
|
videos=videos,
|
|
277
285
|
files=files,
|
|
278
286
|
stream=True,
|
|
279
|
-
stream_intermediate_steps=stream_intermediate_steps,
|
|
280
287
|
knowledge_filters=knowledge_filters,
|
|
281
288
|
debug_mode=debug_mode,
|
|
282
289
|
add_history_to_context=add_history_to_context,
|
|
@@ -368,6 +375,7 @@ async def aprint_response_stream(
|
|
|
368
375
|
show_reasoning=show_reasoning,
|
|
369
376
|
show_full_reasoning=show_full_reasoning,
|
|
370
377
|
accumulated_tool_calls=accumulated_tool_calls,
|
|
378
|
+
compression_manager=agent.compression_manager,
|
|
371
379
|
)
|
|
372
380
|
panels.extend(additional_panels)
|
|
373
381
|
if panels:
|
|
@@ -393,6 +401,10 @@ async def aprint_response_stream(
|
|
|
393
401
|
live_log.update(Group(*panels))
|
|
394
402
|
agent.session_summary_manager.summaries_updated = False
|
|
395
403
|
|
|
404
|
+
# Clear compression stats after final display
|
|
405
|
+
if agent.compression_manager is not None:
|
|
406
|
+
agent.compression_manager.stats.clear()
|
|
407
|
+
|
|
396
408
|
response_timer.stop()
|
|
397
409
|
|
|
398
410
|
# Final update to remove the "Thinking..." status
|
|
@@ -409,6 +421,7 @@ def build_panels_stream(
|
|
|
409
421
|
show_reasoning: bool = True,
|
|
410
422
|
show_full_reasoning: bool = False,
|
|
411
423
|
accumulated_tool_calls: Optional[List] = None,
|
|
424
|
+
compression_manager: Optional[Any] = None,
|
|
412
425
|
):
|
|
413
426
|
panels = []
|
|
414
427
|
|
|
@@ -449,8 +462,18 @@ def build_panels_stream(
|
|
|
449
462
|
for formatted_tool_call in formatted_tool_calls:
|
|
450
463
|
tool_calls_content.append(f"• {formatted_tool_call}\n")
|
|
451
464
|
|
|
465
|
+
tool_calls_text = tool_calls_content.plain.rstrip()
|
|
466
|
+
|
|
467
|
+
# Add compression stats if available (don't clear - caller will clear after final display)
|
|
468
|
+
if compression_manager is not None and compression_manager.stats:
|
|
469
|
+
stats = compression_manager.stats
|
|
470
|
+
saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
|
|
471
|
+
orig = stats.get("original_size", 1)
|
|
472
|
+
if stats.get("tool_results_compressed", 0) > 0:
|
|
473
|
+
tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
|
|
474
|
+
|
|
452
475
|
tool_calls_panel = create_panel(
|
|
453
|
-
content=
|
|
476
|
+
content=tool_calls_text,
|
|
454
477
|
title="Tool Calls",
|
|
455
478
|
border_style="yellow",
|
|
456
479
|
)
|
|
@@ -471,11 +494,23 @@ def build_panels_stream(
|
|
|
471
494
|
and response_event.citations is not None
|
|
472
495
|
and response_event.citations.urls is not None
|
|
473
496
|
):
|
|
474
|
-
|
|
497
|
+
md_lines = []
|
|
498
|
+
|
|
499
|
+
# Add search queries if present
|
|
500
|
+
if response_event.citations.search_queries:
|
|
501
|
+
md_lines.append("**Search Queries:**")
|
|
502
|
+
for query in response_event.citations.search_queries:
|
|
503
|
+
md_lines.append(f"- {query}")
|
|
504
|
+
md_lines.append("") # Empty line before URLs
|
|
505
|
+
|
|
506
|
+
# Add URL citations
|
|
507
|
+
md_lines.extend(
|
|
475
508
|
f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
|
|
476
509
|
for i, citation in enumerate(response_event.citations.urls)
|
|
477
510
|
if citation.url # Only include citations with valid URLs
|
|
478
511
|
)
|
|
512
|
+
|
|
513
|
+
md_content = "\n".join(md_lines)
|
|
479
514
|
if md_content: # Only create panel if there are citations
|
|
480
515
|
citations_panel = create_panel(
|
|
481
516
|
content=Markdown(md_content),
|
|
@@ -493,12 +528,14 @@ def print_response(
|
|
|
493
528
|
session_id: Optional[str] = None,
|
|
494
529
|
session_state: Optional[Dict[str, Any]] = None,
|
|
495
530
|
user_id: Optional[str] = None,
|
|
531
|
+
run_id: Optional[str] = None,
|
|
496
532
|
audio: Optional[Sequence[Audio]] = None,
|
|
497
533
|
images: Optional[Sequence[Image]] = None,
|
|
498
534
|
videos: Optional[Sequence[Video]] = None,
|
|
499
535
|
files: Optional[Sequence[File]] = None,
|
|
500
|
-
|
|
501
|
-
|
|
536
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
537
|
+
stream_events: Optional[bool] = None,
|
|
538
|
+
stream_intermediate_steps: Optional[bool] = None,
|
|
502
539
|
debug_mode: Optional[bool] = None,
|
|
503
540
|
markdown: bool = False,
|
|
504
541
|
show_message: bool = True,
|
|
@@ -513,6 +550,19 @@ def print_response(
|
|
|
513
550
|
metadata: Optional[Dict[str, Any]] = None,
|
|
514
551
|
**kwargs: Any,
|
|
515
552
|
):
|
|
553
|
+
if stream_events is not None:
|
|
554
|
+
warnings.warn(
|
|
555
|
+
"The 'stream_events' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the print_response function.",
|
|
556
|
+
DeprecationWarning,
|
|
557
|
+
stacklevel=2,
|
|
558
|
+
)
|
|
559
|
+
if stream_intermediate_steps is not None:
|
|
560
|
+
warnings.warn(
|
|
561
|
+
"The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the print_response function.",
|
|
562
|
+
DeprecationWarning,
|
|
563
|
+
stacklevel=2,
|
|
564
|
+
)
|
|
565
|
+
|
|
516
566
|
with Live(console=console) as live_log:
|
|
517
567
|
status = Status("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
518
568
|
live_log.update(status)
|
|
@@ -538,12 +588,13 @@ def print_response(
|
|
|
538
588
|
session_id=session_id,
|
|
539
589
|
session_state=session_state,
|
|
540
590
|
user_id=user_id,
|
|
591
|
+
run_id=run_id,
|
|
541
592
|
audio=audio,
|
|
542
593
|
images=images,
|
|
543
594
|
videos=videos,
|
|
544
595
|
files=files,
|
|
545
596
|
stream=False,
|
|
546
|
-
|
|
597
|
+
stream_events=True,
|
|
547
598
|
knowledge_filters=knowledge_filters,
|
|
548
599
|
debug_mode=debug_mode,
|
|
549
600
|
add_history_to_context=add_history_to_context,
|
|
@@ -577,6 +628,7 @@ def print_response(
|
|
|
577
628
|
show_full_reasoning=show_full_reasoning,
|
|
578
629
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
579
630
|
markdown=markdown,
|
|
631
|
+
compression_manager=agent.compression_manager,
|
|
580
632
|
)
|
|
581
633
|
panels.extend(additional_panels)
|
|
582
634
|
|
|
@@ -611,17 +663,19 @@ async def aprint_response(
|
|
|
611
663
|
session_id: Optional[str] = None,
|
|
612
664
|
session_state: Optional[Dict[str, Any]] = None,
|
|
613
665
|
user_id: Optional[str] = None,
|
|
666
|
+
run_id: Optional[str] = None,
|
|
614
667
|
audio: Optional[Sequence[Audio]] = None,
|
|
615
668
|
images: Optional[Sequence[Image]] = None,
|
|
616
669
|
videos: Optional[Sequence[Video]] = None,
|
|
617
670
|
files: Optional[Sequence[File]] = None,
|
|
618
|
-
|
|
619
|
-
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
671
|
+
knowledge_filters: Optional[Union[Dict[str, Any], List[FilterExpr]]] = None,
|
|
620
672
|
debug_mode: Optional[bool] = None,
|
|
621
673
|
markdown: bool = False,
|
|
622
674
|
show_message: bool = True,
|
|
623
675
|
show_reasoning: bool = True,
|
|
624
676
|
show_full_reasoning: bool = False,
|
|
677
|
+
stream_events: Optional[bool] = None,
|
|
678
|
+
stream_intermediate_steps: Optional[bool] = None,
|
|
625
679
|
tags_to_include_in_markdown: Set[str] = {"think", "thinking"},
|
|
626
680
|
console: Optional[Any] = None,
|
|
627
681
|
add_history_to_context: Optional[bool] = None,
|
|
@@ -631,6 +685,19 @@ async def aprint_response(
|
|
|
631
685
|
metadata: Optional[Dict[str, Any]] = None,
|
|
632
686
|
**kwargs: Any,
|
|
633
687
|
):
|
|
688
|
+
if stream_events is not None:
|
|
689
|
+
warnings.warn(
|
|
690
|
+
"The 'stream_events' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the aprint_response function.",
|
|
691
|
+
DeprecationWarning,
|
|
692
|
+
stacklevel=2,
|
|
693
|
+
)
|
|
694
|
+
if stream_intermediate_steps is not None:
|
|
695
|
+
warnings.warn(
|
|
696
|
+
"The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Event streaming is always enabled using the aprint_response function.",
|
|
697
|
+
DeprecationWarning,
|
|
698
|
+
stacklevel=2,
|
|
699
|
+
)
|
|
700
|
+
|
|
634
701
|
with Live(console=console) as live_log:
|
|
635
702
|
status = Status("Thinking...", spinner="aesthetic", speed=0.4, refresh_per_second=10)
|
|
636
703
|
live_log.update(status)
|
|
@@ -656,12 +723,13 @@ async def aprint_response(
|
|
|
656
723
|
session_id=session_id,
|
|
657
724
|
session_state=session_state,
|
|
658
725
|
user_id=user_id,
|
|
726
|
+
run_id=run_id,
|
|
659
727
|
audio=audio,
|
|
660
728
|
images=images,
|
|
661
729
|
videos=videos,
|
|
662
730
|
files=files,
|
|
663
731
|
stream=False,
|
|
664
|
-
|
|
732
|
+
stream_events=True,
|
|
665
733
|
knowledge_filters=knowledge_filters,
|
|
666
734
|
debug_mode=debug_mode,
|
|
667
735
|
add_history_to_context=add_history_to_context,
|
|
@@ -695,6 +763,7 @@ async def aprint_response(
|
|
|
695
763
|
show_full_reasoning=show_full_reasoning,
|
|
696
764
|
tags_to_include_in_markdown=tags_to_include_in_markdown,
|
|
697
765
|
markdown=markdown,
|
|
766
|
+
compression_manager=agent.compression_manager,
|
|
698
767
|
)
|
|
699
768
|
panels.extend(additional_panels)
|
|
700
769
|
|
|
@@ -731,6 +800,7 @@ def build_panels(
|
|
|
731
800
|
show_full_reasoning: bool = False,
|
|
732
801
|
tags_to_include_in_markdown: Optional[Set[str]] = None,
|
|
733
802
|
markdown: bool = False,
|
|
803
|
+
compression_manager: Optional[Any] = None,
|
|
734
804
|
):
|
|
735
805
|
panels = []
|
|
736
806
|
|
|
@@ -782,8 +852,19 @@ def build_panels(
|
|
|
782
852
|
for formatted_tool_call in formatted_tool_calls:
|
|
783
853
|
tool_calls_content.append(f"• {formatted_tool_call}\n")
|
|
784
854
|
|
|
855
|
+
tool_calls_text = tool_calls_content.plain.rstrip()
|
|
856
|
+
|
|
857
|
+
# Add compression stats if available
|
|
858
|
+
if compression_manager is not None and compression_manager.stats:
|
|
859
|
+
stats = compression_manager.stats
|
|
860
|
+
saved = stats.get("original_size", 0) - stats.get("compressed_size", 0)
|
|
861
|
+
orig = stats.get("original_size", 1)
|
|
862
|
+
if stats.get("tool_results_compressed", 0) > 0:
|
|
863
|
+
tool_calls_text += f"\n\ncompressed: {stats.get('tool_results_compressed', 0)} | Saved: {saved:,} chars ({saved / orig * 100:.0f}%)"
|
|
864
|
+
compression_manager.stats.clear()
|
|
865
|
+
|
|
785
866
|
tool_calls_panel = create_panel(
|
|
786
|
-
content=
|
|
867
|
+
content=tool_calls_text,
|
|
787
868
|
title="Tool Calls",
|
|
788
869
|
border_style="yellow",
|
|
789
870
|
)
|
|
@@ -821,11 +902,23 @@ def build_panels(
|
|
|
821
902
|
and run_response.citations is not None
|
|
822
903
|
and run_response.citations.urls is not None
|
|
823
904
|
):
|
|
824
|
-
|
|
905
|
+
md_lines = []
|
|
906
|
+
|
|
907
|
+
# Add search queries if present
|
|
908
|
+
if run_response.citations.search_queries:
|
|
909
|
+
md_lines.append("**Search Queries:**")
|
|
910
|
+
for query in run_response.citations.search_queries:
|
|
911
|
+
md_lines.append(f"- {query}")
|
|
912
|
+
md_lines.append("") # Empty line before URLs
|
|
913
|
+
|
|
914
|
+
# Add URL citations
|
|
915
|
+
md_lines.extend(
|
|
825
916
|
f"{i + 1}. [{citation.title or citation.url}]({citation.url})"
|
|
826
917
|
for i, citation in enumerate(run_response.citations.urls)
|
|
827
918
|
if citation.url # Only include citations with valid URLs
|
|
828
919
|
)
|
|
920
|
+
|
|
921
|
+
md_content = "\n".join(md_lines)
|
|
829
922
|
if md_content: # Only create panel if there are citations
|
|
830
923
|
citations_panel = create_panel(
|
|
831
924
|
content=Markdown(md_content),
|