Describe the bug
Runs are pinned to a WorkflowDefinitionModel (workflow_runs.definition_id), and WorkflowModel.workflow_configurations is a legacy column that save_workflow_draft keeps in sync with the draft (api/db/workflow_client.py, "Keep legacy columns on workflows table in sync with draft"). get_definition_configurations documents exactly this: "reading it here would let unpublished edits change live call behaviour".
The pipeline still reads three settings from the workflow row instead of the pinned definition (main):
api/services/pipecat/run_pipeline.py:330-334 — ambient_noise_configuration (telephony entry point)
api/services/pipecat/run_pipeline.py:463-467 — ambient_noise_configuration (WebRTC entry point)
api/services/pipecat/run_pipeline.py:844 — context_compaction_enabled
api/services/pipecat/run_pipeline.py:996 — voicemail_detection (including its api_key)
api/services/workflow/text_chat_runner.py:604 — context_compaction_enabled
Every other setting (max_call_duration, max_user_idle_timeout, dictionary, turn strategies, model overrides) is already read from workflow_run.definition.workflow_configurations a few lines earlier.
Impact: for inbound calls, campaigns, the public agent API, embeds and ARI — all of which pin the published definition — an unpublished draft can enable/disable voicemail detection, change context compaction, or change the ambient noise of live calls. The UI editor, test calls and text chat pin the draft, so the bug is invisible there (draft == workflow row), which is why it goes unnoticed.
Deployment mode: self-hosted (main and dograh-v1.45.0); the same code runs in the cloud-hosted app.
Steps to Reproduce
- Publish a workflow with voicemail detection disabled.
- Open the workflow settings, enable voicemail detection and save — do not publish (this creates a draft and updates the workflow row).
- Place an inbound call (or start a campaign) to that workflow.
- Observe in the logs
Voicemail detection enabled for workflow run … and the voicemail sub-pipeline being created, although the published definition has it disabled.
The same steps with context_compaction_enabled or a custom ambient noise file show the draft value being used.
Expected behavior
A run pinned to the published definition uses only the published configuration; drafts have no effect until published (as is already the case for max_call_duration, turn strategies, dictionary, etc.).
Device details
Backend api on main (also dograh-v1.45.0), self-hosted; independent of browser.
Additional context
Fix is small: read the three settings from run_configs (already loaded from the pinned definition at both entry points and in _run_pipeline_impl/text_chat_runner). I have a PR ready with an integration test (api/tests/integrations/test_run_pipeline.py) that creates a draft enabling both knobs on a run pinned to V1 and asserts the engine ignores the draft.
Describe the bug
Runs are pinned to a
WorkflowDefinitionModel(workflow_runs.definition_id), andWorkflowModel.workflow_configurationsis a legacy column thatsave_workflow_draftkeeps in sync with the draft (api/db/workflow_client.py, "Keep legacy columns on workflows table in sync with draft").get_definition_configurationsdocuments exactly this: "reading it here would let unpublished edits change live call behaviour".The pipeline still reads three settings from the workflow row instead of the pinned definition (
main):api/services/pipecat/run_pipeline.py:330-334—ambient_noise_configuration(telephony entry point)api/services/pipecat/run_pipeline.py:463-467—ambient_noise_configuration(WebRTC entry point)api/services/pipecat/run_pipeline.py:844—context_compaction_enabledapi/services/pipecat/run_pipeline.py:996—voicemail_detection(including itsapi_key)api/services/workflow/text_chat_runner.py:604—context_compaction_enabledEvery other setting (
max_call_duration,max_user_idle_timeout,dictionary, turn strategies, model overrides) is already read fromworkflow_run.definition.workflow_configurationsa few lines earlier.Impact: for inbound calls, campaigns, the public agent API, embeds and ARI — all of which pin the published definition — an unpublished draft can enable/disable voicemail detection, change context compaction, or change the ambient noise of live calls. The UI editor, test calls and text chat pin the draft, so the bug is invisible there (draft == workflow row), which is why it goes unnoticed.
Deployment mode: self-hosted (
mainanddograh-v1.45.0); the same code runs in the cloud-hosted app.Steps to Reproduce
Voicemail detection enabled for workflow run …and the voicemail sub-pipeline being created, although the published definition has it disabled.The same steps with
context_compaction_enabledor a custom ambient noise file show the draft value being used.Expected behavior
A run pinned to the published definition uses only the published configuration; drafts have no effect until published (as is already the case for
max_call_duration, turn strategies, dictionary, etc.).Device details
Backend
apionmain(alsodograh-v1.45.0), self-hosted; independent of browser.Additional context
Fix is small: read the three settings from
run_configs(already loaded from the pinned definition at both entry points and in_run_pipeline_impl/text_chat_runner). I have a PR ready with an integration test (api/tests/integrations/test_run_pipeline.py) that creates a draft enabling both knobs on a run pinned to V1 and asserts the engine ignores the draft.