rebuild(stage-10): deliver mentor and unified llm streaming
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import sqlite3
|
||||
|
||||
from backend.database.migrations.runner import Migration
|
||||
|
||||
|
||||
def upgrade(connection: sqlite3.Connection) -> None:
|
||||
statements = (
|
||||
"""
|
||||
CREATE TABLE mentor_preferences (
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
mentor_id TEXT NOT NULL,
|
||||
pinned INTEGER NOT NULL DEFAULT 0 CHECK (pinned IN (0, 1)),
|
||||
sort_order INTEGER NOT NULL DEFAULT 0,
|
||||
updated_at TEXT NOT NULL,
|
||||
PRIMARY KEY (user_id, mentor_id)
|
||||
)
|
||||
""",
|
||||
"""
|
||||
CREATE TABLE llm_requests (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
feature TEXT NOT NULL,
|
||||
business_id TEXT NOT NULL,
|
||||
prompt_version TEXT NOT NULL,
|
||||
status TEXT NOT NULL CHECK (
|
||||
status IN ('reserved', 'streaming', 'success', 'failed', 'stopped')
|
||||
),
|
||||
started_at TEXT NOT NULL,
|
||||
completed_at TEXT,
|
||||
duration_ms INTEGER NOT NULL DEFAULT 0,
|
||||
error_type TEXT NOT NULL DEFAULT '',
|
||||
input_chars INTEGER NOT NULL DEFAULT 0,
|
||||
output_chars INTEGER NOT NULL DEFAULT 0
|
||||
)
|
||||
""",
|
||||
"CREATE INDEX llm_requests_user_started_idx ON llm_requests(user_id, started_at)",
|
||||
"""
|
||||
CREATE TABLE llm_attempts (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
request_id TEXT NOT NULL REFERENCES llm_requests(id) ON DELETE CASCADE,
|
||||
model_id INTEGER REFERENCES llm_models(id) ON DELETE SET NULL,
|
||||
role TEXT NOT NULL CHECK (role IN ('primary', 'fallback')),
|
||||
status TEXT NOT NULL CHECK (status IN ('streaming', 'success', 'failed', 'stopped')),
|
||||
started_at TEXT NOT NULL,
|
||||
completed_at TEXT,
|
||||
duration_ms INTEGER NOT NULL DEFAULT 0,
|
||||
error_type TEXT NOT NULL DEFAULT '',
|
||||
input_chars INTEGER NOT NULL DEFAULT 0,
|
||||
output_chars INTEGER NOT NULL DEFAULT 0
|
||||
)
|
||||
""",
|
||||
"CREATE INDEX llm_attempts_request_idx ON llm_attempts(request_id, id)",
|
||||
"""
|
||||
CREATE TABLE mentor_messages (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
||||
mentor_id TEXT NOT NULL,
|
||||
trade_date TEXT NOT NULL,
|
||||
role TEXT NOT NULL CHECK (role IN ('user', 'assistant')),
|
||||
content TEXT NOT NULL,
|
||||
request_id TEXT REFERENCES llm_requests(id) ON DELETE SET NULL,
|
||||
status TEXT NOT NULL CHECK (status IN ('complete', 'stopped', 'error')),
|
||||
created_at TEXT NOT NULL
|
||||
)
|
||||
""",
|
||||
"""
|
||||
CREATE INDEX mentor_messages_scope_idx
|
||||
ON mentor_messages(user_id, mentor_id, trade_date, id)
|
||||
""",
|
||||
)
|
||||
for statement in statements:
|
||||
connection.execute(statement)
|
||||
|
||||
|
||||
def downgrade(connection: sqlite3.Connection) -> None:
|
||||
for table in (
|
||||
"mentor_messages",
|
||||
"llm_attempts",
|
||||
"llm_requests",
|
||||
"mentor_preferences",
|
||||
):
|
||||
connection.execute(f"DROP TABLE {table}")
|
||||
|
||||
|
||||
MIGRATION = Migration(
|
||||
version=8,
|
||||
name="create_mentor_and_llm_audit",
|
||||
signature="mentor-llm:v1:preferences-messages-requests-attempts",
|
||||
upgrade=upgrade,
|
||||
downgrade=downgrade,
|
||||
)
|
||||
@@ -5,6 +5,7 @@ from backend.database.migrations.m0004_sector_members import MIGRATION as SECTOR
|
||||
from backend.database.migrations.m0005_market_insights import MIGRATION as MARKET_INSIGHTS
|
||||
from backend.database.migrations.m0006_watchlists import MIGRATION as WATCHLISTS
|
||||
from backend.database.migrations.m0007_screener import MIGRATION as SCREENER
|
||||
from backend.database.migrations.m0008_mentor_llm import MIGRATION as MENTOR_LLM
|
||||
from backend.database.migrations.runner import Migration
|
||||
|
||||
MIGRATIONS: tuple[Migration, ...] = (
|
||||
@@ -15,4 +16,5 @@ MIGRATIONS: tuple[Migration, ...] = (
|
||||
MARKET_INSIGHTS,
|
||||
WATCHLISTS,
|
||||
SCREENER,
|
||||
MENTOR_LLM,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user