{"id":6580,"date":"2025-09-23T05:58:43","date_gmt":"2025-09-23T05:58:43","guid":{"rendered":"https:\/\/pokecon.jp\/job\/?p=6580"},"modified":"2025-09-23T05:58:43","modified_gmt":"2025-09-23T05:58:43","slug":"%e3%80%90agent-engine-%e3%81%ae-a2a-%e5%af%be%e5%bf%9c%e8%a8%98%e5%bf%b5%e3%80%91a2a-%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%82%a8%e3%83%bc%e3%82%b8%e3%82%a7%e3%83%b3%e3%83%88%e3%82%92-agent-engine","status":"publish","type":"post","link":"https:\/\/pokecon.jp\/job\/6580\/","title":{"rendered":"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b"},"content":{"rendered":"\n<\/p>\n<div>\n<aside class=\"msg message\"><span class=\"msg-symbol\">!<\/span><\/p>\n<div class=\"msg-content\">\n<p data-line=\"1\" class=\"code-line\">\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001ADK \u304c\u63d0\u4f9b\u3059\u308b A2A \u5bfe\u5fdc\u6a5f\u80fd\u3092\u5229\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\u3092\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002\u73fe\u5728\uff082025\u5e749\u6708\uff09\u3001ADK \u306e A2A \u5bfe\u5fdc\u6a5f\u80fd\u306f\u300cExperimental\u300d\u30d5\u30a7\u30fc\u30ba\u306e\u305f\u3081\u3001\u4eca\u5f8c\u3001\u30b3\u30fc\u30c9\u306e\u5b9f\u88c5\u65b9\u6cd5\u304c\u5909\u308f\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<\/div>\n<\/aside>\n<h2 id=\"%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB\" data-line=\"4\" class=\"code-line\">\n \u306f\u3058\u3081\u306b<\/h2>\n<p data-line=\"6\" class=\"code-line\">\u4e0b\u8a18\u306e\u8a18\u4e8b\u3067\u306f\u3001\u300c\u30cd\u30c3\u30c8\u8a18\u4e8b\u306e\u4f5c\u6210\u696d\u52d9\u300d\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30de\u30eb\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30b7\u30b9\u30c6\u30e0\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u3001A2A \u3067\u9023\u643a\u3055\u305b\u308b\u65b9\u6cd5\u3092\u8aac\u660e\u3057\u307e\u3057\u305f\u3002<\/p>\n<p data-line=\"10\" class=\"code-line\">\u3053\u306e\u969b\u3001Agent Engine \u306e\u524d\u6bb5\u306b Cloud Run \u3092\u7528\u3044\u3066 A2A \u30b5\u30fc\u30d0\u30fc\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u307e\u3057\u305f\u304c\u3001<strong>Agent Engine \u304c A2A \u5bfe\u5fdc\u3057\u305f\u305f\u3081\u3001A2A \u30b5\u30fc\u30d0\u30fc\u3092\u5225\u9014\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u5fc5\u8981\u304c\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002<\/strong> \u307e\u305f\u3001ADK \u304c\u6a19\u6e96\u63d0\u4f9b\u3059\u308b <code>RemoteA2aAgent<\/code> \u30af\u30e9\u30b9\u3092\u5229\u7528\u3059\u308b\u3068\u3001\u30ed\u30fc\u30ab\u30eb\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u307b\u307c\u540c\u3058\u65b9\u6cd5\u3067 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u305f A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u30b5\u30d6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b\u7d44\u307f\u8fbc\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u3064\u307e\u308a\u3001\u300c\u30cd\u30c3\u30c8\u8a18\u4e8b\u306e\u4f5c\u6210\u696d\u52d9\u300d\u306e\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30de\u30eb\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30b7\u30b9\u30c6\u30e0\u306f\u3001\u6b21\u306e\u56f3\u306e\u3088\u3046\u306b\u5b9f\u73fe\u3055\u308c\u307e\u3059\u3002<\/p>\n<p data-line=\"12\" class=\"code-line\"><img decoding=\"async\" src=\"https:\/\/res.cloudinary.com\/zenn\/image\/fetch\/s--Ifkp9bTK--\/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_1200\/https:\/\/storage.googleapis.com\/zenn-user-upload\/deployed-images\/044cfc8733141bcfa483e7e4.png%3Fsha%3Dc43d07aad83a4244f37ded596f10b181621bccf4\" width=\"800\" class=\"md-img\" loading=\"lazy\"\/><br \/><em>ADK + Agent Engine \u306b\u3088\u308b A2A \u30de\u30eb\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u6210<\/em><\/p>\n<p data-line=\"15\" class=\"code-line\">\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001\u4e0a\u56f3\u306e\u30b7\u30b9\u30c6\u30e0\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u624b\u9806\u3092\u5177\u4f53\u7684\u306b\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n<h2 id=\"%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99\" data-line=\"17\" class=\"code-line\">\n \u74b0\u5883\u6e96\u5099<\/h2>\n<p data-line=\"19\" class=\"code-line\">Vertex AI workbench \u306e\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u4e0a\u3067\u5b9f\u88c5\u3057\u306a\u304c\u3089\u8aac\u660e\u3059\u308b\u305f\u3081\u306b\u3001\u307e\u305a\u306f\u3001\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u306e\u5b9f\u884c\u74b0\u5883\u3092\u7528\u610f\u3057\u307e\u3059\u3002\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u305f\u3089\u3001Cloud Shell \u306e\u30b3\u30de\u30f3\u30c9\u7aef\u672b\u3092\u958b\u3044\u3066\u3001\u5fc5\u8981\u306a API \u3092\u6709\u52b9\u5316\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-bash\"><code class=\"language-bash code-line\" data-line=\"21\">gcloud services <span class=\"token builtin class-name\">enable<\/span> <span class=\"token punctuation\">\\<\/span>\n  aiplatform.googleapis.com <span class=\"token punctuation\">\\<\/span>\n  notebooks.googleapis.com <span class=\"token punctuation\">\\<\/span>\n  cloudresourcemanager.googleapis.com\n<\/code><\/pre>\n<\/div>\n<p data-line=\"28\" class=\"code-line\">\u7d9a\u3044\u3066\u3001\u30c7\u30d7\u30ed\u30a4\u306e\u969b\u306b\u4f7f\u7528\u3059\u308b\u30b9\u30c6\u30fc\u30b8\u30f3\u30b0\u30d0\u30b1\u30c3\u30c8\u3092\u7528\u610f\u3057\u3066\u3001Workbench \u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-bash\"><code class=\"language-bash code-line\" data-line=\"30\"><span class=\"token assign-left variable\">PROJECT_ID<\/span><span class=\"token operator\">=<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span>gcloud config list <span class=\"token parameter variable\">--format<\/span> <span class=\"token string\">'value(core.project)'<\/span><span class=\"token variable\">)<\/span><\/span>\n<span class=\"token assign-left variable\">BUCKET<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"gs:\/\/<span class=\"token variable\">${PROJECT_ID}<\/span>\"<\/span>\ngsutil mb <span class=\"token parameter variable\">-b<\/span> on <span class=\"token parameter variable\">-l<\/span> us-central1 <span class=\"token variable\">$BUCKET<\/span>\ngcloud workbench instances create agent-development <span class=\"token punctuation\">\\<\/span>\n  <span class=\"token parameter variable\">--project<\/span><span class=\"token operator\">=<\/span><span class=\"token variable\">$PROJECT_ID<\/span> <span class=\"token punctuation\">\\<\/span>\n  <span class=\"token parameter variable\">--location<\/span><span class=\"token operator\">=<\/span>us-central1-a <span class=\"token punctuation\">\\<\/span>\n  --machine-type<span class=\"token operator\">=<\/span>e2-standard-2\n<\/code><\/pre>\n<\/div>\n<p data-line=\"40\" class=\"code-line\">\u30af\u30e9\u30a6\u30c9\u30b3\u30f3\u30bd\u30fc\u30eb\u306e\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3\u30e1\u30cb\u30e5\u30fc\u304b\u3089\u300cVertex AI\u300d\u2192\u300cWorkbench\u300d\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u4f5c\u6210\u3057\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 agent-development \u304c\u3042\u308a\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5\u304c\u5b8c\u4e86\u3059\u308b\u306e\u3092\u5f85\u3063\u3066\u3001\u300cJUPYTERLAB \u3092\u958b\u304f\u300d\u3092\u30af\u30ea\u30c3\u30af\u3057\u305f\u3089\u3001\u300cPython 3(ipykernel)\u300d\u306e\u65b0\u898f\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"42\" class=\"code-line\">\u3053\u306e\u5f8c\u306f\u3001\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u306e\u30bb\u30eb\u3067\u30b3\u30fc\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"44\" class=\"code-line\">\u307e\u305a\u3001Agent Development Kit (ADK) \u3068 A2A SDK \u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"46\"><span class=\"token operator\">%<\/span>pip install <span class=\"token operator\">-<\/span><span class=\"token operator\">-<\/span>user \\\n    google<span class=\"token operator\">-<\/span>adk<span class=\"token operator\">==<\/span><span class=\"token number\">1.14<\/span><span class=\"token number\">.1<\/span> \\\n    google<span class=\"token operator\">-<\/span>genai<span class=\"token operator\">==<\/span><span class=\"token number\">1.36<\/span><span class=\"token number\">.0<\/span> \\\n    google<span class=\"token operator\">-<\/span>cloud<span class=\"token operator\">-<\/span>aiplatform<span class=\"token operator\">==<\/span><span class=\"token number\">1.113<\/span><span class=\"token number\">.0<\/span> \\\n    a2a<span class=\"token operator\">-<\/span>sdk<span class=\"token operator\">==<\/span><span class=\"token number\">0.3<\/span><span class=\"token number\">.5<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"54\" class=\"code-line\">\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6642\u306b\u8868\u793a\u3055\u308c\u308b <code>ERROR: pip's dependency resolver does not currently take into...<\/code> \u3068\u3044\u3046\u30a8\u30e9\u30fc\u306f\u7121\u8996\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<p data-line=\"56\" class=\"code-line\">\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305f\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u5229\u7528\u53ef\u80fd\u306b\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3067\u30ab\u30fc\u30cd\u30eb\u3092\u518d\u8d77\u52d5\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"58\"><span class=\"token keyword\">import<\/span> IPython\napp <span class=\"token operator\">=<\/span> IPython<span class=\"token punctuation\">.<\/span>Application<span class=\"token punctuation\">.<\/span>instance<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n_ <span class=\"token operator\">=<\/span> app<span class=\"token punctuation\">.<\/span>kernel<span class=\"token punctuation\">.<\/span>do_shutdown<span class=\"token punctuation\">(<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"64\" class=\"code-line\">\u518d\u8d77\u52d5\u3092\u78ba\u8a8d\u3059\u308b\u30dd\u30c3\u30d7\u30a2\u30c3\u30d7\u304c\u8868\u793a\u3055\u308c\u308b\u306e\u3067 [Ok] \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"66\" class=\"code-line\">\u7d9a\u3044\u3066\u3001\u5fc5\u8981\u306a\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30a4\u30f3\u30dd\u30fc\u30c8\u3057\u3066\u3001\u5b9f\u884c\u74b0\u5883\u306e\u521d\u671f\u8a2d\u5b9a\u3092\u884c\u3044\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"68\"><span class=\"token keyword\">import<\/span> httpx<span class=\"token punctuation\">,<\/span> json<span class=\"token punctuation\">,<\/span> os<span class=\"token punctuation\">,<\/span> uuid\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>auth <span class=\"token keyword\">import<\/span> default\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>auth<span class=\"token punctuation\">.<\/span>transport<span class=\"token punctuation\">.<\/span>requests <span class=\"token keyword\">import<\/span> Request\n<span class=\"token keyword\">import<\/span> vertexai\n\n\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>genai<span class=\"token punctuation\">.<\/span>types <span class=\"token keyword\">import<\/span> Part<span class=\"token punctuation\">,<\/span> Content<span class=\"token punctuation\">,<\/span> HttpOptions\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>agents<span class=\"token punctuation\">.<\/span>callback_context <span class=\"token keyword\">import<\/span> CallbackContext\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>agents<span class=\"token punctuation\">.<\/span>llm_agent <span class=\"token keyword\">import<\/span> LlmAgent\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>agents<span class=\"token punctuation\">.<\/span>remote_a2a_agent <span class=\"token keyword\">import<\/span> RemoteA2aAgent\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>agents<span class=\"token punctuation\">.<\/span>sequential_agent <span class=\"token keyword\">import<\/span> SequentialAgent\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>artifacts <span class=\"token keyword\">import<\/span> InMemoryArtifactService\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>memory<span class=\"token punctuation\">.<\/span>in_memory_memory_service <span class=\"token keyword\">import<\/span> InMemoryMemoryService\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>models <span class=\"token keyword\">import<\/span> LlmResponse<span class=\"token punctuation\">,<\/span> LlmRequest\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>runners <span class=\"token keyword\">import<\/span> Runner\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>sessions <span class=\"token keyword\">import<\/span> InMemorySessionService<span class=\"token punctuation\">,<\/span> VertexAiSessionService\n\n\n<span class=\"token keyword\">from<\/span> a2a<span class=\"token punctuation\">.<\/span>client <span class=\"token keyword\">import<\/span> ClientConfig<span class=\"token punctuation\">,<\/span> ClientFactory\n<span class=\"token keyword\">from<\/span> a2a<span class=\"token punctuation\">.<\/span>types <span class=\"token keyword\">import<\/span> AgentCard<span class=\"token punctuation\">,<\/span> TransportProtocol\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>a2a<span class=\"token punctuation\">.<\/span>executor<span class=\"token punctuation\">.<\/span>a2a_agent_executor <span class=\"token keyword\">import<\/span> A2aAgentExecutor\n<span class=\"token keyword\">from<\/span> google<span class=\"token punctuation\">.<\/span>adk<span class=\"token punctuation\">.<\/span>a2a<span class=\"token punctuation\">.<\/span>utils<span class=\"token punctuation\">.<\/span>agent_card_builder <span class=\"token keyword\">import<\/span> AgentCardBuilder\n\n\n<span class=\"token keyword\">from<\/span> vertexai <span class=\"token keyword\">import<\/span> agent_engines\n<span class=\"token keyword\">from<\/span> vertexai<span class=\"token punctuation\">.<\/span>preview<span class=\"token punctuation\">.<\/span>reasoning_engines <span class=\"token keyword\">import<\/span> A2aAgent\n<span class=\"token keyword\">from<\/span> vertexai<span class=\"token punctuation\">.<\/span>preview<span class=\"token punctuation\">.<\/span>reasoning_engines<span class=\"token punctuation\">.<\/span>templates<span class=\"token punctuation\">.<\/span>a2a <span class=\"token keyword\">import<\/span> create_agent_card\n\n\n<span class=\"token punctuation\">[<\/span>PROJECT_ID<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> !gcloud config <span class=\"token builtin\">list<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">-<\/span><span class=\"token builtin\">format<\/span> <span class=\"token string\">'value(core.project)'<\/span>\n<span class=\"token punctuation\">[<\/span>PROJECT_NUMBER<span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> !gcloud projects describe <span class=\"token punctuation\">{<\/span>PROJECT_ID<span class=\"token punctuation\">}<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">-<\/span><span class=\"token builtin\">format<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">'value(projectNumber)'<\/span>\nLOCATION <span class=\"token operator\">=<\/span> <span class=\"token string\">'us-central1'<\/span>\n\nvertexai<span class=\"token punctuation\">.<\/span>init<span class=\"token punctuation\">(<\/span>project<span class=\"token operator\">=<\/span>PROJECT_ID<span class=\"token punctuation\">,<\/span> location<span class=\"token operator\">=<\/span>LOCATION<span class=\"token punctuation\">,<\/span>\n              staging_bucket<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'gs:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>PROJECT_ID<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">'<\/span><\/span><span class=\"token punctuation\">)<\/span>\n\nos<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">[<\/span><span class=\"token string\">'GOOGLE_CLOUD_PROJECT'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> PROJECT_ID\nos<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">[<\/span><span class=\"token string\">'GOOGLE_CLOUD_LOCATION'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> LOCATION\nos<span class=\"token punctuation\">.<\/span>environ<span class=\"token punctuation\">[<\/span><span class=\"token string\">'GOOGLE_GENAI_USE_VERTEXAI'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token string\">'True'<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"110\" class=\"code-line\">\u307e\u305f\u3001\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u4e0a\u3067\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u5229\u7528\u3059\u308b\u305f\u3081\u306e\u7c21\u6613\u30a2\u30d7\u30ea\u306e\u30af\u30e9\u30b9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"112\"><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">LocalApp<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> agent<span class=\"token punctuation\">,<\/span> app_name<span class=\"token operator\">=<\/span><span class=\"token string\">'default_app'<\/span><span class=\"token punctuation\">,<\/span> user_id<span class=\"token operator\">=<\/span><span class=\"token string\">'default_user'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        self<span class=\"token punctuation\">.<\/span>_agent <span class=\"token operator\">=<\/span> agent\n        self<span class=\"token punctuation\">.<\/span>_app_name <span class=\"token operator\">=<\/span> app_name\n        self<span class=\"token punctuation\">.<\/span>_user_id <span class=\"token operator\">=<\/span> user_id\n        self<span class=\"token punctuation\">.<\/span>_runner <span class=\"token operator\">=<\/span> Runner<span class=\"token punctuation\">(<\/span>\n            app_name<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_app_name<span class=\"token punctuation\">,<\/span>\n            agent<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_agent<span class=\"token punctuation\">,<\/span>\n            artifact_service<span class=\"token operator\">=<\/span>InMemoryArtifactService<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n            session_service<span class=\"token operator\">=<\/span>InMemorySessionService<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n            memory_service<span class=\"token operator\">=<\/span>InMemoryMemoryService<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">)<\/span>\n        self<span class=\"token punctuation\">.<\/span>_session <span class=\"token operator\">=<\/span> <span class=\"token boolean\">None<\/span>\n        \n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">stream<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>_session<span class=\"token punctuation\">:<\/span>\n            self<span class=\"token punctuation\">.<\/span>_session <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_runner<span class=\"token punctuation\">.<\/span>session_service<span class=\"token punctuation\">.<\/span>create_session<span class=\"token punctuation\">(<\/span>\n                app_name<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_app_name<span class=\"token punctuation\">,<\/span>\n                user_id<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_user_id<span class=\"token punctuation\">,<\/span>\n                session_id<span class=\"token operator\">=<\/span>uuid<span class=\"token punctuation\">.<\/span>uuid4<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span><span class=\"token builtin\">hex<\/span><span class=\"token punctuation\">,<\/span>\n            <span class=\"token punctuation\">)<\/span>\n        content <span class=\"token operator\">=<\/span> Content<span class=\"token punctuation\">(<\/span>role<span class=\"token operator\">=<\/span><span class=\"token string\">'user'<\/span><span class=\"token punctuation\">,<\/span> parts<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>Part<span class=\"token punctuation\">(<\/span>text<span class=\"token operator\">=<\/span>query<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\n        async_events <span class=\"token operator\">=<\/span> self<span class=\"token punctuation\">.<\/span>_runner<span class=\"token punctuation\">.<\/span>run_async<span class=\"token punctuation\">(<\/span>\n            user_id<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_user_id<span class=\"token punctuation\">,<\/span>\n            session_id<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_session<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">id<\/span><span class=\"token punctuation\">,<\/span>\n            new_message<span class=\"token operator\">=<\/span>content<span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">)<\/span>\n        result <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">for<\/span> event <span class=\"token keyword\">in<\/span> async_events<span class=\"token punctuation\">:<\/span>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span>event<span class=\"token punctuation\">.<\/span>content <span class=\"token keyword\">and<\/span> event<span class=\"token punctuation\">.<\/span>content<span class=\"token punctuation\">.<\/span>parts<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n                response <span class=\"token operator\">=<\/span> <span class=\"token string\">'\\n'<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">[<\/span>p<span class=\"token punctuation\">.<\/span>text <span class=\"token keyword\">for<\/span> p <span class=\"token keyword\">in<\/span> event<span class=\"token punctuation\">.<\/span>content<span class=\"token punctuation\">.<\/span>parts <span class=\"token keyword\">if<\/span> p<span class=\"token punctuation\">.<\/span>text<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span>\n                <span class=\"token keyword\">if<\/span> response<span class=\"token punctuation\">:<\/span>\n                    <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">)<\/span>\n                    result<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span> result\n<\/code><\/pre>\n<\/div>\n<h2 id=\"%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%82%A8%E3%83%BC%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%81%A8-agent-engine-%E3%81%B8%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4\" data-line=\"150\" class=\"code-line\">\n \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u5b9a\u7fa9\u3068 Agent Engine \u3078\u306e\u30c7\u30d7\u30ed\u30a4<\/h2>\n<p data-line=\"152\" class=\"code-line\">\u4eca\u56de\u306e\u69cb\u6210\u3067\u306f\u3001\u6b21\u306e 4 \u3064\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u4f7f\u7528\u3057\u307e\u3059\u3002<\/p>\n<ul data-line=\"154\" class=\"code-line\">\n<li data-line=\"154\" class=\"code-line\">\n<code>research_agent1<\/code>\uff1a\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u306e\u8abf\u67fb\u9805\u76ee\u3092\u9078\u5b9a\u3059\u308b<\/li>\n<li data-line=\"155\" class=\"code-line\">\n<code>research_agent2<\/code>\uff1a\u9078\u5b9a\u3057\u305f\u9805\u76ee\u306b\u57fa\u3065\u3044\u3066\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<li data-line=\"156\" class=\"code-line\">\n<code>writer_agent<\/code>\uff1a\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b<\/li>\n<li data-line=\"157\" class=\"code-line\">\n<code>review_agent<\/code>\uff1a\u8a18\u4e8b\u3092\u30ec\u30d3\u30e5\u30fc\u3059\u308b<\/li>\n<\/ul>\n<p data-line=\"159\" class=\"code-line\">\u3053\u308c\u3089\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u5b9a\u7fa9\u3057\u305f\u5f8c\u306b\u3001Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u3001A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u547c\u3073\u51fa\u305b\u308b\u3088\u3046\u306b\u3057\u307e\u3059\u3002\u307e\u305a\u306f\u3001\u305d\u308c\u305e\u308c\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"161\" class=\"code-line\"><code>research_agent1<\/code><\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"162\">instruction <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u3042\u306a\u305f\u306e\u5f79\u5272\u306f\u3001\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u4e8b\u3067\u3059\u3002\n\u6307\u5b9a\u3055\u308c\u305f\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u3092\u57f7\u7b46\u3059\u308b\u969b\u306b\u53c2\u8003\u3068\u306a\u308b\u30c8\u30d4\u30c3\u30af\u3092\uff15\u9805\u76ee\u7a0b\u5ea6\u306e\u30ea\u30b9\u30c8\u306b\u307e\u3068\u3081\u307e\u3059\u3002\n\u5f8c\u6bb5\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u3053\u306e\u30ea\u30b9\u30c8\u306b\u57fa\u3065\u3044\u3066\u3001\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\n\n* \u51fa\u529b\u5f62\u5f0f\n\u65e5\u672c\u8a9e\u3067\u51fa\u529b\u3002\n'''<\/span>\n\nresearch_agent1 <span class=\"token operator\">=<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent1'<\/span><span class=\"token punctuation\">,<\/span>\n    model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.5-flash'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\uff08\u30c6\u30fc\u30de\u9078\u5b9a\uff09'<\/span><span class=\"token punctuation\">,<\/span>\n    instruction<span class=\"token operator\">=<\/span>instruction<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"179\" class=\"code-line\"><code>research_agent2<\/code><\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"180\">instruction <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u3042\u306a\u305f\u306e\u5f79\u5272\u306f\u3001\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u4e8b\u3067\u3059\u3002\n\u524d\u6bb5\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306f\u3001\uff15\u9805\u76ee\u7a0b\u5ea6\u306e\u8abf\u67fb\u5bfe\u8c61\u30c8\u30d4\u30c3\u30af\u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\n\n* \u51fa\u529b\u5f62\u5f0f\n\u65e5\u672c\u8a9e\u3067\u51fa\u529b\u3002\n\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u306f\u3001\u30c8\u30d4\u30c3\u30af\u3054\u3068\u306b\u5ba2\u89b3\u7684\u60c5\u5831\u3092\u307e\u3068\u3081\u307e\u3059\u3002\u5404\u30c8\u30d4\u30c3\u30af\u306b\u3064\u3044\u3066\u3001\uff15\u6587\u4ee5\u4e0a\u306e\u9577\u3055\u3067\u8a18\u8ff0\u3059\u308b\u3053\u3068\u3002\n'''<\/span>\n\nresearch_agent2 <span class=\"token operator\">=<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent2'<\/span><span class=\"token punctuation\">,<\/span>\n    model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.5-flash'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\uff08\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\uff09'<\/span><span class=\"token punctuation\">,<\/span>\n    instruction<span class=\"token operator\">=<\/span>instruction<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"197\" class=\"code-line\"><code>writer_agent<\/code><\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"198\">instruction <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u3042\u306a\u305f\u306e\u5f79\u5272\u306f\u3001\u7279\u5b9a\u306e\u30c6\u30fc\u30de\u306b\u95a2\u3059\u308b\u6c17\u8efd\u306a\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u66f8\u304f\u3053\u3068\u3067\u3059\u3002\n\u8a18\u4e8b\u306e\u300c\u30c6\u30fc\u30de\u300d\u3068\u3001\u305d\u306e\u5185\u5bb9\u306b\u95a2\u9023\u3059\u308b\u300c\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u300d\u304c\u4e0e\u3048\u3089\u308c\u308b\u306e\u3067\u3001\n\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u306b\u8a18\u8f09\u306e\u5ba2\u89b3\u7684\u4e8b\u5b9f\u306b\u57fa\u3065\u3044\u3066\u3001\u4fe1\u983c\u6027\u306e\u3042\u308b\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u66f8\u3044\u3066\u304f\u3060\u3055\u3044\u3002\n\n**\u51fa\u529b\u6761\u4ef6**\n- \u30c8\u30d4\u30c3\u30af\u306b\u95a2\u3057\u3066\u3042\u308b\u7a0b\u5ea6\u306e\u57fa\u790e\u77e5\u8b58\u304c\u3042\u308b\u8aad\u8005\u3092\u524d\u63d0\u3068\u3057\u3066\u3001\u6570\u5206\u3067\u6c17\u8efd\u306b\u8aad\u3081\u308b\u5185\u5bb9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n- \u6bd4\u8f03\u7684\u30ab\u30b8\u30e5\u30a2\u30eb\u3067\u8a9e\u308a\u304b\u3051\u308b\u53e3\u8abf\u306e\u6587\u7ae0\u306b\u3057\u307e\u3059\u3002\n- \u601d\u8003\u904e\u7a0b\u306f\u51fa\u529b\u305b\u305a\u306b\u3001\u6700\u7d42\u7d50\u679c\u3060\u3051\u3092\u51fa\u529b\u3057\u307e\u3059\u3002\n- \u8a18\u4e8b\u30bf\u30a4\u30c8\u30eb\u306f\u4ed8\u3051\u306a\u3044\u3067\u3001\u6b21\u306e\u69cb\u6210\u3067\u51fa\u529b\u3057\u307e\u3059\u3002\u5404\u30bb\u30af\u30b7\u30e7\u30f3\u30bf\u30a4\u30c8\u30eb\u306f\u3001\u5185\u5bb9\u306b\u5408\u308f\u305b\u3066\u30a2\u30ec\u30f3\u30b8\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n0. \u5c0e\u5165\uff1a\u30bb\u30af\u30b7\u30e7\u30f3\u30bf\u30a4\u30c8\u30eb\u3092\u4ed8\u3051\u306a\u3044\u3067\u3001\u3053\u306e\u8a18\u4e8b\u3092\u8aad\u307f\u305f\u304f\u306a\u308b\u5c0e\u5165\u3092\uff11\u301c\uff12\u6587\u306b\u307e\u3068\u3081\u307e\u3059\u3002\n1. \u6982\u8981\uff1a\u30c8\u30d4\u30c3\u30af\u306e\u5168\u4f53\u50cf\u3092\u307e\u3068\u3081\u3066\u7c21\u5358\u306b\u8aac\u660e\u3057\u307e\u3059\u3002\n2. \u6700\u65b0\u60c5\u5831\uff1a\u7279\u306b\u6ce8\u76ee\u3057\u305f\u3044\u65b0\u3057\u3044\u60c5\u5831\u3092\u53d6\u308a\u4e0a\u3052\u307e\u3059\u3002\n3. \u5b9f\u8df5\uff1a\u30c8\u30d4\u30c3\u30af\u306b\u95a2\u3057\u3066\u3001\u8aad\u8005\u81ea\u8eab\u304c\u3084\u3063\u3066\u307f\u308b\u3068\u3088\u3055\u305d\u3046\u306a\u4e8b\u3092\uff11\u3064\u7d39\u4ecb\u3057\u307e\u3059\u3002\n4. \u307e\u3068\u3081\n\n- \u5404\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u30bf\u30a4\u30c8\u30eb\u306f\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u30d8\u30c3\u30c0 ## \u4ed8\u3051\u307e\u3059\u3002\u5fc5\u8981\u306b\u5fdc\u3058\u3066\u7b87\u6761\u66f8\u304d\u306e\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\n- \u305d\u308c\u4ee5\u5916\u306e\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u306b\u3088\u308b\u88c5\u98fe\u306f\u884c\u3044\u307e\u305b\u3093\u3002\n\n**\u30ec\u30d3\u30e5\u30a2\u30fc\u306e\u6307\u793a\u306b\u5fdc\u3058\u305f\u4fee\u6b63**\n- \u30ec\u30d3\u30e5\u30a2\u30fc\u304c\u4fee\u6b63\u30dd\u30a4\u30f3\u30c8\u3092\u63d0\u793a\u3057\u305f\u969b\u306f\u3001\u51fa\u529b\u6761\u4ef6\u306b\u3053\u3060\u308f\u3089\u305a\u306b\u3001\u76f4\u524d\u306e\u8a18\u4e8b\u3092\u6307\u793a\u306b\u5f93\u3063\u3066\u4fee\u6b63\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n- \u4fee\u6b63\u30dd\u30a4\u30f3\u30c8\u4ee5\u5916\u306e\u90e8\u5206\u306f\u3001\u4fee\u6b63\u3059\u308b\u5fc5\u8981\u3042\u308a\u307e\u305b\u3093\u3002\n'''<\/span>\n\nwriter_agent <span class=\"token operator\">=<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'writer_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.5-flash'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u7279\u5b9a\u306e\u30c6\u30fc\u30de\u306b\u95a2\u3059\u308b\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u66f8\u304f\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n    instruction<span class=\"token operator\">=<\/span>instruction<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"230\" class=\"code-line\"><code>review_agent<\/code><\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"231\">instruction <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'''\n\u3042\u306a\u305f\u306e\u5f79\u5272\u306f\u3001\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u30ec\u30d3\u30e5\u30fc\u3057\u3066\u3001\u8a18\u4e8b\u306e\u6761\u4ef6\u306b\u3042\u3063\u305f\u5185\u5bb9\u306b\u3059\u308b\u305f\u3081\u306e\u6539\u5584\u30b3\u30e1\u30f3\u30c8\u3092\u4e0e\u3048\u308b\u4e8b\u3067\u3059\u3002\n\n* \u8a18\u4e8b\u306e\u6761\u4ef6\n- \u8a18\u4e8b\u306f\u3001\u306f\u3058\u3081\u306b\uff14\uff10\u6587\u5b57\u7a0b\u5ea6\u306e\u30bf\u30a4\u30c8\u30eb\u304c\u3042\u308b\u3053\u3068\u3002\n\u3000\u4eca\u65e5\u304b\u3089\u5f79\u7acb\u3064\u751f\u6d3b\u60c5\u5831\u304c\u3042\u3063\u3066\u300c\u3059\u3050\u306b\u8aad\u307e\u306a\u304d\u3083\u300d\u3068\u8aad\u8005\u304c\u611f\u3058\u308b\u30bf\u30a4\u30c8\u30eb\u306b\u3059\u308b\u3053\u3068\u3002\n\u3000\u30bf\u30a4\u30c8\u30eb\u306f\u30de\u30fc\u30af\u30c0\u30a6\u30f3\u30d8\u30c3\u30c0 # \u3092\u3064\u3051\u308b\u3053\u3068\u3002\n- \u30bf\u30a4\u30c8\u30eb\u306e\u76f4\u5f8c\u306b\u300c\u306a\u305c\u3044\u307e\u3053\u306e\u30c6\u30fc\u30de\u3092\u53d6\u308a\u4e0a\u3052\u308b\u306e\u304b\u300d\u3092\u307e\u3068\u3081\u305f\u5c0e\u5165\u3092\u52a0\u3048\u3066\u3001\u8aad\u8005\u306b\u3053\u306e\u8a18\u4e8b\u3092\u8aad\u3080\u52d5\u6a5f\u3065\u3051\u3092\u4e0e\u3048\u307e\u3059\u3002\n- \u5404\u30bb\u30af\u30b7\u30e7\u30f3\u306e\u30b5\u30d6\u30bf\u30a4\u30c8\u30eb\u306b\u306f\u3001\u7d75\u6587\u5b57\u3092\u7528\u3044\u3066\u89aa\u3057\u307f\u3084\u3059\u3055\u3092\u51fa\u3059\u3053\u3068\u3002\n- \u8aad\u8005\u304c\u4eca\u65e5\u304b\u3089\u5b9f\u8df5\u3067\u304d\u308b\u5177\u4f53\u4f8b\u304c\uff13\u3064\u4ee5\u4e0a\u7d39\u4ecb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3002\n\n* \u51fa\u529b\u5f62\u5f0f\n- \u65e5\u672c\u8a9e\u3067\u51fa\u529b\u3002\n- \u306f\u3058\u3081\u306b\u3001\u8a18\u4e8b\u306e\u826f\u3044\u70b9\u3092\u8aac\u660e\u3057\u307e\u3059\u3002\n- \u6b21\u306b\u3001\u4fee\u6b63\u30dd\u30a4\u30f3\u30c8\u3092\u7b87\u6761\u66f8\u304d\u3067\u51fa\u529b\u3057\u307e\u3059\u3002\n'''<\/span><\/span>\n\nreview_agent <span class=\"token operator\">=<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'review_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.5-flash'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u30ec\u30d3\u30e5\u30fc\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n    instruction<span class=\"token operator\">=<\/span>instruction<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"257\" class=\"code-line\">\u3053\u308c\u3089\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u3001Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u307e\u3059\u3002\u306a\u304a\u3001Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b\u306f\u30e6\u30cb\u30fc\u30af\u306a\u30ea\u30bd\u30fc\u30b9 ID \u304c\u4ed8\u4e0e\u3055\u308c\u307e\u3059\u304c\u3001\u3053\u306e\u5f8c\u3067\u8aac\u660e\u3059\u308b\u3088\u3046\u306b\u3001\u3053\u306e\u30ea\u30bd\u30fc\u30b9 ID \u304b\u3089 A2A \u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30ab\u30fc\u30c9\u3092\u53d6\u5f97\u3059\u308b URL \u304c\u6c7a\u307e\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"259\" class=\"code-line\">\u307e\u305a\u3001\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u540d\u304b\u3089\u5bfe\u5fdc\u3059\u308b\u30ea\u30bd\u30fc\u30b9 ID \u3092\u53d6\u5f97\u3059\u308b\u95a2\u6570 <code>get_agent_resource()<\/code> \u3092\u7528\u610f\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"262\"><span class=\"token keyword\">def<\/span> <span class=\"token function\">get_agent_resource<\/span><span class=\"token punctuation\">(<\/span>agent_name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">for<\/span> agent <span class=\"token keyword\">in<\/span> agent_engines<span class=\"token punctuation\">.<\/span><span class=\"token builtin\">list<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">if<\/span> agent<span class=\"token punctuation\">.<\/span>display_name <span class=\"token operator\">==<\/span> agent_name<span class=\"token punctuation\">:<\/span>\n            <span class=\"token keyword\">return<\/span> agent<span class=\"token punctuation\">.<\/span>resource_name\n    <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"270\" class=\"code-line\">\u7d9a\u3044\u3066\u3001A2A \u30b5\u30fc\u30d0\u30fc\u6a5f\u80fd\u306b\u95a2\u9023\u3059\u308b\u95a2\u6570\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"272\">\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">MyVertexAiSessionService<\/span><span class=\"token punctuation\">(<\/span>VertexAiSessionService<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">create_session<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> app_name<span class=\"token punctuation\">,<\/span> user_id<span class=\"token punctuation\">,<\/span> state<span class=\"token operator\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span> session_id<span class=\"token operator\">=<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        \n        session <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> <span class=\"token builtin\">super<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>create_session<span class=\"token punctuation\">(<\/span>\n            app_name<span class=\"token operator\">=<\/span>app_name<span class=\"token punctuation\">,<\/span>\n            user_id<span class=\"token operator\">=<\/span>user_id<span class=\"token punctuation\">,<\/span>\n            state<span class=\"token operator\">=<\/span>state<span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span> session\n\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">get_session<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> app_name<span class=\"token punctuation\">,<\/span> user_id<span class=\"token punctuation\">,<\/span> session_id<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        \n        <span class=\"token keyword\">try<\/span><span class=\"token punctuation\">:<\/span>\n            session <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> <span class=\"token builtin\">super<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>get_session<span class=\"token punctuation\">(<\/span>\n                app_name<span class=\"token operator\">=<\/span>app_name<span class=\"token punctuation\">,<\/span>\n                user_id<span class=\"token operator\">=<\/span>user_id<span class=\"token punctuation\">,<\/span>\n                session_id<span class=\"token operator\">=<\/span>session_id<span class=\"token punctuation\">,<\/span>\n            <span class=\"token punctuation\">)<\/span>\n            <span class=\"token keyword\">return<\/span> session\n        <span class=\"token keyword\">except<\/span><span class=\"token punctuation\">:<\/span>\n            <span class=\"token keyword\">return<\/span> <span class=\"token boolean\">None<\/span>\n\n\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_create_runner_class<\/span><span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">,<\/span> resource_name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">create_runner<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">return<\/span> Runner<span class=\"token punctuation\">(<\/span>\n            \n            app_name<span class=\"token operator\">=<\/span>resource_name <span class=\"token keyword\">or<\/span> agent<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span>\n            agent<span class=\"token operator\">=<\/span>agent<span class=\"token punctuation\">,<\/span>\n            artifact_service<span class=\"token operator\">=<\/span>InMemoryArtifactService<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n            session_service<span class=\"token operator\">=<\/span>MyVertexAiSessionService<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n            memory_service<span class=\"token operator\">=<\/span>InMemoryMemoryService<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">)<\/span>\n    <span class=\"token keyword\">return<\/span> create_runner\n\n\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_agent_executor_class<\/span><span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">,<\/span> resource_name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">agent_executor_builder<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">return<\/span> A2aAgentExecutor<span class=\"token punctuation\">(<\/span>\n            runner<span class=\"token operator\">=<\/span>get_create_runner_class<span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">,<\/span> resource_name<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">)<\/span>       \n    <span class=\"token keyword\">return<\/span> agent_executor_builder\n\n\n<span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">get_agent_card<\/span><span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    builder <span class=\"token operator\">=<\/span> AgentCardBuilder<span class=\"token punctuation\">(<\/span>agent<span class=\"token operator\">=<\/span>agent<span class=\"token punctuation\">)<\/span>\n    adk_agent_card <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> builder<span class=\"token punctuation\">.<\/span>build<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n    <span class=\"token keyword\">return<\/span> create_agent_card<span class=\"token punctuation\">(<\/span>\n        agent_name<span class=\"token operator\">=<\/span>adk_agent_card<span class=\"token punctuation\">.<\/span>name<span class=\"token punctuation\">,<\/span>\n        description<span class=\"token operator\">=<\/span>adk_agent_card<span class=\"token punctuation\">.<\/span>description<span class=\"token punctuation\">,<\/span>\n        skills<span class=\"token operator\">=<\/span>adk_agent_card<span class=\"token punctuation\">.<\/span>skills\n    <span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<aside class=\"msg message\"><span class=\"msg-symbol\">!<\/span><\/p>\n<div class=\"msg-content\">\n<p data-line=\"330\" class=\"code-line\"><strong><code>A2aAgentExecutor<\/code> \u30af\u30e9\u30b9\u306b\u3064\u3044\u3066<\/strong><\/p>\n<p data-line=\"332\" class=\"code-line\">Agent Engine \u3067 A2A \u30b5\u30fc\u30d0\u30fc\u6a5f\u80fd\u3092\u5229\u7528\u3059\u308b\u969b\u306f\u3001A2A \u30d7\u30ed\u30c8\u30b3\u30eb\u3067\u53d7\u3051\u53d6\u3063\u305f\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u51e6\u7406\u3059\u308b Agent Executer \u30af\u30e9\u30b9\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u3053\u3053\u3067\u306f\u3001ADK \u304c\u6a19\u6e96\u63d0\u4f9b\u3059\u308b <code>A2aAgentExecutor<\/code> \u30af\u30e9\u30b9\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u306e\u30af\u30e9\u30b9\u306f\u3001A2A \u30d7\u30ed\u30c8\u30b3\u30eb\u3067\u53d7\u3051\u53d6\u3063\u305f\u30ea\u30af\u30a8\u30b9\u30c8\u3092 ADK \u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b\u8ee2\u9001\u3059\u308b\u30d7\u30ed\u30ad\u30b7\u30fc\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"334\" class=\"code-line\">\u307e\u305f\u3001<code>A2aAgentExecutor<\/code> \u30af\u30e9\u30b9\u3067\u306f\u3001ADK \u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e <code>Runner<\/code> \u30af\u30e9\u30b9\u3092\u6307\u5b9a\u3057\u307e\u3059\u304c\u3001<code>Runner<\/code> \u30af\u30e9\u30b9\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3068\u3057\u3066\u3001\u30bb\u30c3\u30b7\u30e7\u30f3\u7ba1\u7406\u306b\u4f7f\u7528\u3059\u308b Session Manager \u3092\u6307\u5b9a\u3057\u307e\u3059\u3002\u3053\u3053\u3067\u306f\u3001Agent Engine \u4e0a\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u30b9\u30b1\u30fc\u30eb\u3057\u305f\u969b\u306b\u30bb\u30c3\u30b7\u30e7\u30f3\u60c5\u5831\u304c\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u9593\u3067\u5171\u6709\u3067\u304d\u308b\u3088\u3046\u306b <code>VertexAiSessionService<\/code> \u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u672c\u8a18\u4e8b\u57f7\u7b46\u6642\u70b9\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u306f\u3001<code>A2aAgentExecutor<\/code> \u30af\u30e9\u30b9\u304c\u671f\u5f85\u3059\u308b Session Manager \u306e API \u3068\u306e\u4e0d\u6574\u5408\u304c\u3042\u308b\u305f\u3081\u3001\u4e0d\u6574\u5408\u3092\u4fee\u6b63\u3057\u305f\u30e9\u30c3\u30d1\u30fc\u30af\u30e9\u30b9 <code>MyVertexAiSessionService<\/code> \u3092\u7528\u610f\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/div>\n<\/aside>\n<p data-line=\"337\" class=\"code-line\">\u3053\u308c\u3067\u5fc5\u8981\u306a\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002\u6b21\u306e\u30b3\u30fc\u30c9\u3067\u3001\u5148\u307b\u3069\u5b9a\u7fa9\u3057\u305f 4 \u3064\u306e\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u3001Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"339\">agents <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">{<\/span>\n    <span class=\"token string\">'research_agent1_a2a'<\/span><span class=\"token punctuation\">:<\/span> research_agent1<span class=\"token punctuation\">,<\/span>\n    <span class=\"token string\">'research_agent2_a2a'<\/span><span class=\"token punctuation\">:<\/span> research_agent2<span class=\"token punctuation\">,<\/span>\n    <span class=\"token string\">'writer_agent_a2a'<\/span><span class=\"token punctuation\">:<\/span> writer_agent<span class=\"token punctuation\">,<\/span>\n    <span class=\"token string\">'review_agent_a2a'<\/span><span class=\"token punctuation\">:<\/span> review_agent<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">}<\/span>\n\nclient <span class=\"token operator\">=<\/span> vertexai<span class=\"token punctuation\">.<\/span>Client<span class=\"token punctuation\">(<\/span>\n    project<span class=\"token operator\">=<\/span>PROJECT_ID<span class=\"token punctuation\">,<\/span>\n    location<span class=\"token operator\">=<\/span>LOCATION<span class=\"token punctuation\">,<\/span>\n    http_options<span class=\"token operator\">=<\/span>HttpOptions<span class=\"token punctuation\">(<\/span>\n        api_version<span class=\"token operator\">=<\/span><span class=\"token string\">'v1beta1'<\/span><span class=\"token punctuation\">,<\/span> base_url<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/'<\/span><\/span>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\n<span class=\"token keyword\">for<\/span> agent_name<span class=\"token punctuation\">,<\/span> agent <span class=\"token keyword\">in<\/span> agents<span class=\"token punctuation\">.<\/span>items<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>    \n    a2a_agent <span class=\"token operator\">=<\/span> A2aAgent<span class=\"token punctuation\">(<\/span>\n        agent_card<span class=\"token operator\">=<\/span><span class=\"token keyword\">await<\/span> get_agent_card<span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        agent_executor_builder<span class=\"token operator\">=<\/span>get_agent_executor_class<span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">,<\/span> <span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">)<\/span>\n    config<span class=\"token operator\">=<\/span><span class=\"token punctuation\">{<\/span>\n        <span class=\"token string\">'display_name'<\/span><span class=\"token punctuation\">:<\/span> agent_name<span class=\"token punctuation\">,<\/span>\n        <span class=\"token string\">'description'<\/span><span class=\"token punctuation\">:<\/span> a2a_agent<span class=\"token punctuation\">.<\/span>agent_card<span class=\"token punctuation\">.<\/span>description<span class=\"token punctuation\">,<\/span>\n        <span class=\"token string\">'requirements'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">[<\/span>\n            <span class=\"token string\">'google-adk==1.14.1'<\/span><span class=\"token punctuation\">,<\/span>\n            <span class=\"token string\">'google-genai==1.36.0'<\/span><span class=\"token punctuation\">,<\/span>\n            <span class=\"token string\">'google-cloud-aiplatform==1.113.0'<\/span><span class=\"token punctuation\">,<\/span>\n            <span class=\"token string\">'a2a-sdk==0.3.5'<\/span>\n        <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token string\">'http_options'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token punctuation\">{<\/span>\n            <span class=\"token string\">'base_url'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n            <span class=\"token string\">'api_version'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'v1beta1'<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token string\">'staging_bucket'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'gs:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>PROJECT_ID<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">}<\/span>\n\n    resource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span>agent_name<span class=\"token punctuation\">)<\/span>\n    <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> resource_name<span class=\"token punctuation\">:<\/span>\n        \n        remote_a2a_agent <span class=\"token operator\">=<\/span> client<span class=\"token punctuation\">.<\/span>agent_engines<span class=\"token punctuation\">.<\/span>create<span class=\"token punctuation\">(<\/span>\n            agent<span class=\"token operator\">=<\/span>a2a_agent<span class=\"token punctuation\">,<\/span>\n            config<span class=\"token operator\">=<\/span>config<span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">)<\/span>\n    \n    \n    resource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span>agent_name<span class=\"token punctuation\">)<\/span>\n    a2a_agent <span class=\"token operator\">=<\/span> A2aAgent<span class=\"token punctuation\">(<\/span>\n        agent_card<span class=\"token operator\">=<\/span><span class=\"token keyword\">await<\/span> get_agent_card<span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        agent_executor_builder<span class=\"token operator\">=<\/span>get_agent_executor_class<span class=\"token punctuation\">(<\/span>agent<span class=\"token punctuation\">,<\/span> resource_name<span class=\"token punctuation\">)<\/span>\n    <span class=\"token punctuation\">)<\/span>\n    remote_a2a_agent <span class=\"token operator\">=<\/span> client<span class=\"token punctuation\">.<\/span>agent_engines<span class=\"token punctuation\">.<\/span>update<span class=\"token punctuation\">(<\/span>\n        name<span class=\"token operator\">=<\/span>resource_name<span class=\"token punctuation\">,<\/span>\n        agent<span class=\"token operator\">=<\/span>a2a_agent<span class=\"token punctuation\">,<\/span>\n        config<span class=\"token operator\">=<\/span>config<span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"397\" class=\"code-line\">\u30af\u30e9\u30a6\u30c9\u30b3\u30f3\u30bd\u30fc\u30eb\u306e\u4e0a\u90e8\u306b\u3042\u308b\u691c\u7d22\u30d0\u30fc\u304b\u3089\u300cLogs explorer\u300d\u3092\u691c\u7d22\u3057\u3066\u958b\u304f\u3068\u3001\u30c7\u30d7\u30ed\u30a4\u4e2d\u306e\u30ed\u30b0\u304c\u78ba\u8a8d\u3067\u304d\u307e\u3059\u3002\u300c\u3059\u3079\u3066\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u691c\u7d22\u300d\u3068\u8868\u793a\u3055\u308c\u305f\u90e8\u5206\u306b <code>reasoning engine<\/code> \u3068\u5165\u529b\u3059\u308b\u3068\u3001Agent Engine \u306b\u95a2\u9023\u3057\u305f\u30ed\u30b0\u3060\u3051\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002<\/p>\n<aside class=\"msg message\"><span class=\"msg-symbol\">!<\/span><\/p>\n<div class=\"msg-content\">\n<p data-line=\"400\" class=\"code-line\"><strong>Agent Engine \u3078\u306e\u30c7\u30d7\u30ed\u30a4\u51e6\u7406\u306e\u6d41\u308c<\/strong><\/p>\n<p data-line=\"402\" class=\"code-line\">\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u3067\u306f\u3001\u95a2\u6570 <code>client.agent_engines.create()<\/code> \u3067\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u5f8c\u306b\u3001\u95a2\u6570 <code>client.agent_engines.update()<\/code> \u3067\u540c\u3058\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u518d\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u3044\u307e\u3059\u3002\u3053\u308c\u306f\u3001<code>VertexAiSessionService<\/code> \u306e\u5229\u7528\u306b\u95a2\u4fc2\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p data-line=\"404\" class=\"code-line\"><code>VertexAiSessionService<\/code> \u3092\u4f7f\u7528\u3059\u308b <code>Runner<\/code> \u30af\u30e9\u30b9\u306f\u3001<code>app_name<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u8a72\u5f53\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u30ea\u30bd\u30fc\u30b9 ID \u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u3053\u306e\u30ea\u30bd\u30fc\u30b9 ID \u306f\u3001Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u969b\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u307e\u3059\u3002\u305d\u3053\u3067\u3001\u4e00\u5ea6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u30ea\u30bd\u30fc\u30b9 ID \u3092\u53d6\u5f97\u3057\u305f\u5f8c\u306b\u3001\u8a72\u5f53\u306e\u30ea\u30bd\u30fc\u30b9 ID \u3092 <code>app_name<\/code> \u306b\u6307\u5b9a\u3057\u305f\u5f62\u3067\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u518d\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<\/div>\n<\/aside>\n<h2 id=\"remotea2aagent-%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F-root-agent-%E3%81%AE%E5%AE%9A%E7%BE%A9\" data-line=\"407\" class=\"code-line\">\n RemoteA2aAgent \u3092\u7528\u3044\u305f root agent \u306e\u5b9a\u7fa9<\/h2>\n<p data-line=\"409\" class=\"code-line\">\u3053\u308c\u3067 4 \u3064\u306e A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3067\u304d\u305f\u306e\u3067\u3001\u3053\u308c\u3089\u3092\u30b5\u30d6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u7d44\u307f\u8fbc\u3093\u3060 root agent\uff08\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\uff09\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"411\" class=\"code-line\">\u5192\u982d\u3067\u8aac\u660e\u3057\u305f\u3088\u3046\u306b\u3001ADK \u306e <code>RemoteA2aAgent<\/code> \u30af\u30e9\u30b9\u3092\u5229\u7528\u3057\u3066\u3001\u30b5\u30d6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u7d44\u307f\u8fbc\u307f\u307e\u3059\u304c\u3001\u3053\u306e\u969b\u306b\u3001A2A \u30b5\u30fc\u30d0\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b A2A \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30d5\u30a1\u30af\u30c8\u30ea\u30fc\u30af\u30e9\u30b9\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002\u6b21\u306e\u30b3\u30fc\u30c9\u3067\u3001\u30d5\u30a1\u30af\u30c8\u30ea\u30fc\u30af\u30e9\u30b9\u3092\u7528\u610f\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"413\"><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">GoogleAuthRefresh<\/span><span class=\"token punctuation\">(<\/span>httpx<span class=\"token punctuation\">.<\/span>Auth<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> scopes<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        self<span class=\"token punctuation\">.<\/span>credentials<span class=\"token punctuation\">,<\/span> _ <span class=\"token operator\">=<\/span> default<span class=\"token punctuation\">(<\/span>scopes<span class=\"token operator\">=<\/span>scopes<span class=\"token punctuation\">)<\/span>\n        self<span class=\"token punctuation\">.<\/span>transport_request <span class=\"token operator\">=<\/span> Request<span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span>\n        self<span class=\"token punctuation\">.<\/span>credentials<span class=\"token punctuation\">.<\/span>refresh<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>transport_request<span class=\"token punctuation\">)<\/span>\n\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">auth_flow<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> request<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>credentials<span class=\"token punctuation\">.<\/span>valid<span class=\"token punctuation\">:<\/span>\n            self<span class=\"token punctuation\">.<\/span>credentials<span class=\"token punctuation\">.<\/span>refresh<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>transport_request<span class=\"token punctuation\">)<\/span>\n        request<span class=\"token punctuation\">.<\/span>headers<span class=\"token punctuation\">[<\/span><span class=\"token string\">'Authorization'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'Bearer <\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>self<span class=\"token punctuation\">.<\/span>credentials<span class=\"token punctuation\">.<\/span>token<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">'<\/span><\/span>\n        <span class=\"token keyword\">yield<\/span> request\n\n\nfactory <span class=\"token operator\">=<\/span> ClientFactory<span class=\"token punctuation\">(<\/span>\n    ClientConfig<span class=\"token punctuation\">(<\/span>\n        supported_transports<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>TransportProtocol<span class=\"token punctuation\">.<\/span>http_json<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n        use_client_preference<span class=\"token operator\">=<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span>\n        httpx_client<span class=\"token operator\">=<\/span>httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">(<\/span>\n            timeout<span class=\"token operator\">=<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">,<\/span>\n            headers<span class=\"token operator\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">'Content-Type'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'application\/json'<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\n            auth<span class=\"token operator\">=<\/span>GoogleAuthRefresh<span class=\"token punctuation\">(<\/span>scopes<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">'https:\/\/www.googleapis.com\/auth\/cloud-platform'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> \n        <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"440\" class=\"code-line\">\u305d\u3057\u3066\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3067\u30014 \u3064\u306e A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b\u5bfe\u5fdc\u3057\u305f <code>RemoteA2aAgent<\/code> \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"442\">resource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'research_agent1_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nresearch_agent1_remoteA2a <span class=\"token operator\">=<\/span> RemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent1'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\uff08\u30c6\u30fc\u30de\u9078\u5b9a\uff09'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nresource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'research_agent2_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nresearch_agent2_remoteA2a <span class=\"token operator\">=<\/span> RemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent2'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\uff08\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\uff09'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nresource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'writer_agent_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nwriter_agent_remoteA2a <span class=\"token operator\">=<\/span> RemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'writer_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u7279\u5b9a\u306e\u30c6\u30fc\u30de\u306b\u95a2\u3059\u308b\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u66f8\u304f\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nresource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'review_agent_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nreview_agent_remoteA2a <span class=\"token operator\">=<\/span> RemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'review_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u30ec\u30d3\u30e5\u30fc\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"480\" class=\"code-line\"><code>RemoteA2aAgent<\/code> \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306f\u3001<code>agent_card<\/code> \u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u6307\u5b9a\u3057\u305f URL \u304b\u3089\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30ab\u30fc\u30c9\u3092\u53d6\u5f97\u3057\u305f\u5f8c\u3001\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30ab\u30fc\u30c9\u304b\u3089\u3001\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u30c7\u30d7\u30ed\u30a4\u3055\u308c\u305f A2A \u30b5\u30fc\u30d0\u30fc\u306e\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u306e\u60c5\u5831\u3092\u53d6\u5f97\u3057\u3066\u3001\u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b\u30ea\u30af\u30a8\u30b9\u30c8\u3092\u9001\u4fe1\u3057\u307e\u3059\u3002\u4e0a\u8a18\u306e\u30b3\u30fc\u30c9\u304b\u3089\u308f\u304b\u308b\u3088\u3046\u306b\u3001\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30ab\u30fc\u30c9\u306e URL \u306f\u6b21\u3067\u4e0e\u3048\u3089\u308c\u307e\u3059\u3002<\/p>\n<p data-line=\"482\" class=\"code-line\"><code>https:\/\/{LOCATION}-aiplatform.googleapis.com\/v1beta1\/{resource_name}\/a2a\/v1\/card\/<\/code><\/p>\n<p data-line=\"484\" class=\"code-line\"><code>{LOCATION}<\/code> \u306f Agent Engine \u306e\u30ea\u30fc\u30b8\u30e7\u30f3\uff08\u4eca\u56de\u306e\u4f8b\u3067\u3042\u308c\u3070 <code>us-central1<\/code>\uff09\u3067\u3001<code>{resource_name}<\/code> \u306f\u8a72\u5f53\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u30ea\u30bd\u30fc\u30b9 ID \u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"486\" class=\"code-line\">\u3053\u306e\u5f8c\u306f\u3001<code>RemoteA2aAgent<\/code> \u30af\u30e9\u30b9\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u30b5\u30d6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b\u6307\u5b9a\u3059\u308b\u3053\u3068\u3067\u3001\u30ed\u30fc\u30ab\u30eb\u306e\u30b5\u30d6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u3068\u540c\u69d8\u306b root agent \u304c\u5b9a\u7fa9\u3067\u304d\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"488\"><span class=\"token keyword\">def<\/span> <span class=\"token function\">get_print_agent<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">before_model_callback<\/span><span class=\"token punctuation\">(<\/span>\n        callback_context<span class=\"token punctuation\">:<\/span> CallbackContext<span class=\"token punctuation\">,<\/span> llm_request<span class=\"token punctuation\">:<\/span> LlmRequest\n    <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">&gt;<\/span> LlmResponse<span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">return<\/span> LlmResponse<span class=\"token punctuation\">(<\/span>\n            content<span class=\"token operator\">=<\/span>Content<span class=\"token punctuation\">(<\/span>\n                role<span class=\"token operator\">=<\/span><span class=\"token string\">'model'<\/span><span class=\"token punctuation\">,<\/span> parts<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>Part<span class=\"token punctuation\">(<\/span>text<span class=\"token operator\">=<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n            <span class=\"token punctuation\">)<\/span>\n        <span class=\"token punctuation\">)<\/span>\n    <span class=\"token keyword\">return<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n        name<span class=\"token operator\">=<\/span><span class=\"token string\">'print_agent'<\/span><span class=\"token punctuation\">,<\/span>\n        model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.0-flash'<\/span><span class=\"token punctuation\">,<\/span> \n        description<span class=\"token operator\">=<\/span><span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\n        instruction <span class=\"token operator\">=<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\n        before_model_callback<span class=\"token operator\">=<\/span>before_model_callback<span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">)<\/span>\n\nresearch_agent <span class=\"token operator\">=<\/span> SequentialAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    sub_agents<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n---\\n## \u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\\n---\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n## \u8abf\u67fb\u5bfe\u8c61\u306e\u30c8\u30d4\u30c3\u30af\u3092\u9078\u5b9a\u3057\u307e\u3059\u3002\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        research_agent1_remoteA2a<span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n## \u9078\u5b9a\u3057\u305f\u30c8\u30d4\u30c3\u30af\u306b\u57fa\u3065\u3044\u3066\u3001\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        research_agent2_remoteA2a<span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n#### \u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u304c\u6e96\u5099\u3067\u304d\u307e\u3057\u305f\u3002\u8a18\u4e8b\u306e\u4f5c\u6210\u306b\u53d6\u308a\u639b\u304b\u3063\u3066\u3082\u3088\u3044\u3067\u3057\u3087\u3046\u304b\uff1f\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nwrite_and_review_agent <span class=\"token operator\">=<\/span> SequentialAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'write_and_review_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    sub_agents<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n---\\n## \u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8a18\u4e8b\u3092\u57f7\u7b46\u3057\u307e\u3059\u3002\\n---\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        writer_agent_remoteA2a<span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n---\\n## \u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8a18\u4e8b\u3092\u30ec\u30d3\u30e5\u30fc\u3057\u307e\u3059\u3002\\n---\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        review_agent_remoteA2a<span class=\"token punctuation\">,<\/span>\n       get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n#### \u30ec\u30d3\u30e5\u30fc\u306b\u57fa\u3065\u3044\u3066\u8a18\u4e8b\u306e\u4fee\u6b63\u3092\u4f9d\u983c\u3057\u307e\u3059\u304b\uff1f\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u3092\u4f5c\u6210\u3001\u30ec\u30d3\u30e5\u30fc\u3059\u308b\u3002'<\/span><span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nroot_agent <span class=\"token operator\">=<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'article_generation_flow'<\/span><span class=\"token punctuation\">,<\/span>\n    model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.0-flash'<\/span><span class=\"token punctuation\">,<\/span>\n    instruction <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u4f55\u304c\u3067\u304d\u308b\u304b\u805e\u304b\u308c\u305f\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u51e6\u7406\u3092\u3059\u308b\u3053\u3068\u3092\u308f\u304b\u308a\u3084\u3059\u304f\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u6587\u7ae0\u306b\u307e\u3068\u3081\u3066\u8fd4\u7b54\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n- \u30e6\u30fc\u30b6\u30fc\u304c\u6307\u5b9a\u3057\u305f\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u696d\u52d9\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u3002\n- \u306f\u3058\u3081\u306b\u3001\u30c6\u30fc\u30de\u306b\u95a2\u3059\u308b\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3002\n- \u305d\u306e\u5f8c\u3001\u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u5354\u529b\u3057\u3066\u3001\u7de8\u96c6\u65b9\u91dd\u306b\u5247\u3057\u305f\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u3002\n\n\u30e6\u30fc\u30b6\u30fc\u304c\u8a18\u4e8b\u306e\u30c6\u30fc\u30de\u3092\u6307\u5b9a\u3057\u305f\u5834\u5408\u306f\u3001\u6b21\u306e\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\n\n1. \u305d\u306e\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u306e\u4f5c\u6210\u306b\u53d6\u308a\u639b\u304b\u308b\u65e8\u3092\u4f1d\u3048\u3066\u3001research_agent \u306b\u8ee2\u9001\u3057\u3066\u3001\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f9d\u983c\u3057\u307e\u3059\u3002\n2. \u30e6\u30fc\u30b6\u30fc\u8a18\u4e8b\u306e\u4f5c\u6210\u3092\u652f\u6301\u3057\u305f\u3089\u3001write_and_review_agent \u306b\u8ee2\u9001\u3057\u3066\u3001\u8a18\u4e8b\u306e\u4f5c\u6210\u3068\u30ec\u30d3\u30e5\u30fc\u3092\u4f9d\u983c\u3057\u307e\u3059\u3002\n3. \u30e6\u30fc\u30b6\u30fc\u304c\u8a18\u4e8b\u306e\u4fee\u6b63\u3092\u5e0c\u671b\u3059\u308b\u5834\u5408\u306f\u3001write_and_review_agent \u306b\u8ee2\u9001\u3057\u307e\u3059\u3002\n\n**\u6761\u4ef6**\nresearch_agent \u306e\u30cb\u30c3\u30af\u30cd\u30fc\u30e0\u306f\u3001\u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\nwrite_and_review_agent \u306e\u30cd\u30c3\u30af\u30cd\u30fc\u30e0\u306f\u3001\u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\n\n'''<\/span><span class=\"token punctuation\">,<\/span>\n    sub_agents<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>\n        research_agent<span class=\"token punctuation\">,<\/span>\n        write_and_review_agent<span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u696d\u52d9\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<h2 id=\"%E5%AE%9F%E8%A1%8C%E4%BE%8B\" data-line=\"560\" class=\"code-line\">\n \u5b9f\u884c\u4f8b<\/h2>\n<p data-line=\"562\" class=\"code-line\">\u305d\u308c\u3067\u306f\u3001\u3053\u306e root agent \u3092\u5b9f\u969b\u306b\u4f7f\u3063\u3066\u307f\u307e\u3057\u3087\u3046\u3002\u3053\u3053\u3067\u306f\u3001\u5148\u306b\u7528\u610f\u3057\u305f\u7c21\u6613\u30a2\u30d7\u30ea\u3067\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"564\">client <span class=\"token operator\">=<\/span> LocalApp<span class=\"token punctuation\">(<\/span>root_agent<span class=\"token punctuation\">)<\/span>\nquery <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u3053\u3093\u306b\u3061\u306f\u3002\u4f55\u304c\u3067\u304d\u307e\u3059\u304b\uff1f\n'''<\/span>\nresult <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"571\" class=\"code-line\"><strong>[\u51fa\u529b\u7d50\u679c]<\/strong><\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"572\">\u3053\u3093\u306b\u3061\u306f\uff01\u79c1\u306f\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u696d\u52d9\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u3059\u3002\n\u5177\u4f53\u7684\u306b\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u3055\u3093\u304c\u6307\u5b9a\u3057\u305f\u30c6\u30fc\u30de\u306b\u3064\u3044\u3066\u3001\u307e\u305a\u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\n\u305d\u306e\u5f8c\u3001\u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u5354\u529b\u3057\u3066\u3001\u7de8\u96c6\u65b9\u91dd\u306b\u6cbf\u3063\u305f\u8a18\u4e8b\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\n\u3054\u5e0c\u671b\u306e\u30c6\u30fc\u30de\u304c\u3042\u308c\u3070\u6559\u3048\u3066\u304f\u3060\u3055\u3044\uff01\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"579\">query <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u300c\u8fd1\u5834\u3067\u79cb\u3092\u611f\u3058\u308b\u5de5\u592b\u300d\u3092\u30c6\u30fc\u30de\u306b\u8a18\u4e8b\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n'''<\/span>\nresult <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"586\">\u627f\u77e5\u3044\u305f\u3057\u307e\u3057\u305f\u3002\u300c\u8fd1\u5834\u3067\u79cb\u3092\u611f\u3058\u308b\u5de5\u592b\u300d\u3068\u3044\u3046\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u4f5c\u6210\u306b\u53d6\u308a\u639b\u304b\u308a\u307e\u3059\u3002\u307e\u305a\u306f\u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f9d\u983c\u3057\u307e\u3059\u3002\n\n---\n## \u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\n---\n...\uff08\u4ee5\u4e0b\u7701\u7565\uff09...\n<\/code><\/pre>\n<\/div>\n<p data-line=\"595\" class=\"code-line\">\u3053\u306e\u5f8c\u306f\u3001\u4e0b\u8a18\u306e\u8a18\u4e8b\u306e<a target=\"_blank\" href=\"https:\/\/zenn.dev\/google_cloud_jp\/articles\/5410925dc984b1#%E5%AE%9F%E8%A1%8C%E4%BE%8B\" target=\"_blank\">\u5b9f\u884c\u4f8b<\/a>\u3068\u540c\u3058\u6d41\u308c\u3067\u3001\u8a18\u4e8b\u306e\u4f5c\u6210\u3092\u9032\u3081\u3089\u308c\u307e\u3059\u3002<\/p>\n<p data-line=\"599\" class=\"code-line\">\u4eca\u56de\u306e\u5b9f\u88c5\u5185\u5bb9\u3092\u307e\u3068\u3081\u305f\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u304c\u4e0b\u8a18\u306b\u3042\u308b\u306e\u3067\u3001\u3053\u3061\u3089\u3082\u53c2\u8003\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<h2 id=\"root-agent-%E3%82%92-agent-engine-%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4\" data-line=\"603\" class=\"code-line\">\n root agent \u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4<\/h2>\n<p data-line=\"605\" class=\"code-line\">\u5148\u307b\u3069\u306f root agent \u81ea\u4f53\u306f\u30ed\u30fc\u30ab\u30eb\u3067\u5b9f\u884c\u3057\u307e\u3057\u305f\u304c\u3001root agent \u3082 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3066\u4f7f\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u672c\u8a18\u4e8b\u57f7\u7b46\u6642\u70b9\u3067\u306f\u3001\u5148\u306b\u8aac\u660e\u3057\u305f\u3001A2A \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u30d5\u30a1\u30af\u30c8\u30ea\u30fc\u30af\u30e9\u30b9\u3068 <code>RemoteA2aAgent<\/code> \u30af\u30e9\u30b9\u306b\u5c11\u3057\u4fee\u6b63\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"607\" class=\"code-line\">\u3053\u3053\u3067\u306f\u3001\u8a73\u7d30\u306a\u8aac\u660e\u306f\u5272\u611b\u3057\u3066\u3001\u4fee\u6b63\u5f8c\u306e\u30b3\u30fc\u30c9\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n<p data-line=\"609\" class=\"code-line\">\u306f\u3058\u3081\u306b\u3001\u6e96\u5099\u3068\u3057\u3066\u3001Agent Engine \u4e0a\u306e root agent \u304c A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u547c\u3073\u51fa\u305b\u308b\u3088\u3046\u306b\u3001reasoning engine \u30b5\u30fc\u30d3\u30b9\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306b AI Platform \u30e6\u30fc\u30b6\u30fc\u306e IAM \u30ed\u30fc\u30eb\u3092\u5272\u308a\u5f53\u3066\u307e\u3059\u3002Cloud Shell \u306e\u7aef\u672b\u3092\u958b\u3044\u3066\u3001\u6b21\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-bash\"><code class=\"language-bash code-line\" data-line=\"611\"><span class=\"token assign-left variable\">PROJECT_ID<\/span><span class=\"token operator\">=<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span>gcloud config list <span class=\"token parameter variable\">--format<\/span> <span class=\"token string\">'value(core.project)'<\/span><span class=\"token variable\">)<\/span><\/span>\n<span class=\"token assign-left variable\">PROJECT_NUMBER<\/span><span class=\"token operator\">=<\/span><span class=\"token variable\"><span class=\"token variable\">$(<\/span>gcloud projects describe $PROJECT_ID <span class=\"token parameter variable\">--format<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">'value(projectNumber)'<\/span><span class=\"token variable\">)<\/span><\/span>\ngcloud projects add-iam-policy-binding <span class=\"token variable\">$PROJECT_ID<\/span> <span class=\"token punctuation\">\\<\/span>\n    <span class=\"token parameter variable\">--member<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">\"serviceAccount:service-<span class=\"token variable\">${PROJECT_NUMBER}<\/span>@gcp-sa-aiplatform-re.iam.gserviceaccount.com\"<\/span> <span class=\"token punctuation\">\\<\/span>\n    <span class=\"token parameter variable\">--role<\/span><span class=\"token operator\">=<\/span><span class=\"token string\">'roles\/aiplatform.user'<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"619\" class=\"code-line\">\u7d9a\u3044\u3066\u3001\u30ce\u30fc\u30c8\u30d6\u30c3\u30af\u306b\u623b\u3063\u3066\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3067 root agent \u3092\u518d\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"621\"><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">MyClientFactory<\/span><span class=\"token punctuation\">(<\/span>ClientFactory<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">create<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> card<span class=\"token punctuation\">,<\/span> consumers<span class=\"token operator\">=<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">,<\/span> interceptors<span class=\"token operator\">=<\/span><span class=\"token boolean\">None<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>_config<span class=\"token punctuation\">.<\/span>httpx_client<span class=\"token punctuation\">:<\/span>\n            self<span class=\"token punctuation\">.<\/span>_config<span class=\"token punctuation\">.<\/span>httpx_client<span class=\"token operator\">=<\/span>httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">(<\/span>\n                timeout<span class=\"token operator\">=<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">,<\/span>\n                headers<span class=\"token operator\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">'Content-Type'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'application\/json'<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\n                auth<span class=\"token operator\">=<\/span>GoogleAuthRefresh<span class=\"token punctuation\">(<\/span>scopes<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">'https:\/\/www.googleapis.com\/auth\/cloud-platform'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> \n            <span class=\"token punctuation\">)<\/span>\n            self<span class=\"token punctuation\">.<\/span>_register_defaults<span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">.<\/span>_config<span class=\"token punctuation\">.<\/span>supported_transports<span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token builtin\">super<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>create<span class=\"token punctuation\">(<\/span>card<span class=\"token punctuation\">,<\/span> consumers<span class=\"token punctuation\">,<\/span> interceptors<span class=\"token punctuation\">)<\/span>\n\n\n<span class=\"token keyword\">class<\/span> <span class=\"token class-name\">MyRemoteA2aAgent<\/span><span class=\"token punctuation\">(<\/span>RemoteA2aAgent<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_ensure_httpx_client<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>_httpx_client<span class=\"token punctuation\">:<\/span>\n            self<span class=\"token punctuation\">.<\/span>_httpx_client<span class=\"token operator\">=<\/span>httpx<span class=\"token punctuation\">.<\/span>AsyncClient<span class=\"token punctuation\">(<\/span>\n                timeout<span class=\"token operator\">=<\/span><span class=\"token number\">60<\/span><span class=\"token punctuation\">,<\/span>\n                headers<span class=\"token operator\">=<\/span><span class=\"token punctuation\">{<\/span><span class=\"token string\">'Content-Type'<\/span><span class=\"token punctuation\">:<\/span> <span class=\"token string\">'application\/json'<\/span><span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">,<\/span>\n                auth<span class=\"token operator\">=<\/span>GoogleAuthRefresh<span class=\"token punctuation\">(<\/span>scopes<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">'https:\/\/www.googleapis.com\/auth\/cloud-platform'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span> \n            <span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span> self<span class=\"token punctuation\">.<\/span>_httpx_client\n\n\nfactory <span class=\"token operator\">=<\/span> MyClientFactory<span class=\"token punctuation\">(<\/span>\n    ClientConfig<span class=\"token punctuation\">(<\/span>\n        supported_transports<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>TransportProtocol<span class=\"token punctuation\">.<\/span>http_json<span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n        use_client_preference<span class=\"token operator\">=<\/span><span class=\"token boolean\">True<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">)<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nresource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'research_agent1_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nresearch_agent1_remoteA2a <span class=\"token operator\">=<\/span> MyRemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent1'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\uff08\u30c6\u30fc\u30de\u9078\u5b9a\uff09'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nresource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'research_agent2_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nresearch_agent2_remoteA2a <span class=\"token operator\">=<\/span> MyRemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent2'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\uff08\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\uff09'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nresource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'writer_agent_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nwriter_agent_remoteA2a <span class=\"token operator\">=<\/span> MyRemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'writer_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u7279\u5b9a\u306e\u30c6\u30fc\u30de\u306b\u95a2\u3059\u308b\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u66f8\u304f\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nresource_name <span class=\"token operator\">=<\/span> get_agent_resource<span class=\"token punctuation\">(<\/span><span class=\"token string\">'review_agent_a2a'<\/span><span class=\"token punctuation\">)<\/span>\na2a_url <span class=\"token operator\">=<\/span> <span class=\"token string-interpolation\"><span class=\"token string\">f'https:\/\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>LOCATION<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">-aiplatform.googleapis.com\/v1beta1\/<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>resource_name<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/a2a'<\/span><\/span>\nreview_agent_remoteA2a <span class=\"token operator\">=<\/span> MyRemoteA2aAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'review_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8aad\u307f\u7269\u8a18\u4e8b\u3092\u30ec\u30d3\u30e5\u30fc\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n    agent_card<span class=\"token operator\">=<\/span><span class=\"token string-interpolation\"><span class=\"token string\">f'<\/span><span class=\"token interpolation\"><span class=\"token punctuation\">{<\/span>a2a_url<span class=\"token punctuation\">}<\/span><\/span><span class=\"token string\">\/v1\/card'<\/span><\/span><span class=\"token punctuation\">,<\/span>\n    a2a_client_factory<span class=\"token operator\">=<\/span>factory<span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\n<span class=\"token keyword\">def<\/span> <span class=\"token function\">get_print_agent<\/span><span class=\"token punctuation\">(<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">before_model_callback<\/span><span class=\"token punctuation\">(<\/span>\n        callback_context<span class=\"token punctuation\">:<\/span> CallbackContext<span class=\"token punctuation\">,<\/span> llm_request<span class=\"token punctuation\">:<\/span> LlmRequest\n    <span class=\"token punctuation\">)<\/span> <span class=\"token operator\">-<\/span><span class=\"token operator\">&gt;<\/span> LlmResponse<span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">return<\/span> LlmResponse<span class=\"token punctuation\">(<\/span>\n            content<span class=\"token operator\">=<\/span>Content<span class=\"token punctuation\">(<\/span>\n                role<span class=\"token operator\">=<\/span><span class=\"token string\">'model'<\/span><span class=\"token punctuation\">,<\/span> parts<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>Part<span class=\"token punctuation\">(<\/span>text<span class=\"token operator\">=<\/span>text<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n            <span class=\"token punctuation\">)<\/span>\n        <span class=\"token punctuation\">)<\/span>\n    <span class=\"token keyword\">return<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n        name<span class=\"token operator\">=<\/span><span class=\"token string\">'print_agent'<\/span><span class=\"token punctuation\">,<\/span>\n        model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.0-flash'<\/span><span class=\"token punctuation\">,<\/span> \n        description<span class=\"token operator\">=<\/span><span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\n        instruction <span class=\"token operator\">=<\/span> <span class=\"token string\">''<\/span><span class=\"token punctuation\">,<\/span>\n        before_model_callback<span class=\"token operator\">=<\/span>before_model_callback<span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">)<\/span>\n\nresearch_agent <span class=\"token operator\">=<\/span> SequentialAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'research_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    sub_agents<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n---\\n## \u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\\n---\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n## \u8abf\u67fb\u5bfe\u8c61\u306e\u30c8\u30d4\u30c3\u30af\u3092\u9078\u5b9a\u3057\u307e\u3059\u3002\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        research_agent1_remoteA2a<span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n## \u9078\u5b9a\u3057\u305f\u30c8\u30d4\u30c3\u30af\u306b\u57fa\u3065\u3044\u3066\u3001\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        research_agent2_remoteA2a<span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n#### \u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u304c\u6e96\u5099\u3067\u304d\u307e\u3057\u305f\u3002\u8a18\u4e8b\u306e\u4f5c\u6210\u306b\u53d6\u308a\u639b\u304b\u3063\u3066\u3082\u3088\u3044\u3067\u3057\u3087\u3046\u304b\uff1f\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u306e\u57f7\u7b46\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u53ce\u96c6\u3057\u3066\u30ec\u30dd\u30fc\u30c8\u306b\u307e\u3068\u3081\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span><span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nwrite_and_review_agent <span class=\"token operator\">=<\/span> SequentialAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'write_and_review_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    sub_agents<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n---\\n## \u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8a18\u4e8b\u3092\u57f7\u7b46\u3057\u307e\u3059\u3002\\n---\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        writer_agent_remoteA2a<span class=\"token punctuation\">,<\/span>\n        get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n---\\n## \u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8a18\u4e8b\u3092\u30ec\u30d3\u30e5\u30fc\u3057\u307e\u3059\u3002\\n---\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n        review_agent_remoteA2a<span class=\"token punctuation\">,<\/span>\n       get_print_agent<span class=\"token punctuation\">(<\/span><span class=\"token string\">'\\n#### \u30ec\u30d3\u30e5\u30fc\u306b\u57fa\u3065\u3044\u3066\u8a18\u4e8b\u306e\u4fee\u6b63\u3092\u4f9d\u983c\u3057\u307e\u3059\u304b\uff1f\\n'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u3092\u4f5c\u6210\u3001\u30ec\u30d3\u30e5\u30fc\u3059\u308b\u3002'<\/span><span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n\nroot_agent <span class=\"token operator\">=<\/span> LlmAgent<span class=\"token punctuation\">(<\/span>\n    name<span class=\"token operator\">=<\/span><span class=\"token string\">'article_generation_flow'<\/span><span class=\"token punctuation\">,<\/span>\n    model<span class=\"token operator\">=<\/span><span class=\"token string\">'gemini-2.0-flash'<\/span><span class=\"token punctuation\">,<\/span>\n    instruction <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u4f55\u304c\u3067\u304d\u308b\u304b\u805e\u304b\u308c\u305f\u5834\u5408\u306f\u3001\u4ee5\u4e0b\u306e\u51e6\u7406\u3092\u3059\u308b\u3053\u3068\u3092\u308f\u304b\u308a\u3084\u3059\u304f\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u6587\u7ae0\u306b\u307e\u3068\u3081\u3066\u8fd4\u7b54\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n- \u30e6\u30fc\u30b6\u30fc\u304c\u6307\u5b9a\u3057\u305f\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u696d\u52d9\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u3002\n- \u306f\u3058\u3081\u306b\u3001\u30c6\u30fc\u30de\u306b\u95a2\u3059\u308b\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3002\n- \u305d\u306e\u5f8c\u3001\u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u5354\u529b\u3057\u3066\u3001\u7de8\u96c6\u65b9\u91dd\u306b\u5247\u3057\u305f\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u3002\n\n\u30e6\u30fc\u30b6\u30fc\u304c\u8a18\u4e8b\u306e\u30c6\u30fc\u30de\u3092\u6307\u5b9a\u3057\u305f\u5834\u5408\u306f\u3001\u6b21\u306e\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\n\n1. \u305d\u306e\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u306e\u4f5c\u6210\u306b\u53d6\u308a\u639b\u304b\u308b\u65e8\u3092\u4f1d\u3048\u3066\u3001research_agent \u306b\u8ee2\u9001\u3057\u3066\u3001\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f9d\u983c\u3057\u307e\u3059\u3002\n2. \u30e6\u30fc\u30b6\u30fc\u8a18\u4e8b\u306e\u4f5c\u6210\u3092\u652f\u6301\u3057\u305f\u3089\u3001write_and_review_agent \u306b\u8ee2\u9001\u3057\u3066\u3001\u8a18\u4e8b\u306e\u4f5c\u6210\u3068\u30ec\u30d3\u30e5\u30fc\u3092\u4f9d\u983c\u3057\u307e\u3059\u3002\n3. \u30e6\u30fc\u30b6\u30fc\u304c\u8a18\u4e8b\u306e\u4fee\u6b63\u3092\u5e0c\u671b\u3059\u308b\u5834\u5408\u306f\u3001write_and_review_agent \u306b\u8ee2\u9001\u3057\u307e\u3059\u3002\n\n**\u6761\u4ef6**\nresearch_agent \u306e\u30cb\u30c3\u30af\u30cd\u30fc\u30e0\u306f\u3001\u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\nwrite_and_review_agent \u306e\u30cd\u30c3\u30af\u30cd\u30fc\u30e0\u306f\u3001\u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\n\n'''<\/span><span class=\"token punctuation\">,<\/span>\n    sub_agents<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>\n        research_agent<span class=\"token punctuation\">,<\/span>\n        write_and_review_agent<span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n    description<span class=\"token operator\">=<\/span><span class=\"token string\">'\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u696d\u52d9\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8'<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"759\" class=\"code-line\">\u305d\u3057\u3066\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3067\u3001root agent \u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"761\">remote_agent <span class=\"token operator\">=<\/span> agent_engines<span class=\"token punctuation\">.<\/span>create<span class=\"token punctuation\">(<\/span>\n    agent_engine<span class=\"token operator\">=<\/span>root_agent<span class=\"token punctuation\">,<\/span>\n    display_name<span class=\"token operator\">=<\/span><span class=\"token string\">'article_generation_flow_agent'<\/span><span class=\"token punctuation\">,<\/span>\n    requirements<span class=\"token operator\">=<\/span><span class=\"token punctuation\">[<\/span>\n        <span class=\"token string\">'google-adk==1.14.1'<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token string\">'google-genai==1.36.0'<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token string\">'google-cloud-aiplatform==1.113.0'<\/span><span class=\"token punctuation\">,<\/span>\n        <span class=\"token string\">'a2a-sdk==0.3.5'<\/span><span class=\"token punctuation\">,<\/span>\n    <span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"774\" class=\"code-line\">\u307e\u305f\u3001Agent Engine \u4e0a\u306e\u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u5b9f\u884c\u3059\u308b\u7c21\u6613\u30a2\u30d7\u30ea\u306e\u30af\u30e9\u30b9\u3092\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"776\"><span class=\"token keyword\">class<\/span> <span class=\"token class-name\">RemoteApp<\/span><span class=\"token punctuation\">:<\/span>\n    <span class=\"token keyword\">def<\/span> <span class=\"token function\">__init__<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> remote_agent<span class=\"token punctuation\">,<\/span> user_id<span class=\"token operator\">=<\/span><span class=\"token string\">'default_user'<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        self<span class=\"token punctuation\">.<\/span>_remote_agent <span class=\"token operator\">=<\/span> remote_agent\n        self<span class=\"token punctuation\">.<\/span>_user_id <span class=\"token operator\">=<\/span> user_id\n        self<span class=\"token punctuation\">.<\/span>_session <span class=\"token operator\">=<\/span> <span class=\"token boolean\">None<\/span>\n\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">_stream<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">if<\/span> <span class=\"token keyword\">not<\/span> self<span class=\"token punctuation\">.<\/span>_session<span class=\"token punctuation\">:<\/span>\n            self<span class=\"token punctuation\">.<\/span>_session <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> remote_agent<span class=\"token punctuation\">.<\/span>async_create_session<span class=\"token punctuation\">(<\/span>user_id<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_user_id<span class=\"token punctuation\">)<\/span>\n        events <span class=\"token operator\">=<\/span> self<span class=\"token punctuation\">.<\/span>_remote_agent<span class=\"token punctuation\">.<\/span>async_stream_query<span class=\"token punctuation\">(<\/span>\n            user_id<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_user_id<span class=\"token punctuation\">,<\/span>\n            session_id<span class=\"token operator\">=<\/span>self<span class=\"token punctuation\">.<\/span>_session<span class=\"token punctuation\">[<\/span><span class=\"token string\">'id'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">,<\/span>\n            message<span class=\"token operator\">=<\/span>query<span class=\"token punctuation\">,<\/span>\n        <span class=\"token punctuation\">)<\/span>\n        result <span class=\"token operator\">=<\/span> <span class=\"token punctuation\">[<\/span><span class=\"token punctuation\">]<\/span>\n        <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">for<\/span> event <span class=\"token keyword\">in<\/span> events<span class=\"token punctuation\">:<\/span>\n            <span class=\"token keyword\">if<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token string\">'content'<\/span> <span class=\"token keyword\">in<\/span> event <span class=\"token keyword\">and<\/span> <span class=\"token string\">'parts'<\/span> <span class=\"token keyword\">in<\/span> event<span class=\"token punctuation\">[<\/span><span class=\"token string\">'content'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n                response <span class=\"token operator\">=<\/span> <span class=\"token string\">'\\n'<\/span><span class=\"token punctuation\">.<\/span>join<span class=\"token punctuation\">(<\/span>\n                    <span class=\"token punctuation\">[<\/span>p<span class=\"token punctuation\">[<\/span><span class=\"token string\">'text'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">for<\/span> p <span class=\"token keyword\">in<\/span> event<span class=\"token punctuation\">[<\/span><span class=\"token string\">'content'<\/span><span class=\"token punctuation\">]<\/span><span class=\"token punctuation\">[<\/span><span class=\"token string\">'parts'<\/span><span class=\"token punctuation\">]<\/span> <span class=\"token keyword\">if<\/span> <span class=\"token string\">'text'<\/span> <span class=\"token keyword\">in<\/span> p<span class=\"token punctuation\">]<\/span>\n                <span class=\"token punctuation\">)<\/span>\n                <span class=\"token keyword\">print<\/span><span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">)<\/span>\n                result<span class=\"token punctuation\">.<\/span>append<span class=\"token punctuation\">(<\/span>response<span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span> result\n\n    <span class=\"token keyword\">async<\/span> <span class=\"token keyword\">def<\/span> <span class=\"token function\">stream<\/span><span class=\"token punctuation\">(<\/span>self<span class=\"token punctuation\">,<\/span> query<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n        <span class=\"token keyword\">for<\/span> _ <span class=\"token keyword\">in<\/span> <span class=\"token builtin\">range<\/span><span class=\"token punctuation\">(<\/span><span class=\"token number\">5<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">:<\/span>\n            result <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> self<span class=\"token punctuation\">.<\/span>_stream<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span>\n            <span class=\"token keyword\">if<\/span> result<span class=\"token punctuation\">:<\/span>\n                <span class=\"token keyword\">return<\/span> result\n            time<span class=\"token punctuation\">.<\/span>sleep<span class=\"token punctuation\">(<\/span><span class=\"token number\">3<\/span><span class=\"token punctuation\">)<\/span>\n        <span class=\"token keyword\">return<\/span> <span class=\"token string\">'Error: No response from Agent Engine.'<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"810\" class=\"code-line\">\u3053\u306e\u5f8c\u306f\u3001\u6b21\u306e\u30b3\u30fc\u30c9\u3067 root agent \u3092\u5b9f\u884c\u3057\u307e\u3059\u3002<\/p>\n<div class=\"code-block-container\">\n<pre class=\"language-python\"><code class=\"language-python code-line\" data-line=\"812\">client <span class=\"token operator\">=<\/span> RemoteApp<span class=\"token punctuation\">(<\/span>remote_agent<span class=\"token punctuation\">)<\/span>\nquery <span class=\"token operator\">=<\/span> <span class=\"token triple-quoted-string string\">'''\n\u3053\u3093\u306b\u3061\u306f\u3002\u4f55\u304c\u3067\u304d\u307e\u3059\u304b\uff1f\n'''<\/span>\nresult <span class=\"token operator\">=<\/span> <span class=\"token keyword\">await<\/span> client<span class=\"token punctuation\">.<\/span>stream<span class=\"token punctuation\">(<\/span>query<span class=\"token punctuation\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p data-line=\"819\" class=\"code-line\"><strong>[\u51fa\u529b\u7d50\u679c]<\/strong><\/p>\n<div class=\"code-block-container\">\n<pre><code class=\"code-line\" data-line=\"820\">\u3053\u3093\u306b\u3061\u306f\uff01\u79c1\u306f\u3001\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u696d\u52d9\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3067\u3059\u3002\n\u30e6\u30fc\u30b6\u30fc\u3055\u3093\u304c\u6307\u5b9a\u3057\u305f\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u3092\u4f5c\u6210\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\n\n\u5177\u4f53\u7684\u306b\u306f\u3001\u307e\u305a\u30c6\u30fc\u30de\u306b\u3064\u3044\u3066\u306e\u30ea\u30b5\u30fc\u30c1\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u8abf\u67fb\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\n\u305d\u306e\u5f8c\u3001\u30e9\u30a4\u30bf\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u30ec\u30d3\u30e5\u30fc\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u304c\u5354\u529b\u3057\u3066\u3001\u7de8\u96c6\u65b9\u91dd\u306b\u6cbf\u3063\u305f\u8a18\u4e8b\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002\n\u3069\u3093\u306a\u30c6\u30fc\u30de\u306e\u8a18\u4e8b\u3092\u3054\u5e0c\u671b\u3067\u3059\u304b\uff1f\n<\/code><\/pre>\n<\/div>\n<p data-line=\"829\" class=\"code-line\">\u3053\u306e\u5f8c\u306e\u5b9f\u884c\u306e\u6d41\u308c\u306f\u3001\u30ed\u30fc\u30ab\u30eb\u306e\u5834\u5408\u3068\u540c\u69d8\u3067\u3059\u3002<\/p>\n<h2 id=\"%E3%81%BE%E3%81%A8%E3%82%81\" data-line=\"831\" class=\"code-line\">\n \u307e\u3068\u3081<\/h2>\n<p data-line=\"833\" class=\"code-line\">\u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001Agent Engine \u306b\u8907\u6570\u306e A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u4e0a\u3067\u3001\u3053\u308c\u3089\u3092\u9023\u643a\u3057\u305f\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u3092\u5b9f\u884c\u3059\u308b\u4f8b\u3092\u7d39\u4ecb\u3057\u307e\u3057\u305f\u3002\u3053\u3053\u3067\u306f\u7279\u306b\u3001A2A \u30b5\u30fc\u30d0\u30fc\u3068 A2A \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306e\u53cc\u65b9\u3067\u3001ADK \u304c\u6a19\u6e96\u63d0\u4f9b\u3059\u308b\u30af\u30e9\u30b9\u3092\u5229\u7528\u3057\u305f\u70b9\u306b\u6ce8\u76ee\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<ul data-line=\"835\" class=\"code-line\">\n<li data-line=\"835\" class=\"code-line\">\u30b5\u30fc\u30d0\u30fc\u5074\uff1aA2A \u30b5\u30fc\u30d0\u30fc\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3059\u308b <code>A2aAgentExecutor<\/code> \u30af\u30e9\u30b9<\/li>\n<li data-line=\"836\" class=\"code-line\">\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u5074\uff1aA2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092\u30b5\u30d6\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3068\u3057\u3066\u7d44\u307f\u8fbc\u3080 <code>RemoteA2aAgent<\/code> \u30af\u30e9\u30b9<\/li>\n<\/ul>\n<p data-line=\"838\" class=\"code-line\">\u4e0b\u8a18\u306e\u8a18\u4e8b\u3067\u306f\u72ec\u81ea\u5b9f\u88c5\u306e A2A \u30b5\u30fc\u30d0\u30fc\u3092 Cloud Run \u306b\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u4e0a\u3067\u3001\u72ec\u81ea\u5b9f\u88c5\u306e A2A \u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u6a5f\u80fd\u3092\u30b3\u30fc\u30eb\u30d0\u30c3\u30af\u95a2\u6570\u306b\u7d44\u307f\u8fbc\u3080\u3068\u3044\u3046\u5de5\u592b\u3092\u3057\u307e\u3057\u305f\u3002<\/p>\n<p data-line=\"842\" class=\"code-line\">\u3053\u308c\u306b\u6bd4\u3079\u308b\u3068\u3001\u4eca\u56de\u306e\u5b9f\u88c5\u4f8b\u3067\u306f\u6bd4\u8f03\u7684\u30b7\u30f3\u30d7\u30eb\u306a\u30b3\u30fc\u30c9\u306b\u306a\u3063\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<\/p>\n<p data-line=\"844\" class=\"code-line\">\u3053\u306e\u3088\u3046\u306b\u3001<strong>ADK \u306e A2A \u5bfe\u5fdc\u6a5f\u80fd\u3068 Agent Engine \u306e A2A \u5bfe\u5fdc\u304c\u9023\u643a\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u7c21\u5358\u306b A2A \u304c\u5229\u7528\u3067\u304d\u307e\u3059\u3002<\/strong> \u8a73\u7d30\u306a\u8aac\u660e\u306f\u5272\u611b\u3057\u307e\u3059\u304c\u3001\u4e0a\u8a18\u306e 2 \u3064\u306e\u30af\u30e9\u30b9\u304c\u9023\u643a\u3059\u308b\u4e8b\u3067\u3001root agent \u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u60c5\u5831\u3068 A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u60c5\u5831\u304c\u9069\u5207\u306b\u540c\u671f\u3055\u308c\u3066\u3001\u305d\u308c\u305e\u308c\u306e A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306f\u3001\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u5168\u4f53\u306e\u51e6\u7406\u306e\u6d41\u308c\u3092\u7406\u89e3\u3057\u305f\u4e0a\u3067\u3001\u81ea\u8eab\u304c\u62c5\u5f53\u3059\u308b\u51e6\u7406\u3092\u5b9f\u884c\u3057\u3066\u3044\u304d\u307e\u3059\u3002<\/p>\n<p data-line=\"846\" class=\"code-line\">\u672c\u6587\u5192\u982d\u306e\u6ce8\u610f\u66f8\u304d\u306b\u3042\u308b\u3088\u3046\u306b\u3001\u672c\u8a18\u4e8b\u57f7\u7b46\u6642\u70b9\u3067\u306f\u3001ADK \u306e A2A \u5bfe\u5fdc\u6a5f\u80fd\u306f\u300cExperimental\u300d\u30d5\u30a7\u30fc\u30ba\u306e\u305f\u3081\u3001Wrapper \u30af\u30e9\u30b9\u3092\u5229\u7528\u3059\u308b\u306a\u3069\u3001\u591a\u5c11\u306e\u30ef\u30fc\u30af\u30a2\u30e9\u30a6\u30f3\u30c9\u304c\u5fc5\u8981\u3067\u3057\u305f\u304c\u3001\u3053\u306e\u3042\u305f\u308a\u306f\u4eca\u5f8c\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u30a2\u30c3\u30d7\u3067\u89e3\u6d88\u3055\u308c\u3066\u3044\u304f\u3067\u3057\u3087\u3046\u3002ADK \u3068 Agent Engine \u306e\u9032\u5316\u306b\u306f\u4eca\u5f8c\u3082\u8981\u6ce8\u76ee\u3067\u3059\u306d\u3002<\/p>\n<\/div>\n\n<br \/><a href=\"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70\">\u5143\u306e\u8a18\u4e8b\u3092\u78ba\u8a8d\u3059\u308b <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"! \u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001ADK \u304c\u63d0\u4f9b\u3059\u308b A2A \u5bfe\u5fdc\u6a5f\u80fd\u3092\u5229\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\u3092\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002\u73fe\u5728\uff082025\u5e749\u6708\uff09\u3001ADK \u306e A2A \u5bfe\u5fdc\u6a5f\u80fd\u306f\u300cExperimental\u300d\u30d5\u30a7\u30fc\u30ba\u306e\u305f\u3081\u3001\u4eca\u5f8c\u3001\u30b3\u30fc\u30c9\u306e\u5b9f\u88c5\u65b9\u6cd5\u304c\u5909\u308f\u308b\u53ef\u80fd [&hellip;]","protected":false},"author":1,"featured_media":6581,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[4],"tags":[],"class_list":["post-6580","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-company-tec"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b - \u30dd\u30b1\u30b3\u30f3<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70\" \/>\n<meta property=\"og:locale\" content=\"ja_JP\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b - \u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"og:description\" content=\"! \u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001ADK \u304c\u63d0\u4f9b\u3059\u308b A2A \u5bfe\u5fdc\u6a5f\u80fd\u3092\u5229\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\u3092\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002\u73fe\u5728\uff082025\u5e749\u6708\uff09\u3001ADK \u306e A2A \u5bfe\u5fdc\u6a5f\u80fd\u306f\u300cExperimental\u300d\u30d5\u30a7\u30fc\u30ba\u306e\u305f\u3081\u3001\u4eca\u5f8c\u3001\u30b3\u30fc\u30c9\u306e\u5b9f\u88c5\u65b9\u6cd5\u304c\u5909\u308f\u308b\u53ef\u80fd [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70\" \/>\n<meta property=\"og:site_name\" content=\"\u30dd\u30b1\u30b3\u30f3\" \/>\n<meta property=\"article:published_time\" content=\"2025-09-23T05:58:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/1758607120_og-base-w1200-v2.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"info@pokecon.jp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u57f7\u7b46\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"info@pokecon.jp\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593\" \/>\n\t<meta name=\"twitter:data2\" content=\"12\u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/6580\\\/\"},\"author\":{\"name\":\"info@pokecon.jp\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"headline\":\"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b\",\"datePublished\":\"2025-09-23T05:58:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/6580\\\/\"},\"wordCount\":226,\"image\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/1758607120_og-base-w1200-v2.png\",\"articleSection\":[\"\u4f01\u696d\u30c6\u30c3\u30af\"],\"inLanguage\":\"ja\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/6580\\\/\",\"url\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70\",\"name\":\"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b - \u30dd\u30b1\u30b3\u30f3\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/1758607120_og-base-w1200-v2.png\",\"datePublished\":\"2025-09-23T05:58:43+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70#breadcrumb\"},\"inLanguage\":\"ja\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70#primaryimage\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/1758607120_og-base-w1200-v2.png\",\"contentUrl\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/wp-content\\\/uploads\\\/2025\\\/09\\\/1758607120_og-base-w1200-v2.png\",\"width\":1200,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zenn.dev\\\/google_cloud_jp\\\/articles\\\/04cdf10fb5cd70#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#website\",\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/\",\"name\":\"\u30dd\u30b1\u30b3\u30f3\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ja\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/#\\\/schema\\\/person\\\/16c9f07b1ba984d165d9aee259bda997\",\"name\":\"info@pokecon.jp\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ja\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g\",\"caption\":\"info@pokecon.jp\"},\"url\":\"https:\\\/\\\/pokecon.jp\\\/job\\\/author\\\/infopokecon-jp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b - \u30dd\u30b1\u30b3\u30f3","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70","og_locale":"ja_JP","og_type":"article","og_title":"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b - \u30dd\u30b1\u30b3\u30f3","og_description":"! \u3053\u306e\u8a18\u4e8b\u3067\u306f\u3001ADK \u304c\u63d0\u4f9b\u3059\u308b A2A \u5bfe\u5fdc\u6a5f\u80fd\u3092\u5229\u7528\u3057\u305f\u5b9f\u88c5\u4f8b\u3092\u8aac\u660e\u3057\u3066\u3044\u307e\u3059\u3002\u73fe\u5728\uff082025\u5e749\u6708\uff09\u3001ADK \u306e A2A \u5bfe\u5fdc\u6a5f\u80fd\u306f\u300cExperimental\u300d\u30d5\u30a7\u30fc\u30ba\u306e\u305f\u3081\u3001\u4eca\u5f8c\u3001\u30b3\u30fc\u30c9\u306e\u5b9f\u88c5\u65b9\u6cd5\u304c\u5909\u308f\u308b\u53ef\u80fd [&hellip;]","og_url":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70","og_site_name":"\u30dd\u30b1\u30b3\u30f3","article_published_time":"2025-09-23T05:58:43+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/1758607120_og-base-w1200-v2.png","type":"image\/png"}],"author":"info@pokecon.jp","twitter_card":"summary_large_image","twitter_misc":{"\u57f7\u7b46\u8005":"info@pokecon.jp","\u63a8\u5b9a\u8aad\u307f\u53d6\u308a\u6642\u9593":"12\u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70#article","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/6580\/"},"author":{"name":"info@pokecon.jp","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"headline":"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b","datePublished":"2025-09-23T05:58:43+00:00","mainEntityOfPage":{"@id":"https:\/\/pokecon.jp\/job\/6580\/"},"wordCount":226,"image":{"@id":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/1758607120_og-base-w1200-v2.png","articleSection":["\u4f01\u696d\u30c6\u30c3\u30af"],"inLanguage":"ja"},{"@type":"WebPage","@id":"https:\/\/pokecon.jp\/job\/6580\/","url":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70","name":"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b - \u30dd\u30b1\u30b3\u30f3","isPartOf":{"@id":"https:\/\/pokecon.jp\/job\/#website"},"primaryImageOfPage":{"@id":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70#primaryimage"},"image":{"@id":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70#primaryimage"},"thumbnailUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/1758607120_og-base-w1200-v2.png","datePublished":"2025-09-23T05:58:43+00:00","author":{"@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997"},"breadcrumb":{"@id":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70#breadcrumb"},"inLanguage":"ja","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70"]}]},{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70#primaryimage","url":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/1758607120_og-base-w1200-v2.png","contentUrl":"https:\/\/pokecon.jp\/job\/wp-content\/uploads\/2025\/09\/1758607120_og-base-w1200-v2.png","width":1200,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/zenn.dev\/google_cloud_jp\/articles\/04cdf10fb5cd70#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/pokecon.jp\/job\/"},{"@type":"ListItem","position":2,"name":"\u3010Agent Engine \u306e A2A \u5bfe\u5fdc\u8a18\u5ff5\u3011A2A \u30ea\u30e2\u30fc\u30c8\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u3092 Agent Engine \u306b\u30c7\u30d7\u30ed\u30a4\u3059\u308b"}]},{"@type":"WebSite","@id":"https:\/\/pokecon.jp\/job\/#website","url":"https:\/\/pokecon.jp\/job\/","name":"\u30dd\u30b1\u30b3\u30f3","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/pokecon.jp\/job\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ja"},{"@type":"Person","@id":"https:\/\/pokecon.jp\/job\/#\/schema\/person\/16c9f07b1ba984d165d9aee259bda997","name":"info@pokecon.jp","image":{"@type":"ImageObject","inLanguage":"ja","@id":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2b0549cd9f7907c092ca5fbb283baf72337f235726e4b46fa39ec0b701ac2fe2?s=96&d=wavatar&r=g","caption":"info@pokecon.jp"},"url":"https:\/\/pokecon.jp\/job\/author\/infopokecon-jp\/"}]}},"_links":{"self":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/6580","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/comments?post=6580"}],"version-history":[{"count":1,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/6580\/revisions"}],"predecessor-version":[{"id":6582,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/posts\/6580\/revisions\/6582"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media\/6581"}],"wp:attachment":[{"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/media?parent=6580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/categories?post=6580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pokecon.jp\/job\/wp-json\/wp\/v2\/tags?post=6580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}