Setter opp AI Gateway med LiteLLM som sentralisert proxy for alle AI-kall. PG eier all modellkonfigurasjon — LiteLLM er stateløs. - Migrasjon 008: ai_model_aliases, ai_model_providers, ai_job_routing med seed-data for sidelinja/rutine og sidelinja/resonering - Config-generering fra PG: scripts/generate-litellm-config.sh filtrerer bort providers med tomme API-nøkler - Docker-container kjører på sidelinja-net (intern, ingen eksponert port) - Maskinrommet har AI_GATEWAY_URL via maskinrommet-env.sh - API-nøkkel-placeholders i .env (GEMINI, ANTHROPIC, XAI) - Oppdatert docs/infra/ai_gateway.md med faktisk config Verifisert: container healthy, modellaliaser eksponert, maskinrommet har korrekt gateway-URL. Reelle API-kall krever at Vegard fyller inn leverandør-nøkler i /srv/synops/.env. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
100 lines
5.1 KiB
SQL
100 lines
5.1 KiB
SQL
-- 008_ai_model_routing.sql — Modellruting for AI Gateway (LiteLLM).
|
|
--
|
|
-- Nye tabeller:
|
|
-- ai_model_aliases — globale modellaliaser (sidelinja/rutine, sidelinja/resonering)
|
|
-- ai_model_providers — leverandør-modeller med prioritert fallback per alias
|
|
-- ai_job_routing — jobbtype → modellalias mapping
|
|
--
|
|
-- Ref: docs/infra/ai_gateway.md §3.2
|
|
|
|
-- =============================================================================
|
|
-- 1. Modellaliaser
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE ai_model_aliases (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
alias TEXT NOT NULL,
|
|
description TEXT,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
UNIQUE(alias)
|
|
);
|
|
|
|
COMMENT ON TABLE ai_model_aliases IS 'Globale modellaliaser — abstraherer bort leverandør-spesifikke modellnavn';
|
|
|
|
-- =============================================================================
|
|
-- 2. Leverandør-modeller med fallback
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE ai_model_providers (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
alias_id UUID NOT NULL REFERENCES ai_model_aliases(id) ON DELETE CASCADE,
|
|
provider TEXT NOT NULL,
|
|
model TEXT NOT NULL,
|
|
api_key_env TEXT NOT NULL,
|
|
priority SMALLINT NOT NULL,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
UNIQUE(alias_id, model)
|
|
);
|
|
|
|
COMMENT ON TABLE ai_model_providers IS 'Leverandør-modeller per alias, sortert etter priority (lavere = prøves først)';
|
|
|
|
-- =============================================================================
|
|
-- 3. Jobbtype → modellalias mapping
|
|
-- =============================================================================
|
|
|
|
CREATE TABLE ai_job_routing (
|
|
job_type TEXT PRIMARY KEY,
|
|
alias TEXT NOT NULL,
|
|
description TEXT
|
|
);
|
|
|
|
COMMENT ON TABLE ai_job_routing IS 'Hvilken modellalias brukes for hvilken jobbtype';
|
|
|
|
-- =============================================================================
|
|
-- 4. Seed: initielle aliaser og providers
|
|
-- =============================================================================
|
|
|
|
-- Rutine-alias (billig, høyt volum)
|
|
INSERT INTO ai_model_aliases (alias, description) VALUES
|
|
('sidelinja/rutine', 'Billig, høyt volum — tekstvasking, research, metadata'),
|
|
('sidelinja/resonering', 'Høy kvalitet — resonneringsoppgaver, live-assistent');
|
|
|
|
-- Providers for sidelinja/rutine
|
|
INSERT INTO ai_model_providers (alias_id, provider, model, api_key_env, priority) VALUES
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/rutine'), 'xai', 'xai/grok-4-1-fast-non-reasoning', 'XAI_API_KEY', 1),
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/rutine'), 'gemini', 'gemini/gemini-2.5-flash-lite', 'GEMINI_API_KEY', 2),
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/rutine'), 'gemini', 'gemini/gemini-flash-lite-latest', 'GEMINI_API_KEY', 3),
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/rutine'), 'gemini', 'gemini/gemini-flash-latest', 'GEMINI_API_KEY', 4),
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/rutine'), 'openrouter', 'openrouter/google/gemini-2.5-flash', 'OPENROUTER_API_KEY', 5);
|
|
|
|
-- Providers for sidelinja/resonering
|
|
INSERT INTO ai_model_providers (alias_id, provider, model, api_key_env, priority) VALUES
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/resonering'), 'anthropic', 'anthropic/claude-sonnet-4-20250514', 'ANTHROPIC_API_KEY', 1),
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/resonering'), 'openrouter', 'openrouter/anthropic/claude-sonnet-4', 'OPENROUTER_API_KEY', 2),
|
|
((SELECT id FROM ai_model_aliases WHERE alias = 'sidelinja/resonering'), 'openrouter', 'openrouter/google/gemini-2.5-flash', 'OPENROUTER_API_KEY', 3);
|
|
|
|
-- Jobbtype → alias routing
|
|
INSERT INTO ai_job_routing (job_type, alias, description) VALUES
|
|
('ai_text_process', 'sidelinja/rutine', 'Tekstvasking og ✨-behandling, høyt volum'),
|
|
('whisper_postprocess', 'sidelinja/rutine', 'Transkripsjonsvasking etter Whisper'),
|
|
('research_clip', 'sidelinja/rutine', 'Research-oppsummering'),
|
|
('live_factoid_eval', 'sidelinja/resonering', 'Faktoid-vurdering under live sending — krever presisjon'),
|
|
('agent_respond', 'sidelinja/resonering', 'Claude chat-agent svar');
|
|
|
|
-- =============================================================================
|
|
-- 5. Oppdater agent_identities config til ny alias
|
|
-- =============================================================================
|
|
|
|
UPDATE agent_identities
|
|
SET config = jsonb_set(config, '{model_alias}', '"sidelinja/resonering"')
|
|
WHERE agent_key = 'claude-main'
|
|
AND config->>'model_alias' = 'resonering';
|
|
|
|
-- =============================================================================
|
|
-- 6. Tilganger
|
|
-- =============================================================================
|
|
|
|
GRANT SELECT ON ai_model_aliases TO synops_reader;
|
|
GRANT SELECT ON ai_model_providers TO synops_reader;
|
|
GRANT SELECT ON ai_job_routing TO synops_reader;
|