Files
curo1305 1d01cc3b0e Add per-service system prompts with AI Settings tab view
Each feature service owns its system prompt in its config JSON on the
shared volume. The AI Settings page now has General and System Prompts
tabs — admins can view and edit any service's prompts at runtime with
changes taking effect within 30 s (config cache TTL).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 15:11:40 +02:00

59 lines
1.7 KiB
Python

"""HTTP client for the shared ai-service container."""
import json
import httpx
from app.core.config import settings
from app.services.config_reader import (
_DEFAULT_SYSTEM_PROMPT,
_DEFAULT_USER_TEMPLATE,
load_doc_config,
)
_client = httpx.AsyncClient(timeout=120.0)
class AIServiceError(Exception):
pass
async def classify_document(text: str) -> dict:
"""
Send document text to ai-service for classification.
Returns the parsed JSON result dict.
Raises AIServiceError on HTTP errors or unexpected response shapes.
"""
config = await load_doc_config()
prompts = config.get("system_prompts", {})
system_prompt = prompts.get("system") or _DEFAULT_SYSTEM_PROMPT
user_template = prompts.get("user_template") or _DEFAULT_USER_TEMPLATE
messages = [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_template.format(text=text[:50_000])},
]
try:
response = await _client.post(
f"{settings.AI_SERVICE_URL}/chat",
json={
"messages": messages,
"max_tokens": 2048,
"temperature": 0,
"response_format": "json",
},
)
except httpx.RequestError as exc:
raise AIServiceError(f"Could not reach ai-service: {exc}") from exc
if response.status_code != 200:
raise AIServiceError(
f"ai-service returned {response.status_code}: {response.text[:200]}"
)
try:
content = response.json()["content"]
return json.loads(content)
except (KeyError, json.JSONDecodeError) as exc:
raise AIServiceError(f"Unexpected ai-service response: {exc}") from exc