dbagent-cli 0.6.0__tar.gz → 0.6.1__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.6.0 → dbagent_cli-0.6.1}/PKG-INFO +1 -1
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/__init__.py +1 -1
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/cli.py +48 -16
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/gemini_provider.py +4 -5
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent_cli.egg-info/PKG-INFO +1 -1
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/pyproject.toml +1 -1
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/README.md +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/confidence.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/conversation.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/doctor.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/error_classifier.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/generator.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/pipeline.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/recommender.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/agent/validator.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/config.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/connectors/base.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/connectors/factory.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/connectors/mongo.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/connectors/relational.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/execution/__init__.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/execution/cache.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/execution/changeset.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/execution/cost.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/execution/recovery.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/execution/sandbox.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/execution/streaming.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/auto_setup.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/base.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/factory.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/groq_provider.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/mock_provider.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/ollama_provider.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/llm/openrouter_provider.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/schema/cache.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/schema/formatter.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/schema/graph.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/schema/models.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/schema/retriever.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/schema/selector.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/security/__init__.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/security/audit.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/security/environment.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/security/masking.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/security/modes.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/security/rbac.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/semantic/__init__.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/semantic/dictionary.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/semantic/templates.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/sql/__init__.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/sql/optimizer.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/sql/validator.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/ui/chat_screen.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/ui/console.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/ui/grid_window.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/ui/viewer.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent/ui/visualizer.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent_cli.egg-info/SOURCES.txt +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent_cli.egg-info/dependency_links.txt +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent_cli.egg-info/entry_points.txt +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent_cli.egg-info/requires.txt +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/dbagent_cli.egg-info/top_level.txt +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/setup.cfg +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_cache.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_cli.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_connectors.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_doctor_and_viz.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_generator.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_graph.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_recovery.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_safety.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_sandbox.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_schema.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_security.py +0 -0
- {dbagent_cli-0.6.0 → dbagent_cli-0.6.1}/tests/test_semantic.py +0 -0
|
@@ -531,9 +531,9 @@ def chat_command(
|
|
|
531
531
|
console.print(" [bold]:doctor[/bold] -> Run database health diagnostics")
|
|
532
532
|
console.print(" [bold]:mode <name>[/bold] -> Switch mode (SAFE, READ_ONLY, CONFIRM, SANDBOX, ADMIN)")
|
|
533
533
|
console.print(" [bold]:changes[/bold] -> List recent write ChangeSets")
|
|
534
|
-
console.print(" [bold]:provider <name>[/bold] -> Switch AI provider (
|
|
535
|
-
console.print(" [bold]:
|
|
536
|
-
console.print(" [bold]:
|
|
534
|
+
console.print(" [bold]:provider <name>[/bold] -> Switch AI provider (gemini, ollama, groq, openrouter)")
|
|
535
|
+
console.print(" [bold]:models[/bold] -> View list of available AI models & speed benchmarks")
|
|
536
|
+
console.print(" [bold]:model <num|name>[/bold] -> Switch active model (:model 1, :model 3.7, :model 3.6)")
|
|
537
537
|
console.print(" [bold]:page <n>[/bold] -> View column page <n> for wide multi-column tables")
|
|
538
538
|
console.print(" [bold]:card[/bold] -> View last result in expanded vertical card format (all columns)")
|
|
539
539
|
console.print(" [bold]:wide[/bold] -> Force-show all columns in terminal (zoom out)")
|
|
@@ -699,21 +699,53 @@ def chat_command(
|
|
|
699
699
|
print_error(f"Unknown provider '{cmd_arg}'. Supported: ollama, gemini, groq, openrouter")
|
|
700
700
|
continue
|
|
701
701
|
|
|
702
|
-
if cmd_name
|
|
703
|
-
if
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
702
|
+
if cmd_name in [":model", ":models", ":providers", ":ai"]:
|
|
703
|
+
avail_models = llm.list_models() if hasattr(llm, "list_models") else []
|
|
704
|
+
curr_model = model or getattr(llm, "default_model", "default")
|
|
705
|
+
|
|
706
|
+
# If no arg passed or :models/:providers called, show rich model selection menu
|
|
707
|
+
if not cmd_arg or cmd_name in [":models", ":providers", ":ai"]:
|
|
708
|
+
console.print(f"\n[bold cyan]Active AI Provider:[/bold cyan] [bold white]{llm.name}[/bold white]")
|
|
709
|
+
console.print(f"[bold cyan]Active Model:[/bold cyan] [bold green]{curr_model}[/bold green]\n")
|
|
710
|
+
if avail_models:
|
|
711
|
+
console.print(f"[bold]Available Models for {llm.name}:[/bold]")
|
|
712
|
+
model_descriptions = {
|
|
713
|
+
"gemini-flash-lite-latest": "⚡ Ultra-Fast (~0.8s) • Recommended for instant chat & queries",
|
|
714
|
+
"gemini-3.6-flash": "⚡ High Quality (~3.5s) • Strong SQL reasoning & accuracy",
|
|
715
|
+
"gemini-3.7-flash": "🧠 Deep Reasoning (~13s) • Latest flagship model",
|
|
716
|
+
"gemini-3.1-flash-lite": "⚡ Fast Lite (~4.0s) • Low latency",
|
|
717
|
+
"gemini-flash-latest": "⚡ Standard Flash (~7.0s)",
|
|
718
|
+
}
|
|
719
|
+
for idx, m_name in enumerate(avail_models, 1):
|
|
720
|
+
is_active = " [bold green]✓ Active[/bold green]" if m_name == curr_model else ""
|
|
721
|
+
desc = model_descriptions.get(m_name, "")
|
|
722
|
+
desc_str = f" - [dim]{desc}[/dim]" if desc else ""
|
|
723
|
+
console.print(f" [bold cyan]{idx}[/bold cyan]. [bold white]{m_name}[/bold white]{desc_str}{is_active}")
|
|
724
|
+
console.print("\n[dim]Quick Switch: [bold]:model 1[/bold] (ultra-fast) | [bold]:model 3.7[/bold] | [bold]:model 3.6[/bold] | [bold]:model <name>[/bold][/dim]\n")
|
|
707
725
|
continue
|
|
708
|
-
model = cmd_arg
|
|
709
|
-
print_success(f"Switched active model to [bold cyan]{model}[/bold cyan] (Provider: {llm.name})")
|
|
710
|
-
continue
|
|
711
726
|
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
727
|
+
# Handle numeric shortcut or name shortcut
|
|
728
|
+
target_model = cmd_arg.strip()
|
|
729
|
+
if target_model.isdigit() and avail_models:
|
|
730
|
+
choice_idx = int(target_model) - 1
|
|
731
|
+
if 0 <= choice_idx < len(avail_models):
|
|
732
|
+
target_model = avail_models[choice_idx]
|
|
733
|
+
elif target_model in ["3.7", "37"]:
|
|
734
|
+
target_model = "gemini-3.7-flash"
|
|
735
|
+
elif target_model in ["3.6", "36"]:
|
|
736
|
+
target_model = "gemini-3.6-flash"
|
|
737
|
+
elif target_model in ["lite", "fast", "flash-lite", "1"]:
|
|
738
|
+
target_model = "gemini-flash-lite-latest"
|
|
739
|
+
elif target_model in ["3.1"]:
|
|
740
|
+
target_model = "gemini-3.1-flash-lite"
|
|
741
|
+
elif avail_models:
|
|
742
|
+
matches = [m for m in avail_models if target_model.lower() in m.lower()]
|
|
743
|
+
if matches:
|
|
744
|
+
target_model = matches[0]
|
|
745
|
+
|
|
746
|
+
model = target_model
|
|
747
|
+
pipeline.model = model
|
|
748
|
+
print_success(f"Switched active model to [bold cyan]{model}[/bold cyan] (Provider: {llm.name})")
|
|
717
749
|
continue
|
|
718
750
|
|
|
719
751
|
if cmd_name == ":explain":
|
|
@@ -14,19 +14,18 @@ class GeminiProvider(BaseLLMProvider):
|
|
|
14
14
|
"""Google Gemini LLM provider (Free Tier available)."""
|
|
15
15
|
|
|
16
16
|
FALLBACK_MODELS = [
|
|
17
|
+
"gemini-flash-lite-latest",
|
|
17
18
|
"gemini-3.6-flash",
|
|
18
19
|
"gemini-3.7-flash",
|
|
19
|
-
"gemini-3.
|
|
20
|
+
"gemini-3.1-flash-lite",
|
|
20
21
|
"gemini-flash-latest",
|
|
21
|
-
"gemini-pro-latest",
|
|
22
|
-
"gemini-2.5-flash",
|
|
23
22
|
]
|
|
24
23
|
|
|
25
24
|
def __init__(self, api_key: Optional[str] = None, default_model: str = "gemini-3.6-flash"):
|
|
26
25
|
self.api_key = api_key or os.getenv("GEMINI_API_KEY")
|
|
27
26
|
self.default_model = default_model
|
|
28
27
|
self._session = requests.Session()
|
|
29
|
-
self._session.headers.update({"User-Agent": "DB-Agent/0.
|
|
28
|
+
self._session.headers.update({"User-Agent": "DB-Agent/0.6.0"})
|
|
30
29
|
|
|
31
30
|
@property
|
|
32
31
|
def name(self) -> str:
|
|
@@ -117,7 +116,7 @@ class GeminiProvider(BaseLLMProvider):
|
|
|
117
116
|
else:
|
|
118
117
|
raise RuntimeError(f"Gemini API error ({response.status_code}): {response.text}")
|
|
119
118
|
else:
|
|
120
|
-
response = self._session.post(endpoint, json=payload, timeout=
|
|
119
|
+
response = self._session.post(endpoint, json=payload, timeout=15)
|
|
121
120
|
if response.status_code == 200:
|
|
122
121
|
data = response.json()
|
|
123
122
|
candidates = data.get("candidates", [])
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dbagent-cli"
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.1"
|
|
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
|