logo

SavvyBot
会話を邪魔しない、グループチャット専属AIアシスタント

AI / チャットボット開発フルスタック開発 / プロダクトオーナー / アーキテクト2023年3月〜現在(進行中)2025-10-25

LINE Messaging APIとOpenAI APIを連携させた対話型チャットボット。GAS MVP実装から始まり、Supabase Edge Functionsへの移行を完了。個人向けから「グループチャット特化型AIアシスタント」への戦略的ピボットを経て、管理ダッシュボード実装完了。SaaS化に向けた収益化フェーズへ。

Technologies Used

Supabase Edge FunctionsLINE Messaging APIOpenAI Function CallingTavily APIDenoTypeScriptPostgreSQLGitHub ActionsHMAC-SHA256Next.js 15shadcn/uiRechartsSupabase Auth

プロジェクト概要

SavvyBotは、LINE Messaging APIとOpenAI APIを連携させた対話型チャットボットです。Google Apps Script(GAS)でのMVP実装から開始し、Supabase Edge Functionsへの移行を完了(Phase 2)。現在はグループチャット特化型AIアシスタントへの戦略的ピボットを経て、SaaS化に向けた開発フェーズ(Phase 3)に移行しています。

コアコンセプト

「会話を邪魔しない、グループチャット専属AIアシスタント」

  • 人の会話の邪魔をしない(基本は沈黙、裏で記録・分析)
  • 裏方に徹する(コマンドで呼ばれた時だけ発言)
  • まとめる、追跡する、リマインドする(議事録、決定事項、TODO管理)

ビジネス目標

年内に収益化の可能性を探る(副業ベース、リーンスタートアップアプローチ)

技術スタック

バックエンド

  • TypeScript / Deno
  • Supabase Edge Functions
  • LINE Messaging API
  • OpenAI API(GPT-4 + Function Calling)
  • Tavily API(Web検索)

インフラ・DevOps

  • GitHub Actions(CI/CD)
  • Supabase CLI
  • HMAC-SHA256署名検証

将来のフロントエンド

  • Next.js / React
  • Tailwind CSS

プロジェクトの進化

Phase 1: GAS での MVP(2023年3月 - 完了)

LINE Messaging APIとOpenAI APIの基本連携を実現。簡易的なチャットボット機能を実装しましたが、セキュリティ脆弱性とシークレット管理の困難さが課題となりました。

Phase 2: Supabase Edge Functionsへの移行(2025年10月 - 完了)

達成事項

  • HMAC-SHA256署名検証の実装(セキュリティ強化)
  • Result型によるエラーハンドリング
  • 構造化ログによる可観測性の確保
  • GitHub ActionsによるCI/CDパイプライン構築
  • 実機テストでの動作確認完了

技術的成果

  • 署名検証エラー(403 Forbidden)の解決
  • 非同期Web Crypto APIの正しい実装
  • 定数時間比較によるタイミング攻撃対策
  • 診断ログによる運用性向上

Phase 3: 戦略的ピボット(2025年10月 - 完了)

背景と課題認識(2025年10月ブレインストーミングセッション)

  • 個人向けチャットボットは無料のChatGPTと差別化が困難
  • 市場分析の結果、グループチャット領域に明確なペインポイントを発見
  • 収益化可能性の探索のため、ニッチ市場への特化を決定

差別化戦略

競合(ChatGPT公式、他社Bot)の弱点:

  • 個人利用がメイン
  • グループでは会話に割り込んでうるさい
  • 議事録機能が弱い
  • 最新情報の取得が不十分

SavvyBotの強み:

  • グループチャット特化
  • 沈黙がデフォルト(会話を邪魔しない)
  • 構造化された議事録
  • 決定事項の自動追跡
  • 豊富なコマンド体系(/sv:* プレフィックス)
  • Web検索統合で最新情報に対応

Phase 3の成果

  • Phase 3.2: Web検索統合(OpenAI Function Calling + Tavily API)
  • Phase 3.3: Personal Mode実機テスト(Web検索機能の包括的検証)
  • Phase 3.4: Group Mode実機テスト + /sv:questions コマンド実装

Phase 4: API使用量トラッキング(2025年10月 - 完了)

SaaS化に向けた基盤整備として、API使用量の自動トラッキングシステムを構築しました。

達成内容

  • OpenAI API使用量の自動記録(トークン数、コスト)
  • グループ別・日次集計ビュー
  • Personal Mode自動検出バグ修正
  • PostgreSQLでのコスト計算関数実装
  • 実機テスト成功(複数ユーザーで動作確認)

はじめに
動くものから、人の役に立つものへ

2023年3月、ChatGPTの登場に刺激を受けて、個人的な実験として開発を始めました。「AIを使ったLINE Botが動くかどうか試してみたい」――最初はただそれだけでした。

動くだけで満足していた頃

Google Apps Scriptで署名検証もなく、セキュリティも考えず、ただ「動く」ことに喜びを感じていました。自分と数人の友人が使えれば十分。技術的な興味が満たされれば、それで良かったのです。

使ってくれる人が増えてきた

気づけば、登録者が30名弱まで増えていました。「便利だから使ってる」「助かってる」という声をもらうようになって、意識が変わりました。

動くものから、人の役に立つものへ

「動くだけで満足」から「多くの人に使ってもらいたい」という気持ちに変わったとき、プロジェクトの方向性を見直す必要性を感じました。

個人向けChatGPTは、すでに完成されている。無料で使えるChatGPT公式アプリは、個人ユーザーにとって完璧に近い体験を提供しています。

グループチャットには、まだ解決されていない課題がある

一方、グループチャットでのAI活用には明確なペインポイントがありました:

  • 既存のBotは会話に割り込んでうるさい
  • 議事録作成が手動で面倒
  • 決定事項が埋もれて見つからない
  • TODOが口約束で終わってしまう

この気づきから、「グループチャット特化型AIアシスタント」へのピボットを決断しました。単なる技術実験から、本当に人の役に立つプロダクトへ。


コアコンセプト
会話を邪魔しない裏方AI

SavvyBotは、グループチャットでの裏方に徹する設計思想を持っています。

基本は沈黙

  • 人の会話に割り込まない
  • 裏で会話を記録・分析
  • コマンドで呼ばれた時だけ発言

まとめる、追跡する、リマインドする

  • 議事録の自動生成
  • 決定事項の追跡
  • TODOの管理
  • 質問と回答のトラッキング

モード設計

個人モード(1対1チャット)

  • 積極的に会話
  • 会話履歴保持
  • ChatGPT的な対話体験

グループモード(複数人チャット)

  • 基本は沈黙
  • 裏で記録・分析
  • コマンドで呼ばれた時のみ発言

Phase 2完了
堅牢な基盤の構築

セキュリティの強化

GASでは困難だった署名検証を、Supabase Edge Functionsで実装しました。

HMAC-SHA256による署名検証

export async function verifyLineSignature(
  body: string,
  signature: string,
  channelSecret: string
): Promise<boolean> {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw',
    enc.encode(channelSecret),
    { name: 'HMAC', hash: 'SHA-256' },
    false,
    ['sign']
  )

  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(body))
  const calcB64 = btoa(String.fromCharCode(...new Uint8Array(sig)))

  // Constant-time比較(タイミング攻撃対策)
  if (calcB64.length !== signature.length) return false
  let diff = 0
  for (let i = 0; i < calcB64.length; i++) {
    diff |= calcB64.charCodeAt(i) ^ signature.charCodeAt(i)
  }
  return diff === 0
}

セキュリティ対策

  • HMAC-SHA256による署名検証
  • Constant-time比較(タイミング攻撃防止)
  • テキストサニタイゼーション
  • 環境変数検証(Zodスキーマ)

CI/CDパイプラインの構築

GitHub Actionsによる自動デプロイを実現しました。

name: Deploy to Supabase
on:
  push:
    branches: [main]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Supabase CLI
        uses: supabase/setup-cli@v1
      - name: Deploy Function
        run: supabase functions deploy savvybot

デプロイフロー

  1. mainブランチへpush
  2. GitHub Actionsが自動起動
  3. Supabase CLIでシークレット設定
  4. Edge Functionデプロイ
  5. 本番環境に即座反映

実機テスト成功

2025年10月13日、署名検証からLINE API連携まで、エンドツーエンドでの動作を確認しました。

テスト結果

  • 署名検証:成功(403エラーなし)
  • LINE API:成功(401エラーなし)
  • メッセージ送受信:正常動作

Phase 3.2完了
Web検索と時間認識の実装

OpenAI Function Callingによる自動ツール選択

Tavily APIとOpenAI Function Callingを組み合わせ、AIが自動的に最新情報が必要かを判断し、Web検索を実行する機能を実装しました。

ツール定義

const SEARCH_TOOLS = [
  {
    type: 'function',
    function: {
      name: 'search_web',
      description: '最新の情報やニュースをWeb検索します。',
      parameters: {
        type: 'object',
        properties: {
          query: { type: 'string', description: '検索クエリ' },
        },
        required: ['query'],
      },
    },
  },
]

const response = await openai.chat.completions.create({
  model: 'gpt-4o-mini',
  messages,
  tools: SEARCH_TOOLS,
  tool_choice: 'auto', // AIが必要性を判断
})

自動判断の流れ

  1. ユーザー:「去年のワールドシリーズで優勝したチームは?」
  2. AI:最新情報が必要と判断 → search_webを呼び出し
  3. システム:Tavily APIでWeb検索実行
  4. AI:検索結果を基に回答生成 → 「2024年ロサンゼルス・ドジャース」

時間表現の正確な解釈(Temporal Context Pattern)

問題: AIモデルの学習データカットオフ(2023年10月)により、「去年」などの相対的な時間表現が誤って解釈される

  • ユーザー:「去年のワールドシリーズで優勝したチームは?」
  • AI(誤):2022年のデータを返答(学習カットオフの視点から「去年=2022年」と解釈)

解決策: システムプロンプトに現在日付を動的に追加

const now = new Date()
const currentDate = now.toISOString().split('T')[0] // YYYY-MM-DD
const enhancedSystemPrompt = `${config.app.systemPrompt}

【重要】今日の日付: ${currentDate}
「去年」「今年」「最近」などの時間表現は、この日付を基準に解釈してください。`

const messages: OpenAIMessage[] = [
  { role: 'system', content: enhancedSystemPrompt },
  // ...
]

結果

  • 現在日付(2025-10-16)を明示
  • AIが「去年=2024年」と正しく認識
  • Web検索を実行
  • 正確に2024年ロサンゼルス・ドジャースの優勝を回答

3つの根本原因と段階的解決

  1. TAVILY_API_KEYがGitHub Actionsワークフローに含まれていない → 追加
  2. SYSTEM_PROMPTが空白で、Web検索使用の指示がない → 指示を含むプロンプトを設定
  3. 時間表現をAIが学習データの視点から解釈 → 現在日付を動的に追加(決定的な解決策)

Phase 3.3完了
Personal Mode 実機テスト

Web検索機能の包括的検証(2025年10月17日)

Phase 3.2で実装したWeb検索機能を、実際のLINE環境で包括的にテストしました。

テストシナリオ

  1. ノーベル物理学賞2024: AIの知識カットオフ後の情報
  2. 最新iPhone価格: カットオフ8ヶ月後の製品情報
  3. 大谷翔平ニュース: 最新スポーツ情報
  4. 第二次世界大戦終結: 学習データ内の歴史的事実

テスト結果(4/4 PASS, 100%達成率)

  • ノーベル物理学賞2024 → Hopfield & Hinton(正確な受賞者情報)
  • 最新iPhone価格 → iPhone 17シリーズ価格(知識カットオフ8ヶ月後の製品)
  • 大谷翔平ニュース → 50-50達成、プレーオフ勝利(最新スポーツ情報)
  • 第二次世界大戦終結 → 1945年(学習データから回答、Web検索不使用)

重要な発見

iPhone 17ケース: AI知識カットオフ(2025年1月)の8ヶ月後にリリースされた製品の正確な価格情報を取得できました。これはWeb検索の価値を完璧に実証するケースです。学習データのみでは不可能な情報提供が可能になっています。

ツール呼び出し判定の精度: 「最新」というキーワードで検索を実行し、歴史的事実は学習データを使用するという適切な判断を確認しました。

時間表現解釈: 現在日付コンテキストの効果を実証し、「去年」を正しく2024年と認識できることを確認しました。


Phase 3.4完了
Group Mode 実機テスト + ,[object Object], コマンド

グループチャット機能の完全実装(2025年10月19日)

達成事項

  • グループチャット設定問題の解決(LINE設定でグループ参加許可が必要)
  • 全コマンドの実機テスト成功(/sv:help, /sv:minutes, /sv:decisions, /sv:todo
  • グループモードのサイレント動作確認(通常メッセージには反応しない)
  • 自動抽出機能の検証(100%精度で決定事項・TODO抽出)
  • 構造化議事録生成の動作確認

技術的成果

  • TODO表示バグ修正([object Object] → スマートな Object/String 処理)
  • 全コマンドのレスポンスタイム目標達成(<5秒)
  • 議事録生成の高品質出力確認(OpenAI Function Calling活用)

/sv:questions コマンド実装

機能概要

グループチャット内の質問を自動的に抽出・追跡し、未回答の質問を可視化する機能です。

主要機能

  • 質問の自動抽出と表示
  • 重複チェック機能(1時間以内の同一質問をスキップ)
  • 日本時間(JST)表示対応(全コマンド統一)
  • フィルター機能(unanswered/all)

実装詳細

// 重複チェック機能
async checkQuestionDuplicate(
  groupId: string,
  question: string,
  withinMinutes: number = 60
): Promise<boolean> {
  const { data, error } = await this.client
    .from('questions')
    .select('id')
    .eq('group_id', groupId)
    .eq('question', question)
    .gte('asked_at', new Date(Date.now() - withinMinutes * 60 * 1000).toISOString())
    .limit(1)
  return (data && data.length > 0) || false
}

日本時間表示の統一

// JST変換の統一実装
const jstDate = new Date(isoString).toLocaleString('en-US', {
  timeZone: 'Asia/Tokyo'
})

実機テスト結果

  • 質問抽出精度:100%
  • 重複チェック:正常動作(1時間以内の同一質問を適切にスキップ)
  • JST表示:全コマンドで統一実装完了
  • ユーザーID表示:シンプル表示に改善

Phase 4完了
API 使用量トラッキング実装

自動コスト管理システムの構築(2025年10月19日)

SaaS化に向けて、OpenAI API使用量の自動トラッキングシステムを実装しました。

達成事項

  • OpenAI API使用量の自動トラッキング
  • トークン数とコスト計算の記録
  • グループごとの使用量集計
  • Personal mode自動検出バグ修正
  • 実機テスト成功(複数ユーザーで動作確認)

データベーススキーマ

usage_logs テーブル: API使用履歴を記録

CREATE TABLE usage_logs (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  group_id TEXT NOT NULL,
  operation_type TEXT NOT NULL,
  model TEXT NOT NULL,
  prompt_tokens INTEGER NOT NULL,
  completion_tokens INTEGER NOT NULL,
  total_tokens INTEGER NOT NULL,
  estimated_cost_usd NUMERIC(10, 6) NOT NULL,
  created_at TIMESTAMPTZ DEFAULT NOW(),
  expires_at TIMESTAMPTZ DEFAULT (NOW() + INTERVAL '365 days')
);

集計ビュー

  • daily_usage_summary: 日次集計
  • group_usage_summary: グループ別集計

コスト計算関数: PostgreSQLでのモデル別価格計算

CREATE FUNCTION calculate_openai_cost(
  model TEXT,
  prompt_tokens INTEGER,
  completion_tokens INTEGER
) RETURNS NUMERIC AS $$
BEGIN
  RETURN CASE model
    WHEN 'gpt-4o' THEN
      (prompt_tokens * 2.50 / 1000000.0) + (completion_tokens * 10.00 / 1000000.0)
    WHEN 'gpt-4o-mini' THEN
      (prompt_tokens * 0.15 / 1000000.0) + (completion_tokens * 0.60 / 1000000.0)
    -- ...
  END;
END;
$$ LANGUAGE plpgsql;

使用量トラッキングロジック

OpenAI API関数の拡張

全API関数の戻り値に使用量情報を追加しました:

  • getAIResponseAIResponseWithUsage
  • getAIResponseWithToolsAIResponseWithUsage
  • extractInformationExtractionResultWithUsage
  • generateStructuredMinutesStructuredMinutesWithUsage
export interface UsageInfo {
  prompt_tokens: number
  completion_tokens: number
  total_tokens: number
}

export type AIResponseWithUsage = Result<
  { response: string; usage: UsageInfo },
  AppError
>

使用量ロギング

await logUsage(
  groupId,
  'personal_chat',
  'gpt-4o',
  usage.prompt_tokens,
  usage.completion_tokens,
  usage.total_tokens
)

Personal Mode 自動検出バグの解決

問題: 新規ユーザーが1対1チャットでメッセージを送っても返信がない(group_mode.silent と認識される)

根本原因: getOrCreateGroupSettings() がデフォルトで mode: 'group' を設定していた

修正内容

  • getOrCreateGroupSettings()defaultMode パラメータを追加
  • モード検出を2段階に分離:
    1. 自動検出(settings なし)→ autoMode
    2. settings 取得時に autoMode.mode をデフォルトとして渡す
    3. 最終的なモード決定(settings を含めて再検出)

結果: source.type === 'user'mode: 'personal' で作成、source.type === 'group'mode: 'group' で作成

実機テスト結果

Personal Chat:
  operation_type: "personal_chat"
  model: "gpt-4o"
  total_tokens: 414, 706
  estimated_cost: $0.001155, $0.001923

Auto Extraction:
  operation_type: "auto_extraction"
  model: "gpt-4o"
  total_tokens: 485-506
  estimated_cost: $0.001317-$0.001490

Group Summary:
  2ユーザー、9回の操作
  合計4,572トークン
  推定コスト: $0.012795(約1.9円)

技術的成果

  • 型安全な使用量トラッキング(Result型パターンの維持)
  • エラーハンドリング完備(失敗時も処理継続)
  • リアルタイムコスト推定(トークン数からUSDコストを自動計算)
  • 1年間のデータ保持期間(TTL: 365 days)
  • インデックス最適化とビューによる高速集計

Phase 5完了
管理ダッシュボード実装

公式Webサイトと認証システムの構築(2025年10月24-25日)

SaaS化に向けた重要なマイルストーンとして、管理ダッシュボードを完全実装しました。

達成事項

  • Next.js 15プロジェクトセットアップ(TypeScript + Tailwind CSS + shadcn/ui)
  • Supabase Auth統合(email/password認証)
  • データベーススキーマ実装(8テーブル + RLS policies)
  • 認証フロー(login/signup/callback)
  • ミドルウェアによるルート保護
  • セッション管理

実装した管理機能

1. ランディングページ

  • Hero Section(SavvyBotキャラクター画像配置)
  • Features Section(4つの主要機能)
  • How to Use Section(3ステップガイド)
  • Pricing Section(3プラン: 個人/チーム/ビジネス)
  • CTA Section(行動喚起)
  • Footer(ナビゲーションリンク)
  • SEO最適化(メタデータ、OpenGraph)
  • レスポンシブデザイン(モバイルファースト)
  • ダークモード対応

2. ダッシュボードレイアウト

  • サイドバーナビゲーション
  • ヘッダーとユーザープロフィールドロップダウン
  • サインアウト機能
  • レスポンシブデザイン

3. ダッシュボードホーム

  • 概要統計表示(グループ数、会話数、トークン、コスト)
  • アクティビティフィード
  • クイックアクションカード
  • ウェルカムメッセージ

4. 使用量ダッシュボード

  • 期間フィルター(7/30/90日)
  • トークン使用量バーチャート(Recharts)
  • コストトレンドラインチャート
  • グループ別統計テーブル
  • データ集計とゼロ埋め処理

5. グループ管理UI

  • グループ一覧ページ(カード表示)
  • グループ詳細ページ(統計 + 設定)
  • 設定エディター(権限ベース)
  • モード選択(personal/group)
  • 自動機能トグル(4種類)
  • 権限システム実装(owner/admin/member)

6. 設定ページ

  • ユーザープロフィール設定
  • LINE連携状態表示
  • 通知設定(メール通知トグル)
  • アカウント管理(パスワード変更、アカウント削除)
  • 2段階確認フロー(アカウント削除)

データベース設計

8テーブル + RLS policies

  • profiles: ユーザープロフィール
  • user_groups: ユーザー-グループ関連(role: owner/admin/member)
  • group_settings: グループ設定(mode, auto_features)
  • conversations: 会話履歴(90日TTL)
  • decisions: 決定事項
  • todos: タスク管理
  • questions: 質問追跡
  • usage_logs: API使用量(365日TTL)

Row Level Security(RLS)実装

  • ユーザー別データ分離
  • グループベースのアクセス制御
  • ロールベースの権限管理

プロダクションビルド成功

✓ Compiled successfully in 1464ms
✓ All 20 routes generated
✓ 0 TypeScript errors
✓ 0 ESLint errors (dashboard)

Total Bundle Size: 102 kB (shared)
Largest Page: /dashboard/usage (105 kB - Recharts)
All Other Pages: < 6 kB each

技術スタック

  • Next.js 15.5.6(App Router)
  • TypeScript 5
  • Tailwind CSS 4
  • shadcn/ui(Button, Card, Badge, Switch, Label, Table, Dropdown Menu)
  • Recharts(データ可視化)
  • Supabase(Auth, Database, RLS)

技術的成果

  • マイグレーションベースのスキーマ管理
  • セキュアな認証フロー(cookie-based sessions)
  • マルチテナント対応のデータ分離
  • 複雑なデータ集計ロジック
  • Recharts TypeScript型定義の解決
  • カスタムツールチップ実装
  • 日付連続性の確保(ゼロ埋め)
  • 楽観的UI更新
  • フォームバリデーション
  • パフォーマンス最適化(バンドルサイズ、ビルド時間)

技術的なハイライト

1. Result型による型安全なエラーハンドリング

従来のtry-catchではなく、RustのResult型をTypeScriptで実装し、コンパイル時にエラー処理の漏れを防ぎます。

export type Result<T, E = Error> =
  | { ok: true; value: T }
  | { ok: false; error: E }

// 使用例
const result = await openaiAdapter.sendMessage(userMessage, SYSTEM_PROMPT)

if (!result.ok) {
  logError(result.error)
  return err(new AppError('AI response failed'))
}

const aiResponse = result.value // 型安全にアクセス

2. SYSTEM_PROMPTの一元管理

会話のトーン、ルール、禁止事項を一箇所に集約し、チーム全体で簡単に更新・レビューできる仕組みを構築しました。

export const SYSTEM_PROMPT = `
あなたは親切で知識豊富なアシスタントです。

【応答ルール】
- 簡潔で分かりやすい日本語で回答してください
- 不確実な情報には「〜かもしれません」など推測であることを明示

【禁止事項】
- 医療・法律の専門的アドバイス
- 金融商品の取引推奨
`

3. 依存性逆転の原則(DIP)適用

アダプターパターンにより、外部APIに依存しない設計を実現。OpenAIから別のAIサービスへの切り替えも容易です。

export interface ChatAdapter {
  sendMessage(prompt: string, systemPrompt: string): Promise<Result<string, Error>>
}

export class OpenAIAdapter implements ChatAdapter {
  async sendMessage(prompt: string, systemPrompt: string) {
    // 実装
  }
}

// 実行時に具体的な実装を注入
const openaiAdapter = new OpenAIAdapter(config)
const service = new ConversationService(openaiAdapter)

// テスト時はモックを注入
const mockAdapter = new MockChatAdapter()
const testService = new ConversationService(mockAdapter)

4. 構造化ログによる可観測性

JSON形式の構造化ログで、障害時の原因特定を迅速化しました。

interface LogContext {
  request_id: string      // リクエスト追跡
  user_id?: string        // ユーザー識別
  event_type: string      // イベント種別
  latency_ms?: number     // レイテンシ計測
  error_code?: string     // エラー分類
}

logRequest({
  request_id: 'req_abc123',
  user_id: 'U1234567',
  event_type: 'message.received',
  latency_ms: 234
}, 'Message processed successfully')

解決した課題

1. セキュリティの脆弱性

課題: GASでは署名検証が困難で、不正なリクエストを防げない

解決策: HMAC-SHA256 + Constant-time comparisonによる堅牢な署名検証を実装しました。

2. シークレット管理の改善

課題: GASではスクリプトプロパティに直接保存、Git管理が困難

解決策

  • .env.exampleでテンプレート管理
  • Supabase SecretsでセキュアにSecret管理
  • GitHub Actionsでの自動デプロイ時に環境変数を注入

3. テスタビリティとメンテナンス性

課題: GASでは依存関係が密結合で、テストが困難

解決策: アダプターパターンで外部APIを抽象化し、モックに差し替え可能な設計にしました。

4. 運用性の向上

課題: エラーログが不十分で、障害時の原因特定が困難

解決策: 構造化ログで可観測性を確保しました。


実装済み機能

LINEボット機能

コマンド体系/sv: プレフィックス)

  • /sv:help - ヘルプ表示
  • /sv:minutes - 議事録生成
  • /sv:decisions - 決定事項確認
  • /sv:todo - TODO抽出
  • /sv:questions - 質問管理(未回答追跡)

自動抽出機能(OpenAI Function Calling活用)

  • 議題の自動抽出
  • 決定事項の検出と追跡
  • TODOの自動リスト化
  • 質問の検出と未回答追跡

デュアルモード設計

  • 個人モード(1対1チャット): 積極的に会話、会話履歴保持、Web検索統合
  • グループモード(複数人チャット): 基本は沈黙、裏で記録・分析、コマンドで呼ばれた時のみ発言

Web検索統合

  • OpenAI Function Callingによる自動ツール選択
  • 最新情報の自動取得(Tavily API)
  • 時間表現の正確な解釈

管理ダッシュボード機能(NEW - Phase 5)

認証システム

  • Email/passwordサインアップ・ログイン
  • セッション管理
  • ルート保護
  • ロールベース権限制御(owner/admin/member)

ダッシュボード機能

  • 概要統計(グループ数、会話数、トークン、コスト)
  • 使用量グラフ(期間フィルター、トークン/コストチャート)
  • グループ管理(一覧、詳細、設定エディター)
  • 設定ページ(プロフィール、LINE連携、通知、アカウント管理)

データベース設計(Supabase PostgreSQL)

  • 8テーブル + RLS policies
  • profiles: ユーザープロフィール
  • user_groups: ユーザー-グループ関連
  • group_settings: グループ設定管理
  • conversations: 会話履歴の永続化(90日TTL)
  • decisions: 決定事項の追跡
  • todos: タスク管理
  • questions: 質問と回答のトラッキング
  • usage_logs: API使用量トラッキング(365日TTL)
  • インデックス最適化とビューによる高速集計

今後の展開

Phase 6: 収益化とリリース(2025年11月〜12月)

目標: SaaS化完了と正式リリース

  • Stripeサブスクリプション統合
  • 請求管理システム
  • プラン別機能制限
  • LINE Bot連携ガイド(ダッシュボード内)
  • クローズドベータテスト(5-10チーム)
  • フィードバック収集と改善
  • 正式リリース(年内目標)

収益モデル

  • Freeプラン: 個人利用(Personal modeのみ)、基本機能
  • Teamプラン(¥2,980/月): 3-10人チーム、全機能、グループ対応
  • Businessプラン(¥9,800/月): 11-50人、API連携、優先サポート

目標: 年内に5-30チームの有料ユーザー獲得、MRR ¥15,000-¥90,000

長期展望(2026年以降)

  • ナレッジベース機能(過去の決定事項・議事録の検索)
  • 多言語対応
  • エンタープライズ向け機能(SSO、監査ログ)
  • 音声会議の自動文字起こし&議事録生成
  • Slack/Teams連携

参考リソース

Phase 2: 基盤構築

Phase 3-4: グループチャット特化 & 使用量管理

Phase 5: 管理ダッシュボード


プロジェクトステータス

  • Phase 1完了(2023年3月): GAS MVP実装
  • Phase 2完了(2025年10月): Supabase Edge Functions移行、セキュリティ強化
  • Phase 3完了(2025年10月): 戦略的ピボット、グループチャット特化
    • ✅ Phase 3.2: Web検索統合(OpenAI Function Calling + Tavily API)
    • ✅ Phase 3.3: Personal Mode実機テスト(100%成功率)
    • ✅ Phase 3.4: Group Mode実機テスト + /sv:questions コマンド
  • Phase 4完了(2025年10月19日): API使用量トラッキング実装
  • Phase 5完了(2025年10月24-25日): 管理ダッシュボード実装
    • ✅ Phase 5.1: 公式Webサイト LP実装
    • ✅ Phase 5.2: 認証システム & データベース設計
    • ✅ Phase 5.3: ダッシュボード完全実装(7サブフェーズ)
    • ✅ Phase 5.3.7: 最終テスト & プロダクションビルド成功
  • 📅 Phase 6計画済み(2025年11月〜12月): Stripe統合、収益化、年内リリース目標

現在の機能実装状況

LINEボット:

  • グループチャット機能: 完全実装(議事録、決定事項、TODO、質問管理)
  • Web検索統合: 実機テスト完了(知識カットオフ超える情報取得を実証)
  • 使用量トラッキング: 自動記録・集計システム稼働中
  • コマンド体系: 5つの主要コマンド実装済み

管理ダッシュボード(NEW):

  • 認証システム: Supabase Auth完全統合
  • ダッシュボード: 全20ルート生成成功
  • データ可視化: Rechartsによる使用量グラフ
  • グループ管理: CRUD操作完備
  • 設定ページ: プロフィール・通知・アカウント管理
  • プロダクション品質: TypeScript型エラー0件、ビルド時間1.5秒

次のマイルストーン

  • 2025年11月末: Stripe統合完了(課金システム実装)
  • 2025年12月中旬: クローズドベータテスト開始(5-10チーム)
  • 2025年12月末: 正式リリース(一般公開)

Outcomes & Results

  • セキュリティ強化(HMAC-SHA256署名検証、タイミング攻撃対策)
  • Web検索統合(OpenAI Function Calling + Tavily API)
  • 時間表現解釈の精度向上(現在日付コンテキスト追加)
  • CI/CDパイプライン構築(GitHub Actions自動デプロイ)
  • グループチャット機能完全実装(議事録、決定事項、TODO、質問管理)
  • API使用量トラッキングシステム構築(コスト管理の自動化)
  • 管理ダッシュボード実装(Next.js 15、認証、データ可視化)
  • プロダクションビルド成功(1.5秒、TypeScript型エラー0件)

Challenges Overcome

  • 個人向けChatGPTとの差別化(戦略的ピボット)
  • 署名検証エラー(403 Forbidden)の解決
  • 時間表現の誤認識(「去年」が2022年と解釈される問題)
  • グループチャット特化機能の設計と実装
  • Personal Mode自動検出バグの解決
  • TODO表示とJST対応の実装
  • Recharts TypeScript型定義の解決

Key Learnings

  • Result型による型安全なエラーハンドリング
  • アダプターパターンによるテスタビリティ向上
  • OpenAI Function Callingによる自動ツール選択
  • Temporal Context Patternによる時間認識精度の改善
  • ニッチ市場への特化によるプロダクト差別化
  • PostgreSQLビューとTTLによる効率的なデータ管理
  • モード自動検出ロジックの段階的設計
  • Next.js App Routerとサーバーコンポーネントの活用
  • Row Level Security(RLS)によるマルチテナント実装
#LINE Bot#OpenAI API#Tavily API#Supabase#TypeScript#Deno#Function Calling#グループチャット#Next.js#SaaS

©2025 Natsuki Hayashida. All Rights Reserved.