Перейти к содержимому

Запись и воспроизведение

Обёртки-кассеты позволяют записать реальные ответы LLM один раз и воспроизводить их детерминированно — идеально для тестов и ноутбуков, которые должны работать офлайн и быстро.

Оберните реальный клиент; каждый ответ записывается в JSONL-кассету:

from mmar_carl import (
RecordingLLMClient, OpenAICompatibleClient, OpenAIClientConfig, ReasoningContext,
)
real = OpenAICompatibleClient(OpenAIClientConfig(
base_url="https://openrouter.ai/api/v1", api_key="sk-or-v1-...", model="qwen/qwen3-coder",
))
rec = RecordingLLMClient(real, "cassette.jsonl", overwrite=True)
ctx = ReasoningContext(outer_context="...", api=rec)
await chain.execute_async(ctx) # makes real calls, records them

Подставьте плеер — без API-ключа, без сети:

from mmar_carl import PlayingLLMClient
play = PlayingLLMClient("cassette.jsonl")
ctx = ReasoningContext(outer_context="...", api=play)
await chain.execute_async(ctx) # reads from the cassette, ~instant

Ключ кассеты — sha256(method + prompt/messages + model + temperature). Если запрос просит ключ, которого нет в кассете, PlayingLLMClient вызывает CassetteMissError (с превью промпта) — так дрейфующий промпт падает громко, вместо тихого вызова реального API.

КлиентКонструктор
RecordingLLMClient(real_client, cassette_path, overwrite=False)
PlayingLLMClient(cassette_path, model=None, temperature=None)