MüşkülpesentM
Windmill4mo ago
5 replies
Müşkülpesent

Windmill SSE response format — emit one item per event?

Hi,

I’m trying to use Server-Sent Events (SSE) with streamed responses in a script, but the Windmill SSE endpoint appears to “flush” multiple items into a single event. That doesn’t match the per-item yield format I expect.

My main scenario uses the ai-sdk tooling for streaming. Here’s a simplified example:

import { createUIMessageStream, streamText } from "ai";
import { createOpenAI } from "@ai-sdk/openai";
import * as wmill from "windmill-client@1.545.0";

export async function main() {
  return streamMe();
}

async function* streamMe(): AsyncGenerator<any> {
  const prompt = "write me a poen about nature";

  const { api_key } = (await wmill.getResource(
    "f/openai_key"
  )) as { api_key: string };

  const openai = createOpenAI({ apiKey: api_key });

  const result = streamText({
    model: openai("gpt-4o-mini"),
    prompt
  });

  const uiStream = createUIMessageStream({
    execute: ({ writer }) => {
      writer.merge(
        result.toUIMessageStream({
          sendReasoning: true,
          onError: error =>
            error instanceof Error ? error.message : String(error),
        })
      );
    },
  });

  const reader = uiStream.getReader();
  try {
    while (true) {
      const { value, done } = await reader.read();
      if (done) {
        break;
      }
      yield JSON.stringify(value);
    }
  } finally {
    reader.releaseLock();
  }

}


A sample response from the Windmill SSE endpoint (attached) looks like this:

data: {"type":"update","new_result_stream":"{json object...}{json object...}{json object...}"}


However, I need one JSON object per SSE event because I iterate over each item. The expected output would be:

data: {"type":"update","new_result_stream":"{json object...}"}

data: {"type":"update","new_result_stream":"{json object}"}

data: {"type":"update","new_result_stream":"{json object}"}


is there a way for formating like that?
Was this page helpful?