import io import sys from pathlib import Path from types import SimpleNamespace as NS import pytest from PIL import Image sys.path.insert(0, str(Path(__file__).resolve().parents[1])) RACINE = Path(__file__).resolve().parents[1] def image_jpeg(l=1376, h=768, couleur=(120, 90, 60)) -> bytes: buf = io.BytesIO() Image.new("RGB", (l, h), couleur).save(buf, "JPEG") return buf.getvalue() def reponse(data: bytes | None, texte="ok", raison="STOP"): parts = [NS(text=texte, inline_data=None, thought=False)] if data: parts.append(NS(text=None, inline_data=NS(data=data, mime_type="image/jpeg"), thought=False)) usage = NS(prompt_token_count=300, candidates_token_count=1520, thoughts_token_count=None, candidates_tokens_details=[NS(modality=NS(value="IMAGE"), token_count=1120)]) return NS(candidates=[NS(content=NS(parts=parts), finish_reason=raison)], usage_metadata=usage, prompt_feedback=None) class FauxChat: def __init__(self, journal, reponses): self.journal, self.reponses = journal, reponses def send_message(self, parts): self.journal.append(parts) r = self.reponses.pop(0) if self.reponses else reponse(image_jpeg()) if isinstance(r, Exception): raise r return r class FauxClient: """Imite client.chats.create(...).send_message(...) sans réseau.""" def __init__(self, reponses=None): self.journal, self.configs, self.reponses = [], [], list(reponses or []) self.chats = NS(create=self._create) def _create(self, model, config): self.configs.append((model, config)) return FauxChat(self.journal, self.reponses) @pytest.fixture def brief_demo(): return RACINE / "brief.yaml"