- Fix admin sidebar: remove duplicate Teams, add Storage nav item - Analytics: client-scoped queries, super_admin sees all (including NULL client_id) - Storage management: list/download/delete presentations with file metadata - Settings page with brand config router - AI usage tracking: new AIUsageModel, ai_usage_service, analytics endpoint - Master deck → template bridge: _register_as_template creates TemplateModel + PresentationLayoutCodeModel so parsed layouts appear in template picker - Multi-provider LLM vision in parser: Anthropic/Google/OpenAI with asyncio.to_thread - Fix PPTX upload 400: accept by .pptx extension (browser sends octet-stream) - Fix reparse FK violation: presentation_id=None for parse_master_deck jobs - Worker job_timeout increased to 1800s for LLM-heavy master deck parsing - PYTHONUNBUFFERED=1 in docker-compose worker for real-time log output - Auth: clientId in /me response, dev-login cookie improvements - Frontend: auth slice clientId, master-deck thumbnails, storage page Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
29 lines
748 B
Python
29 lines
748 B
Python
"""Context variable for propagating user/client/presentation info into LLM calls."""
|
|
import contextvars
|
|
import uuid
|
|
from dataclasses import dataclass, field
|
|
from typing import Optional
|
|
|
|
|
|
@dataclass
|
|
class LLMCallContext:
|
|
user_id: Optional[uuid.UUID] = field(default=None)
|
|
client_id: Optional[uuid.UUID] = field(default=None)
|
|
presentation_id: Optional[uuid.UUID] = field(default=None)
|
|
|
|
|
|
_llm_context: contextvars.ContextVar[Optional[LLMCallContext]] = contextvars.ContextVar(
|
|
"llm_call_context", default=None
|
|
)
|
|
|
|
|
|
def set_llm_context(ctx: LLMCallContext) -> None:
|
|
_llm_context.set(ctx)
|
|
|
|
|
|
def get_llm_context() -> Optional[LLMCallContext]:
|
|
return _llm_context.get()
|
|
|
|
|
|
def clear_llm_context() -> None:
|
|
_llm_context.set(None)
|