fix: ensure production uses DB-configured model/provider from UI
ci/woodpecker/push/test Pipeline was successful
ci/woodpecker/push/build-3 Pipeline was successful
ci/woodpecker/push/build-2 Pipeline was successful
ci/woodpecker/push/build-1 Pipeline was successful
ci/woodpecker/push/finalize Pipeline was successful
Build and Push / lint-and-test (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.adapters.broker_adapter name:broker-adapter]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.aggregation.worker name:aggregation]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.extractor.worker name:extractor]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.ingestion.worker name:ingestion]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.lake_publisher.worker name:lake-publisher]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.parser.worker name:parser]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.recommendation.worker name:recommendation]) (push) Has been cancelled
Build and Push / build-services (map[cmd:python -m services.scheduler.app name:scheduler]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.api.app:app --host 0.0.0.0 --port 8000 name:query-api]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.risk.app:app --host 0.0.0.0 --port 8000 name:risk]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.symbol_registry.app:app --host 0.0.0.0 --port 8000 name:symbol-registry]) (push) Has been cancelled
Build and Push / build-services (map[cmd:uvicorn services.trading.app:app --host 0.0.0.0 --port 8000 name:trading-engine]) (push) Has been cancelled
Build and Push / build-dashboard (push) Has been cancelled
Build and Push / build-superset (push) Has been cancelled
Build and Push / integration-test (push) Has been cancelled
Build and Push / beta-gate (push) Has been cancelled

- Migration 026: update seed defaults from ollama to vllm/AxionML
- Migration 031: fix existing rows still on old ollama defaults
- Helm values: set OLLAMA_BASE_URL to cluster ollama endpoint (was empty)
- Extractor: guard against switching to ollama when base_url is empty
- OllamaClient: validate base_url on construction to fail fast
This commit is contained in:
Celes Renata
2026-04-29 04:33:21 +00:00
parent 5c64043892
commit b38fb24f14
5 changed files with 64 additions and 30 deletions
+1 -1
View File
@@ -174,7 +174,7 @@ config:
REDIS_DB: "0"
MINIO_ENDPOINT: "minio.minio-service.svc.cluster.local:80"
MINIO_SECURE: "false"
OLLAMA_BASE_URL: ""
OLLAMA_BASE_URL: "http://ollama.ollama-service.svc.cluster.local:11434"
OLLAMA_MODEL: "qwen3.5:9b-fast"
OLLAMA_TIMEOUT: "240"
OLLAMA_MAX_RETRIES: "2"
+6 -6
View File
@@ -37,8 +37,8 @@ SELECT * FROM (VALUES
'Document Intelligence Extractor',
'document-extractor',
'Extracts structured intelligence (sentiment, catalysts, impact scores, key facts, risks) from company news, SEC filings, earnings transcripts, and press releases.',
'ollama',
'qwen3.5:9b-fast',
'vllm',
'AxionML/Qwen3.5-9B-NVFP4',
E'You are a financial document analyst. Extract structured data as JSON. Return ONLY a single JSON object. No markdown fences, no explanation, no text before or after the JSON. Every field in the schema is required. Use "other" for catalyst_type if unsure. Keep evidence_spans short (under 20 words each). Keep key_facts to 3-5 items max.',
'document-intel-v2',
'2.0.0',
@@ -48,8 +48,8 @@ SELECT * FROM (VALUES
'Global Event Classifier',
'event-classifier',
'Classifies global/geopolitical news into structured macro events with impact type, severity, affected regions/sectors/commodities, and estimated duration.',
'ollama',
'qwen3.5:9b-fast',
'vllm',
'AxionML/Qwen3.5-9B-NVFP4',
E'You classify MACRO-LEVEL global news into structured event JSON. Return ONLY a single JSON object. No markdown, no explanation. Every field is required. Keep key_facts to 3-5 items. Keep summary under 3 sentences.\n\nCRITICAL: Only classify articles about MACRO events that affect entire markets, sectors, or economies. Examples: trade wars, interest rate changes, commodity supply disruptions, regulatory changes, geopolitical conflicts, natural disasters.\n\nDO NOT classify as macro events: individual company earnings, lawsuits against a single company, single-company management changes, individual stock analysis, company-specific debt or bankruptcy, product launches by one company. For these, set severity to "low", confidence below 0.3, and leave affected_regions, affected_sectors, and affected_commodities as empty arrays.',
'event-classification-v1',
'1.0.0',
@@ -59,8 +59,8 @@ SELECT * FROM (VALUES
'Thesis Rewriter',
'thesis-rewriter',
'Rewrites deterministic trade thesis summaries into clear, professional analyst prose. Optional layer — system falls back to deterministic thesis if this fails.',
'ollama',
'qwen3.5:9b-fast',
'vllm',
'AxionML/Qwen3.5-9B-NVFP4',
E'You are a concise financial analyst. You rewrite structured trade thesis summaries into clear, professional prose suitable for an internal research note.\n\nSTRICT RULES:\n1. Do NOT add any information that is not present in the input.\n2. Do NOT fabricate numbers, dates, company names, or analyst opinions.\n3. Keep the rewrite under 150 words.\n4. Preserve all factual claims, risk notes, and evidence counts from the input.\n5. Use a neutral, professional tone. Avoid hype or marketing language.\n6. Return ONLY the rewritten thesis text. No JSON, no markdown, no commentary.',
'thesis-rewrite-v1',
'1.0.0',
@@ -0,0 +1,13 @@
-- Fix agent default model_provider and model_name to match production config.
-- The original migration 026 seeded with 'ollama'/'qwen3.5:9b-fast' but production
-- uses vLLM. This migration updates agents that still have the old defaults,
-- preserving any user customizations (only updates if model_name matches the old default).
UPDATE ai_agents
SET model_provider = 'vllm',
model_name = 'AxionML/Qwen3.5-9B-NVFP4',
max_tokens = 4096,
updated_at = NOW()
WHERE slug IN ('document-extractor', 'event-classifier', 'thesis-rewriter')
AND source = 'system'
AND model_name = 'qwen3.5:9b-fast';
+5
View File
@@ -140,6 +140,11 @@ class OllamaClient:
max_retries: int | None = None,
http_client: httpx.AsyncClient | None = None,
) -> None:
if not config.base_url or not config.base_url.startswith(("http://", "https://")):
raise ValueError(
f"OllamaClient requires a valid base_url (got {config.base_url!r}). "
"Set OLLAMA_BASE_URL environment variable."
)
self._config = config
self._max_retries = max_retries if max_retries is not None else config.max_retries
self._base_delay = config.retry_base_delay
+16
View File
@@ -486,6 +486,14 @@ async def main() -> None:
model_changed = new_cfg.model != extractor_client._config.model
if provider_changed or model_changed:
# Guard: don't switch to ollama if base_url is empty
if new_provider == "ollama" and not config.ollama.base_url:
logger.warning(
"DB resolved provider=ollama but OLLAMA_BASE_URL is empty — "
"keeping current %s client. Fix the agent config in the UI.",
extractor_provider,
)
else:
logger.info(
"Extractor provider switch: old_provider=%s new_provider=%s "
"model=%s variant=%s",
@@ -517,6 +525,14 @@ async def main() -> None:
cls_model_changed = new_cls_cfg.model != classifier_client._config.model
if cls_provider_changed or cls_model_changed:
# Guard: don't switch to ollama if base_url is empty
if new_cls_provider == "ollama" and not config.ollama.base_url:
logger.warning(
"DB resolved classifier provider=ollama but OLLAMA_BASE_URL is empty — "
"keeping current %s client. Fix the agent config in the UI.",
classifier_provider,
)
else:
logger.info(
"Classifier provider switch: old_provider=%s new_provider=%s "
"model=%s variant=%s",