hono.jsでOpenAI APIのStreamを受け流すAPIをつくる。

hono.js v3.7.0にて、SSE (Server-Sent Event) がサポートされました!

本当に嬉しいです。待ってました。

これを利用して、OpenAI API と(だいたい)互換なチャンクを Cloudflare Workers から流してみます。

コード

	const openai = new OpenAI({ apiKey: c.env.OPENAI_API_KEY })
	const chatStream = await openai.chat.completions.create({
		messages: PROMPT(body.messages),
		model: 'gpt-3.5-turbo-0613',
		stream: true
	})

	c.header('Content-Type', 'text/event-stream')

	return c.streamText(async (stream) => {
		for await (const message of chatStream) {
			await stream.write(`data: ${JSON.stringify(message)}\n\n`);
		}
		await stream.write(`data: [DONE]\n\n`);
	});

なお、PROMPTは以下のような感じです。

const PROMPT = (messages: OpenAI.Chat.ChatCompletionMessage[]) => [
  {
    role: 'system' as const,
    content:
      '<システムプロンプト>'
  },
  ...messages,
]

インポートもおわすれなく。

import { Hono } from 'hono'
import { OpenAI } from 'openai'

二度手間なことをしている気がしなくもないですが、これでうまくいきます。

Cloudflare WorkersでAPIをラップするとSecret Keyが秘匿できるので良いですね。

Xのフォローもお願いします。
https://twitter.com/31pi_


この記事が気に入ったらサポートをしてみませんか?