Details

  • Updated ModelCostData to include new fields for audio, image, and video costs.
  • Modified CostService to handle multimodal pricing, including cache support.
  • Expanded ModelPrice to accommodate additional pricing parameters.
  • Implemented new cost calculation methods in SpanCostCalculator for multimodal scenarios.
  • Added comprehensive unit tests for CostService and SpanCostCalculator to validate multimodal cost calculations.
  • Enhanced OpikUsage model to track multimodal usage metrics.
  • Created tests for multimodal usage parsing and validation.

Issues

Resolves #1782

Testing

~/Desktop/bounty/opik/apps/opik-backend$  mvn test -Dtest="SpanCostCalculatorTest,CostServiceTest"

Screencast from 2025-07-08 22-41-27.webm

python -m pytest tests/unit/llm_usage/test_multimodal_usage.py -v --tb=short

Screencast from 2025-07-08 22-43-01.webm

╰─ python3 << 'EOF'                                                                                                                                                                        ─╯
import sys
sys.path.append('/home/mavrick/Desktop/bounty/opik/sdks/python/src')

from opik.llm_usage.opik_usage import OpikUsage

# Realistic OpenAI GPT-4o multimodal usage
usage_data = {
    'completion_tokens': 150,
    'prompt_tokens': 300,
    'total_tokens': 450,
    'completion_tokens_details': {
        'audio_tokens': 75,
        'reasoning_tokens': 25
    },
    'prompt_tokens_details': {
        'audio_tokens': 50,
        'cached_tokens': 20
    }
}

print("🎤 Testing multimodal usage parsing...")
usage = OpikUsage.from_openai_completions_dict(usage_data)

print(f"✅ Audio Input Tokens: {usage.audio_input_tokens}")
print(f"✅ Audio Output Tokens: {usage.audio_output_tokens}")
print(f"✅ Text Input Tokens: {usage.prompt_tokens}")
print(f"✅ Text Output Tokens: {usage.completion_tokens}")

backend_dict = usage.to_backend_compatible_full_usage_dict()
audio_fields = [k for k in backend_dict.keys() if 'audio' in k]
print(f"✅ Backend compatibility: {len(audio_fields)} audio fields extracted")
for field in audio_fields:
    print(f"   - {field}: {backend_dict[field]}")
EOF

Screencast from 2025-07-08 22-51-33.webm

/claim #1782

Claim

Total prize pool $100
Total paid $0
Status Pending
Submitted July 08, 2025
Last updated July 08, 2025

Contributors

RI

Rishi Mondal

@MAVRICK-1

100%

Sponsors

CO

Comet

@comet-ml

$100