Skip to content

Commit 51785f4

Browse files
authored
Merge pull request google-cloud-japan#62 from google-cloud-japan/use_function
Use own fetch function instead of load_web_page
2 parents 9591b99 + 0157284 commit 51785f4

File tree

7 files changed

+280
-66
lines changed

7 files changed

+280
-66
lines changed

2025/adk-agentengine-basic/pyproject.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
[project]
22
name = "adk-agentengine-basic"
3-
version = "0.1.0"
3+
version = "0.2.0"
44
description = "Hands-on asset for Agent Development Kit and Agent Engine basic level"
55
readme = "README.md"
66
requires-python = ">=3.13"
77
dependencies = [
8-
"beautifulsoup4>=4.13.4",
98
"google-adk>=1.8.0",
10-
"lxml>=6.0.0",
9+
"trafilatura>=1.6.1",
1110
]
1211

1312
[dependency-groups]

2025/adk-agentengine-basic/step02/agent.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
from google.adk.agents import LlmAgent
2-
from google.adk.tools.load_web_page import load_web_page
2+
from trafilatura import extract, fetch_url
33

44
MODEL_GEMINI_2_5_PRO="gemini-2.5-pro"
55
MODEL_GEMINI_2_5_FLASH="gemini-2.5-flash"
66
MODEL_GEMINI_2_5_FLASH_LITE="gemini-2.5-flash-lite"
77

8+
def fetch(url: str) -> str:
9+
"""指定されたURLのコンテンツを取得し、マークダウン形式で返却します。
10+
11+
Args:
12+
url (str): コンテンツを取得するURL
13+
14+
Returns:
15+
str: マークダウン形式のURL先のコンテンツ。取得に失敗した場合は、"コンテンツの取得に失敗しました。"を返却します。
16+
"""
17+
downloaded = fetch_url(url)
18+
result = extract(downloaded, output_format="markdown", with_metadata=True)
19+
if result is None:
20+
return "コンテンツの取得に失敗しました。"
21+
return result
22+
823
agent = LlmAgent(
924
name="learning_assistant",
1025
model=MODEL_GEMINI_2_5_FLASH,
@@ -17,15 +32,15 @@
1732
- 質問にURLが含まれているか確認してください。
1833
1934
2. **情報収集 (URLがある場合)**:
20-
- 質問にURLが含まれている場合、`load_web_page` ツールを必ず使用して、ウェブページの内容を取得してください。
21-
- `load_web_page` ツールが失敗した場合や、URLから有益な情報を得られなかった場合は、その旨をユーザーに明確に伝えた上で、自身の知識で回答を試みてください。
35+
- 質問にURLが含まれている場合、`fetch` ツールを必ず使用して、ウェブページの内容を取得してください。
36+
- `fetch` ツールが失敗した場合や、URLから有益な情報を得られなかった場合は、その旨をユーザーに明確に伝えた上で、自身の知識で回答を試みてください。
2237
2338
3. **回答生成**:
2439
- **URLから情報を取得した場合**: 取得した内容のみを情報源として、ユーザーの質問に回答してください。取得した情報にないことは回答に含めず、事実に基づいた客観的な回答を心がけてください。
2540
- **URLがない場合**: あなた自身の知識を用いて、ユーザーの質問にできる限り正確かつ詳細に回答してください。
2641
- 回答は、常に中立的で分かりやすい言葉で構成してください。
2742
""",
28-
tools=[load_web_page]
43+
tools=[fetch]
2944
)
3045

3146
root_agent = agent

2025/adk-agentengine-basic/step02/answer.py

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,25 @@
11
from google.adk.agents import LlmAgent
2-
from google.adk.tools.load_web_page import load_web_page
2+
from trafilatura import fetch_url, extract
33

44
MODEL_GEMINI_2_5_PRO="gemini-2.5-PRO"
55
MODEL_GEMINI_2_5_FLASH="gemini-2.5-flash"
66
MODEL_GEMINI_2_5_FLASH_LITE="gemini-2.5-flash-lite"
77

8+
def fetch(url: str) -> str:
9+
"""指定されたURLのコンテンツを取得し、マークダウン形式で返却します。
10+
11+
Args:
12+
url (str): コンテンツを取得するURL
13+
14+
Returns:
15+
str: マークダウン形式のURL先のコンテンツ。取得に失敗した場合は、"コンテンツの取得に失敗しました。"を返却します。
16+
"""
17+
downloaded = fetch_url(url)
18+
result = extract(downloaded, output_format="markdown", with_metadata=True)
19+
if result is None:
20+
return "コンテンツの取得に失敗しました。"
21+
return result
22+
823
agent = LlmAgent(
924
name="learning_assistant",
1025
model=MODEL_GEMINI_2_5_FLASH,
@@ -17,15 +32,15 @@
1732
- 質問にURLが含まれているか確認してください。
1833
1934
2. **情報収集 (URLがある場合)**:
20-
- 質問に1つまたは複数のURLが含まれている場合、各URLに対して `load_web_page` ツールを必ず使用して、ウェブページの内容を取得してください。
21-
- `load_web_page` ツールが失敗した場合や、URLから有益な情報を得られなかった場合は、その旨をユーザーに伝えた上で、自身の知識で回答を試みてください。
35+
- 質問に1つまたは複数のURLが含まれている場合、各URLに対して `fetch` ツールを必ず使用して、ウェブページの内容を取得してください。
36+
- `fetch` ツールが失敗した場合や、URLから有益な情報を得られなかった場合は、その旨をユーザーに伝えた上で、自身の知識で回答を試みてください。
2237
2338
3. **回答生成**:
2439
- **URLから情報を取得した場合**: 取得したすべての内容を唯一の情報源として、ユーザーの質問に回答してください。取得した情報にないことは回答に含めず、事実に基づいた回答を心がけてください。
2540
- **URLがない場合**: あなた自身の知識を用いて、ユーザーの質問にできる限り正確かつ詳細に回答してください。
2641
- 回答は、常に中立的で分かりやすい言葉で構成してください。
2742
""",
28-
tools=[load_web_page]
43+
tools=[fetch]
2944
)
3045

3146
root_agent = agent

2025/adk-agentengine-basic/step04/agent.py

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
from google.adk.agents import LlmAgent
22
from google.adk.tools.agent_tool import AgentTool
3-
from google.adk.tools.mcp_tool import StdioConnectionParams
4-
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset
5-
from mcp import StdioServerParameters
3+
from trafilatura import extract, fetch_url
64

75
MODEL_GEMINI_2_5_PRO="gemini-2.5-pro"
86
MODEL_GEMINI_2_5_FLASH="gemini-2.5-flash"
@@ -48,6 +46,21 @@
4846
tools=[AgentTool(agent=podcast_writer_agent,)],
4947
)
5048

49+
def fetch(url: str) -> str:
50+
"""指定されたURLのコンテンツを取得し、マークダウン形式で返却します。
51+
52+
Args:
53+
url (str): コンテンツを取得するURL
54+
55+
Returns:
56+
str: マークダウン形式のURL先のコンテンツ。取得に失敗した場合は、"コンテンツの取得に失敗しました。"を返却します。
57+
"""
58+
downloaded = fetch_url(url)
59+
result = extract(downloaded, output_format="markdown", with_metadata=True)
60+
if result is None:
61+
return "コンテンツの取得に失敗しました。"
62+
return result
63+
5164
agent = LlmAgent(
5265
name="learning_assistant",
5366
model=MODEL_GEMINI_2_5_FLASH,
@@ -60,7 +73,7 @@
6073
- もしURLが含まれていない場合は、「ポッドキャスト台本を作成したいウェブページのURLを教えてください。」と返答してください。
6174
6275
2. **情報収集 (URLがある場合)**:
63-
- 質問に1つまたは複数のURLが含まれている場合、各URLに対して `fetch` ツールを必ず使用して、ウェブページの内容を取得してください。その際、`max_length` パラメータに `100000` を指定してください。
76+
- 質問に1つまたは複数のURLが含まれている場合、各URLに対して `fetch` ツールを必ず使用して、ウェブページの内容を取得してください。
6477
- `fetch` ツールが失敗した場合は、「申し訳ありません。指定されたURLから情報を取得できませんでした。URLが正しいかご確認ください。」と返答してください。
6578
6679
3. **コンテンツの準備**:
@@ -72,19 +85,7 @@
7285
5. **最終出力**:
7386
- `podcast_creator_agent` から受け取った最終的な台本を、そのままユーザーに提示してください。
7487
""",
75-
tools=[
76-
MCPToolset(
77-
connection_params=StdioConnectionParams(
78-
server_params=StdioServerParameters(
79-
command='uvx',
80-
args=[
81-
"mcp-server-fetch",
82-
],
83-
),
84-
timeout=20,
85-
),
86-
),
87-
],
88+
tools=[fetch],
8889
sub_agents=[podcast_creator_agent,]
8990
)
9091

2025/adk-agentengine-basic/step04/requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ google-cloud-aiplatform[adk,agent_engines]==1.106.0
22
cloudpickle==3.1.1
33
uv==0.8.4
44
pydantic==2.11.7
5+
trafilatura==1.6.1

2025/adk-agentengine-basic/step05/agent.py

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
from google.adk.agents import LlmAgent
22
from google.adk.tools import load_artifacts
33
from google.adk.tools.agent_tool import AgentTool
4-
from google.adk.tools.mcp_tool import StdioConnectionParams
5-
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset
6-
from mcp import StdioServerParameters
4+
from trafilatura import extract, fetch_url
75

86
from .tools import podcast_speaker
97

@@ -54,6 +52,21 @@
5452
tools=[AgentTool(agent=podcast_writer_agent,), podcast_speaker, load_artifacts],
5553
)
5654

55+
def fetch(url: str) -> str:
56+
"""指定されたURLのコンテンツを取得し、マークダウン形式で返却します。
57+
58+
Args:
59+
url (str): コンテンツを取得するURL
60+
61+
Returns:
62+
str: マークダウン形式のURL先のコンテンツ。取得に失敗した場合は、"コンテンツの取得に失敗しました。"を返却します。
63+
"""
64+
downloaded = fetch_url(url)
65+
result = extract(downloaded, output_format="markdown", with_metadata=True)
66+
if result is None:
67+
return "コンテンツの取得に失敗しました。"
68+
return result
69+
5770
agent = LlmAgent(
5871
name="learning_assistant",
5972
model=MODEL_GEMINI_2_5_FLASH,
@@ -66,7 +79,7 @@
6679
- もしURLが含まれていない場合は、「ポッドキャスト音声を生成したいウェブページのURLを教えてください。」と返答してください。
6780
6881
2. **情報収集 (URLがある場合)**:
69-
- 質問に1つまたは複数のURLが含まれている場合、各URLに対して `fetch` ツールを必ず使用して、ウェブページの内容を取得してください。その際、`max_length` パラメータに `100000` を指定してください。
82+
- 質問に1つまたは複数のURLが含まれている場合、各URLに対して `fetch` ツールを必ず使用して、ウェブページの内容を取得してください。
7083
- `fetch` ツールが失敗した場合は、「申し訳ありません。指定されたURLから情報を取得できませんでした。URLが正しいかご確認ください。」と返答してください。
7184
7285
3. **コンテンツの準備**:
@@ -78,19 +91,7 @@
7891
5. **最終出力**:
7992
- `podcast_creator_agent` から受け取った最終的な音声ファイルを、そのままユーザーに提示してください。
8093
""",
81-
tools=[
82-
MCPToolset(
83-
connection_params=StdioConnectionParams(
84-
server_params=StdioServerParameters(
85-
command='uvx',
86-
args=[
87-
"mcp-server-fetch",
88-
],
89-
),
90-
timeout=20,
91-
),
92-
),
93-
],
94+
tools=[fetch],
9495
sub_agents=[podcast_creator_agent,]
9596
)
9697

0 commit comments

Comments
 (0)