3. SDKでエージェントを作成
PythonとClaude SDK(anthropicパッケージ)を使ってエージェントを作成します。Pythonの実行環境はuvで統一します。
1. uvをインストール
Section titled “1. uvをインストール”-
uvをインストールします。
PowerShellで以下のコマンドを実行します。
Terminal window powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"ターミナルで以下のコマンドを実行します。
Terminal window curl -LsSf https://astral.sh/uv/install.sh | sh -
ターミナル(またはPowerShell)を開き直してから、インストールを確認します。
Terminal window uv --versionuv 0.11.6のようにバージョンが表示されればOKです。
2. プロジェクトを作成
Section titled “2. プロジェクトを作成”-
プロジェクトを作成し、そのフォルダーに移動します。
Terminal window uv init jina-research-agentcd jina-research-agent -
Claude SDKをインストールします。
Terminal window uv add anthropic
3. リソースを作成
Section titled “3. リソースを作成”認証情報ボールト・環境・エージェントは「一度作れば使い回す」リソースなので、作成用のスクリプトにまとめます。内容は1. コンソールでエージェントを作成で画面から作ったものと同じで、名前には「-sdk」を付けています。
-
プロジェクトのフォルダーに
setup.pyを作成し、以下の内容を保存します。ここにJina AIのAPIキーの部分は実際のAPIキーに置き換えてください。setup.py import jsonfrom anthropic import Anthropicclient = Anthropic()################################ 1. 認証情報ボールトを作成###############################vault = client.beta.vaults.create(display_name="Vault-sdk")print(f"vault: {vault.id}")################################ 2. ボールトにJina AIのAPIキーを追加###############################credential = client.beta.vaults.credentials.create(vault_id=vault.id,display_name="Jina-ai-sdk",auth={"type": "static_bearer","mcp_server_url": "https://mcp.jina.ai/v1","token": "ここにJina AIのAPIキー",},)print(f"credential: {credential.id}")################################ 3. 環境を作成(MCPサーバーへのネットワークアクセスを許可)###############################environment = client.beta.environments.create(name="Jina-environment-sdk",config={"type": "cloud","networking": {"type": "limited", "allow_mcp_servers": True},},)print(f"environment: {environment.id}")################################ 4. エージェントを作成###############################agent = client.beta.agents.create(name="Jina Web Research Agent SDK",model={"id": "claude-haiku-4-5", "speed": "standard"},description="Jina AIのMCPサーバーを使ったWeb検索、ページ読み取り、学術研究のデモエージェント。",system="あなたはJina AIの検索・読み取りツールを活用するリサーチアシスタントです。質問を受けたら、search_web(学術的なトピックの場合はsearch_arxivやsearch_ssrn)を使って関連ソースを見つけ、その後read_urlまたはparallel_read_urlを使って、有望な結果の全文を取得してください。検索結果のスニペットだけに頼らないようにしてください。複数のソースから得た情報を組み合わせ、使用したURLを引用し、不確実な点や矛盾する情報がある場合は明確に示してください。効率化のため、複数のソースを同時に検索・読み取る際はparallel_*系のツールを優先して使ってください。特定のページの要約や事実抽出を求められた場合は、read_urlで直接そのページを読み取ってください。回答は簡潔かつ整理された形にし、事前知識ではなく取得したコンテンツに基づくようにしてください。",mcp_servers=[{"name": "jina", "type": "url", "url": "https://mcp.jina.ai/v1"}],tools=[{"type": "mcp_toolset","mcp_server_name": "jina","default_config": {"enabled": True,"permission_policy": {"type": "always_allow"},},}],)print(f"agent: {agent.id}")################################ 作成したIDをファイルに保存(run.pyで使う)###############################with open("ids.json", "w") as f:json.dump({"vault_id": vault.id,"environment_id": environment.id,"agent_id": agent.id,},f,indent=2,)print("IDをids.jsonに保存しました") -
スクリプトを実行します。
Terminal window uv run setup.py次のように、作成されたリソースのIDが表示されます。
vault: vlt_011Cci1zcUettnGhV6NQabv9credential: vcrd_012oihCmwZH95gkNgf4Pix3eenvironment: env_018fgtuvYobdrA98ty299UpDagent: agent_018ZmPdCappkAQ5g3nc444ToIDをids.jsonに保存しました
4. エージェントを呼び出す
Section titled “4. エージェントを呼び出す”セッションの作成とエージェントとの対話は、実行のたびに使うスクリプトにまとめます。
-
プロジェクトのフォルダーに
run.pyを作成し、以下の内容を保存します。run.py import jsonfrom anthropic import Anthropicclient = Anthropic()################################ setup.pyで保存したIDを読み込む###############################with open("ids.json") as f:ids = json.load(f)################################ 1. セッションを作成(エージェント・環境・ボールトを組み合わせる)###############################session = client.beta.sessions.create(agent=ids["agent_id"],environment_id=ids["environment_id"],vault_ids=[ids["vault_id"]],)print(f"session: {session.id}")################################ 2. 先にイベントのストリームを開く(イベントを取りこぼさないため)###############################stream = client.beta.sessions.events.stream(session_id=session.id)################################ 3. メッセージを送信###############################client.beta.sessions.events.send(session.id,events=[{"type": "user.message","content": [{"type": "text", "text": "最新のRAGに関する論文を検索して"}],}],)print("メッセージを送信しました。応答を待っています...\n")################################ 4. イベントを受信しながら表示する###############################for event in stream:if event.type == "agent.mcp_tool_use":print(f"[ツール呼び出し: {event.name}]")elif event.type == "agent.message":for block in event.content:if block.type == "text":print(block.text)elif event.type == "session.status_idle":if event.stop_reason.type != "requires_action":breakelif event.type == "session.status_terminated":breakstream.close()print("\n完了しました") -
スクリプトを実行します。
Terminal window uv run run.pyツールの呼び出しに続いて、回答がリアルタイムに表示されます(1分ほどかかります)。
session: sesn_01CCczZDALAHspEXUqx9rhFQメッセージを送信しました。応答を待っています...[ツール呼び出し: search_arxiv]最新のRAG関連論文が見つかりました。...## 最新のRAG関連論文(2026年6月発表)1. **TA-RAG: Tone-Aware Retrieval-Augmented Generation for Peer** (2606.06794)- トーン制御をRAGパイプラインに組み込む軽量フレームワーク...完了しました -
run.pyをもう一度実行すると、同じエージェントで新しいセッションが始まります。メッセージの内容を変えて試してみてください。作成したリソースやセッションのやり取りは、コンソールの各メニューからも確認できます。
5. 対話を続ける
Section titled “5. 対話を続ける”run.pyは1往復で終了しますが、セッションはステートフルなので、同じセッションにメッセージを送り続けると会話がつながります。対話型のバージョンを作ってみましょう。
-
プロジェクトのフォルダーに
chat.pyを作成し、以下の内容を保存します。chat.py import jsonfrom anthropic import Anthropicclient = Anthropic()################################ setup.pyで保存したIDを読み込む###############################with open("ids.json") as f:ids = json.load(f)################################ セッションは最初に1つだけ作る(同じセッションに送り続けると会話がつながる)###############################session = client.beta.sessions.create(agent=ids["agent_id"],environment_id=ids["environment_id"],vault_ids=[ids["vault_id"]],)print(f"session: {session.id}")print("エージェントと対話します。exit と入力すると終了します。\n")while True:user_input = input("あなた> ").strip()if user_input == "exit":breakif not user_input:continue################################ ストリームを開いてからメッセージを送信###############################stream = client.beta.sessions.events.stream(session_id=session.id)client.beta.sessions.events.send(session.id,events=[{"type": "user.message","content": [{"type": "text", "text": user_input}],}],)################################ エージェントが入力待ちになるまでイベントを表示###############################for event in stream:if event.type == "agent.mcp_tool_use":print(f"[ツール呼び出し: {event.name}]")elif event.type == "agent.message":for block in event.content:if block.type == "text":print(block.text)elif event.type == "session.status_idle":if event.stop_reason.type != "requires_action":breakelif event.type == "session.status_terminated":breakstream.close()print() -
スクリプトを実行し、続けて質問してみます。前のやり取りを覚えていることが確認できます。
Terminal window uv run chat.pysession: sesn_01UDB8UgiKxoFr1myDyGfjf2エージェントと対話します。exit と入力すると終了します。あなた> こんにちはこんにちは。あなた> 私が最初に送ったメッセージを覚えていますか?はい、「こんにちは」というご挨拶でした。あなた> exit
- コンソール・CLIと同じ構成を、Python SDKで構築しました。
- リソースの作成(
setup.py)と実行(run.py)をスクリプトとして分け、IDをids.jsonで受け渡すのが基本パターンです。 - イベントはストリームを先に開いてから送信し、
session.status_idleで受信を終えます。 - セッションはステートフルなので、同じセッションに送り続けるだけで会話がつながります(
chat.py)。履歴の管理はクライアント側では不要です。
おつかれさまでした!ここまでの感想を、ぜひXにポストしてください。
感想をXにポストする