Skip to content

Commit 263d5e3

Browse files
marcusolssonAssemblyAI
andauthored
chore: sync sdk code with DeepLearning repo (#121)
Co-authored-by: AssemblyAI <[email protected]>
1 parent e14d31e commit 263d5e3

File tree

4 files changed

+93
-24
lines changed

4 files changed

+93
-24
lines changed

assemblyai/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.41.0b4"
1+
__version__ = "0.41.0"

assemblyai/streaming/v3/client.py

Lines changed: 51 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,6 @@
3333
logger = logging.getLogger(__name__)
3434

3535

36-
def _user_agent() -> str:
37-
vi = sys.version_info
38-
python_version = f"{vi.major}.{vi.minor}.{vi.micro}"
39-
return (
40-
f"AssemblyAI/1.0 (sdk=Python/{__version__} runtime_env=Python/{python_version})"
41-
)
42-
43-
4436
def _dump_model(model: BaseModel):
4537
if hasattr(model, "model_dump"):
4638
return model.model_dump(exclude_none=True)
@@ -53,10 +45,20 @@ def _dump_model_json(model: BaseModel):
5345
return model.json(exclude_none=True)
5446

5547

48+
def _user_agent() -> str:
49+
vi = sys.version_info
50+
python_version = f"{vi.major}.{vi.minor}.{vi.micro}"
51+
return (
52+
f"AssemblyAI/1.0 (sdk=Python/{__version__} runtime_env=Python/{python_version})"
53+
)
54+
55+
5656
class StreamingClient:
5757
def __init__(self, options: StreamingClientOptions):
5858
self._options = options
5959

60+
self._client = _HTTPClient(api_host=options.api_host, api_key=options.api_key)
61+
6062
self._handlers: Dict[StreamingEvents, List[Callable]] = {}
6163

6264
for event in StreamingEvents.__members__.values():
@@ -73,7 +75,9 @@ def connect(self, params: StreamingParameters) -> None:
7375

7476
uri = f"wss://{self._options.api_host}/v3/ws?{params_encoded}"
7577
headers = {
76-
"Authorization": self._options.api_key,
78+
"Authorization": self._options.token
79+
if self._options.token
80+
else self._options.api_key,
7781
"User-Agent": _user_agent(),
7882
"AssemblyAI-Version": "2025-05-12",
7983
}
@@ -253,14 +257,44 @@ def _parse_error(
253257
message=f"Unknown error: {error}",
254258
)
255259

260+
def create_temporary_token(
261+
self,
262+
expires_in_seconds: int,
263+
max_session_duration_seconds: int,
264+
) -> str:
265+
return self._client.create_temporary_token(
266+
expires_in_seconds=expires_in_seconds,
267+
max_session_duration_seconds=max_session_duration_seconds,
268+
)
256269

257-
class HTTPClient:
258-
def __init__(self, options: StreamingClientOptions):
259-
headers = {
260-
"Authorization": options.api_key,
261-
"User-Agent": _user_agent(),
262-
}
263270

264-
base_url = f"https://{options.api_host}"
271+
class _HTTPClient:
272+
def __init__(self, api_host: str, api_key: Optional[str] = None):
273+
vi = sys.version_info
274+
python_version = f"{vi.major}.{vi.minor}.{vi.micro}"
275+
user_agent = f"{httpx._client.USER_AGENT} AssemblyAI/1.0 (sdk=Python/{__version__} runtime_env=Python/{python_version})"
276+
277+
headers = {"User-Agent": user_agent}
265278

266-
self._http_client = httpx.Client(base_url=base_url, headers=headers, timeout=30)
279+
if api_key:
280+
headers["Authorization"] = api_key
281+
282+
self._http_client = httpx.Client(
283+
base_url="https://" + api_host,
284+
headers=headers,
285+
)
286+
287+
def create_temporary_token(
288+
self,
289+
expires_in_seconds: int,
290+
max_session_duration_seconds: int,
291+
) -> str:
292+
response = self._http_client.get(
293+
"/v3/token",
294+
params={
295+
"expires_in": expires_in_seconds,
296+
"max_session_duration": max_session_duration_seconds,
297+
},
298+
)
299+
response.raise_for_status()
300+
return response.json()["token"]

assemblyai/streaming/v3/models.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,14 @@ class ForceEndpoint(BaseModel):
5656

5757

5858
class StreamingSessionParameters(BaseModel):
59-
word_finalization_max_wait_time: Optional[int] = None
6059
end_of_turn_confidence_threshold: Optional[float] = None
6160
min_end_of_turn_silence_when_confident: Optional[int] = None
6261
max_turn_silence: Optional[int] = None
63-
formatted_finals: Optional[bool] = None
62+
format_turns: Optional[bool] = None
6463

6564

6665
class StreamingParameters(StreamingSessionParameters):
6766
sample_rate: int
68-
token: Optional[str] = None
6967

7068

7169
class UpdateConfiguration(StreamingSessionParameters):
@@ -81,8 +79,9 @@ class UpdateConfiguration(StreamingSessionParameters):
8179

8280

8381
class StreamingClientOptions(BaseModel):
82+
api_host: str = "streaming.assemblyai.com"
8483
api_key: Optional[str] = None
85-
api_host: str
84+
token: Optional[str] = None
8685

8786

8887
class StreamingError(Exception):

tests/unit/test_streaming.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,44 @@ def mocked_websocket_connect(
5555
assert actual_open_timeout == 15
5656

5757

58+
def test_client_connect_with_token(mocker: MockFixture):
59+
actual_url = None
60+
actual_additional_headers = None
61+
actual_open_timeout = None
62+
63+
def mocked_websocket_connect(
64+
url: str, additional_headers: dict, open_timeout: float
65+
):
66+
nonlocal actual_url, actual_additional_headers, actual_open_timeout
67+
actual_url = url
68+
actual_additional_headers = additional_headers
69+
actual_open_timeout = open_timeout
70+
71+
mocker.patch(
72+
"assemblyai.streaming.v3.client.websocket_connect",
73+
new=mocked_websocket_connect,
74+
)
75+
76+
_disable_rw_threads(mocker)
77+
78+
options = StreamingClientOptions(token="test", api_host="api.example.com")
79+
client = StreamingClient(options)
80+
81+
params = StreamingParameters(sample_rate=16000)
82+
client.connect(params)
83+
84+
expected_headers = {
85+
"sample_rate": params.sample_rate,
86+
}
87+
88+
assert actual_url == f"wss://api.example.com/v3/ws?{urlencode(expected_headers)}"
89+
assert actual_additional_headers["Authorization"] == "test"
90+
assert actual_additional_headers["AssemblyAI-Version"] == "2025-05-12"
91+
assert "AssemblyAI/1.0" in actual_additional_headers["User-Agent"]
92+
93+
assert actual_open_timeout == 15
94+
95+
5896
def test_client_connect_all_parameters(mocker: MockFixture):
5997
actual_url = None
6098
actual_additional_headers = None
@@ -80,7 +118,6 @@ def mocked_websocket_connect(
80118

81119
params = StreamingParameters(
82120
sample_rate=16000,
83-
word_finalization_max_wait_time=5000,
84121
end_of_turn_confidence_threshold=0.5,
85122
min_end_of_turn_silence_when_confident=2000,
86123
max_turn_silence=3000,
@@ -89,7 +126,6 @@ def mocked_websocket_connect(
89126
client.connect(params)
90127

91128
expected_headers = {
92-
"word_finalization_max_wait_time": params.word_finalization_max_wait_time,
93129
"end_of_turn_confidence_threshold": params.end_of_turn_confidence_threshold,
94130
"min_end_of_turn_silence_when_confident": params.min_end_of_turn_silence_when_confident,
95131
"max_turn_silence": params.max_turn_silence,

0 commit comments

Comments
 (0)