dbagent-cli 0.7.1__tar.gz → 0.7.2__tar.gz
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.
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/PKG-INFO +1 -1
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/__init__.py +1 -1
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/conversation.py +21 -14
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/generator.py +7 -2
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/pipeline.py +3 -1
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent_cli.egg-info/PKG-INFO +1 -1
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/pyproject.toml +1 -1
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/README.md +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/confidence.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/doctor.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/error_classifier.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/recommender.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/agent/validator.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/cli.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/config.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/connectors/base.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/connectors/factory.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/connectors/mongo.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/connectors/relational.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/execution/__init__.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/execution/cache.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/execution/changeset.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/execution/cost.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/execution/recovery.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/execution/sandbox.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/execution/streaming.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/anthropic_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/auto_setup.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/base.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/deepseek_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/factory.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/gemini_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/groq_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/mistral_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/mock_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/ollama_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/openai_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/llm/openrouter_provider.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/schema/cache.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/schema/formatter.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/schema/graph.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/schema/models.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/schema/retriever.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/schema/selector.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/security/__init__.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/security/audit.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/security/environment.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/security/masking.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/security/modes.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/security/rbac.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/semantic/__init__.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/semantic/dictionary.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/semantic/templates.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/sql/__init__.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/sql/optimizer.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/sql/validator.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/ui/chat_screen.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/ui/console.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/ui/grid_window.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/ui/viewer.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent/ui/visualizer.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent_cli.egg-info/SOURCES.txt +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent_cli.egg-info/dependency_links.txt +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent_cli.egg-info/entry_points.txt +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent_cli.egg-info/requires.txt +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/dbagent_cli.egg-info/top_level.txt +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/setup.cfg +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_cache.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_cli.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_connectors.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_direct_sql.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_doctor_and_viz.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_generator.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_graph.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_providers.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_recovery.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_safety.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_sandbox.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_schema.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_security.py +0 -0
- {dbagent_cli-0.7.1 → dbagent_cli-0.7.2}/tests/test_semantic.py +0 -0
|
@@ -12,7 +12,8 @@ from dataclasses import dataclass, field
|
|
|
12
12
|
class ConversationTurn:
|
|
13
13
|
"""A single turn in the conversation."""
|
|
14
14
|
user_prompt: str
|
|
15
|
-
sql: str
|
|
15
|
+
sql: str = ""
|
|
16
|
+
assistant_response: str = ""
|
|
16
17
|
tables: List[str] = field(default_factory=list)
|
|
17
18
|
filters: List[str] = field(default_factory=list)
|
|
18
19
|
entities: Dict[str, str] = field(default_factory=dict)
|
|
@@ -22,10 +23,10 @@ class ConversationTurn:
|
|
|
22
23
|
|
|
23
24
|
class ConversationContext:
|
|
24
25
|
"""
|
|
25
|
-
Tracks state across interactive chat turns.
|
|
26
|
+
Tracks state and multi-turn conversational history across interactive chat turns.
|
|
26
27
|
"""
|
|
27
28
|
|
|
28
|
-
def __init__(self, max_history: int =
|
|
29
|
+
def __init__(self, max_history: int = 15):
|
|
29
30
|
self.max_history = max_history
|
|
30
31
|
self.turns: List[ConversationTurn] = []
|
|
31
32
|
self.active_tables: Set[str] = set()
|
|
@@ -34,7 +35,8 @@ class ConversationContext:
|
|
|
34
35
|
def add_turn(
|
|
35
36
|
self,
|
|
36
37
|
user_prompt: str,
|
|
37
|
-
sql: str,
|
|
38
|
+
sql: str = "",
|
|
39
|
+
assistant_response: str = "",
|
|
38
40
|
tables: Optional[List[str]] = None,
|
|
39
41
|
filters: Optional[List[str]] = None,
|
|
40
42
|
is_chat: bool = False,
|
|
@@ -43,6 +45,7 @@ class ConversationContext:
|
|
|
43
45
|
turn = ConversationTurn(
|
|
44
46
|
user_prompt=user_prompt,
|
|
45
47
|
sql=sql,
|
|
48
|
+
assistant_response=assistant_response,
|
|
46
49
|
tables=tables or [],
|
|
47
50
|
filters=filters or [],
|
|
48
51
|
is_chat=is_chat,
|
|
@@ -59,19 +62,23 @@ class ConversationContext:
|
|
|
59
62
|
return self.turns[-1]
|
|
60
63
|
return None
|
|
61
64
|
|
|
62
|
-
def format_context_for_prompt(self) -> str:
|
|
63
|
-
"""Formats
|
|
65
|
+
def format_context_for_prompt(self, max_turns: int = 5) -> str:
|
|
66
|
+
"""Formats multi-turn conversation memory for inclusion in LLM prompt."""
|
|
64
67
|
if not self.turns:
|
|
65
68
|
return ""
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
recent = self.turns[-max_turns:]
|
|
71
|
+
lines = ["=== Previous Chat Session Memory (Use for follow-ups & context) ==="]
|
|
72
|
+
for i, t in enumerate(recent, 1):
|
|
73
|
+
lines.append(f"Turn {i}:")
|
|
74
|
+
lines.append(f" User: \"{t.user_prompt}\"")
|
|
75
|
+
if t.sql:
|
|
76
|
+
lines.append(f" Assistant (SQL): {t.sql.strip()}")
|
|
77
|
+
elif t.assistant_response:
|
|
78
|
+
clean_resp = t.assistant_response.strip().replace("\n", " ")
|
|
79
|
+
preview = (clean_resp[:120] + "...") if len(clean_resp) > 120 else clean_resp
|
|
80
|
+
lines.append(f" Assistant: \"{preview}\"")
|
|
81
|
+
lines.append("=== End Chat Session Memory ===")
|
|
75
82
|
|
|
76
83
|
return "\n".join(lines)
|
|
77
84
|
|
|
@@ -169,9 +169,10 @@ class ScriptGenerator:
|
|
|
169
169
|
self,
|
|
170
170
|
schema: DatabaseSchema,
|
|
171
171
|
user_prompt: str,
|
|
172
|
+
conversation_history: Optional[str] = None,
|
|
172
173
|
model: Optional[str] = None,
|
|
173
174
|
) -> str:
|
|
174
|
-
"""Generate a natural conversational response to the user's message."""
|
|
175
|
+
"""Generate a natural conversational response to the user's message with full session memory."""
|
|
175
176
|
table_names = [t.name for t in schema.tables]
|
|
176
177
|
table_summary = ", ".join(table_names[:30])
|
|
177
178
|
if len(table_names) > 30:
|
|
@@ -183,8 +184,12 @@ class ScriptGenerator:
|
|
|
183
184
|
table_summary=table_summary if table_summary else "No tables found",
|
|
184
185
|
)
|
|
185
186
|
|
|
187
|
+
full_prompt = user_prompt
|
|
188
|
+
if conversation_history:
|
|
189
|
+
full_prompt = f"{conversation_history}\n\nUser: {user_prompt}"
|
|
190
|
+
|
|
186
191
|
return self.llm.generate(
|
|
187
|
-
prompt=
|
|
192
|
+
prompt=full_prompt,
|
|
188
193
|
system_prompt=system_prompt,
|
|
189
194
|
model=model,
|
|
190
195
|
)
|
|
@@ -184,16 +184,18 @@ class QueryPipeline:
|
|
|
184
184
|
schema = self.connector.inspect_schema(table_names=quick_tables, include_samples=False, max_samples=0)
|
|
185
185
|
|
|
186
186
|
result.schema = schema
|
|
187
|
+
conv_history = self.conversation.format_context_for_prompt()
|
|
187
188
|
result.message = self.generator.generate_chat_response(
|
|
188
189
|
schema=schema,
|
|
189
190
|
user_prompt=user_prompt,
|
|
191
|
+
conversation_history=conv_history,
|
|
190
192
|
model=self.model,
|
|
191
193
|
)
|
|
192
194
|
result.is_chat = True
|
|
193
195
|
result.was_executed = True
|
|
194
196
|
result.query_type = "chat"
|
|
195
197
|
result.execution_time_ms = (time.time() - t_start) * 1000
|
|
196
|
-
self.conversation.add_turn(user_prompt=user_prompt, sql="", is_chat=True)
|
|
198
|
+
self.conversation.add_turn(user_prompt=user_prompt, sql="", assistant_response=result.message, is_chat=True)
|
|
197
199
|
return result
|
|
198
200
|
except Exception as e:
|
|
199
201
|
result.error = f"Chat generation failed: {str(e)}"
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dbagent-cli"
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.2"
|
|
8
8
|
description = "Enterprise AI Database Copilot, Schema Graph Introspector & Autonomous Recovery Agent (CLI)"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|