Berikut adalah beberapa contoh kode yang menunjukkan berbagai pola dan teknik penggunaan alat. Demi singkatnya, alat-alat tersebut adalah alat sederhana, dan deskripsi alat lebih singkat daripada yang ideal untuk memastikan kinerja terbaik. Lihat menentukan alat untuk informasi lebih lanjut.

Alat tunggal

Contoh ini menunjukkan situasi alat tunggal dasar, menggunakan alat get_weather.

curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "anthropic-beta: tools-2024-05-16" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-3-opus-20240229",
    "max_tokens": 1024,
    "tools": [{
        "name": "get_weather",
        "description": "Dapatkan cuaca saat ini di lokasi tertentu",
        "input_schema": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Kota dan negara bagian, misalnya San Francisco, CA"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "Satuan suhu, antara \"celsius\" atau \"fahrenheit\""
                }
            },
            "required": ["location"]
        }
    }],
    "messages": [{"role": "user", "content": "Bagaimana cuaca di San Francisco?"}]
}'

Claude akan mengembalikan respons serupa dengan:

JSON
{
  "id": "msg_01Aq9w938a90dw8q",
  "model": "claude-3-opus-20240229",
  "stop_reason": "tool_use",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "<thinking>Saya perlu memanggil fungsi get_weather, dan pengguna menginginkan SF, yang mungkin San Francisco, CA.</thinking>"
    },
    {
      "type": "tool_use",
      "id": "toolu_01A09q90qw90lq917835lq9", 
      "name": "get_weather",
      "input": {"location": "San Francisco, CA", "unit": "celsius"}
    }
  ]
}

Anda kemudian perlu menjalankan fungsi get_weather dengan input yang diberikan, dan mengembalikan hasilnya dalam pesan user baru:

curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "anthropic-beta: tools-2024-05-16" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-3-opus-20240229",
    "max_tokens": 1024,
    "tools": [
        {
            "name": "get_weather",
            "description": "Dapatkan cuaca saat ini di lokasi tertentu",
            "input_schema": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "Kota dan negara bagian, misalnya San Francisco, CA"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "Satuan suhu, antara \"celsius\" atau \"fahrenheit\""
                    }
                },
                "required": ["location"]
            }
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "Bagaimana cuaca di San Francisco?"
        },
        {
            "role": "assistant",
            "content": [
                {
                    "type": "text",
                    "text": "<thinking>Saya perlu menggunakan get_weather, dan pengguna menginginkan SF, yang mungkin San Francisco, CA.</thinking>"
                },
                {
                    "type": "tool_use",
                    "id": "toolu_01A09q90qw90lq917835lq9",
                    "name": "get_weather",
                    "input": {
                        "location": "San Francisco, CA",
                        "unit": "celsius"
                    }
                }
            ]
        },
        {
            "role": "user",
            "content": [
                {
                    "type": "tool_result",
                    "tool_use_id": "toolu_01A09q90qw90lq917835lq9",
                    "content": "15 derajat"
                }
            ]
        }
    ]
}'

Ini akan mencetak respons akhir Claude, menggabungkan data cuaca:

JSON
{
  "id": "msg_01Aq9w938a90dw8q",
  "model": "claude-3-opus-20240229",
  "stop_reason": "stop_sequence",
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "Cuaca saat ini di San Francisco adalah 15 derajat Celsius (59 derajat Fahrenheit). Hari yang sejuk di kota dekat teluk!"
    }
  ]
}

Informasi yang hilang

Jika prompt pengguna tidak menyertakan cukup informasi untuk mengisi semua parameter yang diperlukan untuk suatu alat, Claude 3 Opus jauh lebih mungkin mengenali bahwa parameter hilang dan memintanya. Claude 3 Sonnet mungkin bertanya, terutama ketika diminta untuk berpikir sebelum mengeluarkan permintaan alat. Tetapi ia juga mungkin melakukan yang terbaik untuk menyimpulkan nilai yang masuk akal.

Misalnya, menggunakan alat get_weather di atas, jika Anda bertanya kepada Claude “Bagaimana cuacanya?” tanpa menentukan lokasi, Claude, khususnya Claude 3 Sonnet, mungkin menebak input alat:

JSON
{
  "type": "tool_use",
  "id": "toolu_01A09q90qw90lq917835lq9",
  "name": "get_weather", 
  "input": {"location": "New York, NY", "unit": "fahrenheit"}
}

Perilaku ini tidak dijamin, terutama untuk prompt yang lebih ambigu dan untuk model yang kurang cerdas daripada Claude 3 Opus. Jika Claude 3 Opus tidak memiliki konteks yang cukup untuk mengisi parameter yang diperlukan, ia jauh lebih mungkin merespons dengan pertanyaan klarifikasi daripada membuat panggilan alat.


Beberapa alat

Anda dapat memberikan Claude beberapa alat untuk dipilih dalam satu permintaan. Berikut adalah contoh dengan alat get_weather dan get_time, bersama dengan kueri pengguna yang meminta keduanya.

curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "anthropic-beta: tools-2024-05-16" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-3-opus-20240229",
    "max_tokens": 1024,
    "tools": [{
        "name": "get_weather",
        "description": "Dapatkan cuaca saat ini di lokasi tertentu",
        "input_schema": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "Kota dan negara bagian, misalnya San Francisco, CA"
                },
                "unit": {
                    "type": "string",
                    "enum": ["celsius", "fahrenheit"],
                    "description": "Satuan suhu, antara 'celsius' atau 'fahrenheit'"
                }
            },
            "required": ["location"]
        }
    },
    {
        "name": "get_time",
        "description": "Dapatkan waktu saat ini di zona waktu tertentu",
        "input_schema": {
            "type": "object",
            "properties": {
                "timezone": {
                    "type": "string",
                    "description": "Nama zona waktu IANA, misalnya America/Los_Angeles"
                }
            },
            "required": ["timezone"]
        }
    }],
    "messages": [{
        "role": "user",
        "content": "Bagaimana cuaca di New York sekarang? Juga jam berapa di sana?"
    }]
}'

Dalam kasus ini, Claude kemungkinan besar akan mencoba menggunakan dua alat terpisah, satu per satu — get_weather dan kemudian get_time — untuk menjawab pertanyaan pengguna sepenuhnya. Namun, ia juga terkadang akan mengeluarkan dua blok tool_use sekaligus, terutama jika keduanya tidak saling bergantung. Anda perlu menjalankan setiap alat dan mengembalikan hasilnya dalam blok tool_result terpisah dalam satu pesan user.


Alat berurutan

Beberapa tugas mungkin memerlukan pemanggilan beberapa alat secara berurutan, menggunakan output dari satu alat sebagai input untuk alat lain. Dalam kasus seperti itu, Claude akan memanggil satu alat pada satu waktu. Jika diminta untuk memanggil semua alat sekaligus, Claude cenderung menebak parameter untuk alat yang lebih jauh ke hilir jika mereka bergantung pada hasil alat untuk alat yang lebih jauh ke hulu.

Berikut adalah contoh penggun alat get_location untuk mendapatkan lokasi pengguna, kemudian meneruskan lokasi tersebut ke alat get_weather:

curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "anthropic-beta: tools-2024-05-16" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-3-opus-20240229",
    "max_tokens": 1024,
    "tools": [
        {
            "name": "get_location",
            "description": "Dapatkan lokasi pengguna saat ini berdasarkan alamat IP mereka. Alat ini tidak memiliki parameter atau argumen.",
            "input_schema": {
                "type": "object",
                "properties": {}
            }
        },
        {
            "name": "get_weather",
            "description": "Dapatkan cuaca saat ini di lokasi tertentu",
            "input_schema": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "Kota dan negara bagian, misalnya San Francisco, CA"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "Satuan suhu, antara 'celsius' atau 'fahrenheit'"
                    }
                },
                "required": ["location"]
            }
        }
    ],
    "messages": [{
        "role": "user",
        "content": "Bagaimana cuaca di lokasi saya?"
    }]
}'

Dalam kasus ini, Claude pertama-tama akan memanggil alat get_location untuk mendapatkan lokasi pengguna. Setelah Anda mengembalikan lokasi dalam tool_result, Claude kemudian akan memanggil get_weather dengan lokasi tersebut untuk mendapatkan jawaban akhir.

Percakapan lengkapnya mungkin terlihat seperti:

PeranKonten
PenggunaBagaimana cuaca di lokasi saya?
Asisten<thinking>Untuk menjawab ini, saya pertama perlu menentukan lokasi pengguna menggunakan alat get_location. Kemudian saya dapat meneruskan lokasi tersebut ke alat get_weather untuk menemukan cuaca saat ini di sana.</thinking>[Penggunaan alat untuk get_location]
Pengguna[Hasil alat untuk get_location dengan id yang cocok dan hasil San Francisco, CA]
Asisten[Penggunaan alat untuk get_weather dengan input berikut]{ “location”: “San Francisco, CA”, “unit”: “fahrenheit” }
Pengguna[Hasil alat untuk get_weather dengan id yang cocok dan hasil “59°F (15°C), sebagian besar berawan”]
AsistenBerdasarkan lokasi Anda saat ini di San Francisco, CA, cuaca saat ini adalah 59°F (15°C) dan sebagian besar berawan. Hari yang cukup sejuk dan mendung di kota. Anda mungkin ingin membawa jaket ringan jika akan keluar.

Contoh ini menunjukkan bagaimana Claude dapat menggabungkan beberapa panggilan alat untuk menjawab pertanyaan yang memerlukan pengumpulan data dari sumber yang berbeda. Langkah-langkah utamanya adalah:

  1. Claude pertama-tama menyadari bahwa ia memerlukan lokasi pengguna untuk menjawab pertanyaan cuaca, jadi ia memanggil alat get_location.
  2. Pengguna (yaitu kode klien) menjalankan fungsi get_location yang sebenarnya dan mengembalikan hasil “San Francisco, CA” dalam blok tool_result.
  3. Dengan lokasi yang sekarang diketahui, Claude melanjutkan untuk memanggil alat get_weather, meneruskan “San Francisco, CA” sebagai parameter location (serta parameter unit yang ditebak, karena unit bukan parameter yang diperlukan).
  4. Pengguna sekali lagi menjalankan fungsi get_weather yang sebenarnya dengan argumen yang diberikan dan mengembalikan data cuaca dalam blok tool_result lain.
  5. Akhirnya, Claude memasukkan data cuaca ke dalam respons bahasa alami untuk pertanyaan asli.

Penggunaan alat rantai pemikiran

Secara default, Claude 3 Opus diminta untuk berpikir sebelum menjawab kueri penggunaan alat untuk menentukan dengan baik apakah alat diperlukan, alat mana yang akan digunakan, dan parameter yang sesuai. Claude 3 Sonnet dan Claude 3 Haiku diminta untuk mencoba menggunakan alat sebanyak mungkin dan lebih mungkin memanggil alat yang tidak perlu atau menyimpulkan parameter yang hilang. Untuk meminta Sonnet atau Haiku agar lebih baik menilai kueri pengguna sebelum melakukan panggilan alat, prompt berikut dapat digunakan:

Prompt rantai pemikiran

Jawab permintaan pengguna menggunakan alat yang relevan (jika tersedia). Sebelum memanggil alat, lakukan beberapa analisis dalam tag \<thinking>\</thinking>. Pertama, pikirkan alat mana dari alat yang disediakan yang relevan untuk menjawab permintaan pengguna. Kedua, periksa setiap parameter yang diperlukan dari alat yang relevan dan tentukan apakah pengguna telah secara langsung memberikan atau memberikan cukup informasi untuk menyimpulkan nilai. Saat memutuskan apakah parameter dapat disimpulkan, pertimbangkan dengan cermat semua konteks untuk melihat apakah mendukung nilai tertentu. Jika semua parameter yang diperlukan ada atau dapat disimpulkan secara wajar, tutup tag pemikiran dan lanjutkan dengan panggilan alat. TETAPI, jika salah satu nilai untuk parameter yang diperlukan hilang, JANGAN memanggil fungsi (bahkan tidak dengan pengisi untuk param yang hilang) dan sebaliknya, minta pengguna untuk memberikan parameter yang hilang. JANGAN meminta informasi lebih lanjut tentang parameter opsional jika tidak diberikan.


Mode JSON

Anda dapat menggunakan alat untuk membuat Claude menghasilkan output JSON yang mengikuti skema, bahkan jika Anda tidak bermaksud menjalankan output tersebut melalui alat atau fungsi.

Saat menggunakan alat dengan cara ini:

  • Anda biasanya ingin menyediakan satu alat
  • Anda harus mengatur tool_choice (lihat Memaksa penggunaan alat) untuk menginstruksikan model agar secara eksplisit menggunakan alat tersebut
  • Ingat bahwa model akan meneruskan input ke alat, jadi nama alat dan deskripsi harus dari perspektif model.

Berikut ini menggunakan alat record_summary untuk mendeskripsikan gambar mengikuti format tertentu.

#!/bin/bash
IMAGE_URL="https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
IMAGE_MEDIA_TYPE="image/jpeg"
IMAGE_BASE64=$(curl "$IMAGE_URL" | base64)

curl https://api.anthropic.com/v1/messages \
     --header "content-type: application/json" \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "anthropic-beta: tools-2024-05-16" \
     --data \
'{
    "model": "claude-3-sonnet-20240229",
    "max_tokens": 1024,
    "tools": [{
        "name": "record_summary",
        "description": "Catat ringkasan gambar menggunakan JSON yang terstruktur dengan baik.",
        "input_schema": {
            "type": "object",
            "properties": {
                "key_colors": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
"r": { "type": "number", "description": "nilai merah [0.0, 1.0]" },
"g": { "type": "number", "description": "nilai hijau [0.0, 1.0]" },
"b": { "type": "number", "description": "nilai biru [0.0, 1.0]" },
"name": { "type": "string", "description": "Nama warna yang dapat dibaca manusia dalam snake_case, misalnya \"olive_green\" atau \"turquoise\"" }
                        },
                        "required": [ "r", "g", "b", "name" ]
                    },
                    "description": "Warna kunci dalam gambar. Batasi kurang dari empat."
                },
                "description": {
                    "type": "string",
                    "description": "Deskripsi gambar. Maksimal satu hingga dua kalimat."
                },
                "estimated_year": {
                    "type": "integer",
                    "description": "Perkiraan tahun gambar diambil, jika itu foto. Hanya atur ini jika gambar tampaknya non-fiksi. Perkiraan kasar tidak apa-apa!"
                }
            },
            "required": [ "key_colors", "description" ]
        }
    }],
    "tool_choice": {"type": "tool", "name": "record_summary"},
    "messages": [
        {"role": "user", "content": [
            {"type": "image", "source": {
                "type": "base64",
                "media_type": "'$IMAGE_MEDIA_TYPE'",
                "data": "'$IMAGE_BASE64'"
            }},
            {"type": "text", "text": "Deskripsikan gambar ini."}
        ]}
    ]
}'