Merge pull request #1701 from pipecat-ai/mb/gemini-extend-session
Add context_window_compression support to GeminiMultimodalLiveLLMService
This commit is contained in:
@@ -9,6 +9,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
|
- Added a `context_window_compression` InputParam to
|
||||||
|
`GeminiMultimodalLiveLLMService` which allows you to enable a sliding
|
||||||
|
context window for the session as well as set the token limit of the sliding
|
||||||
|
window.
|
||||||
|
|
||||||
- Updated `SmallWebRTCConnection` to support `ice_servers` with credentials.
|
- Updated `SmallWebRTCConnection` to support `ice_servers` with credentials.
|
||||||
|
|
||||||
- Added `VADUserStartedSpeakingFrame` and `VADUserStoppedSpeakingFrame`,
|
- Added `VADUserStartedSpeakingFrame` and `VADUserStoppedSpeakingFrame`,
|
||||||
|
|||||||
@@ -193,3 +193,10 @@ def parse_server_event(str):
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error parsing server event: {e}")
|
print(f"Error parsing server event: {e}")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
class ContextWindowCompressionConfig(BaseModel):
|
||||||
|
"""Configuration for context window compression."""
|
||||||
|
|
||||||
|
sliding_window: Optional[bool] = Field(default=True)
|
||||||
|
trigger_tokens: Optional[int] = Field(default=None)
|
||||||
|
|||||||
@@ -265,6 +265,15 @@ class GeminiVADParams(BaseModel):
|
|||||||
silence_duration_ms: Optional[int] = Field(default=None)
|
silence_duration_ms: Optional[int] = Field(default=None)
|
||||||
|
|
||||||
|
|
||||||
|
class ContextWindowCompressionParams(BaseModel):
|
||||||
|
"""Parameters for context window compression."""
|
||||||
|
|
||||||
|
enabled: bool = Field(default=False)
|
||||||
|
trigger_tokens: Optional[int] = Field(
|
||||||
|
default=None
|
||||||
|
) # None = use default (80% of context window)
|
||||||
|
|
||||||
|
|
||||||
class InputParams(BaseModel):
|
class InputParams(BaseModel):
|
||||||
frequency_penalty: Optional[float] = Field(default=None, ge=0.0, le=2.0)
|
frequency_penalty: Optional[float] = Field(default=None, ge=0.0, le=2.0)
|
||||||
max_tokens: Optional[int] = Field(default=4096, ge=1)
|
max_tokens: Optional[int] = Field(default=4096, ge=1)
|
||||||
@@ -280,6 +289,7 @@ class InputParams(BaseModel):
|
|||||||
default=GeminiMediaResolution.UNSPECIFIED
|
default=GeminiMediaResolution.UNSPECIFIED
|
||||||
)
|
)
|
||||||
vad: Optional[GeminiVADParams] = Field(default=None)
|
vad: Optional[GeminiVADParams] = Field(default=None)
|
||||||
|
context_window_compression: Optional[ContextWindowCompressionParams] = Field(default=None)
|
||||||
extra: Optional[Dict[str, Any]] = Field(default_factory=dict)
|
extra: Optional[Dict[str, Any]] = Field(default_factory=dict)
|
||||||
|
|
||||||
|
|
||||||
@@ -355,6 +365,9 @@ class GeminiMultimodalLiveLLMService(LLMService):
|
|||||||
"language": self._language_code,
|
"language": self._language_code,
|
||||||
"media_resolution": params.media_resolution,
|
"media_resolution": params.media_resolution,
|
||||||
"vad": params.vad,
|
"vad": params.vad,
|
||||||
|
"context_window_compression": params.context_window_compression.model_dump()
|
||||||
|
if params.context_window_compression
|
||||||
|
else None,
|
||||||
"extra": params.extra if isinstance(params.extra, dict) else {},
|
"extra": params.extra if isinstance(params.extra, dict) else {},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -561,6 +574,21 @@ class GeminiMultimodalLiveLLMService(LLMService):
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Add context window compression if enabled
|
||||||
|
if self._settings.get("context_window_compression", {}).get("enabled", False):
|
||||||
|
compression_config = {}
|
||||||
|
# Add sliding window (always true if compression is enabled)
|
||||||
|
compression_config["sliding_window"] = {}
|
||||||
|
|
||||||
|
# Add trigger_tokens if specified
|
||||||
|
trigger_tokens = self._settings.get("context_window_compression", {}).get(
|
||||||
|
"trigger_tokens"
|
||||||
|
)
|
||||||
|
if trigger_tokens is not None:
|
||||||
|
compression_config["trigger_tokens"] = trigger_tokens
|
||||||
|
|
||||||
|
config_data["setup"]["context_window_compression"] = compression_config
|
||||||
|
|
||||||
# Add VAD configuration if provided
|
# Add VAD configuration if provided
|
||||||
if self._settings.get("vad"):
|
if self._settings.get("vad"):
|
||||||
vad_config = {}
|
vad_config = {}
|
||||||
|
|||||||
Reference in New Issue
Block a user