5a558eb09e
Backend Tests / discover-tests (push) Waiting to run
Backend Tests / ${{ matrix.name }} (push) Blocked by required conditions
Build and Publish SDK / build-and-publish (push) Waiting to run
Build Opik Docker Images / set-version (push) Waiting to run
Build Opik Docker Images / build-backend (push) Blocked by required conditions
Build Opik Docker Images / build-sandbox-executor-python (push) Blocked by required conditions
Build Opik Docker Images / build-python-backend (push) Blocked by required conditions
Build Opik Docker Images / build-frontend (push) Blocked by required conditions
Build Opik Docker Images / create-git-tag (push) Blocked by required conditions
ClickHouse Migration Cluster Check / validate-clickhouse-migrations (push) Waiting to run
Docs - Publish / run (push) Waiting to run
E2E Tests - Post Merge (v2) / 🧪 E2E v2 Tests (${{ github.event.inputs.tier || 't1' }}) (push) Waiting to run
E2E Tests - Post Merge (v2) / 📢 Slack Notification (push) Blocked by required conditions
Frontend Unit Tests / Test on Node 20 (push) Waiting to run
Guardrails E2E Tests / Select Python version matrix (push) Waiting to run
Guardrails E2E Tests / Guardrails E2E Tests ${{matrix.python_version}} (push) Blocked by required conditions
Guardrails E2E Tests / 📢 Slack Notification (push) Blocked by required conditions
Guardrails Backend Unit Tests / Guardrails Backend Unit Tests (push) Waiting to run
Guardrails Backend Unit Tests / 📢 Slack Notification (push) Blocked by required conditions
Lint Opik Helm Chart / lint-helm-chart (Helm v3.21.0) (push) Waiting to run
Lint Opik Helm Chart / lint-helm-chart (Helm v4.2.0) (push) Waiting to run
Lint Opik Helm Chart / unittest-helm-chart (push) Waiting to run
Lint Opik Helm Chart / render-equality (push) Waiting to run
Opik Optimizer - Unit Tests / Opik Optimizer Unit Tests Python ${{matrix.python_version}} (push) Waiting to run
Python BE E2E Tests / Python BE E2E (push) Waiting to run
Python Backend Tests / run-python-backend-tests (push) Waiting to run
Python SDK Unit Tests / Python SDK Unit Tests ${{matrix.python_version}} (push) Waiting to run
Release Drafter / update_release_draft (push) Waiting to run
SDK E2E Libraries Integration Tests / Check Secrets (push) Waiting to run
SDK E2E Libraries Integration Tests / Missed OpenAI API Key Warning (push) Blocked by required conditions
SDK E2E Libraries Integration Tests / build-opik (push) Blocked by required conditions
SDK E2E Libraries Integration Tests / E2E Lib Integration Python ${{matrix.python_version}} (push) Blocked by required conditions
TypeScript SDK Integration Build & Publish / build-and-publish (opik-gemini) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-langchain) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-openai) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-otel) (push) Waiting to run
TypeScript SDK Integration Build & Publish / build-and-publish (opik-vercel) (push) Waiting to run
TypeScript SDK Build & Publish / build-and-publish (push) Waiting to run
TypeScript SDK Unit Tests / Test on Node ${{ matrix.node-version }} (push) Waiting to run
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
217 lines
6.8 KiB
Python
217 lines
6.8 KiB
Python
from __future__ import annotations
|
|
|
|
import uuid
|
|
import pytest
|
|
|
|
import opik
|
|
from opik import synchronization
|
|
from . import verifiers
|
|
|
|
|
|
@pytest.fixture
|
|
def annotation_queue_name():
|
|
return f"e2e-tests-annotation-queue-{str(uuid.uuid4())[-6:]}"
|
|
|
|
|
|
def test_annotation_queue__add_traces__happyflow(
|
|
opik_client: opik.Opik,
|
|
temporary_project_name: str,
|
|
annotation_queue_name: str,
|
|
):
|
|
"""Test creating a traces annotation queue and adding traces to it."""
|
|
# Create traces and capture the returned Trace objects
|
|
trace1 = opik_client.trace(
|
|
name="trace-1",
|
|
input={"input": "trace-1-input"},
|
|
output={"output": "trace-1-output"},
|
|
project_name=temporary_project_name,
|
|
)
|
|
trace2 = opik_client.trace(
|
|
name="trace-2",
|
|
input={"input": "trace-2-input"},
|
|
output={"output": "trace-2-output"},
|
|
project_name=temporary_project_name,
|
|
)
|
|
|
|
opik_client.flush()
|
|
|
|
# Wait for traces to be available (which also ensures project is created)
|
|
def traces_available():
|
|
traces = opik_client.search_traces(
|
|
project_name=temporary_project_name,
|
|
max_results=10,
|
|
)
|
|
return len(traces) >= 2
|
|
|
|
synchronization.wait_for_done(traces_available, timeout=30)
|
|
|
|
# Create traces annotation queue after project exists
|
|
queue = opik_client.create_traces_annotation_queue(
|
|
name=annotation_queue_name,
|
|
project_name=temporary_project_name,
|
|
description="Test queue for traces",
|
|
instructions="Please review these traces",
|
|
)
|
|
|
|
verifiers.verify_traces_annotation_queue(
|
|
opik_client=opik_client,
|
|
queue_id=queue.id,
|
|
name=annotation_queue_name,
|
|
scope="trace",
|
|
description="Test queue for traces",
|
|
instructions="Please review these traces",
|
|
)
|
|
|
|
# Add traces directly using the Trace objects returned by opik_client.trace()
|
|
queue.add_traces([trace1, trace2])
|
|
|
|
# Verify queue items count
|
|
def check_items_count():
|
|
updated_queue = opik_client.get_traces_annotation_queue(queue.id)
|
|
return updated_queue.items_count == 2
|
|
|
|
synchronization.wait_for_done(check_items_count, timeout=30)
|
|
|
|
# Verify we can retrieve the queue
|
|
retrieved_queue = opik_client.get_traces_annotation_queue(queue.id)
|
|
assert retrieved_queue.id == queue.id
|
|
assert retrieved_queue.name == annotation_queue_name
|
|
assert retrieved_queue.items_count == 2
|
|
|
|
# Retrieve the items in the queue
|
|
def queue_items_available():
|
|
return len(queue.get_items()) == 2
|
|
|
|
synchronization.wait_for_done(queue_items_available, timeout=30)
|
|
|
|
items = queue.get_items()
|
|
assert {item.id for item in items} == {trace1.id, trace2.id}
|
|
|
|
# Remove one trace from queue
|
|
queue.remove_traces([trace1])
|
|
|
|
# Verify queue items count after removal
|
|
def check_items_count_after_removal():
|
|
updated_queue = opik_client.get_traces_annotation_queue(queue.id)
|
|
return updated_queue.items_count == 1
|
|
|
|
synchronization.wait_for_done(check_items_count_after_removal, timeout=30)
|
|
|
|
# Cleanup: delete the queue
|
|
queue.delete()
|
|
|
|
# Verify queue is deleted
|
|
with pytest.raises(opik.exceptions.OpikException):
|
|
opik_client.get_traces_annotation_queue(queue.id)
|
|
|
|
|
|
def test_annotation_queue__add_threads__happyflow(
|
|
opik_client: opik.Opik,
|
|
temporary_project_name: str,
|
|
annotation_queue_name: str,
|
|
):
|
|
"""Test creating a threads annotation queue and adding threads to it."""
|
|
# Thread IDs must be valid UUIDs for annotation queue API
|
|
# Use full UUIDs and store them to filter later
|
|
thread_id_1 = "thread_1"
|
|
thread_id_2 = "thread_2"
|
|
thread_ids = {thread_id_1, thread_id_2}
|
|
|
|
# Create traces that belong to threads
|
|
for i in range(3):
|
|
opik_client.trace(
|
|
name=f"trace-thread1-{i}",
|
|
input={"input": f"input-{i}"},
|
|
output={"output": f"output-{i}"},
|
|
project_name=temporary_project_name,
|
|
thread_id=thread_id_1,
|
|
)
|
|
|
|
for i in range(2):
|
|
opik_client.trace(
|
|
name=f"trace-thread2-{i}",
|
|
input={"input": f"input-{i}"},
|
|
output={"output": f"output-{i}"},
|
|
project_name=temporary_project_name,
|
|
thread_id=thread_id_2,
|
|
)
|
|
|
|
opik_client.flush()
|
|
|
|
# Wait for threads to be available (which also ensures project is created)
|
|
def threads_available():
|
|
threads = opik_client.search_threads(
|
|
project_name=temporary_project_name,
|
|
max_results=100,
|
|
)
|
|
found_ids = {t.id for t in threads}
|
|
return thread_ids.issubset(found_ids)
|
|
|
|
synchronization.wait_for_done(threads_available, timeout=30)
|
|
|
|
# Create threads annotation queue after project exists
|
|
queue = opik_client.create_threads_annotation_queue(
|
|
name=annotation_queue_name,
|
|
project_name=temporary_project_name,
|
|
description="Test queue for threads",
|
|
instructions="Please review these threads",
|
|
)
|
|
|
|
verifiers.verify_threads_annotation_queue(
|
|
opik_client=opik_client,
|
|
queue_id=queue.id,
|
|
name=annotation_queue_name,
|
|
scope="thread",
|
|
description="Test queue for threads",
|
|
instructions="Please review these threads",
|
|
)
|
|
|
|
# Get threads from API and filter by our thread IDs
|
|
threads = opik_client.search_threads(
|
|
project_name=temporary_project_name,
|
|
max_results=10,
|
|
)
|
|
assert len(threads) == 2
|
|
|
|
# Add threads to queue
|
|
queue.add_threads(threads)
|
|
|
|
# Verify queue items count
|
|
def check_items_count():
|
|
updated_queue = opik_client.get_threads_annotation_queue(queue.id)
|
|
return updated_queue.items_count == 2
|
|
|
|
synchronization.wait_for_done(check_items_count, timeout=30)
|
|
|
|
# Verify we can retrieve the queue
|
|
retrieved_queue = opik_client.get_threads_annotation_queue(queue.id)
|
|
assert retrieved_queue.id == queue.id
|
|
assert retrieved_queue.name == annotation_queue_name
|
|
assert retrieved_queue.items_count == 2
|
|
|
|
# Retrieve the items in the queue
|
|
def queue_items_available():
|
|
return len(queue.get_items()) == 2
|
|
|
|
synchronization.wait_for_done(queue_items_available, timeout=30)
|
|
|
|
items = queue.get_items()
|
|
assert {item.id for item in items} == thread_ids
|
|
|
|
# Remove one thread from queue
|
|
queue.remove_threads([threads[0]])
|
|
|
|
# Verify queue items count after removal
|
|
def check_items_count_after_removal():
|
|
updated_queue = opik_client.get_threads_annotation_queue(queue.id)
|
|
return updated_queue.items_count == 1
|
|
|
|
synchronization.wait_for_done(check_items_count_after_removal, timeout=30)
|
|
|
|
# Cleanup: delete the queue
|
|
queue.delete()
|
|
|
|
# Verify queue is deleted
|
|
with pytest.raises(opik.exceptions.OpikException):
|
|
opik_client.get_threads_annotation_queue(queue.id)
|