| """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) |
|
|
|
|
| |
| |
| |
|
|
| 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 |
|
|
|
|
| |
| |
| |
|
|
| 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 |
|
|
|
|
| |
| |
| |
|
|
| 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 |
|
|