ppt-tool/backend/utils/llm_context.py
Vadym Samoilenko d3d1667a79 Phase 2: Admin panel, analytics, storage, template pipeline, multi-provider LLM
- 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>
2026-02-26 23:39:34 +00:00

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)