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/firestore/schemas.py
CHANGED
|
@@ -67,6 +67,7 @@ USER_MEMORY_COLLECTION_SCHEMA = [
|
|
|
67
67
|
{"key": "agent_id"},
|
|
68
68
|
{"key": "team_id"},
|
|
69
69
|
{"key": "topics"},
|
|
70
|
+
{"key": "created_at"},
|
|
70
71
|
{"key": "updated_at"},
|
|
71
72
|
# Composite indexes for memory queries
|
|
72
73
|
{"key": [("user_id", "ASCENDING"), ("agent_id", "ASCENDING")], "collection_group": False},
|
|
@@ -112,6 +113,15 @@ METRICS_COLLECTION_SCHEMA = [
|
|
|
112
113
|
{"key": [("date", "ASCENDING"), ("aggregation_period", "ASCENDING")], "collection_group": False, "unique": True},
|
|
113
114
|
]
|
|
114
115
|
|
|
116
|
+
CULTURAL_KNOWLEDGE_COLLECTION_SCHEMA = [
|
|
117
|
+
{"key": "id", "unique": True},
|
|
118
|
+
{"key": "name"},
|
|
119
|
+
{"key": "agent_id"},
|
|
120
|
+
{"key": "team_id"},
|
|
121
|
+
{"key": "created_at"},
|
|
122
|
+
{"key": "updated_at"},
|
|
123
|
+
]
|
|
124
|
+
|
|
115
125
|
|
|
116
126
|
def get_collection_indexes(collection_type: str) -> List[Dict[str, Any]]:
|
|
117
127
|
"""Get the index definitions for a specific collection type."""
|
|
@@ -121,6 +131,7 @@ def get_collection_indexes(collection_type: str) -> List[Dict[str, Any]]:
|
|
|
121
131
|
"metrics": METRICS_COLLECTION_SCHEMA,
|
|
122
132
|
"evals": EVAL_COLLECTION_SCHEMA,
|
|
123
133
|
"knowledge": KNOWLEDGE_COLLECTION_SCHEMA,
|
|
134
|
+
"culture": CULTURAL_KNOWLEDGE_COLLECTION_SCHEMA,
|
|
124
135
|
}
|
|
125
136
|
|
|
126
137
|
indexes = index_definitions.get(collection_type)
|
agno/db/firestore/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.firestore.schemas import get_collection_indexes
|
|
10
|
+
from agno.db.schemas.culture import CulturalKnowledge
|
|
10
11
|
from agno.utils.log import log_debug, log_error, log_info, log_warning
|
|
11
12
|
|
|
12
13
|
try:
|
|
@@ -122,6 +123,42 @@ def apply_pagination(query, limit: Optional[int] = None, page: Optional[int] = N
|
|
|
122
123
|
return query
|
|
123
124
|
|
|
124
125
|
|
|
126
|
+
def apply_sorting_to_records(
|
|
127
|
+
records: List[Dict[str, Any]], sort_by: Optional[str] = None, sort_order: Optional[str] = None
|
|
128
|
+
) -> List[Dict[str, Any]]:
|
|
129
|
+
"""Apply sorting to in-memory records (for cases where Firestore query sorting isn't possible)."""
|
|
130
|
+
if sort_by is None:
|
|
131
|
+
return records
|
|
132
|
+
|
|
133
|
+
def get_sort_key(record):
|
|
134
|
+
value = record.get(sort_by, 0)
|
|
135
|
+
if value is None:
|
|
136
|
+
return 0 if records and isinstance(records[0].get(sort_by, 0), (int, float)) else ""
|
|
137
|
+
return value
|
|
138
|
+
|
|
139
|
+
try:
|
|
140
|
+
is_reverse = sort_order == "desc"
|
|
141
|
+
return sorted(records, key=get_sort_key, reverse=is_reverse)
|
|
142
|
+
except Exception as e:
|
|
143
|
+
log_warning(f"Error sorting Firestore records: {e}")
|
|
144
|
+
return records
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def apply_pagination_to_records(
|
|
148
|
+
records: List[Dict[str, Any]], limit: Optional[int] = None, page: Optional[int] = None
|
|
149
|
+
) -> List[Dict[str, Any]]:
|
|
150
|
+
"""Apply pagination to in-memory records (for cases where Firestore query pagination isn't possible)."""
|
|
151
|
+
if limit is None:
|
|
152
|
+
return records
|
|
153
|
+
|
|
154
|
+
if page is not None and page > 0:
|
|
155
|
+
start_idx = (page - 1) * limit
|
|
156
|
+
end_idx = start_idx + limit
|
|
157
|
+
return records[start_idx:end_idx]
|
|
158
|
+
else:
|
|
159
|
+
return records[:limit]
|
|
160
|
+
|
|
161
|
+
|
|
125
162
|
# -- Metrics util methods --
|
|
126
163
|
|
|
127
164
|
|
|
@@ -157,18 +194,20 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
157
194
|
all_user_ids = set()
|
|
158
195
|
|
|
159
196
|
for session_type, sessions_count_key, runs_count_key in session_types:
|
|
160
|
-
sessions = sessions_data.get(session_type, [])
|
|
197
|
+
sessions = sessions_data.get(session_type, []) or []
|
|
161
198
|
metrics[sessions_count_key] = len(sessions)
|
|
162
199
|
|
|
163
200
|
for session in sessions:
|
|
164
201
|
if session.get("user_id"):
|
|
165
202
|
all_user_ids.add(session["user_id"])
|
|
166
203
|
runs = session.get("runs", []) or []
|
|
167
|
-
metrics[runs_count_key] += len(runs)
|
|
168
204
|
|
|
169
|
-
if runs
|
|
205
|
+
if runs:
|
|
170
206
|
if isinstance(runs, str):
|
|
171
207
|
runs = json.loads(runs)
|
|
208
|
+
|
|
209
|
+
metrics[runs_count_key] += len(runs)
|
|
210
|
+
|
|
172
211
|
for run in runs:
|
|
173
212
|
if model_id := run.get("model"):
|
|
174
213
|
model_provider = run.get("model_provider", "")
|
|
@@ -185,7 +224,7 @@ def calculate_date_metrics(date_to_process: date, sessions_data: dict) -> dict:
|
|
|
185
224
|
|
|
186
225
|
model_metrics = []
|
|
187
226
|
for model, count in model_counts.items():
|
|
188
|
-
model_id, model_provider = model.
|
|
227
|
+
model_id, model_provider = model.rsplit(":", 1)
|
|
189
228
|
model_metrics.append({"model_id": model_id, "model_provider": model_provider, "count": count})
|
|
190
229
|
|
|
191
230
|
metrics["users_count"] = len(all_user_ids)
|
|
@@ -276,3 +315,62 @@ def bulk_upsert_metrics(collection_ref, metrics_records: List[Dict[str, Any]]) -
|
|
|
276
315
|
log_error(f"Error committing metrics batch: {e}")
|
|
277
316
|
|
|
278
317
|
return results
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
# -- Cultural Knowledge util methods --
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
def serialize_cultural_knowledge_for_db(cultural_knowledge: CulturalKnowledge) -> Dict[str, Any]:
|
|
324
|
+
"""Serialize a CulturalKnowledge object for database storage.
|
|
325
|
+
|
|
326
|
+
Converts the model's separate content, categories, and notes fields
|
|
327
|
+
into a single dict for the database content field.
|
|
328
|
+
|
|
329
|
+
Args:
|
|
330
|
+
cultural_knowledge (CulturalKnowledge): The cultural knowledge object to serialize.
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
Dict[str, Any]: A dictionary with content, categories, and notes.
|
|
334
|
+
"""
|
|
335
|
+
content_dict: Dict[str, Any] = {}
|
|
336
|
+
if cultural_knowledge.content is not None:
|
|
337
|
+
content_dict["content"] = cultural_knowledge.content
|
|
338
|
+
if cultural_knowledge.categories is not None:
|
|
339
|
+
content_dict["categories"] = cultural_knowledge.categories
|
|
340
|
+
if cultural_knowledge.notes is not None:
|
|
341
|
+
content_dict["notes"] = cultural_knowledge.notes
|
|
342
|
+
|
|
343
|
+
return content_dict if content_dict else {}
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
def deserialize_cultural_knowledge_from_db(db_row: Dict[str, Any]) -> CulturalKnowledge:
|
|
347
|
+
"""Deserialize a database row to a CulturalKnowledge object.
|
|
348
|
+
|
|
349
|
+
The database stores content as a dict containing content, categories, and notes.
|
|
350
|
+
This method extracts those fields and converts them back to the model format.
|
|
351
|
+
|
|
352
|
+
Args:
|
|
353
|
+
db_row (Dict[str, Any]): The database row as a dictionary.
|
|
354
|
+
|
|
355
|
+
Returns:
|
|
356
|
+
CulturalKnowledge: The cultural knowledge object.
|
|
357
|
+
"""
|
|
358
|
+
# Extract content, categories, and notes from the content field
|
|
359
|
+
content_json = db_row.get("content", {}) or {}
|
|
360
|
+
|
|
361
|
+
return CulturalKnowledge.from_dict(
|
|
362
|
+
{
|
|
363
|
+
"id": db_row.get("id"),
|
|
364
|
+
"name": db_row.get("name"),
|
|
365
|
+
"summary": db_row.get("summary"),
|
|
366
|
+
"content": content_json.get("content"),
|
|
367
|
+
"categories": content_json.get("categories"),
|
|
368
|
+
"notes": content_json.get("notes"),
|
|
369
|
+
"metadata": db_row.get("metadata"),
|
|
370
|
+
"input": db_row.get("input"),
|
|
371
|
+
"created_at": db_row.get("created_at"),
|
|
372
|
+
"updated_at": db_row.get("updated_at"),
|
|
373
|
+
"agent_id": db_row.get("agent_id"),
|
|
374
|
+
"team_id": db_row.get("team_id"),
|
|
375
|
+
}
|
|
376
|
+
)
|