AIエージェント 自分専用タスク管理エージェント作ってみた

概要

自分専用のAI秘書が欲しい方、要チェックです!AIエージェントの事例として、自分専用のタスク管理エージェントを作ってみましたので紹介します。

Google spreadsheetで作成したタスクリストをGPT-o1-miniにチェックさせて、
1)短期的視点および中長期視点の両方から大事な項目をピックアップさせます。
2)次に最も重要なタスク一件に対して、何をどのような手順で行えば良いかブレークダウンさせます。
最終的に1)と2)を合わせたものをメールで配信します。
これを毎朝6:00に実行して自動化します。

フローチャート

プログラムはpythonで作成し、GCP(Google Cloud Platform)上で定期実行させます。

タスクの分析はGPT-o1に実行させたいのですが、私のAPIの利用状況ではTierが足りずGPT-o1-miniまでしか使えませんでした…OpenAIのケチ…

動作のイメージ

タスクリスト

Google spreadsheetのタスクリストを用意します。タスク名とタスク内容、締め切り、優先度などを自由に設定します。A1セルにはタスクリストの背景情報(どういう人間の何のためのタスクなのか)を記入しています。

実行結果(タスクリストの分析)

このタスクリストをAIが分析し、結果を毎朝6:00にメールでお知らせしてくれます。

短期的なものだけでなく、中長期の視点からも提案してもらうことで幅広い視点からレコメンドしてもらえます。ついつい後回しにしがちなタスクも忘れずにフォローし続けられますね。

一番重要なものは詳細な実行手順を書き出してくれます。ここまで具体的に書き出してくれると、頭を使わずに着手しやすいですね。

進捗や追加があった項目は、タスクリストに追記したりしてメンテナンスすることで翌日のタスク分析内容に反映することができます。

実際に運用していますが、とても有用なエージェントだと感じています。個人で運用するのも良いですしチームや組織で動かしても良いかと思います。

ただ、生成AIによる分析なのでハルシネーションや、情報不足、文脈不足による誤解などは当然あり得ます。完全に鵜呑みはせず、自分でもリストをチェックしながら運用することが大切です。

ソースコード

一応参考までにソースコードを貼っておきます。

import gspread
from google.oauth2.service_account import Credentials
import os
import datetime
from openai import OpenAI
from dotenv import load_dotenv
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# 環境変数の読み込み
#load_dotenv()

# APIキーの取得と検証
openai_key = os.environ.get("OPENAI_API_KEY")
#openai_key = os.getenv("OPENAI_API_KEY")
client = OpenAI(api_key=openai_key)

# 認証情報ファイルのパス jsonファイルを読み込む
SERVICE_ACCOUNT_FILE = 'robotic-casing-xxxxxx-xxxxxxxxx.json'


# 必要なスコープ
SCOPES = [
    'https://www.googleapis.com/auth/spreadsheets',  # スプレッドシートアクセス
    'https://www.googleapis.com/auth/drive'  # Google Driveアクセス
]

def summarize_text(text):
    """OpenAI APIを使用してテキストを要約する関数
    
    Args:
        text: 要約する元のテキスト
        
    Returns:
        str: 要約されたテキスト
        None: エラー発生時
    """
    try:
        response = client.chat.completions.create(
            model="o1-mini", 
            messages=[
                {"role": "user", "content": "以下のタスクリストを解析して、優先度の高いタスクを5件選出してください。短期的観点から3件、中長期的観点から2件選出してください。説明は簡潔に行なってください。" + text}
            ]
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"Error summarizing text: {str(e)}")
        return None
    
def breakdown(text):
    try:
        response = client.chat.completions.create(
            model="o1-mini", 
            messages=[
                {"role": "user", "content": "最も優先度の高いタスク1件の内容を分解して実行手順を提案してください。簡潔に記述してください。" + text}
            ]
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"Error summarizing text: {str(e)}")
        return None

def send_email(body):
    """
    標準ライブラリを使用してメールを送信する関数。

    Args:
        subject (str): メールの件名
        body (str): メールの本文
        recipient_email (str): 宛先のメールアドレス
        sender_email (str): 送信者のメールアドレス
        sender_password (str): 送信者のメールアカウントパスワード(またはアプリパスワード)
    """
    dt_now = datetime.datetime.now()

    try:
        # メールのヘッダーを設定
        message = MIMEMultipart()
        message["From"] = "hogehoge@gmail.com"
        message["To"] = "hogehoge@gmail.com"
        message["Subject"] = "今日のタスク" + str(dt_now)

        # メールの本文を追加
        message.attach(MIMEText(body, "plain"))

        # GmailのSMTPサーバーに接続
        with smtplib.SMTP("smtp.gmail.com", 587) as server:
            server.starttls()  # TLS暗号化を有効にする
            server.login("hogehoge@gmail.com", "yyyyyyyyyyyyy")  # 送信者のメールアカウントにログイン
            server.send_message(message)  # メールを送信

        print("メールが送信されました!")

    except Exception as e:
        print(f"メール送信中にエラーが発生しました: {e}")

def main():
    # 認証情報を使用してクライアントを作成
    creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    client_gs = gspread.authorize(creds)

    # スプレッドシートにアクセス (スプレッドシートIDで指定)
    sheet = client_gs.open_by_key("spreadsheetのID").sheet1

    # スプレッドシートのデータを全取得
    data = sheet.get_all_values()

    # タスクリストをテキストデータに変換、配列で取得
    rows = data[1:]
    task_list_text = "\n".join([
        f"{i + 1}. タスク: {row[0]}\n   タスク名: {row[1]}\n   タスク内容: {row[2]}\n   登録日: {row[3]}\n   締切: {row[4]}\n   優先度: {row[5]}\n   完了済み: {row[6]}"
        for i, row in enumerate(rows)
    ])

    # データを表示
    for row in data:
        print(row)

    print(task_list_text)

    summary = summarize_text(task_list_text)

    print(summary)

    breakdown_task=breakdown(summary)

    print(breakdown_task)

    content=summary+"\n"+breakdown_task

    send_email(content)

main()

開発にはChatGPTのほか、下記のHPを参考にしました。

https://zenn.dev/tanny/articles/9c651bf26d33ea

https://qiita.com/venect_qiita/items/4e0f00a70c1b57f948dd

単純なpythonの問題ならChatGPTやCursor、Clineなどで比較的解決できるのですがGCPやspreadsheetの問題はChatGPTもそこまで学習しているわけではないので、公式ドキュメントや個人のブログ記事などの方が頼りになる印象です。