Gemini APIを使ったシンプルなAIアプリを作っていきます。
仕様を考える
今回のアプリは、
- プロンプト: ブラウザ → Denoサーバー → Gemini API
- 生成結果: Gemini API → Denoサーバー → ブラウザ
という感じで、Denoサーバーを介して、ブラウザとGemini APIがデータの受け渡しを行うことにします。
ブラウザ側には、
- ユーザーのプロンプトを入力するエリア
- AIから返ってきた結果を表示するためのエリア
- 処理の開始トリガーとなるボタン
の3つのUIがあります。
開始ボタンを押すことで、ブラウザはプロンプトのテキストをDenoサーバーに送信します。
Denoサーバーは受け取ったプロンプトを Gemini API に送ります。
Gemini API がDenoサーバーに結果を返すと、それをブラウザに送信し、ブラウザの結果表示エリアを更新します。
このために、
- ブラウザ表示のためのHTMLやCSS
- ブラウザ側のプログラム
- 開始ボタンをトリガーに、Denoにプロンプトを送信する機能
- Denoから結果を受信し、ブラウザの表示を変える機能
- Denoサーバーのプログラム
- ブラウザからプロンプトを受信する機能
- ブラウザに結果を送信する機能
- Gemini APIとデータを送受信する機能
が必要になります。
ディレクトリ構成
このアプリのディレクトリ構成を以下に記載します。
/project-root
|-- /public
| |-- index.html
| |-- styles.css
| |-- script.js
|-- /src
| |-- /client
| | |-- script.ts
| |-- /server
| |-- main.ts
public/index.html は、ブラウザに表示するための HTML です。
そして、そのHTMLから読み込まれる CSS や JavaScriptが public/styles.css と public/script.js です。
src/ はTypeScriptファイルを置く場所です。src/ は、clientとserverに分かれます。
src/client/ には、public/script.js のソースになるTypeScriptファイルを置きます。上のディレクトリ構成図ではscript.tsしかありませんが、必要に応じてファイルが増えるかもしれません。
src/server/ には、Denoサーバーのための TypeScriptファイルを置きます。ここも現状は main.ts しかありませんが、必要に応じてファイルが増えるかもしれません。
ブラウザ表示に必要な最低要素を作成する
最初にブラウザ表示に必要な最低要素として、 index.html のα版を作成しました。以下が HTML です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- <link rel="stylesheet" href="styles.css"> -->
<title>シンプルAIアプリ</title>
</head>
<body>
<h1>シンプルAIアプリ</h1>
<div id="content">
<div>
<label for="ai-prompt">AIに送るプロンプト:</label>
<textarea id="ai-prompt"></textarea>
</div>
<button id="send-button">送信</button>
<h2>AIの回答</h2>
<div id="ai-result"></div>
</div>
</body>
<!-- <script src="script.js"></script> -->
</html>
このα版のHTMLは、必要最低限な要素で構成しています。あとで、レイアウトを考慮して修正することになるでしょう。
styles.css や script.js はまだ存在しないので、それを入力する部分はコメント化しています。
AIに送るプロンプトは複数行のテキストを入力できるように、<textarea>
にしました。
AIの回答を表示するエリアは<div id="ai-result">
です。その内側を script.js が書き換えます。
Denoサーバーを作成する
index.htmlをブラウザに表示するために、main.ts を作成して、Denoサーバーを動かせるようにします。
以下が、main.ts のコードです。
import { serveDir } from "https://deno.land/std@0.224.0/http/mod.ts";
function handler(req: Request) {
return serveDir(req, {
fsRoot: "public"
})
}
Deno.serve({ port: 3456 }, handler);
Deno.serve()の引数の { port: 3456 } により、localhost:3456ポートからサーバーにアクセスできます。
serveDir()の引数 { fsRoot: "public" } により、 public/ 以下のファイルをブラウザに送信します。
実際に試してみましょう。まずは、denoを起動します。
> deno run --allow-net --allow-read src/server/main.ts
Listening on http://0.0.0.0:3456/
そして、ブラウザで localhost:3456/index.html にアクセスします。次のように表示されました。
今回までの作業状況
/project-root
|-- /public
| |-- index.html(New)
| |-- styles.css(未着手)
| |-- script.js(未着手)
|-- /src
| |-- /client
| | |-- script.ts(未着手)
| |-- /server
| |-- main.ts(New)
コメント