Stream OpenAI API Responses

Use the OpenAI v4 SDK to stream responses from OpenAI.

Last updated Sep 10, 2026 If you want to get started quickly, click on the button below.

Deploy to Cloudflare

This creates a repository in your GitHub account and deploys the application to Cloudflare Workers.

In order to run this code, you must install the OpenAI SDK by running npm i openai.

Note

For analytics, caching, rate limiting, and more, you can also send requests like this through Cloudflare's AI Gateway.

import OpenAI from "openai";

export default {
    async fetch(request, env, ctx): Promise<Response> {
        const openai = new OpenAI({
            apiKey: env.OPENAI_API_KEY,
        });

        // Create a TransformStream to handle streaming data
        let { readable, writable } = new TransformStream();
        let writer = writable.getWriter();
        const textEncoder = new TextEncoder();

        ctx.waitUntil(
            (async () => {
                const stream = await openai.chat.completions.create({
                    model: "gpt-4o-mini",
                    messages: [{ role: "user", content: "Tell me a story" }],
                    stream: true,
                });

                // loop over the data as it is streamed and write to the writable
                for await (const part of stream) {
                    writer.write(
                        textEncoder.encode(part.choices[0]?.delta?.content || ""),
                    );
                }
                writer.close();
            })(),
        );

        // Send the readable back to the browser
        return new Response(readable);
    },
} satisfies ExportedHandler<Env>;
import { Hono } from "hono";
import { streamText } from "hono/streaming";
import OpenAI from "openai";

interface Env {
    OPENAI_API_KEY: string;
}

const app = new Hono<{ Bindings: Env }>();

app.get("*", async (c) => {
    const openai = new OpenAI({
        apiKey: c.env.OPENAI_API_KEY,
    });

    const chatStream = await openai.chat.completions.create({
        model: "gpt-4o-mini",
        messages: [{ role: "user", content: "Tell me a story" }],
        stream: true,
    });

    return streamText(c, async (stream) => {
        for await (const message of chatStream) {
            await stream.write(message.choices[0].delta.content || "");
        }
        stream.close();
    });
});

export default app;

Was this helpful?

YesNo

On this page

Stream OpenAI API Responses - 图2Docs

{"@context":"https://schema.org","@type":"TechArticle","@id":"https://developers.cloudflare.com/workers/examples/openai-sdk-streaming/#page","headline":"Stream OpenAI API Responses","description":"Use the OpenAI v4 SDK to stream responses from OpenAI.","url":"https://developers.cloudflare.com/workers/examples/openai-sdk-streaming/","inLanguage":"en","image":"https://developers.cloudflare.com/workers/examples/openai-sdk-streaming/og.png?v=32097696c604684c","dateModified":"2026-09-10","publisher":{"@type":"Organization","name":"Cloudflare","description":"One platform for your apps, agents, and workforce. Build, secure, and scale without managing infrastructure","url":"https://www.cloudflare.com/","sameAs":["https://github.com/cloudflare","https://www.linkedin.com/company/cloudflare","https://x.com/cloudflare"],"logo":{"@type":"ImageObject","url":"https://developers.cloudflare.com/logo.svg"},"address":{"@type":"PostalAddress","streetAddress":"101 Townsend St","addressLocality":"San Francisco","addressRegion":"CA","postalCode":"94107","addressCountry":"US"},"contactPoint":[{"@type":"ContactPoint","contactType":"Customer Support","url":"https://support.cloudflare.com/","availableLanguage":["English"]},{"@type":"ContactPoint","contactType":"Sales","url":"https://www.cloudflare.com/contact/","availableLanguage":["English"]}]},"isPartOf":{"@type":"WebSite","@id":"https://developers.cloudflare.com/#website","name":"Cloudflare Docs","url":"https://developers.cloudflare.com/"},"keywords":["AI","JavaScript","TypeScript"]}


description: Send a POST request with JSON data. Use to share data with external servers. title: Post JSON image: https://developers.cloudflare.com/workers/examples/post-json/og.png?v=26ecb54b3f3c6cbe


Skip to content

Documentation Index
Fetch the complete documentation index at: https://developers.cloudflare.com/workers/llms.txt
Use this file to discover all available pages before exploring further.