Visual Agentにおける実行ログであるtraceの取り方について

お世話になっております。
Visual AgentにおいてDataiku社組み込みのToolとCustomToolの両方を使用しています。
Visual Agentはtraceと呼ばれる実行ログで情報管理していると理解しています。
組み込みToolを実行した得られた結果をCustomToolに連携するためにtraceの内容を渡したいと考えています。
しかし、以下のリンクを参考にコードを書きましたがToolの中で想定と異なるtraceが取得されます。
Agentがその時点で持っている情報を記載したtraceをCustom Toolで取得する方法を教えていただきたいです。
本来は他の組み込みToolを実行して得られた結果がtraceに記載されていると理解しています。
Creating a custom tool - Dataiku Developer Guide
def invoke(self, input, trace):
"""メイン処理:traceから検索結果を取得してサマリ化し、データセットに出力"""
try:
# traceから実際のツール実行結果を取得
with trace.subspan("Processing slide search results from trace") as subspan:
slide_results = self._extract_slide_results_from_trace(trace)
if not slide_results:
return {
"output": f"trace.__dict__ : {trace.__dict__} \n\n input : {input}",
"sources": [{
"toolCallDescription": "traceに検索結果が見つかりませんでした。"
}]
}
ご参考までに、上記で取得されているtraceの中身を共有いたします。
trace.__dict__ : {'span': {'type': 'span', 'name': 'PYTHON_AGENT_TOOL_CALL', 'children': [{'type': 'span', 'name': 'Processing slide search results from trace', 'children': [], 'attributes': {}, 'inputs': {}, 'outputs': {}, 'begin': '2025-07-10T03:23:34.839000Z'}], 'attributes': {}, 'inputs': {}, 'outputs': {}, 'begin': '2025-07-10T03:23:34.838000Z'}, 'previous_sb_on_thread': None, '_begin_ts': 1752117814838}
Operating system used: linux
Answers
-
Tsuyoshi Dataiker, PartnerAdmin, Dataiku DSS Core Designer, Dataiku DSS ML Practitioner, Dataiku DSS Adv Designer, Registered Posts: 290 Dataiker
DataikuのCode AgentやToolで利用するTrace / Tracerは「実行フローの記録・可視化・デバッグ」を目的としているため、Tool間のコンテキスト情報を受け渡す用途には合致しないものと考えられます。
そこで、Tool間でコンテキスト情報を受け渡したい場合、以下のような手順による対応が考えられます。
1. 必要なコンテキスト情報を受け取るように、Custom ToolのInputを定義し実装を行う。
2. Visual Agentのプロンプト記述にて、Managed Tool(組み込みTool)から受け取ったOutputをCustom ToolのInputに渡すように制御する。(上記の2について、Code Agentを利用した場合は、より厳密な制御やその他の実装方法も可能と考えられます。)
-
河原崎様
ありがとうございます。
ご回答いただき、誠にありがとうございます。
回答内容について理解することができました。
ご指摘いただいた手順で対応可能か確認してみます。
-
お世話になっております。
Visual Agentのプロンプト記述で情報の受け渡しを制御しようとしましたが、あまりうまくいきませんでした。
そこで三点ほど質問させてください。
前提として以下が、Custom Toolのコードの部分と、logに出力された結果になります。def invoke(self, input, trace):
"""メイン処理:traceからスライド検索結果を取得してサマリ化し、データセットに出力"""
try:
# traceから実際のツール実行結果を取得
with trace.subspan("Processing slide search results from trace") as subspan:
slide_results = self._extract_slide_results_from_trace(trace)
if not slide_results:
return {
"output": f"traceからスライド検索結果を取得できませんでした。trace.__dict__ : {trace.__dict__} \n\n input: {input}(1606)",
"sources": [{
"toolCallDescription": "traceにスライド検索結果が見つかりませんでした。(この文章はテストです。1151)"
}]
}'toolOutputs': [{'callId': 'call_qpKi2sGhYM0dEKr5UVFAnkj6', 'output': "traceからスライド検索結果を取得できませんでした。trace.__dict__ : {'span': {'type': 'span', 'name': 'PYTHON_AGENT_TOOL_CALL', 'children': [{'type': 'span', 'name': 'Processing slide search results from trace', 'children': [], 'attributes': {}, 'inputs': {}, 'outputs': {}, 'begin': '2025-07-15T05:44:37.819000Z'}], 'attributes': {}, 'inputs': {}, 'outputs': {}, 'begin': '2025-07-15T05:44:37.818000Z'}, 'previous_sb_on_thread': None, '_begin_ts': 1752558277818} \n\n input: {'context': {}, 'input': {'process_trace_data': True}}(1606)"}]
- そこで、再度の質問で恐縮ですが、「Visual Agentのプロンプト記述」とおっしゃっているのは以下画像の箇所で間違いないでしょうか?
プロンプトを少し修正した程度では情報の受け渡しが安定しなかったので、確認させてください。
また、時々以下のようなログが出力されて何らかの情報が受け渡されていますが、その形式が安定しません。加えて、河原崎様からご指摘いただいたように'context'に情報を渡すようにしましたが、input["input"]に情報が渡されています。
- Visual Agentを使っている限りでは、やはり厳密な情報の受け渡しは難しいでしょうか?
- また、デフォルトではinput["context"]は空で情報が渡されるものでしょうか?
※開発中のものであるため、大部分マスキングさせていただいております。
"output": {
"content": "traceからスライド検索結果を取得できませんでした。trace.dict : {'span': {'type': 'span', 'name': 'PYTHON_AGENT_TOOL_CALL', 'children': [{'type': 'span', 'name': 'Processing slide search results from trace', 'children': [], 'attributes': {}, 'inputs': {}, 'outputs': {}, 'begin': '2025-07-14T10:33:34.507000Z'}], 'attributes': {}, 'inputs': {}, 'outputs': {}, 'begin': '2025-07-14T10:33:34.507000Z'}, 'previous_sb_on_thread': None, '_begin_ts': 1752489214507} \n\n input: {'context': {}, 'input': {'process_trace_data': {<Visual Toolから得られた回答>}}(1606)" - そこで、再度の質問で恐縮ですが、「Visual Agentのプロンプト記述」とおっしゃっているのは以下画像の箇所で間違いないでしょうか?
-
Tsuyoshi Dataiker, PartnerAdmin, Dataiku DSS Core Designer, Dataiku DSS ML Practitioner, Dataiku DSS Adv Designer, Registered Posts: 290 Dataiker
@長戸 さん、回答にあたりまして、以下の2点ご教示いただけますでしょうか
質問1: 今回、カスタムToolで実現したい内容としては、ソースコードコメント記載のように「スライド検索結果を取得してサマリ化し、データセットに出力」(「スライド検索結果」は別のToolが取得したもの)という理解で合っていますでしょうか?
質問2: 以下のソースコードについて、メソッドの内部では具体的にどのような実装を行われていますでしょうか?
slide_results = self._extract_slide_results_from_trace(trace)
-
@Tsuyoshi
河原崎様
ご返信ありがとうございます。質問1:
今回、カスタムToolで実現したい内容としては、ソースコードコメント記載のように「スライド検索結果を取得してサマリ化し、データセットに出力」(「スライド検索結果」は別のToolが取得したもの)という理解で合っていますでしょうか?
おっしゃる通りの理解で相違ございません。
質問2:
以下のソースコードについて、メソッドの内部では具体的にどのような実装を行われていますでしょうか?
slide_results = self._extract_slide_results_from_trace(trace)
こちらは前のコードの名残になります。
処理の内容としては、json形式のtraceから別のToolが取得した「スライド検索結果」を機械的に抽出している処理になります。具体的には.get('toolCallDescription')などのメソッドを使用しています。
なので、ここをtrace→inputに置き換えて、処理をしたいと考えています。 -
Tsuyoshi Dataiker, PartnerAdmin, Dataiku DSS Core Designer, Dataiku DSS ML Practitioner, Dataiku DSS Adv Designer, Registered Posts: 290 Dataiker
@長戸 さん、追加情報のご連絡ありがとうございます。以下、回答させていただきます。
そこで、再度の質問で恐縮ですが、「Visual Agentのプロンプト記述」とおっしゃっているのは以下画像の箇所で間違いないでしょうか?
プロンプトを少し修正した程度では情報の受け渡しが安定しなかったので、確認させてください。→ はい。ご認識の通りです。例えば、私の環境で確認したところ、以下のような記述を行うことで、制御可能でした。
Visual Agentを使っている限りでは、やはり厳密な情報の受け渡しは難しいでしょうか?
→ ツール間の情報受け渡しは、Visual Agentの裏側で動いているフレームワーク、および利用するLLMの処理に依存します。このため、Code Agentで明示的に値の受け渡しや詰め替えを行うことに比べると、確かに厳密性が落ちる可能性はあります。
ただ、先の回答にも記載しましたように「必要なコンテキスト情報を受け取るように、Custom ToolのInputを定義し実装を行う」ことで、ある程度は制御可能です(この「コンテキスト情報」とは、システム的なコンテキストではなく、Toolが必要とするデータのことを意図しています)。
例えば、こちらのURLにスキーマの定義例が存在しますが、私の環境では以下のようにCustom Toolを定義することで、Managed Toolが生成したリストをInputとして受け取ることができました。
from dataiku.llm.agent_tools import BaseAgentTool import logging import dataiku class DataProcessingTool(BaseAgentTool): def set_config (self, config, plugin_config): self.logger = logging.getLogger(__name__) self.config = config self.plugin_config = plugin_config def get_descriptor(self, tool): return { "description": """入力されたリストをデータ加工して、その結果をデータセットに格納します。""", "inputSchema": { "title": "顧客データのリスト", "type": "object", "properties": { "customer_list": { "type": "array", "items": { "type": "object", "properties": { "顧客ID": {"type": "string"}, "生年月日": {"type": "string"}, "初回購入金額": {"type": "string"}, "キャンペーン": {"type": "string"}, "売上": {"type": "string"} } }, "description": "複数の顧客データを格納したリスト" } } } } def invoke(self, input, trace): args = input['input']['customer_list'] record_list = args[0] # 以下、必要なツールの処理を実装 ・・・・・・
また、デフォルトではinput["context"]は空で情報が渡されるものでしょうか?
※開発中のものであるため、大部分マスキングさせていただいております。→ はい。ご認識の通りです。現時点のVisual Agentの実装では、input["context"]は空になっていると考えられます。
-
河原崎様
ご丁寧にご回答いただき、誠にありがとうございます。
回答内容について理解することができました。
連携いただいた情報で、実装可能かどうか試してみます。