agno 2.0.0rc2__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 +6009 -2874
- 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 +595 -187
- 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 +3 -0
- agno/knowledge/types.py +9 -0
- agno/knowledge/utils.py +20 -0
- agno/media.py +339 -266
- 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 +1011 -566
- 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 +110 -37
- 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 +143 -4
- 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 +60 -6
- agno/models/openai/chat.py +102 -43
- 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 +81 -5
- 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 -175
- 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 +266 -112
- agno/run/base.py +53 -24
- agno/run/team.py +252 -111
- agno/run/workflow.py +156 -45
- 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 -1692
- agno/tools/brightdata.py +3 -3
- agno/tools/cartesia.py +3 -5
- agno/tools/dalle.py +9 -8
- agno/tools/decorator.py +4 -2
- agno/tools/desi_vocal.py +2 -2
- agno/tools/duckduckgo.py +15 -11
- agno/tools/e2b.py +20 -13
- agno/tools/eleven_labs.py +26 -28
- agno/tools/exa.py +21 -16
- agno/tools/fal.py +4 -4
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +350 -0
- agno/tools/firecrawl.py +4 -4
- agno/tools/function.py +257 -37
- agno/tools/giphy.py +2 -2
- 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/lumalab.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/azure_openai.py +2 -2
- agno/tools/models/gemini.py +3 -3
- agno/tools/models/groq.py +3 -5
- agno/tools/models/nebius.py +7 -7
- agno/tools/models_labs.py +25 -15
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +4 -9
- agno/tools/opencv.py +3 -3
- agno/tools/parallel.py +314 -0
- agno/tools/replicate.py +7 -7
- 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 +222 -7
- agno/utils/gemini.py +181 -23
- 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 +95 -5
- 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/models/cohere.py +1 -1
- agno/utils/models/watsonx.py +1 -1
- agno/utils/openai.py +1 -1
- 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 +183 -135
- 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 +645 -136
- agno/workflow/steps.py +65 -6
- agno/workflow/types.py +71 -33
- agno/workflow/workflow.py +2113 -300
- agno-2.3.0.dist-info/METADATA +618 -0
- agno-2.3.0.dist-info/RECORD +577 -0
- agno-2.3.0.dist-info/licenses/LICENSE +201 -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.0rc2.dist-info/METADATA +0 -355
- agno-2.0.0rc2.dist-info/RECORD +0 -515
- agno-2.0.0rc2.dist-info/licenses/LICENSE +0 -375
- {agno-2.0.0rc2.dist-info → agno-2.3.0.dist-info}/WHEEL +0 -0
- {agno-2.0.0rc2.dist-info → agno-2.3.0.dist-info}/top_level.txt +0 -0
agno/reasoning/default.py
CHANGED
|
@@ -14,6 +14,7 @@ def get_default_reasoning_agent(
|
|
|
14
14
|
min_steps: int,
|
|
15
15
|
max_steps: int,
|
|
16
16
|
tools: Optional[List[Union[Toolkit, Callable, Function, Dict]]] = None,
|
|
17
|
+
tool_call_limit: Optional[int] = None,
|
|
17
18
|
use_json_mode: bool = False,
|
|
18
19
|
telemetry: bool = True,
|
|
19
20
|
debug_mode: bool = False,
|
|
@@ -56,7 +57,7 @@ def get_default_reasoning_agent(
|
|
|
56
57
|
- **validate**: When you reach a potential answer, signaling it's ready for validation.
|
|
57
58
|
- **final_answer**: Only if you have confidently validated the solution.
|
|
58
59
|
- **reset**: Immediately restart analysis if a critical error or incorrect result is identified.
|
|
59
|
-
6. **Confidence Score**: Provide a numeric confidence score (0.0–1.0) indicating your certainty in the step
|
|
60
|
+
6. **Confidence Score**: Provide a numeric confidence score (0.0–1.0) indicating your certainty in the step's correctness and its outcome.
|
|
60
61
|
|
|
61
62
|
Step 5 - Validation (mandatory before finalizing an answer):
|
|
62
63
|
- Explicitly validate your solution by:
|
|
@@ -82,6 +83,7 @@ def get_default_reasoning_agent(
|
|
|
82
83
|
- Only create a single instance of ReasoningSteps for your response.\
|
|
83
84
|
"""),
|
|
84
85
|
tools=tools,
|
|
86
|
+
tool_call_limit=tool_call_limit,
|
|
85
87
|
output_schema=ReasoningSteps,
|
|
86
88
|
use_json_mode=use_json_mode,
|
|
87
89
|
telemetry=telemetry,
|
agno/reasoning/gemini.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_gemini_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
"""Check if the model is a Gemini model with thinking support."""
|
|
12
|
+
is_gemini_class = reasoning_model.__class__.__name__ == "Gemini"
|
|
13
|
+
if not is_gemini_class:
|
|
14
|
+
return False
|
|
15
|
+
|
|
16
|
+
# Check if it's a Gemini 2.5+ model (supports thinking)
|
|
17
|
+
model_id = reasoning_model.id.lower()
|
|
18
|
+
has_thinking_support = "2.5" in model_id
|
|
19
|
+
|
|
20
|
+
# Also check if thinking parameters are set
|
|
21
|
+
# Note: thinking_budget=0 explicitly disables thinking mode per Google's API docs
|
|
22
|
+
has_thinking_budget = (
|
|
23
|
+
hasattr(reasoning_model, "thinking_budget")
|
|
24
|
+
and reasoning_model.thinking_budget is not None
|
|
25
|
+
and reasoning_model.thinking_budget > 0
|
|
26
|
+
)
|
|
27
|
+
has_include_thoughts = hasattr(reasoning_model, "include_thoughts") and reasoning_model.include_thoughts is not None
|
|
28
|
+
|
|
29
|
+
return is_gemini_class and (has_thinking_support or has_thinking_budget or has_include_thoughts)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def get_gemini_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
33
|
+
"""Get reasoning from a Gemini model."""
|
|
34
|
+
from agno.run.agent import RunOutput
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
38
|
+
except Exception as e:
|
|
39
|
+
logger.warning(f"Reasoning error: {e}")
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
reasoning_content: str = ""
|
|
43
|
+
if reasoning_agent_response.messages is not None:
|
|
44
|
+
for msg in reasoning_agent_response.messages:
|
|
45
|
+
if msg.reasoning_content is not None:
|
|
46
|
+
reasoning_content = msg.reasoning_content
|
|
47
|
+
break
|
|
48
|
+
|
|
49
|
+
return Message(
|
|
50
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
async def aget_gemini_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
55
|
+
"""Get reasoning from a Gemini model asynchronously."""
|
|
56
|
+
from agno.run.agent import RunOutput
|
|
57
|
+
|
|
58
|
+
try:
|
|
59
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
60
|
+
except Exception as e:
|
|
61
|
+
logger.warning(f"Reasoning error: {e}")
|
|
62
|
+
return None
|
|
63
|
+
|
|
64
|
+
reasoning_content: str = ""
|
|
65
|
+
if reasoning_agent_response.messages is not None:
|
|
66
|
+
for msg in reasoning_agent_response.messages:
|
|
67
|
+
if msg.reasoning_content is not None:
|
|
68
|
+
reasoning_content = msg.reasoning_content
|
|
69
|
+
break
|
|
70
|
+
|
|
71
|
+
return Message(
|
|
72
|
+
role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
|
|
73
|
+
)
|
agno/reasoning/groq.py
CHANGED
|
@@ -20,7 +20,7 @@ def get_groq_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Opt
|
|
|
20
20
|
message.role = "system"
|
|
21
21
|
|
|
22
22
|
try:
|
|
23
|
-
reasoning_agent_response: RunOutput = reasoning_agent.run(
|
|
23
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
24
24
|
except Exception as e:
|
|
25
25
|
logger.warning(f"Reasoning error: {e}")
|
|
26
26
|
return None
|
|
@@ -50,7 +50,7 @@ async def aget_groq_reasoning(reasoning_agent: "Agent", messages: List[Message])
|
|
|
50
50
|
message.role = "system"
|
|
51
51
|
|
|
52
52
|
try:
|
|
53
|
-
reasoning_agent_response: RunOutput = await reasoning_agent.arun(
|
|
53
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
54
54
|
except Exception as e:
|
|
55
55
|
logger.warning(f"Reasoning error: {e}")
|
|
56
56
|
return None
|
agno/reasoning/ollama.py
CHANGED
|
@@ -20,7 +20,7 @@ def get_ollama_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> O
|
|
|
20
20
|
from agno.run.agent import RunOutput
|
|
21
21
|
|
|
22
22
|
try:
|
|
23
|
-
reasoning_agent_response: RunOutput = reasoning_agent.run(
|
|
23
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
24
24
|
except Exception as e:
|
|
25
25
|
logger.warning(f"Reasoning error: {e}")
|
|
26
26
|
return None
|
|
@@ -46,7 +46,7 @@ async def aget_ollama_reasoning(reasoning_agent: "Agent", messages: List[Message
|
|
|
46
46
|
from agno.run.agent import RunOutput
|
|
47
47
|
|
|
48
48
|
try:
|
|
49
|
-
reasoning_agent_response: RunOutput = await reasoning_agent.arun(
|
|
49
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
50
50
|
except Exception as e:
|
|
51
51
|
logger.warning(f"Reasoning error: {e}")
|
|
52
52
|
return None
|
agno/reasoning/openai.py
CHANGED
|
@@ -28,8 +28,13 @@ def is_openai_reasoning_model(reasoning_model: Model) -> bool:
|
|
|
28
28
|
def get_openai_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
29
29
|
from agno.run.agent import RunOutput
|
|
30
30
|
|
|
31
|
+
# Update system message role to "system"
|
|
32
|
+
for message in messages:
|
|
33
|
+
if message.role == "developer":
|
|
34
|
+
message.role = "system"
|
|
35
|
+
|
|
31
36
|
try:
|
|
32
|
-
reasoning_agent_response: RunOutput = reasoning_agent.run(
|
|
37
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
33
38
|
except Exception as e:
|
|
34
39
|
logger.warning(f"Reasoning error: {e}")
|
|
35
40
|
return None
|
|
@@ -60,7 +65,7 @@ async def aget_openai_reasoning(reasoning_agent: "Agent", messages: List[Message
|
|
|
60
65
|
message.role = "system"
|
|
61
66
|
|
|
62
67
|
try:
|
|
63
|
-
reasoning_agent_response: RunOutput = await reasoning_agent.arun(
|
|
68
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
64
69
|
except Exception as e:
|
|
65
70
|
logger.warning(f"Reasoning error: {e}")
|
|
66
71
|
return None
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from agno.models.base import Model
|
|
6
|
+
from agno.models.message import Message
|
|
7
|
+
from agno.utils.log import logger
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def is_vertexai_reasoning_model(reasoning_model: Model) -> bool:
|
|
11
|
+
"""Check if the model is a VertexAI model with thinking support."""
|
|
12
|
+
# Check if provider is VertexAI
|
|
13
|
+
is_vertexai_provider = hasattr(reasoning_model, "provider") and reasoning_model.provider == "VertexAI"
|
|
14
|
+
|
|
15
|
+
# Check if thinking parameter is set
|
|
16
|
+
has_thinking = hasattr(reasoning_model, "thinking") and reasoning_model.thinking is not None
|
|
17
|
+
|
|
18
|
+
return is_vertexai_provider and has_thinking
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def get_vertexai_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
22
|
+
"""Get reasoning from a VertexAI Claude model."""
|
|
23
|
+
from agno.run.agent import RunOutput
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
|
|
27
|
+
except Exception as e:
|
|
28
|
+
logger.warning(f"Reasoning error: {e}")
|
|
29
|
+
return None
|
|
30
|
+
|
|
31
|
+
reasoning_content: str = ""
|
|
32
|
+
redacted_reasoning_content: Optional[str] = None
|
|
33
|
+
|
|
34
|
+
if reasoning_agent_response.messages is not None:
|
|
35
|
+
for msg in reasoning_agent_response.messages:
|
|
36
|
+
if msg.reasoning_content is not None:
|
|
37
|
+
reasoning_content = msg.reasoning_content
|
|
38
|
+
if hasattr(msg, "redacted_reasoning_content") and msg.redacted_reasoning_content is not None:
|
|
39
|
+
redacted_reasoning_content = msg.redacted_reasoning_content
|
|
40
|
+
break
|
|
41
|
+
|
|
42
|
+
return Message(
|
|
43
|
+
role="assistant",
|
|
44
|
+
content=f"<thinking>\n{reasoning_content}\n</thinking>",
|
|
45
|
+
reasoning_content=reasoning_content,
|
|
46
|
+
redacted_reasoning_content=redacted_reasoning_content,
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
async def aget_vertexai_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
|
|
51
|
+
"""Get reasoning from a VertexAI Claude model asynchronously."""
|
|
52
|
+
from agno.run.agent import RunOutput
|
|
53
|
+
|
|
54
|
+
try:
|
|
55
|
+
reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
|
|
56
|
+
except Exception as e:
|
|
57
|
+
logger.warning(f"Reasoning error: {e}")
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
reasoning_content: str = ""
|
|
61
|
+
redacted_reasoning_content: Optional[str] = None
|
|
62
|
+
|
|
63
|
+
if reasoning_agent_response.messages is not None:
|
|
64
|
+
for msg in reasoning_agent_response.messages:
|
|
65
|
+
if msg.reasoning_content is not None:
|
|
66
|
+
reasoning_content = msg.reasoning_content
|
|
67
|
+
if hasattr(msg, "redacted_reasoning_content") and msg.redacted_reasoning_content is not None:
|
|
68
|
+
redacted_reasoning_content = msg.redacted_reasoning_content
|
|
69
|
+
break
|
|
70
|
+
|
|
71
|
+
return Message(
|
|
72
|
+
role="assistant",
|
|
73
|
+
content=f"<thinking>\n{reasoning_content}\n</thinking>",
|
|
74
|
+
reasoning_content=reasoning_content,
|
|
75
|
+
redacted_reasoning_content=redacted_reasoning_content,
|
|
76
|
+
)
|