agno 2.2.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/__init__.py +8 -0
- agno/agent/__init__.py +51 -0
- agno/agent/agent.py +10405 -0
- agno/api/__init__.py +0 -0
- agno/api/agent.py +28 -0
- agno/api/api.py +40 -0
- agno/api/evals.py +22 -0
- agno/api/os.py +17 -0
- agno/api/routes.py +13 -0
- agno/api/schemas/__init__.py +9 -0
- agno/api/schemas/agent.py +16 -0
- agno/api/schemas/evals.py +16 -0
- agno/api/schemas/os.py +14 -0
- agno/api/schemas/response.py +6 -0
- agno/api/schemas/team.py +16 -0
- agno/api/schemas/utils.py +21 -0
- agno/api/schemas/workflows.py +16 -0
- agno/api/settings.py +53 -0
- agno/api/team.py +30 -0
- agno/api/workflow.py +28 -0
- agno/cloud/aws/base.py +214 -0
- agno/cloud/aws/s3/__init__.py +2 -0
- agno/cloud/aws/s3/api_client.py +43 -0
- agno/cloud/aws/s3/bucket.py +195 -0
- agno/cloud/aws/s3/object.py +57 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/__init__.py +24 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +598 -0
- agno/db/dynamo/__init__.py +3 -0
- agno/db/dynamo/dynamo.py +2042 -0
- agno/db/dynamo/schemas.py +314 -0
- agno/db/dynamo/utils.py +743 -0
- agno/db/firestore/__init__.py +3 -0
- agno/db/firestore/firestore.py +1795 -0
- agno/db/firestore/schemas.py +140 -0
- agno/db/firestore/utils.py +376 -0
- agno/db/gcs_json/__init__.py +3 -0
- agno/db/gcs_json/gcs_json_db.py +1335 -0
- agno/db/gcs_json/utils.py +228 -0
- agno/db/in_memory/__init__.py +3 -0
- agno/db/in_memory/in_memory_db.py +1160 -0
- agno/db/in_memory/utils.py +230 -0
- agno/db/json/__init__.py +3 -0
- agno/db/json/json_db.py +1328 -0
- agno/db/json/utils.py +230 -0
- agno/db/migrations/__init__.py +0 -0
- agno/db/migrations/v1_to_v2.py +635 -0
- agno/db/mongo/__init__.py +17 -0
- agno/db/mongo/async_mongo.py +2026 -0
- agno/db/mongo/mongo.py +1982 -0
- agno/db/mongo/schemas.py +87 -0
- agno/db/mongo/utils.py +259 -0
- agno/db/mysql/__init__.py +3 -0
- agno/db/mysql/mysql.py +2308 -0
- agno/db/mysql/schemas.py +138 -0
- agno/db/mysql/utils.py +355 -0
- agno/db/postgres/__init__.py +4 -0
- agno/db/postgres/async_postgres.py +1927 -0
- agno/db/postgres/postgres.py +2260 -0
- agno/db/postgres/schemas.py +139 -0
- agno/db/postgres/utils.py +442 -0
- agno/db/redis/__init__.py +3 -0
- agno/db/redis/redis.py +1660 -0
- agno/db/redis/schemas.py +123 -0
- agno/db/redis/utils.py +346 -0
- agno/db/schemas/__init__.py +4 -0
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +33 -0
- agno/db/schemas/knowledge.py +40 -0
- agno/db/schemas/memory.py +46 -0
- agno/db/schemas/metrics.py +0 -0
- agno/db/singlestore/__init__.py +3 -0
- agno/db/singlestore/schemas.py +130 -0
- agno/db/singlestore/singlestore.py +2272 -0
- agno/db/singlestore/utils.py +384 -0
- agno/db/sqlite/__init__.py +4 -0
- agno/db/sqlite/async_sqlite.py +2293 -0
- agno/db/sqlite/schemas.py +133 -0
- agno/db/sqlite/sqlite.py +2288 -0
- agno/db/sqlite/utils.py +431 -0
- 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 +1353 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +116 -0
- agno/debug.py +18 -0
- agno/eval/__init__.py +14 -0
- agno/eval/accuracy.py +834 -0
- agno/eval/performance.py +773 -0
- agno/eval/reliability.py +306 -0
- agno/eval/utils.py +119 -0
- agno/exceptions.py +161 -0
- 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/__init__.py +0 -0
- agno/integrations/discord/__init__.py +3 -0
- agno/integrations/discord/client.py +203 -0
- agno/knowledge/__init__.py +5 -0
- agno/knowledge/chunking/__init__.py +0 -0
- agno/knowledge/chunking/agentic.py +79 -0
- agno/knowledge/chunking/document.py +91 -0
- agno/knowledge/chunking/fixed.py +57 -0
- agno/knowledge/chunking/markdown.py +151 -0
- agno/knowledge/chunking/recursive.py +63 -0
- agno/knowledge/chunking/row.py +39 -0
- agno/knowledge/chunking/semantic.py +86 -0
- agno/knowledge/chunking/strategy.py +165 -0
- agno/knowledge/content.py +74 -0
- agno/knowledge/document/__init__.py +5 -0
- agno/knowledge/document/base.py +58 -0
- agno/knowledge/embedder/__init__.py +5 -0
- agno/knowledge/embedder/aws_bedrock.py +343 -0
- agno/knowledge/embedder/azure_openai.py +210 -0
- agno/knowledge/embedder/base.py +23 -0
- agno/knowledge/embedder/cohere.py +323 -0
- agno/knowledge/embedder/fastembed.py +62 -0
- agno/knowledge/embedder/fireworks.py +13 -0
- agno/knowledge/embedder/google.py +258 -0
- agno/knowledge/embedder/huggingface.py +94 -0
- agno/knowledge/embedder/jina.py +182 -0
- agno/knowledge/embedder/langdb.py +22 -0
- agno/knowledge/embedder/mistral.py +206 -0
- agno/knowledge/embedder/nebius.py +13 -0
- agno/knowledge/embedder/ollama.py +154 -0
- agno/knowledge/embedder/openai.py +195 -0
- agno/knowledge/embedder/sentence_transformer.py +63 -0
- agno/knowledge/embedder/together.py +13 -0
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +165 -0
- agno/knowledge/knowledge.py +1988 -0
- agno/knowledge/reader/__init__.py +7 -0
- agno/knowledge/reader/arxiv_reader.py +81 -0
- agno/knowledge/reader/base.py +95 -0
- agno/knowledge/reader/csv_reader.py +166 -0
- agno/knowledge/reader/docx_reader.py +82 -0
- agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
- agno/knowledge/reader/firecrawl_reader.py +201 -0
- agno/knowledge/reader/json_reader.py +87 -0
- agno/knowledge/reader/markdown_reader.py +137 -0
- agno/knowledge/reader/pdf_reader.py +431 -0
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +313 -0
- agno/knowledge/reader/s3_reader.py +89 -0
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +115 -0
- agno/knowledge/reader/web_search_reader.py +372 -0
- agno/knowledge/reader/website_reader.py +455 -0
- agno/knowledge/reader/wikipedia_reader.py +59 -0
- agno/knowledge/reader/youtube_reader.py +78 -0
- agno/knowledge/remote_content/__init__.py +0 -0
- agno/knowledge/remote_content/remote_content.py +88 -0
- agno/knowledge/reranker/__init__.py +3 -0
- agno/knowledge/reranker/base.py +14 -0
- agno/knowledge/reranker/cohere.py +64 -0
- agno/knowledge/reranker/infinity.py +195 -0
- agno/knowledge/reranker/sentence_transformer.py +54 -0
- agno/knowledge/types.py +39 -0
- agno/knowledge/utils.py +189 -0
- agno/media.py +462 -0
- agno/memory/__init__.py +3 -0
- agno/memory/manager.py +1327 -0
- agno/models/__init__.py +0 -0
- agno/models/aimlapi/__init__.py +5 -0
- agno/models/aimlapi/aimlapi.py +45 -0
- agno/models/anthropic/__init__.py +5 -0
- agno/models/anthropic/claude.py +757 -0
- agno/models/aws/__init__.py +15 -0
- agno/models/aws/bedrock.py +701 -0
- agno/models/aws/claude.py +378 -0
- agno/models/azure/__init__.py +18 -0
- agno/models/azure/ai_foundry.py +485 -0
- agno/models/azure/openai_chat.py +131 -0
- agno/models/base.py +2175 -0
- agno/models/cerebras/__init__.py +12 -0
- agno/models/cerebras/cerebras.py +501 -0
- agno/models/cerebras/cerebras_openai.py +112 -0
- agno/models/cohere/__init__.py +5 -0
- agno/models/cohere/chat.py +389 -0
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/__init__.py +5 -0
- agno/models/dashscope/dashscope.py +91 -0
- agno/models/deepinfra/__init__.py +5 -0
- agno/models/deepinfra/deepinfra.py +28 -0
- agno/models/deepseek/__init__.py +5 -0
- agno/models/deepseek/deepseek.py +61 -0
- agno/models/defaults.py +1 -0
- agno/models/fireworks/__init__.py +5 -0
- agno/models/fireworks/fireworks.py +26 -0
- agno/models/google/__init__.py +5 -0
- agno/models/google/gemini.py +1085 -0
- agno/models/groq/__init__.py +5 -0
- agno/models/groq/groq.py +556 -0
- agno/models/huggingface/__init__.py +5 -0
- agno/models/huggingface/huggingface.py +491 -0
- agno/models/ibm/__init__.py +5 -0
- agno/models/ibm/watsonx.py +422 -0
- agno/models/internlm/__init__.py +3 -0
- agno/models/internlm/internlm.py +26 -0
- agno/models/langdb/__init__.py +1 -0
- agno/models/langdb/langdb.py +48 -0
- agno/models/litellm/__init__.py +14 -0
- agno/models/litellm/chat.py +468 -0
- agno/models/litellm/litellm_openai.py +25 -0
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/lmstudio/__init__.py +5 -0
- agno/models/lmstudio/lmstudio.py +25 -0
- agno/models/message.py +434 -0
- agno/models/meta/__init__.py +12 -0
- agno/models/meta/llama.py +475 -0
- agno/models/meta/llama_openai.py +78 -0
- agno/models/metrics.py +120 -0
- agno/models/mistral/__init__.py +5 -0
- agno/models/mistral/mistral.py +432 -0
- agno/models/nebius/__init__.py +3 -0
- agno/models/nebius/nebius.py +54 -0
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/__init__.py +5 -0
- agno/models/nvidia/nvidia.py +28 -0
- agno/models/ollama/__init__.py +5 -0
- agno/models/ollama/chat.py +441 -0
- agno/models/openai/__init__.py +9 -0
- agno/models/openai/chat.py +883 -0
- agno/models/openai/like.py +27 -0
- agno/models/openai/responses.py +1050 -0
- agno/models/openrouter/__init__.py +5 -0
- agno/models/openrouter/openrouter.py +66 -0
- agno/models/perplexity/__init__.py +5 -0
- agno/models/perplexity/perplexity.py +187 -0
- agno/models/portkey/__init__.py +3 -0
- agno/models/portkey/portkey.py +81 -0
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +199 -0
- agno/models/sambanova/__init__.py +5 -0
- agno/models/sambanova/sambanova.py +28 -0
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/__init__.py +5 -0
- agno/models/together/together.py +25 -0
- agno/models/utils.py +266 -0
- agno/models/vercel/__init__.py +3 -0
- agno/models/vercel/v0.py +26 -0
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +70 -0
- agno/models/vllm/__init__.py +3 -0
- agno/models/vllm/vllm.py +78 -0
- agno/models/xai/__init__.py +3 -0
- agno/models/xai/xai.py +113 -0
- agno/os/__init__.py +3 -0
- agno/os/app.py +876 -0
- agno/os/auth.py +57 -0
- agno/os/config.py +104 -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/__init__.py +3 -0
- agno/os/interfaces/agui/agui.py +47 -0
- agno/os/interfaces/agui/router.py +144 -0
- agno/os/interfaces/agui/utils.py +534 -0
- agno/os/interfaces/base.py +25 -0
- agno/os/interfaces/slack/__init__.py +3 -0
- agno/os/interfaces/slack/router.py +148 -0
- agno/os/interfaces/slack/security.py +30 -0
- agno/os/interfaces/slack/slack.py +47 -0
- agno/os/interfaces/whatsapp/__init__.py +3 -0
- agno/os/interfaces/whatsapp/router.py +211 -0
- agno/os/interfaces/whatsapp/security.py +53 -0
- agno/os/interfaces/whatsapp/whatsapp.py +36 -0
- agno/os/mcp.py +292 -0
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +1763 -0
- agno/os/routers/__init__.py +3 -0
- agno/os/routers/evals/__init__.py +3 -0
- agno/os/routers/evals/evals.py +430 -0
- agno/os/routers/evals/schemas.py +142 -0
- agno/os/routers/evals/utils.py +162 -0
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/__init__.py +3 -0
- agno/os/routers/knowledge/knowledge.py +997 -0
- agno/os/routers/knowledge/schemas.py +178 -0
- agno/os/routers/memory/__init__.py +3 -0
- agno/os/routers/memory/memory.py +515 -0
- agno/os/routers/memory/schemas.py +62 -0
- agno/os/routers/metrics/__init__.py +3 -0
- agno/os/routers/metrics/metrics.py +190 -0
- agno/os/routers/metrics/schemas.py +47 -0
- agno/os/routers/session/__init__.py +3 -0
- agno/os/routers/session/session.py +997 -0
- agno/os/schema.py +1055 -0
- agno/os/settings.py +43 -0
- agno/os/utils.py +630 -0
- agno/py.typed +0 -0
- agno/reasoning/__init__.py +0 -0
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +67 -0
- agno/reasoning/deepseek.py +63 -0
- agno/reasoning/default.py +97 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +71 -0
- agno/reasoning/helpers.py +63 -0
- agno/reasoning/ollama.py +67 -0
- agno/reasoning/openai.py +86 -0
- agno/reasoning/step.py +31 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +787 -0
- agno/run/base.py +229 -0
- agno/run/cancel.py +81 -0
- agno/run/messages.py +32 -0
- agno/run/team.py +753 -0
- agno/run/workflow.py +708 -0
- agno/session/__init__.py +10 -0
- agno/session/agent.py +295 -0
- agno/session/summary.py +265 -0
- agno/session/team.py +392 -0
- agno/session/workflow.py +205 -0
- agno/team/__init__.py +37 -0
- agno/team/team.py +8793 -0
- agno/tools/__init__.py +10 -0
- agno/tools/agentql.py +120 -0
- agno/tools/airflow.py +69 -0
- agno/tools/api.py +122 -0
- agno/tools/apify.py +314 -0
- agno/tools/arxiv.py +127 -0
- agno/tools/aws_lambda.py +53 -0
- agno/tools/aws_ses.py +66 -0
- agno/tools/baidusearch.py +89 -0
- agno/tools/bitbucket.py +292 -0
- agno/tools/brandfetch.py +213 -0
- agno/tools/bravesearch.py +106 -0
- agno/tools/brightdata.py +367 -0
- agno/tools/browserbase.py +209 -0
- agno/tools/calcom.py +255 -0
- agno/tools/calculator.py +151 -0
- agno/tools/cartesia.py +187 -0
- agno/tools/clickup.py +244 -0
- agno/tools/confluence.py +240 -0
- agno/tools/crawl4ai.py +158 -0
- agno/tools/csv_toolkit.py +185 -0
- agno/tools/dalle.py +110 -0
- agno/tools/daytona.py +475 -0
- agno/tools/decorator.py +262 -0
- agno/tools/desi_vocal.py +108 -0
- agno/tools/discord.py +161 -0
- agno/tools/docker.py +716 -0
- agno/tools/duckdb.py +379 -0
- agno/tools/duckduckgo.py +91 -0
- agno/tools/e2b.py +703 -0
- agno/tools/eleven_labs.py +196 -0
- agno/tools/email.py +67 -0
- agno/tools/evm.py +129 -0
- agno/tools/exa.py +396 -0
- agno/tools/fal.py +127 -0
- agno/tools/file.py +240 -0
- agno/tools/file_generation.py +350 -0
- agno/tools/financial_datasets.py +288 -0
- agno/tools/firecrawl.py +143 -0
- agno/tools/function.py +1187 -0
- agno/tools/giphy.py +93 -0
- agno/tools/github.py +1760 -0
- agno/tools/gmail.py +922 -0
- agno/tools/google_bigquery.py +117 -0
- agno/tools/google_drive.py +270 -0
- agno/tools/google_maps.py +253 -0
- agno/tools/googlecalendar.py +674 -0
- agno/tools/googlesearch.py +98 -0
- agno/tools/googlesheets.py +377 -0
- agno/tools/hackernews.py +77 -0
- agno/tools/jina.py +101 -0
- agno/tools/jira.py +170 -0
- agno/tools/knowledge.py +218 -0
- agno/tools/linear.py +426 -0
- agno/tools/linkup.py +58 -0
- agno/tools/local_file_system.py +90 -0
- agno/tools/lumalab.py +183 -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 +284 -0
- agno/tools/mem0.py +193 -0
- agno/tools/memori.py +339 -0
- agno/tools/memory.py +419 -0
- agno/tools/mlx_transcribe.py +139 -0
- agno/tools/models/__init__.py +0 -0
- agno/tools/models/azure_openai.py +190 -0
- agno/tools/models/gemini.py +203 -0
- agno/tools/models/groq.py +158 -0
- agno/tools/models/morph.py +186 -0
- agno/tools/models/nebius.py +124 -0
- agno/tools/models_labs.py +195 -0
- agno/tools/moviepy_video.py +349 -0
- agno/tools/neo4j.py +134 -0
- agno/tools/newspaper.py +46 -0
- agno/tools/newspaper4k.py +93 -0
- agno/tools/notion.py +204 -0
- agno/tools/openai.py +202 -0
- agno/tools/openbb.py +160 -0
- agno/tools/opencv.py +321 -0
- agno/tools/openweather.py +233 -0
- agno/tools/oxylabs.py +385 -0
- agno/tools/pandas.py +102 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +257 -0
- agno/tools/pubmed.py +188 -0
- agno/tools/python.py +205 -0
- agno/tools/reasoning.py +283 -0
- agno/tools/reddit.py +467 -0
- agno/tools/replicate.py +117 -0
- agno/tools/resend.py +62 -0
- agno/tools/scrapegraph.py +222 -0
- agno/tools/searxng.py +152 -0
- agno/tools/serpapi.py +116 -0
- agno/tools/serper.py +255 -0
- agno/tools/shell.py +53 -0
- agno/tools/slack.py +136 -0
- agno/tools/sleep.py +20 -0
- agno/tools/spider.py +116 -0
- agno/tools/sql.py +154 -0
- agno/tools/streamlit/__init__.py +0 -0
- agno/tools/streamlit/components.py +113 -0
- agno/tools/tavily.py +254 -0
- agno/tools/telegram.py +48 -0
- agno/tools/todoist.py +218 -0
- agno/tools/tool_registry.py +1 -0
- agno/tools/toolkit.py +146 -0
- agno/tools/trafilatura.py +388 -0
- agno/tools/trello.py +274 -0
- agno/tools/twilio.py +186 -0
- agno/tools/user_control_flow.py +78 -0
- agno/tools/valyu.py +228 -0
- agno/tools/visualization.py +467 -0
- agno/tools/webbrowser.py +28 -0
- agno/tools/webex.py +76 -0
- agno/tools/website.py +54 -0
- agno/tools/webtools.py +45 -0
- agno/tools/whatsapp.py +286 -0
- agno/tools/wikipedia.py +63 -0
- agno/tools/workflow.py +278 -0
- agno/tools/x.py +335 -0
- agno/tools/yfinance.py +257 -0
- agno/tools/youtube.py +184 -0
- agno/tools/zendesk.py +82 -0
- agno/tools/zep.py +454 -0
- agno/tools/zoom.py +382 -0
- agno/utils/__init__.py +0 -0
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +49 -0
- agno/utils/certs.py +27 -0
- agno/utils/code_execution.py +11 -0
- agno/utils/common.py +132 -0
- agno/utils/dttm.py +13 -0
- agno/utils/enum.py +22 -0
- agno/utils/env.py +11 -0
- agno/utils/events.py +696 -0
- agno/utils/format_str.py +16 -0
- agno/utils/functions.py +166 -0
- agno/utils/gemini.py +426 -0
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +74 -0
- agno/utils/json_schema.py +234 -0
- agno/utils/knowledge.py +36 -0
- agno/utils/location.py +19 -0
- agno/utils/log.py +255 -0
- agno/utils/mcp.py +214 -0
- agno/utils/media.py +352 -0
- agno/utils/merge_dict.py +41 -0
- agno/utils/message.py +118 -0
- agno/utils/models/__init__.py +0 -0
- agno/utils/models/ai_foundry.py +43 -0
- agno/utils/models/claude.py +358 -0
- agno/utils/models/cohere.py +87 -0
- agno/utils/models/llama.py +78 -0
- agno/utils/models/mistral.py +98 -0
- agno/utils/models/openai_responses.py +140 -0
- agno/utils/models/schema_utils.py +153 -0
- agno/utils/models/watsonx.py +41 -0
- agno/utils/openai.py +257 -0
- agno/utils/pickle.py +32 -0
- agno/utils/pprint.py +178 -0
- agno/utils/print_response/__init__.py +0 -0
- agno/utils/print_response/agent.py +842 -0
- agno/utils/print_response/team.py +1724 -0
- agno/utils/print_response/workflow.py +1668 -0
- agno/utils/prompts.py +111 -0
- agno/utils/reasoning.py +108 -0
- agno/utils/response.py +163 -0
- agno/utils/response_iterator.py +17 -0
- agno/utils/safe_formatter.py +24 -0
- agno/utils/serialize.py +32 -0
- agno/utils/shell.py +22 -0
- agno/utils/streamlit.py +487 -0
- agno/utils/string.py +231 -0
- agno/utils/team.py +139 -0
- agno/utils/timer.py +41 -0
- agno/utils/tools.py +102 -0
- agno/utils/web.py +23 -0
- agno/utils/whatsapp.py +305 -0
- agno/utils/yaml_io.py +25 -0
- agno/vectordb/__init__.py +3 -0
- agno/vectordb/base.py +127 -0
- agno/vectordb/cassandra/__init__.py +5 -0
- agno/vectordb/cassandra/cassandra.py +501 -0
- agno/vectordb/cassandra/extra_param_mixin.py +11 -0
- agno/vectordb/cassandra/index.py +13 -0
- agno/vectordb/chroma/__init__.py +5 -0
- agno/vectordb/chroma/chromadb.py +929 -0
- agno/vectordb/clickhouse/__init__.py +9 -0
- agno/vectordb/clickhouse/clickhousedb.py +835 -0
- agno/vectordb/clickhouse/index.py +9 -0
- agno/vectordb/couchbase/__init__.py +3 -0
- agno/vectordb/couchbase/couchbase.py +1442 -0
- agno/vectordb/distance.py +7 -0
- agno/vectordb/lancedb/__init__.py +6 -0
- agno/vectordb/lancedb/lance_db.py +995 -0
- agno/vectordb/langchaindb/__init__.py +5 -0
- agno/vectordb/langchaindb/langchaindb.py +163 -0
- agno/vectordb/lightrag/__init__.py +5 -0
- agno/vectordb/lightrag/lightrag.py +388 -0
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +166 -0
- agno/vectordb/milvus/__init__.py +4 -0
- agno/vectordb/milvus/milvus.py +1182 -0
- agno/vectordb/mongodb/__init__.py +9 -0
- agno/vectordb/mongodb/mongodb.py +1417 -0
- agno/vectordb/pgvector/__init__.py +12 -0
- agno/vectordb/pgvector/index.py +23 -0
- agno/vectordb/pgvector/pgvector.py +1462 -0
- agno/vectordb/pineconedb/__init__.py +5 -0
- agno/vectordb/pineconedb/pineconedb.py +747 -0
- agno/vectordb/qdrant/__init__.py +5 -0
- agno/vectordb/qdrant/qdrant.py +1134 -0
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/search.py +7 -0
- agno/vectordb/singlestore/__init__.py +10 -0
- agno/vectordb/singlestore/index.py +41 -0
- agno/vectordb/singlestore/singlestore.py +763 -0
- agno/vectordb/surrealdb/__init__.py +3 -0
- agno/vectordb/surrealdb/surrealdb.py +699 -0
- agno/vectordb/upstashdb/__init__.py +5 -0
- agno/vectordb/upstashdb/upstashdb.py +718 -0
- agno/vectordb/weaviate/__init__.py +8 -0
- agno/vectordb/weaviate/index.py +15 -0
- agno/vectordb/weaviate/weaviate.py +1005 -0
- agno/workflow/__init__.py +23 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +738 -0
- agno/workflow/loop.py +735 -0
- agno/workflow/parallel.py +824 -0
- agno/workflow/router.py +702 -0
- agno/workflow/step.py +1432 -0
- agno/workflow/steps.py +592 -0
- agno/workflow/types.py +520 -0
- agno/workflow/workflow.py +4321 -0
- agno-2.2.13.dist-info/METADATA +614 -0
- agno-2.2.13.dist-info/RECORD +575 -0
- agno-2.2.13.dist-info/WHEEL +5 -0
- agno-2.2.13.dist-info/licenses/LICENSE +201 -0
- agno-2.2.13.dist-info/top_level.txt +1 -0
agno/utils/streamlit.py
ADDED
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Any, Callable, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
try:
|
|
5
|
+
from agno.agent import Agent
|
|
6
|
+
from agno.db.base import SessionType
|
|
7
|
+
from agno.models.anthropic import Claude
|
|
8
|
+
from agno.models.google import Gemini
|
|
9
|
+
from agno.models.openai import OpenAIChat
|
|
10
|
+
from agno.utils.log import logger
|
|
11
|
+
except ImportError:
|
|
12
|
+
raise ImportError("`agno` not installed. Please install using `pip install agno`")
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
import streamlit as st
|
|
16
|
+
except ImportError:
|
|
17
|
+
raise ImportError("`streamlit` not installed. Please install using `pip install streamlit`")
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def add_message(role: str, content: str, tool_calls: Optional[List[Dict[str, Any]]] = None) -> None:
|
|
21
|
+
"""Add a message to the session state."""
|
|
22
|
+
if "messages" not in st.session_state:
|
|
23
|
+
st.session_state["messages"] = []
|
|
24
|
+
|
|
25
|
+
message: Dict[str, Any] = {"role": role, "content": content}
|
|
26
|
+
if tool_calls:
|
|
27
|
+
message["tool_calls"] = tool_calls
|
|
28
|
+
|
|
29
|
+
st.session_state["messages"].append(message)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def display_tool_calls(container, tools: List[Any]):
|
|
33
|
+
"""Display tool calls in expandable sections."""
|
|
34
|
+
if not tools:
|
|
35
|
+
return
|
|
36
|
+
|
|
37
|
+
with container.container():
|
|
38
|
+
for tool in tools:
|
|
39
|
+
if hasattr(tool, "tool_name"):
|
|
40
|
+
name = tool.tool_name or "Tool"
|
|
41
|
+
args = tool.tool_args or {}
|
|
42
|
+
result = tool.result or ""
|
|
43
|
+
else:
|
|
44
|
+
name = tool.get("tool_name") or tool.get("name") or "Tool"
|
|
45
|
+
args = tool.get("tool_args") or tool.get("args") or {}
|
|
46
|
+
result = tool.get("result") or tool.get("content") or ""
|
|
47
|
+
|
|
48
|
+
with st.expander(f"đ ī¸ {name.replace('_', ' ')}", expanded=False):
|
|
49
|
+
if args:
|
|
50
|
+
st.markdown("**Arguments:**")
|
|
51
|
+
st.json(args)
|
|
52
|
+
if result:
|
|
53
|
+
st.markdown("**Result:**")
|
|
54
|
+
st.json(result)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def session_selector_widget(agent: Agent, model_id: str, agent_creation_callback: Callable[[str, str], Agent]) -> None:
|
|
58
|
+
"""Session selector widget"""
|
|
59
|
+
if not agent.db:
|
|
60
|
+
st.sidebar.info("đĄ Database not configured. Sessions will not be saved.")
|
|
61
|
+
return
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
sessions = agent.db.get_sessions(
|
|
65
|
+
session_type=SessionType.AGENT,
|
|
66
|
+
deserialize=True,
|
|
67
|
+
sort_by="created_at",
|
|
68
|
+
sort_order="desc",
|
|
69
|
+
)
|
|
70
|
+
except Exception as e:
|
|
71
|
+
logger.error(f"Error fetching sessions: {e}")
|
|
72
|
+
st.sidebar.error("Could not load sessions")
|
|
73
|
+
return
|
|
74
|
+
|
|
75
|
+
if not sessions:
|
|
76
|
+
st.sidebar.info("đ New Chat - Start your conversation!")
|
|
77
|
+
return
|
|
78
|
+
|
|
79
|
+
# Filter session data
|
|
80
|
+
session_options = []
|
|
81
|
+
session_dict = {}
|
|
82
|
+
|
|
83
|
+
for session in sessions: # type: ignore
|
|
84
|
+
if not hasattr(session, "session_id") or not session.session_id:
|
|
85
|
+
continue
|
|
86
|
+
|
|
87
|
+
session_id = session.session_id
|
|
88
|
+
session_name = None
|
|
89
|
+
|
|
90
|
+
# Extract session name from session_data
|
|
91
|
+
if hasattr(session, "session_data") and session.session_data:
|
|
92
|
+
session_name = session.session_data.get("session_name")
|
|
93
|
+
|
|
94
|
+
name = session_name or session_id
|
|
95
|
+
session_options.append(name)
|
|
96
|
+
session_dict[name] = session_id
|
|
97
|
+
|
|
98
|
+
current_session_id = st.session_state.get("session_id")
|
|
99
|
+
current_selection = None
|
|
100
|
+
|
|
101
|
+
if current_session_id and current_session_id not in [s_id for s_id in session_dict.values()]:
|
|
102
|
+
logger.info(f"New session: {current_session_id}")
|
|
103
|
+
if agent.get_session_name():
|
|
104
|
+
current_display_name = agent.get_session_name()
|
|
105
|
+
else:
|
|
106
|
+
current_display_name = f"{current_session_id[:8]}..."
|
|
107
|
+
session_options.insert(0, current_display_name)
|
|
108
|
+
session_dict[current_display_name] = current_session_id
|
|
109
|
+
current_selection = current_display_name
|
|
110
|
+
st.session_state["is_new_session"] = True
|
|
111
|
+
|
|
112
|
+
for display_name, session_id in session_dict.items():
|
|
113
|
+
if session_id == current_session_id:
|
|
114
|
+
current_selection = display_name
|
|
115
|
+
break
|
|
116
|
+
|
|
117
|
+
display_options = session_options
|
|
118
|
+
selected_index = (
|
|
119
|
+
session_options.index(current_selection)
|
|
120
|
+
if current_selection and current_selection in session_options
|
|
121
|
+
else 0
|
|
122
|
+
if session_options
|
|
123
|
+
else None
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
if not display_options:
|
|
127
|
+
st.sidebar.info("đ Start your first conversation!")
|
|
128
|
+
return
|
|
129
|
+
|
|
130
|
+
selected = st.sidebar.selectbox(
|
|
131
|
+
label="Session",
|
|
132
|
+
options=display_options,
|
|
133
|
+
index=selected_index,
|
|
134
|
+
help="Select a session to continue",
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
if selected and selected in session_dict:
|
|
138
|
+
selected_session_id = session_dict[selected]
|
|
139
|
+
if selected_session_id != current_session_id:
|
|
140
|
+
if not st.session_state.get("is_new_session", False):
|
|
141
|
+
st.session_state["is_loading_session"] = True
|
|
142
|
+
try:
|
|
143
|
+
_load_session(selected_session_id, model_id, agent_creation_callback)
|
|
144
|
+
finally:
|
|
145
|
+
# Always clear the loading flag, even if there's an error
|
|
146
|
+
st.session_state["is_loading_session"] = False
|
|
147
|
+
else:
|
|
148
|
+
# Clear the new session flag since we're done with initialization
|
|
149
|
+
st.session_state["is_new_session"] = False
|
|
150
|
+
|
|
151
|
+
# Rename session
|
|
152
|
+
if agent.session_id:
|
|
153
|
+
if "session_edit_mode" not in st.session_state:
|
|
154
|
+
st.session_state.session_edit_mode = False
|
|
155
|
+
|
|
156
|
+
current_name = agent.get_session_name() or agent.session_id
|
|
157
|
+
|
|
158
|
+
if not st.session_state.session_edit_mode:
|
|
159
|
+
col1, col2 = st.sidebar.columns([3, 1])
|
|
160
|
+
with col1:
|
|
161
|
+
st.write(f"**Session:** {current_name}")
|
|
162
|
+
with col2:
|
|
163
|
+
if st.button("â", help="Rename session", key="rename_session_button"):
|
|
164
|
+
st.session_state.session_edit_mode = True
|
|
165
|
+
st.rerun()
|
|
166
|
+
else:
|
|
167
|
+
new_name = st.sidebar.text_input("Enter new name:", value=current_name, key="session_name_input")
|
|
168
|
+
|
|
169
|
+
col1, col2 = st.sidebar.columns([1, 1])
|
|
170
|
+
with col1:
|
|
171
|
+
if st.button(
|
|
172
|
+
"đž Save",
|
|
173
|
+
type="primary",
|
|
174
|
+
use_container_width=True,
|
|
175
|
+
key="save_session_name",
|
|
176
|
+
):
|
|
177
|
+
if new_name and new_name.strip():
|
|
178
|
+
try:
|
|
179
|
+
result = agent.set_session_name(session_name=new_name.strip())
|
|
180
|
+
|
|
181
|
+
if result:
|
|
182
|
+
logger.info(f"Session renamed to: {new_name.strip()}")
|
|
183
|
+
# Clear any cached session data to ensure fresh reload
|
|
184
|
+
if hasattr(agent, "_agent_session") and agent._agent_session:
|
|
185
|
+
agent._agent_session = None
|
|
186
|
+
st.session_state.session_edit_mode = False
|
|
187
|
+
st.sidebar.success("Session renamed!")
|
|
188
|
+
st.rerun()
|
|
189
|
+
except Exception as e:
|
|
190
|
+
logger.error(f"Error renaming session: {e}")
|
|
191
|
+
st.sidebar.error(f"Error: {str(e)}")
|
|
192
|
+
else:
|
|
193
|
+
st.sidebar.error("Please enter a valid name")
|
|
194
|
+
|
|
195
|
+
with col2:
|
|
196
|
+
if st.button("â Cancel", use_container_width=True, key="cancel_session_rename"):
|
|
197
|
+
st.session_state.session_edit_mode = False
|
|
198
|
+
st.rerun()
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def _load_session(session_id: str, model_id: str, agent_creation_callback: Callable[[str, str], Agent]):
|
|
202
|
+
try:
|
|
203
|
+
logger.info(f"Creating agent with session_id: {session_id}")
|
|
204
|
+
new_agent = agent_creation_callback(model_id, session_id)
|
|
205
|
+
|
|
206
|
+
st.session_state["agent"] = new_agent
|
|
207
|
+
st.session_state["session_id"] = session_id
|
|
208
|
+
st.session_state["messages"] = []
|
|
209
|
+
st.session_state["current_model"] = model_id # Keep current_model in sync
|
|
210
|
+
|
|
211
|
+
try:
|
|
212
|
+
if new_agent.db:
|
|
213
|
+
selected_session = new_agent.db.get_session(
|
|
214
|
+
session_id=session_id, session_type=SessionType.AGENT, deserialize=True
|
|
215
|
+
)
|
|
216
|
+
else:
|
|
217
|
+
selected_session = None
|
|
218
|
+
|
|
219
|
+
# Recreate the chat history
|
|
220
|
+
if selected_session:
|
|
221
|
+
if hasattr(selected_session, "runs") and selected_session.runs:
|
|
222
|
+
for run_idx, run in enumerate(selected_session.runs):
|
|
223
|
+
messages = getattr(run, "messages", None)
|
|
224
|
+
|
|
225
|
+
if messages:
|
|
226
|
+
user_msg = None
|
|
227
|
+
assistant_msg = None
|
|
228
|
+
tool_calls = []
|
|
229
|
+
|
|
230
|
+
for msg_idx, message in enumerate(messages):
|
|
231
|
+
if not hasattr(message, "role") or not hasattr(message, "content"):
|
|
232
|
+
continue
|
|
233
|
+
|
|
234
|
+
role = message.role
|
|
235
|
+
content = str(message.content) if message.content else ""
|
|
236
|
+
|
|
237
|
+
if role == "user":
|
|
238
|
+
if content and content.strip():
|
|
239
|
+
user_msg = content.strip()
|
|
240
|
+
elif role == "assistant":
|
|
241
|
+
if content and content.strip() and content.strip().lower() != "none":
|
|
242
|
+
assistant_msg = content
|
|
243
|
+
|
|
244
|
+
# Display tool calls for this run
|
|
245
|
+
if hasattr(run, "tools") and run.tools:
|
|
246
|
+
tool_calls = run.tools
|
|
247
|
+
|
|
248
|
+
# Add messages to chat history
|
|
249
|
+
if user_msg:
|
|
250
|
+
add_message("user", user_msg)
|
|
251
|
+
if assistant_msg:
|
|
252
|
+
add_message("assistant", assistant_msg, tool_calls)
|
|
253
|
+
|
|
254
|
+
else:
|
|
255
|
+
logger.warning(f"No session found in database for session_id: {session_id}")
|
|
256
|
+
|
|
257
|
+
except Exception as e:
|
|
258
|
+
logger.warning(f"Could not load chat history: {e}")
|
|
259
|
+
|
|
260
|
+
st.rerun()
|
|
261
|
+
|
|
262
|
+
except Exception as e:
|
|
263
|
+
logger.error(f"Error loading session: {e}")
|
|
264
|
+
st.sidebar.error(f"Error loading session: {str(e)}")
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def display_response(agent: Agent, question: str) -> None:
|
|
268
|
+
"""Handle agent response with streaming and tool call display."""
|
|
269
|
+
with st.chat_message("assistant"):
|
|
270
|
+
tool_calls_container = st.empty()
|
|
271
|
+
resp_container = st.empty()
|
|
272
|
+
with st.spinner("đ¤ Thinking..."):
|
|
273
|
+
response = ""
|
|
274
|
+
try:
|
|
275
|
+
# Run the agent and stream the response
|
|
276
|
+
run_response = agent.run(question, stream=True)
|
|
277
|
+
for resp_chunk in run_response:
|
|
278
|
+
try:
|
|
279
|
+
# Display tool calls if available
|
|
280
|
+
if hasattr(resp_chunk, "tool") and resp_chunk.tool:
|
|
281
|
+
display_tool_calls(tool_calls_container, [resp_chunk.tool])
|
|
282
|
+
except Exception as tool_error:
|
|
283
|
+
logger.warning(f"Error displaying tool calls: {tool_error}")
|
|
284
|
+
|
|
285
|
+
if resp_chunk.content is not None:
|
|
286
|
+
content = str(resp_chunk.content)
|
|
287
|
+
|
|
288
|
+
if not (
|
|
289
|
+
content.strip().endswith("completed in") or "completed in" in content and "s." in content
|
|
290
|
+
):
|
|
291
|
+
response += content
|
|
292
|
+
resp_container.markdown(response)
|
|
293
|
+
|
|
294
|
+
try:
|
|
295
|
+
if hasattr(agent, "run_response") and agent.run_response and hasattr(agent.run_response, "tools"):
|
|
296
|
+
add_message("assistant", response, agent.run_response.tools)
|
|
297
|
+
else:
|
|
298
|
+
add_message("assistant", response)
|
|
299
|
+
except Exception as add_msg_error:
|
|
300
|
+
logger.warning(f"Error adding message with tools: {add_msg_error}")
|
|
301
|
+
add_message("assistant", response)
|
|
302
|
+
|
|
303
|
+
except Exception as e:
|
|
304
|
+
st.error(f"Sorry, I encountered an error: {str(e)}")
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def display_chat_messages() -> None:
|
|
308
|
+
"""Display all chat messages from session state."""
|
|
309
|
+
if "messages" not in st.session_state:
|
|
310
|
+
return
|
|
311
|
+
|
|
312
|
+
for message in st.session_state["messages"]:
|
|
313
|
+
if message["role"] in ["user", "assistant"]:
|
|
314
|
+
content = message["content"]
|
|
315
|
+
with st.chat_message(message["role"]):
|
|
316
|
+
# Display tool calls
|
|
317
|
+
if "tool_calls" in message and message["tool_calls"]:
|
|
318
|
+
display_tool_calls(st.container(), message["tool_calls"])
|
|
319
|
+
|
|
320
|
+
if content is not None and str(content).strip() and str(content).strip().lower() != "none":
|
|
321
|
+
st.markdown(content)
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def initialize_agent(model_id: str, agent_creation_callback: Callable[[str, Optional[str]], Agent]) -> Agent:
|
|
325
|
+
"""Initialize or get agent with proper session management."""
|
|
326
|
+
if "agent" not in st.session_state or st.session_state["agent"] is None:
|
|
327
|
+
# First time initialization - get existing session_id if any
|
|
328
|
+
session_id = st.session_state.get("session_id")
|
|
329
|
+
agent = agent_creation_callback(model_id, session_id)
|
|
330
|
+
st.session_state["agent"] = agent
|
|
331
|
+
st.session_state["current_model"] = model_id
|
|
332
|
+
|
|
333
|
+
return agent
|
|
334
|
+
else:
|
|
335
|
+
return st.session_state["agent"]
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def reset_session_state(agent: Agent) -> None:
|
|
339
|
+
"""Update session state."""
|
|
340
|
+
print(f"Resetting session state for agent: {agent.session_id}")
|
|
341
|
+
if agent.session_id is not None:
|
|
342
|
+
st.session_state["session_id"] = agent.session_id
|
|
343
|
+
|
|
344
|
+
if "messages" not in st.session_state:
|
|
345
|
+
st.session_state["messages"] = []
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
def knowledge_base_info_widget(agent: Agent) -> None:
|
|
349
|
+
"""Display knowledge base information widget."""
|
|
350
|
+
if not agent.knowledge:
|
|
351
|
+
st.sidebar.info("No knowledge base configured")
|
|
352
|
+
return
|
|
353
|
+
|
|
354
|
+
vector_db = getattr(agent.knowledge, "vector_db", None)
|
|
355
|
+
if not vector_db:
|
|
356
|
+
st.sidebar.info("No vector db configured")
|
|
357
|
+
return
|
|
358
|
+
|
|
359
|
+
try:
|
|
360
|
+
doc_count = vector_db.get_count()
|
|
361
|
+
if doc_count == 0:
|
|
362
|
+
st.sidebar.info("đĄ Upload documents to populate the knowledge base")
|
|
363
|
+
else:
|
|
364
|
+
st.sidebar.metric("Documents Loaded", doc_count)
|
|
365
|
+
except Exception as e:
|
|
366
|
+
logger.error(f"Error getting knowledge base info: {e}")
|
|
367
|
+
st.sidebar.warning("Could not retrieve knowledge base information")
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
def export_chat_history(app_name: str = "Chat") -> str:
|
|
371
|
+
"""Export chat history to markdown."""
|
|
372
|
+
if "messages" not in st.session_state or not st.session_state["messages"]:
|
|
373
|
+
return "# Chat History\n\n*No messages to export*"
|
|
374
|
+
|
|
375
|
+
title = f"{app_name} Chat History"
|
|
376
|
+
for msg in st.session_state["messages"]:
|
|
377
|
+
if msg.get("role") == "user" and msg.get("content"):
|
|
378
|
+
title = msg["content"][:100]
|
|
379
|
+
if len(msg["content"]) > 100:
|
|
380
|
+
title += "..."
|
|
381
|
+
break
|
|
382
|
+
|
|
383
|
+
chat_text = f"# {title}\n\n"
|
|
384
|
+
chat_text += f"**Exported:** {datetime.now().strftime('%B %d, %Y at %I:%M %p')}\n\n"
|
|
385
|
+
chat_text += "---\n\n"
|
|
386
|
+
|
|
387
|
+
for msg in st.session_state["messages"]:
|
|
388
|
+
role = msg.get("role", "")
|
|
389
|
+
content = msg.get("content", "")
|
|
390
|
+
|
|
391
|
+
if not content or str(content).strip().lower() == "none":
|
|
392
|
+
continue
|
|
393
|
+
|
|
394
|
+
role_display = "## đ User" if role == "user" else "## đ¤ Assistant"
|
|
395
|
+
chat_text += f"{role_display}\n\n{content}\n\n---\n\n"
|
|
396
|
+
return chat_text
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
def get_model_from_id(model_id: str):
|
|
400
|
+
"""Get a model instance from a model ID string."""
|
|
401
|
+
if model_id.startswith("openai:"):
|
|
402
|
+
return OpenAIChat(id=model_id.split("openai:")[1])
|
|
403
|
+
elif model_id.startswith("anthropic:"):
|
|
404
|
+
return Claude(id=model_id.split("anthropic:")[1])
|
|
405
|
+
elif model_id.startswith("google:"):
|
|
406
|
+
return Gemini(id=model_id.split("google:")[1])
|
|
407
|
+
else:
|
|
408
|
+
return OpenAIChat(id="gpt-4o")
|
|
409
|
+
|
|
410
|
+
|
|
411
|
+
def get_model_with_provider(model_name: str):
|
|
412
|
+
"""Get a model instance by inferring the correct provider from the model name.
|
|
413
|
+
|
|
414
|
+
Args:
|
|
415
|
+
model_name: Model name (e.g., "gpt-4o", "claude-4-sonnet", "gemini-2.5-pro")
|
|
416
|
+
|
|
417
|
+
Returns:
|
|
418
|
+
Model instance with correct provider
|
|
419
|
+
"""
|
|
420
|
+
if ":" in model_name:
|
|
421
|
+
return get_model_from_id(model_name)
|
|
422
|
+
|
|
423
|
+
model_lower = model_name.lower()
|
|
424
|
+
|
|
425
|
+
if any(pattern in model_lower for pattern in ["gpt", "o1", "o3"]):
|
|
426
|
+
return get_model_from_id(f"openai:{model_name}")
|
|
427
|
+
|
|
428
|
+
elif "claude" in model_lower:
|
|
429
|
+
return get_model_from_id(f"anthropic:{model_name}")
|
|
430
|
+
|
|
431
|
+
elif "gemini" in model_lower:
|
|
432
|
+
return get_model_from_id(f"google:{model_name}")
|
|
433
|
+
|
|
434
|
+
else:
|
|
435
|
+
return get_model_from_id(f"openai:{model_name}")
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
def about_section(description: str):
|
|
439
|
+
"""About section"""
|
|
440
|
+
st.sidebar.markdown("---")
|
|
441
|
+
st.sidebar.markdown("### âšī¸ About")
|
|
442
|
+
st.sidebar.markdown(f"""
|
|
443
|
+
{description}
|
|
444
|
+
|
|
445
|
+
Built with:
|
|
446
|
+
- đ Agno
|
|
447
|
+
- đĢ Streamlit
|
|
448
|
+
""")
|
|
449
|
+
|
|
450
|
+
|
|
451
|
+
MODELS = [
|
|
452
|
+
"gpt-4o",
|
|
453
|
+
"o3-mini",
|
|
454
|
+
"gpt-5",
|
|
455
|
+
"claude-sonnet-4-5-20250929",
|
|
456
|
+
"gemini-2.5-pro",
|
|
457
|
+
]
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
COMMON_CSS = """
|
|
461
|
+
<style>
|
|
462
|
+
.main-title {
|
|
463
|
+
text-align: center;
|
|
464
|
+
background: linear-gradient(45deg, #FF4B2B, #FF416C);
|
|
465
|
+
-webkit-background-clip: text;
|
|
466
|
+
-webkit-text-fill-color: transparent;
|
|
467
|
+
font-size: 3em;
|
|
468
|
+
font-weight: bold;
|
|
469
|
+
padding: 1em 0;
|
|
470
|
+
}
|
|
471
|
+
.subtitle {
|
|
472
|
+
text-align: center;
|
|
473
|
+
color: #666;
|
|
474
|
+
margin-bottom: 2em;
|
|
475
|
+
}
|
|
476
|
+
.stButton button {
|
|
477
|
+
width: 100%;
|
|
478
|
+
border-radius: 20px;
|
|
479
|
+
margin: 0.2em 0;
|
|
480
|
+
transition: all 0.3s ease;
|
|
481
|
+
}
|
|
482
|
+
.stButton button:hover {
|
|
483
|
+
transform: translateY(-2px);
|
|
484
|
+
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
|
|
485
|
+
}
|
|
486
|
+
</style>
|
|
487
|
+
"""
|