Skip to content
This repository was archived by the owner on Jun 17, 2026. It is now read-only.

Commit a24c5e4

Browse files
authored
Merge pull request #32 from pipecat-ai/mb/refactor-aiohttp-session
Refactor aiohttp_session code gen
2 parents 8c94288 + c0c30bd commit a24c5e4

9 files changed

Lines changed: 469 additions & 467 deletions

src/pipecat_cli/registry/_configs.py

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,10 @@
6161
"speechmatics_stt": 'SpeechmaticsSTTService(api_key=os.getenv("SPEECHMATICS_API_KEY"))',
6262
"ultravox_stt": (
6363
"UltravoxSTTService(\n"
64-
' model_name=os.getenv("ULTRAVOX_MODEL_NAME"),\n'
65-
' hf_token=os.getenv("HF_TOKEN"),\n'
66-
' region=os.getenv("ULTRAVOX_REGION")\n'
67-
" )\n"
64+
' model_name=os.getenv("ULTRAVOX_MODEL_NAME"),\n'
65+
' hf_token=os.getenv("HF_TOKEN"),\n'
66+
' region=os.getenv("ULTRAVOX_REGION")\n'
67+
")\n"
6868
),
6969
"whisper_stt": 'WhisperSTTService(model=os.getenv("OPENAI_MODEL"))',
7070
# LLM Services
@@ -76,10 +76,10 @@
7676
),
7777
"aws_bedrock_llm": (
7878
"AWSBedrockLLMService(\n"
79-
' aws_region=os.getenv("AWS_REGION"),\n'
80-
' model=os.getenv("AWS_BEDROCK_MODEL"),\n'
81-
" params=AWSBedrockLLMService.InputParams(temperature=0.8)\n"
82-
" )\n"
79+
' aws_region=os.getenv("AWS_REGION"),\n'
80+
' model=os.getenv("AWS_BEDROCK_MODEL"),\n'
81+
" params=AWSBedrockLLMService.InputParams(temperature=0.8)\n"
82+
")\n"
8383
),
8484
"azure_llm": (
8585
"AzureLLMService(\n"
@@ -195,10 +195,10 @@
195195
),
196196
"aws_polly_tts": (
197197
"AWSPollyTTSService(\n"
198-
' region=os.getenv("AWS_REGION"),\n'
199-
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
200-
' params=AWSPollyTTSService.InputParams(engine="generative"),\n'
201-
" )\n"
198+
' region=os.getenv("AWS_REGION"),\n'
199+
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
200+
' params=AWSPollyTTSService.InputParams(engine="generative"),\n'
201+
")\n"
202202
),
203203
"azure_tts": (
204204
"AzureTTSService(\n"
@@ -318,32 +318,32 @@
318318
# Realtime Services
319319
"aws_nova_realtime": (
320320
"llm = AWSNovaSonicLLMService(\n"
321-
' secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"),\n'
322-
' access_key_id=os.getenv("AWS_ACCESS_KEY_ID"),\n'
323-
' region=os.getenv("AWS_REGION"),\n'
324-
' session_token=os.getenv("AWS_SESSION_TOKEN"),\n'
325-
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
326-
" )\n"
321+
' secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"),\n'
322+
' access_key_id=os.getenv("AWS_ACCESS_KEY_ID"),\n'
323+
' region=os.getenv("AWS_REGION"),\n'
324+
' session_token=os.getenv("AWS_SESSION_TOKEN"),\n'
325+
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
326+
")\n"
327327
),
328328
"azure_realtime": (
329329
"session_properties = SessionProperties(\n"
330-
' input_audio_transcription=InputAudioTranscription(model="whisper-1"),\n'
331-
' instructions=os.getenv("AZURE_INSTRUCTIONS"),\n'
332-
" )\n"
333-
" llm = AzureRealtimeLLMService(\n"
334-
' api_key=os.getenv("AZURE_REALTIME_API_KEY"),\n'
335-
' base_url=os.getenv("AZURE_REALTIME_BASE_URL"),\n'
336-
" session_properties=session_properties,\n"
337-
" start_audio_paused=False,\n"
338-
" )\n"
330+
' input_audio_transcription=InputAudioTranscription(model="whisper-1"),\n'
331+
' instructions=os.getenv("AZURE_INSTRUCTIONS"),\n'
332+
")\n"
333+
"llm = AzureRealtimeLLMService(\n"
334+
' api_key=os.getenv("AZURE_REALTIME_API_KEY"),\n'
335+
' base_url=os.getenv("AZURE_REALTIME_BASE_URL"),\n'
336+
" session_properties=session_properties,\n"
337+
" start_audio_paused=False,\n"
338+
")\n"
339339
),
340340
"gemini_live_realtime": (
341341
"llm = GeminiLiveLLMService(\n"
342-
' api_key=os.getenv("GOOGLE_API_KEY"),\n'
343-
' model=os.getenv("GOOGLE_MODEL"),\n'
344-
' voice_id=os.getenv("GOOGLE_VOICE_ID"),\n'
345-
' system_instruction=os.getenv("GOOGLE_SYSTEM_INSTRUCTION"),\n'
346-
" )\n"
342+
' api_key=os.getenv("GOOGLE_API_KEY"),\n'
343+
' model=os.getenv("GOOGLE_MODEL"),\n'
344+
' voice_id=os.getenv("GOOGLE_VOICE_ID"),\n'
345+
' system_instruction=os.getenv("GOOGLE_SYSTEM_INSTRUCTION"),\n'
346+
")\n"
347347
),
348348
"gemini_vertex_live_realtime": (
349349
"llm = GeminiLiveVertexLLMService(\n"
@@ -352,34 +352,34 @@
352352
' location=os.getenv("GOOGLE_LOCATION"),\n'
353353
' voice_id=os.getenv("GOOGLE_VOICE_ID"),\n'
354354
' system_instruction=os.getenv("GOOGLE_SYSTEM_INSTRUCTION"),\n'
355-
" )\n"
355+
")\n"
356356
),
357357
"openai_realtime": (
358358
"session_properties = SessionProperties(\n"
359-
" audio=AudioConfiguration(\n"
360-
" input=AudioInput(\n"
361-
" transcription=InputAudioTranscription(),\n"
362-
" turn_detection=SemanticTurnDetection(),\n"
363-
' noise_reduction=InputAudioNoiseReduction(type="near_field"),\n'
364-
" )\n"
365-
" ),\n"
366-
' instructions=os.getenv("OPENAI_INSTRUCTIONS"),\n'
367-
" )\n"
368-
" llm = OpenAIRealtimeLLMService(\n"
369-
' api_key=os.getenv("OPENAI_API_KEY"),\n'
370-
" session_properties=session_properties,\n"
371-
" start_audio_paused=False,\n"
372-
" )\n"
359+
" audio=AudioConfiguration(\n"
360+
" input=AudioInput(\n"
361+
" transcription=InputAudioTranscription(),\n"
362+
" turn_detection=SemanticTurnDetection(),\n"
363+
' noise_reduction=InputAudioNoiseReduction(type="near_field"),\n'
364+
" )\n"
365+
" ),\n"
366+
' instructions=os.getenv("OPENAI_INSTRUCTIONS"),\n'
367+
")\n"
368+
"llm = OpenAIRealtimeLLMService(\n"
369+
' api_key=os.getenv("OPENAI_API_KEY"),\n'
370+
" session_properties=session_properties,\n"
371+
" start_audio_paused=False,\n"
372+
")\n"
373373
),
374374
# Video Services
375375
"heygen_video": (
376-
"heyGen = HeyGenVideoService(\n"
377-
' api_key=os.getenv("HEYGEN_API_KEY"),\n'
378-
" session=session,\n"
379-
" session_request=NewSessionRequest(\n"
380-
' avatar_id="HEYGEN_AVATAR_ID", version="v2", quality=AvatarQuality.high\n'
381-
" ),\n"
382-
" )\n"
376+
"HeyGenVideoService(\n"
377+
' api_key=os.getenv("HEYGEN_API_KEY"),\n'
378+
" session=session,\n"
379+
" session_request=NewSessionRequest(\n"
380+
' avatar_id="HEYGEN_AVATAR_ID", version="v2", quality=AvatarQuality.high\n'
381+
" ),\n"
382+
")\n"
383383
),
384384
"tavus_video": (
385385
"TavusVideoService(\n"

src/pipecat_cli/registry/service_metadata.py

Lines changed: 54 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -818,63 +818,63 @@ class ServiceRegistry:
818818
MANUAL_SERVICE_CONFIGS = {
819819
"ultravox_stt": (
820820
"UltravoxSTTService(\n"
821-
' model_name=os.getenv("ULTRAVOX_MODEL_NAME"),\n'
822-
' hf_token=os.getenv("HF_TOKEN"),\n'
823-
' region=os.getenv("ULTRAVOX_REGION")\n'
824-
" )"
821+
' model_name=os.getenv("ULTRAVOX_MODEL_NAME"),\n'
822+
' hf_token=os.getenv("HF_TOKEN"),\n'
823+
' region=os.getenv("ULTRAVOX_REGION")\n'
824+
")"
825825
),
826826
"aws_bedrock_llm": (
827827
"AWSBedrockLLMService(\n"
828-
' aws_region=os.getenv("AWS_REGION"),\n'
829-
' model=os.getenv("AWS_BEDROCK_MODEL"),\n'
830-
" params=AWSBedrockLLMService.InputParams(temperature=0.8)\n"
831-
" )"
828+
' aws_region=os.getenv("AWS_REGION"),\n'
829+
' model=os.getenv("AWS_BEDROCK_MODEL"),\n'
830+
" params=AWSBedrockLLMService.InputParams(temperature=0.8)\n"
831+
")"
832832
),
833833
"aws_polly_tts": (
834834
"AWSPollyTTSService(\n"
835-
' region=os.getenv("AWS_REGION"),\n'
836-
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
837-
' params=AWSPollyTTSService.InputParams(engine="generative"),\n'
838-
" )"
835+
' region=os.getenv("AWS_REGION"),\n'
836+
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
837+
' params=AWSPollyTTSService.InputParams(engine="generative"),\n'
838+
")"
839839
),
840840
"azure_realtime": (
841841
"session_properties = SessionProperties(\n"
842-
' input_audio_transcription=InputAudioTranscription(model="whisper-1"),\n'
843-
' instructions=os.getenv("AZURE_INSTRUCTIONS"),\n'
844-
" )\n"
842+
' input_audio_transcription=InputAudioTranscription(model="whisper-1"),\n'
843+
' instructions=os.getenv("AZURE_INSTRUCTIONS"),\n'
844+
")\n"
845845
"\n"
846-
" llm = AzureRealtimeLLMService(\n"
847-
' api_key=os.getenv("AZURE_REALTIME_API_KEY"),\n'
848-
' base_url=os.getenv("AZURE_REALTIME_BASE_URL"),\n'
849-
" session_properties=session_properties,\n"
850-
" start_audio_paused=False,\n"
851-
" )"
846+
"llm = AzureRealtimeLLMService(\n"
847+
' api_key=os.getenv("AZURE_REALTIME_API_KEY"),\n'
848+
' base_url=os.getenv("AZURE_REALTIME_BASE_URL"),\n'
849+
" session_properties=session_properties,\n"
850+
" start_audio_paused=False,\n"
851+
")"
852852
),
853853
"openai_realtime": (
854854
"session_properties = SessionProperties(\n"
855-
" audio=AudioConfiguration(\n"
856-
" input=AudioInput(\n"
857-
" transcription=InputAudioTranscription(),\n"
858-
" turn_detection=SemanticTurnDetection(),\n"
859-
' noise_reduction=InputAudioNoiseReduction(type="near_field"),\n'
860-
" )\n"
861-
" ),\n"
862-
' instructions=os.getenv("OPENAI_INSTRUCTIONS"),\n'
863-
" )\n"
855+
" audio=AudioConfiguration(\n"
856+
" input=AudioInput(\n"
857+
" transcription=InputAudioTranscription(),\n"
858+
" turn_detection=SemanticTurnDetection(),\n"
859+
' noise_reduction=InputAudioNoiseReduction(type="near_field"),\n'
860+
" )\n"
861+
" ),\n"
862+
' instructions=os.getenv("OPENAI_INSTRUCTIONS"),\n'
863+
")\n"
864864
"\n"
865-
" llm = OpenAIRealtimeLLMService(\n"
866-
' api_key=os.getenv("OPENAI_API_KEY"),\n'
867-
" session_properties=session_properties,\n"
868-
" start_audio_paused=False,\n"
869-
" )"
865+
"llm = OpenAIRealtimeLLMService(\n"
866+
' api_key=os.getenv("OPENAI_API_KEY"),\n'
867+
" session_properties=session_properties,\n"
868+
" start_audio_paused=False,\n"
869+
")"
870870
),
871871
"gemini_live_realtime": (
872872
"llm = GeminiLiveLLMService(\n"
873-
' api_key=os.getenv("GOOGLE_API_KEY"),\n'
874-
' model=os.getenv("GOOGLE_MODEL"),\n'
875-
' voice_id=os.getenv("GOOGLE_VOICE_ID"),\n'
876-
' system_instruction=os.getenv("GOOGLE_SYSTEM_INSTRUCTION"),\n'
877-
" )"
873+
' api_key=os.getenv("GOOGLE_API_KEY"),\n'
874+
' model=os.getenv("GOOGLE_MODEL"),\n'
875+
' voice_id=os.getenv("GOOGLE_VOICE_ID"),\n'
876+
' system_instruction=os.getenv("GOOGLE_SYSTEM_INSTRUCTION"),\n'
877+
")"
878878
),
879879
"gemini_vertex_live_realtime": (
880880
"llm = GeminiLiveVertexLLMService(\n"
@@ -883,24 +883,24 @@ class ServiceRegistry:
883883
' location=os.getenv("GOOGLE_LOCATION"),\n'
884884
' voice_id=os.getenv("GOOGLE_VOICE_ID"),\n'
885885
' system_instruction=os.getenv("GOOGLE_SYSTEM_INSTRUCTION"),\n'
886-
" )"
886+
")"
887887
),
888888
"aws_nova_realtime": (
889889
"llm = AWSNovaSonicLLMService(\n"
890-
' secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"),\n'
891-
' access_key_id=os.getenv("AWS_ACCESS_KEY_ID"),\n'
892-
' region=os.getenv("AWS_REGION"),\n'
893-
' session_token=os.getenv("AWS_SESSION_TOKEN"),\n'
894-
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
895-
" )"
890+
' secret_access_key=os.getenv("AWS_SECRET_ACCESS_KEY"),\n'
891+
' access_key_id=os.getenv("AWS_ACCESS_KEY_ID"),\n'
892+
' region=os.getenv("AWS_REGION"),\n'
893+
' session_token=os.getenv("AWS_SESSION_TOKEN"),\n'
894+
' voice_id=os.getenv("AWS_VOICE_ID"),\n'
895+
")"
896896
),
897897
"heygen_video": (
898-
"heyGen = HeyGenVideoService(\n"
899-
' api_key=os.getenv("HEYGEN_API_KEY"),\n'
900-
" session=session,\n"
901-
" session_request=NewSessionRequest(\n"
902-
' avatar_id="HEYGEN_AVATAR_ID", version="v2", quality=AvatarQuality.high\n'
903-
" ),\n"
904-
" )"
898+
"HeyGenVideoService(\n"
899+
' api_key=os.getenv("HEYGEN_API_KEY"),\n'
900+
" session=session,\n"
901+
" session_request=NewSessionRequest(\n"
902+
' avatar_id="HEYGEN_AVATAR_ID", version="v2", quality=AvatarQuality.high\n'
903+
" ),\n"
904+
")"
905905
),
906906
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
{# Main bot logic for cascade mode - uses indent_level variable passed from parent #}
2+
{{ "# Speech-to-Text service" | indent(indent_level, first=True) }}
3+
{% if stt_service and stt_service in service_configs %}
4+
{{ ("stt = " ~ service_configs[stt_service]) | indent(indent_level, first=True) }}
5+
{% endif %}
6+
7+
{{ "# Text-to-Speech service" | indent(indent_level, first=True) }}
8+
{% if tts_service and tts_service in service_configs %}
9+
{{ ("tts = " ~ service_configs[tts_service]) | indent(indent_level, first=True) }}
10+
{% endif %}
11+
12+
{{ "# LLM service" | indent(indent_level, first=True) }}
13+
{% if llm_service and llm_service in service_configs %}
14+
{{ ("llm = " ~ service_configs[llm_service]) | indent(indent_level, first=True) }}
15+
{% endif %}
16+
17+
{{ "# Video service (avatar)" | indent(indent_level, first=True) }}
18+
{% if video_service and video_service in service_configs %}
19+
{{ ("video = " ~ service_configs[video_service]) | indent(indent_level, first=True) }}
20+
{% endif %}
21+
22+
{{ helpers.setup_context() | indent(indent_level, first=True) }}
23+
24+
{{ helpers.setup_feature_processors(recording, transcription, bot_type) | indent(indent_level, first=True) }}
25+
26+
{{ "# Pipeline - assembled from reusable components" | indent(indent_level, first=True) }}
27+
{{ pipeline.cascade_pipeline(bot_type, transcription, recording, video_service) | indent(indent_level, first=True) }}
28+
29+
{{ "task = PipelineTask(" | indent(indent_level, first=True) }}
30+
{{ "pipeline," | indent(indent_level + 4, first=True) }}
31+
{{ "params=PipelineParams(" | indent(indent_level + 4, first=True) }}
32+
{{ "enable_metrics=True," | indent(indent_level + 8, first=True) }}
33+
{{ "enable_usage_metrics=True," | indent(indent_level + 8, first=True) }}
34+
{% if bot_type == 'telephony' %}
35+
{{ "audio_in_sample_rate=8000," | indent(indent_level + 8, first=True) }}
36+
{{ "audio_out_sample_rate=8000," | indent(indent_level + 8, first=True) }}
37+
{% endif %}
38+
{{ ")," | indent(indent_level + 4, first=True) }}
39+
{% if bot_type == 'web' or enable_observability %}
40+
{{ "observers=[" | indent(indent_level + 4, first=True) }}
41+
{% if bot_type == 'web' %}
42+
{{ "RTVIObserver(rtvi)," | indent(indent_level + 8, first=True) }}
43+
{% endif %}
44+
{% if enable_observability %}
45+
{{ "WhiskerObserver(pipeline)," | indent(indent_level + 8, first=True) }}
46+
{{ "TailObserver()," | indent(indent_level + 8, first=True) }}
47+
{% endif %}
48+
{{ "]," | indent(indent_level + 4, first=True) }}
49+
{% endif %}
50+
{{ ")" | indent(indent_level, first=True) }}
51+
52+
{% if 'daily_pstn_dialout' in transports or 'twilio_daily_sip_dialout' in transports %}
53+
{{ "# Initialize dialout manager" | indent(indent_level, first=True) }}
54+
{{ "dialout_manager = DialoutManager(transport, dialout_settings)" | indent(indent_level, first=True) }}
55+
56+
{% endif %}
57+
{# Event handlers - use macros based on transport type #}
58+
{% if 'daily_pstn_dialin' in transports %}
59+
{{ handlers.daily_pstn_dialin_handlers(recording) | indent(indent_level, first=True) }}
60+
{% elif 'daily_pstn_dialout' in transports %}
61+
{{ handlers.daily_pstn_dialout_handlers(recording) | indent(indent_level, first=True) }}
62+
{% elif 'twilio_daily_sip_dialin' in transports %}
63+
{{ handlers.twilio_daily_sip_dialin_handlers(recording) | indent(indent_level, first=True) }}
64+
{% elif 'twilio_daily_sip_dialout' in transports %}
65+
{{ handlers.twilio_daily_sip_dialout_handlers(recording) | indent(indent_level, first=True) }}
66+
{% else %}
67+
{{ handlers.standard_handlers(recording) | indent(indent_level, first=True) }}
68+
{% endif %}
69+
70+
{# Feature-specific event handlers #}
71+
{% if transcription %}
72+
{{ handlers.transcription_handler() | indent(indent_level, first=True) }}
73+
{% endif %}
74+
75+
{% if recording %}
76+
{{ handlers.recording_handler() | indent(indent_level, first=True) }}
77+
{% endif %}
78+
79+
{{ "runner = PipelineRunner(handle_sigint=False)" | indent(indent_level, first=True) }}
80+
81+
{{ "await runner.run(task)" | indent(indent_level, first=True) }}
82+

0 commit comments

Comments
 (0)