295 lines
14 KiB
Markdown
295 lines
14 KiB
Markdown
---
|
||
name: setting-up-comment-tool
|
||
description: 音声図解コメントツールの初期セットアップ(Vercel・Neon・Gemini APIキー)を対話的にガイドするスキル。「セットアップして」「セットアップの続きをして」「コメントツールをセットアップして」「フィードバック機能を設定して」「音声図解コメントツールを使えるようにして」と依頼された際、および「コメントが保存されません」などセットアップ起因のトラブル調査を求められた際に使用する。
|
||
---
|
||
|
||
# Setting Up Comment Tool
|
||
|
||
図解に対するコメント機能(テキスト引用・ピン・音声)を使えるようにする初期セットアップ。Vercel(ホスティング)・Neon Postgres(データベース)・Gemini APIキー(音声解析)の設定を対話的にガイドする。
|
||
|
||
**実行するのは1回だけ。** セットアップ完了後は、図解を作ってsurge.shにデプロイするだけで自動的にコメント機能が付く。
|
||
|
||
## 用語の定義
|
||
|
||
- **ツールフォルダ**: このツール本体(`package.json` の name が `voice-diagram-comment-tool` のフォルダ)。`npm` / `vercel` コマンドはすべてここで実行する
|
||
- **リポジトリルート**: `.claude` フォルダがある階層。`fb-tool-url.txt` / `fb-api-token.txt` はここに保存する(デプロイスクリプトがここから読むため)
|
||
|
||
## Step 0: ツールフォルダの特定
|
||
|
||
1. ワークスペースのルートに `package.json` があり、name が `voice-diagram-comment-tool` なら、ルートがツールフォルダ(単体利用)
|
||
2. なければ、ワークスペース内から name が `voice-diagram-comment-tool` の `package.json` を探す(別リポジトリに組み込んだ利用。フォルダ名は通常 `voice-diagram-comment`)
|
||
3. 見つからない場合、以下を伝えて終了:
|
||
|
||
> ツール本体のフォルダが見つかりません。「voice-diagram-comment」(音声図解コメントツール)フォルダがこのリポジトリ内にあるか確認してください。
|
||
|
||
## 前提確認
|
||
|
||
### Node.js
|
||
|
||
```bash
|
||
node --version
|
||
```
|
||
|
||
バージョン番号が表示された → 次に進む。
|
||
`command not found` → `.claude/skills/creating-visual-explainers/references/node-install-guide.md` の手順でインストールを案内する。
|
||
|
||
### Vercel CLI
|
||
|
||
```bash
|
||
vercel --version
|
||
```
|
||
|
||
バージョン番号が表示された → 次に進む。
|
||
`command not found` → 以下を実行:
|
||
|
||
```bash
|
||
npm install -g vercel
|
||
```
|
||
|
||
## ワークフロー
|
||
|
||
以降のコマンドは、明記がない限り**ツールフォルダで実行する**。
|
||
|
||
### Step 1: 依存関係のインストール
|
||
|
||
```bash
|
||
npm install
|
||
```
|
||
|
||
### Step 2: Vercelにログイン
|
||
|
||
```bash
|
||
vercel login
|
||
```
|
||
|
||
ブラウザが開く。以下を伝える:
|
||
|
||
> ブラウザでVercelのログイン画面が開きます。
|
||
> アカウントを持っていない場合は「Sign Up」から無料アカウントを作成してください。
|
||
> メールアドレスまたはGitHubアカウントで登録できます。
|
||
> ログインが完了したら、ターミナルに戻ってください。
|
||
|
||
### Step 3: Vercelに初回デプロイ
|
||
|
||
先にデプロイしてVercelプロジェクトを作成する(環境変数の設定にはプロジェクトが必要なため)。
|
||
|
||
自動命名に任せると名前の衝突などで不正になることがある。最初にプロジェクト名を明示してリンクする:
|
||
|
||
```bash
|
||
vercel link --yes --project voice-diagram-comment-tool
|
||
```
|
||
|
||
(同名プロジェクトが既にある等でエラーになったら、`voice-comment-tool-2` のように名前を変えて再実行する)
|
||
|
||
続いて本番デプロイ:
|
||
|
||
```bash
|
||
vercel --yes --prod
|
||
```
|
||
|
||
デプロイが完了すると以下の2つのURLが出力される。両方を控えておく:
|
||
|
||
- **Inspect URL**: `https://vercel.com/{slug}/{project}/...` 形式(Step 6 で使う)
|
||
- **Production URL**: `https://xxx.vercel.app` 形式(最終的なツールURL)
|
||
|
||
この時点では環境変数が未設定なのでツールはまだ動かない。そのまま次に進む。
|
||
|
||
### Step 4: APIトークンの生成と設定
|
||
|
||
APIを保護するためのトークンを生成し、Vercelの環境変数に設定する。
|
||
|
||
```bash
|
||
openssl rand -hex 16
|
||
```
|
||
|
||
**Windows(PowerShell)の場合:**
|
||
|
||
```powershell
|
||
[System.Guid]::NewGuid().ToString("N")
|
||
```
|
||
|
||
表示された文字列がトークン。これを環境変数として設定する:
|
||
|
||
```bash
|
||
echo "生成したトークン" | vercel env add API_TOKEN production
|
||
```
|
||
|
||
「生成したトークン」は実際に生成した値に置き換える。`vercel env add` が対話式プロンプトを出さずに値を受け取るよう、パイプで渡す。
|
||
|
||
同じトークンを**リポジトリルート**の `fb-api-token.txt` に保存する(1行、トークンのみ)。
|
||
|
||
### Step 5: Gemini APIキーの設定
|
||
|
||
音声フィードバック(喋った内容をAIが聞き取って図解にピンを配置する機能)に使うAPIキーを設定する。
|
||
|
||
ユーザーに以下を案内する:
|
||
|
||
> 音声フィードバックには Google の Gemini というAIを使います。無料のAPIキーを発行しましょう。
|
||
>
|
||
> 1. ブラウザで https://aistudio.google.com/apikey を開く
|
||
> 2. Googleアカウントでログイン
|
||
> 3. 「APIキーを作成」(Create API key)をクリック
|
||
> 4. 表示されたキー(`AIza...` で始まる文字列)をコピー
|
||
> 5. コピーしたキーをこのチャット欄に貼り付けてください
|
||
>
|
||
> 無料枠の範囲で使えます。クレジットカードの登録は不要です。
|
||
|
||
キーを受け取ったら設定する:
|
||
|
||
```bash
|
||
echo "受け取ったAPIキー" | vercel env add GEMINI_API_KEY production
|
||
```
|
||
|
||
**注意**: 受け取ったAPIキーは環境変数の設定にだけ使う。ファイルに書き出したり、チャットの返答で復唱したりしない。
|
||
|
||
### Step 6: データベースの追加
|
||
|
||
Step 3 の Inspect URL からデプロイID部分(末尾のランダム文字列)を削り、`/stores` を付けて Storage ページの直接URLを組み立てる。
|
||
|
||
例: Inspect URL が `https://vercel.com/your-projects/voice-diagram-comment-tool/abc123xyz` なら
|
||
→ `https://vercel.com/your-projects/voice-diagram-comment-tool/stores`
|
||
|
||
ユーザーにブラウザでの操作を案内する。以下の `{StorageページURL}` を組み立てたURLに置き換えて伝える:
|
||
|
||
> コメントを保存するデータベースを追加します。ブラウザで以下のURLを開いてください。
|
||
>
|
||
> {StorageページURL}
|
||
>
|
||
> ページが開いたら、以下の操作をしてください。
|
||
>
|
||
> 1. 「Create Database」をクリック
|
||
> 2. 「Neon Postgres」を選択
|
||
> 3. プランは「Free」を選択(無料、クレジットカード不要)
|
||
> 4. 「Create」をクリック
|
||
> 5. 次の画面で:
|
||
> - 「Search Projects」からプロジェクトを選択
|
||
> - 「Custom Prefix」の欄を `DATABASE` に変更
|
||
> - 「Connect」をクリック
|
||
>
|
||
> 完了したら教えてください。
|
||
|
||
### Step 7: 環境変数の取得とマイグレーション
|
||
|
||
```bash
|
||
vercel env pull .env.local
|
||
```
|
||
|
||
テーブルを作成:
|
||
|
||
```bash
|
||
npm run db:migrate
|
||
```
|
||
|
||
`Migration complete.` と表示されれば成功。
|
||
|
||
### Step 8: 再デプロイ
|
||
|
||
環境変数を反映するため、もう一度デプロイする。
|
||
|
||
```bash
|
||
vercel --prod
|
||
```
|
||
|
||
### Step 9: URLを保存する
|
||
|
||
ツールの**固定URL**(`https://プロジェクト名.vercel.app` 形式。通常は `https://voice-diagram-comment-tool.vercel.app`)を、**リポジトリルート**の `fb-tool-url.txt` に書き出す。URLのみを1行で保存する。
|
||
|
||
**注意**: `vercel --prod` の出力に表示されるランダム文字列入りのURL(例: `https://voice-diagram-comment-tool-a1b2c3-xxx.vercel.app`)は保存しない。デプロイ固有URLはVercelの保護機能により外部から読めないことがある。
|
||
|
||
保存したら、公開ページから widget.js に到達できることを確認する:
|
||
|
||
```bash
|
||
curl -s -o /dev/null -w "%{http_code}" "$(cat fb-tool-url.txt)/widget.js"
|
||
```
|
||
|
||
**Windows(PowerShell)の場合:**
|
||
|
||
```powershell
|
||
(Invoke-WebRequest "$((Get-Content fb-tool-url.txt).Trim())/widget.js").StatusCode
|
||
```
|
||
|
||
`200` ならOK。`404` や `401` が返る場合は、Vercelダッシュボードのプロジェクト → Settings → Domains に表示されているドメインを確認し、そのURLで `fb-tool-url.txt` を保存し直して再確認する。
|
||
|
||
### Step 10: 音声解析APIの通し検証
|
||
|
||
widget.js は静的ファイルなので、これだけではAPI(サーバーレス関数)が動いている保証にならない。無音の音声データを実際に `/api/voice-analyze` へ送り、Gemini まで通ることを確認する。
|
||
|
||
まず、16kHz・モノラル・1秒の無音WAVを生成してbase64化し、リクエストボディを組み立てる(**リポジトリルート**で実行):
|
||
|
||
```bash
|
||
node -e '
|
||
const sr = 16000, dataLen = sr * 2; // 16bit mono 1秒
|
||
const b = Buffer.alloc(44 + dataLen);
|
||
b.write("RIFF", 0); b.writeUInt32LE(36 + dataLen, 4); b.write("WAVE", 8);
|
||
b.write("fmt ", 12); b.writeUInt32LE(16, 16); b.writeUInt16LE(1, 20); b.writeUInt16LE(1, 22);
|
||
b.writeUInt32LE(sr, 24); b.writeUInt32LE(sr * 2, 28); b.writeUInt16LE(2, 32); b.writeUInt16LE(16, 34);
|
||
b.write("data", 36); b.writeUInt32LE(dataLen, 40);
|
||
const body = {
|
||
audioBase64: b.toString("base64"),
|
||
mimeType: "audio/wav",
|
||
targets: [{ index: 0, text: "テスト", heading: "テスト", isHeading: true }],
|
||
};
|
||
require("fs").writeFileSync("/tmp/fb-voice-check.json", JSON.stringify(body));
|
||
'
|
||
```
|
||
|
||
**Windows(PowerShell)の場合**: 上と同じ `node -e` スクリプトを実行し、出力先だけ `$env:TEMP + "\\fb-voice-check.json"` に読み替える(`node -e` はWindowsでも動く)。
|
||
|
||
続いて、APIトークンを付けてPOSTする:
|
||
|
||
```bash
|
||
curl -s -w "\n%{http_code}" -X POST "$(cat fb-tool-url.txt)/api/voice-analyze" \
|
||
-H "Authorization: Bearer $(cat fb-api-token.txt)" \
|
||
-H "Content-Type: application/json" \
|
||
--data @/tmp/fb-voice-check.json
|
||
```
|
||
|
||
結果の判定:
|
||
|
||
- **HTTP 200 で `{"results":[]}`**(無音なので空配列)→ 音声解析まで通しで動いている。セットアップ成功
|
||
- **HTTP 404** → APIルートがデプロイされていない。Vercelのビルド設定の問題(エラー対応の「音声の解析に失敗しました」を参照)
|
||
- **`Gemini エラー` を含む応答** → Geminiのモデル名またはAPIキーの問題(エラー対応の「Gemini エラー (404)」を参照)
|
||
- **HTTP 403** → `fb-api-token.txt` の値と Vercel の `API_TOKEN` が食い違っている。Step 4 をやり直す
|
||
|
||
### Step 11: 完了報告
|
||
|
||
リポジトリルートに `fb-tool-url.txt` と `fb-api-token.txt` があることを確認し、以下を伝える:
|
||
|
||
```
|
||
セットアップ完了
|
||
|
||
あなたのコメントツール URL:
|
||
https://xxx.vercel.app
|
||
|
||
以降「図解を作って」と伝えるだけで、コメント機能付きの図解が公開されます。
|
||
|
||
公開した図解では、3通りの方法でフィードバックできます:
|
||
- テキストをマウスで選択してコメント
|
||
- 好きな場所にピンを刺してコメント
|
||
- マイクに向かって喋るだけ(AIが該当箇所にピンを自動配置)
|
||
|
||
APIはトークンで保護されています。図解のデプロイ時に自動で埋め込まれるため、
|
||
追加の操作は不要です。
|
||
```
|
||
|
||
`fb-tool-url.txt` / `fb-api-token.txt` / `.env.local` はGitにコミットしない(このフォルダの `.gitignore` で除外済み。別リポジトリに組み込んでいる場合は、そのリポジトリの `.gitignore` にも追加するよう案内する)。
|
||
|
||
## エラー対応
|
||
|
||
エラーメッセージをそのまま見せず、何が起きていて何をすれば解決するかを平易に説明する。
|
||
|
||
- **`vercel: command not found`** → `npm install -g vercel` を実行
|
||
- **`DATABASE_URL is not set`** → Step 6のデータベース追加が完了しているか確認。完了していれば `vercel env pull .env.local` を再実行
|
||
- **マイグレーション失敗** → ツールフォルダの `.env.local` に `DATABASE_URL` が含まれているか確認
|
||
- **音声フィードバックで「GEMINI_API_KEY が未設定です」** → Step 5が完了しているか `vercel env ls` で確認し、設定後に `vercel --prod` で再デプロイ
|
||
- **「音声の解析に失敗しました」** → まず `/api/voice-analyze` が404を返していないか確認する(`curl -s -o /dev/null -w "%{http_code}" -X POST "$(cat fb-tool-url.txt)/api/voice-analyze"` — 404以外=APIは存在する)。404ならAPIルートがデプロイされていない。原因はVercelのビルド設定: `vercel.json` に `buildCommand` を直接書くとVercelがNext.jsを認識できず、APIが生成されない。ツールフォルダの `vercel.json` が `{"framework": "nextjs"}` のみで、`package.json` に `vercel-build` スクリプトがあることを確認し、`vercel --prod` で再デプロイする
|
||
- **「Gemini エラー (404)」** → 指定中のGeminiモデルが新規APIキーでは利用不可になっている(例: `gemini-2.5-flash` は新規ユーザーに提供終了)。`echo "gemini-flash-latest" | vercel env add GEMINI_MODEL production` で環境変数を設定し、`vercel --prod` で再デプロイする(ツールが最新版なら既定値が `gemini-flash-latest` のためこのエラーは起きない)
|
||
- **「コメントが保存されません」と相談された** → 順に切り分ける: ①Step 9の到達確認(widget.js が200か)②`vercel env ls` で `DATABASE_URL` と `API_TOKEN` が production にあるか ③マイグレーション済みか(`vercel env pull .env.local` → `npm run db:migrate`)④環境変数を後から足した場合は `vercel --prod` で再デプロイしたか
|
||
|
||
## 依存
|
||
|
||
- ツールフォルダの `package.json` — 依存関係と `db:migrate` スクリプト
|
||
- ツールフォルダの `scripts/migrate.ts` — DBマイグレーションスクリプト
|
||
- `.claude/skills/creating-visual-explainers/references/node-install-guide.md` — Node.jsインストール手順
|
||
- `.claude/skills/creating-visual-explainers/scripts/deploy-diagram.sh` — `fb-tool-url.txt` / `fb-api-token.txt` の読み取り側
|