Files
agent/.opencode/skills/tech-stack/elysiajs/integrations/ai-sdk.md

2.0 KiB

AI SDK Integration

What It Is

Seamless integration with Vercel AI SDK via response streaming.

Response Streaming

Return ReadableStream or Response directly:

import { streamText } from 'ai'
import { openai } from '@ai-sdk/openai'

new Elysia().get('/', () => {
  const stream = streamText({
    model: openai('gpt-5'),
    system: 'You are Yae Miko from Genshin Impact',
    prompt: 'Hi! How are you doing?'
  })
  
  return stream.textStream  // ReadableStream
  // or
  return stream.toUIMessageStream()  // UI Message Stream
})

Elysia auto-handles stream.

Server-Sent Events

Wrap ReadableStream with sse:

import { sse } from 'elysia'

.get('/', () => {
  const stream = streamText({ /* ... */ })
  
  return sse(stream.textStream)
  // or
  return sse(stream.toUIMessageStream())
})

Each chunk → SSE.

As Response

Return stream directly (no Eden type safety):

.get('/', () => {
  const stream = streamText({ /* ... */ })
  
  return stream.toTextStreamResponse()
  // or
  return stream.toUIMessageStreamResponse()  // Uses SSE
})

Manual Streaming

Generator function for control:

import { sse } from 'elysia'

.get('/', async function* () {
  const stream = streamText({ /* ... */ })
  
  for await (const data of stream.textStream)
    yield sse({ data, event: 'message' })
  
  yield sse({ event: 'done' })
})

Fetch for Unsupported Models

Direct fetch with streaming proxy:

.get('/', () => {
  return fetch('https://api.openai.com/v1/chat/completions', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      Authorization: `Bearer ${process.env.OPENAI_API_KEY}`
    },
    body: JSON.stringify({
      model: 'gpt-5',
      stream: true,
      messages: [
        { role: 'system', content: 'You are Yae Miko' },
        { role: 'user', content: 'Hi! How are you doing?' }
      ]
    })
  })
})

Elysia auto-proxies fetch response with streaming.