agno 2.0.1__py3-none-any.whl → 2.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agno/agent/agent.py +6015 -2823
- agno/api/api.py +2 -0
- agno/api/os.py +1 -1
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +385 -6
- agno/db/dynamo/dynamo.py +388 -81
- agno/db/dynamo/schemas.py +47 -10
- agno/db/dynamo/utils.py +63 -4
- agno/db/firestore/firestore.py +435 -64
- agno/db/firestore/schemas.py +11 -0
- agno/db/firestore/utils.py +102 -4
- agno/db/gcs_json/gcs_json_db.py +384 -42
- agno/db/gcs_json/utils.py +60 -26
- agno/db/in_memory/in_memory_db.py +351 -66
- agno/db/in_memory/utils.py +60 -2
- agno/db/json/json_db.py +339 -48
- agno/db/json/utils.py +60 -26
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +510 -37
- agno/db/migrations/versions/__init__.py +0 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +15 -1
- agno/db/mongo/async_mongo.py +2036 -0
- agno/db/mongo/mongo.py +653 -76
- agno/db/mongo/schemas.py +13 -0
- agno/db/mongo/utils.py +80 -8
- agno/db/mysql/mysql.py +687 -25
- agno/db/mysql/schemas.py +61 -37
- agno/db/mysql/utils.py +60 -2
- agno/db/postgres/__init__.py +2 -1
- agno/db/postgres/async_postgres.py +2001 -0
- agno/db/postgres/postgres.py +676 -57
- agno/db/postgres/schemas.py +43 -18
- agno/db/postgres/utils.py +164 -2
- agno/db/redis/redis.py +344 -38
- agno/db/redis/schemas.py +18 -0
- agno/db/redis/utils.py +60 -2
- agno/db/schemas/__init__.py +2 -1
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/memory.py +13 -0
- agno/db/singlestore/schemas.py +26 -1
- agno/db/singlestore/singlestore.py +687 -53
- agno/db/singlestore/utils.py +60 -2
- agno/db/sqlite/__init__.py +2 -1
- agno/db/sqlite/async_sqlite.py +2371 -0
- agno/db/sqlite/schemas.py +24 -0
- agno/db/sqlite/sqlite.py +774 -85
- agno/db/sqlite/utils.py +168 -5
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1361 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +50 -22
- agno/eval/accuracy.py +50 -43
- agno/eval/performance.py +6 -3
- agno/eval/reliability.py +6 -3
- agno/eval/utils.py +33 -16
- agno/exceptions.py +68 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/discord/client.py +1 -0
- agno/knowledge/chunking/agentic.py +13 -10
- agno/knowledge/chunking/fixed.py +1 -1
- agno/knowledge/chunking/semantic.py +40 -8
- agno/knowledge/chunking/strategy.py +59 -15
- agno/knowledge/embedder/aws_bedrock.py +9 -4
- agno/knowledge/embedder/azure_openai.py +54 -0
- agno/knowledge/embedder/base.py +2 -0
- agno/knowledge/embedder/cohere.py +184 -5
- agno/knowledge/embedder/fastembed.py +1 -1
- agno/knowledge/embedder/google.py +79 -1
- agno/knowledge/embedder/huggingface.py +9 -4
- agno/knowledge/embedder/jina.py +63 -0
- agno/knowledge/embedder/mistral.py +78 -11
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/ollama.py +13 -0
- agno/knowledge/embedder/openai.py +37 -65
- agno/knowledge/embedder/sentence_transformer.py +8 -4
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +69 -16
- agno/knowledge/knowledge.py +594 -186
- agno/knowledge/reader/base.py +9 -2
- agno/knowledge/reader/csv_reader.py +8 -10
- agno/knowledge/reader/docx_reader.py +5 -6
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/json_reader.py +6 -5
- agno/knowledge/reader/markdown_reader.py +13 -13
- agno/knowledge/reader/pdf_reader.py +43 -68
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +51 -6
- agno/knowledge/reader/s3_reader.py +3 -15
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +13 -13
- agno/knowledge/reader/web_search_reader.py +2 -43
- agno/knowledge/reader/website_reader.py +43 -25
- agno/knowledge/reranker/__init__.py +2 -8
- agno/knowledge/types.py +9 -0
- agno/knowledge/utils.py +20 -0
- agno/media.py +72 -0
- agno/memory/manager.py +336 -82
- agno/models/aimlapi/aimlapi.py +2 -2
- agno/models/anthropic/claude.py +183 -37
- agno/models/aws/bedrock.py +52 -112
- agno/models/aws/claude.py +33 -1
- agno/models/azure/ai_foundry.py +33 -15
- agno/models/azure/openai_chat.py +25 -8
- agno/models/base.py +999 -519
- agno/models/cerebras/cerebras.py +19 -13
- agno/models/cerebras/cerebras_openai.py +8 -5
- agno/models/cohere/chat.py +27 -1
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/dashscope.py +1 -0
- agno/models/deepinfra/deepinfra.py +2 -2
- agno/models/deepseek/deepseek.py +2 -2
- agno/models/fireworks/fireworks.py +2 -2
- agno/models/google/gemini.py +103 -31
- agno/models/groq/groq.py +28 -11
- agno/models/huggingface/huggingface.py +2 -1
- agno/models/internlm/internlm.py +2 -2
- agno/models/langdb/langdb.py +4 -4
- agno/models/litellm/chat.py +18 -1
- agno/models/litellm/litellm_openai.py +2 -2
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/message.py +139 -0
- agno/models/meta/llama.py +27 -10
- agno/models/meta/llama_openai.py +5 -17
- agno/models/nebius/nebius.py +6 -6
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/nvidia.py +2 -2
- agno/models/ollama/chat.py +59 -5
- agno/models/openai/chat.py +69 -29
- agno/models/openai/responses.py +103 -106
- agno/models/openrouter/openrouter.py +41 -3
- agno/models/perplexity/perplexity.py +4 -5
- agno/models/portkey/portkey.py +3 -3
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +77 -1
- agno/models/sambanova/sambanova.py +2 -2
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/together.py +2 -2
- agno/models/utils.py +254 -8
- agno/models/vercel/v0.py +2 -2
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +96 -0
- agno/models/vllm/vllm.py +1 -0
- agno/models/xai/xai.py +3 -2
- agno/os/app.py +543 -178
- agno/os/auth.py +24 -14
- agno/os/config.py +1 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/agui.py +23 -7
- agno/os/interfaces/agui/router.py +27 -3
- agno/os/interfaces/agui/utils.py +242 -142
- agno/os/interfaces/base.py +6 -2
- agno/os/interfaces/slack/router.py +81 -23
- agno/os/interfaces/slack/slack.py +29 -14
- agno/os/interfaces/whatsapp/router.py +11 -4
- agno/os/interfaces/whatsapp/whatsapp.py +14 -7
- agno/os/mcp.py +111 -54
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +556 -139
- agno/os/routers/evals/evals.py +71 -34
- agno/os/routers/evals/schemas.py +31 -31
- agno/os/routers/evals/utils.py +6 -5
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/knowledge.py +185 -38
- agno/os/routers/knowledge/schemas.py +82 -22
- agno/os/routers/memory/memory.py +158 -53
- agno/os/routers/memory/schemas.py +20 -16
- agno/os/routers/metrics/metrics.py +20 -8
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +499 -38
- agno/os/schema.py +308 -198
- agno/os/utils.py +401 -41
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +2 -2
- agno/reasoning/deepseek.py +2 -2
- agno/reasoning/default.py +3 -1
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +2 -2
- agno/reasoning/ollama.py +2 -2
- agno/reasoning/openai.py +7 -2
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +248 -94
- agno/run/base.py +44 -5
- agno/run/team.py +238 -97
- agno/run/workflow.py +144 -33
- agno/session/agent.py +105 -89
- agno/session/summary.py +65 -25
- agno/session/team.py +176 -96
- agno/session/workflow.py +406 -40
- agno/team/team.py +3854 -1610
- agno/tools/dalle.py +2 -4
- agno/tools/decorator.py +4 -2
- agno/tools/duckduckgo.py +15 -11
- agno/tools/e2b.py +14 -7
- agno/tools/eleven_labs.py +23 -25
- agno/tools/exa.py +21 -16
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +350 -0
- agno/tools/firecrawl.py +4 -4
- agno/tools/function.py +250 -30
- agno/tools/gmail.py +238 -14
- agno/tools/google_drive.py +270 -0
- agno/tools/googlecalendar.py +36 -8
- agno/tools/googlesheets.py +20 -5
- agno/tools/jira.py +20 -0
- agno/tools/knowledge.py +3 -3
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +11 -17
- agno/tools/memori.py +1 -53
- agno/tools/memory.py +419 -0
- agno/tools/models/nebius.py +5 -5
- agno/tools/models_labs.py +20 -10
- agno/tools/notion.py +204 -0
- agno/tools/parallel.py +314 -0
- agno/tools/scrapegraph.py +58 -31
- agno/tools/searxng.py +2 -2
- agno/tools/serper.py +2 -2
- agno/tools/slack.py +18 -3
- agno/tools/spider.py +2 -2
- agno/tools/tavily.py +146 -0
- agno/tools/whatsapp.py +1 -1
- agno/tools/workflow.py +278 -0
- agno/tools/yfinance.py +12 -11
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +27 -0
- agno/utils/common.py +90 -1
- agno/utils/events.py +217 -2
- agno/utils/gemini.py +180 -22
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +111 -0
- agno/utils/knowledge.py +12 -5
- agno/utils/log.py +1 -0
- agno/utils/mcp.py +92 -2
- agno/utils/media.py +188 -10
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +60 -0
- agno/utils/models/claude.py +40 -11
- agno/utils/print_response/agent.py +105 -21
- agno/utils/print_response/team.py +103 -38
- agno/utils/print_response/workflow.py +251 -34
- agno/utils/reasoning.py +22 -1
- agno/utils/serialize.py +32 -0
- agno/utils/streamlit.py +16 -10
- agno/utils/string.py +41 -0
- agno/utils/team.py +98 -9
- agno/utils/tools.py +1 -1
- agno/vectordb/base.py +23 -4
- agno/vectordb/cassandra/cassandra.py +65 -9
- agno/vectordb/chroma/chromadb.py +182 -38
- agno/vectordb/clickhouse/clickhousedb.py +64 -11
- agno/vectordb/couchbase/couchbase.py +105 -10
- agno/vectordb/lancedb/lance_db.py +124 -133
- agno/vectordb/langchaindb/langchaindb.py +25 -7
- agno/vectordb/lightrag/lightrag.py +17 -3
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +46 -7
- agno/vectordb/milvus/milvus.py +126 -9
- agno/vectordb/mongodb/__init__.py +7 -1
- agno/vectordb/mongodb/mongodb.py +112 -7
- agno/vectordb/pgvector/pgvector.py +142 -21
- agno/vectordb/pineconedb/pineconedb.py +80 -8
- agno/vectordb/qdrant/qdrant.py +125 -39
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/singlestore/singlestore.py +111 -25
- agno/vectordb/surrealdb/surrealdb.py +31 -5
- agno/vectordb/upstashdb/upstashdb.py +76 -8
- agno/vectordb/weaviate/weaviate.py +86 -15
- agno/workflow/__init__.py +2 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +112 -18
- agno/workflow/loop.py +69 -10
- agno/workflow/parallel.py +266 -118
- agno/workflow/router.py +110 -17
- agno/workflow/step.py +638 -129
- agno/workflow/steps.py +65 -6
- agno/workflow/types.py +61 -23
- agno/workflow/workflow.py +2085 -272
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/METADATA +182 -58
- agno-2.3.0.dist-info/RECORD +577 -0
- agno/knowledge/reader/url_reader.py +0 -128
- agno/tools/googlesearch.py +0 -98
- agno/tools/mcp.py +0 -610
- agno/utils/models/aws_claude.py +0 -170
- agno-2.0.1.dist-info/RECORD +0 -515
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/WHEEL +0 -0
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/licenses/LICENSE +0 -0
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/top_level.txt +0 -0
agno/db/mongo/schemas.py
CHANGED
|
@@ -19,6 +19,9 @@ MEMORY_COLLECTION_SCHEMA = [
|
|
|
19
19
|
{"key": "agent_id"},
|
|
20
20
|
{"key": "team_id"},
|
|
21
21
|
{"key": "topics"},
|
|
22
|
+
{"key": "input"},
|
|
23
|
+
{"key": "feedback"},
|
|
24
|
+
{"key": "created_at"},
|
|
22
25
|
{"key": "updated_at"},
|
|
23
26
|
]
|
|
24
27
|
|
|
@@ -59,6 +62,15 @@ METRICS_COLLECTION_SCHEMA = [
|
|
|
59
62
|
{"key": [("date", 1), ("aggregation_period", 1)], "unique": True},
|
|
60
63
|
]
|
|
61
64
|
|
|
65
|
+
CULTURAL_KNOWLEDGE_COLLECTION_SCHEMA = [
|
|
66
|
+
{"key": "id", "unique": True},
|
|
67
|
+
{"key": "name"},
|
|
68
|
+
{"key": "agent_id"},
|
|
69
|
+
{"key": "team_id"},
|
|
70
|
+
{"key": "created_at"},
|
|
71
|
+
{"key": "updated_at"},
|
|
72
|
+
]
|
|
73
|
+
|
|
62
74
|
|
|
63
75
|
def get_collection_indexes(collection_type: str) -> List[Dict[str, Any]]:
|
|
64
76
|
"""Get the index definitions for a specific collection type."""
|
|
@@ -68,6 +80,7 @@ def get_collection_indexes(collection_type: str) -> List[Dict[str, Any]]:
|
|
|
68
80
|
"metrics": METRICS_COLLECTION_SCHEMA,
|
|
69
81
|
"evals": EVAL_COLLECTION_SCHEMA,
|
|
70
82
|
"knowledge": KNOWLEDGE_COLLECTION_SCHEMA,
|
|
83
|
+
"culture": CULTURAL_KNOWLEDGE_COLLECTION_SCHEMA,
|
|
71
84
|
}
|
|
72
85
|
|
|
73
86
|
indexes = index_definitions.get(collection_type)
|
agno/db/mongo/utils.py
CHANGED
|
@@ -7,6 +7,7 @@ from typing import Any, Dict, List, Optional
|
|
|
7
7
|
from uuid import uuid4
|
|
8
8
|
|
|
9
9
|
from agno.db.mongo.schemas import get_collection_indexes
|
|
10
|
+
from agno.db.schemas.culture import CulturalKnowledge
|
|
10
11
|
from agno.utils.log import log_error, log_warning
|
|
11
12
|
|
|
12
13
|
try:
|
|
@@ -16,8 +17,6 @@ except ImportError:
|
|
|
16
17
|
|
|
17
18
|
|
|
18
19
|
# -- DB util methods --
|
|
19
|
-
|
|
20
|
-
|
|
21
20
|
def create_collection_indexes(collection: Collection, collection_type: str) -> None:
|
|
22
21
|
"""Create all required indexes for a collection"""
|
|
23
22
|
try:
|
|
@@ -35,6 +34,23 @@ def create_collection_indexes(collection: Collection, collection_type: str) -> N
|
|
|
35
34
|
log_warning(f"Error creating indexes for {collection_type} collection: {e}")
|
|
36
35
|
|
|
37
36
|
|
|
37
|
+
async def create_collection_indexes_async(collection: Any, collection_type: str) -> None:
|
|
38
|
+
"""Create all required indexes for a collection (async version for Motor)"""
|
|
39
|
+
try:
|
|
40
|
+
indexes = get_collection_indexes(collection_type)
|
|
41
|
+
for index_spec in indexes:
|
|
42
|
+
key = index_spec["key"]
|
|
43
|
+
unique = index_spec.get("unique", False)
|
|
44
|
+
|
|
45
|
+
if isinstance(key, list):
|
|
46
|
+
await collection.create_index(key, unique=unique)
|
|
47
|
+
else:
|
|
48
|
+
await collection.create_index([(key, 1)], unique=unique)
|
|
49
|
+
|
|
50
|
+
except Exception as e:
|
|
51
|
+
log_warning(f"Error creating indexes for {collection_type} collection: {e}")
|
|
52
|
+
|
|
53
|
+
|
|
38
54
|
def apply_sorting(
|
|
39
55
|
query_args: Dict[str, Any], sort_by: Optional[str] = None, sort_order: Optional[str] = None
|
|
40
56
|
) -> List[tuple]:
|
|
@@ -58,8 +74,6 @@ def apply_pagination(
|
|
|
58
74
|
|
|
59
75
|
|
|
60
76
|
# -- Metrics util methods --
|
|
61
|
-
|
|
62
|
-
|
|
63
77
|
def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
64
78
|
"""Calculate metrics for the given single date."""
|
|
65
79
|
metrics = {
|
|
@@ -92,14 +106,14 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
92
106
|
all_user_ids = set()
|
|
93
107
|
|
|
94
108
|
for session_type, sessions_count_key, runs_count_key in session_types:
|
|
95
|
-
sessions = sessions_data.get(session_type, [])
|
|
109
|
+
sessions = sessions_data.get(session_type, []) or []
|
|
96
110
|
metrics[sessions_count_key] = len(sessions)
|
|
97
111
|
|
|
98
112
|
for session in sessions:
|
|
99
113
|
if session.get("user_id"):
|
|
100
114
|
all_user_ids.add(session["user_id"])
|
|
101
|
-
runs = session.get("runs", [])
|
|
102
|
-
metrics[runs_count_key] += len(
|
|
115
|
+
runs = session.get("runs", [])
|
|
116
|
+
metrics[runs_count_key] += len(runs)
|
|
103
117
|
|
|
104
118
|
if runs := session.get("runs", []):
|
|
105
119
|
if isinstance(runs, str):
|
|
@@ -120,7 +134,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
120
134
|
|
|
121
135
|
model_metrics = []
|
|
122
136
|
for model, count in model_counts.items():
|
|
123
|
-
model_id, model_provider = model.
|
|
137
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
124
138
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
125
139
|
|
|
126
140
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -202,3 +216,61 @@ def bulk_upsert_metrics(collection: Collection, metrics_records: List[Dict[str,
|
|
|
202
216
|
continue
|
|
203
217
|
|
|
204
218
|
return results
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
# -- Cultural Knowledge util methods --
|
|
222
|
+
def serialize_cultural_knowledge_for_db(cultural_knowledge: CulturalKnowledge) -> Dict[str, Any]:
|
|
223
|
+
"""Serialize a CulturalKnowledge object for database storage.
|
|
224
|
+
|
|
225
|
+
Converts the model's separate content, categories, and notes fields
|
|
226
|
+
into a single dict for the database content column.
|
|
227
|
+
MongoDB stores as BSON which natively supports nested documents.
|
|
228
|
+
|
|
229
|
+
Args:
|
|
230
|
+
cultural_knowledge (CulturalKnowledge): The cultural knowledge object to serialize.
|
|
231
|
+
|
|
232
|
+
Returns:
|
|
233
|
+
Dict[str, Any]: A dictionary with the content field as a dict containing content, categories, and notes.
|
|
234
|
+
"""
|
|
235
|
+
content_dict: Dict[str, Any] = {}
|
|
236
|
+
if cultural_knowledge.content is not None:
|
|
237
|
+
content_dict["content"] = cultural_knowledge.content
|
|
238
|
+
if cultural_knowledge.categories is not None:
|
|
239
|
+
content_dict["categories"] = cultural_knowledge.categories
|
|
240
|
+
if cultural_knowledge.notes is not None:
|
|
241
|
+
content_dict["notes"] = cultural_knowledge.notes
|
|
242
|
+
|
|
243
|
+
return content_dict if content_dict else {}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def deserialize_cultural_knowledge_from_db(db_row: Dict[str, Any]) -> CulturalKnowledge:
|
|
247
|
+
"""Deserialize a database row to a CulturalKnowledge object.
|
|
248
|
+
|
|
249
|
+
The database stores content as a dict containing content, categories, and notes.
|
|
250
|
+
This method extracts those fields and converts them back to the model format.
|
|
251
|
+
|
|
252
|
+
Args:
|
|
253
|
+
db_row (Dict[str, Any]): The database row as a dictionary.
|
|
254
|
+
|
|
255
|
+
Returns:
|
|
256
|
+
CulturalKnowledge: The cultural knowledge object.
|
|
257
|
+
"""
|
|
258
|
+
# Extract content, categories, and notes from the content field
|
|
259
|
+
content_json = db_row.get("content", {}) or {}
|
|
260
|
+
|
|
261
|
+
return CulturalKnowledge.from_dict(
|
|
262
|
+
{
|
|
263
|
+
"id": db_row.get("id"),
|
|
264
|
+
"name": db_row.get("name"),
|
|
265
|
+
"summary": db_row.get("summary"),
|
|
266
|
+
"content": content_json.get("content"),
|
|
267
|
+
"categories": content_json.get("categories"),
|
|
268
|
+
"notes": content_json.get("notes"),
|
|
269
|
+
"metadata": db_row.get("metadata"),
|
|
270
|
+
"input": db_row.get("input"),
|
|
271
|
+
"created_at": db_row.get("created_at"),
|
|
272
|
+
"updated_at": db_row.get("updated_at"),
|
|
273
|
+
"agent_id": db_row.get("agent_id"),
|
|
274
|
+
"team_id": db_row.get("team_id"),
|
|
275
|
+
}
|
|
276
|
+
)
|