WindmillWWindmill
Powered by
MüşkülpesentM
Windmill•5mo 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();
  }

}
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...}"}
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}"}
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?
windmill_sse_response.txt47.04KB
WindmillJoin
3,388Members
Resources

Similar Threads

Was this page helpful?
Recent Announcements
Recent Announcements
henri-c

We're live here https://discord.com/channels/930051556043276338/1278977038430240813

henri-c · 2d ago

rubenf

Infrastructure as code

rubenf · 3w ago

rubenf

As we're preparing for a new Windmill sandbox SDK, we took the opportunity **to open-source NSJAIL sandboxing** and make it available in CE and easier to set. In 1.634.0, just set nsjail to benefit from the tightest security and isolation per job. It's constraining so no need to use it unless you need but now you won't be restricted in security for CE if you need to.

rubenf · 4w ago

Similar Threads

Listen to slack events using windmill
wayneWwayne / help
2y ago
Self-hosted Windmill Webhook Events Not Sending
SkilldeliverSSkilldeliver / help
2y ago
Support for HTTP Browser Redirects in Windmill Functions (302 Response Handling)
giyuGgiyu / help
16mo ago
Windmill as Headless CMS with windmill rest API
ESiteHosterEESiteHoster / help
3y ago