コンテンツにスキップ

3. SDKでエージェントを作成

PythonとClaude SDK(anthropicパッケージ)を使ってエージェントを作成します。Pythonの実行環境はuvで統一します。

  1. uvをインストールします。

    PowerShellで以下のコマンドを実行します。

    Terminal window
    powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
  2. ターミナル(またはPowerShell)を開き直してから、インストールを確認します。

    Terminal window
    uv --version

    uv 0.11.6のようにバージョンが表示されればOKです。

  1. プロジェクトを作成し、そのフォルダーに移動します。

    Terminal window
    uv init jina-research-agent
    cd jina-research-agent
  2. Claude SDKをインストールします。

    Terminal window
    uv add anthropic

認証情報ボールト・環境・エージェントは「一度作れば使い回す」リソースなので、作成用のスクリプトにまとめます。内容は1. コンソールでエージェントを作成で画面から作ったものと同じで、名前には「-sdk」を付けています。

  1. プロジェクトのフォルダーにsetup.pyを作成し、以下の内容を保存します。ここにJina AIのAPIキーの部分は実際のAPIキーに置き換えてください。

    setup.py
    import json
    from anthropic import Anthropic
    client = 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に保存しました")
  2. スクリプトを実行します。

    Terminal window
    uv run setup.py

    次のように、作成されたリソースのIDが表示されます。

    vault: vlt_011Cci1zcUettnGhV6NQabv9
    credential: vcrd_012oihCmwZH95gkNgf4Pix3e
    environment: env_018fgtuvYobdrA98ty299UpD
    agent: agent_018ZmPdCappkAQ5g3nc444To
    IDをids.jsonに保存しました

セッションの作成とエージェントとの対話は、実行のたびに使うスクリプトにまとめます。

  1. プロジェクトのフォルダーにrun.pyを作成し、以下の内容を保存します。

    run.py
    import json
    from anthropic import Anthropic
    client = 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":
    break
    elif event.type == "session.status_terminated":
    break
    stream.close()
    print("\n完了しました")
  2. スクリプトを実行します。

    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パイプラインに組み込む軽量フレームワーク
    ...
    完了しました
  3. run.pyをもう一度実行すると、同じエージェントで新しいセッションが始まります。メッセージの内容を変えて試してみてください。作成したリソースやセッションのやり取りは、コンソールの各メニューからも確認できます。

run.pyは1往復で終了しますが、セッションはステートフルなので、同じセッションにメッセージを送り続けると会話がつながります。対話型のバージョンを作ってみましょう。

  1. プロジェクトのフォルダーにchat.pyを作成し、以下の内容を保存します。

    chat.py
    import json
    from anthropic import Anthropic
    client = 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":
    break
    if 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":
    break
    elif event.type == "session.status_terminated":
    break
    stream.close()
    print()
  2. スクリプトを実行し、続けて質問してみます。前のやり取りを覚えていることが確認できます。

    Terminal window
    uv run chat.py
    session: sesn_01UDB8UgiKxoFr1myDyGfjf2
    エージェントと対話します。exit と入力すると終了します。
    あなた> こんにちは
    こんにちは。
    あなた> 私が最初に送ったメッセージを覚えていますか?
    はい、「こんにちは」というご挨拶でした。
    あなた> exit
  • コンソール・CLIと同じ構成を、Python SDKで構築しました。
  • リソースの作成(setup.py)と実行(run.py)をスクリプトとして分け、IDをids.jsonで受け渡すのが基本パターンです。
  • イベントはストリームを先に開いてから送信し、session.status_idleで受信を終えます。
  • セッションはステートフルなので、同じセッションに送り続けるだけで会話がつながります(chat.py)。履歴の管理はクライアント側では不要です。

おつかれさまでした!ここまでの感想を、ぜひXにポストしてください。

感想をXにポストする