soniox 2.4.0__tar.gz → 2.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- soniox-2.5.0/.github/ISSUE_TEMPLATE/bug_report.yml +81 -0
- soniox-2.5.0/.github/ISSUE_TEMPLATE/feature_request.yml +44 -0
- soniox-2.5.0/.github/PULL_REQUEST_TEMPLATE.md +27 -0
- {soniox-2.4.0 → soniox-2.5.0}/CHANGELOG.md +29 -5
- soniox-2.5.0/CODE_OF_CONDUCT.md +39 -0
- soniox-2.5.0/CONTRIBUTING.md +56 -0
- {soniox-2.4.0 → soniox-2.5.0}/PKG-INFO +1 -1
- soniox-2.5.0/SECURITY.md +14 -0
- {soniox-2.4.0 → soniox-2.5.0}/docs/async_client.md +364 -1
- {soniox-2.4.0 → soniox-2.5.0}/docs/realtime_client.md +612 -590
- {soniox-2.4.0 → soniox-2.5.0}/docs/types.md +28 -10
- {soniox-2.4.0 → soniox-2.5.0}/docs/utils.md +3 -3
- {soniox-2.4.0 → soniox-2.5.0}/pyproject.toml +1 -1
- {soniox-2.4.0 → soniox-2.5.0}/scripts/generate_docs.py +18 -6
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/_utils.py +36 -1
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_stt.py +214 -2
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/stt.py +209 -2
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/_utils.py +10 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/async_stt.py +35 -4
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/async_tts.py +62 -16
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/stt.py +35 -5
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/tts.py +51 -14
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/__init__.py +5 -1
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/api.py +20 -11
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/realtime.py +2 -1
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/utils.py +7 -1
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_async_tts_realtime.py +107 -1
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_stt_realtime.py +209 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_tts_realtime.py +104 -1
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_async_stt_workflows.py +17 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_client.py +31 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_stt_workflows.py +15 -0
- soniox-2.5.0/tests/unit/test_translate.py +280 -0
- soniox-2.5.0/tests/unit/test_types.py +70 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_utils.py +66 -0
- {soniox-2.4.0 → soniox-2.5.0}/uv.lock +1 -1
- {soniox-2.4.0 → soniox-2.5.0}/.claude/settings.local.json +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/.gitignore +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/LICENSE +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/README.md +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/assets/coffee_shop.mp3 +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/assets/coffee_shop.pcm_s16le +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/assets/two_way_translation.mp3 +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/assets/two_way_translation.pcm_s16le +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/api_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/realtime_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/tts_api_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/tts_realtime_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/async_soniox_client/tts_realtime_multiplexed_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/api_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/realtime_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/tts_api_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/tts_realtime_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/examples/soniox_client/tts_realtime_multiplexed_example.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/justfile +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/__init__.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/__init__.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_auth.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_concurrency_limits.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_files.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_models.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_tts.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_tts_models.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_usage_logs.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/async_webhooks.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/auth.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/concurrency_limits.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/files.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/models.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/tts.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/tts_models.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/usage_logs.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/api/webhooks.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/client.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/errors.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/py.typed +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/__init__.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/realtime/_constants.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/common.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/src/soniox/types/webhooks.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/__init__.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/conftest.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/data/openapi.json +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/helpers.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/__init__.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/cases.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/mock_ws.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_chaos_realtime.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_fuzz_realtime.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_keepalive.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/realtime/test_live_ws.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/__init__.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/_openapi.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/_sdk_bindings.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_api.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_async_client.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_async_tts_workflows.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_concurrency_limits.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_coverage_gaps.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_schema_drift.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_stt_extras.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_sync_async_parity.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_tts_workflows.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_usage_logs.py +0 -0
- {soniox-2.4.0 → soniox-2.5.0}/tests/unit/test_webhooks.py +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report something the SDK does wrong, or fails to do
|
|
3
|
+
labels: ["bug"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Thanks for taking the time to file a bug. A **minimal** reproducer speeds things up significantly.
|
|
9
|
+
|
|
10
|
+
- type: checkboxes
|
|
11
|
+
id: non_api
|
|
12
|
+
attributes:
|
|
13
|
+
label: SDK or API?
|
|
14
|
+
description: For API-level problems such as transcription accuracy or server-side errors, please contact [support@soniox.com](mailto:support@soniox.com) instead.
|
|
15
|
+
options:
|
|
16
|
+
- label: I confirm this is an issue with the Python SDK, not the Soniox API.
|
|
17
|
+
required: true
|
|
18
|
+
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: what_happened
|
|
21
|
+
attributes:
|
|
22
|
+
label: What happened?
|
|
23
|
+
description: What did you observe? What did you expect instead?
|
|
24
|
+
placeholder: |
|
|
25
|
+
Observed: ...
|
|
26
|
+
Expected: ...
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
|
|
30
|
+
- type: textarea
|
|
31
|
+
id: repro
|
|
32
|
+
attributes:
|
|
33
|
+
label: Minimal reproducer
|
|
34
|
+
description: The smallest script that triggers the issue. Strip out anything unrelated.
|
|
35
|
+
render: python
|
|
36
|
+
placeholder: |
|
|
37
|
+
from soniox import SonioxClient
|
|
38
|
+
...
|
|
39
|
+
validations:
|
|
40
|
+
required: true
|
|
41
|
+
|
|
42
|
+
- type: textarea
|
|
43
|
+
id: traceback
|
|
44
|
+
attributes:
|
|
45
|
+
label: Logs or traceback
|
|
46
|
+
description: Full traceback or relevant log lines, if any.
|
|
47
|
+
render: shell
|
|
48
|
+
validations:
|
|
49
|
+
required: false
|
|
50
|
+
|
|
51
|
+
- type: input
|
|
52
|
+
id: sdk_version
|
|
53
|
+
attributes:
|
|
54
|
+
label: SDK version
|
|
55
|
+
placeholder: "soniox==2.4.0"
|
|
56
|
+
validations:
|
|
57
|
+
required: true
|
|
58
|
+
|
|
59
|
+
- type: input
|
|
60
|
+
id: python_version
|
|
61
|
+
attributes:
|
|
62
|
+
label: Python version
|
|
63
|
+
placeholder: "Python 3.12.3"
|
|
64
|
+
validations:
|
|
65
|
+
required: true
|
|
66
|
+
|
|
67
|
+
- type: input
|
|
68
|
+
id: os
|
|
69
|
+
attributes:
|
|
70
|
+
label: Operating system
|
|
71
|
+
placeholder: "Ubuntu 24.04 / macOS 15 / Windows 11"
|
|
72
|
+
validations:
|
|
73
|
+
required: true
|
|
74
|
+
|
|
75
|
+
- type: textarea
|
|
76
|
+
id: additional
|
|
77
|
+
attributes:
|
|
78
|
+
label: Additional context
|
|
79
|
+
description: Anything else relevant: timing patterns, frequency, workarounds you have tried.
|
|
80
|
+
validations:
|
|
81
|
+
required: false
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Propose a new capability or improvement
|
|
3
|
+
labels: ["enhancement"]
|
|
4
|
+
body:
|
|
5
|
+
- type: markdown
|
|
6
|
+
attributes:
|
|
7
|
+
value: |
|
|
8
|
+
Use this template to propose new SDK functionality or improvements to existing APIs.
|
|
9
|
+
|
|
10
|
+
- type: textarea
|
|
11
|
+
id: problem
|
|
12
|
+
attributes:
|
|
13
|
+
label: Problem
|
|
14
|
+
description: What are you trying to do? What does the SDK currently make hard or awkward?
|
|
15
|
+
validations:
|
|
16
|
+
required: true
|
|
17
|
+
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: solution
|
|
20
|
+
attributes:
|
|
21
|
+
label: Proposed solution
|
|
22
|
+
description: The shape of the API or behavior you would like. Python sketches welcome.
|
|
23
|
+
render: python
|
|
24
|
+
placeholder: |
|
|
25
|
+
# What the call site could look like:
|
|
26
|
+
client.foo.bar(...)
|
|
27
|
+
validations:
|
|
28
|
+
required: true
|
|
29
|
+
|
|
30
|
+
- type: textarea
|
|
31
|
+
id: alternatives
|
|
32
|
+
attributes:
|
|
33
|
+
label: Alternatives considered
|
|
34
|
+
description: Other approaches you thought about, and why you do not prefer them.
|
|
35
|
+
validations:
|
|
36
|
+
required: false
|
|
37
|
+
|
|
38
|
+
- type: textarea
|
|
39
|
+
id: context
|
|
40
|
+
attributes:
|
|
41
|
+
label: Additional context
|
|
42
|
+
description: Links to similar features in other SDKs, related issues, or use-case background.
|
|
43
|
+
validations:
|
|
44
|
+
required: false
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- One or two sentences. What does this PR do, and why? -->
|
|
4
|
+
|
|
5
|
+
## Type of change
|
|
6
|
+
|
|
7
|
+
- [ ] Bug fix
|
|
8
|
+
- [ ] New feature
|
|
9
|
+
- [ ] Breaking change
|
|
10
|
+
- [ ] Internal refactor
|
|
11
|
+
- [ ] Documentation
|
|
12
|
+
|
|
13
|
+
## How to test
|
|
14
|
+
|
|
15
|
+
<!-- Steps a reviewer can run to verify the change. -->
|
|
16
|
+
|
|
17
|
+
## Checklist
|
|
18
|
+
|
|
19
|
+
- [ ] Tests added or updated under `tests/unit/` or `tests/realtime/`.
|
|
20
|
+
- [ ] `just lint`, `just typecheck`, and `just test` all pass locally.
|
|
21
|
+
- [ ] `CHANGELOG.md` `[Unreleased]` section updated, if the change is user-visible.
|
|
22
|
+
- [ ] Reference docs regenerated with `just docs`, if public APIs changed.
|
|
23
|
+
- [ ] No leftover `print()` debug statements or commented-out code.
|
|
24
|
+
|
|
25
|
+
## Related issues
|
|
26
|
+
|
|
27
|
+
<!-- Closes #123, refs #456 -->
|
|
@@ -63,20 +63,44 @@ Examples:
|
|
|
63
63
|
|
|
64
64
|
### Added
|
|
65
65
|
|
|
66
|
-
-
|
|
67
|
-
|
|
68
66
|
### Changed
|
|
69
67
|
|
|
70
|
-
|
|
68
|
+
### Deprecated
|
|
71
69
|
|
|
72
70
|
### Fixed
|
|
73
71
|
|
|
74
|
-
-
|
|
75
|
-
|
|
76
72
|
### Removed
|
|
77
73
|
|
|
78
74
|
---
|
|
79
75
|
|
|
76
|
+
## [2.5.0] - 12 jun 2026
|
|
77
|
+
|
|
78
|
+
### Added
|
|
79
|
+
|
|
80
|
+
- `LanguageCode` type alias (`Annotated[str, Field(min_length=2, max_length=2)]`) representing an ISO 639-1 two-letter code. Now used by `TranslationConfig.target_language`, `language_a`, `language_b`, and by the `language_hints` lists on `CreateTranscriptionPayload`, `CreateTranscriptionConfig`, and `RealtimeSTTConfig`.
|
|
81
|
+
- `SupportedLanguage` model (renamed from `Language`) describing a `{code, name}` language entry returned by `client.models.list()`.
|
|
82
|
+
- `translate*` methods on the async and sync STT clients (`translate`, `translate_from_url`, `translate_from_file_id`, `translate_from_file`, `translate_and_wait`, `translate_and_wait_with_tokens`). Pass `to=` for one-way translation (optionally with `source=` as a strict language hint) or `between=("en", "fr")` for two-way; exactly one of `to` or `between` is required.
|
|
83
|
+
- `connect_timeout_sec` parameter on the realtime `connect()` and `connect_multi_stream()` methods (STT and TTS, sync and async): maximum seconds to wait for the WebSocket handshake. Defaults to 10 seconds; must be greater than zero. ([#4](https://github.com/soniox/soniox-python/pull/4) by [@imcooder](https://github.com/imcooder))
|
|
84
|
+
|
|
85
|
+
### Changed
|
|
86
|
+
|
|
87
|
+
- Reorganized reference docs: `async_client.md` now documents only the async surface (the sync `SonioxClient` is a line-by-line mirror, called out in a preamble); `realtime_client.md` continues to cover both sync and async realtime clients.
|
|
88
|
+
- Expanded the `output_file_for_audio_format` docstring with a proper `Args` block.
|
|
89
|
+
- `language_hints` fields now validate each entry as a two-letter code; previously any string was accepted client-side.
|
|
90
|
+
- Realtime WebSocket connection failures now raise `SonioxRealtimeError` (with message `"Connection timed out"` when the handshake times out) instead of propagating raw `websockets` exceptions. ([#4](https://github.com/soniox/soniox-python/pull/4) by [@imcooder](https://github.com/imcooder))
|
|
91
|
+
- Default model for asynchronous transcriptions is now `stt-async-v5` (was `stt-async-v4`).
|
|
92
|
+
|
|
93
|
+
### Deprecated
|
|
94
|
+
|
|
95
|
+
- `Language` is a deprecated alias for `SupportedLanguage`. Update imports to `from soniox.types import SupportedLanguage`.
|
|
96
|
+
|
|
97
|
+
### Fixed
|
|
98
|
+
|
|
99
|
+
- Removed Sphinx `:meth:` directive leaks from realtime STT client docstrings; they were rendering as raw text in the generated markdown reference.
|
|
100
|
+
- `AsyncRealtimeTTSClient.connect_multi_stream()` now validates that an API key is available, matching the sync `RealtimeTTSClient.connect_multi_stream()`; previously it silently constructed a connection with an empty key.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
80
104
|
## [2.4.0] - 13 may 2026
|
|
81
105
|
|
|
82
106
|
### Added
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Code of Conduct
|
|
2
|
+
|
|
3
|
+
## Our pledge
|
|
4
|
+
|
|
5
|
+
We pledge to make participation in this project a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
|
6
|
+
|
|
7
|
+
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
|
8
|
+
|
|
9
|
+
## Our standards
|
|
10
|
+
|
|
11
|
+
Behavior that contributes to a positive environment includes:
|
|
12
|
+
|
|
13
|
+
- Using welcoming and inclusive language.
|
|
14
|
+
- Respecting differing viewpoints and experiences.
|
|
15
|
+
- Accepting constructive criticism gracefully.
|
|
16
|
+
- Focusing on what is best for the community.
|
|
17
|
+
- Showing empathy toward other community members.
|
|
18
|
+
|
|
19
|
+
Unacceptable behavior includes:
|
|
20
|
+
|
|
21
|
+
- Sexualized language or imagery, and unwelcome sexual attention or advances.
|
|
22
|
+
- Trolling, insulting or derogatory comments, and personal or political attacks.
|
|
23
|
+
- Public or private harassment.
|
|
24
|
+
- Publishing others' private information, such as a physical or email address, without their explicit permission.
|
|
25
|
+
- Other conduct that could reasonably be considered inappropriate in a professional setting.
|
|
26
|
+
|
|
27
|
+
## Scope
|
|
28
|
+
|
|
29
|
+
This Code of Conduct applies on GitHub, Discord, and any other channel where someone is representing the project.
|
|
30
|
+
|
|
31
|
+
## Reporting and enforcement
|
|
32
|
+
|
|
33
|
+
Report incidents to [support@soniox.com](mailto:support@soniox.com). All reports are reviewed and investigated promptly and fairly. We respect the privacy of reporters.
|
|
34
|
+
|
|
35
|
+
Maintainers are responsible for clarifying and enforcing these standards, and may take corrective action in response to behavior they consider inappropriate.
|
|
36
|
+
|
|
37
|
+
## Attribution
|
|
38
|
+
|
|
39
|
+
This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1, available at <https://www.contributor-covenant.org/version/2/1/code_of_conduct.html>.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Contributions are welcome. PRs that are small, typed, and tested move through review fastest.
|
|
4
|
+
|
|
5
|
+
By participating in this project, you agree to abide by our [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
6
|
+
|
|
7
|
+
## Development setup
|
|
8
|
+
|
|
9
|
+
Install [uv](https://docs.astral.sh/uv/) and [just](https://github.com/casey/just), then:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
git clone https://github.com/soniox/soniox-python
|
|
13
|
+
cd soniox-python
|
|
14
|
+
uv sync --extra dev
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
> Python 3.13.6 has a regression in the `ssl` module that hangs realtime WebSocket sessions ([CPython #137583](https://github.com/python/cpython/issues/137583)). For local development, use Python 3.10 through 3.12, or 3.13.5 / 3.13.7 and later.
|
|
18
|
+
|
|
19
|
+
Day-to-day commands:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
just test # full test suite
|
|
23
|
+
just lint # ruff
|
|
24
|
+
just typecheck # pyright
|
|
25
|
+
just docs # regenerate docs/*.md from source
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Opening a pull request
|
|
29
|
+
|
|
30
|
+
Open PRs against the `dev` branch. `main` tracks releases.
|
|
31
|
+
|
|
32
|
+
Before you push:
|
|
33
|
+
|
|
34
|
+
1. Keep the PR focused. One bug fix, one feature, or one refactor. Mixed PRs are slower to review.
|
|
35
|
+
2. Add tests. New endpoints belong in `tests/unit/`; realtime helpers belong in `tests/realtime/`.
|
|
36
|
+
3. Run `just lint`, `just typecheck`, and `just test`. All three must pass before review.
|
|
37
|
+
4. Maintain coverage above the threshold set in `pyproject.toml`.
|
|
38
|
+
5. Update the `[Unreleased]` section of `CHANGELOG.md` for any user-visible change. Categorize as Added, Changed, Fixed, or Removed.
|
|
39
|
+
6. If you changed public APIs, regenerate the reference docs with `just docs`.
|
|
40
|
+
|
|
41
|
+
To pick up a newer OpenAPI schema, run `just download-schema`. This pulls the latest `openapi.json` into `tests/data/`. The `test_schema_drift.py` suite then reports missing fields and changed signatures automatically.
|
|
42
|
+
|
|
43
|
+
## Conventions
|
|
44
|
+
|
|
45
|
+
- `ruff` handles formatting and lint rules; the configuration lives in `pyproject.toml`.
|
|
46
|
+
- `pyright` runs in strict mode against `src/`. Tests have a narrower config in the same file.
|
|
47
|
+
- Write docstrings in plain markdown with backticks for code references. Do not use Sphinx directives such as `:meth:` or `:param:`. They leak as raw text into the generated reference.
|
|
48
|
+
- Write comments to explain why, not what. Well-named identifiers already say what the code does.
|
|
49
|
+
|
|
50
|
+
## Reporting bugs
|
|
51
|
+
|
|
52
|
+
File issues at [github.com/soniox/soniox-python/issues](https://github.com/soniox/soniox-python/issues) using the bug report template. Include the SDK version, the Python version, and a minimal reproducer.
|
|
53
|
+
|
|
54
|
+
## Reporting security issues
|
|
55
|
+
|
|
56
|
+
Do not file a public issue for security vulnerabilities. See [SECURITY.md](SECURITY.md) for the channels we monitor.
|
soniox-2.5.0/SECURITY.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
If you have discovered a security vulnerability in this SDK, please report it through one of the channels below. Use whichever is most convenient; we monitor all of them.
|
|
6
|
+
|
|
7
|
+
- **Email** [support@soniox.com](mailto:support@soniox.com) with a description of the issue and steps to reproduce.
|
|
8
|
+
- **Open a GitHub issue** describing the broad nature of the problem, but omit sensitive details (payloads, tokens, exact exploit steps). We will follow up privately to collect the rest.
|
|
9
|
+
- **Direct-message a maintainer** on GitHub or anywhere else you have already corresponded with us.
|
|
10
|
+
- **Reach us on [Discord](https://discord.gg/soniox)** and ask for a maintainer in DMs.
|
|
11
|
+
|
|
12
|
+
## Responsible disclosure
|
|
13
|
+
|
|
14
|
+
We ask that you allow us a reasonable window to investigate and ship a fix before publishing any details. We will acknowledge your report, work through the diagnosis with you, and credit your disclosure in the release notes if you would like.
|