Skip to content

feat: webrtc and AI plugins #90

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 243 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
243 commits
Select commit Hold shift + click to select a range
5ae8cc4
snap
tbarbugli Mar 26, 2025
9b767b5
snap
tbarbugli Mar 26, 2025
1559c35
snap
tbarbugli Mar 27, 2025
f15d952
snap
tbarbugli Mar 27, 2025
50fb706
snap
tbarbugli Mar 27, 2025
58d4b31
wip
tbarbugli Apr 1, 2025
b006f2c
wip
tbarbugli Apr 1, 2025
53b5bf7
wip
tbarbugli Apr 7, 2025
d091157
wip
tbarbugli Apr 7, 2025
0ef17fc
wip
tbarbugli Apr 7, 2025
2b57106
wip
tbarbugli Apr 7, 2025
56cfbab
wip
tbarbugli Apr 9, 2025
a686678
wip
tbarbugli Apr 9, 2025
eea2a48
wait
tbarbugli Apr 9, 2025
3475fb0
wip
tbarbugli Apr 28, 2025
72f493b
wip
tbarbugli May 2, 2025
efa4442
wip
tbarbugli May 2, 2025
362e8d2
wip
tbarbugli May 6, 2025
77fee21
wip
tbarbugli May 6, 2025
b95d902
wip
tbarbugli May 6, 2025
94f100b
wip
tbarbugli May 6, 2025
3119d13
fix: handle trickle ICE from SFU without patching SDP
vivekd22 May 19, 2025
889fe93
plugins
tbarbugli May 19, 2025
9614167
fix: update initial participants list in state
vivekd22 May 21, 2025
be433aa
fix: SDP with invalid msid semantic causing incorrect stream and trac…
vivekd22 May 21, 2025
bd9c334
fix: typos during refactor
vivekd22 May 21, 2025
9f5830c
wip
tbarbugli May 21, 2025
21dc02d
wip
tbarbugli May 22, 2025
34646ca
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
tbarbugli May 22, 2025
7cc6880
wip
tbarbugli May 23, 2025
224dedd
fix: publisher peer connection sync and synthetic delays
vivekd22 May 23, 2025
5de1843
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
vivekd22 May 23, 2025
ff175af
wip
tbarbugli May 23, 2025
f896e4e
wip
tbarbugli May 25, 2025
46f2d8f
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
tbarbugli May 25, 2025
215cf20
open browser helper
tbarbugli May 26, 2025
2e0d7f3
fix breaking change from pyav
tbarbugli May 26, 2025
a4e1a7b
update deps a bit
tbarbugli May 26, 2025
2278f98
fix: tests
vivekd22 May 26, 2025
2a4090f
fix: incorrect f-string formatting
vivekd22 May 26, 2025
1d7c7f6
workspace
tbarbugli May 26, 2025
7a85d14
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
tbarbugli May 26, 2025
46f68d8
fix: tests
vivekd22 May 27, 2025
8ea35ea
fix: tests
vivekd22 May 27, 2025
fd28382
fix: tests
vivekd22 May 27, 2025
bc1bbc3
fix: tests
vivekd22 May 27, 2025
dbceea2
update tests to have timeout
May 27, 2025
77334e8
moonshine
tbarbugli May 27, 2025
ef648b1
moonshine
tbarbugli May 27, 2025
14a3a27
wip
tbarbugli May 28, 2025
b1bb6be
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
tbarbugli May 28, 2025
e16d225
fix: test configuration
vivekd22 May 28, 2025
2c29627
chore: add workflow_dispatch trigger to ci
vivekd22 May 28, 2025
0d5cbfc
chore: enable push trigger for testing
vivekd22 May 28, 2025
5f95cf3
chore: fix ruff check
vivekd22 May 28, 2025
010d87f
chore: sync dev dependencies
vivekd22 May 28, 2025
50619d4
chore: upgrade ruff
vivekd22 May 28, 2025
e792689
add llm example
maxkahan May 28, 2025
6d0b3ee
working demo, fix plugin using old method name
maxkahan May 29, 2025
4cf7bf5
update readme for example
maxkahan May 29, 2025
a611464
refactoring and using non-custom elevenlabs voice
maxkahan May 29, 2025
3e917be
wip
tbarbugli May 30, 2025
07b372c
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
tbarbugli May 30, 2025
9225845
cleanup dead code from stt
tbarbugli Jun 2, 2025
74dffb2
use aiortc 1.12 until https://github.com/aiortc/aiortc/issues/1332 is…
tbarbugli Jun 2, 2025
f1cd346
updating examples and parameters
maxkahan Jun 2, 2025
4deb30f
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
maxkahan Jun 2, 2025
ac96613
evloop
tbarbugli Jun 2, 2025
3e969e1
cleanup stt inconsistencies
tbarbugli Jun 3, 2025
34ccf52
Merge branch 'webrtc' of github.com:GetStream/stream-py into webrtc
tbarbugli Jun 3, 2025
68dc828
add speech-to-speech plugin
maxkahan Jun 3, 2025
7745098
feat: add recordings
vivekd22 Jun 4, 2025
21405b1
feat: refactored audio recorder
vivekd22 Jun 5, 2025
c83b405
fix example with function calling and add tests
maxkahan Jun 5, 2025
5b2ba1a
chore: add recording example and fix log levels
vivekd22 Jun 10, 2025
4d3a7b8
updating speech to speech plugin
maxkahan Jun 12, 2025
945bd42
ws wip
tbarbugli Jun 12, 2025
c2c7257
user details
tbarbugli Jun 12, 2025
96ed125
update deepgram sample
maxkahan Jun 12, 2025
e76dc54
add elevenlabs sample
maxkahan Jun 12, 2025
ce05355
add vad example
maxkahan Jun 13, 2025
0d510ae
fix moonshine example
maxkahan Jun 13, 2025
272e661
tidy up moonshine sample
maxkahan Jun 16, 2025
f687ea7
feat: add reconnection handling
vivekd22 Jun 17, 2025
5127b90
chore: remove debug logs
vivekd22 Jun 17, 2025
c694f83
feat: add cartesia tts plugin
maxkahan Jun 18, 2025
f877984
feat: add mcp example
maxkahan Jun 19, 2025
e4b716b
patch: update mcp sample and add readme
maxkahan Jun 19, 2025
1337848
Merge branch 'ws-coordinator' into webrtc
tbarbugli Jun 23, 2025
2cd0494
test code remove
tbarbugli Jun 23, 2025
17a2404
refactor: restructure plugins by provider
maxkahan Jun 23, 2025
aea7b65
restructure plugins and create separate packages
maxkahan Jun 24, 2025
138be31
feat: add kokoro plugin
maxkahan Jun 27, 2025
b2cca3a
feat: restructure all plugins, cleanup samples
maxkahan Jul 1, 2025
2168da1
refactor: restructure plugins, remove unnecessary dependencies
maxkahan Jul 1, 2025
e433c6c
skipping test_join.py tests by default
maxkahan Jul 1, 2025
b100ba4
fix: typo in dependency
maxkahan Jul 2, 2025
2a7ce48
style: format code with ruff, fix uv dependency format in toml
maxkahan Jul 2, 2025
d843b82
ci: test new dep format in toml
maxkahan Jul 2, 2025
1f39a63
ci: removed version unsupported by plugins
maxkahan Jul 2, 2025
76b03e0
test: add monkeypatch so we receive correct AudioFrame types
maxkahan Jul 2, 2025
bd91458
test: fix mock logger
maxkahan Jul 2, 2025
836b718
fix: upgrade dependency versions
maxkahan Jul 3, 2025
0c77ad9
fix: restructuring
maxkahan Jul 3, 2025
961724a
feat: plugin restructure
maxkahan Jul 3, 2025
a7ea05e
test: fixed test looking for event that is not sent
maxkahan Jul 3, 2025
e32a808
ci: change uv sync command
maxkahan Jul 3, 2025
8556a47
chore: merge changes and resolve conflicts
vivekd22 Jul 3, 2025
aa1df7e
chore: ruff fix
vivekd22 Jul 3, 2025
7cad6ba
chore: reduce test asset size
vivekd22 Jul 3, 2025
da7eee8
chore: add new release workflow
vivekd22 Jul 3, 2025
0ae6fa2
fix: re-add connection logic
maxkahan Jul 3, 2025
d372a3f
chore: fix merge conflict issues
vivekd22 Jul 4, 2025
17e2d55
fix: actions yaml environment
vivekd22 Jul 4, 2025
a53ac64
fix: fix actions uv setup
vivekd22 Jul 4, 2025
94c7916
fix: fix actions uv setup
vivekd22 Jul 4, 2025
acfc4bb
fix: fix actions uv setup
vivekd22 Jul 4, 2025
a7c9dc6
fix: fix actions uv setup
vivekd22 Jul 4, 2025
d6e458c
fix: fix actions uv setup
vivekd22 Jul 4, 2025
289cc9b
fix: fix actions uv setup
vivekd22 Jul 4, 2025
ee66543
chore: use twine for package upload
vivekd22 Jul 4, 2025
1bfb327
fix: typo with pip install
vivekd22 Jul 4, 2025
9d28e81
chore: bump version
vivekd22 Jul 4, 2025
81ae8a6
chore: fix versioning
vivekd22 Jul 4, 2025
4a31745
chore: fix versioning
vivekd22 Jul 4, 2025
f7d139b
chore: fix versioning
vivekd22 Jul 4, 2025
f91cd7f
chore: fix versioning
vivekd22 Jul 4, 2025
13317d4
chore: fix versioning
vivekd22 Jul 4, 2025
0b35685
chore: add plugin to toml
maxkahan Jul 4, 2025
4bd295a
chore: fix test plugin build
vivekd22 Jul 4, 2025
f95addc
chore: fix test plugin build
vivekd22 Jul 4, 2025
47d7c63
chore: fix test plugin build
vivekd22 Jul 4, 2025
d3689e3
chore: fix test plugin build
vivekd22 Jul 4, 2025
3f56a27
patch: remove unbuildable dependency
maxkahan Jul 4, 2025
e80e407
patch: remove unbuildable dependency
maxkahan Jul 4, 2025
da8935b
chore: fix test plugin build
vivekd22 Jul 4, 2025
b686ee2
fix: fix actions uv setup
vivekd22 Jul 4, 2025
541b443
fix: moonshine plugin dependency
vivekd22 Jul 4, 2025
00fed89
fix: fix actions uv setup
vivekd22 Jul 4, 2025
8921399
chore: use releasev2 by default
vivekd22 Jul 4, 2025
05f1277
chore: bump version
vivekd22 Jul 4, 2025
aeba196
fix: remove invalid badge
maxkahan Jul 4, 2025
65adf8f
chore: add versions
maxkahan Jul 4, 2025
c45cc89
chore: update webrtc proto generations
vivekd22 Jul 7, 2025
1241cb3
ci: skip test if moonshine not installed
maxkahan Jul 7, 2025
7874c37
chore: update proto generations
vivekd22 Jul 7, 2025
b5198a3
chore: reformat
vivekd22 Jul 7, 2025
d740987
Merge branch 'main' of github.com:GetStream/stream-py into webrtc
vivekd22 Jul 7, 2025
fb55f8a
fix: remove using deprecated field
vivekd22 Jul 7, 2025
f3f616a
chore: cleanup
vivekd22 Jul 7, 2025
660f195
ci: require python>=3.10 for optional dependencies, skip tests on lower
maxkahan Jul 7, 2025
f63fea2
ci: only install all packages on python>3.9
maxkahan Jul 7, 2025
90a98b2
ci: only install all packages on python>3.9
maxkahan Jul 7, 2025
441c450
ci: no install on plugins
maxkahan Jul 7, 2025
cd867d1
chore: regenerate openapi and proto spec
vivekd22 Jul 7, 2025
4fe8c4a
ci: remove non-needed python version
maxkahan Jul 8, 2025
4de52d6
remove examples from workspace
maxkahan Jul 8, 2025
0470afe
feat: make all examples fully independent
maxkahan Jul 9, 2025
e59fbd0
chore: regenerate lockfile
maxkahan Jul 9, 2025
bd2d82a
patch: update openai connector
maxkahan Jul 23, 2025
2f8cc2a
update release workflows and add python versions
maxkahan Jul 23, 2025
9be158a
ci: remove specifiers
maxkahan Jul 23, 2025
9fce16b
ci: test only updated packages
maxkahan Jul 23, 2025
76883da
ci: test only updated packages
maxkahan Jul 23, 2025
5f84ba2
ci: test only updated packages
maxkahan Jul 23, 2025
860b947
feat: start adding audio moderation example
maxkahan Jul 24, 2025
f6de33f
fix: video track publish and subscribe
vivekd22 Jul 25, 2025
9f55b04
chore: bump core sdk version 2.3.0a2
vivekd22 Jul 25, 2025
3a7352c
fix: typo generating audio track info
vivekd22 Jul 25, 2025
63a9af4
chore: bump core sdk version 2.3.0a3
vivekd22 Jul 25, 2025
167aaaa
feat: working audio moderation example
maxkahan Jul 25, 2025
d1ef1c5
patch: update example
maxkahan Jul 30, 2025
46851bf
patch: improve docs
maxkahan Jul 30, 2025
248952f
patch: commit inital test plugin
maxkahan Jul 31, 2025
55c045f
patch: commit inital test plugin
maxkahan Jul 31, 2025
7bea18b
feat: add FAL.ai plugin
maxkahan Aug 1, 2025
5f85129
docs: update readme
maxkahan Aug 1, 2025
5636e40
patch: remove unnecessary language field from STT base class
maxkahan Aug 1, 2025
634239a
adding new demo, excluding unneeded files from build
maxkahan Aug 11, 2025
6429034
patch: remove unneeded folders from built distributions
maxkahan Aug 11, 2025
9e95c91
chore: update version
maxkahan Aug 11, 2025
2c4a68a
update demo
maxkahan Aug 12, 2025
f67efe0
feat: Update ElevenLabs TTS plugin to use AsyncElevenLabs client
d3xvn Aug 18, 2025
c2e41b1
add more to plugin and refactor
maxkahan Aug 18, 2025
7796158
fix: Fix linting issues and AsyncIterator type annotation
d3xvn Aug 18, 2025
ebfdda6
fix: Remove unnecessary await from AsyncElevenLabs.stream() call
d3xvn Aug 18, 2025
18d9802
feat: Implement comprehensive structured event system for all AI plugins
d3xvn Aug 19, 2025
5d4d732
restore: Add back .env.example template file
d3xvn Aug 19, 2025
1009fc6
Merge pull request #98 from GetStream/elevenlabs-stream
d3xvn Aug 19, 2025
901d45c
fixed silero and other plugin events
d3xvn Aug 19, 2025
bea0d59
feat: add interruption logic
maxkahan Aug 19, 2025
9c3f4a1
resolve uv.lock after stash pop
maxkahan Aug 19, 2025
3c6b609
fix merge issues
maxkahan Aug 19, 2025
bc32373
get live integration test working
maxkahan Aug 19, 2025
b335d3d
chore: update lock file
maxkahan Aug 19, 2025
4df2b24
chore: disable editable mode
maxkahan Aug 19, 2025
8d16490
refactor: Remove all legacy event emissions and backward compatibility
d3xvn Aug 20, 2025
4e89173
Event system doc changes
d3xvn Aug 20, 2025
070b6eb
fix: Clean up unused imports and fix import structure
d3xvn Aug 20, 2025
7ddbcb0
refactor: Make code more Pythonic by replacing EventSerializer class …
d3xvn Aug 20, 2025
330dd6a
fix: separate event metrics from utils
d3xvn Aug 20, 2025
38c5a4e
fix: remove default confidence values and update tests for structured…
d3xvn Aug 20, 2025
780d26e
chore: clean up unused imports in event_utils.py
d3xvn Aug 20, 2025
52d9a26
fix: remove unused pcm_data variable in Silero VAD plugin
d3xvn Aug 20, 2025
c226c79
chore: remove duplicate pyee dependency from main dependencies
d3xvn Aug 20, 2025
c5abd87
feat: add comprehensive event tests and fix serialization
d3xvn Aug 20, 2025
6bd15cd
test: add comprehensive event metrics tests
d3xvn Aug 20, 2025
c87a765
fix: improve VAD event defaults and metrics calculation
d3xvn Aug 20, 2025
6eadcf1
test: add comprehensive event filtering, registry, and logging tests
d3xvn Aug 20, 2025
58b714d
fix: implement strict confidence filtering in EventFilter
d3xvn Aug 20, 2025
0b64c14
feat: added top-level paramter config to speech-to-speech
maxkahan Aug 20, 2025
8db8e75
docs: update example docs
maxkahan Aug 20, 2025
ed43f94
Merge branch 'webrtc' into events-refactor
d3xvn Aug 20, 2025
cd524bd
Merge pull request #102 from GetStream/gemini-live
maxkahan Aug 20, 2025
491ca16
Change synthesize to stream
Nash0x7E2 Aug 21, 2025
8f08a2e
add method for stopping
Nash0x7E2 Aug 21, 2025
d6c4d88
update method name
Nash0x7E2 Aug 21, 2025
720c235
implement track flushing
Nash0x7E2 Aug 21, 2025
478c07e
Optionally allow for passing in your own client
Nash0x7E2 Aug 21, 2025
dce003c
Optionally allow for passing in your own client
Nash0x7E2 Aug 21, 2025
1672f40
Add test to cover new methods
Nash0x7E2 Aug 21, 2025
32d7a8f
Allow for passing the client as an optional param
Nash0x7E2 Aug 21, 2025
a3fb4ef
Align Cartesia
Nash0x7E2 Aug 21, 2025
006d363
Fix event system test failures and event handler signatures
d3xvn Aug 21, 2025
52700c9
Fix all plugin test failures - 157 tests now passing
d3xvn Aug 21, 2025
49a4cc2
Merge branch 'webrtc' into events-refactor
d3xvn Aug 21, 2025
8f74a18
fixed event system example
maxkahan Aug 21, 2025
aa2a168
Merge pull request #101 from GetStream/events-refactor
d3xvn Aug 21, 2025
5de1e17
change `stream` to `stream_audio`
Nash0x7E2 Aug 21, 2025
e10a348
rename `stop` to `stop_audio`
Nash0x7E2 Aug 21, 2025
b68d98f
false positive
Nash0x7E2 Aug 21, 2025
5eabf30
Merge branch 'webrtc' into tts/interface-alignment
Nash0x7E2 Aug 21, 2025
4dd6833
Merge pull request #104 from GetStream/tts/interface-alignment
Nash0x7E2 Aug 21, 2025
d5da808
Merge pull request #105 from GetStream/stt/align-stt
maxkahan Aug 21, 2025
1375531
fix: elevenlabs methods
maxkahan Aug 21, 2025
11e5f5c
fix: Add missing provider_name parameter to STS base class
d3xvn Aug 22, 2025
6695d1a
ci: run tests on PR to webrtc branch
maxkahan Aug 22, 2025
ff64ca4
chore: trigger ci
maxkahan Aug 22, 2025
0efef96
fix ruff issues
d3xvn Aug 22, 2025
2ccc122
Merge pull request #106 from GetStream/tests-sts-fix
d3xvn Aug 22, 2025
5359fe6
refactor: location and core methods
maxkahan Aug 23, 2025
c7884e1
Merge pull request #107 from GetStream/video-refactor
maxkahan Aug 23, 2025
b80f0b7
style: add import sorting with ruff
maxkahan Aug 23, 2025
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
5 changes: 3 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
STREAM_API_KEY=892s22ypvt6m
STREAM_API_SECRET=5cssrefv55rs3cnkk38kfjam2k7c2ykwn4h79dqh66ym89gm65cxy4h9jx4cypd6
STREAM_API_KEY=your-stream-api-key
STREAM_API_SECRET=your-stream-api-secret
STREAM_BASE_URL=http://127.0.0.1:3030
OPENAI_API_KEY=sk-your-openai-api-key
CARTESIA_API_KEY=your-cartesia-api-key
5 changes: 3 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ on:
pull_request:
branches:
- main
- webrtc

jobs:
test:
Expand All @@ -17,11 +18,11 @@ jobs:
strategy:
fail-fast: false
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13"]
steps:
- name: Check out repo
uses: actions/checkout@v4
- uses: chartboost/ruff-action@v1
- uses: astral-sh/ruff-action@v3
continue-on-error: false
- name: Install uv and set the python version
uses: astral-sh/setup-uv@v5
Expand Down
8 changes: 4 additions & 4 deletions .github/workflows/release-v2.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:

- name: Sync environment & install dev extras
run: |
uv sync --dev --all-packages --all-groups --all-extras
uv sync --dev --all-packages --all-groups --all-extras

- name: Build core distributions
run: |
Expand Down Expand Up @@ -70,7 +70,7 @@ jobs:
with:
repository-url: https://test.pypi.org/legacy/
packages-dir: dist
environment:
env:
name: testpypi

test-core-index:
Expand Down Expand Up @@ -136,7 +136,7 @@ jobs:
with:
repository-url: https://test.pypi.org/legacy/
packages-dir: dist-plugins
environment:
env:
name: testpypi

test-plugins-index:
Expand Down Expand Up @@ -178,4 +178,4 @@ jobs:
echo "* Core published to TestPyPI: ✅" >> $GITHUB_STEP_SUMMARY
echo "* Plugins built & tests: ✅" >> $GITHUB_STEP_SUMMARY
echo "* Plugins published to TestPyPI: ✅" >> $GITHUB_STEP_SUMMARY
echo "* Tests against TestPyPI packages: ✅" >> $GITHUB_STEP_SUMMARY
echo "* Tests against TestPyPI packages: ✅" >> $GITHUB_STEP_SUMMARY
172 changes: 148 additions & 24 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,159 @@ on:
types: [closed]
branches:
- main
workflow_dispatch:
inputs:
python-version:
description: "Python version to use"
default: "3.12"
required: false

permissions:
contents: read
id-token: write

jobs:
Release:
name: 🚀 Release
if: github.event.pull_request.merged && startsWith(github.head_ref, 'release-')
build-core:
name: Build & Test Core SDK
if: (github.event.pull_request.merged && startsWith(github.head_ref, 'release-')) || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
permissions: write-all
environment: ci
outputs:
version: ${{ steps.get_version.outputs.version }}
steps:
- uses: actions/github-script@v7
with:
script: |
// Getting the release version from the PR source branch
// Source branch looks like this: release-1.0.0
const version = context.payload.pull_request.head.ref.split('-')[1]
core.exportVariable('VERSION', version)
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Checkout repository
uses: actions/checkout@v4

- name: Install uv and set the python version
uses: astral-sh/setup-uv@v5
with:
python-version: "3.12"
- name: Build project
run: uv build
- name: Publish package distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
- name: Create release on GitHub
uses: ncipollo/release-action@v1
python-version: ${{ github.event.inputs.python-version || '3.12' }}

- name: Sync environment & install dev extras
run: |
uv sync --all-packages --all-extras --dev --all-groups

- name: Build core distributions
run: |
uv build -o dist

- name: Extract package version
id: get_version
run: |
python - <<'PY'
import re, os, pathlib, sys
version_file = pathlib.Path('getstream') / 'version.py'
content = version_file.read_text()
match = re.search(r"VERSION\s*=\s*['\"]([^'\"]+)['\"]", content)
if not match:
sys.exit('Could not find VERSION in getstream/version.py')
version = match.group(1)
with open(os.environ['GITHUB_OUTPUT'], 'a') as fh:
fh.write(f'version={version}\n')
PY

- name: Publish core to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
uv pip install --upgrade twine
for FILE in dist/getstream*.whl; do
BASENAME=$(basename "$FILE")
PACKAGE_NAME=${BASENAME%%-*}
VERSION=$(echo "$BASENAME" | cut -d'-' -f2) # 1.5.0a2 etc.
echo "Checking if $PACKAGE_NAME version $VERSION exists on PyPI..."
if pip index versions --pre "$PACKAGE_NAME" | grep -q "$VERSION"; then
echo "Version $VERSION already exists for $PACKAGE_NAME – skipping upload."
else
echo "Uploading $BASENAME to PyPI."
twine upload "$FILE"
fi
done

- name: Install core from using uv
run: |
uv pip install "getstream==${{ steps.get_version.outputs.version }}"

- name: Run core tests against PyPI artifact
env:
STREAM_BASE_URL: ${{ vars.STREAM_BASE_URL }}
STREAM_API_KEY: ${{ vars.STREAM_API_KEY }}
STREAM_API_SECRET: ${{ secrets.STREAM_API_SECRET }}
run: |
UV_NO_SOURCES=1 uv run pytest --ignore=getstream/plugins

build-plugins:
name: Build & Test Plugin Packages
runs-on: ubuntu-latest
needs: build-core
environment: ci
env:
CORE_VERSION: ${{ needs.build-core.outputs.version }}
UV_NO_SOURCES: "1"
steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Install uv and set the python version
uses: astral-sh/setup-uv@v5
with:
tag: ${{ env.VERSION }}
token: ${{ secrets.GITHUB_TOKEN }}
generateReleaseNotes: true
python-version: ${{ github.event.inputs.python-version || '3.12' }}

- name: Install new core from PyPI using uv (for plugin builds/tests)
run: |
uv pip install "getstream==${CORE_VERSION}"

- name: Detect updated plugins
id: detect
shell: bash
run: |
set -e
declare -a UPD_PKG UPD_DIR
for dir in getstream/plugins/*/; do
[[ -f "$dir/pyproject.toml" ]] || continue
# get "name version" from pyproject.toml in one shot
read -r name ver <<<"$(python -c 'import tomllib,sys, pathlib; p=sys.argv[1]; data=tomllib.load(open(p,"rb")); print(data["project"]["name"], data["project"]["version"])' "$dir/pyproject.toml")"
if ! pip index versions --pre "$name" | grep -q "$ver"; then
UPD_PKG+=("$name")
UPD_DIR+=("${dir%/}")
fi
done
echo "updated_packages=${UPD_PKG[*]}" >>"$GITHUB_OUTPUT"
echo "updated_dirs=${UPD_DIR[*]}" >>"$GITHUB_OUTPUT"
[[ ${#UPD_PKG[@]} -gt 0 ]] && echo "has_updates=true" >>"$GITHUB_OUTPUT"

- name: Build wheels
if: steps.detect.outputs.has_updates == 'true'
run: |
mkdir -p dist-plugins
for pkg in ${{ steps.detect.outputs.updated_packages }}; do
echo "::group::Building $pkg"
uv build --package "$pkg" -o dist-plugins --wheel --sdist
echo "::endgroup::"
done

- name: Test updated plugins (local wheels)
if: steps.detect.outputs.has_updates == 'true'
env:
STREAM_BASE_URL: ${{ vars.STREAM_BASE_URL }}
STREAM_API_KEY: ${{ vars.STREAM_API_KEY }}
STREAM_API_SECRET: ${{ secrets.STREAM_API_SECRET }}
run: |
uv pip install dist-plugins/*.whl
uv run pytest ${{ steps.detect.outputs.updated_dirs }}

- name: Publish wheels to PyPI
if: steps.detect.outputs.has_updates == 'true'
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
uv pip install --upgrade twine
twine upload dist-plugins/*.whl

- name: Re-install from PyPI and re-run tests
if: steps.detect.outputs.has_updates == 'true'
run: |
uv pip install "getstream==${CORE_VERSION}" ${{ steps.detect.outputs.updated_packages }}
uv run pytest ${{ steps.detect.outputs.updated_dirs }}
7 changes: 7 additions & 0 deletions .github/workflows/stream-py.code-workspace
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"folders": [
{
"path": "../.."
}
]
}
21 changes: 9 additions & 12 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,19 +1,8 @@
*/__pycache__
*/chat/__pycache__
*/video/__pycache__
*/chat/sync/__pycache__
*/chat/async_/__pycache__
*/sync/__pycache__
*/async_/__pycache__
*/video/sync/__pycache__
*/model/__pycache__/
*/cli/__pycache__
*/cli/__pycache__
*__pycache__
.env
.vscode/settings.json
*.pyc
dist/*
dist/*
*.log
.python-version
pyvenv.cfg
Expand All @@ -23,3 +12,11 @@ lib/*
shell.nix
pyrightconfig.json
.DS_Store

# Python package build artifacts
*.egg-info/
build/
*.egg
__pycache__/
*.py[cod]
*$py.class
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[submodule "protocol"]
path = protocol
url = https://github.com/GetStream/protocol
1 change: 1 addition & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ repos:
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
args: ["--maxkb=6000"]
90 changes: 90 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "debugpy",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"python": "${workspaceFolder}/.venv/bin/python",
"env": {
"PYTHONPATH": "${workspaceFolder}"
}
},
{
"name": "Python: Run Tests (Current File)",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"args": [
"${file}",
"-v"
],
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"python": "${workspaceFolder}/.venv/bin/python",
"env": {
"PYTHONPATH": "${workspaceFolder}"
}
},
{
"name": "Python: Run All Tests",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"args": [
"tests/",
"-v"
],
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"python": "${workspaceFolder}/.venv/bin/python",
"env": {
"PYTHONPATH": "${workspaceFolder}"
}
},
{
"name": "Python: Run Specific Test",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"args": [
"${input:testPath}",
"-v",
"-s"
],
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"python": "${workspaceFolder}/.venv/bin/python",
"env": {
"PYTHONPATH": "${workspaceFolder}"
}
},
{
"name": "Python: Debug with uv run",
"type": "debugpy",
"request": "launch",
"program": "/usr/local/bin/uv",
"args": [
"run",
"python",
"${file}"
],
"console": "integratedTerminal",
"cwd": "${workspaceFolder}",
"env": {
"PYTHONPATH": "${workspaceFolder}"
}
}
],
"inputs": [
{
"id": "testPath",
"description": "Path to test file or test function",
"default": "tests/",
"type": "promptString"
}
]
}
Loading