nikkie-ftnextの日記

イベントレポートや読書メモを発信

Agent Development Kit (Python) 1.24.0 でカスタムメトリクスが破壊的変更されました。第1引数 eval_metric を追加してください

はじめに

七尾百合子さん、お誕生日 326日目 おめでとうございます! nikkieです。

ADK 1.24.0 がリリースされました。
「⚠ BREAKING CHANGES」に載っていない breaking change をお知らせします。

目次

カスタムメトリクスが壊れます

1.23.0 で入ったカスタムメトリクス

ADK の評価まわりは実務レベルの機能が足りているとはお世辞にも言い難いので、ユーザが必要な評価ロジックを実装できる1この機能の追加は大きかったです。
カスタムメトリクスは以下のシグネチャの関数です。

from google.adk.evaluation.eval_case import Invocation
from google.adk.evaluation.evaluator import EvaluationResult

def custom_metric_function(
    actual_invocations: list[Invocation],
    expected_invocations: list[Invocation] | None,
    conversation_scenario: ConversationScenario | None = None,
) -> EvaluationResult:

ADK を 1.24.0 に上げると、このシグネチャのままでは動きません。
adk evalのログです。

2026-02-06 22:47:11,374 - ERROR - local_eval_service.py:357 - Metric evaluation failed for metric `practice_tool_trajectory_metric` for eval case id 'tests/fixture/home_automation_agent/simple_test.test.json' with following error `practice_tool_trajectory_metric() takes from 2 to 3 positional arguments but 4 were given`
Traceback (most recent call last):
  File "/.../adk-evaluation/.venv/lib/python3.13/site-packages/google/adk/evaluation/local_eval_service.py", line 348, in _evaluate_metric_for_eval_case
    evaluation_result = await self._evaluate_metric(
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
    )
    ^
  File "/.../adk-evaluation/.venv/lib/python3.13/site-packages/google/adk/evaluation/local_eval_service.py", line 432, in _evaluate_metric
    return await metric_evaluator.evaluate_invocations(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<3 lines>...
    )
    ^
  File "/.../adk-evaluation/.venv/lib/python3.13/site-packages/google/adk/evaluation/custom_metric_evaluator.py", line 70, in evaluate_invocations
    eval_result = self._metric_function(
        eval_metric,
    ...<2 lines>...
        conversation_scenario,
    )
TypeError: practice_tool_trajectory_metric() takes from 2 to 3 positional arguments but 4 were given

カスタムメトリクスに第1引数が追加されています!

原因の変更はリリースノートのこちら

Remove overall evaluation status calculation from _CustomMetricEvaluator and add threshold to custom metric function expected signature (553e376)

シグネチャはこうなりました。

from google.adk.evaluation.eval_case import Invocation
+from google.adk.evaluation.eval_metric import EvalMetric
from google.adk.evaluation.evaluator import EvaluationResult

def custom_metric_function(
+    eval_metric: EvalMetric,
    actual_invocations: list[Invocation],
    expected_invocations: list[Invocation] | None,
    conversation_scenario: ConversationScenario | None = None,
) -> EvaluationResult:

_CustomMetricEvaluatorのカスタムメトリクス関数を呼び出す箇所で4引数渡しています。
2引数または3引数しか受け取れないカスタムメトリクス関数のままではTypeErrorが送出されるというわけです。

なので、カスタムメトリクスに第1引数を追加すれば直ります。
追加した引数は一切使わなくてよいです(threshold にもアクセスできるようですが、宿題事項とします)

終わりに

ADK (Python) 1.23.0 でサポートされたカスタムメトリクスは、1.24.0 で3引数から4引数へとシグネチャの変更が起こりました。
第1引数を追加して各位ご対応ください。

直した例はこちら:

ADK をセマンティックバージョニングと捉えると、マイナーバージョンアップで既存コードが壊れすぎです。Why!?
他の例としては DB を使った session まわりも壊れます

開発者は思わぬ作業に直面してげんなりですし、ADK にとってもよい状態ではなく、ユーザが離れる要因になりえると思いますね。うーん