Merge pull request #3886 from dhruvladia-sarvam/add/user-agent
fix(sarvam): standardize STT/TTS User-Agent headers
This commit is contained in:
1
changelog/3886.other.md
Normal file
1
changelog/3886.other.md
Normal file
@@ -0,0 +1 @@
|
|||||||
|
- Standardized Sarvam STT/TTS User-Agent header handling to consistently send Pipecat SDK identity in websocket requests.
|
||||||
@@ -266,15 +266,10 @@ class SarvamSTTService(STTService):
|
|||||||
|
|
||||||
# Initialize Sarvam SDK client
|
# Initialize Sarvam SDK client
|
||||||
self._sdk_headers = sdk_headers()
|
self._sdk_headers = sdk_headers()
|
||||||
# NOTE: We avoid passing non-standard kwargs here because different sarvamai
|
# Pass Pipecat SDK headers directly at client construction time so they are
|
||||||
# versions expose different constructor signatures (static type checkers
|
# merged by the Sarvam SDK's client wrapper and consistently applied to
|
||||||
# complain otherwise). We instead inject headers best-effort below.
|
# WebSocket handshake requests.
|
||||||
self._sarvam_client = AsyncSarvamAI(api_subscription_key=api_key)
|
self._sarvam_client = AsyncSarvamAI(api_subscription_key=api_key, headers=self._sdk_headers)
|
||||||
for attr in ("default_headers", "_default_headers", "headers", "_headers"):
|
|
||||||
d = getattr(self._sarvam_client, attr, None)
|
|
||||||
if isinstance(d, dict):
|
|
||||||
d.update(self._sdk_headers)
|
|
||||||
break
|
|
||||||
self._websocket_context = None
|
self._websocket_context = None
|
||||||
self._socket_client = None
|
self._socket_client = None
|
||||||
self._receive_task = None
|
self._receive_task = None
|
||||||
@@ -517,20 +512,26 @@ class SarvamSTTService(STTService):
|
|||||||
connect_kwargs["prompt"] = self._settings.prompt
|
connect_kwargs["prompt"] = self._settings.prompt
|
||||||
|
|
||||||
def _connect_with_sdk_headers(connect_fn, **kwargs):
|
def _connect_with_sdk_headers(connect_fn, **kwargs):
|
||||||
# Different SDK versions may use different kwarg names.
|
|
||||||
# If prompt is unsupported at connect-time, retry without it.
|
# If prompt is unsupported at connect-time, retry without it.
|
||||||
|
# Headers are supplied through request_options because this is a
|
||||||
|
# documented SDK parameter that survives SDK signature changes.
|
||||||
|
request_options = {"additional_headers": self._sdk_headers}
|
||||||
|
|
||||||
attempts = [kwargs]
|
attempts = [kwargs]
|
||||||
if "prompt" in kwargs:
|
if "prompt" in kwargs:
|
||||||
attempts.append({k: v for k, v in kwargs.items() if k != "prompt"})
|
attempts.append({k: v for k, v in kwargs.items() if k != "prompt"})
|
||||||
|
|
||||||
last_type_error = None
|
last_type_error = None
|
||||||
for attempt_kwargs in attempts:
|
for attempt_kwargs in attempts:
|
||||||
for header_kw in ("headers", "additional_headers", "extra_headers"):
|
|
||||||
try:
|
|
||||||
return connect_fn(**attempt_kwargs, **{header_kw: self._sdk_headers})
|
|
||||||
except TypeError as e:
|
|
||||||
last_type_error = e
|
|
||||||
try:
|
try:
|
||||||
|
return connect_fn(
|
||||||
|
**attempt_kwargs,
|
||||||
|
request_options=request_options,
|
||||||
|
)
|
||||||
|
except TypeError as e:
|
||||||
|
last_type_error = e
|
||||||
|
try:
|
||||||
|
# Fallback for SDK builds that don't expose request_options.
|
||||||
return connect_fn(**attempt_kwargs)
|
return connect_fn(**attempt_kwargs)
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
last_type_error = e
|
last_type_error = e
|
||||||
|
|||||||
@@ -1013,12 +1013,14 @@ class SarvamTTSService(InterruptibleTTSService):
|
|||||||
if self._websocket and self._websocket.state is State.OPEN:
|
if self._websocket and self._websocket.state is State.OPEN:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
ws_additional_headers = {
|
||||||
|
"api-subscription-key": self._api_key,
|
||||||
|
**sdk_headers(),
|
||||||
|
}
|
||||||
|
|
||||||
self._websocket = await websocket_connect(
|
self._websocket = await websocket_connect(
|
||||||
self._websocket_url,
|
self._websocket_url,
|
||||||
additional_headers={
|
additional_headers=ws_additional_headers,
|
||||||
"api-subscription-key": self._api_key,
|
|
||||||
**sdk_headers(),
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
logger.debug("Connected to Sarvam TTS Websocket")
|
logger.debug("Connected to Sarvam TTS Websocket")
|
||||||
await self._send_config()
|
await self._send_config()
|
||||||
|
|||||||
Reference in New Issue
Block a user