devlog

React Query で OpenAI API を呼んでみた

2023-12-04

React Query で OpenAI API を呼んでみました。

なお本記事の実装では API Key が漏洩する可能性があります。
あくまで参考程度に留めてください。バックエンドでAPIを呼び出しましょう。

バージョン

公式ライブラリの openai/openai-node を用いました

pnpm add openai

バージョンは v4.20.1 です

// package.json { ... "dependencies": { "openai": "4.20.1", ... } }

v4 で破壊的変更があったらしく、呼び方や関数のシグネチャが変わってます。 マイグレーションガイドが公開されているので詳しくは下記をご覧ください。

注意: バックエンドでAPIを呼び出すべき

openai/openai-node は Node.js 用のライブラリですがブラウザでも動きます。

ただし推奨されていません。
ブラウザで動かすには dangerouslyAllowBrowser というフラグを渡す必要があります。

const openai = new OpenAI({ apiKey: '', dangerouslyAllowBrowser: true, // フラグをセット })

推奨されていない理由ですが、API Key がばればれだからです。

ユーザーに API Key を入力してもらうサービスでもない限り、フロントエンドでAPIを呼び出すのはリスクです。  

私は諦めました。
バックエンドでAPIを呼び出しましょう。

サンプルコード

サンプルコードです

import { MouseEventHandler, useRef, useState } from 'react' import { OpenAI } from 'openai' import { useMutation } from 'react-query' // api key をセット const apiKey = '' const callOpenAiFn = async (message: string): Promise<string> => { const openai = new OpenAI({ apiKey, dangerouslyAllowBrowser: true, // 注意 }) const res = await openai.chat.completions.create({ messages: [{ role: 'user', content: message }], model: 'gpt-3.5-turbo', }) return res.choices.at(0)?.message.content ?? '' } export const ChatUI = () => { const chat = useMutation({ mutationFn: callOpenAiFn, }) const textareaRef = useRef<HTMLTextAreaElement>(null) const [answer, setAnswer] = useState('') const handleChat: MouseEventHandler<HTMLButtonElement> = async (e) => { e.preventDefault() if (textareaRef.current === null) { return } const message = textareaRef.current.value const response = await chat.mutateAsync(message) setAnswer(response) } return ( <> <textarea ref={textareaRef} placeholder='入力メッセージ' /> <button onClick={handleChat}>send</button> <div>{answer}</div> </> ) }
  • 作成日
    2023-12-04
  • 更新日
    2023-12-04