Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17,991 changes: 17,989 additions & 2 deletions .fern/replay.lock

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions docs/reference/vendors.md
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ Use `turn_detection.language` for Agora interaction language; it defaults to `en
| `api_key` | `str` | BYOK only | `None` | Deepgram API key. Optional only for Agora-managed `nova-2` and `nova-3`. |
| `model` | `str` | No | `None` | Model (e.g., `nova-2`) |
| `language` | `str` | No | `None` | Language code (e.g., `en-US`) |
| `interaction_language` | `str` | No | `None` | Agora `asr.language` override |
| `smart_format` | `bool` | No | `None` | Enable smart formatting |
| `punctuation` | `bool` | No | `None` | Enable punctuation |
| `additional_params` | `Dict[str, Any]` | No | `None` | Additional parameters |
Expand Down
19 changes: 19 additions & 0 deletions src/agora_agent/agentkit/agent.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
from ..agents.types.start_agents_request_properties_filler_words_content_static_config import StartAgentsRequestPropertiesFillerWordsContentStaticConfig
from ..agents.types.start_agents_request_properties_filler_words_content_static_config_selection_rule import StartAgentsRequestPropertiesFillerWordsContentStaticConfigSelectionRule
from ..types.tts import Tts
from ..agents.types.start_agents_request_properties_filler_words_content_static_config_selection_rule import StartAgentsRequestPropertiesFillerWordsContentStaticConfigSelectionRule
from ..types.tts import Tts
from ..types.asr import Asr
from ..types.llm import Llm
from ..types.llm_style import LlmStyle as GeneratedLlmStyle
Expand Down Expand Up @@ -536,6 +538,23 @@ def with_audio_scenario(self, audio_scenario: ParametersAudioScenario) -> "Agent
)
return new_agent

def with_audio_scenario(self, audio_scenario: ParametersAudioScenario) -> "Agent":
"""Returns a new Agent with the specified RTC audio scenario."""
new_agent = self._clone()
if new_agent._parameters is None:
new_agent._parameters = StartAgentsRequestPropertiesParameters(audio_scenario=audio_scenario)
elif isinstance(new_agent._parameters, dict):
new_agent._parameters = typing.cast(
SessionParamsInput,
{**new_agent._parameters, "audio_scenario": audio_scenario},
)
else:
new_agent._parameters = self._copy_model_update(
new_agent._parameters,
{"audio_scenario": audio_scenario},
)
return new_agent

def with_failure_message(self, message: str) -> "Agent":
"""Deprecated. Configure the failure message on the LLM or MLLM vendor instead."""
new_agent = self._clone()
Expand Down
1 change: 1 addition & 0 deletions src/agora_agent/agentkit/agent_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
is_generic_avatar,
is_heygen_avatar,
is_live_avatar_avatar,
is_rtc_avatar,
validate_avatar_config,
validate_tts_sample_rate,
)
Expand Down
43 changes: 43 additions & 0 deletions src/agora_agent/agentkit/vendors/avatar.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,49 @@ def to_config(self) -> Dict[str, Any]:
return {"enable": enable, "vendor": "generic", "params": params}


class GenericAvatarOptions(BaseModel):
model_config = ConfigDict(extra="forbid")

api_key: str = Field(..., description="Generic avatar provider API key")
api_base_url: str = Field(..., description="Avatar provider API base URL")
avatar_id: str = Field(..., description="Avatar ID")
agora_uid: str = Field(..., description="Agora UID for the avatar video stream")
agora_appid: Optional[str] = Field(default=None, description="Agora App ID; filled by AgentSession when omitted")
agora_token: Optional[str] = Field(default=None, description="RTC token; generated by AgentSession when omitted")
agora_channel: Optional[str] = Field(default=None, description="Agora channel; filled by AgentSession when omitted")
enable: Optional[bool] = Field(default=None, description="Enable avatar (default: true)")
additional_params: Optional[Dict[str, Any]] = Field(default=None, description="Additional vendor-specific parameters")


class GenericAvatar(BaseAvatar):
def __init__(self, **kwargs: Any):
self.options = GenericAvatarOptions(**kwargs)

@property
def required_sample_rate(self) -> int:
return 0

def to_config(self) -> Dict[str, Any]:
params: Dict[str, Any] = {
"api_key": self.options.api_key,
"api_base_url": self.options.api_base_url,
"avatar_id": self.options.avatar_id,
"agora_uid": self.options.agora_uid,
}

if self.options.agora_appid is not None:
params["agora_appid"] = self.options.agora_appid
if self.options.agora_token is not None:
params["agora_token"] = self.options.agora_token
if self.options.agora_channel is not None:
params["agora_channel"] = self.options.agora_channel
if self.options.additional_params is not None:
params = {**self.options.additional_params, **params}

enable = self.options.enable if self.options.enable is not None else True
return {"enable": enable, "vendor": "generic", "params": params}


class AnamAvatarOptions(BaseModel):
model_config = ConfigDict(extra="forbid")

Expand Down
5 changes: 4 additions & 1 deletion src/agora_agent/agentkit/vendors/llm.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from typing import Any, Dict, List, Optional
from typing import Any, Dict, List, Optional, Union

from pydantic import BaseModel, ConfigDict, Field, model_validator

from ...agents.types.start_agents_request_properties_llm_greeting_configs import (
StartAgentsRequestPropertiesLlmGreetingConfigs,
)
from .base import BaseLLM

LlmGreetingConfigs = Dict[str, Any]
Expand Down
1 change: 1 addition & 0 deletions src/agora_agent/agentkit/vendors/mllm.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import warnings
from typing import Any, Dict, List, Optional

from pydantic import BaseModel, ConfigDict, Field
Expand Down
3 changes: 3 additions & 0 deletions src/agora_agent/agentkit/vendors/stt.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ class SpeechmaticsSTTOptions(BaseModel):

api_key: str = Field(..., description="Speechmatics API key")
language: str = Field(..., description="Language code (e.g., en, es, fr)")
interaction_language: Optional[InteractionLanguage] = Field(default=None, description="Agora interaction language for asr.language")
model: Optional[str] = Field(default=None, description="Model name")
uri: Optional[str] = Field(default=None, description="Speechmatics streaming WebSocket URL")
additional_params: Optional[Dict[str, Any]] = Field(default=None)
Expand Down Expand Up @@ -124,6 +125,7 @@ class DeepgramSTTOptions(BaseModel):
api_key: Optional[str] = Field(default=None, description="Deepgram API key")
model: Optional[str] = Field(default=None, description="Model (e.g., nova-2, enhanced, base)")
language: Optional[str] = Field(default=None, description="Language code (e.g., en-US)")
interaction_language: Optional[InteractionLanguage] = Field(default=None, description="Agora interaction language for asr.language")
smart_format: Optional[bool] = Field(default=None, description="Enable smart formatting")
punctuation: Optional[bool] = Field(default=None, description="Enable punctuation")
additional_params: Optional[Dict[str, Any]] = Field(default=None)
Expand Down Expand Up @@ -353,6 +355,7 @@ class SarvamSTTOptions(BaseModel):

api_key: str = Field(..., description="Sarvam API key")
language: str = Field(..., description="Language code (e.g., en, hi, ta)")
interaction_language: Optional[InteractionLanguage] = Field(default=None, description="Agora interaction language for asr.language")
model: Optional[str] = Field(default=None, description="Model name")
additional_params: Optional[Dict[str, Any]] = Field(default=None)

Expand Down
6 changes: 6 additions & 0 deletions src/agora_agent/agentkit/vendors/tts.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,8 @@ def to_config(self) -> Dict[str, Any]:
}
if self.options.api_key is not None:
params["api_key"] = self.options.api_key
if self.options.base_url is not None:
params["base_url"] = self.options.base_url
params["base_url"] = self.options.base_url
params["model"] = self.options.model
elif self.options.model is not None:
Expand Down Expand Up @@ -254,6 +256,8 @@ def to_config(self) -> Dict[str, Any]:
"voice": self.options.voice_id,
"engine": self.options.engine,
}
if self.options.engine is not None:
params["engine"] = self.options.engine

result: Dict[str, Any] = {"vendor": "amazon", "params": params}
if self.options.skip_patterns is not None:
Expand Down Expand Up @@ -392,6 +396,8 @@ def to_config(self) -> Dict[str, Any]:
"reference_id": self.options.reference_id,
"backend": self.options.backend,
}
if self.options.backend is not None:
params["backend"] = self.options.backend

result: Dict[str, Any] = {"vendor": "fishaudio", "params": params}
if self.options.skip_patterns is not None:
Expand Down
4 changes: 2 additions & 2 deletions src/agora_agent/core/client_wrapper.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ def __init__(

def get_headers(self) -> typing.Dict[str, str]:
headers: typing.Dict[str, str] = {
"User-Agent": "agora-agents/v2.1.1",
"User-Agent": "agora-agents/v2.1.2",
"X-Fern-Language": "Python",
"X-Fern-SDK-Name": "agora-agents",
"X-Fern-SDK-Version": "v2.1.1",
"X-Fern-SDK-Version": "v2.1.2",
**(self.get_custom_headers() or {}),
}
headers["Authorization"] = httpx.BasicAuth(self._get_username(), self._get_password())._auth_header
Expand Down
1 change: 0 additions & 1 deletion src/agora_agent/types/asr.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ class Asr_Deepgram(UncheckedBaseModel):
vendor: typing.Literal["deepgram"] = "deepgram"
language: typing.Optional[AsrLanguage] = None
params: DeepgramAsrParams
keyterm: typing.Optional[str] = None

if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
Expand Down
4 changes: 0 additions & 4 deletions src/agora_agent/types/deepgram_asr.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ class DeepgramAsr(UncheckedBaseModel):

language: typing.Optional[AsrLanguage] = None
params: DeepgramAsrParams
keyterm: typing.Optional[str] = pydantic.Field(default=None)
"""
Boost specialized terms and brands for preset-backed Deepgram usage.
"""

if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
Expand Down
2 changes: 1 addition & 1 deletion src/agora_agent/types/deepgram_asr_params.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class DeepgramAsrParams(UncheckedBaseModel):

keyterm: typing.Optional[str] = pydantic.Field(default=None)
"""
Boost specialized terms and brands
Boost specialized terms and brands for Deepgram.
"""

if IS_PYDANTIC_V2:
Expand Down
Loading
Loading