anthropic.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import os
  2. from time import sleep
  3. from typing import Any, Literal, Union, Iterable
  4. from anthropic.resources import Messages
  5. from anthropic.types.message_delta_event import Delta
  6. import anthropic
  7. import pytest
  8. from _pytest.monkeypatch import MonkeyPatch
  9. from anthropic import Anthropic, Stream
  10. from anthropic.types import MessageParam, Message, MessageStreamEvent, \
  11. ContentBlock, MessageStartEvent, Usage, TextDelta, MessageDeltaEvent, MessageStopEvent, ContentBlockDeltaEvent, \
  12. MessageDeltaUsage
  13. MOCK = os.getenv('MOCK_SWITCH', 'false') == 'true'
  14. class MockAnthropicClass(object):
  15. @staticmethod
  16. def mocked_anthropic_chat_create_sync(model: str) -> Message:
  17. return Message(
  18. id='msg-123',
  19. type='message',
  20. role='assistant',
  21. content=[ContentBlock(text='hello, I\'m a chatbot from anthropic', type='text')],
  22. model=model,
  23. stop_reason='stop_sequence',
  24. usage=Usage(
  25. input_tokens=1,
  26. output_tokens=1
  27. )
  28. )
  29. @staticmethod
  30. def mocked_anthropic_chat_create_stream(model: str) -> Stream[MessageStreamEvent]:
  31. full_response_text = "hello, I'm a chatbot from anthropic"
  32. yield MessageStartEvent(
  33. type='message_start',
  34. message=Message(
  35. id='msg-123',
  36. content=[],
  37. role='assistant',
  38. model=model,
  39. stop_reason=None,
  40. type='message',
  41. usage=Usage(
  42. input_tokens=1,
  43. output_tokens=1
  44. )
  45. )
  46. )
  47. index = 0
  48. for i in range(0, len(full_response_text)):
  49. sleep(0.1)
  50. yield ContentBlockDeltaEvent(
  51. type='content_block_delta',
  52. delta=TextDelta(text=full_response_text[i], type='text_delta'),
  53. index=index
  54. )
  55. index += 1
  56. yield MessageDeltaEvent(
  57. type='message_delta',
  58. delta=Delta(
  59. stop_reason='stop_sequence'
  60. ),
  61. usage=MessageDeltaUsage(
  62. output_tokens=1
  63. )
  64. )
  65. yield MessageStopEvent(type='message_stop')
  66. def mocked_anthropic(self: Messages, *,
  67. max_tokens: int,
  68. messages: Iterable[MessageParam],
  69. model: str,
  70. stream: Literal[True],
  71. **kwargs: Any
  72. ) -> Union[Message, Stream[MessageStreamEvent]]:
  73. if len(self._client.api_key) < 18:
  74. raise anthropic.AuthenticationError('Invalid API key')
  75. if stream:
  76. return MockAnthropicClass.mocked_anthropic_chat_create_stream(model=model)
  77. else:
  78. return MockAnthropicClass.mocked_anthropic_chat_create_sync(model=model)
  79. @pytest.fixture
  80. def setup_anthropic_mock(request, monkeypatch: MonkeyPatch):
  81. if MOCK:
  82. monkeypatch.setattr(Messages, 'create', MockAnthropicClass.mocked_anthropic)
  83. yield
  84. if MOCK:
  85. monkeypatch.undo()