Skip to content

AI-310: streaming support for @temporalio/openai-agents#2147

Open
xumaple wants to merge 2 commits into
mainfrom
maplexu/AI-310-openai-agents-streaming
Open

AI-310: streaming support for @temporalio/openai-agents#2147
xumaple wants to merge 2 commits into
mainfrom
maplexu/AI-310-openai-agents-streaming

Conversation

@xumaple

@xumaple xumaple commented Jun 29, 2026

Copy link
Copy Markdown
Contributor

Adds streaming to the OpenAI Agents integration by wiring in the @temporalio/workflow-streams primitive, mirroring the Python SDK. An agent running inside a Workflow can stream model events to an external subscriber via a Workflow Stream topic, exposed through run(agent, input, { stream: true }).

The streaming model Activity publishes each event live to the configured topic and returns the full event list, which the Workflow yields deterministically on replay rather than polling the live stream. The user hosts the WorkflowStream; the topic name is plugin config via modelParams.streamingTopic.

Wire the @temporalio/workflow-streams primitive into the OpenAI Agents runner
so an agent running inside a Workflow can stream model events to an external
subscriber via a Workflow Stream topic, reaching parity with the Python SDK.

Streaming is exposed through run(agent, input, { stream: true }). The streaming
model Activity publishes each event live to the configured topic and returns the
full event list, which the Workflow yields deterministically on replay (it never
polls the live stream). The user hosts the WorkflowStream; the topic is plugin
config via modelParams.streamingTopic.
@xumaple xumaple requested review from a team as code owners June 29, 2026 18:23
export const STREAMING_TOPIC_NOT_CONFIGURED = {
type: 'StreamingTopicNotConfigured',
message:
'Streaming requires modelParams.streamingTopic to be set on OpenAIAgentsPlugin. ' +

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we update the readme to ensure we document that clients need to set modelParams / modelParams.streamingTopic on the plugin? And/or have a snippet in the readme showing how people need to update their client code to use streaming, not just the workflow side?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also - workflows started via schedules or the Temporal UI/CLI don't get a header at all so streaming can never be enabled for them, right? (IIUC modelParams reaches the Workflow exclusively through the __openai_agents_config header injected at workflow start by the client-side interceptor...) When you're calling configureBundler could you bake in a default modelParams to enable that use case when no header is present? Or would that force streaming to be enabled all the time, which is also not what we want? Maybe just a limitation to document?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. Rather than baking defaults into the bundler, I added a defaultModelParams option to the TemporalOpenAIRunner constructor.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

also added the readme snippets.

Comment thread contrib/openai-agents/README.md
Comment thread contrib/openai-agents/src/workflow/activity-backed-model.ts
Comment thread contrib/openai-agents/src/workflow/activity-backed-model.ts
Add `defaultModelParams` to `TemporalOpenAIRunner`, layered under the
client's `modelParams` header, so streaming (and every other model param)
can be configured for Workflows started without the client interceptor —
a Schedule or the Temporal UI/CLI. Client-set fields still win per field;
the inbound interceptor now stores only client-explicit fields so pre-baked
defaults can't clobber the constructor defaults.

Bring `getStreamedResponse` to parity with `getResponse`: wrap in a
generation span and apply the dynamic `ModelSummaryProvider`.

Document client-side plugin setup, the `defaultModelParams` layer, and a
`truncate` caution for stream heap/history growth.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants