| | 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() |
| |
|