import os from time import sleep from typing import Any, Literal, Union, Iterable from anthropic.resources import Messages from anthropic.types.message_delta_event import Delta import anthropic import pytest from _pytest.monkeypatch import MonkeyPatch from anthropic import Anthropic, Stream from anthropic.types import MessageParam, Message, MessageStreamEvent, \ ContentBlock, MessageStartEvent, Usage, TextDelta, MessageDeltaEvent, MessageStopEvent, ContentBlockDeltaEvent, \ MessageDeltaUsage MOCK = os.getenv('MOCK_SWITCH', 'false') == 'true' class MockAnthropicClass(object): @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)): sleep(0.1) 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()