やりたいこと
データを読み込むだけで、以下が自動で行われる仕組みを構築したい。
- 読み込んだデータがElasticsearchに自動登録される
- データと指示内容がGeminiに渡され、PlaybookやTool/Schemaが自動生成される
- 生成された内容が自動でPlaybookやToolに反映され、管理用エージェントと紐づいて構成される
前回の調査日記
あわせて読みたい


AI Agent開発日記 2025/06/05
やりたいこと データを読み込むだけで、以下が自動で行われる仕組みを構築したい。 読み込んだデータがElasticsearchに自動登録される データと指示内容がGeminiに渡さ...
目次
Agentbuilderの既存playbookを編集するpythonコードを作成する
- やりたいこと
- 下記の Python クライアントライブラリドキュメントを参考にして、既存playbookを編集するpythonコードを作成したい
- 現状
- ツールの参照設定がない状態の Playbook に対して編集できるコードは作成済み。
- ただし、Playbook にツールの参照設定がある場合、事前に Web UI でその参照を削除しないと 400 エラーが発生するという問題があるため、解決したい。
- 現在、以下の対応方法を調査中:
- Playbook からツールの参照設定を解除するコードの実装
- Playbook に特定のツールを参照させるコードの実装
- 現在、以下の対応方法を調査中:
参考ドキュメント
現状のコード
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# --- 設定情報(適宜置き換えてください) ---
PROJECT_ID = 'your-gcp-project-id'
LOCATION_ID = 'your-agent-location-id' # 例: 'global', 'us-central1'
AGENT_ID = 'your-agent-id'
PLAYBOOK_ID = 'your-playbook-id'
NEW_DISPLAY_NAME = 'Updated Playbook Name'
NEW_GOAL = """
このプレイブックの目的は、APIを使って表示名、ゴール、Instructionsを更新することです。
"""
NEW_INSTRUCTIONS = """
これはAPIで更新された新しいInstructionsです。
- 手順 A
- 手順 B
"""
def update_dialogflow_cx_playbook_fields(
project_id: str,
location_id: str,
agent_id: str,
playbook_id: str,
new_display_name: str = None,
new_goal: str = None,
new_instructions: str = None
):
"""
指定された Dialogflow CX プレイブックのフィールドを更新します。
Args:
project_id: Google Cloud プロジェクト ID
location_id: Dialogflow CX エージェントのロケーション ID
agent_id: Dialogflow CX エージェント ID
playbook_id: 更新対象のプレイブック ID
new_display_name: 新しい表示名(省略可)
new_goal: 新しいゴール(省略可)
new_instructions: 新しい Instructions テキスト(省略可)
"""
try:
credentials, _ = google.auth.default()
dialogflow_service = build('dialogflow', 'v3beta1', credentials=credentials)
playbook_name = f'projects/{project_id}/locations/{location_id}/agents/{agent_id}/playbooks/{playbook_id}'
update_body = {}
update_mask_parts = []
if new_display_name is not None:
update_body['displayName'] = new_display_name
update_mask_parts.append('displayName')
if new_goal is not None:
update_body['goal'] = new_goal
update_mask_parts.append('goal')
if new_instructions is not None:
update_body['instruction'] = {
'steps': [
{'text': new_instructions}
]
}
update_mask_parts.append('instruction.steps')
if not update_mask_parts:
print("更新するフィールドが指定されていません。")
return
update_mask = ','.join(update_mask_parts)
print(f"Updating playbook: {playbook_name}")
request = dialogflow_service.projects().locations().agents().playbooks().patch(
name=playbook_name,
updateMask=update_mask,
body=update_body
)
response = request.execute()
print("プレイブックの更新に成功しました。")
print(f"新しい表示名: {response.get('displayName', 'N/A')}")
print(f"新しいゴール: {response.get('goal', 'N/A')}")
except HttpError as e:
print(f"API エラー: {e}")
print(f"ステータスコード: {e.resp.status}")
print(f"理由: {e.resp.reason}")
if e.content:
print(f"詳細: {e.content.decode()}")
except Exception as e:
print(f"その他のエラーが発生しました: {e}")
if __name__ == '__main__':
update_dialogflow_cx_playbook_fields(
project_id=PROJECT_ID,
location_id=LOCATION_ID,
agent_id=AGENT_ID,
playbook_id=PLAYBOOK_ID,
new_display_name=NEW_DISPLAY_NAME,
new_goal=NEW_GOAL,
new_instructions=NEW_INSTRUCTIONS
)