"""Shared resolver for background-task AI endpoints.""" from src.endpoint_resolver import ( resolve_chat_fallback_candidates, resolve_endpoint, resolve_utility_fallback_candidates, ) from src.llm_core import llm_call_async_with_fallback def resolve_task_endpoint(fallback_url=None, fallback_model=None, fallback_headers=None, owner=None): """Return (endpoint_url, model, headers) for background tasks. Reads task_endpoint_id / task_model from admin settings. Falls back to the provided values when the setting is empty or the endpoint cannot be resolved. """ return resolve_endpoint("task", fallback_url, fallback_model, fallback_headers, owner=owner) def resolve_task_candidates( fallback_url=None, fallback_model=None, fallback_headers=None, owner=None, ): """Return ordered background-task LLM candidates. Order: 1. configured Background Tasks endpoint/model, or caller fallback 2. Utility endpoint/model 3. Default endpoint/model 4. Utility fallback chain 5. Default fallback chain """ candidates = [] def _append(url, model, headers): if not url or not model: return key = (url, model) if any((u, m) == key for u, m, _ in candidates): return candidates.append((url, model, headers or {})) _append(*resolve_task_endpoint(fallback_url, fallback_model, fallback_headers, owner=owner)) _append(*resolve_endpoint("utility", owner=owner)) _append(*resolve_endpoint("default", owner=owner)) for url, model, headers in resolve_utility_fallback_candidates(owner=owner): _append(url, model, headers) for url, model, headers in resolve_chat_fallback_candidates(owner=owner): _append(url, model, headers) return candidates async def task_llm_call_async( messages, *, fallback_url=None, fallback_model=None, fallback_headers=None, owner=None, **kwargs, ): """Call the shared background-task LLM candidate chain.""" candidates = resolve_task_candidates( fallback_url=fallback_url, fallback_model=fallback_model, fallback_headers=fallback_headers, owner=owner, ) if not candidates: raise RuntimeError("No LLM endpoint available for background task") return await llm_call_async_with_fallback(candidates, messages=messages, **kwargs)