import os from collections.abc import Iterable from typing import Any, Literal, Union import anthropic import pytest from _pytest.monkeypatch import MonkeyPatch from anthropic import Stream from anthropic.resources import Messages from anthropic.types import ( ContentBlock, ContentBlockDeltaEvent, Message, MessageDeltaEvent, MessageDeltaUsage, MessageParam, MessageStartEvent, MessageStopEvent, MessageStreamEvent, TextDelta, Usage, ) from anthropic.types.message_delta_event import Delta MOCK = os.getenv("MOCK_SWITCH", "false") == "true" class MockAnthropicClass: @staticmethod def mocked_anthropic_chat_create_sync(model: str) -> Message: return Message( id="msg-123", type="message", role="assistant", content=[ContentBlock(text="hello, I'm a chatbot from anthropic", type="text")], model=model, stop_reason="stop_sequence", usage=Usage(input_tokens=1, output_tokens=1), ) @staticmethod def mocked_anthropic_chat_create_stream(model: str) -> Stream[MessageStreamEvent]: full_response_text = "hello, I'm a chatbot from anthropic" yield MessageStartEvent( type="message_start", message=Message( id="msg-123", content=[], role="assistant", model=model, stop_reason=None, type="message", usage=Usage(input_tokens=1, output_tokens=1), ), ) index = 0 for i in range(0, len(full_response_text)): yield ContentBlockDeltaEvent( type="content_block_delta", delta=TextDelta(text=full_response_text[i], type="text_delta"), index=index ) index += 1 yield MessageDeltaEvent( type="message_delta", delta=Delta(stop_reason="stop_sequence"), usage=MessageDeltaUsage(output_tokens=1) ) yield MessageStopEvent(type="message_stop") def mocked_anthropic( self: Messages, *, max_tokens: int, messages: Iterable[MessageParam], model: str, stream: Literal[True], **kwargs: Any, ) -> Union[Message, Stream[MessageStreamEvent]]: if len(self._client.api_key) < 18: raise anthropic.AuthenticationError("Invalid API key") if stream: return MockAnthropicClass.mocked_anthropic_chat_create_stream(model=model) else: return MockAnthropicClass.mocked_anthropic_chat_create_sync(model=model) @pytest.fixture def setup_anthropic_mock(request, monkeypatch: MonkeyPatch): if MOCK: monkeypatch.setattr(Messages, "create", MockAnthropicClass.mocked_anthropic) yield if MOCK: monkeypatch.undo()