Official Python SDK for Stream
Check out our:
- β Chat API
- π± Video API
- π Activity Feeds
- Video call creation and management
- Chat session creation and management
- Token generation for user authentication
To install the Stream Client Library, run the following command:
pip install getstream # or if like us, you fell in love with uv uv add getstream
If you want to use WebRTC, audio, or video functionality (like real-time call joining, audio processing, STT/TTS plugins), install with the webrtc extra:
pip install getstream[webrtc] # or using uv uv add 'getstream[webrtc]'
If you want to use the openai realtime integration, you need to install the package with the additional dependencies:
pip install getstream[openai-realtime] # or using uv uv add 'getstream[openai-realtime]'
To get started, you need to import the Stream
class from the library and create a new instance with your API key and secret:
from getstream import Stream client = Stream(api_key="your_api_key", api_secret="your_api_secret")
from getstream.models import UserRequest # sync two users using the update_users method, both users will get insert or updated client.upsert_users( UserRequest( id="tommaso-id", name="tommaso", role="admin", custom={"country": "NL"} ), UserRequest( id="thierry-id", name="thierry", role="admin", custom={"country": "US"} ), ) # Create a JWT token for the user to connect client-side (e.g. browser/mobile app) token = client.create_token("tommaso-id")
To create a video call, use the client.video.call
method:
import uuid from getstream.models import ( CallRequest, MemberRequest, ) call = client.video.call("default", uuid.uuid4()) call.get_or_create( data=CallRequest( created_by_id="tommaso-id", members=[ MemberRequest(user_id="thierry-id"), MemberRequest(user_id="tommaso-id"), ], ), )
Many calls return a StreamResponse
object, with the specific dataclass for the method call nested inside. You can access this via:
response: StreamResponse[StartClosedCaptionsResponse] = call.start_closed_captions() response.data # Gives the StartClosedCaptionsResponse model
# Video: update settings for a call type # Chat: update settings for a channel type
To work with chat sessions, use the client.chat
object and implement the desired chat methods in the Chat
class:
chat_instance = client.chat # TODO: implement and call chat-related methods with chat_instance
We use uv to manage dependencies and run tests. This project uses a UV workspace configuration that makes development across the main package, plugins, and examples seamless.
stream-py/ βββ pyproject.toml # Root workspace configuration βββ uv.lock # Unified dependency lock file βββ getstream/ # Main SDK package β βββ plugins/ # Plugin packages β βββ stt/deepgram/ # Speech-to-text plugins β βββ tts/elevenlabs/ # Text-to-speech plugins β βββ vad/silero/ # Voice activity detection plugins βββ examples/ # Example projects β βββ stt_deepgram_transcription/ βββ tests/ # Main package tests βββ ai/instructions/ # Development guides
Prerequisites:
- Python 3.9+ (recommended: 3.12.2)
- uv package manager
Setup:
# 1. Clone and enter the repository git clone https://github.com/GetStream/stream-py.git cd stream-py # 2. Create virtual environment and install everything uv venv --python 3.12.2 uv sync --all-extras --dev # 3. Set up pre-commit hooks pre-commit install # 4. Create environment file for API credentials cp .env.example .env # Edit .env with your Stream API credentials
The workspace configuration provides:
- β Automatic editable installs: All packages linked automatically
- β Live updates: Changes propagate instantly across packages
- β Unified dependencies: Single lock file for consistent versions
- β Simple testing: Run tests across the entire codebase
- β Easy plugin development: No manual dependency management
Run all tests:
uv run pytest # Everything uv run pytest -v # Verbose output uv run pytest -x # Stop on first failure
Run specific test suites:
# Main package tests uv run pytest tests/ uv run pytest tests/test_video.py # Specific test file # Plugin tests uv run pytest getstream/plugins/stt/deepgram/tests/ uv run pytest getstream/plugins/*/tests/ # All plugins # Example tests uv run pytest examples/stt_deepgram_transcription/tests/ uv run pytest examples/*/tests/ # All examples
Test with coverage:
uv run pytest --cov=getstream --cov-report=html
Test configuration:
- Configuration:
pytest.ini
- Fixtures:
tests/fixtures.py
- Test assets:
tests/assets/
(keep files < 256KB)
Testing best practices:
- Write tests as simple Python functions with assert statements
- Use fixtures from
tests/fixtures.py
for common setup - Place test assets in
tests/assets/
directory - Avoid mocks unless specifically required
- Always run tests from the project root directory
CI considerations:
import pytest @pytest.mark.skip_in_ci def test_something(): # This test will be skipped in GitHub Actions ...
# Make changes to getstream/ # Run tests to verify uv run pytest tests/ # Changes are immediately available to plugins and examples
# Make changes to getstream/plugins/stt/your-plugin/ # Run plugin tests uv run pytest getstream/plugins/stt/your-plugin/tests/ # Test integration with examples cd examples/your-example/ uv run python main.py
# 1. Create plugin directory mkdir -p getstream/plugins/stt/my-plugin # 2. Add pyproject.toml with workspace source cat > getstream/plugins/stt/my-plugin/pyproject.toml << EOF [project] name = "getstream-plugins-stt-my-plugin" dependencies = ["getstream[webrtc]"] [tool.uv.sources] getstream = { workspace = true } EOF # 3. Add to workspace members in root pyproject.toml # Edit: [tool.uv.workspace] members = [..., "getstream/plugins/stt/my-plugin"] # 4. Sync workspace uv sync --all-extras --dev
# Examples automatically use local versions cd examples/stt_deepgram_transcription/ uv run python main.py # Add new example mkdir examples/my-example # Create pyproject.toml with workspace sources # Add to workspace members
Install new dependency:
# Main package uv add "new-package>=1.0.0" # Plugin-specific cd getstream/plugins/stt/my-plugin/ uv add "plugin-specific-dep>=2.0.0" # WebRTC-related (add to webrtc extra) # Edit pyproject.toml [project.optional-dependencies] webrtc section
Run linting and formatting:
uv run ruff check getstream/ tests/ # Check for issues uv run ruff format getstream/ tests/ # Format code uv run pre-commit run --all-files # Run all hooks
Generate WebRTC code:
./generate_webrtc.sh # Regenerate WebRTC bindings
Generate API code:
./generate.sh # Regenerate API endpoints
Workspace sync issues:
# Clean and reinstall uv sync --reinstall --all-extras --dev
Import errors:
# Ensure you're running from project root cd /path/to/stream-py uv run python -c "import getstream; print('β
Import successful')"
Test failures:
# Run with verbose output uv run pytest -v -s # Run specific test uv run pytest tests/test_video.py::test_specific_function -v
Plugin not found:
# Check workspace members in pyproject.toml # Ensure plugin has [tool.uv.sources] getstream = { workspace = true } # Re-sync workspace uv sync --all-extras --dev
- Plugin Development: See
ai/instructions/projects/ai-plugin.md
- Testing Guidelines: See
ai/instructions/ai-basics.md
- WebRTC Setup: See
ai/instructions/ai-webrtc.md
- Examples: Browse
examples/
directory for usage patterns
This project is licensed under the MIT License.
Contributions are welcome! Please read the contributing guidelines to get started.