amd-gaia 0.15.0__py3-none-any.whl → 0.15.1__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.
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.1.dist-info}/METADATA +223 -223
- amd_gaia-0.15.1.dist-info/RECORD +178 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.1.dist-info}/entry_points.txt +1 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.1.dist-info}/licenses/LICENSE.md +20 -20
- gaia/__init__.py +29 -29
- gaia/agents/__init__.py +19 -19
- gaia/agents/base/__init__.py +9 -9
- gaia/agents/base/agent.py +2177 -2177
- gaia/agents/base/api_agent.py +120 -120
- gaia/agents/base/console.py +1841 -1841
- gaia/agents/base/errors.py +237 -237
- gaia/agents/base/mcp_agent.py +86 -86
- gaia/agents/base/tools.py +83 -83
- gaia/agents/blender/agent.py +556 -556
- gaia/agents/blender/agent_simple.py +133 -135
- gaia/agents/blender/app.py +211 -211
- gaia/agents/blender/app_simple.py +41 -41
- gaia/agents/blender/core/__init__.py +16 -16
- gaia/agents/blender/core/materials.py +506 -506
- gaia/agents/blender/core/objects.py +316 -316
- gaia/agents/blender/core/rendering.py +225 -225
- gaia/agents/blender/core/scene.py +220 -220
- gaia/agents/blender/core/view.py +146 -146
- gaia/agents/chat/__init__.py +9 -9
- gaia/agents/chat/agent.py +835 -835
- gaia/agents/chat/app.py +1058 -1058
- gaia/agents/chat/session.py +508 -508
- gaia/agents/chat/tools/__init__.py +15 -15
- gaia/agents/chat/tools/file_tools.py +96 -96
- gaia/agents/chat/tools/rag_tools.py +1729 -1729
- gaia/agents/chat/tools/shell_tools.py +436 -436
- gaia/agents/code/__init__.py +7 -7
- gaia/agents/code/agent.py +549 -549
- gaia/agents/code/cli.py +377 -0
- gaia/agents/code/models.py +135 -135
- gaia/agents/code/orchestration/__init__.py +24 -24
- gaia/agents/code/orchestration/checklist_executor.py +1763 -1763
- gaia/agents/code/orchestration/checklist_generator.py +713 -713
- gaia/agents/code/orchestration/factories/__init__.py +9 -9
- gaia/agents/code/orchestration/factories/base.py +63 -63
- gaia/agents/code/orchestration/factories/nextjs_factory.py +118 -118
- gaia/agents/code/orchestration/factories/python_factory.py +106 -106
- gaia/agents/code/orchestration/orchestrator.py +841 -841
- gaia/agents/code/orchestration/project_analyzer.py +391 -391
- gaia/agents/code/orchestration/steps/__init__.py +67 -67
- gaia/agents/code/orchestration/steps/base.py +188 -188
- gaia/agents/code/orchestration/steps/error_handler.py +314 -314
- gaia/agents/code/orchestration/steps/nextjs.py +828 -828
- gaia/agents/code/orchestration/steps/python.py +307 -307
- gaia/agents/code/orchestration/template_catalog.py +469 -469
- gaia/agents/code/orchestration/workflows/__init__.py +14 -14
- gaia/agents/code/orchestration/workflows/base.py +80 -80
- gaia/agents/code/orchestration/workflows/nextjs.py +186 -186
- gaia/agents/code/orchestration/workflows/python.py +94 -94
- gaia/agents/code/prompts/__init__.py +11 -11
- gaia/agents/code/prompts/base_prompt.py +77 -77
- gaia/agents/code/prompts/code_patterns.py +2036 -2036
- gaia/agents/code/prompts/nextjs_prompt.py +40 -40
- gaia/agents/code/prompts/python_prompt.py +109 -109
- gaia/agents/code/schema_inference.py +365 -365
- gaia/agents/code/system_prompt.py +41 -41
- gaia/agents/code/tools/__init__.py +42 -42
- gaia/agents/code/tools/cli_tools.py +1138 -1138
- gaia/agents/code/tools/code_formatting.py +319 -319
- gaia/agents/code/tools/code_tools.py +769 -769
- gaia/agents/code/tools/error_fixing.py +1347 -1347
- gaia/agents/code/tools/external_tools.py +180 -180
- gaia/agents/code/tools/file_io.py +845 -845
- gaia/agents/code/tools/prisma_tools.py +190 -190
- gaia/agents/code/tools/project_management.py +1016 -1016
- gaia/agents/code/tools/testing.py +321 -321
- gaia/agents/code/tools/typescript_tools.py +122 -122
- gaia/agents/code/tools/validation_parsing.py +461 -461
- gaia/agents/code/tools/validation_tools.py +806 -806
- gaia/agents/code/tools/web_dev_tools.py +1758 -1758
- gaia/agents/code/validators/__init__.py +16 -16
- gaia/agents/code/validators/antipattern_checker.py +241 -241
- gaia/agents/code/validators/ast_analyzer.py +197 -197
- gaia/agents/code/validators/requirements_validator.py +145 -145
- gaia/agents/code/validators/syntax_validator.py +171 -171
- gaia/agents/docker/__init__.py +7 -7
- gaia/agents/docker/agent.py +642 -642
- gaia/agents/emr/__init__.py +8 -8
- gaia/agents/emr/agent.py +1506 -1506
- gaia/agents/emr/cli.py +1322 -1322
- gaia/agents/emr/constants.py +475 -475
- gaia/agents/emr/dashboard/__init__.py +4 -4
- gaia/agents/emr/dashboard/server.py +1974 -1974
- gaia/agents/jira/__init__.py +11 -11
- gaia/agents/jira/agent.py +894 -894
- gaia/agents/jira/jql_templates.py +299 -299
- gaia/agents/routing/__init__.py +7 -7
- gaia/agents/routing/agent.py +567 -570
- gaia/agents/routing/system_prompt.py +75 -75
- gaia/agents/summarize/__init__.py +11 -0
- gaia/agents/summarize/agent.py +885 -0
- gaia/agents/summarize/prompts.py +129 -0
- gaia/api/__init__.py +23 -23
- gaia/api/agent_registry.py +238 -238
- gaia/api/app.py +305 -305
- gaia/api/openai_server.py +575 -575
- gaia/api/schemas.py +186 -186
- gaia/api/sse_handler.py +373 -373
- gaia/apps/__init__.py +4 -4
- gaia/apps/llm/__init__.py +6 -6
- gaia/apps/llm/app.py +173 -169
- gaia/apps/summarize/app.py +116 -633
- gaia/apps/summarize/html_viewer.py +133 -133
- gaia/apps/summarize/pdf_formatter.py +284 -284
- gaia/audio/__init__.py +2 -2
- gaia/audio/audio_client.py +439 -439
- gaia/audio/audio_recorder.py +269 -269
- gaia/audio/kokoro_tts.py +599 -599
- gaia/audio/whisper_asr.py +432 -432
- gaia/chat/__init__.py +16 -16
- gaia/chat/app.py +430 -430
- gaia/chat/prompts.py +522 -522
- gaia/chat/sdk.py +1228 -1225
- gaia/cli.py +5481 -5632
- gaia/database/__init__.py +10 -10
- gaia/database/agent.py +176 -176
- gaia/database/mixin.py +290 -290
- gaia/database/testing.py +64 -64
- gaia/eval/batch_experiment.py +2332 -2332
- gaia/eval/claude.py +542 -542
- gaia/eval/config.py +37 -37
- gaia/eval/email_generator.py +512 -512
- gaia/eval/eval.py +3179 -3179
- gaia/eval/groundtruth.py +1130 -1130
- gaia/eval/transcript_generator.py +582 -582
- gaia/eval/webapp/README.md +167 -167
- gaia/eval/webapp/package-lock.json +875 -875
- gaia/eval/webapp/package.json +20 -20
- gaia/eval/webapp/public/app.js +3402 -3402
- gaia/eval/webapp/public/index.html +87 -87
- gaia/eval/webapp/public/styles.css +3661 -3661
- gaia/eval/webapp/server.js +415 -415
- gaia/eval/webapp/test-setup.js +72 -72
- gaia/llm/__init__.py +9 -2
- gaia/llm/base_client.py +60 -0
- gaia/llm/exceptions.py +12 -0
- gaia/llm/factory.py +70 -0
- gaia/llm/lemonade_client.py +3236 -3221
- gaia/llm/lemonade_manager.py +294 -294
- gaia/llm/providers/__init__.py +9 -0
- gaia/llm/providers/claude.py +108 -0
- gaia/llm/providers/lemonade.py +120 -0
- gaia/llm/providers/openai_provider.py +79 -0
- gaia/llm/vlm_client.py +382 -382
- gaia/logger.py +189 -189
- gaia/mcp/agent_mcp_server.py +245 -245
- gaia/mcp/blender_mcp_client.py +138 -138
- gaia/mcp/blender_mcp_server.py +648 -648
- gaia/mcp/context7_cache.py +332 -332
- gaia/mcp/external_services.py +518 -518
- gaia/mcp/mcp_bridge.py +811 -550
- gaia/mcp/servers/__init__.py +6 -6
- gaia/mcp/servers/docker_mcp.py +83 -83
- gaia/perf_analysis.py +361 -0
- gaia/rag/__init__.py +10 -10
- gaia/rag/app.py +293 -293
- gaia/rag/demo.py +304 -304
- gaia/rag/pdf_utils.py +235 -235
- gaia/rag/sdk.py +2194 -2194
- gaia/security.py +163 -163
- gaia/talk/app.py +289 -289
- gaia/talk/sdk.py +538 -538
- gaia/testing/__init__.py +87 -87
- gaia/testing/assertions.py +330 -330
- gaia/testing/fixtures.py +333 -333
- gaia/testing/mocks.py +493 -493
- gaia/util.py +46 -46
- gaia/utils/__init__.py +33 -33
- gaia/utils/file_watcher.py +675 -675
- gaia/utils/parsing.py +223 -223
- gaia/version.py +100 -100
- amd_gaia-0.15.0.dist-info/RECORD +0 -168
- gaia/agents/code/app.py +0 -266
- gaia/llm/llm_client.py +0 -723
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.1.dist-info}/WHEEL +0 -0
- {amd_gaia-0.15.0.dist-info → amd_gaia-0.15.1.dist-info}/top_level.txt +0 -0
gaia/database/__init__.py
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
|
|
4
|
-
"""Database utilities for GAIA SDK."""
|
|
5
|
-
|
|
6
|
-
from gaia.database.agent import DatabaseAgent
|
|
7
|
-
from gaia.database.mixin import DatabaseMixin
|
|
8
|
-
from gaia.database.testing import temp_db
|
|
9
|
-
|
|
10
|
-
__all__ = ["DatabaseAgent", "DatabaseMixin", "temp_db"]
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
"""Database utilities for GAIA SDK."""
|
|
5
|
+
|
|
6
|
+
from gaia.database.agent import DatabaseAgent
|
|
7
|
+
from gaia.database.mixin import DatabaseMixin
|
|
8
|
+
from gaia.database.testing import temp_db
|
|
9
|
+
|
|
10
|
+
__all__ = ["DatabaseAgent", "DatabaseMixin", "temp_db"]
|
gaia/database/agent.py
CHANGED
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
-
# SPDX-License-Identifier: MIT
|
|
3
|
-
|
|
4
|
-
"""DatabaseAgent - Agent with built-in database tools."""
|
|
5
|
-
|
|
6
|
-
from typing import Any, Dict, Optional
|
|
7
|
-
|
|
8
|
-
from gaia.agents.base import Agent, tool
|
|
9
|
-
from gaia.database.mixin import DatabaseMixin
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class DatabaseAgent(Agent, DatabaseMixin):
|
|
13
|
-
"""
|
|
14
|
-
Agent with built-in SQLite database tools.
|
|
15
|
-
|
|
16
|
-
Extends Agent with database capabilities, automatically registering
|
|
17
|
-
tools that allow the LLM to query and modify the database.
|
|
18
|
-
|
|
19
|
-
Example:
|
|
20
|
-
class PatientAgent(DatabaseAgent):
|
|
21
|
-
def __init__(self, **kwargs):
|
|
22
|
-
super().__init__(db_path="data/patients.db", **kwargs)
|
|
23
|
-
|
|
24
|
-
if not self.table_exists("patients"):
|
|
25
|
-
self.execute('''
|
|
26
|
-
CREATE TABLE patients (
|
|
27
|
-
id INTEGER PRIMARY KEY,
|
|
28
|
-
name TEXT NOT NULL,
|
|
29
|
-
dob TEXT
|
|
30
|
-
)
|
|
31
|
-
''')
|
|
32
|
-
|
|
33
|
-
def _get_system_prompt(self) -> str:
|
|
34
|
-
return "You help manage patient records."
|
|
35
|
-
|
|
36
|
-
# LLM can now use: db_query, db_insert, db_update, db_delete
|
|
37
|
-
|
|
38
|
-
Security Note:
|
|
39
|
-
The db_query tool allows the LLM to execute arbitrary SELECT queries.
|
|
40
|
-
For production use, consider overriding _register_db_tools() to expose
|
|
41
|
-
only domain-specific, validated operations.
|
|
42
|
-
"""
|
|
43
|
-
|
|
44
|
-
def __init__(
|
|
45
|
-
self,
|
|
46
|
-
db_path: str = ":memory:",
|
|
47
|
-
**kwargs,
|
|
48
|
-
):
|
|
49
|
-
"""
|
|
50
|
-
Initialize DatabaseAgent.
|
|
51
|
-
|
|
52
|
-
Args:
|
|
53
|
-
db_path: Path to SQLite database file, or ":memory:" for in-memory.
|
|
54
|
-
Parent directories are created automatically.
|
|
55
|
-
**kwargs: Additional arguments passed to Agent.
|
|
56
|
-
"""
|
|
57
|
-
super().__init__(**kwargs)
|
|
58
|
-
self.init_db(db_path)
|
|
59
|
-
self._register_db_tools()
|
|
60
|
-
|
|
61
|
-
def _register_db_tools(self) -> None:
|
|
62
|
-
"""Register database tools for LLM use."""
|
|
63
|
-
agent = self
|
|
64
|
-
|
|
65
|
-
@tool
|
|
66
|
-
def db_query(sql: str, params: Optional[Dict[str, Any]] = None) -> Dict:
|
|
67
|
-
"""
|
|
68
|
-
Execute a SELECT query and return results.
|
|
69
|
-
|
|
70
|
-
Args:
|
|
71
|
-
sql: SQL SELECT query with :param placeholders
|
|
72
|
-
params: Optional dictionary of parameter values
|
|
73
|
-
|
|
74
|
-
Returns:
|
|
75
|
-
Dictionary with 'rows' (list of row dicts) and 'count'
|
|
76
|
-
|
|
77
|
-
Example:
|
|
78
|
-
db_query("SELECT * FROM users WHERE age > :min_age", {"min_age": 18})
|
|
79
|
-
"""
|
|
80
|
-
rows = agent.query(sql, params or {})
|
|
81
|
-
return {"rows": rows, "count": len(rows)}
|
|
82
|
-
|
|
83
|
-
@tool
|
|
84
|
-
def db_insert(table: str, data: Dict[str, Any]) -> Dict:
|
|
85
|
-
"""
|
|
86
|
-
Insert a row into a table.
|
|
87
|
-
|
|
88
|
-
Args:
|
|
89
|
-
table: Table name
|
|
90
|
-
data: Dictionary of column names to values
|
|
91
|
-
|
|
92
|
-
Returns:
|
|
93
|
-
Dictionary with 'id' (the inserted row's ID) and 'success'
|
|
94
|
-
|
|
95
|
-
Example:
|
|
96
|
-
db_insert("users", {"name": "Alice", "email": "alice@example.com"})
|
|
97
|
-
"""
|
|
98
|
-
row_id = agent.insert(table, data)
|
|
99
|
-
return {"id": row_id, "success": True}
|
|
100
|
-
|
|
101
|
-
@tool
|
|
102
|
-
def db_update(
|
|
103
|
-
table: str, data: Dict[str, Any], where: str, params: Dict[str, Any]
|
|
104
|
-
) -> Dict:
|
|
105
|
-
"""
|
|
106
|
-
Update rows matching a condition.
|
|
107
|
-
|
|
108
|
-
Args:
|
|
109
|
-
table: Table name
|
|
110
|
-
data: Dictionary of column names to new values
|
|
111
|
-
where: WHERE clause with :param placeholders (without WHERE keyword)
|
|
112
|
-
params: Dictionary of parameter values for WHERE clause
|
|
113
|
-
|
|
114
|
-
Returns:
|
|
115
|
-
Dictionary with 'updated' (number of rows affected)
|
|
116
|
-
|
|
117
|
-
Example:
|
|
118
|
-
db_update("users", {"email": "new@example.com"}, "id = :id", {"id": 42})
|
|
119
|
-
"""
|
|
120
|
-
count = agent.update(table, data, where, params)
|
|
121
|
-
return {"updated": count}
|
|
122
|
-
|
|
123
|
-
@tool
|
|
124
|
-
def db_delete(table: str, where: str, params: Dict[str, Any]) -> Dict:
|
|
125
|
-
"""
|
|
126
|
-
Delete rows matching a condition.
|
|
127
|
-
|
|
128
|
-
Args:
|
|
129
|
-
table: Table name
|
|
130
|
-
where: WHERE clause with :param placeholders (without WHERE keyword)
|
|
131
|
-
params: Dictionary of parameter values for WHERE clause
|
|
132
|
-
|
|
133
|
-
Returns:
|
|
134
|
-
Dictionary with 'deleted' (number of rows deleted)
|
|
135
|
-
|
|
136
|
-
Example:
|
|
137
|
-
db_delete("sessions", "expires_at < :now", {"now": "2024-01-01"})
|
|
138
|
-
"""
|
|
139
|
-
count = agent.delete(table, where, params)
|
|
140
|
-
return {"deleted": count}
|
|
141
|
-
|
|
142
|
-
@tool
|
|
143
|
-
def db_tables() -> Dict:
|
|
144
|
-
"""
|
|
145
|
-
List all tables in the database.
|
|
146
|
-
|
|
147
|
-
Returns:
|
|
148
|
-
Dictionary with 'tables' (list of table names)
|
|
149
|
-
"""
|
|
150
|
-
rows = agent.query(
|
|
151
|
-
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
|
|
152
|
-
)
|
|
153
|
-
return {"tables": [row["name"] for row in rows]}
|
|
154
|
-
|
|
155
|
-
@tool
|
|
156
|
-
def db_schema(table: str) -> Dict:
|
|
157
|
-
"""
|
|
158
|
-
Get the schema of a table.
|
|
159
|
-
|
|
160
|
-
Args:
|
|
161
|
-
table: Table name
|
|
162
|
-
|
|
163
|
-
Returns:
|
|
164
|
-
Dictionary with 'columns' (list of column info dicts)
|
|
165
|
-
"""
|
|
166
|
-
rows = agent.query(f"PRAGMA table_info({table})")
|
|
167
|
-
columns = [
|
|
168
|
-
{
|
|
169
|
-
"name": row["name"],
|
|
170
|
-
"type": row["type"],
|
|
171
|
-
"nullable": not row["notnull"],
|
|
172
|
-
"primary_key": bool(row["pk"]),
|
|
173
|
-
}
|
|
174
|
-
for row in rows
|
|
175
|
-
]
|
|
176
|
-
return {"table": table, "columns": columns}
|
|
1
|
+
# Copyright(C) 2025-2026 Advanced Micro Devices, Inc. All rights reserved.
|
|
2
|
+
# SPDX-License-Identifier: MIT
|
|
3
|
+
|
|
4
|
+
"""DatabaseAgent - Agent with built-in database tools."""
|
|
5
|
+
|
|
6
|
+
from typing import Any, Dict, Optional
|
|
7
|
+
|
|
8
|
+
from gaia.agents.base import Agent, tool
|
|
9
|
+
from gaia.database.mixin import DatabaseMixin
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class DatabaseAgent(Agent, DatabaseMixin):
|
|
13
|
+
"""
|
|
14
|
+
Agent with built-in SQLite database tools.
|
|
15
|
+
|
|
16
|
+
Extends Agent with database capabilities, automatically registering
|
|
17
|
+
tools that allow the LLM to query and modify the database.
|
|
18
|
+
|
|
19
|
+
Example:
|
|
20
|
+
class PatientAgent(DatabaseAgent):
|
|
21
|
+
def __init__(self, **kwargs):
|
|
22
|
+
super().__init__(db_path="data/patients.db", **kwargs)
|
|
23
|
+
|
|
24
|
+
if not self.table_exists("patients"):
|
|
25
|
+
self.execute('''
|
|
26
|
+
CREATE TABLE patients (
|
|
27
|
+
id INTEGER PRIMARY KEY,
|
|
28
|
+
name TEXT NOT NULL,
|
|
29
|
+
dob TEXT
|
|
30
|
+
)
|
|
31
|
+
''')
|
|
32
|
+
|
|
33
|
+
def _get_system_prompt(self) -> str:
|
|
34
|
+
return "You help manage patient records."
|
|
35
|
+
|
|
36
|
+
# LLM can now use: db_query, db_insert, db_update, db_delete
|
|
37
|
+
|
|
38
|
+
Security Note:
|
|
39
|
+
The db_query tool allows the LLM to execute arbitrary SELECT queries.
|
|
40
|
+
For production use, consider overriding _register_db_tools() to expose
|
|
41
|
+
only domain-specific, validated operations.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(
|
|
45
|
+
self,
|
|
46
|
+
db_path: str = ":memory:",
|
|
47
|
+
**kwargs,
|
|
48
|
+
):
|
|
49
|
+
"""
|
|
50
|
+
Initialize DatabaseAgent.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
db_path: Path to SQLite database file, or ":memory:" for in-memory.
|
|
54
|
+
Parent directories are created automatically.
|
|
55
|
+
**kwargs: Additional arguments passed to Agent.
|
|
56
|
+
"""
|
|
57
|
+
super().__init__(**kwargs)
|
|
58
|
+
self.init_db(db_path)
|
|
59
|
+
self._register_db_tools()
|
|
60
|
+
|
|
61
|
+
def _register_db_tools(self) -> None:
|
|
62
|
+
"""Register database tools for LLM use."""
|
|
63
|
+
agent = self
|
|
64
|
+
|
|
65
|
+
@tool
|
|
66
|
+
def db_query(sql: str, params: Optional[Dict[str, Any]] = None) -> Dict:
|
|
67
|
+
"""
|
|
68
|
+
Execute a SELECT query and return results.
|
|
69
|
+
|
|
70
|
+
Args:
|
|
71
|
+
sql: SQL SELECT query with :param placeholders
|
|
72
|
+
params: Optional dictionary of parameter values
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
Dictionary with 'rows' (list of row dicts) and 'count'
|
|
76
|
+
|
|
77
|
+
Example:
|
|
78
|
+
db_query("SELECT * FROM users WHERE age > :min_age", {"min_age": 18})
|
|
79
|
+
"""
|
|
80
|
+
rows = agent.query(sql, params or {})
|
|
81
|
+
return {"rows": rows, "count": len(rows)}
|
|
82
|
+
|
|
83
|
+
@tool
|
|
84
|
+
def db_insert(table: str, data: Dict[str, Any]) -> Dict:
|
|
85
|
+
"""
|
|
86
|
+
Insert a row into a table.
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
table: Table name
|
|
90
|
+
data: Dictionary of column names to values
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Dictionary with 'id' (the inserted row's ID) and 'success'
|
|
94
|
+
|
|
95
|
+
Example:
|
|
96
|
+
db_insert("users", {"name": "Alice", "email": "alice@example.com"})
|
|
97
|
+
"""
|
|
98
|
+
row_id = agent.insert(table, data)
|
|
99
|
+
return {"id": row_id, "success": True}
|
|
100
|
+
|
|
101
|
+
@tool
|
|
102
|
+
def db_update(
|
|
103
|
+
table: str, data: Dict[str, Any], where: str, params: Dict[str, Any]
|
|
104
|
+
) -> Dict:
|
|
105
|
+
"""
|
|
106
|
+
Update rows matching a condition.
|
|
107
|
+
|
|
108
|
+
Args:
|
|
109
|
+
table: Table name
|
|
110
|
+
data: Dictionary of column names to new values
|
|
111
|
+
where: WHERE clause with :param placeholders (without WHERE keyword)
|
|
112
|
+
params: Dictionary of parameter values for WHERE clause
|
|
113
|
+
|
|
114
|
+
Returns:
|
|
115
|
+
Dictionary with 'updated' (number of rows affected)
|
|
116
|
+
|
|
117
|
+
Example:
|
|
118
|
+
db_update("users", {"email": "new@example.com"}, "id = :id", {"id": 42})
|
|
119
|
+
"""
|
|
120
|
+
count = agent.update(table, data, where, params)
|
|
121
|
+
return {"updated": count}
|
|
122
|
+
|
|
123
|
+
@tool
|
|
124
|
+
def db_delete(table: str, where: str, params: Dict[str, Any]) -> Dict:
|
|
125
|
+
"""
|
|
126
|
+
Delete rows matching a condition.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
table: Table name
|
|
130
|
+
where: WHERE clause with :param placeholders (without WHERE keyword)
|
|
131
|
+
params: Dictionary of parameter values for WHERE clause
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Dictionary with 'deleted' (number of rows deleted)
|
|
135
|
+
|
|
136
|
+
Example:
|
|
137
|
+
db_delete("sessions", "expires_at < :now", {"now": "2024-01-01"})
|
|
138
|
+
"""
|
|
139
|
+
count = agent.delete(table, where, params)
|
|
140
|
+
return {"deleted": count}
|
|
141
|
+
|
|
142
|
+
@tool
|
|
143
|
+
def db_tables() -> Dict:
|
|
144
|
+
"""
|
|
145
|
+
List all tables in the database.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
Dictionary with 'tables' (list of table names)
|
|
149
|
+
"""
|
|
150
|
+
rows = agent.query(
|
|
151
|
+
"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name"
|
|
152
|
+
)
|
|
153
|
+
return {"tables": [row["name"] for row in rows]}
|
|
154
|
+
|
|
155
|
+
@tool
|
|
156
|
+
def db_schema(table: str) -> Dict:
|
|
157
|
+
"""
|
|
158
|
+
Get the schema of a table.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
table: Table name
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Dictionary with 'columns' (list of column info dicts)
|
|
165
|
+
"""
|
|
166
|
+
rows = agent.query(f"PRAGMA table_info({table})")
|
|
167
|
+
columns = [
|
|
168
|
+
{
|
|
169
|
+
"name": row["name"],
|
|
170
|
+
"type": row["type"],
|
|
171
|
+
"nullable": not row["notnull"],
|
|
172
|
+
"primary_key": bool(row["pk"]),
|
|
173
|
+
}
|
|
174
|
+
for row in rows
|
|
175
|
+
]
|
|
176
|
+
return {"table": table, "columns": columns}
|