# pxy_openai/views.py import json import logging import tempfile from typing import Any, Dict, Optional from django.http import JsonResponse, HttpResponse from django.views.decorators.csrf import csrf_exempt from django.apps import apps from django.utils.text import slugify from .assistants import OpenAIAssistant logger = logging.getLogger(__name__) # ----------------------- # Helpers # ----------------------- def _parse_json(request) -> Dict[str, Any]: try: if request.content_type and "application/json" in request.content_type: return json.loads(request.body.decode("utf-8") or "{}") # allow x-www-form-urlencoded fallback if request.POST and request.POST.get("payload"): return json.loads(request.POST["payload"]) except Exception as e: logger.warning("openai.api.bad_json: %s", e) return {} def _render_text(text: str) -> Dict[str, Any]: return { "schema_version": "render.v1", "messages": [{"type": "text", "text": str(text)}], } def _render_error(text: str, status: int = 400) -> JsonResponse: # Return as render.v1 for bot consumption (keeps UX consistent) return JsonResponse(_render_text(f"⚠️ {text}"), status=status) def _get_bot_and_token(bot_username: Optional[str]) -> Optional[str]: """ Find Telegram bot token by either TelegramBot.name or .username matching the provided bot_username. Returns token or None. """ if not bot_username: return None TelegramBot = apps.get_model("pxy_bots", "TelegramBot") bot = (TelegramBot.objects.filter(name=bot_username, is_active=True).first() or TelegramBot.objects.filter(username=bot_username, is_active=True).first()) return bot.token if bot else None def _assistant_from_payload(env: Dict[str, Any]) -> Optional[OpenAIAssistant]: """ Build OpenAIAssistant from a provided name in payload, otherwise try a sensible default. You can pass "assistant": "Urbanista" in the root payload. """ name = (env.get("assistant") or "Urbanista") try: return OpenAIAssistant(name=name) except Exception as e: logger.error("openai.assistant.init_failed name=%s err=%s", name, e) return None # ----------------------- # /api/openai/transcribe # ----------------------- @csrf_exempt def transcribe(request): """ Transcribe audio to text. JSON mode (Telegram voice): { "schema_version":"req.v1", "bot":{"username":"PepeBasuritaCoinsBot"}, "user":{"language":"es"}, "input":{"media":{"type":"voice","file_id":"..."}} "assistant":"Urbanista" # optional } Multipart mode (direct upload): POST multipart/form-data with file=