Files
comet-ml--opik/sdks/python/tests/e2e/evaluation/test_multimodal.py
T
wehub-resource-sync 5a558eb09e
TypeScript SDK Compatibility V1.x E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / TypeScript SDK Compatibility V1.x E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
TypeScript SDK E2E Tests / TypeScript SDK E2E Tests Node ${{matrix.node_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
Python SDK E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK E2E Tests / Python SDK E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK E2E Tests / build-opik (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Select Python version matrix (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / Python SDK Compatibility V1.x E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Python SDK Compatibility V1.x E2E Tests / build-opik (push) Has been cancelled
TypeScript SDK E2E Tests / Select Node version matrix (push) Has been cancelled
TypeScript SDK E2E Tests / build-opik (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer E2E Tests Python ${{matrix.python_version}} (push) Has been cancelled
Opik Optimizer - E2E Tests / Opik Optimizer Integration Smoke Tests (push) Has been cancelled
🐙 Code Quality / detect (push) Has been cancelled
🐙 Code Quality / lint (${{ matrix.leg.name }}) (push) Has been cancelled
🐙 Code Quality / summary (push) Has been cancelled
TypeScript SDK Library Integration Tests / Check Secrets (push) Has been cancelled
TypeScript SDK Library Integration Tests / opik-vercel (Vercel AI SDK / eve) (push) Has been cancelled
SDK Library Integration Tests Runner / Check Secrets (push) Has been cancelled
SDK Library Integration Tests Runner / Missed OpenAI API Key Warning (push) Has been cancelled
SDK Library Integration Tests Runner / Build (push) Has been cancelled
SDK Library Integration Tests Runner / openai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_tests (push) Has been cancelled
SDK Library Integration Tests Runner / langchain_legacy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / llama_index_tests (push) Has been cancelled
SDK Library Integration Tests Runner / anthropic_tests (push) Has been cancelled
SDK Library Integration Tests Runner / mistral_tests (push) Has been cancelled
SDK Library Integration Tests Runner / groq_tests (push) Has been cancelled
SDK Library Integration Tests Runner / aisuite_tests (push) Has been cancelled
SDK Library Integration Tests Runner / haystack_tests (push) Has been cancelled
SDK Library Integration Tests Runner / dspy_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / crewai_v1_tests (push) Has been cancelled
SDK Library Integration Tests Runner / genai_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_tests (push) Has been cancelled
SDK Library Integration Tests Runner / adk_legacy_1_3_0_tests (push) Has been cancelled
SDK Library Integration Tests Runner / evaluation_metrics_tests (push) Has been cancelled
SDK Library Integration Tests Runner / bedrock_tests (push) Has been cancelled
SDK Library Integration Tests Runner / litellm_tests (push) Has been cancelled
SDK Library Integration Tests Runner / harbor_tests (push) Has been cancelled
SDK Library Integration Tests Runner / Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / render-equality (push) Has been cancelled
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Has been cancelled
Python BE E2E Tests / Python BE E2E (push) Has been cancelled
Python Backend Tests / run-python-backend-tests (push) Has been cancelled
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
SDK E2E Libraries Integration Tests / Check Secrets (push) Has been cancelled
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Has been cancelled
SDK E2E Libraries Integration Tests / build-opik (push) Has been cancelled
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Has been cancelled
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Has been cancelled
TypeScript SDK Build & Publish / build-and-publish (push) Has been cancelled
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Has been cancelled
Backend Tests / discover-tests (push) Has been cancelled
Backend Tests / ${{ matrix.name }} (push) Has been cancelled
Build and Publish SDK / build-and-publish (push) Has been cancelled
Build Opik Docker Images / set-version (push) Has been cancelled
Build Opik Docker Images / build-backend (push) Has been cancelled
Build Opik Docker Images / build-sandbox-executor-python (push) Has been cancelled
Build Opik Docker Images / build-python-backend (push) Has been cancelled
Build Opik Docker Images / build-frontend (push) Has been cancelled
Build Opik Docker Images / create-git-tag (push) Has been cancelled
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Has been cancelled
Docs - Publish / run (push) Has been cancelled
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Has been cancelled
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Has been cancelled
Frontend Unit Tests / Test on Node 20 (push) Has been cancelled
Guardrails E2E Tests / Select Python version matrix (push) Has been cancelled
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Has been cancelled
Guardrails E2E Tests / 📢 Slack Notification (push) Has been cancelled
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Has been cancelled
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Has been cancelled
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Has been cancelled
Lint Opik Helm Chart / unittest-helm-chart (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:25:44 +08:00

181 lines
51 KiB
Python

from typing import Any, Dict, List
import pytest
import opik
from opik import flush_tracker
from opik.evaluation import evaluate_prompt, metrics
from ...testlib import environment
CAT_IMAGE_URL = "https://cataas.com/cat"
PNG_DOG_DATA_URL = (
"data:image/png;base64,"
"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"
)
JPEG_FOX_DATA_URL = (
"data:image/jpeg;base64,"
"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"
)
MESSAGES: List[Dict[str, Any]] = [
{
"role": "system",
"content": [
{
"type": "text",
"text": (
"You are an image classifier. Each prompt may contain one or two images. "
"If only the first image has content (the second is blank), answer with a single "
"lowercase word describing the animal. If both images have content, answer with two "
"lowercase words separated by a single space in the order the images are provided."
),
}
],
},
{
"role": "user",
"content": [
{
"type": "text",
"text": (
"Classify the animals in the supplied image(s) following the instructions above."
),
},
{"type": "image_url", "image_url": {"url": "{{image_url}}"}},
{"type": "image_url", "image_url": {"url": "{{secondary_image_url}}"}},
],
},
]
def _normalize_output(output: Any) -> str:
if not output:
return ""
collected_parts: List[str] = []
def collect_values(value: Any) -> None:
if isinstance(value, str):
collected_parts.append(value)
return
if isinstance(value, list):
for item in value:
collect_values(item)
return
if isinstance(value, dict):
text_value = value.get("text")
if isinstance(text_value, str):
collected_parts.append(text_value)
if isinstance(text_value, list):
collect_values(text_value)
content_value = value.get("content")
if isinstance(content_value, str):
collected_parts.append(content_value)
elif isinstance(content_value, list):
collect_values(content_value)
output_value = value.get("output")
if isinstance(output_value, str):
collected_parts.append(output_value)
elif isinstance(output_value, list):
collect_values(output_value)
elif isinstance(output_value, dict):
collect_values(output_value)
for key, item in value.items():
if key in {"text", "content", "output"}:
continue
collect_values(item)
collect_values(output)
return " ".join(part.strip() for part in collected_parts).strip().lower()
@pytest.mark.skip(
reason="This test is very flaky and requires a major refactor if not removal"
)
@pytest.mark.skipif(
not environment.has_openai_api_key(), reason="OPENAI_API_KEY is not set"
)
def test_evaluate_prompt_supports_multimodal_images(
opik_client: opik.Opik,
dataset_name: str,
experiment_name: str,
) -> None:
dataset = opik_client.create_dataset(dataset_name)
dataset_items = [
{
"image_url": CAT_IMAGE_URL,
"secondary_image_url": "",
"reference": "cat",
},
{
"image_url": PNG_DOG_DATA_URL,
"secondary_image_url": "",
"reference": "dog",
},
{
"image_url": JPEG_FOX_DATA_URL,
"secondary_image_url": "",
"reference": "fox",
},
{
"image_url": PNG_DOG_DATA_URL,
"secondary_image_url": JPEG_FOX_DATA_URL,
"reference": "dog fox",
},
{
"image_url": CAT_IMAGE_URL,
"secondary_image_url": CAT_IMAGE_URL,
"reference": "cat cat",
},
]
dataset.insert(dataset_items)
evaluate_prompt(
dataset=dataset,
messages=MESSAGES,
scoring_metrics=[metrics.Contains(case_sensitive=False)],
experiment_name=experiment_name,
model="gpt-5-mini",
)
flush_tracker()
experiment = opik_client.get_experiment_by_name(experiment_name)
experiment_items = experiment.get_items()
assert len(experiment_items) == len(dataset_items)
results: Dict[str, str] = {}
for item in experiment_items:
reference = str(item.dataset_item_data.get("reference", "")).strip().lower()
results[reference] = _normalize_output(item.evaluation_task_output["output"])
assert results["cat"].strip() in [
"cat",
"kitten",
"kitty",
"feline",
] # relaxed to avoid flakiness
assert results["dog"].strip() == "dog"
assert results["fox"].strip() == "fox"
merged_multi = set(results["dog fox"].split())
assert (
len({"dog", "fox"}.intersection(merged_multi)) > 0
) # relaxed to avoid flakiness
merged_cat_cat = set(results["cat cat"].split())
assert (
len({"cat", "kitten", "kitty", "feline"}.intersection(merged_cat_cat)) > 0
) # relaxed to avoid flakiness