anthropic.py 3.2 KB

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