kdnakt blog

hello there.

自作エージェントに現在時刻を教える

Strands Agentsで遊んでいたら、自作したエージェントが現在時刻を認識していないことに気づいた。プロンプトをちょっといじったら修正できたのでメモしておく。

[時刻のわからないエージェント]

Strands Agentsで自作したエージェントに「今日は何日?」という質問をしたが、まともに答えてくれなかった。

// agent.py
from strands import Agent

agent = Agent(
    model="us.amazon.nova-micro-v1:0",
    callback_handler=None,
    system_prompt="あなたはユーザーの質問に親切に答えるエージェントです。",
)

print(agent("今日は何日?"))

これを実行すると以下のようになってしまう(実行したのは2026年4月26日)。

$ python agent.py
こんにちは!今日の日は、2023年10月6日です。日付は毎月変わっていくので、いつでも確認できますよ。何か他にお手伝いできることがあれば、遠慮なくおっしゃってください。

LLM単体では現在時刻を知る術がないため、当然といえば当然なのだが、ツール呼び出しの引数に「今日の月日」を埋めてもらいたいユースケースだと地味に困る。

[今日は何の日?]

WikipediaのAPIに今日は何の日かを教えてくれるAPIがある。

api-spec-reader.toolforge.org

このAPIを呼び出すツールを生やしたエージェントを用意した。

import json
import urllib.request
from strands import Agent, tool

@tool
def wikipedia_on_this_day(month: int, day: int) -> str:
    """Wikipedia英語版の「On this day」フィードを取得する。

    Args:
        month: 月 (1-12)
        day: 日 (1-31)

    Returns:
        その日に起きた歴史上の主要な出来事を含むJSON文字列。
    """
    url = f"https://api.wikimedia.org/feed/v1/wikipedia/en/onthisday/selected/{month:02d}/{day:02d}"
    req = urllib.request.Request(
        url,
        headers={"User-Agent": "strands-sandbox-timely"},
    )
    with urllib.request.urlopen(req, timeout=30) as resp:
        data = json.loads(resp.read())
    return json.dumps(data, ensure_ascii=False)

agent = Agent(
    model="us.amazon.nova-micro-v1:0",
    callback_handler=None,
    system_prompt="あなたはユーザーの質問に親切に答えるエージェントです。",
    tools=[wikipedia_on_this_day],
)

print(agent("今日は何日?そして今日歴史上どんな出来事があった?"))

このままだと、エージェントは今日が何日か分からないので変な回答しかできない。

$ python agent.py
<thinking> 今天は10月24日です。そして10月24日の歴史上の主な出来事は以下の通りです。

1. 1889年:オーストラリアの首相サー・ヘンリー・パークスが、オーストラリアの6つの植民地の連邦化を呼びかけました。
2. 1929年:ニューヨーク証券取引所で株価が11%下落し、大恐慌の始まりを告げました。
3. 1931年:ジョージ・ワシントン橋が公開されました。
4. 1972年:イギリスのバークシャーで建設中のロッドン橋の偽工作物が崩壊し、3人が死亡しました。
5. 1975年:アイスランドの女性が、賃金格差と不当な雇用慣行に抗議して一日ストライキをしました。

これらの出来事のうち、最も注目すべきものや、興味深い出来事を選んでユーザーに伝えることができます。</thinking>

ユーザー、今日の主な歴史的出来事は1889年のサー・ヘンリー・パークスの演説と、1929年のニューヨーク証券取引所の株価下落の2つです。どちらについて詳しく知りたいですか?

[プロンプトに現在日時を差し込む]

一番ローコストな解決方法は、エージェントを呼び出す際にdatetime.now()などで現在日時を取り、ユーザープロンプトに追加すれば良い。

// timely-agent.py
from datetime import datetime 

//ほぼ同じなので省略

now = datetime.now()
print(agent(
    f"現在日時は {now.strftime('%Y-%m-%d %H:%M:%S')} です。"
    f"今日は何日?そして今日歴史上どんな出来事があった?"
))

これを実行すると以下のように、ちゃんと期待した日付で回答してくれる。

$ python timely-agent.py
<thinking> ユーザーが現在何日なのか尋ねた後、歴史上の重要な出来事として、4月26日に関する出来事を提供しました。 2026年4月26日には、具体的な出来事は見つかりませんでした。過去の4月26日の歴史的な出来事の中で、ユーザーが興味を持つかもしれないものを選びました。これらは、中国初の航空母艦「山東」の就役、エストニアにおけるブロンズ兵士の移転に対する抗議、ドイツのエルトルフでの学校銃撃事件、バングラデシュにおけるサイクロン、ウクライナのチェルノブイリ原子力発電所事故、タンザニアの成立、アメリカ合衆国における特許庁の創設、ベラルーシの独立などが挙げられます。</thinking> 
2026年4月26日には、具体的な歴史的な出来事は見つかりませんでした。以下は、過去の4月26日の歴史的な出来事の抜粋です。

2017年4月26日: 中国初の航空母艦「山東」が就役しました。
1989年4月26日: 中国の天安門広場での抗議活動に対する人民日報の編集が発表されました。
1986年4月26日: チェルノブイリ原子力発電所事故が発生しました。
//長いので省略
これらの出来事のいずれかについて詳しく知りたい場合は、お気軽にお知らせください。

修正後は渡した日付がそのまま「今日」として認識され、ツール呼び出しの引数にも反映されるようになった。

[まとめ]

  • Strands AgentでWikipediaのOn This Day APIを呼び出すエージェントを作った
  • ユーザープロンプトが「今日は何の日?」だけだと今日の日付を認識してくれなかった
  • ユーザープロンプトにdatetime.now()の値を渡すとちゃんと今日の日付でAPIを呼び出してくれた
  • 今回のサンプルコードはこちらのリポジトリにまとめた

github.com