0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gemini APIで冷蔵庫の食材から料理を提案するBotを作り、日付と天気を渡したら提案が変わった

0
Posted at

冷蔵庫にある食材を渡すと料理を提案してくれる簡単なBotを、Google Colab と Gemini API で作ってみました。
途中で「今日の日付と天気も渡したら、もっと季節に合った提案になるのでは」と思って試したら、思った以上に提案の中身が変わったので、その記録です。

環境

  • Google Colaboratory
  • google-genai(Gemini API の Python SDK)
  • モデル:gemini-2.5-flash(APIキーは Google AI Studio で発行)
  • 天気:OpenWeatherMap API

APIキーは Colab の「シークレット」に登録して、userdata.get() で読み込んでいます。

まずは食材だけ渡してみた

プロンプトは固定にして、食材の部分だけ差し替えられる関数にしました。

!pip install google-genai

from google import genai
from google.colab import userdata

# ColabのシークレットマネージャーからAPIキーを取得
try:
    GOOGLE_API_KEY = userdata.get('cooking_ai_bot')
    client = genai.Client(api_key=GOOGLE_API_KEY)
    print("APIクライアントの初期化に成功しました!")
except Exception as e:
    print("エラー: APIキーが正しく設定されていない可能性があります。", e)
def suggest_recipe(ingredients):
    prompt = f"私の冷蔵庫には次の食材があります:{ingredients}。これらを使って作れる料理の候補と、その簡単なレシピを教えてください。"

    response = client.models.generate_content(
        model='gemini-2.5-flash',
        contents=prompt,
    )
    return response.text

# --- 試しに使ってみる ---
my_ingredients = "豚肉、キャベツ、玉ねぎ"
print(f"【入力した食材】: {my_ingredients}\n")

result = suggest_recipe(my_ingredients)
print("【AIからの提案】:")
print(result)

「豚肉、キャベツ、玉ねぎ」で実行すると、次の4品が材料・作り方つきで返ってきました。

  • 豚肉とキャベツの味噌炒め(和風)
  • 豚肉とキャベツのシンプル塩こしょう炒め
  • 豚肉とキャベツの具だくさん味噌汁(豚汁風)
  • 豚肉とキャベツのトマト煮込み(洋風)

これだけでも十分使える内容でした。ただ、どれも「この食材で作れるもの」という観点だけで選ばれていて、今日食べたいかどうかは考慮されていません。

日付と天気を足してみた

季節や気温が分かれば、もっとその日に合った提案になるのではと考えて、日付と天気を取得してプロンプトに足すことにしました。日付は datetime、天気は OpenWeatherMap API から取っています。

import datetime
import requests
from google.colab import userdata

def get_weather_info(city_name="Tokyo"):
    """
    OpenWeatherMap APIから現在の天気と気温を取得します。
    """
    try:
        api_key = userdata.get('OPENWEATHER_API_KEY')
        url = f"http://api.openweathermap.org/data/2.5/weather?q={city_name}&appid={api_key}&units=metric&lang=ja"
        response = requests.get(url)

        # APIリクエストが成功した場合、必要なデータ(天気・気温)を取り出して返します
        if response.status_code == 200:
            data = response.json()
            weather_desc = data['weather'][0]['description']
            temp = data['main']['temp']
            return f"{city_name}の天気は「{weather_desc}」、気温は {temp}℃ です。"
        else:
            # エラー時もどのようなエラーだったかを文字として返すことで、後続の処理でエラー内容がわかります
            return f"【デモ】現在の季節は春・秋頃です。過ごしやすい気候(約18℃)です。 (APIエラーコード: {response.status_code})"

    except Exception as e:
        return "【デモ】現在の季節は春・秋頃です。過ごしやすい気候(約18℃)です。"

天気APIの取得に失敗しても処理が止まらないように、エラー時は「【デモ】…約18℃」という仮の天気を返すようにしています。今回の実行では実際の天気が取れていました。

now = datetime.datetime.now()
date_str = now.strftime("%Y年%m月%d日")
weather_str = get_weather_info("Tokyo")

print(f"取得した日付: {date_str}")
print(f"取得した天気: {weather_str}")
取得した日付: 2026年10月10日
取得した天気: Tokyoの天気は「晴天」、気温は 20.27℃ です。

新しい関数は作らず、さっきの suggest_recipe の「食材」の引数に日付と天気の文章をくっつけて渡しています。

my_ingredients = "豚肉、キャベツ、玉ねぎ"

# 食材情報に、日付と天気のContextを付与して「食材引数」として渡します
enhanced_ingredients = f"""{my_ingredients}

なお、本日の日付は「{date_str}」で、現在の天気・気温状況は「{weather_str}」です。
この季節感や今日の気温・天候に適したおすすめの料理を優先して提案してください。"""

result_enhanced = suggest_recipe(enhanced_ingredients)
print("【AIの提案】:")
print(result_enhanced)

提案がどう変わったか

同じ食材なのに、返ってきた料理が入れ替わりました。

食材だけ 日付と天気つき
味噌炒め 重ね蒸し(酒蒸しポン酢添え)
塩こしょう炒め 回鍋肉風炒め
豚汁風の味噌汁 塩だれ炒め
トマト煮込み

日付と天気を渡したほうは、冒頭で「東京は晴天で20.27℃と、過ごしやすい秋の気候ですね」と状況を受けてから、「温かくて食べ応えがあるけれど、重すぎないもの」という方針を立てていました。
各料理にも「今日の過ごしやすい気候にぴったり」「少し肌寒くなる夕方に、しっかり食べたい時に」のような理由がついていて、選んだ根拠が見えるようになったのは良かったです。

わかったこと・まだわからないこと

食材だけでも良いレシピは出てきますが、季節や気温の情報を渡すと、よりその日に合ったレシピを出してくれました。数行の文章をプロンプトに足しただけでここまで変わるのは、やってみて驚いたところです。

一方で、AIがどうやってレシピを組み立てているのか、どんなデータを参考にして出力しているのかは、まだよく分かっていません。

実用にするなら、冷蔵庫の在庫を管理するDBとつなげて、食材を手で入力しなくて済むようにすると便利になりそうだと考えています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?