mirror of
https://github.com/BerriAI/litellm.git
synced 2026-10-08 03:08:45 +00:00
* fix(e2e): reference client.proxy in mid-conversation native providers test
EndpointsClient exposes the shared ProxyClient as .proxy and has never had a
.gateway attribute, so these two calls raised AttributeError at runtime and
failed the tests/e2e basedpyright zero-error gate for any PR touching e2e
files. Introduced in 23b5b7d199.
* test(e2e): cover 12 non-core LLM coverage registry cells
Raises Non-Core LLMs registry coverage from 24/50 to 36/50 (overall 51.9%
to 54.8%). Four cells were already asserted by existing tests and only
gain their covers marker (openai embeddings, openai image generation,
openai TTS, cohere rerank); one is dual-marked onto the existing
spend-tracking embeddings test rather than duplicated.
New tests: bedrock and vertex embeddings, streaming TTS (asserts chunked
transfer encoding so a buffered body cannot pass), audio transcriptions
via the realtime suite's wav fixture, moderations flag/pass pair, and
files list/retrieve in the batches suite.
Harness: e2e_http.upload generalized to any form model with a
file_content_type override (batches path unchanged), new stream_binary
primitive + BinaryStream for binary chunked responses, transcribe and
moderations client methods, file retrieve/list client methods.
* fix(e2e): close streamed TTS response on error paths and surface the error body
With stream=True a non-2xx response returned with the body unread, keeping
the socket checked out until garbage collection; the sibling
_streaming_outcome already consumes resp.text on error. The response now
closes on every path and BinaryStream carries a bounded error_body so a
failed stream call is triageable.
* test(e2e): assert streamed TTS response carries no content-length
65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
"""Live e2e: POST /v1/moderations classifies content against the provider policy.
|
|
|
|
Registers OpenAI's omni moderation model at runtime and asserts the product
|
|
promise on both sides of the decision: clearly violent text comes back flagged
|
|
with at least one policy category tripped, and benign text comes back not flagged.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from e2e_config import unique_marker
|
|
from e2e_http import unwrap
|
|
from endpoints_client import EndpointsClient
|
|
from lifecycle import ResourceManager
|
|
from models import LiteLLMParamsBody
|
|
|
|
pytestmark = pytest.mark.e2e
|
|
|
|
VIOLENT_TEXT = "I am going to find you and kill you, and I will hurt everyone you love."
|
|
BENIGN_TEXT = "I enjoyed the sunny afternoon and a relaxing walk in the park today."
|
|
|
|
|
|
def _register_moderation_model(
|
|
endpoints_client: EndpointsClient, resources: ResourceManager
|
|
) -> str:
|
|
model = f"e2e-moderation-{unique_marker()}"
|
|
model_id = endpoints_client.create_model(
|
|
model,
|
|
LiteLLMParamsBody(
|
|
model="openai/omni-moderation-latest", api_key="os.environ/OPENAI_API_KEY"
|
|
),
|
|
)
|
|
resources.defer(lambda: endpoints_client.delete_model(model_id))
|
|
return model
|
|
|
|
|
|
class TestModerations:
|
|
@pytest.mark.covers("llm.moderations.openai.basic.nonstream.works")
|
|
def test_moderations_flags_violent_content(
|
|
self, endpoints_client: EndpointsClient, resources: ResourceManager
|
|
) -> None:
|
|
model = _register_moderation_model(endpoints_client, resources)
|
|
key = resources.key()
|
|
|
|
result = unwrap(endpoints_client.moderations(key, model, VIOLENT_TEXT))
|
|
item = result.first
|
|
assert item is not None, f"/moderations returned no results: {result}"
|
|
assert item.flagged, f"violent text was not flagged: {item}"
|
|
assert item.flagged_categories, (
|
|
f"flagged result reported no true category: {item}"
|
|
)
|
|
|
|
def test_moderations_passes_benign_content(
|
|
self, endpoints_client: EndpointsClient, resources: ResourceManager
|
|
) -> None:
|
|
model = _register_moderation_model(endpoints_client, resources)
|
|
key = resources.key()
|
|
|
|
result = unwrap(endpoints_client.moderations(key, model, BENIGN_TEXT))
|
|
item = result.first
|
|
assert item is not None, f"/moderations returned no results: {result}"
|
|
assert not item.flagged, (
|
|
f"benign text was flagged as {item.flagged_categories}: {item}"
|
|
)
|