mirror of
https://github.com/BerriAI/litellm.git
synced 2025-04-25 18:54:30 +00:00
* anthropic_messages_handler v0 * fix /messages * working messages with router methods * test_anthropic_messages_handler_litellm_router_non_streaming * test_anthropic_messages_litellm_router_non_streaming_with_logging * AnthropicMessagesConfig * _handle_anthropic_messages_response_logging * working with /v1/messages endpoint * working /v1/messages endpoint * refactor to use router factory function * use aanthropic_messages * use BaseConfig for Anthropic /v1/messages * track api key, team on /v1/messages endpoint * fix get_logging_payload * BaseAnthropicMessagesTest * align test config * test_anthropic_messages_with_thinking * test_anthropic_streaming_with_thinking * fix - display anthropic url for debugging * test_bad_request_error_handling * test_anthropic_messages_router_streaming_with_bad_request * fix ProxyException * test_bad_request_error_handling_streaming * use provider_specific_header * test_anthropic_messages_with_extra_headers * test_anthropic_messages_to_wildcard_model * fix gcs pub sub test * standard_logging_payload * fix unit testing for anthopic /v1/messages support * fix pass through anthropic messages api * delete dead code * fix anthropic pass through response * revert change to spend tracking utils * fix get_litellm_metadata_from_kwargs * fix spend logs payload json * proxy_pass_through_endpoint_tests * TestAnthropicPassthroughBasic * fix pass through tests * test_async_vertex_proxy_route_api_key_auth * _handle_anthropic_messages_response_logging * vertex_credentials * test_set_default_vertex_config * test_anthropic_messages_litellm_router_non_streaming_with_logging * test_ageneric_api_call_with_fallbacks_basic * test__aadapter_completion
145 lines
5.2 KiB
Python
145 lines
5.2 KiB
Python
from abc import ABC, abstractmethod
|
|
|
|
import anthropic
|
|
import pytest
|
|
|
|
|
|
class BaseAnthropicMessagesTest(ABC):
|
|
"""
|
|
Abstract base test class that enforces a common test across all test classes.
|
|
"""
|
|
|
|
@abstractmethod
|
|
def get_client(self):
|
|
return anthropic.Anthropic()
|
|
|
|
def test_anthropic_basic_completion(self):
|
|
print("making basic completion request to anthropic passthrough")
|
|
client = self.get_client()
|
|
response = client.messages.create(
|
|
model="claude-3-5-sonnet-20241022",
|
|
max_tokens=1024,
|
|
messages=[{"role": "user", "content": "Say 'hello test' and nothing else"}],
|
|
extra_body={
|
|
"litellm_metadata": {
|
|
"tags": ["test-tag-1", "test-tag-2"],
|
|
}
|
|
},
|
|
)
|
|
print(response)
|
|
|
|
def test_anthropic_streaming(self):
|
|
print("making streaming request to anthropic passthrough")
|
|
collected_output = []
|
|
client = self.get_client()
|
|
with client.messages.stream(
|
|
max_tokens=10,
|
|
messages=[
|
|
{"role": "user", "content": "Say 'hello stream test' and nothing else"}
|
|
],
|
|
model="claude-3-5-sonnet-20241022",
|
|
extra_body={
|
|
"litellm_metadata": {
|
|
"tags": ["test-tag-stream-1", "test-tag-stream-2"],
|
|
}
|
|
},
|
|
) as stream:
|
|
for text in stream.text_stream:
|
|
collected_output.append(text)
|
|
|
|
full_response = "".join(collected_output)
|
|
print(full_response)
|
|
|
|
def test_anthropic_messages_with_thinking(self):
|
|
print("making request to anthropic passthrough with thinking")
|
|
client = self.get_client()
|
|
response = client.messages.create(
|
|
model="claude-3-7-sonnet-20250219",
|
|
max_tokens=20000,
|
|
thinking={"type": "enabled", "budget_tokens": 16000},
|
|
messages=[
|
|
{"role": "user", "content": "Just pinging with thinking enabled"}
|
|
],
|
|
)
|
|
|
|
print(response)
|
|
|
|
# Verify the first content block is a thinking block
|
|
response_thinking = response.content[0].thinking
|
|
assert response_thinking is not None
|
|
assert len(response_thinking) > 0
|
|
|
|
def test_anthropic_streaming_with_thinking(self):
|
|
print("making streaming request to anthropic passthrough with thinking enabled")
|
|
collected_thinking = []
|
|
collected_response = []
|
|
client = self.get_client()
|
|
with client.messages.stream(
|
|
model="claude-3-7-sonnet-20250219",
|
|
max_tokens=20000,
|
|
thinking={"type": "enabled", "budget_tokens": 16000},
|
|
messages=[
|
|
{"role": "user", "content": "Just pinging with thinking enabled"}
|
|
],
|
|
) as stream:
|
|
for event in stream:
|
|
if event.type == "content_block_delta":
|
|
if event.delta.type == "thinking_delta":
|
|
collected_thinking.append(event.delta.thinking)
|
|
elif event.delta.type == "text_delta":
|
|
collected_response.append(event.delta.text)
|
|
|
|
full_thinking = "".join(collected_thinking)
|
|
full_response = "".join(collected_response)
|
|
|
|
print(
|
|
f"Thinking Response: {full_thinking[:100]}..."
|
|
) # Print first 100 chars of thinking
|
|
print(f"Response: {full_response}")
|
|
|
|
# Verify we received thinking content
|
|
assert len(collected_thinking) > 0
|
|
assert len(full_thinking) > 0
|
|
|
|
# Verify we also received a response
|
|
assert len(collected_response) > 0
|
|
assert len(full_response) > 0
|
|
|
|
def test_bad_request_error_handling_streaming(self):
|
|
print("making request to anthropic passthrough with bad request")
|
|
try:
|
|
client = self.get_client()
|
|
response = client.messages.create(
|
|
model="claude-3-5-sonnet-20241022",
|
|
max_tokens=10,
|
|
stream=True,
|
|
messages=["hi"],
|
|
)
|
|
print(response)
|
|
assert pytest.fail("Expected BadRequestError")
|
|
except anthropic.BadRequestError as e:
|
|
print("Got BadRequestError from anthropic, e=", e)
|
|
print(e.__cause__)
|
|
print(e.status_code)
|
|
print(e.response)
|
|
except Exception as e:
|
|
pytest.fail(f"Got unexpected exception: {e}")
|
|
|
|
def test_bad_request_error_handling_non_streaming(self):
|
|
print("making request to anthropic passthrough with bad request")
|
|
try:
|
|
client = self.get_client()
|
|
response = client.messages.create(
|
|
model="claude-3-5-sonnet-20241022",
|
|
max_tokens=10,
|
|
messages=["hi"],
|
|
)
|
|
print(response)
|
|
assert pytest.fail("Expected BadRequestError")
|
|
except anthropic.BadRequestError as e:
|
|
print("Got BadRequestError from anthropic, e=", e)
|
|
print(e.__cause__)
|
|
print(e.status_code)
|
|
print(e.response)
|
|
except Exception as e:
|
|
pytest.fail(f"Got unexpected exception: {e}")
|