AI執事 Pythonの基礎知識(実践編)

【Pythonの基礎知識】LINEとChatGPTで予定・タスク管理できるAI執事を自作する【最終版】

AI執事のGoogleカレンダー連携およびGoogleタスクの動作について

簡単なテストを通して動作の検証は行っておりますが、少し時間を空けるたびに、ChatGPTの応答の安定性が低下し、プロンプトの意図通りに結果を返せない不具合が数回発生しました。原因を調査した結果、裏で行われるアップデートによって、アルゴリズムの動作や応答の解釈が頻繁に変化することが確認されました。ダウンロード後に期待した動作をしない場合には、プロンプトのロジックを変更していただく必要があります。ご了承ください。

現在のソースコードはGitHubで最新の状態に更新されています。
この記事で紹介しているプロジェクトの完成版ソースコードは、以下のGitHubにて公開しています。
🔗 GitHubでソースコードを確認する

「LINEに送るだけで予定が登録されるAI執事」は、ついに最終形態へ進化しました。

※本プロジェクトは「全3記事構成」に整理済みです。過去に公開されていた記事は構成変更により非公開となっております。

本記事では、予定だけでなくタスクの登録・完了・一覧化までを、ChatGPTとGoogle連携で自動化。実際に動くプログラムを使いながら、AI執事の全機能を網羅的に解説します。

「手動で予定を整理する時代」は、もう終わりです。

もくじ
  1. AI執事の全体構成を理解しよう
  2. 事前準備 – LINE BotとGoogle APIの設定
  3. AI執事のロジックを理解する
  4. 予定の登録・更新・削除の処理
  5. タスクの登録・完了・一覧の処理
  6. 自然な会話を可能にするChatGPT連携
  7. AI執事の使い方 – 実行例とデモ
  8. GitHubと連携 – ソースコードと環境構築手順
  9. よくあるエラーとその対策
  10. まとめ

AI執事の全体構成を理解しよう

AI執事は、ユーザーからのLINEメッセージを起点に、ChatGPTで意味を理解し、その結果に応じてGoogleカレンダーやGoogleタスクへ予定やタスクを自動で処理する仕組みです。

これにより、予定の登録・変更・削除、さらにタスクの追加や完了といった操作まで、すべてを自然な会話ベースで完結できるようになりました。

従来は「予定の登録」に特化したシンプルな構成でしたが、最終版では「タスクの管理」も統合し、AI執事はより実用的で生活に密着したツールへと進化しています。

AI執事の構成全体図

AI執事の処理フローは、以下のような3つのステップに分かれています。

ステップ処理内容使用技術
① LINE受信ユーザーがLINEに予定やタスクを送信LINE Messaging API
② 意味解析ChatGPTが内容を解析し、意図を判別OpenAI GPT API
③ 実行処理GoogleカレンダーやGoogleタスクに反映Google Calendar API、Google Tasks API

この構成によって、ユーザーは技術的な知識が一切なくても、自然文で予定やタスクを操作できるようになりました。

LINEから処理までの流れ(図解)

以下に処理フローを簡単に表現した図を記載します(記事中では画像として掲載)。

LINE → Flaskサーバー → ChatGPTへ送信 → 意図を判別 → カレンダーまたはタスクへ反映 この処理はリアルタイムで実行されるため、LINEに送ってから数秒でGoogleサービスに反映される即時性も魅力です。

これまでの記事との差分を整理

AI執事は元々、「予定の登録」に限定したボットとして公開していました。 以下は、旧バージョンと最終版の機能差分をまとめた比較表です。

バージョン対応機能備考
旧バージョン予定の登録・変更・削除Googleカレンダーのみ連携
最終版予定+タスクの登録・完了・一覧Googleカレンダー+Googleタスク連携

タスク処理を統合したことで、AI執事の応用範囲は飛躍的に広がりました。

たとえば「明日までに◯◯をやっておいて」と送るだけで、自動で期限付きのタスクが登録されます。 これにより、日々のToDo管理や仕事の優先順位づけもスムーズに行えるようになります。

最終版で強化されたポイント

ポイントは以下の通りです。

  • 予定とタスクの処理を自動で分離・統合可能にした点
  • ChatGPTの応答精度向上により、より自然な言い回しにも対応
  • Google連携部分のスコープと認証の安定化による再認証不要な仕組み

次のセクションでは、これらの全体構成を支える「処理ロジック」の実装について、コードを交えながら具体的に解説していきます。

事前準備 – LINE BotとGoogle APIの設定

AI執事ボットを動作させるためには、LINEとGoogleの両サービスの設定が必要です。

本章では、LINE Botの作成からGoogle APIとの連携まで、ステップごとに詳しく解説していきます。必要な設定ファイルの生成方法や、認証エラーを回避するための注意点も含めてご紹介します。

LINE Botの作成やGoogle APIの設定方法については、以下の記事で詳しく解説しています。事前準備がまだの方は、先にこちらをご確認ください。

▶︎【Pythonの基礎知識】AI執事ボットのためのVPS環境構築マニュアル(LINE対応付き)

LINE公式アカウントの作成

まず最初に、LINE Developersで公式アカウントを作成します。

無料のBusiness IDを取得し、「プロバイダ」を作成した後、Messaging APIを利用できるチャネルを作成します。

LINE Developersの公式サイトにアクセスし、以下の手順で登録を進めます。

  1. LINE Developersにログインします
  2. 「プロバイダー」を新規作成します
  3. 「チャネルを作成」からMessaging APIを選択します
  4. チャネル名、アイコン、説明文などを設定します
  5. 作成が完了すると、チャネルアクセストークンとチャネルシークレットが表示されます

このアクセストークンとシークレットは、後のコード内でLINE Messaging APIを使用する際に必要になります。安全に保管してください。

Messaging APIの設定(アクセストークン・シークレット)

LINE公式アカウントのチャネル設定ページから、Messaging APIの情報を確認できます。ここで以下の2つを必ず控えてください。

  • チャネルアクセストークン(長期)
  • チャネルシークレット

また、Webhookの受信を有効にしておく必要があります。以下の項目をチェックしてください。

  • Webhook送信:有効
  • Webhook URL:ngrokなどで一時的に発行したURLを設定(後述)

これらの設定を行うことで、LINEのメッセージをWebhook経由で自サーバーへ受信可能になります。

Google CloudでAPI有効化(Calendar/Tasks)

次に、Googleカレンダーおよびタスク機能と連携させるために、Google Cloud上でAPIを有効化します。

以下の手順で進めてください。

  1. https://console.cloud.google.com/ にアクセス
  2. 新しいプロジェクトを作成(例:AI執事プロジェクト)
  3. 「APIとサービス」>「有効なAPIとサービス」へ移動
  4. 「APIを有効にする」をクリック
  5. 「Google Calendar API」と「Google Tasks API」を検索し、それぞれ有効化

APIキーは不要ですが、OAuth 2.0の認証情報を生成する必要があります。次の項目で詳しく説明します。

client_secret.jsonとtoken.jsonの生成方法

Google Cloud ConsoleでOAuth 2.0クライアントIDを生成し、`client_secret.json`を取得します。

手順は以下の通りです。

  1. 「認証情報」タブを開き、「認証情報を作成」→「OAuthクライアントID」を選択
  2. アプリケーションの種類:「デスクトップアプリ」を選択
  3. 名前を入力して作成
  4. ダウンロードボタンから`client_secret.json`を取得

次に、下記のPythonコードを実行し、`token.json`を生成します。

from google_auth_oauthlib.flow import InstalledAppFlow
SCOPES = [
    "https://www.googleapis.com/auth/calendar",
    "https://www.googleapis.com/auth/tasks"
]
flow = InstalledAppFlow.from_client_secrets_file("client_secret.json", scopes=SCOPES)
creds = flow.run_local_server(port=0)
with open("token.json", "w") as token:
    token.write(creds.to_json())

このスクリプトを実行すると、ローカルブラウザでGoogleアカウントへの認証が促されます。認証が完了すれば`token.json`が自動生成され、今後のAPI呼び出しで自動的に使用されます。

エラーを防ぐための注意点

認証がうまくいかない場合、以下の点を確認してください。

  • client_secret.jsonのパスが正しいか
  • OAuthのスコープが正しく設定されているか
  • Google Cloud上でAPIが有効化されているか
  • サーバー上でブラウザを開けない環境の場合、手動認証に切り替えること(`urn:ietf:wg:oauth:2.0:oob`方式)

以下は、手動認証方式での実行例です。

flow = InstalledAppFlow.from_client_secrets_file(
    "client_secret.json",
    scopes=SCOPES,
    redirect_uri='urn:ietf:wg:oauth:2.0:oob'
)

この方法では、表示されたURLをコピーしてブラウザで認証し、コードを手動で入力する形となります。

設定ファイルの保管場所とセキュリティ

client_secret.jsonとtoken.jsonは、機密情報を含んでいるためGitHubなどにアップロードしないよう注意してください。

.gitignoreに追加し、ローカル環境または安全なサーバー上にのみ保管するのが原則です。

また、LINEのチャネルアクセストークンやシークレットも、環境変数や外部設定ファイルで管理することをおすすめします。

設定ファイルの保管場所とセキュリティ

client_secret.json や token.json は非常に機密性の高いファイルです。誤ってこれらを公開リポジトリにアップロードしてしまうと、数分後にGoogleから「機密情報が漏洩した可能性があります」という警告メールが届きます。このメールを受け取ると、プロジェクトの再構成やトークンの再発行など、非常に面倒な対応を迫られることになります。そのため、これらの設定ファイルは必ず .gitignore に記載して Git 管理から除外してください。また、保管先も十分に注意し、必要に応じてパーミッションの設定や別ディレクトリへの隔離など、基本的なセキュリティ対策を講じておくと安心です。特に複数人で開発している場合は、設定ファイルを共有する方法(例:パスワード付きZIPやローカル共有など)についても事前にルールを定めておくと、事故を未然に防ぐことができます。

設定の全体像(表まとめ)

下記に、必要な設定ファイルと役割をまとめた表を掲載します。

ファイル名生成元主な役割
client_secret.jsonGoogle Cloud ConsoleOAuth認証情報(アプリ識別)
token.jsonOAuth認証スクリプトユーザーのアクセストークン
チャネルアクセストークンLINE DevelopersLINEメッセージ送受信用の認証情報
チャネルシークレットLINE Developers署名検証用の鍵

AI執事のロジックを理解する

本章では、AI執事の心臓部であるロジック部分について詳しく解説していきます。

全体の流れを把握することで、なぜ特定の発言で特定の動作が実行されるのか、その裏側の仕組みを理解できるようになります。

特に、Flaskで構成されたPythonアプリケーションの設計構造を理解することで、今後の機能追加や不具合の原因究明にも役立ちます。

LINEで受け取ったメッセージがどのようにChatGPTを通じて判断され、予定やタスクに変換されていくのか、その処理の全体像をここでしっかりと押さえておきましょう。

メインの処理フロー:app.py の流れ

AI執事のエントリーポイントは app.py です。このファイルでは Flask のルーティング設定を行い、LINEのWebhookから送信されたメッセージを受信して処理を分岐させます。

from flask import Flask, request
from logic.chatgpt_logic import askChatgpt
@app.route("/callback", methods=["POST"])
def callback(): # メッセージを抽出して処理ロジックへ

このように、外部ファイルに記述された関数へと処理を委譲する構成になっています。責務を分離した設計により、各処理のメンテナンス性が高まるよう設計されています。

処理分類ロジック:detectExplicitType()

受け取ったメッセージが「予定」なのか「タスク」なのか、あるいは一覧表示の指示なのかを判断するための関数が detectExplicitType() です。この関数がAI執事の動作の第一判断ポイントです。

例えば、以下のような発言があったとします。

明日の14時に歯医者の予定を入れて

この発言を受けた場合、detectExplicitType() は「register(登録)」かつ「予定」と分類します。一方で、

明日の締切タスクは終わらせて

という発言であれば「complete(完了)」かつ「タスク」と分類します。このように、ユーザーの自然な日本語を判別して、どのロジックに引き渡すかを選定する重要な部分がこの関数になります。

ユーザーの発言分類(予定・タスク・リスト)

detectExplicitType() の結果に応じて、処理は予定・タスク・リスト表示などの関数に分岐します。それぞれの処理は以下のような役割を担っています。

分類想定される発言例処理対象関数
予定登録「来週火曜に会議を入れて」registerSchedule()
予定削除「木曜の予定を消して」deleteEvent()
タスク登録「明日までに資料作成タスクを追加」registerTask()
タスク完了「買い物タスク終わったよ」completeTask()
一覧表示「今日の予定教えて」handleSchedule()

このように、分類の精度が全体の体験に直結するため、ユーザー発言の解析にはChatGPTの支援も活用されています。

ChatGPTとの連携:askChatgpt() の使い方

分類判断が難しい発言や、微妙なニュアンスが含まれるメッセージについては、OpenAIのAPIを活用して ChatGPT に問い合わせています。

result = askChatgpt(user_message)

この関数では、プロンプトにメッセージの文脈と判定条件を組み合わせ、ChatGPTが「これは予定登録です」「これはタスク完了です」と返すようチューニングしています。

ChatGPTの返答にはJSON形式の構造を用いており、その中からintent(目的)やtype(対象種別)を抽出して、処理を選択する仕組みです。

また、ChatGPTの応答が安定しない場合には、ローカルロジック(detectExplicitType)の結果を優先することで、誤動作を防ぐ対策も組み込まれています。

ChatGPTとロジックの協調制御

AI執事のロジックでは、ChatGPTのAPIをそのまま無条件で信用するのではなく、以下のような順序で制御されています。

  1. まずはローカルロジックで明示的に判定できるかを確認
  2. 不明瞭または複合的な文脈の場合はChatGPTへ問い合わせ
  3. ChatGPTの応答を判定材料としつつ、最終的には安全側に倒す

たとえば、ChatGPTが「これは予定」と返したとしても、日付や時間情報が含まれていなければ処理を保留にするなど、完全な自動判断に依存しすぎないよう工夫されています。

このような設計思想により、AIの誤解による誤登録や誤操作を防止し、ユーザーの信頼性を損なわないように構築されています。

今後の拡張に向けた設計方針

現在の構造は予定とタスクに限定されていますが、将来的にはメモ、買い物リスト、学習ログなど、さまざまな機能への拡張が可能です。

その際も、メインの構造(Webhook → intent分類 → 処理分岐)を維持しつつ、分類ルールやChatGPTへのプロンプトを変更するだけで拡張が容易に行えるよう、柔軟な設計が施されています。

これにより、AI執事は単なるカレンダーBotにとどまらず、パーソナルアシスタントとして進化し続けることが可能になります。

予定の登録・更新・削除の処理

AI執事がユーザーからの自然言語メッセージを受け取り、Googleカレンダーの予定として登録・更新・削除する処理について詳しく解説します。

これまでの構成と異なり、現在のロジックでは各処理が関数ごとに分離されており、メッセージの内容に応じて適切な処理が実行されるように整理されています。

登録処理の実装:registerSchedule()

予定登録処理は、ユーザーが「〇〇の予定を入れて」「△△を追加して」といった自然なメッセージを送信した際にトリガーされます。発話内容から予定タイトルと日時を抽出し、GoogleカレンダーAPIを用いてスケジュールに登録します。

def registerSchedule(title, start_time):
    # GoogleカレンダーAPIを使って予定を登録
    event = {
        "summary": title,
        "start": {"dateTime": start_time, "timeZone": "Asia/Tokyo"},
        "end": {"dateTime": end_time, "timeZone": "Asia/Tokyo"}
    }
    service.events().insert(calendarId="primary", body=event).execute()

この処理の前提として、時間情報が抽出されている必要があります。もし抽出に失敗した場合はエラーメッセージを返して登録処理を中断します。

削除処理の判定と実装

削除処理は、ユーザーが「〇〇の予定を削除して」「××をキャンセル」といった発話を行った場合にトリガーされます。キーワードに「削除」「キャンセル」などが含まれているかを判定し、該当のイベントを検索して削除します。

def deleteEvent(title, start_time):
    # 指定したタイトルと時間で予定を検索
    # マッチするイベントを削除
    events_result = service.events().list(...).execute()
    for event in events_result["items"]:
        if event["summary"] == title:
            service.events().delete(calendarId="primary", eventId=event["id"]).execute()

削除処理はイベントの検索精度が重要です。タイトルや日時が曖昧な場合、意図しないイベントが削除されるリスクがあるため、事前に一致度チェックなどを組み込むと安全です。

更新処理:時間や日付の変更パターンに対応

更新処理は、登録済みの予定の日時を変更したい場合に使用されます。

たとえば「〇〇の予定を明日の16時に変更して」といった形で、タイトルと新しい日時が含まれているケースです。

このとき、処理としては以下の2ステップに分かれます。

  1. 対象となる既存の予定を特定
  2. 指定された新しい時間で予定を更新

def updateEvent(title, old_start_time, new_start_time):
    # 古い予定を検索し、該当イベントを取得
    # 時間のみを書き換えて更新
    event = findEventByTitleAndTime(title, old_start_time)
    if event:
        event["start"]["dateTime"] = new_start_time
        event["end"]["dateTime"] = new_end_time
        service.events().update(calendarId="primary", eventId=event["id"], body=event).execute()

この処理は、元の開始時間と新しい開始時間が両方とも抽出できている場合に成立します。どちらかが欠けている場合は、登録ではなく新規予定として扱うか、エラーで返す必要があります。

全体の処理フローと分岐ロジック

予定の登録・削除・更新処理は、それぞれのトリガー条件を満たすユーザー発言が入力されたときに実行されます。分岐は以下のような順番で判定されるのが一般的です。

処理種別判定条件(キーワード)実行関数
削除削除、消す、キャンセルdeleteEvent()
更新変更、ずらす、移動updateEvent()
登録入れて、追加、登録registerSchedule()

このように、メッセージの先頭から順番に条件判定していく構造を取ることで、矛盾なく意図した動作を実現できます。

注意点:予定とタスクの混同を防ぐ

AI執事は予定だけでなく、Google Tasksへのタスク登録にも対応しています。そ

のため、「完了させて」「タスクを追加して」といったメッセージを適切に分類し、予定系処理と混同しないように `detectExplicitType()` などの分類処理を活用する必要があります。

予定系の発話であっても、文脈や単語の曖昧さにより誤分類が発生することがあります。ChatGPTへのプロンプト設計も重要です。

まとめ:ユーザー体験を支える実装の肝

予定登録・削除・更新処理は、AI執事の中核をなす重要なロジックです。

ユーザーが意図通りにカレンダーを操作できるよう、精度の高い自然言語処理と分岐設計、そしてGoogleカレンダーAPIの正確な操作が求められます。

今後、さらに発話の揺れに強い設計や、音声入力との連携を強化することで、より自然なUXを実現できるはずです。

タスクの登録・完了・一覧の処理

AI執事が予定と並んで対応できるもう一つの重要な機能が「タスク管理」です。

Google Tasksを用いて、ユーザーからの発言をもとにタスクの登録・完了・一覧表示などを自動で行う仕組みになっています。本章ではその仕組みと具体的なコードの構造について詳しく見ていきます。

handleTaskActions()の仕組み

タスク関連の処理は、主にhandleTaskActions()という関数で行われます。この関数はユーザーの発言から意図を抽出し、登録・完了・一覧といった処理を判定します。

def handleTaskActions(intent, user_message, forced_type=None, client):

この関数は以下の3つの主なタスク処理を管理します。

処理タイプ動作内容
登録(register)ユーザーが発言したタスク名をGoogle Tasksに新規追加
完了(complete)該当タスクを完了済みに変更
リスト表示(list)現在のタスク一覧、または完了済みタスクの一覧を表示

タスクか予定かを判断する際には、detectExplicitType()により明示的な意図が指定されていればそれを優先します。そうでない場合は、発言内のキーワードや構文から意図を推定して処理します。

Google Tasksへの登録・完了処理の実装

Google Tasksの登録処理は、GoogleのTasks APIを使って非同期的に実行されます。具体的な処理の流れは以下のとおりです。

task = {
'title': task_title,
'due': due_date,
}

client.tasks().insert(tasklist='@default', body=task).execute()

登録後は、LINEに「✅ タスク『○○』を登録しました」のような確認メッセージが返されます。

一方で完了処理は、リストの中から該当するタイトルをもつタスクを検索し、そのstatusを「completed」に変更して更新を行います。

task['status'] = 'completed'
client.tasks().update(tasklist='@default', task=task['id'], body=task).execute()

なお、タスク名があいまいだった場合には、その旨を通知してユーザーに再確認を求めるように実装されています。

完了タスクと期限付きタスクのリスト表示

タスク一覧の表示には、Google Tasksから取得したデータをフィルターし、現在のタスクか完了済みタスクかを判断して出力しています。

処理の中では、タスクの件数に応じて自動でメッセージを整形します。 以下のように、期限が設定されているタスクには日付も明示され、視認性が高くなっています。

タスク名期限状態
会議資料の作成2025-06-15未完了
買い物リスト-未完了
定例MTG2025-06-18完了

また、LINE返信では以下のような構成で表示されることが想定されています。

📝 今のタスクリスト(未完了)
・会議資料の作成(6月15日)
・買い物リスト

このように、ユーザーは日々の予定とともにタスクの進捗状況をAI執事に一元管理してもらうことが可能です。予定とタスクの区別は明確にしておくことで、処理の混乱を避けることができます。

以上が、タスクの登録・完了・一覧表示に関する基本的な処理構造です。Google Tasksとの連携を正しく理解することで、今後さらに複雑な管理処理への応用も可能となります。

自然な会話を可能にするChatGPT連携

AI執事が実現する最大の魅力のひとつは、まるで人間と対話しているかのような自然な会話です。

その中核を担うのが、ChatGPTとのシームレスな連携です。

本章では、ChatGPTとの連携方法からプロンプトの設計、API応答の取り扱い、そして最終的なユーザーへのLINE送信までの一連の処理を解説します。

ChatGPTの使い方(プロンプト制御)

ChatGPTとの会話の質は、プロンプト(命令文)の設計に大きく左右されます。

AI執事では、ユーザーのメッセージをそのままGPTへ渡すのではなく、目的に応じてプロンプトの前後に文脈情報を加えることで、より意図に沿った応答を引き出すようにしています。 以下はプロンプトを生成する処理の一例です。

def buildPrompt(user_message):
    system_message = "あなたは予定管理専用の執事です。不要な挨拶や補足をせず、簡潔に答えてください。"
    return [
        {"role": "system", "content": system_message},
        {"role": "user", "content": user_message}
    ]

プロンプトは常に`system`と`user`の2段構成で生成し、ChatGPTに対して明確な役割を与えることでブレを防ぎます。

JSONレスポンス形式でChatGPTとやりとり

ChatGPTへの問い合わせは、OpenAIが提供するAPIを通じて行います。API応答は通常JSON形式で返ってきます。AI執事では、以下のような形式で応答メッセージを取得し、意図を解析しています。

def askChatgpt(prompt):
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=prompt,
        temperature=0.3
    )
    return response["choices"][0]["message"]["content"]

このようにして取得した応答内容は、次の処理に引き継ぐため、ユーザーの意図(例:「予定を変更したい」や「明日の予定を教えて」など)を正確に分類し、後段のロジックで必要な処理へとマッピングされます。

応答結果のLINE送信(Push)

ChatGPTから得た応答は、そのままLINEへPush通知する形でユーザーへ返します。この際、元の発話者へ間違いなく送るために、LINEの送信元情報とユーザーIDを適切に扱う必要があります。 以下は、AI応答をユーザーにPush送信する処理です。

def replyToUser(reply_text, reply_sender_id):
    messaging_api.push_message(
        PushMessageRequest(
            to=reply_sender_id,
            messages=[TextMessage(text=reply_text)]
        )
    )

この処理を通じて、ユーザーは「LINEに話しかけるとAIが返してくれる」という一貫した体験を得ることができます。

ChatGPT連携における注意点

ChatGPT連携の精度を維持するためには、次の点に注意が必要です。

注意点内容
プロンプト設計目的に特化したプロンプトでないと、余計な返答が返る可能性があります。
APIエラー処理ChatGPT APIからの応答がエラーになることを考慮し、例外処理を必ず実装してください。
送信先の検証Push送信時には、送信先のユーザーIDが正しいかどうかを必ず確認する必要があります。

ChatGPT連携は非常にパワフルな手段ですが、安定性を担保するには細部の制御が重要です。

今後の展望と拡張性

AI執事におけるChatGPT連携は、現時点ではシンプルな一問一答に近い仕組みですが、今後はユーザーの会話履歴や好みを保持し、よりパーソナライズされた応答を返すフェーズへと進化していく予定です。

また、ChatGPTのAPIバージョンアップに伴い、より自然で複雑なやりとりも可能になると想定されるため、構成の拡張性を意識した設計が求められます。

AI執事の使い方 – 実行例とデモ

AI執事は、LINEとGoogleカレンダー、Google Tasks、そしてChatGPTの連携によって動作する自作アプリケーションです。

本章では、AI執事を実際に使用した際のメッセージ例や、処理ログの確認方法、さらに明日以降も安定して動作させるための工夫について詳しく解説していきます。

この記事を読み終える頃には、AI執事がどのようにユーザーの自然な指示を受け取り、どのような処理を裏側で行っているのかが理解できるはずです。

実際のメッセージ例(予定・タスク処理)

ユーザーがLINEで送るメッセージは、あくまで自然な言葉で構いません。以下に、よく使われる例を示します。

明日の14時に歯医者の予定を入れて
来週の火曜日に会議の予定をキャンセルして
タスク:資料作成を登録
資料作成タスクを完了したよ

このようなメッセージを受け取ると、AI執事は内部でGoogleカレンダーやTasksにアクセスし、適切な処理を行います。ユーザーは日付や時間を自然に伝えるだけで、AIが自動的に解釈して登録や削除を実行してくれます。

処理ログの表示と応答確認

AI執事が受け取ったメッセージに対してどのような処理を実行したかは、処理ログとしてコンソールやサーバーログに記録されます。開発段階やトラブル時には、以下のようなログ出力が役立ちます。

📦 Webhook受信ボディ: {"text":"明日の歯医者の予定を入れて"}
🚩 Intent検出:register
✅ 新規予定『歯医者』を登録しました:2025-06-14 14:00

このように、受信メッセージの解析から処理完了までの流れが一目で分かるログが出力されます。また、ユーザー側にはLINEを通じて応答が返ります。

🧠 応答:予定「歯医者」を2025年6月14日 14時に登録しました。

この仕組みにより、ユーザーは即座に処理結果を確認でき、安心して操作を任せることができます。

明日になってもスコープエラーが出ない工夫

AI執事を長期的に運用する上で問題になりがちなのが「スコープエラー」や「トークンの期限切れ」といったエラーです。これらを回避するためには、次のような対策が必要です。

まず、定期的なトークン更新処理をバックグラウンドで走らせる仕組みを導入します。GoogleのOAuth認証では、`refresh_token`を使って新しい`access_token`を自動で取得できます。

credentials.refresh(Request())

また、Flaskアプリケーションの再起動時にも環境変数やセッションの初期化を正しく行い、グローバル変数の再利用に注意を払います。

特に、予定登録や削除のたびに変数が保持され続ける設計では、古いスコープが残ることでエラーの原因となります。

さらに、AI執事ではChatGPTをAPI経由で使用しているため、レスポンスが遅延する可能性を考慮し、非同期処理やタイムアウト設定も重要です。

実行例では、明示的にレスポンス形式をJSONに統一することで、安定した応答処理を実現しています。

response = openai.ChatCompletion.create(..., response_format="json")

これにより、AIの返答が期待した形式で受け取れないといった不具合を防止できます。

対策内容具体的な実装例
スコープの保持グローバル変数に頼らずセッション単位で管理
トークン更新refresh_tokenを使って自動更新
エラー対策try構文+ログ出力でトラブルを追跡
ChatGPT応答形式JSON形式で統一しパースエラー防止

このように、日常的な利用でエラーが出ないように事前に対策しておくことで、AI執事の信頼性と継続利用性を高めることができます。

GitHubと連携 – ソースコードと環境構築手順

AI執事の構築を行ううえで、コードの全体像やセットアップ方法が明確でなければ、途中でつまずく可能性があります。

この記事では、ソースコードを一元管理しているGitHubとの連携方法から、ローカル環境での起動・テスト方法までを具体的に解説します。

読者がスムーズに構築を進められるよう、すべての工程を漏れなく網羅しています。

全コードへのGitHubリンク

AI執事の全ソースコードはGitHubにて公開しています。コードは下記のように整理されています。

ディレクトリ内容
/app.pyFlaskアプリのエントリーポイント
/logic/主要な処理ロジック(ChatGPT連携、スケジュール操作)
/config/環境変数や外部APIキー管理
/static/, /templates/Web画面表示用の静的ファイル

それぞれの処理単位が明確に分離されており、カスタマイズや検証が容易です。リポジトリは以下のリンクからアクセス可能です。

https://github.com/bepro-engineer/ai-butler

GitHubの最新版コードに従ってローカル構築を行うことで、最新の修正や改善点がすぐに反映されます。

環境構築手順(.env、venv、requirements.txt)

ローカルでAI執事を動作させるには、以下の環境構築手順を順に実施する必要があります。 まず、仮想環境の作成と依存パッケージの導入を行います。

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

次に、LINE APIやChatGPT APIキーなどの情報を `.env` ファイルに設定します。

vi .env 必要な環境変数は以下のような形式で記述します。

環境変数名説明
LINE_CHANNEL_ACCESS_TOKENLINE公式アカウントのアクセストークン
LINE_CHANNEL_SECRETLINE Developersで取得したシークレット
OPENAI_API_KEYChatGPT APIのキー
FLASK_ENV開発用の環境設定(例:development)

`.env`ファイルはプロジェクトルートに配置してください。誤ってGitに含めないよう、`.gitignore`に記述することも忘れないようにしましょう。

Flask起動とローカルテスト方法

仮想環境と環境変数の設定が完了したら、Flaskアプリを起動してローカルでテストできます。 以下のコマンドを使用してアプリを起動します。

python app.py

正しく起動すると、ターミナルに以下のようなログが表示されます。

* Running on http://127.0.0.1:5001/ (Press CTRL+C to quit)

この状態でLINEからメッセージを送信すれば、Webhook経由でローカルアプリが応答を返すはずです。ローカルでテストする際は、ngrokなどのトンネリングサービスを使用してLINE側のWebhookにルーティングしてください。

ngrok http 5001

表示されたURLをLINE DevelopersのWebhook URLに設定すれば、テスト環境の構築は完了です。 また、テスト中に発生しやすい問題として、以下のようなケースが報告されています。

問題原因と対処
Webhookが無反応ngrokのURLがLINE Developersに反映されていない可能性
Flaskが起動しない.envファイルに誤りがある、または依存関係が未解決
APIキーが認識されない環境変数が正しく読み込まれていない、.envの再確認が必要

最初の段階では、LINEとChatGPTがどのように連携して動作しているかを把握することが重要です。Flask側のログを丁寧に確認しながら、どの処理でエラーが発生しているのかを順に追っていくと、トラブル対応がスムーズになります。

よくあるエラーとその対策

AI執事を開発・運用していく中で、避けて通れないのが「エラー」への対応です。こ

の記事では、実際によく発生するトラブルとその対処法について、原因別に詳しく解説します。開発途中で立ち止まらないためにも、あらかじめエラーの傾向と解決法を把握しておくことが重要です。

token.jsonが無効になる原因

Google Calendar APIを利用する際、認証情報として生成される「token.json」が無効になるケースがあります。これは多くの場合、次のような理由によって発生します。

  • client_secret.jsonの変更
  • スコープの再設定によるトークンの無効化
  • 手動削除や書き換えによる破損

これらのトラブルは、下記のようなエラーとして現れます。

google.auth.exceptions.RefreshError: ('invalid_grant: Token has been expired or revoked', ...)

このエラーが発生した場合は、以下の手順で復旧します。

  1. 既存のtoken.jsonを削除
  2. 再度認証フローを実行(ターミナルに出るURLへアクセス)
  3. 新しいtoken.jsonが生成されるのを確認

認証のたびにURLからトークンを発行し直す手間がかかりますが、根本的な回避策は「client_secret.jsonを途中で差し替えない」「scopeを変更しないこと」が重要です。

スコープエラー対策

次に多いのが、スコープ(認可範囲)エラーです。これはGoogle APIとの連携時に、事前に指定したスコープが一致していない場合に発生します。 代表的なエラーは次の通りです。

google.auth.exceptions.RefreshError: ('invalid_scope: Bad Request', ...)

このエラーの原因と対処法を以下の表にまとめます。

原因対処法
SCOPESの定義が古い・不適切正しいスコープ(例:"https://www.googleapis.com/auth/calendar")を指定
過去に認証したスコープと異なるtoken.jsonを削除し、再認証を実行
Google API Consoleの設定ミスOAuthの承認済みリダイレクトURIを見直す

特に重要なのは、認証後にスコープの定義を変更しないことです。一度でも変更があると、token.jsonが無効となり再認証が必要になるため、最初の構成でスコープは確定させておくべきです。

ChatGPT APIのエラー対処

ChatGPT連携でも、通信や設定の不備によるエラーが発生します。主なエラー例は以下のとおりです。

openai.error.AuthenticationError: No API key provided.

このエラーは、環境変数や`.env`ファイルでAPIキーが正しく読み込めていない場合に起こります。対処法は以下の通りです。

  1. .envファイルに`OPENAI_API_KEY=sk-xxx...`を記載しているか確認
  2. configファイルや読み込み処理が`.env`を参照しているか確認
  3. `.env`ファイルのパスが正しいか再確認(`.gitignore`に含まれている場合は除外されます)

また、以下のような通信エラーも発生することがあります。

openai.error.APIConnectionError: Error communicating with OpenAI

この場合、以下のような点を確認してください。

  • OpenAIのサービスステータスが稼働中か確認
  • VPNやファイアウォールがブロックしていないか確認
  • 接続先URLやProxyの設定が適切か検証

通信が安定しない環境では、一時的なリトライ機能(`try-except` + `time.sleep()`)の導入が推奨されます。

Flaskアプリが起動しない問題

最後に、ローカルでAI執事アプリをテストする際によく発生する「Flaskが起動しない問題」についてです。エラー例としては以下のようなものがあります。

OSError: [Errno 98] Address already in use

これは、指定したポート番号(例:5001)が既に別プロセスで使用されている状態を意味します。解決方法は以下の通りです。

lsof -i :5001 kill -9 [PID]

また、Flaskの環境変数が正しくない場合も起動に失敗するため、以下のように明示的に設定しておくことが大切です。

export FLASK_APP=app.py export FLASK_ENV=development flask run --port=5001

ローカルテスト時にエラーが出る場合は、まずポートの占有状態と環境変数を疑うことがポイントです。

まとめ

本記事では、AI執事の設計から実行、運用までの一連の流れを詳細に解説してきました。実際のメッセージ処理やエラー対応、環境構築方法なども含め、導入に必要な知識を一通りカバーしています。

最後に、AI執事の実用性と今後の展望について整理し、どのように活用していけるかをまとめていきます。

AI執事の実用性と展望

AI執事は、単なるスケジューラーやリマインダーにとどまらず、ユーザーの生活や業務に密接に入り込む「生活導線の自動化ツール」としてのポテンシャルを秘めています。 現在の実装でも以下のような具体的な効果が確認できます。

  • LINEなどのチャットから予定・タスクを直接操作可能
  • Googleカレンダーとの双方向連携
  • 削除や更新も含めた自然言語による柔軟な対話操作

このように、スケジュール管理の煩雑さを軽減し、ユーザーの脳内リソースを“本当に考えるべきこと”に集中させるサポートが可能です。特に、複数の予定やタスクに追われる方にとっては、極めて実用的なツールといえるでしょう。

また、手元のスマートフォンから簡単に操作できる点も魅力です。LINEで一言送信するだけで予定が追加・変更・削除できるため、隙間時間の活用や、予定を思い出したときに即座に記録できるという特性が強みとなっています。

さらなる拡張(Phase2/Phase3)の方向性を簡潔に

今後の拡張としては、「よりパーソナライズされた応答」や「長期記憶による文脈保持」「タスクの進捗監視」などが主軸となります。以下にPhase2・Phase3で実現すべきポイントを簡単に整理します。

フェーズ拡張内容目的
Phase2ユーザーごとの応答特性の学習
メッセージ履歴を用いた文脈保持
プロンプトの自動生成精度向上
より自然な会話と命令解釈精度の向上
Phase3定期的なリマインドや完了監視
AIによる推論付き提案機能の搭載
異常検知や長期記録ベースの改善提示
能動的にタスクを推進し、自己管理を補佐

また、将来的には以下のような「複合的な仕組み化」も視野に入れています。

  • Slack、LINE、メールなどマルチチャネル化
  • Notion、Googleドライブ、GitHubとの連携によるリソース横断管理
  • 自己ミッションとの連動による意思決定支援AI

これらはすべて、ただのアシスタントではなく「行動の設計者」としてのAI執事を目指したアップデートです。

ユーザーの毎日の行動を“思考の負担を減らしつつ目的に沿って導く”という目的を持ち、現代に必要な“考えずに行動できる仕組み”を完成させていきます。

今後の利用に向けた注意点

本記事を読んで実際に導入を試みる場合には、いくつか注意点があります。

  • APIキーやclient_secret.jsonなどの認証情報は絶対にGitHubにアップしないこと
  • LINE DevelopersやGoogle Cloudの設定はUI変更が多いため、定期的に最新手順を確認すること
  • LINE BOTは無料プランでも制限があるため、想定以上のユーザー数がいる場合は早めにプラン移行を検討すること

とくにclient_secret.jsonをGitにアップロードしてしまうと、数分後にはGoogleから「セキュリティ侵害のおそれがある」といった警告メールが飛んできます。この対応が非常に煩雑で、誤ってアップロードしたことが原因でAPIアクセスがブロックされるケースもあるため、`.gitignore`の設定は初期段階から徹底しておくべきです。

まとめ

AI執事は、単なる予定管理ツールの枠を超えた「自動実行プラットフォーム」としての役割を持ちます。

今後、より多くの行動が自動化されていく社会において、「何をするかではなく、どう仕組みに委ねるか」が重要となります。その意味で、AI執事の構築はあなた自身の生活や事業における“未来の設計図”を作る第一歩といえるでしょう。

次に進むべきは、「仕組みの設計」と「実際の運用」です。コードはGitHubに整理済みなので、記事内のリンクをもとに実装を進めてみてください。

導入初期は面倒に感じるかもしれませんが、慣れてくると驚くほど日常がシンプルになります。 あなた自身の時間とエネルギーを、もっと価値あることに使っていきましょう。

よく読まれている記事

1

IT入門シリーズ 🟢 STEP 1: ITの基礎を知る(ITとは何か?) 📌 IT初心者が最初に学ぶべき基本知識。ITの概念、ネットワーク、OS、クラウドの仕組みを学ぶ ...

2

「私たちが日々利用しているスマートフォンやインターネット、そしてスーパーコンピュータやクラウドサービス――これらの多くがLinuxの力で動いていることをご存じですか?無料で使えるだけでなく、高い柔軟性 ...

3

この記事は、Linuxについて勉強している初心者の方向けに「Shellスクリプト」について解説します。最後まで読んで頂けましたら、Shellスクリプトはどのような役割を担っているのか?を理解出来るよう ...

-AI執事, Pythonの基礎知識(実践編)