Skip to content

Commit 1466cec

Browse files
make api_key required for realtime models
1 parent f3a1c15 commit 1466cec

File tree

3 files changed

+18
-13
lines changed

3 files changed

+18
-13
lines changed

src/eva/assistant/pipeline/audio_llm_processor.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import asyncio
2020
import base64
2121
import io
22-
import os
2322
import time
2423
import wave
2524
from collections.abc import Awaitable
@@ -418,7 +417,7 @@ def __init__(
418417
super().__init__(**kwargs)
419418
self._audio_collector = audio_collector
420419
params = params or {}
421-
self._api_key = params.get("api_key") or os.getenv("OPENAI_API_KEY")
420+
self._api_key = params.get["api_key"]
422421
self._model = model
423422
self._system_prompt = system_prompt or self.DEFAULT_SYSTEM_PROMPT
424423
self._sample_rate = sample_rate

src/eva/assistant/pipeline/services.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
"""
55

66
import datetime
7-
import os
87
from typing import Any, AsyncGenerator, Optional
98

109
from deepgram import LiveOptions
@@ -409,12 +408,12 @@ def create_realtime_llm_service(
409408
return InstrumentedRealtimeLLMService(
410409
model=params.get("model"),
411410
audit_log=audit_log,
412-
api_key=params.get("api_key") or os.getenv("OPENAI_API_KEY"),
411+
api_key=params.get["api_key"],
413412
session_properties=session_properties,
414413
)
415414

416415
return OpenAIRealtimeLLMService(
417-
api_key=params.get("api_key"),
416+
api_key=params.get["api_key"],
418417
session_properties=session_properties,
419418
)
420419
elif model_lower.startswith("azure") or model_lower.startswith("gpt-realtime"):
@@ -431,23 +430,23 @@ def create_realtime_llm_service(
431430
service = InstrumentedRealtimeLLMService(
432431
model=params.get("model"),
433432
audit_log=audit_log,
434-
api_key=params.get("api_key"),
433+
api_key=params.get["api_key"],
435434
base_url=url,
436435
session_properties=session_properties,
437436
)
438437
InstrumentedRealtimeLLMService._connect = override__connect # azure realtime connect
439438
return service
440439

441440
return OpenAIRealtimeLLMService(
442-
api_key=params.get("api_key"),
441+
api_key=params.get["api_key"],
443442
base_url=url,
444443
session_properties=session_properties,
445444
)
446445
elif model_lower == "ultravox":
447446
logger.info("Using Ultravox LLM")
448447
return UltravoxRealtimeLLMService(
449448
params=OneShotInputParams(
450-
api_key=params.get("api_key"),
449+
api_key=params.get["api_key"],
451450
system_prompt=system_prompt,
452451
temperature=0.3,
453452
max_duration=datetime.timedelta(minutes=6),

src/eva/models/config.py

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -452,28 +452,35 @@ def _warn_deprecated_aliases(cls, data: Any) -> Any:
452452
@model_validator(mode="after")
453453
def _check_companion_services(self) -> "RunConfig":
454454
"""Ensure required companion services are set for each pipeline mode."""
455+
required_keys = ["api_key", "model"]
455456
if isinstance(self.model, PipelineConfig):
456457
if not self.model.stt:
457458
raise ValueError("EVA_MODEL__STT is required when using EVA_MODEL__LLM (ASR-LLM-TTS pipeline).")
458459
if not self.model.tts:
459460
raise ValueError("EVA_MODEL__TTS is required when using EVA_MODEL__LLM (ASR-LLM-TTS pipeline).")
460-
self._validate_service_params("STT", self.model.stt, self.model.stt_params)
461-
self._validate_service_params("TTS", self.model.tts, self.model.tts_params)
461+
self._validate_service_params("STT", self.model.stt, required_keys, self.model.stt_params)
462+
self._validate_service_params("TTS", self.model.tts, required_keys, self.model.tts_params)
462463
elif isinstance(self.model, AudioLLMConfig):
463464
if not self.model.tts:
464465
raise ValueError("EVA_MODEL__TTS is required when using EVA_MODEL__AUDIO_LLM (SpeechLM-TTS pipeline).")
465-
self._validate_service_params("TTS", self.model.tts, self.model.tts_params)
466+
self._validate_service_params("TTS", self.model.tts, required_keys, self.model.tts_params)
467+
self._validate_service_params("audio_llm", self.model.audio_llm, required_keys, self.model.audio_llm_params)
468+
elif isinstance(self.model, SpeechToSpeechConfig):
469+
# api_key is required, some s2s services don't require model
470+
self._validate_service_params("S2S", self.model.s2s, ["api_key"], self.model.s2s_params)
466471
return self
467472

468473
# Providers that manage their own model/key resolution (e.g. WebSocket-based)
469474
_SKIP_PARAMS_VALIDATION: ClassVar[set[str]] = {"nvidia"}
470475

471476
@classmethod
472-
def _validate_service_params(cls, service: str, provider: str, params: dict[str, Any]) -> None:
477+
def _validate_service_params(
478+
cls, service: str, provider: str, required_keys: list[str], params: dict[str, Any]
479+
) -> None:
473480
"""Validate that STT/TTS params contain required keys."""
474481
if provider.lower() in cls._SKIP_PARAMS_VALIDATION:
475482
return
476-
missing = [key for key in ("api_key", "model") if key not in params]
483+
missing = [key for key in required_keys if key not in params]
477484
if missing:
478485
missing_str = " and ".join(f'"{k}"' for k in missing)
479486
env_var = f"EVA_MODEL__{service}_PARAMS"

0 commit comments

Comments
 (0)