All notable changes to this project will be documented in this file.
- SLIMRPC in Bindings: Complete implementation of SLIMRPC functionality directly in Rust bindings, enabling cross-language support (#1202)
- Go SLIMRPC Support: Added SLIMRPC compiler support for Go with examples and code generation (#1163)
- Python SLIMRPC Refactor: Migrated Python SLIMRPC to use the new Rust-based implementation from slim-bindings (#1148)
- Remove lock from MLS state for improved performance (#1203)
- SLIMRPC compiler now produces language-specific binaries (
protoc-gen-slimrpc-pythonandprotoc-gen-slimrpc-go) (#1163) - Reorganized Go bindings structure to support local development with slim-bindings-go (#1163)
- Fix vulnerability GO-2026-4337 (#1213)
- Fix gRPC connection closure issues (#1159)
- Fix async methods in Go bindings (#1149)
- Fix RUSTSEC-2026-0009 security advisory (#1205)
- Fix code and image scan configuration files (#1199)
- Fix controller Dockerfile (#1169)
- Fix misleading prints in slimctl (#1170)
- Upgrade to Rust 1.93 (#1190)
- Remove unused Go tools from CI (#1172)
- Remove integration folder refactoring (#1195)
- CI improvements for slimrpc-compiler with removed Windows GNU targets (#1219)
- Fix release-plz package naming for slimrpc compiler (#1214, #1215)
- Bump protobuf from 6.32.1 to 6.33.5 (#1177)
- Bump github.com/go-git/go-git/v5 from 5.16.3 to 5.16.5 (#1210)
| Component | Latest Version | Release Date |
|---|---|---|
| slim | v1.0.2 | 2026-02-12 |
| slim-bindings | v1.1.0 | 2026-02-12 |
| protoc-slimrpc-plugin | v1.0.0 | 2026-02-12 |
| control-plane | v1.0.0 | 2026-01-30 |
| slimctl | v1.0.0 | 2026-01-30 |
| helm-slim | v1.0.0 | 2026-02-02 |
| helm-slim-control-plane | v1.0.0 | 2026-01-30 |
- Container Images: Available on GitHub Container Registry
ghcr.io/agntcy/slim:v1.0.2
- Python Packages: Published to PyPI
slim-bindings==1.1.0
- Rust Crates: Published to crates.io
agntcy-protoc-slimrpc-plugin==1.0.0
- Go Bindings: Available at github.com/agntcy/slim-bindings-go
All components with the same major version (v1.x.x) are compatible with each other.
| Component | Version | Compatible With |
|---|---|---|
| slim | v1.0.2 | Data plane runtime |
| slim-bindings | v1.1.0 | Python 3.10+ and Go 1.21+ (with CGO) |
| protoc-slimrpc-plugin | v1.0.0 | protoc 3.x+, supports Python and Go code generation |
| control-plane | v1.0.0 | Control plane services |
| slimctl | v1.0.0 | CLI tool |
| helm charts | v1.0.0 | Kubernetes deployment |
- slim-bindings v1.1.0 includes SLIMRPC functionality directly in the bindings
- protoc-slimrpc-plugin v1.0.0 supports both Python and Go code generation
- SLIMRPC is now available across Python and Go through unified Rust implementation
- Backward compatible with slim-bindings v1.0.x for non-SLIMRPC features
The API for creating SLIM App instances has changed in v1.0.0. If you're upgrading from versions prior to v1.0.0, please refer to the Migration Guide: SLIM Python Bindings v0.7.x to v1.x section in the v1.0.0 release notes below for detailed migration instructions. v1.1.0 maintains compatibility with v1.0.0 App creation API.
The standalone slimrpc Python package has been deprecated in favor of SLIMRPC functionality now included directly in slim-bindings. The slimrpc package was primarily used as a dependency in code generated by the protoc-slimrpc-plugin compiler.
To migrate:
- Update the
protoc-slimrpc-pluginto version 1.0.0 - Update your project dependencies:
- Remove:
slimrpc - Add:
slim-bindings~=1.1
- Remove:
- Regenerate your SLIMRPC code using the updated compiler
The generated code will now import from slim_bindings instead of slimrpc:
Old (generated with protoc-slimrpc-plugin <1.0.0):
from slimrpc import ...New (generated with protoc-slimrpc-plugin >=1.0.0):
from slim_bindings.slimrpc import ...The API remains largely the same, but the implementation is now in Rust for better performance and cross-language consistency.
- Unified Bindings with UniFFI: Complete migration to UniFFI-based bindings for both Python and Go, enabling consistent cross-language support and improved developer experience
- Go Bindings: Full Go language bindings generated using UniFFI with examples, integration tests, and comprehensive documentation (#979, #1032, #1040)
- Python Bindings Migration: Migrated Python bindings to UniFFI for better consistency and maintainability (#1046, #1116)
- Unix Domain Sockets (UDS) Support: Added gRPC support using Unix Domain Sockets for local communication, improving performance and security (#1060)
- Unified Error Handling: Refactored error handling across core crates using strongly typed error enums with
thiserror, enabling cleaner error propagation and better diagnostics (#976) - Session Direction Control: Added message flow direction control to SLIM applications (#1121)
- Local SLIM Instance Management: slimctl now supports managing local SLIM node instances for development with
slim startsubcommand (#1015, #1139) - Enhanced Resilience: Improved handling of unexpected participant disconnections, application stops, and moderator failures (#1004, #1014, #1024)
-
Go Bindings (now in separate repository agntcy/slim-bindings-go):
-
Python Bindings:
-
Bindings Architecture:
- Support for multiple global services (#1106)
- Configuration file support (#1099)
- Renamed
BindingsAdaptertoAppandBindingsSessionContexttoSessionfor clarity (#1104) - Exposed completion handle to foreign languages (#1090)
- Exposed participant list to applications (#1089)
- Exposed identity configuration (#1092)
- Exposed global and local services (#1095)
- Complete configuration exposure for auth, clients, and servers (#1084)
- Removed tokio-specific APIs from foreign async calls (#1110)
-
slimctl Enhancements:
-
Build & Release:
-
Repository Organization:
- Error Handling Refactor: Unified typed error handling replaces string-based errors across all core crates (#976)
- Bindings API Changes:
- Unix Domain Sockets: New error variants added to
ConfigErrorfor UDS support (#1060)
- SAST Integration: Added Static Application Security Testing to CI/CD (#997)
- Docker Security: Removed libssl from Docker images to reduce attack surface (#1147)
- Improved Identity Handling: Enhanced identity error handling in bindings (#1042)
| Component | Latest Version | Release Date |
|---|---|---|
| slim | v1.0.0 | 2026-01-30 |
| slim-bindings | v1.0.0 | 2026-01-30 |
| control-plane | v1.0.0 | 2026-01-30 |
| slimctl | v1.0.0 | 2026-01-30 |
| helm-slim | v1.0.0 | 2026-01-30 |
| helm-slim-control-plane | v1.0.0 | 2026-01-30 |
- Container Images: Available on GitHub Container Registry
ghcr.io/agntcy/slim:v1.0.0
- Python Packages: Published to PyPI
slim-bindings==1.0.0
- Go Bindings: Available at github.com/agntcy/slim-bindings-go
- Native libraries for multiple platforms (Linux, macOS, Windows)
- Cross-platform support with target OS/arch/ABI flags
- CLI Tools:
slimctlv1.0.0 with local instance management
All components with the same major version (v1.x.x) are compatible with each other.
| Component | Version | Notes |
|---|---|---|
| slim | v1.0.0 | Data plane runtime |
| slim-bindings | v1.0.0 | Python 3.10+ and Go 1.21+ (with CGO) |
| control-plane | v1.0.0 | Control plane services |
| slimctl | v1.0.0 | CLI tool |
| helm charts | v1.0.0 | Kubernetes deployment |
- Major version compatibility: All v1.x.x components are compatible with each other
- slim-bindings v1.0.0 introduces UniFFI-based architecture supporting both Python and Go
- Go bindings require Go 1.21+ with CGO enabled (available at github.com/agntcy/slim-bindings-go)
- Python bindings support Python 3.10+ with lower libc requirements (glibc 2.28, musl 1.2)
- UDS support requires Unix-like operating systems for local communication
- Older versions of slim-bindings (< v1.0.0) are not compatible with v1.0.0
This guide helps you migrate your SLIM Python bindings code from version 0.7.x to version 1.x.
- Overview
- Major Changes
- Core API Changes
- Configuration Changes
- CLI and Argument Parsing
- Server Setup
- Step-by-Step Migration Examples
- Breaking Changes Summary
Version 1.x introduces a service-based architecture that significantly changes how you initialize and use SLIM. The new design:
- Separates service initialization from application creation
- Supports both global and local service instances (global is recommended for most use cases)
- Introduces structured configuration objects using Pydantic
- Changes the session creation and message retrieval APIs
- Provides both synchronous and asynchronous versions of functions (async versions use
_asyncsuffix) - Modernizes the authentication configuration approach
1. Service vs. Application Model
- v0.7.x: Used
slim_bindings.Slim()class directly - v1.x: Uses
slim_bindings.Service+slim_bindings.Apppattern- Most applications use the global service via
get_global_service() - Local services can be created if multiple data planes are needed in one process
- Most applications use the global service via
2. Connection Management
- v0.7.x: Connection via
slim.connect(config_dict) - v1.x: Connection via
service.connect_async(client_config)orservice.connect(client_config)returning a connection ID
3. Session API
- v0.7.x:
create_session()returns(Session, CompletionHandle) - v1.x:
create_session_async()orcreate_session()returnsSessionContextwith.sessionand.completionattributes
4. Message Retrieval
- v0.7.x:
session.get_message()returns(MessageContext, bytes) - v1.x:
session.get_message_async()orsession.get_message()returnsReceivedMessagewith.contextand.payloadattributes- Async version:
get_message_async()for use with asyncio - Blocking version:
get_message()for synchronous code
- Async version:
5. Authentication Configuration
- v0.7.x: Used variant enums like
IdentityProvider.SharedSecret(),IdentityProvider.StaticJwt() - v1.x: Uses nested config objects like
IdentityProviderConfig.JWT(),JwtKeyConfig, etc.
In v1.x, you have two options for creating a service:
Global Service (Recommended)
Most applications should use the global service instance, as there's typically no need to have more than one data plane running in the same process:
# Initialize once at application startup
slim_bindings.initialize_with_configs(
tracing_config=tracing_config,
runtime_config=runtime_config,
service_config=[service_config],
)
# Get the global service instance anywhere in your code
service = slim_bindings.get_global_service()Advantages:
- Simpler initialization
- Shared across the entire application
- Typical use case for most applications
Local Service (Advanced)
If you need multiple isolated data planes in the same process, you can create local service instances:
# Create a local service with just a name (uses default config)
local_service = slim_bindings.Service("my-service")
# Or create with specific configuration
service_config = slim_bindings.new_service_config()
# Customize service_config if needed...
# service_config.node_id = "my-node"
# service_config.group_name = "my-group"
local_service = slim_bindings.Service.new_with_config("my-service", service_config)
# Each local service operates independently
another_service = slim_bindings.Service("another-service")Use cases:
- Testing scenarios requiring isolation
- Multi-tenant applications with separate data planes
- Complex applications with distinct service configurations
Note: Unless you have a specific reason to use local services, stick with the global service pattern shown in all the examples.
Version 1.x provides both blocking and async versions of most methods to support different programming styles:
Naming Convention
- Async methods: Suffix
_async(e.g.,create_session_async(),publish_async()) - Blocking methods: No suffix (e.g.,
create_session(),publish())
Examples
# Async version (for use with asyncio)
async def send_message_async():
service = slim_bindings.get_global_service()
connection_id = await service.connect_async(client_config)
app = service.get_app(connection_id)
session_ctx = await app.create_session_async(config, destination)
await session_ctx.completion.wait_async()
await session_ctx.session.publish_async(b"Hello, World!")
# Sync/blocking version (for synchronous code)
def send_message_sync():
service = slim_bindings.get_global_service()
connection_id = service.connect(client_config)
app = service.get_app(connection_id)
session_ctx = app.create_session(config, destination)
session_ctx.completion.wait()
session_ctx.session.publish(b"Hello, World!")Combined Operations
Many operations also have _and_wait variants that combine the operation with waiting for completion:
create_session_and_wait_async()- Creates session and waits for establishmentdelete_session_and_wait_async()- Deletes session and waits for completionpublish_and_wait_async()- Publishes message and waits for deliveryinvite_and_wait_async()- Invites participant and waits for completionremove_and_wait_async()- Removes participant and waits for completion
Example Comparison
# Two-step approach (more control)
session_ctx = await app.create_session_async(config, destination)
await session_ctx.completion.wait_async()
session = session_ctx.session
# Combined approach (simpler)
session = await app.create_session_and_wait_async(config, destination)When to Use Each
- Async methods (
_async): When you're usingasyncioin Python - Blocking methods: For synchronous code or when called from non-async contexts
- Combined methods (
_and_wait_async): When you don't need the completion handle separately
Note: Python examples typically use the async versions since SLIM operations are inherently asynchronous.
v0.7.x - Direct Property Access
# Properties returned values directly
session_id = session.id
source = session.src
destination = session.dst
instance_id = local_app.id_strv1.x - Methods Return Results
In v1.x, most property accessors are now methods that can raise SlimError exceptions:
try:
# These can raise SlimError if session is closed
session_id = session.session_id()
source = session.source()
destination = session.destination()
except Exception as e:
print(f"Error accessing session property: {e}")
# Handle closed sessionBest Practices
-
Check session validity before accessing properties:
# Store values early in session lifecycle session_id = session.session_id() source = session.source() destination = session.destination() # Use stored values later instead of calling methods again
-
Handle errors gracefully:
try: await session.publish_async(data, None, None) except Exception as e: if "session closed" in str(e).lower(): print("Session was closed") else: raise
Service Architecture
v0.7.x:
# Tracing initialization
await slim_bindings.init_tracing({
"log_level": "info",
"opentelemetry": {
"enabled": enable_opentelemetry,
"grpc": {"endpoint": "http://localhost:4317"}
}
})
# Create app directly
local_app = slim_bindings.Slim(local_name, provider, verifier)v1.x:
# Initialize with config objects
tracing_config = slim_bindings.new_tracing_config()
runtime_config = slim_bindings.new_runtime_config()
service_config = slim_bindings.new_service_config()
tracing_config.log_level = "info"
slim_bindings.initialize_with_configs(
tracing_config=tracing_config,
runtime_config=runtime_config,
service_config=[service_config],
)
# Get global service (recommended)
service = slim_bindings.get_global_service()
# Alternative: Create a local service instance
# service = slim_bindings.Service("my-service")
# Create app from service
local_app = service.create_app(local_name, provider_config, verifier_config)Application Creation
v0.7.x - Shared Secret:
provider = slim_bindings.IdentityProvider.SharedSecret(
identity=identity,
shared_secret=secret
)
verifier = slim_bindings.IdentityVerifier.SharedSecret(
identity=identity,
shared_secret=secret
)
local_app = slim_bindings.Slim(local_name, provider, verifier)v1.x - Shared Secret (Option 1 - Using App constructor):
provider_config = slim_bindings.IdentityProviderConfig.SharedSecret(
id=str(local_name),
data=secret
)
verifier_config = slim_bindings.IdentityVerifierConfig.SharedSecret(
id=str(local_name),
data=secret
)
local_app = slim_bindings.App.new(local_name, provider_config, verifier_config)v1.x - Shared Secret (Option 2 - Simplified):
service = slim_bindings.get_global_service()
# Simplified API for shared secret
local_app = service.create_app_with_secret(local_name, secret)JWT Authentication
v0.7.x:
provider = slim_bindings.IdentityProvider.StaticJwt(path=jwt_path)
pykey = slim_bindings.Key(
algorithm=slim_bindings.Algorithm.RS256,
format=slim_bindings.KeyFormat.Jwks,
key=slim_bindings.KeyData.Content(content=jwks_json),
)
verifier = slim_bindings.IdentityVerifier.Jwt(
public_key=pykey,
issuer=iss,
audience=aud,
subject=sub,
)v1.x:
import datetime
encoding_key_config = slim_bindings.JwtKeyConfig(
algorithm=slim_bindings.JwtAlgorithm.RS256,
format=slim_bindings.JwtKeyFormat.PEM,
key=slim_bindings.JwtKeyData.DATA(value=jwt_content),
)
provider_config = slim_bindings.IdentityProviderConfig.JWT(
config=slim_bindings.ClientJwtAuth(
key=slim_bindings.JwtKeyType.ENCODING(key=encoding_key_config),
audience=["default-audience"],
issuer="default-issuer",
subject=local_name,
duration=datetime.timedelta(seconds=3600),
)
)
decoding_key_config = slim_bindings.JwtKeyConfig(
algorithm=slim_bindings.JwtAlgorithm.RS256,
format=slim_bindings.JwtKeyFormat.JWKS,
key=slim_bindings.JwtKeyData.DATA(value=jwks_json),
)
verifier_config = slim_bindings.IdentityVerifierConfig.JWT(
config=slim_bindings.JwtAuth(
key=slim_bindings.JwtKeyType.DECODING(key=decoding_key_config),
audience=["default-audience"],
issuer="default-issuer",
subject=None,
duration=datetime.timedelta(seconds=3600),
)
)Connection Management
v0.7.x:
conn_id = await local_app.connect({
"endpoint": "http://127.0.0.1:46357",
"tls": {"insecure": True}
})
# Note: Subscription to local name was done implicitlyv1.x (Option 1 - Simple):
service = slim_bindings.get_global_service()
client_config = slim_bindings.new_insecure_client_config("http://127.0.0.1:46357")
conn_id = await service.connect_async(client_config)
# Subscribe to local name - now MUST be done explicitly
await local_app.subscribe_async(local_name, conn_id)Session Creation
v0.7.x - Point-to-Point:
import datetime
config = slim_bindings.SessionConfiguration.PointToPoint(
max_retries=5,
timeout=datetime.timedelta(seconds=5),
mls_enabled=enable_mls,
)
session, handle = await local_app.create_session(remote_name, config)
await handlev1.x - Point-to-Point:
import datetime
session_config = slim_bindings.SessionConfig(
session_type=slim_bindings.SessionType.POINT_TO_POINT,
enable_mls=enable_mls,
max_retries=5,
interval=datetime.timedelta(seconds=5),
metadata={},
)
session_context = await local_app.create_session_async(session_config, remote_name)
await session_context.completion.wait_async()
session = session_context.session
# Or use the combined version
session = await local_app.create_session_and_wait_async(session_config, remote_name)Message Handling
v0.7.x - Publishing:
# Simple publish
await session.publish(message.encode())
# Publish with reply
await session.publish_to(msg_ctx, reply.encode())v1.x - Publishing:
# Simple publish - now requires metadata parameters
await session.publish_async(message.encode(), None, None)
# Publish with reply - explicit metadata
await session.publish_to_async(msg_ctx, reply.encode(), None, msg_ctx.metadata)v0.7.x - Receiving:
# Returns tuple
msg_ctx, payload = await session.get_message()
# Access fields
sender = msg_ctx.source_name
data = payload.decode()v1.x - Receiving:
import datetime
# Returns ReceivedMessage object with timeout
received_msg = await session.get_message_async(timeout=datetime.timedelta(seconds=30))
# Access fields via attributes
ctx = received_msg.context
payload = received_msg.payload
sender = ctx.source_name if hasattr(ctx, "source_name") else session.source()
data = payload.decode()Getting Participant List (New in v1.x)
v1.x introduces the ability to retrieve the list of participants in a group session:
# Get list of participants in a group session
participants = session.participants_list()
# participants is a list of Name objects
for participant in participants:
print(f"Participant: {participant}")
# You can also convert to string
participant_names = [str(p) for p in participants]This is particularly useful for:
- Monitoring who is currently in a group session
- Displaying active participants in the UI
- Implementing logic based on current participant count
Traffic Direction Control (New in v1.x)
v1.x allows you to selectively enable/disable send and receive capabilities when creating an App using Direction:
Direction.SEND- Send-only (can publish messages but not receive)Direction.RECV- Receive-only (can receive messages but not publish)Direction.BIDIRECTIONAL- Both send and receive (default behavior)Direction.NONE- Neither send nor receive data messages
Use App.new_with_direction() or App.new_with_direction_async() to specify direction.
Examples
# Async version - Create a send-only app
app = await App.new_with_direction_async(
name,
identity_provider_config,
identity_verifier_config,
Direction.SEND
)
# Blocking version - Create a receive-only app
app = App.new_with_direction(
name,
identity_provider_config,
identity_verifier_config,
Direction.RECV
)Required Changes:
-
Update App creation
- v0.7.x:
Slim(name, provider, verifier) - v1.x: Three options available:
App.new(name, provider_config, verifier_config)- Direct constructorservice.create_app(name, provider_config, verifier_config)- Via service instanceApp.new_with_secret(name, secret)- Convenience for shared secrets
- v0.7.x:
-
Update all async method names
- Add
_asyncsuffix to all async methods create_sessionβcreate_session_asyncget_messageβget_message_async- Consider using
_and_wait_async()variants
- Add
-
Update session creation return values
- Access via
.sessionand.completionattributes - Wait for completion with
.wait_async()
- Access via
-
Update message retrieval
- Access via
.contextand.payloadattributes - Add timeout parameter
- Access via
-
Update authentication configuration
- Use
IdentityProviderConfigandIdentityVerifierConfig - Build nested config objects
- Use
-
Update session properties and add error handling
- Call methods instead of accessing attributes:
session.session_id(),session.source(),session.destination() - These methods can raise
SlimError- wrap in try/except - Store property values early in session lifecycle
- Call methods instead of accessing attributes:
-
Update publish calls
- Add
None, Nonefor topic and metadata parameters if not used
- Add
-
Add connection ID to routing
set_route_async(name, conn_id)
-
Update imports and initialization
- Replace
init_tracing()with config-based initialization - Initialize global service
- Get service instance
- Replace
-
Update authentication
- Migrate
IdentityProvidertoIdentityProviderConfig - Migrate
IdentityVerifiertoIdentityVerifierConfig - Use
create_app_with_secret()for shared secrets
- Migrate
-
Update app creation
- Use
service.create_app()instead ofSlim() - Add connection via
service.connect_async() - Subscribe to local name (now required - was implicit in v0.7.x)
- Use
-
Update session handling
- Add
_asyncsuffix to methods - Update session creation to use
SessionContext - Update message retrieval to use
ReceivedMessage - Add timeouts to
get_message_async()
- Add
-
Update session operations
- Change property access to method calls
- Add
None, Noneto publish calls - Update handle waiting with
wait_async()
-
Update routing
- Pass connection ID to
set_route_async()
- Pass connection ID to
-
Add error handling
- Wrap session property access in try/except
- Handle "session closed" errors gracefully
- Store session properties early in lifecycle
-
Test migration
- Test connection and authentication
- Test session creation
- Test message send/receive
- Test error conditions
- Test cleanup and shutdown
| v0.7.x | v1.x | Notes |
|---|---|---|
slim_bindings.Slim(name, provider, verifier) |
slim_bindings.App.new(name, provider_config, verifier_config) |
Both constructors available |
await slim.connect(config_dict) |
await service.connect_async(client_config) |
Returns connection ID |
IdentityProvider.SharedSecret(...) |
IdentityProviderConfig.SharedSecret(...) |
Nested config objects |
session, handle = await app.create_session(...) |
session_ctx = await app.create_session_async(...)session = session_ctx.session |
Returns SessionContext |
await handle |
await handle.wait_async() |
Explicit wait method |
await session.publish(data) |
await session.publish_async(data, None, None) |
Additional parameters required |
ctx, payload = await session.get_message() |
msg = await session.get_message_async(timeout)ctx = msg.contextpayload = msg.payload |
Returns ReceivedMessage object |
session.id |
session.session_id() |
Method call |
session.src |
session.source() |
Method call |
session.dst |
session.destination() |
Method call |
local_app.id_str |
str(local_app.id()) |
Method call |
await local_app.set_route(name) |
await local_app.set_route_async(name, conn_id) |
Requires connection ID |
SessionConfiguration.PointToPoint(...) |
SessionConfig(session_type=SessionType.POINT_TO_POINT, ...) |
Unified config struct |
- Go Bindings: github.com/agntcy/slim-bindings-go
- Semantic Versioning Specification: docs/semantic-versioning.md
- UniFFI Documentation: https://mozilla.github.io/uniffi-rs/
- Control Plane Group Management: Complete implementation of group management functionality for organizing and controlling SLIM node groups
- Enhanced Authentication: In the data-plane, replaced bearer authentication with static JWT tokens. In the control-plane, added basic authentication support for slimctl and k8s ingress in helm chart
- Session API Refactoring: Major improvements to session handling including metadata support, enhanced point-to-point sessions with sender/receiver buffers, and removal of request-reply API
- Python Bindings Improvements: Unique SLIM data-plane instance per process by default, improved publish function, better documentation, and session type exposure
- Node Management: Enhanced node update handling and improved group ID integration in node identification
- Enhanced Python bindings documentation with comprehensive session examples
- Updated group example documentation and usage templates
- Improved README files for Python bindings examples
- Added deployment usage templates and Taskfile automation for various deployment patterns (#753)
- Session API refactoring with new receive() API pattern
- Renaming sessions to PointToPoint and Group
- Removal of request-reply API from Python bindings
- Authentication method changes (bearer auth β static JWT)
- Group configuration changes (removed moderator parameter)
- Python bindings: removed destination_name property in publish API
- Upgraded to Rust toolchain 1.90.0
- Enhanced release process with signoff commits and pre-release support
- Improved CI/CD with release-please integration
- Better dependency management for Python packages
- Improved certificate handling across trust domains
- Enhanced JWKS file management for multiple trust domains
- Basic authentication support for ingress and slimctl
| Component | Latest Version | Release Date |
|---|---|---|
| slim | v0.6.0 | 2025-10-09 |
| slim-bindings | v0.6.0 | 2025-10-09 |
| control-plane | v0.6.0 | 2025-10-09 |
| slimctl | v0.6.0 | 2025-10-09 |
| slim-bindings-examples | v0.6.0 | 2025-10-09 |
| slim-testutils | v0.6.0 | 2025-10-09 |
| agntcy-slim-mcp-proxy | v0.2.0 | 2025-10-09 |
- Container Images: Available on GitHub Container Registry
ghcr.io/agntcy/slim:v0.6.0ghcr.io/agntcy/slim-control-plane:v0.6.0
- Python Packages: Published to PyPI
slim-bindings==0.6.0
- Helm Charts: Available on Helm repository
helm-slim(updated for v0.6.0 compatibility)helm-slim-control-plane(updated for control-plane v0.6.0)
- CLI Tools:
slimctlv0.6.0 with enhanced authentication support
The following matrix shows compatibility between different component versions:
| Core Component | Version | Compatible With |
|---|---|---|
| slim | v0.6.0 | slim-bindings v0.6.0, control-plane v0.6.0 |
| slim-bindings | v0.6.0 | slim v0.6.0 |
| control-plane | v0.6.0 | slim v0.6.0, slimctl v0.6.0 |
| slimctl | v0.6.0 | control-plane v0.6.0, slim v0.6.0 |
| Helm Chart | Version | Deploys Component | Minimum Requirements |
|---|---|---|---|
| helm-slim | v0.6.0 | slim v0.6.0 | Kubernetes 1.20+ |
| helm-slim-control-plane | v0.6.0 | control-plane v0.6.0 | Kubernetes 1.20+ |
| Tool | Version | Works With | Purpose |
|---|---|---|---|
| slim-testutils | v0.6.0 | All v0.6.0 components | Testing utilities |
| slim-bindings-examples | v0.6.0 | slim-bindings v0.6.0 | Python examples |
- slim v0.6.0 introduces breaking changes in session API that require slim-bindings v0.6.0
- Group management requires control-plane v0.6.0 and slimctl v0.6.0
- Enhanced authentication is available across all v0.6.0 components
- Session metadata and improved session handling require slim v0.6.0 and slim-bindings v0.6.0
- Older versions of slim-bindings (< v0.6.0) are not compatible with slim v0.6.0 due to session API changes
- Session API refactoring with new receive() pattern (#731)
- Rename sessions to PointToPoint and Group (#795)
- Remove request-reply API from Python bindings (#677)
- Remove bearer auth in favour of static JWT (#774)
- Remove moderator parameter from Group configuration (#739)
- Remove destination_name property from Python bindings (#751)
- Implement control plane group management (#554)
- Handle updates from SLIM nodes (#708)
- Create unique SLIM data-plane instance per process by default (#819)
- Introduce session metadata (#744)
- Expose session type, src and dst names in Python sessions (#737)
- Improve point to point session with sender/receiver buffer (#735)
- Improve publish function in Python bindings (#749)
- Add basic auth to slimctl (#763)
- Add basic auth to ingress (#722)
- Add string name on pub messages (#693)
- Allow each participant to publish in Python examples (#778)
- Improve Python bindings documentation (#748)
- Add documentation for sessions and examples (#750)
- Fix subscription-table wrong iterator when matching over multiple output connections (#815)
- Avoid panic sending errors to the local application (#814)
- Add group id to node id (#746)
- Create new JWKS file containing all keys from all trust domains (#776)
- Load all certificates for dataplane from ca (#772)
- Correctly close group example (#786)
- Fix readmes for python bindings examples (#764)
- Upgrade to rust toolchain 1.90.0 (#730)
- Signoff commits made by release please (#723)
- Fix release please signoff (#727)
- Fix python examples path in CI (#719)
- Publish Python bindings as pre-release (#787, #793)
- Enhanced certificate management across trust domains (#776)
- Static JWT authentication implementation (#774)
- Basic authentication for slimctl and ingress (#763, #722)
- Coordinated multi-component release (slim 0.6.0 & dependent packages)
- Remove -rc suffix from python bindings (#821)
- Update bindings dependencies across packages (#713)
- Upgrade examples to use slim 0.5.0+ (#717)
The API has undergone a fundamental architectural shift from app-centric messaging to session-centric messaging:
- Old paradigm: Messages sent through the
Slimapplication instance with session IDs - New paradigm: Messages sent directly through
Sessionobjects
# pyproject.toml or requirements.txt
- slim-bindings>=0.5.0
+ slim-bindings>=0.6.0# OLD: Method call
app = await slim_bindings.Slim.new(name, provider, verifier)
instance_id = app.get_id()
# NEW: Property access
app = await slim_bindings.Slim.new(name, provider, verifier)
instance_id_str = app.id_str
instance_id = app.id# OLD: Required context manager
async with app:
session = await app.create_session(config)
await app.publish(session, message, destination)
# NEW: No context manager needed
session = await app.create_session(config)
await session.publish(message)Migration: Remove async with app: context managers, replace app.get_id() with app.id_str or app.id.
The session configuration system has been completely redesigned around communication patterns.
# OLD: Fire-and-forget with sticky=True
session = await app.create_session(
slim_bindings.PySessionConfiguration.FireAndForget(
max_retries=5,
timeout=datetime.timedelta(seconds=5),
sticky=True, # Sticky = same peer
mls_enabled=enable_mls,
)
)
# NEW: Explicit PointToPoint
session = await app.create_session(
slim_bindings.PySessionConfiguration.PointToPoint(
peer_name=remote_name,
# uncomment to enable reliable delivery and MLS
# max_retries=5,
# timeout=datetime.timedelta(seconds=5),
# mls_enabled=enable_mls,
)
)# OLD: Bidirectional streaming with topic
session = await app.create_session(
slim_bindings.PySessionConfiguration.Streaming(
slim_bindings.PySessionDirection.BIDIRECTIONAL,
topic=channel_name,
moderator=True,
max_retries=5,
timeout=datetime.timedelta(seconds=5),
mls_enabled=enable_mls,
)
)
# NEW: Group with channel
session = await app.create_session(
slim_bindings.PySessionConfiguration.Group(
channel_name=channel_name,
# uncomment to enable reliable delivery and MLS
# max_retries=5,
# timeout=datetime.timedelta(seconds=5),
# mls_enabled=enable_mls,
)
)Migration Mapping:
FireAndForget(sticky=True)βPointToPoint(peer_name=target)Streaming(BIDIRECTIONAL, topic=X)βGroup(channel_name=target_group)
The message sending API has moved from app-level methods to session-level methods.
# OLD: App-level publishing with session reference
await app.publish(session, message.encode(), destination_name)
# NEW: Session-level publishing
# For PointToPoint/Group (destination implicit)
await session.publish(message.encode())# OLD: App-level reply
await app.publish_to(session_info, reply.encode())
# NEW: Session-level reply with message context
await session.publish_to(msg_ctx, reply.encode())Message receiving has changed from app-level session management to session-level message handling.
# OLD: App-level receive for new sessions
session_info, initial_message = await app.receive()
session_id = session_info.id
# NEW: Explicit session listening
session = await app.listen_for_session()
# Session also contains additional properties
session_id = session.id
session_metadata = session.metadata
session_type = session.session_type
session_config = session.session_config
session_src = session.src
session_dst = session.dst# OLD: App-level receive with session ID
session_info, message = await app.receive(session=session_id)
# NEW: Session-level message receiving
msg_ctx, message = await session.get_message()# OLD: Session info contained properties regarding the last message received
source = session_info.destination_name:
dst = session_info.source_name
# NEW: Message context contains additional received message properties
source_name = msg_ctx.source_name
dst_name = msg_ctx.destination_name
payload_type = msg_ctx.payload_type
message_metadata = msg_ctx.metadata
input_connection = msg_ctx.input_connection# OLD: Sessions referenced by ID, managed through app
async def handle_session(app, session_id):
while True:
session_info, msg = await app.receive(session=session_id)
await app.publish_to(session_info, response.encode())
# NEW: Sessions are first-class objects
async def handle_session(session):
while True:
msg_ctx, msg = await session.get_message()
await session.publish_to(msg_ctx, response.encode())# OLD: Track sessions by ID
active_sessions = {}
session_info, _ = await app.receive()
session_id = session_info.id
active_sessions[session_id] = session_info
# NEW: Work directly with session objects
active_sessions = []
session = await app.listen_for_session()
active_sessions.append(session)# OLD: App-level invitation management
await app.invite(session_info, participant_name)
# NEW: Session-level invitation management
# Add a participant
await session.invite(participant_name)
# Remove a participant
await session.remove(participant_name)# OLD: Errors handled at app level with session IDs
try:
session_info, msg = await app.receive(session=session_id)
except Exception as e:
# Handle session-specific errors
# NEW: Errors handled at session level
try:
msg_ctx, msg = await session.get_message()
except Exception as e:
# Handle session-specific errors- Update
slim-bindingsto>=0.6.0 - Replace
app.get_id()withapp.id_str - Remove
async with app:context managers
- Map
FireAndForget(sticky=True)βPointToPoint(peer_name=target) - Map
Streaming(BIDIRECTIONAL)βgroup(channel_name=topic) - Update session configuration parameters
- Replace
app.publish()withsession.publish() - Replace
app.publish_to()withsession.publish_to()
- Replace
app.receive()withapp.listen_for_session()for new sessions - Replace
app.receive(session=id)withsession.get_message() - Update message context handling (
msg_ctx.source_namevssession_info.destination_name)
- Update background task signatures to accept session objects instead of IDs
- Replace
app.invite()withsession.invite() - Update session tracking to use objects instead of IDs
- Test all communication patterns (PointToPoint, Group)
- Verify MLS functionality if used
- Test error handling and edge cases
- Validate performance characteristics
- SLIMRPC + Native A2A integration (Python) with new
slimrpcandslima2apackages - Automatic generation of SLIMRPC client stubs and server servicers for python
via the
protoc-slimrpc-pluginprotoc plugin - HTTP / HTTPS proxy support for gRPC clients
- Node ID uniqueness & enhanced deployment options (StatefulSet / DaemonSet)
- Control plane test coverage & Ack original message ID validation
- SPIRE & TLS configuration support in Controller Southbound API & Helm charts
- Documentation updates across components:
- Node ID uniqueness requirement (Helm & service config)
- Multiple Rust public API changes in dataplane release (v0.5.0 bundle)
- Service publish API parameter expansions
- Clang-19 migration for data-plane builds of C components
- Conventional commit PR title enforcement
- Centralized Python integrations layout (
data-plane/python/...) - Coverage reporting for Rust & Control Plane
- Default system CA loading in TLS config
- Dependency upgrades (tracing-subscriber, slab)
For detailed component histories see: slim, slim data-plane crates, python bindings, python integrations slimrpc, slima2a, slim-mcp, control-plane, slimctl, helm-slim, helm-slim-control-plane.
| Component | Latest Version | Release Date |
|---|---|---|
| slim | v0.5.0 | 2025-09-19 |
| slim-bindings | v0.5.0 | 2025-09-19 |
| control-plane | v0.1.1 | 2025-09-19 |
| slimctl | v0.2.2 | 2025-09-19 |
| helm-slim | v0.2.0 | 2025-09-19 |
| helm-slim-control-plane | v0.1.4 | 2025-09-19 |
| slim-bindings-examples | v0.1.1 | 2025-09-19 |
| slim-testutils | v0.2.2 | 2025-09-19 |
| slimrpc | v0.1.0 | 2025-09-19 |
| slima2a | v0.1.0 | 2025-09-19 |
| slim-mcp | v0.1.7 | 2025-09-19 |
| slim-mcp-proxy | v0.1.7 | 2025-09-19 |
| Core Component | Version | Compatible With |
|---|---|---|
| slim | v0.5.0 | control-plane v0.1.1 |
| slim-bindings | v0.5.0 | slim v0.5.0 |
| control-plane | v0.1.1 | slim v0.5.0, slimctl v0.2.2, helm-slim-control-plane v0.1.4 |
| slimctl | v0.2.2 | control-plane v0.1.1, slim v0.5.0 |
| slimrpc | v0.1.0 | slim-bindings v0.5.0 |
| slima2a | v0.1.0 | slimrpc v0.1.0, slim-bindings v0.5.0 |
| Helm Chart | Version | Deploys Component | Minimum Requirements |
|---|---|---|---|
| helm-slim | v0.2.0 | slim v0.5.0 | Kubernetes 1.20+ |
| helm-slim-control-plane | v0.1.4 | control-plane v0.1.1 | Kubernetes 1.20+ |
| Tool | Version | Works With | Purpose |
|---|---|---|---|
| slim-testutils | v0.2.2 | slim >= v0.5.0 | Testing utilities |
| slim-bindings-examples | v0.1.1 | slim >= v0.4.0 | Python examples |
- Node ID uniqueness introduces deployment config updates in Helm and service config
- New proxy fields & metadata maps require regenerating client/server config initializations
- Service publish API parameter changes may require adjusting function calls
- Node ID uniqueness & service/Helm config schema updates (#630)
- Data-plane public API adjustments across auth/config/datapath/controller/service crates (bundle release) (#508)
- Subscription notifications propagated to controller & services (#611)
- Metadata map for gRPC clients/servers (#684)
- Replace pubsub with dataplane in node-config (#591)
- Ack original messageID validation (#583)
- Control-plane test coverage + combined coverage workflow (#664)
- MLS identity provider backend agnostic (#552)
- Fire-and-forget session testing utilities (#540)
- Channel & participant CLI commands (slimctl) (#534)
- Channel info included in subscription messages (#611)
- SLIMRPC + Native A2A Python packages (
slimrpc,slima2a) initial release (#660 #685 #690 #613) - HTTP & HTTPS proxy support for gRPC client (#610 #614)
- TLS & SPIRE config support in Controller SB API / Helm (#651)
- Node ID based StatefulSet / DaemonSet deployment options (#630)
- First release of Slim RPC protoc compiler plugin (
protoc-slimrpc-plugin) enabling Slim RPC code generation (tagprotoc-slimrpc-plugin-v0.1.0)
- Duration string normalization (
duration-strβduration-string) (#683) - Fire-and-forget session reliability (#538)
- WaitGroup for gRPC server startup ordering (#675)
- Host & port fields in NodeEntry (#560)
- System CA loading enabled by default in TLS config (#605)
- Ingress port reference correction (Helm) (#597)
- Crypto provider initialization for Reqwest (Python bindings) (#706)
- Mypy hygiene across python packages (slima2a, slimrpc, slim-mcp) (#671)
- Slimctl version crash resolved (#585)
- Deadline handling in SLIMRPC (#658)
- Template comment usage to avoid Helm rendering issues (#595)
- Move to clang-19 for data-plane C/C++ builds (#662)
- PR title conventional commit enforcement (#686)
- Python integrations folder restructure & Taskfile division (#628)
- Coverage reporting (Rust + Control Plane) (#652 #664)
- Buf CI config update (#532)
- Default system CA trust configuration (#605)
- Dependency upgrades (tracing-subscriber 0.3.20, slab) (#608 #563)
- Coordinated multi-component release (slim 0.5.0 & dependent charts/bindings)
- Image upgrades in Helm charts (slim 0.5.0, control-plane 0.1.1) (#714 #716)
- Python wheels published for new packages (slimrpc, slima2a) (#638 #639 #637)
- MLS (Message Layer Security) implementation with key rotation support
- Control Plane Service connection, route and group management APIs
- Enhanced Python Bindings with improved examples and packaging
- Session Layer with authentication and identity support
- Helm Charts for easier deployment
- Multi-platform builds for slimctl (darwin, linux) x (amd64, arm64)
- Improved CI/CD with better Docker image building
- Enhanced testing utilities and integration tests
- Better configuration handling and tracing support
- JWT authentication with JWK/JWKS support
- Identity verification in message headers
- Secure group management with concurrent modification handling
- Enhanced MLS integration with authentication layer
For detailed information about specific releases, see the individual component CHANGELOG.md files in their respective directories.
| Component | Latest Version | Release Date |
|---|---|---|
| slim | v0.4.0 | 2025-07-31 |
| slim-bindings | v0.4.0 | 2025-07-31 |
| control-plane | v0.1.0 | 2025-07-31 |
| slimctl | v0.2.1 | 2025-08-01 |
| helm-slim | v0.1.9 | 2025-07-31 |
| helm-slim-control-plane | v0.1.3 | 2025-08-01 |
| slim-bindings-examples | v0.1.0 | 2025-08-01 |
| slim-testutils | v0.2.1 | 2025-08-01 |
The following matrix shows compatibility between different component versions:
| Core Component | Version | Compatible With |
|---|---|---|
| slim | v0.4.0 | slim-bindings v0.4.0, control-plane v0.1.0 |
| slim-bindings | v0.4.0 | slim v0.4.0 |
| control-plane | v0.1.0 | slim v0.4.0, slimctl v0.2.1, helm-slim-control-plane v0.1.3 |
| slimctl | v0.2.1 | control-plane v0.1.0, slim v0.4.0 |
| Helm Chart | Version | Deploys Component | Minimum Requirements |
|---|---|---|---|
| helm-slim | v0.1.9 | slim v0.4.0 | Kubernetes 1.20+ |
| helm-slim-control-plane | v0.1.3 | control-plane v0.1.0 | Kubernetes 1.20+ |
| Tool | Version | Works With | Purpose |
|---|---|---|---|
| slim-testutils | v0.2.1 | All components | Testing utilities |
| slim-bindings-examples | v0.1.0 | slim-bindings v0.4.0 | Python examples |
- slim v0.4.0 introduces breaking changes that require slim-bindings v0.4.0 or later
- MLS integration requires slim v0.4.0 and slim-bindings v0.4.0
- Control plane features require control-plane v0.1.0 + slimctl v0.2.1
- Authentication support is available across slim v0.4.0, slim-bindings v0.4.0, and control-plane v0.1.0
- Older versions of slim-bindings (< v0.4.0) are not compatible with slim v0.4.0 due to breaking changes
Core Slim Data Plane
- remove Agent and AgentType and adopt Name as application identifier (#477)
- implement MLS key rotation (#412)
- improve handling of commit broadcast (#433)
- implement key rotation proposal message exchange (#434)
- auth: support JWK as decoding keys (#461)
- integrate MLS with auth (#385)
- add mls message types in slim messages (#386)
- push and verify identities in message headers (#384)
- channel creation in session layer (#374)
- prevent message publication before mls setup (#458)
- remove all state on session close (#449)
- channel_endpoint: extend mls for all sessions (#411)
- remove request-reply session type (#416)
- auth: make simple identity usable for groups (#387)
Python Bindings
- remove request-reply session type (#416)
- add auth support in sessions (#382)
- get source and destination name from python (#485)
- push and verify identities in message headers (#384)
- add identity and mls options to python bindings (#436)
- python-bindings: update examples and make them packageable (#468)
Control Plane Service
- add api endpoints for group management (#450)
- control plane service & slimctl cp commands (#388)
- group svc backend with inmem db (#456)
- process concurrent modification to the group (#451)
- control plane config is not loaded (#452)
Slim Control CLI Tool
- add client connections to control plane (#429)
- add node register call to proto (#406)
- control plane service & slimctl cp commands (#388)
- control-plane: handle all configuration parameters when creating a new connection (#360)
Main Helm Chart
- slim-helm: upgrade helm to slim image 0.4.0 (#495)
- add slim.overrideConfig to helm values (#490)
Helm Chart for Slim Control Plane
- slim-control-plane: upgrade chart to latest control-plane image (#503)
- control-plane: run go generate when running linter (#505)
Python Bindings Examples Package
- data-plane/service: first draft of session layer (#106)
- get source and destination name from python (#485)
- python-bindings: update examples and make them packageable (#468)
- improve configuration handling for tracing (#186)
- session: add default config for sessions created upon message reception (#181)
Testing Utilities
- testutils: use common dockerfile to build testutils (#499)
Message Layer Security Implementation
- add identity and mls options to python bindings (#436)
- integrate MLS with auth (#385)
- add mls message types in slim messages (#386)
- push and verify identities in message headers (#384)
- add the ability to drop messages from the interceptor (#371)
- implement MLS key rotation (#412)
- improve handling of commit broadcast (#433)
- implement key rotation proposal message exchange (#434)
β οΈ DEPRECATION NOTICE: SLIM v0.3.6 is now deprecated and will no longer receive updates or security patches. Users are strongly encouraged to migrate to v0.4.0 or later to benefit from enhanced security features, bug fixes, and ongoing support.
This section provides detailed migration instructions for upgrading from SLIM v0.3.6 to v0.4.0, particularly focusing on the Python bindings changes.
The following breaking changes require code modifications when upgrading:
- SLIM instance creation method has changed
PyAgentTypeclass has been replaced with thePyNameclass- Session creation is no longer mandatory for non-moderator applications in groups
- Channel invitation process is now mandatory for establishing secure communication
providerandverifierparameters are now required when creating a SLIM instance
v0.3.6 (Old):
async def run_client(local_id, remote_id, address, enable_opentelemetry: bool):
# Split the local IDs into their respective components
local_organization, local_namespace, local_agent = split_id(local_id)
# Create SLIM instance by passing the components of the local name
participant = await slim_bindings.Slim.new(
local_organization, local_namespace, local_agent
)v0.4.0 (New):
# Create SLIM instance with PyName object and required authentication
slim_app = await Slim.new(local_name, provider, verifier)The PyAgentType class has been replaced with the more generic PyName class,
reflecting that any application (not just agents) can utilize SLIM.
Two new required parameters must be provided:
provider: Establishes the application's identity within the SLIM ecosystemverifier: Proves the application's identity within the SLIM ecosystem
Two primary authentication methods are supported:
Shared Secret Method:
# Uses a pre-shared secret for authentication
# Note: Not recommended for production environments
provider: PyIdentityProvider = PyIdentityProvider.SharedSecret(
identity=identity, shared_secret=secret
)
verifier: PyIdentityVerifier = PyIdentityVerifier.SharedSecret(
identity=identity, shared_secret=secret
)JWT Token Method (Recommended):
# Uses JSON Web Token (JWT) with SPIRE
# SPIRE (SPIFFE Runtime Environment) provides secure, scalable identity management
provider = slim_bindings.PyIdentityProvider.StaticJwt(
path=jwt_path,
)
pykey = slim_bindings.PyKey(
algorithm=slim_bindings.PyAlgorithm.RS256,
format=slim_bindings.PyKeyFormat.Jwks,
key=slim_bindings.PyKeyData.Content(content=spire_jwks.decode("utf-8")),
)
verifier = slim_bindings.PyIdentityVerifier.Jwt(
public_key=pykey,
issuer=iss,
audience=aud,
subject=sub,
)v0.3.6 (Manual Setup Required):
# Connect to slim server
_ = await participant.connect({"endpoint": address, "tls": {"insecure": True}})
# set route for the chat
await participant.set_route(remote_organization, remote_namespace, broadcast_topic)
# Subscribe to the producer topic
await participant.subscribe(remote_organization, remote_namespace, broadcast_topic)
# create pubsub session (mandatory for all applications)
session_info = await participant.create_session(
slim_bindings.PySessionConfiguration.Streaming(
slim_bindings.PySessionDirection.BIDIRECTIONAL,
topic=slim_bindings.PyAgentType(
remote_organization, remote_namespace, broadcast_topic
),
max_retries=5,
timeout=datetime.timedelta(seconds=5),
)
)v0.4.0 (Automatic Management):
# Connect API remains unchanged
await slim_app.connect({"endpoint": address, "tls": {"insecure": True}})
# Routes and subscriptions are automatically managed by SLIM
# Session creation only required for moderator applicationsv0.4.0 introduces a mandatory channel invitation process that enhances security and enables proper MLS (Message Layer Security) setup:
Moderator Session Creation:
# Only moderators need to explicitly create sessions
session_info = await slim_app.create_session(
SessionConfiguration.Streaming(
SessionDirection.BIDIRECTIONAL,
topic=PyName(organization, namespace, topic_name),
moderator=True, # New flag
mls_enabled=True, # New flag for encryption
max_retries=5,
timeout=datetime.timedelta(seconds=5),
)
)Invitation Process:
# Moderator invites participants to join the channel
await slim_app.set_route(participant_name)
await slim_app.invite(session_info, participant_name)v0.3.6:
async def background_task():
msg = f"Hello from {local_agent}"
async with participant:
while True:
try:
# receive message from session
recv_session, msg_rcv = await participant.receive(
session=session_info.id
)v0.4.0:
# Reception loop handles both invitations and messages
session_info, _ = await local_app.receive()
format_message_print(
f"{instance} received a new session:",
f"{session_info.id}",
)
async def background_task(session_id):
while True:
# Receive the message from the session
session, msg = await local_app.receive(session=session_id)
format_message_print(
f"{instance}",
f"received (from session {session_id}): {msg.decode()}",
)When upgrading from v0.3.6 to v0.4.0, ensure you:
- Update SLIM instance creation to use
PyNameobjects and authentication parameters - Replace
PyAgentTypewithPyNamethroughout your codebase - Configure authentication using either shared secrets (development) or JWT tokens (production)
- Remove manual route/subscription setup (now handled automatically)
- Update session creation - only required for moderator applications
- Implement channel invitation logic for moderators
- Update message reception loops to handle invitations
- Test MLS encryption functionality if using secure channels
- SLIM Group Tutorial - Complete step-by-step guide
- SPIRE Integration
Guide
- Production-ready authentication setup
- Python
Examples
- Updated code examples
- API Documentation - Complete API reference
The next release will integrate support for Agntcy Identity, allowing users to create SLIM applications using their agent badge for even more streamlined authentication.