1use std::sync::Arc;
25
26#[derive(Debug, Clone, Copy, PartialEq, Eq)]
28pub enum AIBackendKind {
29 Pattern,
31 Local,
33}
34
35impl Default for AIBackendKind {
36 fn default() -> Self { Self::Pattern }
37}
38
39#[derive(Debug, Clone)]
41pub struct AIResult {
42 pub text: String,
43 pub explanation: Option<String>,
44 pub tips: Option<Vec<String>>,
45 pub sql: Option<String>,
46}
47
48pub trait AIBackend: Send + Sync {
50 fn generate(&self, prompt: &str) -> AIResult;
51}
52
53pub struct LocalAIDummyBackend;
55
56impl LocalAIDummyBackend {
57 pub fn new() -> Arc<Self> { Arc::new(Self) }
58}
59
60impl AIBackend for LocalAIDummyBackend {
61 fn generate(&self, prompt: &str) -> AIResult {
62 let lower = prompt.to_lowercase();
64 if lower.contains("schema") {
65 return AIResult {
66 text: "📘 Local AI: Posso ajudar descrevendo seu schema. Liste tabelas ou campos específicos para detalhes.".to_string(),
67 explanation: Some("Este é um backend local stub. Para descrição de schema real iremos consultar metadados do AvilaDB.".to_string()),
68 tips: Some(vec![
69 "Use 'listar tabelas' ou 'detalhar tabela <nome>'".to_string(),
70 "Integre metadados em cache para baixa latência".to_string(),
71 ]),
72 sql: None,
73 };
74 }
75 if lower.contains("crie") && lower.contains("tabela") {
76 return AIResult {
77 text: "🛠️ Local AI: Gerando proposta de DDL para a tabela solicitada.".to_string(),
78 explanation: Some("Geração de DDL básica baseada em palavras-chave. Ajuste tipos conforme necessidade.".to_string()),
79 tips: Some(vec!["Adicione índices para colunas de filtro".to_string(), "Evite muitos campos NULL".to_string()]),
80 sql: Some("CREATE TABLE exemplo (
81 id UUID PRIMARY KEY,
82 nome TEXT NOT NULL,
83 criado_em TIMESTAMP DEFAULT NOW()
84);".to_string()),
85 };
86 }
87 AIResult {
88 text: "🤖 Local AI stub: modelo local ainda não treinado para esta solicitação. Forneça mais contexto ou habilite o backend de padrão (pattern).".to_string(),
89 explanation: Some("Backend local está em modo placeholder. Próximas versões incluirão carregamento de pesos e geração token por token.".to_string()),
90 tips: Some(vec![
91 "Defina objetivo claro: ex. 'Gerar SQL para vendas por mês'".to_string(),
92 "Inclua entidades e filtros explícitos".to_string(),
93 ]),
94 sql: None,
95 }
96 }
97}