File size: 5,185 Bytes
8871df9 cc2ed2f 8871df9 cc2ed2f 8871df9 cc2ed2f 8871df9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | """Pydantic-ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π»Ρ FastAPI endpoints."""
from __future__ import annotations
from pydantic import BaseModel, Field
class VocabularyPayload(BaseModel):
"""ΠΠΈΠ·Π½Π΅Ρ-ΡΠ»ΠΎΠ²Π°ΡΡ Π² ΡΠΎΡΠΌΠ°ΡΠ΅, ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΠΌ Ρ BusinessVocabulary.from_dict.
ΠΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠΎΠΌ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ Π² Π·Π°ΠΏΡΠΎΡΠ΅ Π½Π° Π³Π΅Π½Π΅ΡΠ°ΡΠΈΡ SQL. ΠΡΠ»ΠΈ ΠΏΠΎΠ»Π΅
ΠΎΡΡΡΡΡΡΠ²ΡΠ΅Ρ β ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±Π΅Π· ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΡ
Π±ΠΈΠ·Π½Π΅Ρ-ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ.
"""
company: str = ""
terms: dict[str, str] = Field(default_factory=dict)
filters: dict[str, str] = Field(default_factory=dict)
notes: list[str] = Field(default_factory=list)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# /generate-sql β ΡΡΠ°ΡΡΠΉ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ Π΄Π»Ρ PAUQ-ΡΡΡΡΠΊΡΡΡΡ (databases_dir + db_id)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
class GenerateRequest(BaseModel):
question: str = Field(..., min_length=1, max_length=2000, description="ΠΠΎΠΏΡΠΎΡ Π½Π° ΡΡΡΡΠΊΠΎΠΌ")
db_id: str = Field(..., min_length=1, description="ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΠ ΠΈΠ· PAUQ")
execute: bool = Field(default=False, description="ΠΡΠΎΠ³Π½Π°ΡΡ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ SQL Π½Π° ΠΠ")
vocabulary: VocabularyPayload | None = Field(
default=None,
description="ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΉ Π±ΠΈΠ·Π½Π΅Ρ-ΡΠ»ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 3.6 ΠΠΠ )",
)
class ExecutionResult(BaseModel):
columns: list[str]
rows: list[list]
row_count: int
class GenerateResponse(BaseModel):
sql: str
raw_output: str
is_valid_sql: bool
execution: ExecutionResult | None = None
error: str | None = None
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# /query β Π½ΠΎΠ²ΡΠΉ ΡΠ½Π΄ΠΏΠΎΠΈΠ½Ρ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΠ (connection string)
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
class QueryRequest(BaseModel):
"""ΠΠΎΠ»Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ Β«Π²ΠΎΠΏΡΠΎΡ Π½Π° ΡΡΡΡΠΊΠΎΠΌ β SQL β ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΒ» Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΠ.
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ GenerateRequest, Π½Π΅ ΠΏΡΠΈΠ²ΡΠ·Π°Π½ ΠΊ PAUQ-ΡΡΡΡΠΊΡΡΡΠ΅: ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ°ΠΌ
ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ connection string (SQLite/PostgreSQL/MySQL). ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
Streamlit-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΠΈ Π»ΡΠ±ΡΠΌΠΈ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΌΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°ΠΌΠΈ.
"""
question: str = Field(..., min_length=1, max_length=2000)
connection_string: str = Field(
..., min_length=1,
description="Π‘ΡΡΠΎΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Ρ: sqlite:///data/demo/sales.sqlite",
)
execute: bool = Field(default=True)
vocabulary: VocabularyPayload | None = None
class QueryResponse(BaseModel):
sql: str
raw_output: str
is_valid_sql: bool
gen_time_seconds: float
execution: ExecutionResult | None = None
error: str | None = None
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# /schema β ΠΎΡΠ΄Π°ΡΡ ΡΡ
Π΅ΠΌΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠΉ ΠΠ Π΄Π»Ρ ΠΏΠΎΠ΄ΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π² UI
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
class SchemaRequest(BaseModel):
connection_string: str = Field(..., min_length=1)
include_samples: bool = Field(default=True)
class ColumnPayload(BaseModel):
name: str
type: str
nullable: bool
primary_key: bool
class TablePayload(BaseModel):
name: str
columns: list[ColumnPayload]
sample_rows: list[list]
ddl: str
class SchemaResponse(BaseModel):
tables: list[TablePayload]
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# ΠΡΠΎΡΠ΅Π΅
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
class DatabaseInfo(BaseModel):
db_id: str
tables: list[str]
class HealthResponse(BaseModel):
status: str
model_loaded: bool
base_model: str
|