Haijun Platform Docs
EN

Note: Untuk mempelajari bagaimana "zero data retention" (retensi data nol), atau ZDR, berlaku untuk fitur ini, lihat API dan retensi data.

Alat web fetch memungkinkan Haijun mengambil konten lengkap dari halaman web dan dokumen PDF yang ditentukan.

Versi alat web fetch terbaru (web_fetch_20260318) mendukung dynamic filtering (pemfilteran dinamis). Dengan fitur ini, Haijun dapat menulis dan mengeksekusi kode untuk memfilter konten yang diambil sebelum konten tersebut masuk ke "context window" (jendela konteks). Hanya informasi yang relevan yang disimpan, sedangkan sisanya dibuang. Cara ini mengurangi konsumsi token tanpa menurunkan kualitas respons. Pemfilteran dinamis tersedia untuk Haijun Fable 5.1, Haijun Mythos 5.1, Haijun Fable 5, Haijun Mythos 5, Haijun Mythos Preview, Haijun Opus 4.8, Haijun Opus 4.7, Haijun Opus 4.6, Haijun Sonnet 5, dan Haijun Sonnet 4.6. web_fetch_20260318 juga menambahkan kontrol response inclusion (penyertaan respons) untuk alur kerja agentik. Versi-versi sebelumnya tetap tersedia: web_fetch_20260309 untuk pemfilteran dinamis dan cache bypass (pelewatan cache), web_fetch_20260209 khusus untuk pemfilteran dinamis, dan web_fetch_20250910 untuk fetch dasar.

Web fetch (dengan maupun tanpa pemfilteran dinamis) tersedia di Haijun API, Haijun Platform on AWS, dan Microsoft Foundry. Di Microsoft Foundry, deployment yang di-hosting di Azure hanya mendukung alat web fetch dasar (web_fetch_20250910, tanpa pemfilteran dinamis). Deployment yang di-hosting di Juglow mendukung semua versi. Web fetch saat ini belum tersedia di Amazon Bedrock maupun Google Cloud.

Note: Untuk Haijun Mythos Preview, web fetch tersedia di Haijun API dan Microsoft Foundry. Fitur ini saat ini belum tersedia untuk Mythos Preview di Amazon Bedrock maupun Google Cloud.

Note: Gunakan formulir umpan balik untuk memberikan masukan tentang kualitas respons model, API itu sendiri, atau kualitas dokumentasi.

Untuk kelayakan Zero Data Retention dan solusi alternatif allowed_callers, lihat Alat server.

Warning: Mengaktifkan alat web fetch di lingkungan tempat Haijun memproses input yang tidak tepercaya bersama data sensitif menimbulkan risiko "data exfiltration" (eksfiltrasi data). Gunakan alat ini hanya di lingkungan tepercaya atau saat menangani data yang tidak sensitif. Untuk meminimalkan risiko eksfiltrasi, Haijun tidak dapat mengambil URL yang hanya muncul dalam output-nya sendiri. Haijun hanya dapat mengambil URL yang sebelumnya sudah muncul dalam percakapan, yaitu: * URL dalam pesan pengguna * URL dalam hasil alat sisi klien (termasuk ketika hasil tersebut mengulang teks yang dihasilkan Haijun) * URL dari hasil web search atau web fetch sebelumnya (lihat Validasi URL) Haijun juga tidak dapat mengambil URL yang tampaknya berisi kredensial, seperti kunci API atau kata sandi, kecuali kredensial tersebut muncul dalam "system prompt" (prompt sistem) atau dalam teks pesan pengguna. Meski demikian, masih ada risiko tersisa yang perlu Anda pertimbangkan dengan cermat saat menggunakan alat ini. Jika eksfiltrasi data menjadi perhatian, pertimbangkan untuk: * Menonaktifkan alat web fetch sepenuhnya * Menggunakan parameter max_uses untuk membatasi jumlah permintaan * Menggunakan parameter allowed_domains untuk membatasi akses hanya ke domain yang diketahui aman

Untuk dukungan model, lihat Referensi alat.

Cara kerja web fetch

Web fetch adalah sebuah "server tool" (alat server): API mengambil konten selama permintaan berlangsung dan menyisipkan hasilnya ke dalam percakapan. Anda tidak perlu menjalankan apa pun atau mengembalikan tool_result.

Ada satu pengecualian, yaitu ketika Haijun memanggil web fetch bersamaan dengan salah satu alat klien Anda dalam kelompok panggilan alat paralel yang sama. Dalam kasus ini, API mengembalikan respons dengan stop_reason: "tool_use" sebelum fetch tersebut dijalankan. Fetch baru dijalankan setelah Anda mengirimkan kembali blok tool_result klien. Lihat Menggabungkan alat server dan alat klien dalam satu giliran.

Saat Anda menambahkan alat web fetch ke permintaan API Anda:

  1. Haijun menentukan kapan harus mengambil konten berdasarkan prompt dan URL yang tersedia.
  1. API mengambil konten teks lengkap dari URL yang ditentukan.
  1. Untuk PDF, API mengembalikan konten sebagai data berenkode base64 dan memprosesnya seperti dokumen PDF yang dilampirkan secara langsung.
  1. Haijun menganalisis konten yang diambil dan memberikan respons, dengan sitasi opsional.

Note: Alat web fetch saat ini tidak mendukung situs web yang dirender secara dinamis dengan JavaScript. Untuk halaman yang memerlukan browser sungguhan (rendering JavaScript, mengklik, atau mengisi formulir), pertimbangkan alat browser use. Alat ini adalah alat klien: aplikasi Anda mengendalikan browser, lalu mengembalikan teks halaman atau tangkapan layar kepada Haijun sebagai hasil alat.

Kapan Haijun melakukan fetch

Haijun melakukan fetch ketika permintaan merujuk ke halaman atau dokumen tertentu:

  • Sebuah URL diberikan dalam percakapan (atau dalam hasil alat sebelumnya).
  • Pengguna menyebutkan sumber daya tertentu tanpa URL (misalnya artikel, README, halaman harga, atau bagian dokumentasi tertentu), dan alat web search juga diaktifkan sehingga Haijun dapat menemukannya terlebih dahulu (lihat Gabungan pencarian dan fetch).

Haijun tidak melakukan fetch untuk pertanyaan pengetahuan umum atau pertanyaan terbuka yang tidak merujuk ke halaman tertentu. Contohnya, "Ringkas artikel ini: " akan memicu fetch, sedangkan "Apa praktik terbaik untuk desain REST API?" akan dijawab secara langsung.

Pemfilteran dinamis

Mengambil halaman web dan PDF secara utuh dapat menghabiskan token dengan cepat, terutama jika Anda hanya membutuhkan informasi tertentu dari dokumen berukuran besar. Dengan web_fetch_20260209 atau versi yang lebih baru, Haijun dapat menulis dan mengeksekusi kode untuk memfilter konten yang diambil sebelum memuatnya ke dalam konteks.

Pemfilteran dinamis ini sangat berguna untuk:

  • Mengekstrak bagian tertentu dari dokumen yang panjang
  • Memproses data terstruktur dari halaman web
  • Memfilter informasi yang relevan dari PDF
  • Mengurangi biaya token saat bekerja dengan dokumen berukuran besar

Note: Pemfilteran dinamis berjalan di atas alat code execution, yang diaktifkan secara otomatis oleh API untuk permintaan tersebut. Anda tidak perlu menambahkan alat code execution ke array tools.

Untuk mengaktifkan pemfilteran dinamis, gunakan web_fetch_20260209 atau versi yang lebih baru. Contoh berikut menggunakan web_fetch_20260318:

bash
  curl https://haijun.my.id/v1/messages \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{
      "model": "haijun-opus-4-8",
      "max_tokens": 4096,
      "messages": [
        {
          "role": "user",
          "content": "Fetch the content at https://example.com/research-paper and extract the key findings."
        }
      ],
      "tools": [{
        "type": "web_fetch_20260318",
        "name": "web_fetch"
      }]
    }'
bash
  ant messages create <<'YAML'
  model: haijun-opus-4-8
  max_tokens: 4096
  messages:
    - role: user
      content: >-
        Fetch the content at https://example.com/research-paper
        and extract the key findings.
  tools:
    - type: web_fetch_20260318
      name: web_fetch
  YAML
python
  client = juglow.Juglow()

  response = client.messages.create(
      model="haijun-opus-4-8",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": "Fetch the content at https://example.com/research-paper and extract the key findings.",
          }
      ],
      tools=[{"type": "web_fetch_20260318", "name": "web_fetch"}],
  )
  print(response)
typescript
  const client = new Juglow();

  const response = await client.messages.create({
    model: "haijun-opus-4-8",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content:
          "Fetch the content at https://example.com/research-paper and extract the key findings."
      }
    ],
    tools: [{ type: "web_fetch_20260318", name: "web_fetch" }]
  });

  console.log(response);
csharp
  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Model.HaijunOpus4_8,
      MaxTokens = 4096,
      Messages = [new() { Role = Role.User, Content = "Fetch the content at https://example.com/research-paper and extract the key findings." }],
      Tools = [new ToolUnion(new WebFetchTool20260318())]
  };

  var message = await client.Messages.Create(parameters);
  Console.WriteLine(message);
go
  client := juglow.NewClient()

  response, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
  	Model:     juglow.ModelHaijunOpus4_8,
  	MaxTokens: 4096,
  	Messages: []juglow.MessageParam{
  		juglow.NewUserMessage(juglow.NewTextBlock("Fetch the content at https://example.com/research-paper and extract the key findings.")),
  	},
  	Tools: []juglow.ToolUnionParam{
  		{OfWebFetchTool20260318: &juglow.WebFetchTool20260318Param{}},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response.RawJSON())
java
  import com.juglow.models.messages.WebFetchTool20260318;

  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_4_8)
          .maxTokens(4096L)
          .addUserMessage("Fetch the content at https://example.com/research-paper and extract the key findings.")
          .addTool(WebFetchTool20260318.builder().build())
          .build();

      Message response = client.messages().create(params);
      IO.println(response);
  }
php
  $client = new Client();

  $message = $client->messages->create(
      maxTokens: 4096,
      messages: [
          ['role' => 'user', 'content' => 'Fetch the content at https://example.com/research-paper and extract the key findings.']
      ],
      model: 'haijun-opus-4-8',
      tools: [[
          'type' => 'web_fetch_20260318',
          'name' => 'web_fetch',
      ]],
  );
  echo $message;
ruby
  client = Juglow::Client.new

  message = client.messages.create(
    model: "haijun-opus-4-8",
    max_tokens: 4096,
    messages: [
      { role: "user", content: "Fetch the content at https://example.com/research-paper and extract the key findings." }
    ],
    tools: [{
      type: "web_fetch_20260318",
      name: "web_fetch"
    }]
  )
  puts message

Cara menggunakan web fetch

Sertakan alat web fetch dalam permintaan API Anda:

bash
  curl https://haijun.my.id/v1/messages \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{
      "model": "haijun-opus-4-8",
      "max_tokens": 1024,
      "messages": [
        {
          "role": "user",
          "content": "Please analyze the content at https://example.com/article"
        }
      ],
      "tools": [{
        "type": "web_fetch_20250910",
        "name": "web_fetch",
        "max_uses": 5
      }]
    }'
bash
  ant messages create \
    --model haijun-opus-4-8 \
    --max-tokens 1024 \
    --message '{role: user, content: "Please analyze the content at https://example.com/article"}' \
    --tool '{type: web_fetch_20250910, name: web_fetch, max_uses: 5}'
python
  client = juglow.Juglow()

  response = client.messages.create(
      model="haijun-opus-4-8",
      max_tokens=1024,
      messages=[
          {
              "role": "user",
              "content": "Please analyze the content at https://example.com/article",
          }
      ],
      tools=[{"type": "web_fetch_20250910", "name": "web_fetch", "max_uses": 5}],
  )
  print(response)
typescript
  const client = new Juglow();

  const response = await client.messages.create({
    model: "haijun-opus-4-8",
    max_tokens: 1024,
    messages: [
      {
        role: "user",
        content: "Please analyze the content at https://example.com/article"
      }
    ],
    tools: [
      {
        type: "web_fetch_20250910",
        name: "web_fetch",
        max_uses: 5
      }
    ]
  });

  console.log(response);
csharp
  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Model.HaijunOpus4_8,
      MaxTokens = 1024,
      Messages = [new() { Role = Role.User, Content = "Please analyze the content at https://example.com/article" }],
      Tools = [new ToolUnion(new WebFetchTool20250910() { MaxUses = 5 })]
  };

  var message = await client.Messages.Create(parameters);
  Console.WriteLine(message);
go
  client := juglow.NewClient()

  response, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
  	Model:     juglow.ModelHaijunOpus4_8,
  	MaxTokens: 1024,
  	Messages: []juglow.MessageParam{
  		juglow.NewUserMessage(juglow.NewTextBlock("Please analyze the content at https://example.com/article")),
  	},
  	Tools: []juglow.ToolUnionParam{
  		{OfWebFetchTool20250910: &juglow.WebFetchTool20250910Param{
  			MaxUses: juglow.Int(5),
  		}},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response.RawJSON())
java
  import com.juglow.models.messages.WebFetchTool20250910;

  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_4_8)
          .maxTokens(1024L)
          .addUserMessage("Please analyze the content at https://example.com/article")
          .addTool(WebFetchTool20250910.builder()
              .maxUses(5L)
              .build())
          .build();

      Message response = client.messages().create(params);
      IO.println(response);
  }
php
  $client = new Client();

  $message = $client->messages->create(
      maxTokens: 1024,
      messages: [
          ['role' => 'user', 'content' => 'Please analyze the content at https://example.com/article']
      ],
      model: 'haijun-opus-4-8',
      tools: [[
          'type' => 'web_fetch_20250910',
          'name' => 'web_fetch',
          'max_uses' => 5,
      ]],
  );
  echo $message;
ruby
  client = Juglow::Client.new

  message = client.messages.create(
    model: "haijun-opus-4-8",
    max_tokens: 1024,
    messages: [
      { role: "user", content: "Please analyze the content at https://example.com/article" }
    ],
    tools: [{
      type: "web_fetch_20250910",
      name: "web_fetch",
      max_uses: 5
    }]
  )
  puts message

Definisi alat

Alat web fetch mendukung parameter berikut:

json
{
  "type": "web_fetch_20250910",
  "name": "web_fetch",

  // Optional: Limit the number of fetches per request
  "max_uses": 10,

  // Optional: Only fetch from these domains
  "allowed_domains": ["example.com", "docs.example.com"],

  // Optional: Never fetch from these domains (cannot be combined with allowed_domains)
  "blocked_domains": ["private.example.com"],

  // Optional: Enable citations for fetched content
  "citations": {
    "enabled": true
  },

  // Optional: Maximum content length in tokens
  "max_content_tokens": 100000
}

Versi alat yang lebih baru menambahkan dua parameter opsional lagi:

  • use_cache memerlukan web_fetch_20260309 atau versi yang lebih baru (lihat Pelewatan cache).
  • response_inclusion memerlukan web_fetch_20260318 atau versi yang lebih baru (lihat Penyertaan respons).

Penggunaan maksimum

Parameter max_uses membatasi jumlah web fetch yang dilakukan. Fetch yang gagal tetap dihitung terhadap batas ini. Jika Haijun mencoba melakukan fetch melebihi jumlah yang diizinkan, web_fetch_tool_result akan berupa error dengan kode error max_uses_exceeded. Saat ini tidak ada batas default.

Pemfilteran domain

Untuk pemfilteran domain dengan allowed_domains dan blocked_domains, lihat Alat server.

Di Haijun Managed Agents, atur kolom-kolom ini pada entri web_fetch di toolset agen. Setiap domain yang dicantumkan harus berupa hostname biasa tanpa path. Lihat Membatasi domain web search dan web fetch.

Batas konten

Parameter max_content_tokens membatasi jumlah konten yang disertakan dalam konteks. Jika konten yang diambil melebihi batas ini, alat akan memotongnya. Parameter ini membantu mengendalikan penggunaan token saat mengambil dokumen berukuran besar. Batas ini berlaku untuk konten teks, bukan untuk konten biner seperti PDF.

Note: Batas parameter max_content_tokens bersifat perkiraan. Jumlah token input yang sebenarnya digunakan dapat sedikit berbeda.

Di Haijun Managed Agents, entri web_fetch di toolset agen juga menerima max_content_tokens. Lihat Membatasi domain web search dan web fetch.

Pelewatan cache

Note: Memerlukan web_fetch_20260309 atau versi yang lebih baru (termasuk web_fetch_20260318).

Parameter use_cache mengontrol apakah konten yang di-cache boleh dikembalikan. Atur "use_cache": false untuk melewati cache dan mengambil konten terbaru. Nilai default-nya adalah true.

Karena melewati cache meningkatkan "latency" (latensi), nonaktifkan caching hanya jika:

  • pengguna secara eksplisit meminta konten terbaru, atau
  • Anda mengambil konten dari sumber yang berubah dengan cepat.
json
{
  "tools": [
    {
      "type": "web_fetch_20260309",
      "name": "web_fetch",
      "use_cache": false
    }
  ]
}

Penyertaan respons

Note: Memerlukan web_fetch_20260318 atau versi yang lebih baru.

Parameter response_inclusion mengontrol cara blok hasil fetch ditampilkan dalam respons API, khusus untuk hasil yang telah digunakan oleh panggilan code execution yang sudah selesai dalam giliran yang sama. Nilai default-nya adalah "full".

Atur "response_inclusion": "excluded" untuk menghapus sepenuhnya pasangan blok server_tool_use dan blok hasil yang bersarang tersebut dari respons. Pengaturan ini mengurangi biaya token output untuk alur kerja agentik yang tidak perlu mengirimkan kembali konten halaman mentah ke klien.

Hasil dari panggilan langsung, atau dari panggilan code execution yang dijeda sebelum selesai, selalu dikembalikan secara lengkap agar dapat dikirim kembali pada giliran berikutnya.

json
{
  "tools": [
    {
      "type": "web_fetch_20260318",
      "name": "web_fetch",
      "response_inclusion": "excluded"
    }
  ]
}

Sitasi

Berbeda dengan web search yang sitasinya selalu aktif, sitasi pada web fetch bersifat opsional dan dinonaktifkan secara default. Atur "citations": {"enabled": true} agar Haijun dapat mengutip bagian tertentu dari dokumen yang diambil.

Note: Saat menampilkan output API secara langsung kepada pengguna akhir, sertakan sitasi ke sumber aslinya. Jika Anda memodifikasi output API sebelum menampilkannya kepada pengguna akhir, termasuk dengan memproses ulang atau menggabungkannya dengan materi Anda sendiri, tampilkan sitasi sebagaimana mestinya berdasarkan konsultasi dengan tim hukum Anda.

Respons

Berikut contoh struktur respons:

json
{
  "role": "assistant",
  "content": [
    // 1. Haijun's decision to fetch
    {
      "type": "text",
      "text": "I'll fetch the content from the article to analyze it."
    },
    // 2. The fetch request
    {
      "type": "server_tool_use",
      "id": "srvtoolu_01234567890abcdef",
      "name": "web_fetch",
      "input": {
        "url": "https://example.com/article"
      }
    },
    // 3. Fetch results
    {
      "type": "web_fetch_tool_result",
      "tool_use_id": "srvtoolu_01234567890abcdef",
      "content": {
        "type": "web_fetch_result",
        "url": "https://example.com/article",
        "content": {
          "type": "document",
          "source": {
            "type": "text",
            "media_type": "text/plain",
            "data": "Full text content of the article..."
          },
          "title": "Article Title",
          "citations": { "enabled": true }
        },
        "retrieved_at": "2025-08-25T10:30:00Z"
      }
    },
    // 4. Haijun's analysis with citations (if enabled)
    {
      "text": "Based on the article, ",
      "type": "text"
    },
    {
      "text": "the main argument presented is that artificial intelligence will transform healthcare",
      "type": "text",
      "citations": [
        {
          "type": "char_location",
          "document_index": 0,
          "document_title": "Article Title",
          "start_char_index": 1234,
          "end_char_index": 1456,
          "cited_text": "Artificial intelligence is poised to revolutionize healthcare delivery..."
        }
      ]
    }
  ],
  "id": "msg_a930390d3a",
  "usage": {
    "input_tokens": 25039,
    "output_tokens": 931,
    "server_tool_use": {
      "web_fetch_requests": 1
    }
  },
  "stop_reason": "end_turn"
}

Hasil fetch

Hasil fetch mencakup:

  • url: URL yang diambil
  • content: Blok dokumen yang berisi konten yang diambil
  • retrieved_at: Stempel waktu saat konten diambil

Note: Alat web fetch menyimpan hasil dalam cache untuk meningkatkan performa dan mengurangi permintaan yang berulang. Akibatnya, konten yang dikembalikan mungkin tidak selalu mencerminkan versi terbaru yang tersedia di URL tersebut. Perilaku cache dikelola secara otomatis dan dapat berubah seiring waktu untuk mengoptimalkan berbagai jenis konten dan pola penggunaan. Untuk mengambil konten terbaru, atur "use_cache": false (lihat Pelewatan cache).

Untuk dokumen PDF, konten dikembalikan sebagai data berenkode base64:

json
{
  "type": "web_fetch_tool_result",
  "tool_use_id": "srvtoolu_02",
  "content": {
    "type": "web_fetch_result",
    "url": "https://example.com/paper.pdf",
    "content": {
      "type": "document",
      "source": {
        "type": "base64",
        "media_type": "application/pdf",
        "data": "JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmo..."
      },
      "citations": { "enabled": true }
    },
    "retrieved_at": "2025-08-25T10:30:02Z"
  }
}

Error

Ketika alat web fetch mengalami error, Haijun API tetap mengembalikan respons 200 (sukses), dengan error dicantumkan di dalam body respons. Haijun melihat hasil error tersebut dan melanjutkan gilirannya. Contohnya:

json
{
  "type": "web_fetch_tool_result",
  "tool_use_id": "srvtoolu_a93jad",
  "content": {
    "type": "web_fetch_tool_result_error",
    "error_code": "url_not_accessible"
  }
}

Berikut kode error yang mungkin muncul:

  • invalid_tool_input: Input alat tidak valid, misalnya URL yang formatnya salah atau skema selain HTTP(S)
  • url_too_long: URL melebihi panjang maksimum (250 karakter)
  • url_not_allowed: URL diblokir oleh aturan pemfilteran domain (termasuk pengaturan organisasi Anda) atau oleh pembatasan dari sisi Juglow, seperti alamat privat, robots.txt, dan URL yang tampaknya berisi kredensial yang tidak Anda berikan
  • url_not_in_prior_context: URL belum pernah muncul sebelumnya dalam percakapan (lihat Validasi URL)
  • url_not_accessible: Gagal mengambil konten (error HTTP)
  • too_many_requests: "Rate limit" (batas laju) terlampaui
  • unsupported_content_type: Jenis konten tidak didukung (hanya teks, HTML, dan PDF yang didukung)
  • max_uses_exceeded: Jumlah penggunaan maksimum alat web fetch terlampaui
  • unavailable: Terjadi error internal

Validasi URL

Demi keamanan, alat web fetch hanya dapat mengambil URL yang sebelumnya sudah muncul dalam konteks percakapan. Ini mencakup:

  • URL dalam pesan pengguna
  • URL dalam hasil alat sisi klien
  • URL dari hasil web search atau web fetch sebelumnya

Alat ini tidak dapat mengambil URL yang hanya muncul dalam output Haijun sendiri atau hanya dalam prompt sistem. Agar URL dari prompt sistem dapat diambil, sertakan juga URL tersebut dalam pesan pengguna.

Hasil dari alat sisi server lainnya juga bukan sumber yang diizinkan. Contohnya adalah code execution, konektor "Model Context Protocol", atau MCP, dan tool search.

Sebaliknya, hasil alat sisi klien tetap merupakan sumber yang diizinkan, bahkan ketika hasil tersebut mengulang teks yang dihasilkan Haijun. Contohnya adalah perintah yang mencetak input-nya, atau pesan error yang mengutip input tersebut.

Alat ini juga menolak URL yang tampaknya berisi kredensial, seperti kunci API atau kata sandi, kecuali kredensial tersebut muncul dalam prompt sistem atau dalam teks pesan pengguna. Kredensial yang hanya muncul dalam hasil alat tidak diperhitungkan. Dalam kasus ini, hasilnya adalah error url_not_allowed. Untuk mengambil URL semacam itu, sertakan URL tersebut dalam pesan pengguna.

Gabungan pencarian dan fetch

Ketika alat web search dan web fetch sama-sama diaktifkan, dan pengguna menyebutkan halaman atau dokumen tertentu tanpa memberikan URL, Haijun menggunakan web search untuk menemukannya, lalu mengambil hasilnya. Contoh permintaan seperti ini adalah "baca README dari repositori juglows/juglow-sdk-python". Contoh berikut meminta pencarian dan analisis dalam satu permintaan:

bash
  curl https://haijun.my.id/v1/messages \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{
      "model": "haijun-opus-4-8",
      "max_tokens": 4096,
      "messages": [
        {
          "role": "user",
          "content": "Find recent articles about quantum computing and analyze the most relevant one in detail"
        }
      ],
      "tools": [
        {
          "type": "web_search_20250305",
          "name": "web_search",
          "max_uses": 3
        },
        {
          "type": "web_fetch_20250910",
          "name": "web_fetch",
          "max_uses": 5,
          "citations": {"enabled": true}
        }
      ]
    }'
bash
  ant messages create <<'YAML'
  model: haijun-opus-4-8
  max_tokens: 4096
  messages:
    - role: user
      content: >-
        Find recent articles about quantum computing
        and analyze the most relevant one in detail
  tools:
    - type: web_search_20250305
      name: web_search
      max_uses: 3
    - type: web_fetch_20250910
      name: web_fetch
      max_uses: 5
      citations:
        enabled: true
  YAML
python
  client = juglow.Juglow()

  response = client.messages.create(
      model="haijun-opus-4-8",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": "Find recent articles about quantum computing and analyze the most relevant one in detail",
          }
      ],
      tools=[
          {"type": "web_search_20250305", "name": "web_search", "max_uses": 3},
          {
              "type": "web_fetch_20250910",
              "name": "web_fetch",
              "max_uses": 5,
              "citations": {"enabled": True},
          },
      ],
  )
  print(response)
typescript
  const client = new Juglow();

  const response = await client.messages.create({
    model: "haijun-opus-4-8",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content:
          "Find recent articles about quantum computing and analyze the most relevant one in detail"
      }
    ],
    tools: [
      { type: "web_search_20250305", name: "web_search", max_uses: 3 },
      {
        type: "web_fetch_20250910",
        name: "web_fetch",
        max_uses: 5,
        citations: { enabled: true }
      }
    ]
  });

  console.log(response);
csharp
  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Model.HaijunOpus4_8,
      MaxTokens = 4096,
      Messages = [new() { Role = Role.User, Content = "Find recent articles about quantum computing and analyze the most relevant one in detail" }],
      Tools = [
          new ToolUnion(new WebSearchTool20250305() { MaxUses = 3 }),
          new ToolUnion(new WebFetchTool20250910() { MaxUses = 5, Citations = new() { Enabled = true } })
      ]
  };

  var message = await client.Messages.Create(parameters);
  Console.WriteLine(message);
go
  client := juglow.NewClient()

  response, err := client.Messages.New(context.TODO(), juglow.MessageNewParams{
  	Model:     juglow.ModelHaijunOpus4_8,
  	MaxTokens: 4096,
  	Messages: []juglow.MessageParam{
  		juglow.NewUserMessage(juglow.NewTextBlock("Find recent articles about quantum computing and analyze the most relevant one in detail")),
  	},
  	Tools: []juglow.ToolUnionParam{
  		{OfWebSearchTool20250305: &juglow.WebSearchTool20250305Param{
  			MaxUses: juglow.Int(3),
  		}},
  		{OfWebFetchTool20250910: &juglow.WebFetchTool20250910Param{
  			MaxUses:   juglow.Int(5),
  			Citations: juglow.CitationsConfigParam{Enabled: juglow.Bool(true)},
  		}},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response.RawJSON())
java
  import com.juglow.models.messages.CitationsConfigParam;
  // ...
  import com.juglow.models.messages.WebFetchTool20250910;
  import com.juglow.models.messages.WebSearchTool20250305;

  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_4_8)
          .maxTokens(4096L)
          .addUserMessage("Find recent articles about quantum computing and analyze the most relevant one in detail")
          .addTool(WebSearchTool20250305.builder()
              .maxUses(3L)
              .build())
          .addTool(WebFetchTool20250910.builder()
              .maxUses(5L)
              .citations(CitationsConfigParam.builder().enabled(true).build())
              .build())
          .build();

      Message response = client.messages().create(params);
      IO.println(response);
  }
php
  $client = new Client();

  $message = $client->messages->create(
      maxTokens: 4096,
      messages: [
          ['role' => 'user', 'content' => 'Find recent articles about quantum computing and analyze the most relevant one in detail']
      ],
      model: 'haijun-opus-4-8',
      tools: [
          [
              'type' => 'web_search_20250305',
              'name' => 'web_search',
              'max_uses' => 3,
          ],
          [
              'type' => 'web_fetch_20250910',
              'name' => 'web_fetch',
              'max_uses' => 5,
              'citations' => ['enabled' => true],
          ],
      ],
  );
  echo $message;
ruby
  client = Juglow::Client.new

  message = client.messages.create(
    model: "haijun-opus-4-8",
    max_tokens: 4096,
    messages: [
      { role: "user", content: "Find recent articles about quantum computing and analyze the most relevant one in detail" }
    ],
    tools: [
      {
        type: "web_search_20250305",
        name: "web_search",
        max_uses: 3
      },
      {
        type: "web_fetch_20250910",
        name: "web_fetch",
        max_uses: 5,
        citations: { enabled: true }
      }
    ]
  )
  puts message

Dalam alur kerja ini, Haijun:

  1. Menggunakan web search untuk menemukan artikel yang relevan.
  1. Memilih hasil yang paling menjanjikan.
  1. Menggunakan web fetch untuk mengambil konten lengkap.
  1. Memberikan analisis mendetail beserta sitasi.

Caching prompt

Untuk menyimpan definisi alat dalam cache di seluruh giliran, lihat "Tool use" (penggunaan alat) dengan "prompt caching" (caching prompt).

Streaming

Saat streaming diaktifkan, event fetch menjadi bagian dari stream, dengan jeda selama proses pengambilan konten:

sse
event: message_start
data: {"type": "message_start", "message": {"id": "msg_abc123", "type": "message"}}

event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}

// Haijun's decision to fetch

event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "server_tool_use", "id": "srvtoolu_xyz789", "name": "web_fetch"}}

// Fetch URL streamed
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"url\":\"https://example.com/article\"}"}}

// Pause while fetch executes

// Fetch results streamed
event: content_block_start
data: {"type": "content_block_start", "index": 2, "content_block": {"type": "web_fetch_tool_result", "tool_use_id": "srvtoolu_xyz789", "content": {"type": "web_fetch_result", "url": "https://example.com/article", "content": {"type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "Article content..."}}}}}

// Haijun's response continues...

Permintaan batch

Anda dapat menyertakan alat web fetch dalam Messages Batches API. Harga panggilan alat web fetch melalui Messages Batches API sama dengan harga panggilan dalam permintaan Messages API biasa.

Penggunaan dan harga

Penggunaan web fetch tidak dikenakan biaya tambahan di luar biaya token standar:

json
{
  "usage": {
    "input_tokens": 25039,
    "output_tokens": 931,
    "cache_read_input_tokens": 0,
    "cache_creation_input_tokens": 0,
    "server_tool_use": {
      "web_fetch_requests": 1
    }
  }
}

Alat web fetch tersedia di Haijun API tanpa biaya tambahan. Anda hanya membayar biaya token standar untuk konten yang diambil yang menjadi bagian dari konteks percakapan Anda.

Untuk melindungi dari pengambilan konten besar secara tidak sengaja yang akan menghabiskan token secara berlebihan, gunakan parameter max_content_tokens untuk menetapkan batas yang sesuai berdasarkan kasus penggunaan dan pertimbangan anggaran Anda.

Contoh penggunaan token untuk konten umum:

  • Halaman web rata-rata (10 kB): \~2.500 token
  • Halaman dokumentasi besar (100 kB): \~25.000 token
  • PDF makalah penelitian (500 kB): \~125.000 token

Langkah selanjutnya

Jalankan kode Python dan bash dalam container sandbox untuk menganalisis data, menghasilkan file, dan menyempurnakan solusi secara iteratif.

Bekerja dengan alat yang dieksekusi oleh Juglow: blok server\_tool\_use, kelanjutan pause\_turn, dan pemfilteran domain.

Direktori alat yang disediakan Juglow dan referensi untuk properti opsional definisi alat.

On this page
Cara kerja web fetchKapan Haijun melakukan fetchPemfilteran dinamisCara menggunakan web fetchDefinisi alatPenggunaan maksimumPemfilteran domainBatas kontenPelewatan cachePenyertaan responsSitasiResponsHasil fetchErrorValidasi URLGabungan pencarian dan fetchCaching promptStreamingPermintaan batchPenggunaan dan hargaLangkah selanjutnya