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