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.

Ikhtisar

Note: Untuk sebagian besar kasus penggunaan, kompaksi sisi server adalah strategi utama untuk mengelola konteks dalam percakapan yang berjalan lama. Strategi di halaman ini berguna untuk skenario tertentu di mana Anda memerlukan kontrol yang lebih terperinci atas konten apa yang dibersihkan.

"Context editing" (pengeditan konteks) memungkinkan Anda membersihkan konten tertentu secara selektif dari riwayat percakapan seiring pertumbuhannya. Selain mengoptimalkan biaya dan tetap berada dalam batas, ini adalah tentang mengkurasi secara aktif apa yang dilihat Haijun: konteks adalah sumber daya terbatas dengan hasil yang semakin berkurang, dan konten yang tidak relevan menurunkan fokus model. Pengeditan konteks memberi Anda kontrol runtime yang terperinci atas kurasi tersebut. Untuk prinsip yang lebih luas di balik manajemen konteks, lihat Rekayasa konteks yang efektif. Halaman ini mencakup:

  • Pembersihan hasil alat - Paling cocok untuk alur kerja agentik dengan penggunaan alat yang intensif di mana hasil alat lama tidak lagi diperlukan
  • Pembersihan blok thinking - Untuk mengelola blok thinking saat menggunakan "extended thinking" (pemikiran diperpanjang), dengan opsi untuk mempertahankan thinking terbaru demi kesinambungan konteks
  • Kompaksi SDK sisi klien - Alternatif berbasis SDK untuk manajemen konteks berbasis ringkasan (kompaksi sisi server umumnya lebih disarankan)
PendekatanTempat berjalanStrategiCara kerjanya
Sisi serverAPIPembersihan hasil alat (clear_tool_uses_20250919) Pembersihan blok thinking (clear_thinking_20251015)Diterapkan sebelum prompt mencapai Haijun. Membersihkan konten tertentu dari riwayat percakapan. Setiap strategi dapat dikonfigurasi secara independen.
Sisi klienSDKKompaksiTersedia di SDK TypeScript dan Ruby saat menggunakan tool_runner. Menghasilkan ringkasan dan menggantikan seluruh riwayat percakapan. Lihat Kompaksi sisi klien.

Strategi sisi server

Note: Pengeditan konteks berada dalam versi beta dengan dukungan untuk pembersihan hasil alat dan pembersihan blok thinking. Untuk mengaktifkannya, gunakan header beta context-management-2025-06-27 dalam permintaan API Anda. Bagikan masukan tentang fitur ini melalui formulir masukan.

Pembersihan hasil alat

Strategi clear_tool_uses_20250919 membersihkan hasil alat ketika konteks percakapan tumbuh melampaui ambang batas yang Anda konfigurasi. Ini sangat berguna untuk alur kerja agentik dengan "tool use" (penggunaan alat) yang intensif. Hasil alat yang lebih lama (seperti isi file atau hasil pencarian) tidak lagi diperlukan setelah Haijun memprosesnya.

Saat diaktifkan, API secara otomatis membersihkan hasil alat terlama dalam urutan kronologis. API mengganti setiap hasil yang dibersihkan dengan teks placeholder yang menunjukkan kepada Haijun bahwa hasil tersebut telah dihapus. Secara default, hanya hasil alat yang dibersihkan. Anda dapat secara opsional membersihkan hasil alat dan panggilan alat (parameter penggunaan alat) dengan mengatur clear_tool_inputs ke true.

Pembersihan blok thinking

Strategi clear_thinking_20251015 mengelola blok thinking dalam percakapan ketika pemikiran diperpanjang diaktifkan. Strategi ini memberi Anda kontrol atas pelestarian thinking: Anda dapat memilih untuk menyimpan lebih banyak blok thinking guna mempertahankan kesinambungan penalaran, atau membersihkannya secara lebih agresif untuk menghemat ruang konteks.

Tip: Perilaku default: Default bervariasi menurut kelas model. | Kelas model | Simpan semua thinking sebelumnya | Simpan hanya thinking giliran terakhir | | ---------------- | ------------------------------------- | -------------------------------------- | | Opus | Haijun Opus 4.5 dan yang lebih baru | Haijun Opus 4.1 dan yang lebih lama | | Sonnet | Haijun Sonnet 4.6 dan yang lebih baru | Haijun Sonnet 4.5 dan yang lebih lama | | Haiku | (tidak ada) | Semua model hingga Haijun Haiku 4.5 | | Fable dan Mythos | Semua model | (tidak ada) | Gunakan strategi ini untuk menimpa default. Jika kode Anda berjalan di beberapa tingkatan model, atur keep secara eksplisit daripada mengandalkan default per model.

Satu giliran percakapan asisten dapat mencakup beberapa blok konten (misalnya, saat menggunakan alat) dan beberapa blok thinking (misalnya, dengan interleaved thinking).

Pengeditan konteks terjadi di sisi server

Pengeditan konteks diterapkan di sisi server sebelum prompt mencapai Haijun. Aplikasi klien Anda mempertahankan riwayat percakapan lengkap yang tidak dimodifikasi. Anda tidak perlu menyinkronkan status klien Anda dengan versi yang telah diedit. Lanjutkan mengelola riwayat percakapan lengkap Anda secara lokal seperti biasa.

Pada Haijun Fable 5.1 dan Haijun Opus 5.5, manajemen konteks sisi server tidak pernah membatalkan validitas blok pemikiran. Pengeditan sisi klien pada giliran sebelumnya dapat membatalkan validitas blok pemikiran di setiap giliran asisten berikutnya. Untuk akun baru yang dibuat pada atau setelah 31 Agustus 2026, permintaan yang memutar ulang blok yang tidak valid akan ditolak kecuali Anda memilih untuk membuangnya. Lihat Menjaga prefiks tetap tidak berubah.

Pengeditan konteks dan caching prompt

Interaksi pengeditan konteks dengan "prompt caching" (caching prompt) bervariasi menurut strategi:

  • Pembersihan hasil alat: Membatalkan validitas prefiks prompt yang di-cache ketika konten dibersihkan. Untuk mengantisipasi hal ini, bersihkan token yang cukup agar pembatalan cache sepadan. Gunakan parameter clear_at_least untuk memastikan jumlah minimum token dibersihkan setiap kali. Anda akan dikenai biaya penulisan cache setiap kali konten dibersihkan, tetapi permintaan berikutnya dapat menggunakan kembali prefiks yang baru di-cache.
  • Pembersihan blok thinking: Ketika blok thinking disimpan dalam konteks (tidak dibersihkan), cache prompt dipertahankan, memungkinkan cache hit dan mengurangi biaya token input. Ketika blok thinking dibersihkan, cache dibatalkan validitasnya pada titik di mana pembersihan terjadi. Konfigurasikan parameter keep berdasarkan apakah Anda ingin memprioritaskan kinerja cache atau ketersediaan "context window" (jendela konteks).

Model yang didukung

Pengeditan konteks tersedia di semua model Haijun yang didukung.

Penggunaan pembersihan hasil alat

Cara paling sederhana untuk mengaktifkan pembersihan hasil alat adalah dengan hanya menentukan tipe strategi. Semua opsi konfigurasi lainnya menggunakan nilai defaultnya:

bash
  curl https://haijun.my.id/v1/messages \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "max_tokens": 4096,
          "messages": [
              {
                  "role": "user",
                  "content": "Search for recent developments in AI"
              }
          ],
          "tools": [
              {
                  "type": "web_search_20250305",
                  "name": "web_search"
              }
          ],
          "context_management": {
              "edits": [
                  {"type": "clear_tool_uses_20250919"}
              ]
          }
      }'
bash
  ant beta:messages create --beta context-management-2025-06-27 <<'YAML'
  model: haijun-opus-5-5
  max_tokens: 4096
  messages:
    - role: user
      content: Search for recent developments in AI
  tools:
    - type: web_search_20250305
      name: web_search
  context_management:
    edits:
      - type: clear_tool_uses_20250919
  YAML
python
  response = client.beta.messages.create(
      model="haijun-opus-5-5",
      max_tokens=4096,
      messages=[{"role": "user", "content": "Search for recent developments in AI"}],
      tools=[{"type": "web_search_20250305", "name": "web_search"}],
      betas=["context-management-2025-06-27"],
      context_management={"edits": [{"type": "clear_tool_uses_20250919"}]},
  )
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.create({
    model: "haijun-opus-5-5",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Search for recent developments in AI"
      }
    ],
    tools: [
      {
        type: "web_search_20250305",
        name: "web_search"
      }
    ],
    context_management: {
      edits: [{ type: "clear_tool_uses_20250919" }]
    },
    betas: ["context-management-2025-06-27"]
  });
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      MaxTokens = 4096,
      Messages = [
          new() { Role = Role.User, Content = "Search for recent developments in AI" }
      ],
      Tools = [
          new BetaWebSearchTool20250305()
      ],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [new BetaClearToolUses20250919Edit()]
      },
      Betas = [JuglowBeta.ContextManagement2025_06_27]
  };

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

  response, err := client.Beta.Messages.New(context.TODO(), juglow.BetaMessageNewParams{
  	Model:     juglow.ModelHaijunOpus5_5,
  	MaxTokens: 4096,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Search for recent developments in AI")),
  	},
  	Tools: []juglow.BetaToolUnionParam{
  		{OfWebSearchTool20250305: &juglow.BetaWebSearchTool20250305Param{}},
  	},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearToolUses20250919: &juglow.BetaClearToolUses20250919EditParam{}},
  		},
  	},
  	Betas: []juglow.JuglowBeta{
  		juglow.JuglowBetaContextManagement2025_06_27,
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response)
java
  import com.juglow.models.beta.messages.BetaWebSearchTool20250305;
  import com.juglow.models.beta.messages.BetaContextManagementConfig;
  import com.juglow.models.beta.messages.BetaClearToolUses20250919Edit;
  import com.juglow.models.beta.JuglowBeta;
  // ...
  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_5_5)
          .maxTokens(4096L)
          .addUserMessage("Search for recent developments in AI")
          .addTool(BetaWebSearchTool20250305.builder().build())
          .contextManagement(BetaContextManagementConfig.builder()
              .addEdit(BetaClearToolUses20250919Edit.builder().build())
              .build())
          .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
          .build();

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

  $response = $client->beta->messages->create(
      maxTokens: 4096,
      messages: [
          ['role' => 'user', 'content' => 'Search for recent developments in AI']
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      tools: [
          ['type' => 'web_search_20250305', 'name' => 'web_search']
      ],
      contextManagement: [
          'edits' => [
              ['type' => 'clear_tool_uses_20250919']
          ]
      ],
  );

  echo $response;
ruby
  client = Juglow::Client.new

  response = client.beta.messages.create(
    model: "haijun-opus-5-5",
    max_tokens: 4096,
    messages: [
      { role: "user", content: "Search for recent developments in AI" }
    ],
    tools: [
      { type: "web_search_20250305", name: "web_search" }
    ],
    context_management: {
      edits: [
        { type: "clear_tool_uses_20250919" }
      ]
    },
    betas: ["context-management-2025-06-27"]
  )
  puts response

Konfigurasi lanjutan

Anda dapat menyesuaikan perilaku pembersihan hasil alat dengan parameter tambahan:

bash
  curl https://haijun.my.id/v1/messages \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "max_tokens": 4096,
          "messages": [
              {
                  "role": "user",
                  "content": "Create a simple command line calculator app using Python"
              }
          ],
          "tools": [
              {
                  "type": "text_editor_20250728",
                  "name": "str_replace_based_edit_tool",
                  "max_characters": 10000
              },
              {
                  "type": "web_search_20250305",
                  "name": "web_search",
                  "max_uses": 3
              }
          ],
          "context_management": {
              "edits": [
                  {
                      "type": "clear_tool_uses_20250919",
                      "trigger": {
                          "type": "input_tokens",
                          "value": 30000
                      },
                      "keep": {
                          "type": "tool_uses",
                          "value": 3
                      },
                      "clear_at_least": {
                          "type": "input_tokens",
                          "value": 5000
                      },
                      "exclude_tools": ["web_search"]
                  }
              ]
          }
      }'
bash
  ant beta:messages create --beta context-management-2025-06-27 <<'YAML'
  model: haijun-opus-5-5
  max_tokens: 4096
  messages:
    - role: user
      content: Create a simple command line calculator app using Python
  tools:
    - type: text_editor_20250728
      name: str_replace_based_edit_tool
      max_characters: 10000
    - type: web_search_20250305
      name: web_search
      max_uses: 3
  context_management:
    edits:
      - type: clear_tool_uses_20250919
        trigger:
          type: input_tokens
          value: 30000
        keep:
          type: tool_uses
          value: 3
        clear_at_least:
          type: input_tokens
          value: 5000
        exclude_tools:
          - web_search
  YAML
python
  response = client.beta.messages.create(
      model="haijun-opus-5-5",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": "Create a simple command line calculator app using Python",
          }
      ],
      tools=[
          {
              "type": "text_editor_20250728",
              "name": "str_replace_based_edit_tool",
              "max_characters": 10000,
          },
          {"type": "web_search_20250305", "name": "web_search", "max_uses": 3},
      ],
      betas=["context-management-2025-06-27"],
      context_management={
          "edits": [
              {
                  "type": "clear_tool_uses_20250919",
                  # Picu pembersihan saat ambang batas terlampaui
                  "trigger": {"type": "input_tokens", "value": 30000},
                  # Jumlah penggunaan alat yang dipertahankan setelah pembersihan
                  "keep": {"type": "tool_uses", "value": 3},
                  # Opsional: Bersihkan setidaknya sebanyak token ini
                  "clear_at_least": {"type": "input_tokens", "value": 5000},
                  # Kecualikan alat-alat ini dari pembersihan
                  "exclude_tools": ["web_search"],
              }
          ]
      },
  )
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.create({
    model: "haijun-opus-5-5",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Create a simple command line calculator app using Python"
      }
    ],
    tools: [
      {
        type: "text_editor_20250728",
        name: "str_replace_based_edit_tool",
        max_characters: 10000
      },
      {
        type: "web_search_20250305",
        name: "web_search",
        max_uses: 3
      }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_tool_uses_20250919",
          // Picu pembersihan saat ambang batas terlampaui
          trigger: {
            type: "input_tokens",
            value: 30000
          },
          // Jumlah penggunaan alat yang dipertahankan setelah pembersihan
          keep: {
            type: "tool_uses",
            value: 3
          },
          // Opsional: Bersihkan setidaknya sebanyak token ini
          clear_at_least: {
            type: "input_tokens",
            value: 5000
          },
          // Kecualikan alat-alat ini dari pembersihan
          exclude_tools: ["web_search"]
        }
      ]
    }
  });
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      MaxTokens = 4096,
      Messages = [
          new() { Role = Role.User, Content = "Create a simple command line calculator app using Python" }
      ],
      Tools = [
          new BetaToolTextEditor20250728 { MaxCharacters = 10000 },
          new BetaWebSearchTool20250305 { MaxUses = 3 }
      ],
      Betas = [JuglowBeta.ContextManagement2025_06_27],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [
              new BetaClearToolUses20250919Edit
              {
                  Trigger = new BetaInputTokensTrigger(30000),
                  Keep = new BetaToolUsesKeep(3),
                  ClearAtLeast = new BetaInputTokensClearAtLeast(5000),
                  ExcludeTools = ["web_search"]
              }
          ]
      }
  };

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

  response, err := client.Beta.Messages.New(context.TODO(), juglow.BetaMessageNewParams{
  	Model:     juglow.ModelHaijunOpus5_5,
  	MaxTokens: 4096,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Create a simple command line calculator app using Python")),
  	},
  	Tools: []juglow.BetaToolUnionParam{
  		{OfTextEditor20250728: &juglow.BetaToolTextEditor20250728Param{
  			MaxCharacters: juglow.Int(10000),
  		}},
  		{OfWebSearchTool20250305: &juglow.BetaWebSearchTool20250305Param{
  			MaxUses: juglow.Int(3),
  		}},
  	},
  	Betas: []juglow.JuglowBeta{juglow.JuglowBetaContextManagement2025_06_27},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearToolUses20250919: &juglow.BetaClearToolUses20250919EditParam{
  				Trigger: juglow.BetaClearToolUses20250919EditTriggerUnionParam{
  					OfInputTokens: &juglow.BetaInputTokensTriggerParam{
  						Value: 30000,
  					},
  				},
  				Keep: juglow.BetaToolUsesKeepParam{
  					Value: 3,
  				},
  				ClearAtLeast: juglow.BetaInputTokensClearAtLeastParam{
  					Value: 5000,
  				},
  				ExcludeTools: []string{"web_search"},
  			}},
  		},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response)
java
  import com.juglow.models.beta.messages.BetaToolTextEditor20250728;
  import com.juglow.models.beta.messages.BetaWebSearchTool20250305;
  import com.juglow.models.beta.messages.BetaContextManagementConfig;
  import com.juglow.models.beta.messages.BetaClearToolUses20250919Edit;
  import com.juglow.models.beta.messages.BetaInputTokensTrigger;
  import com.juglow.models.beta.messages.BetaInputTokensClearAtLeast;
  import com.juglow.models.beta.messages.BetaToolUsesKeep;
  import com.juglow.models.beta.JuglowBeta;
  // ...
  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_5_5)
          .maxTokens(4096L)
          .addUserMessage("Create a simple command line calculator app using Python")
          .addTool(BetaToolTextEditor20250728.builder()
              .maxCharacters(10000L)
              .build())
          .addTool(BetaWebSearchTool20250305.builder()
              .maxUses(3L)
              .build())
          .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
          .contextManagement(BetaContextManagementConfig.builder()
              .addEdit(BetaClearToolUses20250919Edit.builder()
                  .trigger(BetaInputTokensTrigger.builder()
                      .value(30000L)
                      .build())
                  .keep(BetaToolUsesKeep.builder()
                      .value(3L)
                      .build())
                  .clearAtLeast(BetaInputTokensClearAtLeast.builder()
                      .value(5000L)
                      .build())
                  .addExcludeTool("web_search")
                  .build())
              .build())
          .build();

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

  $response = $client->beta->messages->create(
      maxTokens: 4096,
      messages: [
          [
              'role' => 'user',
              'content' => 'Create a simple command line calculator app using Python'
          ]
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      tools: [
          [
              'type' => 'text_editor_20250728',
              'name' => 'str_replace_based_edit_tool',
              'max_characters' => 10000
          ],
          [
              'type' => 'web_search_20250305',
              'name' => 'web_search',
              'max_uses' => 3
          ]
      ],
      contextManagement: [
          'edits' => [
              [
                  'type' => 'clear_tool_uses_20250919',
                  'trigger' => [
                      'type' => 'input_tokens',
                      'value' => 30000
                  ],
                  'keep' => [
                      'type' => 'tool_uses',
                      'value' => 3
                  ],
                  'clear_at_least' => [
                      'type' => 'input_tokens',
                      'value' => 5000
                  ],
                  'exclude_tools' => ['web_search']
              ]
          ]
      ],
  );

  echo $response;
ruby
  client = Juglow::Client.new

  response = client.beta.messages.create(
    model: "haijun-opus-5-5",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Create a simple command line calculator app using Python"
      }
    ],
    tools: [
      {
        type: "text_editor_20250728",
        name: "str_replace_based_edit_tool",
        max_characters: 10000
      },
      {
        type: "web_search_20250305",
        name: "web_search",
        max_uses: 3
      }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_tool_uses_20250919",
          trigger: {
            type: "input_tokens",
            value: 30000
          },
          keep: {
            type: "tool_uses",
            value: 3
          },
          clear_at_least: {
            type: "input_tokens",
            value: 5000
          },
          exclude_tools: ["web_search"]
        }
      ]
    }
  )
  puts response

Penggunaan pembersihan blok thinking

Aktifkan pembersihan blok thinking untuk mengelola konteks dan caching prompt secara efektif ketika pemikiran diperpanjang diaktifkan:

bash
  curl https://haijun.my.id/v1/messages \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "max_tokens": 16000,
          "messages": [{"role": "user", "content": "Hello"}],
          "context_management": {
              "edits": [
                  {
                      "type": "clear_thinking_20251015",
                      "keep": {
                          "type": "thinking_turns",
                          "value": 2
                      }
                  }
              ]
          }
      }'
bash
  ant beta:messages create --beta context-management-2025-06-27 <<'YAML'
  model: haijun-opus-5-5
  max_tokens: 16000
  messages:
    - role: user
      content: Hello
  context_management:
    edits:
      - type: clear_thinking_20251015
        keep:
          type: thinking_turns
          value: 2
  YAML
python
  response = client.beta.messages.create(
      model="haijun-opus-5-5",
      max_tokens=16000,
      messages=[{"role": "user", "content": "Hello"}],
      betas=["context-management-2025-06-27"],
      context_management={
          "edits": [
              {
                  "type": "clear_thinking_20251015",
                  "keep": {"type": "thinking_turns", "value": 2},
              }
          ]
      },
  )
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.create({
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [{ role: "user", content: "Hello" }],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: {
            type: "thinking_turns",
            value: 2
          }
        }
      ]
    }
  });
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      MaxTokens = 16000,
      Messages = [
          new() { Role = Role.User, Content = "Hello" }
      ],
      Betas = [JuglowBeta.ContextManagement2025_06_27],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [
              new BetaClearThinking20251015Edit
              {
                  Keep = new BetaThinkingTurns(2)
              }
          ]
      }
  };

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

  response, err := client.Beta.Messages.New(context.TODO(), juglow.BetaMessageNewParams{
  	Model:     juglow.ModelHaijunOpus5_5,
  	MaxTokens: 16000,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Hello")),
  	},
  	Betas: []juglow.JuglowBeta{juglow.JuglowBetaContextManagement2025_06_27},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearThinking20251015: &juglow.BetaClearThinking20251015EditParam{
  				Keep: juglow.BetaClearThinking20251015EditKeepUnionParam{
  					OfThinkingTurns: &juglow.BetaThinkingTurnsParam{
  						Value: 2,
  					},
  				},
  			}},
  		},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response)
java
  import com.juglow.models.beta.messages.BetaContextManagementConfig;
  import com.juglow.models.beta.messages.BetaClearThinking20251015Edit;
  import com.juglow.models.beta.messages.BetaThinkingTurns;
  import com.juglow.models.beta.JuglowBeta;
  // ...
  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_5_5)
          .maxTokens(16000L)
          .addUserMessage("Hello")
          .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
          .contextManagement(BetaContextManagementConfig.builder()
              .addEdit(BetaClearThinking20251015Edit.builder()
                  .keep(BetaThinkingTurns.builder()
                      .value(2L)
                      .build())
                  .build())
              .build())
          .build();

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

  $response = $client->beta->messages->create(
      maxTokens: 16000,
      messages: [
          ['role' => 'user', 'content' => 'Hello']
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      contextManagement: [
          'edits' => [
              [
                  'type' => 'clear_thinking_20251015',
                  'keep' => [
                      'type' => 'thinking_turns',
                      'value' => 2
                  ]
              ]
          ]
      ],
  );

  echo $response;
ruby
  client = Juglow::Client.new

  response = client.beta.messages.create(
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [{ role: "user", content: "Hello" }],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: {
            type: "thinking_turns",
            value: 2
          }
        }
      ]
    }
  )
  puts response

Opsi konfigurasi untuk pembersihan blok thinking

Strategi clear_thinking_20251015 mendukung konfigurasi berikut:

Opsi konfigurasiDefaultDeskripsi
keepSpesifik per modelMenentukan berapa banyak giliran asisten terbaru dengan blok thinking yang dipertahankan. Gunakan {type: "thinking_turns", value: N} di mana N harus > 0 untuk menyimpan N giliran terakhir, atau "all" untuk menyimpan semua blok thinking. Opus 4.5+ dan Sonnet 4.6+: semua giliran. Model Fable dan Mythos: semua giliran. Opus/Sonnet yang lebih lama dan semua Haiku: hanya giliran terakhir.

Contoh konfigurasi:

Simpan blok thinking dari 3 giliran asisten terakhir:

bash
  curl https://haijun.my.id/v1/messages \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "max_tokens": 16000,
          "messages": [{"role": "user", "content": "Hello"}],
          "context_management": {
              "edits": [
                  {
                      "type": "clear_thinking_20251015",
                      "keep": {
                          "type": "thinking_turns",
                          "value": 3
                      }
                  }
              ]
          }
      }'
bash
  ant beta:messages create --beta context-management-2025-06-27 <<'YAML'
  model: haijun-opus-5-5
  max_tokens: 16000
  messages:
    - role: user
      content: Hello
  context_management:
    edits:
      - type: clear_thinking_20251015
        keep:
          type: thinking_turns
          value: 3
  YAML
python
  response = client.beta.messages.create(
      model="haijun-opus-5-5",
      max_tokens=16000,
      messages=[{"role": "user", "content": "Hello"}],
      betas=["context-management-2025-06-27"],
      context_management={
          "edits": [
              {
                  "type": "clear_thinking_20251015",
                  "keep": {"type": "thinking_turns", "value": 3},
              }
          ]
      },
  )
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.create({
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [{ role: "user", content: "Hello" }],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: {
            type: "thinking_turns",
            value: 3
          }
        }
      ]
    }
  });
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      MaxTokens = 16000,
      Messages = [
          new() { Role = Role.User, Content = "Hello" }
      ],
      Betas = [JuglowBeta.ContextManagement2025_06_27],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [
              new BetaClearThinking20251015Edit
              {
                  Keep = new BetaThinkingTurns(3)
              }
          ]
      }
  };

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

  response, err := client.Beta.Messages.New(context.TODO(), juglow.BetaMessageNewParams{
  	Model:     juglow.ModelHaijunOpus5_5,
  	MaxTokens: 16000,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Hello")),
  	},
  	Betas: []juglow.JuglowBeta{juglow.JuglowBetaContextManagement2025_06_27},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearThinking20251015: &juglow.BetaClearThinking20251015EditParam{
  				Keep: juglow.BetaClearThinking20251015EditKeepUnionParam{
  					OfThinkingTurns: &juglow.BetaThinkingTurnsParam{
  						Value: 3,
  					},
  				},
  			}},
  		},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response)
java
  JuglowClient client = JuglowOkHttpClient.fromEnv();

  MessageCreateParams params = MessageCreateParams.builder()
      .model(Model.HAIJUN_OPUS_5_5)
      .maxTokens(16000L)
      .addUserMessage("Hello")
      .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
      .contextManagement(BetaContextManagementConfig.builder()
          .addEdit(BetaClearThinking20251015Edit.builder()
              .keep(BetaThinkingTurns.builder()
                  .value(3L)
                  .build())
              .build())
          .build())
      .build();

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

  $response = $client->beta->messages->create(
      maxTokens: 16000,
      messages: [
          ['role' => 'user', 'content' => 'Hello']
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      contextManagement: [
          'edits' => [
              [
                  'type' => 'clear_thinking_20251015',
                  'keep' => [
                      'type' => 'thinking_turns',
                      'value' => 3
                  ]
              ]
          ]
      ],
  );

  echo $response;
ruby
  client = Juglow::Client.new

  response = client.beta.messages.create(
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [{ role: "user", content: "Hello" }],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: {
            type: "thinking_turns",
            value: 3
          }
        }
      ]
    }
  )
  puts response

Simpan semua blok thinking (memaksimalkan cache hit):

bash
  curl https://haijun.my.id/v1/messages \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "max_tokens": 16000,
          "messages": [{"role": "user", "content": "Hello"}],
          "context_management": {
              "edits": [
                  {
                      "type": "clear_thinking_20251015",
                      "keep": "all"
                  }
              ]
          }
      }'
bash
  ant beta:messages create --beta context-management-2025-06-27 <<'YAML'
  model: haijun-opus-5-5
  max_tokens: 16000
  messages:
    - role: user
      content: Hello
  context_management:
    edits:
      - type: clear_thinking_20251015
        keep: all
  YAML
python
  response = client.beta.messages.create(
      model="haijun-opus-5-5",
      max_tokens=16000,
      messages=[{"role": "user", "content": "Hello"}],
      betas=["context-management-2025-06-27"],
      context_management={
          "edits": [
              {
                  "type": "clear_thinking_20251015",
                  "keep": "all",
              }
          ]
      },
  )
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.create({
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [{ role: "user", content: "Hello" }],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: "all"
        }
      ]
    }
  });
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      MaxTokens = 16000,
      Messages = [
          new() { Role = Role.User, Content = "Hello" }
      ],
      Betas = [JuglowBeta.ContextManagement2025_06_27],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [
              new BetaClearThinking20251015Edit
              {
                  Keep = new All()
              }
          ]
      }
  };

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

  response, err := client.Beta.Messages.New(context.TODO(), juglow.BetaMessageNewParams{
  	Model:     juglow.ModelHaijunOpus5_5,
  	MaxTokens: 16000,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Hello")),
  	},
  	Betas: []juglow.JuglowBeta{juglow.JuglowBetaContextManagement2025_06_27},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearThinking20251015: &juglow.BetaClearThinking20251015EditParam{
  				Keep: juglow.BetaClearThinking20251015EditKeepUnionParam{
  					OfAll: constant.ValueOf[constant.All](),
  				},
  			}},
  		},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response)
java
  JuglowClient client = JuglowOkHttpClient.fromEnv();

  MessageCreateParams params = MessageCreateParams.builder()
      .model(Model.HAIJUN_OPUS_5_5)
      .maxTokens(16000L)
      .addUserMessage("Hello")
      .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
      .contextManagement(BetaContextManagementConfig.builder()
          .addEdit(BetaClearThinking20251015Edit.builder()
              .keepAll()
              .build())
          .build())
      .build();

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

  $response = $client->beta->messages->create(
      maxTokens: 16000,
      messages: [
          ['role' => 'user', 'content' => 'Hello']
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      contextManagement: [
          'edits' => [
              [
                  'type' => 'clear_thinking_20251015',
                  'keep' => 'all'
              ]
          ]
      ],
  );

  echo $response;
ruby
  client = Juglow::Client.new

  response = client.beta.messages.create(
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [{ role: "user", content: "Hello" }],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: "all"
        }
      ]
    }
  )
  puts response

Menggabungkan strategi

Anda dapat menggunakan pembersihan blok thinking dan pembersihan hasil alat secara bersamaan:

Note: Saat menggunakan beberapa strategi, strategi clear_thinking_20251015 harus dicantumkan terlebih dahulu dalam array edits.

bash
  curl https://haijun.my.id/v1/messages \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "max_tokens": 16000,
          "messages": [
              {
                  "role": "user",
                  "content": "Search for the latest developments in quantum error correction and summarize the key breakthroughs."
              }
          ],
          "tools": [
              {
                  "type": "web_search_20250305",
                  "name": "web_search",
                  "max_uses": 5
              }
          ],
          "context_management": {
              "edits": [
                  {
                      "type": "clear_thinking_20251015",
                      "keep": {
                          "type": "thinking_turns",
                          "value": 2
                      }
                  },
                  {
                      "type": "clear_tool_uses_20250919",
                      "trigger": {
                          "type": "input_tokens",
                          "value": 50000
                      },
                      "keep": {
                          "type": "tool_uses",
                          "value": 5
                      }
                  }
              ]
          }
      }'
bash
  ant beta:messages create --beta context-management-2025-06-27 <<'YAML'
  model: haijun-opus-5-5
  max_tokens: 16000
  messages:
    - role: user
      content: Search for the latest developments in quantum error correction and summarize the key breakthroughs.
  tools:
    - type: web_search_20250305
      name: web_search
      max_uses: 5
  context_management:
    edits:
      - type: clear_thinking_20251015
        keep:
          type: thinking_turns
          value: 2
      - type: clear_tool_uses_20250919
        trigger:
          type: input_tokens
          value: 50000
        keep:
          type: tool_uses
          value: 5
  YAML
python
  response = client.beta.messages.create(
      model="haijun-opus-5-5",
      max_tokens=16000,
      messages=[
          {
              "role": "user",
              "content": "Search for the latest developments in quantum error correction and summarize the key breakthroughs.",
          }
      ],
      tools=[
          {
              "type": "web_search_20250305",
              "name": "web_search",
              "max_uses": 5,
          }
      ],
      betas=["context-management-2025-06-27"],
      context_management={
          "edits": [
              {
                  "type": "clear_thinking_20251015",
                  "keep": {"type": "thinking_turns", "value": 2},
              },
              {
                  "type": "clear_tool_uses_20250919",
                  "trigger": {"type": "input_tokens", "value": 50000},
                  "keep": {"type": "tool_uses", "value": 5},
              },
          ]
      },
  )

  print(response)
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.create({
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [
      {
        role: "user",
        content:
          "Search for the latest developments in quantum error correction and summarize the key breakthroughs."
      }
    ],
    tools: [
      {
        type: "web_search_20250305",
        name: "web_search",
        max_uses: 5
      }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: {
            type: "thinking_turns",
            value: 2
          }
        },
        {
          type: "clear_tool_uses_20250919",
          trigger: {
            type: "input_tokens",
            value: 50000
          },
          keep: {
            type: "tool_uses",
            value: 5
          }
        }
      ]
    }
  });

  console.log(response);
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      MaxTokens = 16000,
      Messages = [
          new() { Role = Role.User, Content = "Search for the latest developments in quantum error correction and summarize the key breakthroughs." }
      ],
      Tools = [
          new BetaWebSearchTool20250305 { MaxUses = 5 }
      ],
      Betas = [JuglowBeta.ContextManagement2025_06_27],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [
              new BetaClearThinking20251015Edit
              {
                  Keep = new BetaThinkingTurns(2)
              },
              new BetaClearToolUses20250919Edit
              {
                  Trigger = new BetaInputTokensTrigger(50000),
                  Keep = new BetaToolUsesKeep(5)
              }
          ]
      }
  };

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

  response, err := client.Beta.Messages.New(context.TODO(), juglow.BetaMessageNewParams{
  	Model:     juglow.ModelHaijunOpus5_5,
  	MaxTokens: 16000,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Search for the latest developments in quantum error correction and summarize the key breakthroughs.")),
  	},
  	Tools: []juglow.BetaToolUnionParam{
  		{OfWebSearchTool20250305: &juglow.BetaWebSearchTool20250305Param{
  			MaxUses: juglow.Int(5),
  		}},
  	},
  	Betas: []juglow.JuglowBeta{
  		juglow.JuglowBetaContextManagement2025_06_27,
  	},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearThinking20251015: &juglow.BetaClearThinking20251015EditParam{
  				Keep: juglow.BetaClearThinking20251015EditKeepUnionParam{
  					OfThinkingTurns: &juglow.BetaThinkingTurnsParam{
  						Value: 2,
  					},
  				},
  			}},
  			{OfClearToolUses20250919: &juglow.BetaClearToolUses20250919EditParam{
  				Trigger: juglow.BetaClearToolUses20250919EditTriggerUnionParam{
  					OfInputTokens: &juglow.BetaInputTokensTriggerParam{
  						Value: 50000,
  					},
  				},
  				Keep: juglow.BetaToolUsesKeepParam{
  					Value: 5,
  				},
  			}},
  		},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response)
java
  import com.juglow.models.beta.messages.BetaWebSearchTool20250305;
  import com.juglow.models.beta.messages.BetaContextManagementConfig;
  import com.juglow.models.beta.messages.BetaClearThinking20251015Edit;
  import com.juglow.models.beta.messages.BetaClearToolUses20250919Edit;
  import com.juglow.models.beta.messages.BetaThinkingTurns;
  import com.juglow.models.beta.messages.BetaInputTokensTrigger;
  import com.juglow.models.beta.messages.BetaToolUsesKeep;
  import com.juglow.models.beta.JuglowBeta;
  // ...
  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_5_5)
          .maxTokens(16000L)
          .addUserMessage("Search for the latest developments in quantum error correction and summarize the key breakthroughs.")
          .addTool(BetaWebSearchTool20250305.builder()
              .maxUses(5L)
              .build())
          .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
          .contextManagement(BetaContextManagementConfig.builder()
              .addEdit(BetaClearThinking20251015Edit.builder()
                  .keep(BetaThinkingTurns.builder()
                      .value(2L)
                      .build())
                  .build())
              .addEdit(BetaClearToolUses20250919Edit.builder()
                  .trigger(BetaInputTokensTrigger.builder()
                      .value(50000L)
                      .build())
                  .keep(BetaToolUsesKeep.builder()
                      .value(5L)
                      .build())
                  .build())
              .build())
          .build();

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

  $response = $client->beta->messages->create(
      maxTokens: 16000,
      messages: [
          [
              'role' => 'user',
              'content' => 'Search for the latest developments in quantum error correction and summarize the key breakthroughs.'
          ]
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      tools: [
          [
              'type' => 'web_search_20250305',
              'name' => 'web_search',
              'max_uses' => 5
          ]
      ],
      contextManagement: [
          'edits' => [
              [
                  'type' => 'clear_thinking_20251015',
                  'keep' => [
                      'type' => 'thinking_turns',
                      'value' => 2
                  ]
              ],
              [
                  'type' => 'clear_tool_uses_20250919',
                  'trigger' => [
                      'type' => 'input_tokens',
                      'value' => 50000
                  ],
                  'keep' => [
                      'type' => 'tool_uses',
                      'value' => 5
                  ]
              ]
          ]
      ],
  );

  echo $response;
ruby
  client = Juglow::Client.new

  response = client.beta.messages.create(
    model: "haijun-opus-5-5",
    max_tokens: 16000,
    messages: [
      {
        role: "user",
        content: "Search for the latest developments in quantum error correction and summarize the key breakthroughs."
      }
    ],
    tools: [
      {
        type: "web_search_20250305",
        name: "web_search",
        max_uses: 5
      }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_thinking_20251015",
          keep: {
            type: "thinking_turns",
            value: 2
          }
        },
        {
          type: "clear_tool_uses_20250919",
          trigger: {
            type: "input_tokens",
            value: 50000
          },
          keep: {
            type: "tool_uses",
            value: 5
          }
        }
      ]
    }
  )
  puts response

Opsi konfigurasi untuk pembersihan hasil alat

Opsi konfigurasiDefaultDeskripsi
trigger100.000 token inputMenentukan kapan strategi pengeditan konteks diaktifkan. Setelah prompt melampaui ambang batas ini, pembersihan dimulai. Anda dapat menentukan nilai ini dalam input_tokens atau tool_uses.
keep3 penggunaan alatMenentukan berapa banyak pasangan penggunaan/hasil alat terbaru yang disimpan setelah pembersihan terjadi. API menghapus interaksi alat terlama terlebih dahulu, mempertahankan yang terbaru.
clear_at_leastTidak adaMemastikan jumlah minimum token dibersihkan setiap kali strategi diaktifkan. Jika API tidak dapat membersihkan setidaknya jumlah yang ditentukan, strategi tidak akan diterapkan. Ini membantu menentukan apakah pembersihan konteks sepadan dengan merusak cache prompt Anda.
exclude_toolsTidak adaDaftar nama alat yang penggunaan dan hasil alatnya tidak boleh dibersihkan. Berguna untuk mempertahankan konteks penting.
clear_tool_inputsfalseMengontrol apakah parameter panggilan alat dibersihkan bersama dengan hasil alat. Secara default, hanya hasil alat yang dibersihkan sementara panggilan alat asli Haijun tetap terlihat.

Respons pengeditan konteks

Anda dapat melihat pengeditan konteks mana yang diterapkan pada permintaan Anda menggunakan field respons context_management, beserta statistik yang berguna tentang konten dan token input yang dibersihkan.

json
{
  "id": "msg_013Zva2CMHLNnXjNJJKqJ2EF",
  "type": "message",
  "role": "assistant",
  "content": [
    // ...
  ],
  "usage": {
    // ...
  },
  "context_management": {
    "applied_edits": [
      // When using `clear_thinking_20251015`
      {
        "type": "clear_thinking_20251015",
        "cleared_thinking_turns": 3,
        "cleared_input_tokens": 15000
      },
      // When using `clear_tool_uses_20250919`
      {
        "type": "clear_tool_uses_20250919",
        "cleared_tool_uses": 8,
        "cleared_input_tokens": 50000
      }
    ]
  }
}

Untuk respons streaming, pengeditan konteks disertakan dalam event message_delta terakhir:

json
{
  "type": "message_delta",
  "delta": {
    "stop_reason": "end_turn",
    "stop_sequence": null
  },
  "usage": {
    "output_tokens": 1024
  },
  "context_management": {
    "applied_edits": [
      // ...
    ]
  }
}

Penghitungan token

Endpoint penghitungan token mendukung manajemen konteks, memungkinkan Anda melihat pratinjau berapa banyak token yang akan digunakan prompt Anda setelah pengeditan konteks diterapkan.

bash
  curl https://haijun.my.id/v1/messages/count_tokens \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "messages": [
              {
                  "role": "user",
                  "content": "Continue our conversation..."
              }
          ],
          "context_management": {
              "edits": [
                  {
                      "type": "clear_tool_uses_20250919",
                      "trigger": {
                          "type": "input_tokens",
                          "value": 30000
                      },
                      "keep": {
                          "type": "tool_uses",
                          "value": 5
                      }
                  }
              ]
          }
      }'
bash
  ORIGINAL=$(ant beta:messages count-tokens \
    --beta context-management-2025-06-27 \
    --transform context_management.original_input_tokens \
    --raw-output <<'YAML'
  model: haijun-opus-5-5
  messages:
    - role: user
      content: Continue our conversation...
  context_management:
    edits:
      - type: clear_tool_uses_20250919
        trigger:
          type: input_tokens
          value: 30000
        keep:
          type: tool_uses
          value: 5
  YAML
  )

  INPUT_TOKENS=$(ant beta:messages count-tokens \
    --beta context-management-2025-06-27 \
    --transform input_tokens --raw-output <<'YAML'
  model: haijun-opus-5-5
  messages:
    - role: user
      content: Continue our conversation...
  context_management:
    edits:
      - type: clear_tool_uses_20250919
        trigger:
          type: input_tokens
          value: 30000
        keep:
          type: tool_uses
          value: 5
  YAML
  )

  printf 'Original tokens: %s\n' "$ORIGINAL"
  printf 'After clearing: %s\n' "$INPUT_TOKENS"
  printf 'Savings: %s tokens\n' "$((ORIGINAL - INPUT_TOKENS))"
python
  response = client.beta.messages.count_tokens(
      model="haijun-opus-5-5",
      messages=[{"role": "user", "content": "Continue our conversation..."}],
      betas=["context-management-2025-06-27"],
      context_management={
          "edits": [
              {
                  "type": "clear_tool_uses_20250919",
                  "trigger": {"type": "input_tokens", "value": 30000},
                  "keep": {"type": "tool_uses", "value": 5},
              }
          ]
      },
  )

  print(f"Original tokens: {response.context_management.original_input_tokens}")
  print(f"After clearing: {response.input_tokens}")
  print(
      f"Savings: {response.context_management.original_input_tokens - response.input_tokens} tokens"
  )
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.countTokens({
    model: "haijun-opus-5-5",
    messages: [
      {
        role: "user",
        content: "Continue our conversation..."
      }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_tool_uses_20250919",
          trigger: {
            type: "input_tokens",
            value: 30000
          },
          keep: {
            type: "tool_uses",
            value: 5
          }
        }
      ]
    }
  });

  console.log(`Original tokens: ${response.context_management?.original_input_tokens}`);
  console.log(`After clearing: ${response.input_tokens}`);
  console.log(
    `Savings: ${
      (response.context_management?.original_input_tokens || 0) - response.input_tokens
    } tokens`
  );
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCountTokensParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      Messages = [new() { Role = Role.User, Content = "Continue our conversation..." }],
      Betas = [JuglowBeta.ContextManagement2025_06_27],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [
              new BetaClearToolUses20250919Edit
              {
                  Trigger = new BetaInputTokensTrigger(30000),
                  Keep = new BetaToolUsesKeep(5)
              }
          ]
      }
  };

  var response = await client.Beta.Messages.CountTokens(parameters);

  Console.WriteLine($"Original tokens: {response.ContextManagement?.OriginalInputTokens}");
  Console.WriteLine($"After clearing: {response.InputTokens}");
  Console.WriteLine($"Savings: {(response.ContextManagement?.OriginalInputTokens ?? 0) - response.InputTokens} tokens");
go
  client := juglow.NewClient()

  response, err := client.Beta.Messages.CountTokens(context.TODO(), juglow.BetaMessageCountTokensParams{
  	Model: juglow.ModelHaijunOpus5_5,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Continue our conversation...")),
  	},
  	Betas: []juglow.JuglowBeta{
  		juglow.JuglowBetaContextManagement2025_06_27,
  	},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearToolUses20250919: &juglow.BetaClearToolUses20250919EditParam{
  				Trigger: juglow.BetaClearToolUses20250919EditTriggerUnionParam{
  					OfInputTokens: &juglow.BetaInputTokensTriggerParam{
  						Value: 30000,
  					},
  				},
  				Keep: juglow.BetaToolUsesKeepParam{
  					Value: 5,
  				},
  			}},
  		},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Printf("Original tokens: %d\n", response.ContextManagement.OriginalInputTokens)
  fmt.Printf("After clearing: %d\n", response.InputTokens)
  fmt.Printf("Savings: %d tokens\n", response.ContextManagement.OriginalInputTokens-response.InputTokens)
java
  import com.juglow.models.beta.messages.BetaMessageTokensCount;
  import com.juglow.models.beta.messages.MessageCountTokensParams;
  import com.juglow.models.beta.messages.BetaContextManagementConfig;
  import com.juglow.models.beta.messages.BetaClearToolUses20250919Edit;
  import com.juglow.models.beta.messages.BetaInputTokensTrigger;
  import com.juglow.models.beta.messages.BetaToolUsesKeep;
  import com.juglow.models.beta.JuglowBeta;
  // ...
  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCountTokensParams params = MessageCountTokensParams.builder()
          .model(Model.HAIJUN_OPUS_5_5)
          .addUserMessage("Continue our conversation...")
          .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
          .contextManagement(BetaContextManagementConfig.builder()
              .addEdit(BetaClearToolUses20250919Edit.builder()
                  .trigger(BetaInputTokensTrigger.builder()
                      .value(30000L)
                      .build())
                  .keep(BetaToolUsesKeep.builder()
                      .value(5L)
                      .build())
                  .build())
              .build())
          .build();

      BetaMessageTokensCount response = client.beta().messages().countTokens(params);

      IO.println("Original tokens: " + response.contextManagement().get().originalInputTokens());
      IO.println("After clearing: " + response.inputTokens());
      IO.println("Savings: " + (response.contextManagement().get().originalInputTokens() - response.inputTokens()) + " tokens");
  }
php
  $client = new Client();

  $response = $client->beta->messages->countTokens(
      messages: [
          ['role' => 'user', 'content' => 'Continue our conversation...']
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      contextManagement: [
          'edits' => [
              [
                  'type' => 'clear_tool_uses_20250919',
                  'trigger' => [
                      'type' => 'input_tokens',
                      'value' => 30000
                  ],
                  'keep' => [
                      'type' => 'tool_uses',
                      'value' => 5
                  ]
              ]
          ]
      ],
  );

  echo "Original tokens: " . $response->contextManagement->originalInputTokens . "\n";
  echo "After clearing: " . $response->inputTokens . "\n";
  echo "Savings: " . ($response->contextManagement->originalInputTokens - $response->inputTokens) . " tokens\n";
ruby
  client = Juglow::Client.new

  response = client.beta.messages.count_tokens(
    model: "haijun-opus-5-5",
    messages: [
      { role: "user", content: "Continue our conversation..." }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        {
          type: "clear_tool_uses_20250919",
          trigger: {
            type: "input_tokens",
            value: 30000
          },
          keep: {
            type: "tool_uses",
            value: 5
          }
        }
      ]
    }
  )

  puts "Original tokens: #{response.context_management.original_input_tokens}"
  puts "After clearing: #{response.input_tokens}"
  puts "Savings: #{response.context_management.original_input_tokens - response.input_tokens} tokens"
json
{
  "input_tokens": 25000,
  "context_management": {
    "original_input_tokens": 70000
  }
}

Respons menunjukkan jumlah token akhir setelah manajemen konteks diterapkan (input_tokens) dan jumlah token asli sebelum pembersihan apa pun terjadi (original_input_tokens).

Penggunaan dengan alat memori

Pengeditan konteks dapat digabungkan dengan alat memori. Ketika konteks percakapan Anda mendekati ambang batas pembersihan yang dikonfigurasi, Haijun menerima peringatan otomatis untuk mempertahankan informasi penting. Ini memungkinkan Haijun menyimpan hasil alat atau konteks ke file memorinya sebelum dibersihkan dari riwayat percakapan.

Kombinasi ini memungkinkan Anda untuk:

  • Mempertahankan konteks penting: Haijun dapat menulis informasi penting dari hasil alat ke file memori sebelum hasil tersebut dibersihkan
  • Mempertahankan alur kerja yang berjalan lama: Memungkinkan alur kerja agentik yang seharusnya melampaui batas konteks dengan memindahkan informasi ke penyimpanan persisten
  • Mengakses informasi sesuai kebutuhan: Haijun dapat mencari informasi yang sebelumnya dibersihkan dari file memori saat diperlukan, daripada menyimpan semuanya di jendela konteks aktif

Misalnya, dalam alur kerja pengeditan file di mana Haijun melakukan banyak operasi, Haijun dapat merangkum perubahan yang telah selesai ke file memori seiring pertumbuhan konteks. Ketika hasil alat dibersihkan, Haijun tetap memiliki akses ke informasi tersebut melalui sistem memorinya dan dapat terus bekerja secara efektif.

Untuk menggunakan kedua fitur secara bersamaan, aktifkan keduanya dalam permintaan API Anda:

bash
  curl https://haijun.my.id/v1/messages \
      --header "x-api-key: $JUGLOW_API_KEY" \
      --header "juglow-version: 2023-06-01" \
      --header "content-type: application/json" \
      --header "juglow-beta: context-management-2025-06-27" \
      --data '{
          "model": "haijun-opus-5-5",
          "max_tokens": 4096,
          "messages": [
              {
                  "role": "user",
                  "content": "Hello"
              }
          ],
          "tools": [
              {
                  "type": "memory_20250818",
                  "name": "memory"
              }
          ],
          "context_management": {
              "edits": [
                  {"type": "clear_tool_uses_20250919"}
              ]
          }
      }'
bash
  ant beta:messages create --beta context-management-2025-06-27 <<'YAML'
  model: haijun-opus-5-5
  max_tokens: 4096
  messages:
    - role: user
      content: Hello
  tools:
    - type: memory_20250818
      name: memory
  context_management:
    edits:
      - type: clear_tool_uses_20250919
  YAML
python
  response = client.beta.messages.create(
      model="haijun-opus-5-5",
      max_tokens=4096,
      messages=[{"role": "user", "content": "Hello"}],
      tools=[{"type": "memory_20250818", "name": "memory"}],
      betas=["context-management-2025-06-27"],
      context_management={"edits": [{"type": "clear_tool_uses_20250919"}]},
  )
typescript
  const juglow = new Juglow({
    apiKey: process.env.JUGLOW_API_KEY
  });

  const response = await juglow.beta.messages.create({
    model: "haijun-opus-5-5",
    max_tokens: 4096,
    messages: [{ role: "user", content: "Hello" }],
    tools: [
      {
        type: "memory_20250818",
        name: "memory"
      }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [{ type: "clear_tool_uses_20250919" }]
    }
  });
csharp
  using Juglow;
  using Juglow.Models.Beta;
  using Juglow.Models.Beta.Messages;
  using Messages = Juglow.Models.Messages;

  JuglowClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Messages::Model.HaijunOpus5_5,
      MaxTokens = 4096,
      Messages = [
          new() { Role = Role.User, Content = "Hello" }
      ],
      Tools = [
          new BetaMemoryTool20250818()
      ],
      Betas = [JuglowBeta.ContextManagement2025_06_27],
      ContextManagement = new BetaContextManagementConfig
      {
          Edits = [new BetaClearToolUses20250919Edit()]
      }
  };

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

  response, err := client.Beta.Messages.New(context.TODO(), juglow.BetaMessageNewParams{
  	Model:     juglow.ModelHaijunOpus5_5,
  	MaxTokens: 4096,
  	Messages: []juglow.BetaMessageParam{
  		juglow.NewBetaUserMessage(juglow.NewBetaTextBlock("Hello")),
  	},
  	Tools: []juglow.BetaToolUnionParam{
  		{OfMemoryTool20250818: &juglow.BetaMemoryTool20250818Param{}},
  	},
  	Betas: []juglow.JuglowBeta{juglow.JuglowBetaContextManagement2025_06_27},
  	ContextManagement: juglow.BetaContextManagementConfigParam{
  		Edits: []juglow.BetaContextManagementConfigEditUnionParam{
  			{OfClearToolUses20250919: &juglow.BetaClearToolUses20250919EditParam{}},
  		},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response)
java
  import com.juglow.models.beta.messages.BetaMemoryTool20250818;
  import com.juglow.models.beta.messages.BetaContextManagementConfig;
  import com.juglow.models.beta.messages.BetaClearToolUses20250919Edit;
  import com.juglow.models.beta.JuglowBeta;
  // ...
  void main() {
      JuglowClient client = JuglowOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.HAIJUN_OPUS_5_5)
          .maxTokens(4096L)
          .addUserMessage("Hello")
          .addTool(BetaMemoryTool20250818.builder().build())
          .addBeta(JuglowBeta.CONTEXT_MANAGEMENT_2025_06_27)
          .contextManagement(BetaContextManagementConfig.builder()
              .addEdit(BetaClearToolUses20250919Edit.builder().build())
              .build())
          .build();

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

  $response = $client->beta->messages->create(
      maxTokens: 4096,
      messages: [
          ['role' => 'user', 'content' => 'Hello']
      ],
      model: 'haijun-opus-5-5',
      betas: ['context-management-2025-06-27'],
      tools: [
          [
              'type' => 'memory_20250818',
              'name' => 'memory'
          ]
      ],
      contextManagement: [
          'edits' => [
              ['type' => 'clear_tool_uses_20250919']
          ]
      ],
  );

  echo $response;
ruby
  client = Juglow::Client.new

  response = client.beta.messages.create(
    model: "haijun-opus-5-5",
    max_tokens: 4096,
    messages: [{ role: "user", content: "Hello" }],
    tools: [
      {
        type: "memory_20250818",
        name: "memory"
      }
    ],
    betas: ["context-management-2025-06-27"],
    context_management: {
      edits: [
        { type: "clear_tool_uses_20250919" }
      ]
    }
  )
  puts response

Untuk referensi lengkap alat memori termasuk perintah dan contoh, lihat Alat memori.

Kompaksi sisi klien (SDK)

Warning: Juglow merekomendasikan kompaksi sisi server daripada kompaksi SDK. Kompaksi sisi server menangani manajemen konteks secara otomatis dengan kompleksitas integrasi yang lebih rendah, perhitungan penggunaan token yang lebih baik, dan tanpa keterbatasan sisi klien. Gunakan kompaksi SDK hanya jika Anda secara khusus memerlukan kontrol sisi klien atas proses peringkasan. Parameter compaction_control sudah tidak digunakan lagi (deprecated) di SDK TypeScript dan Ruby dan akan dihapus di versi mendatang. SDK mengeluarkan peringatan deprecation ketika parameter ini diaktifkan. SDK Python telah menghapusnya di v1.0. Untuk menggunakan kompaksi sisi server dengan tool runner, teruskan edit compact_20260112 dalam parameter context_management permintaan.

Note: Kompaksi tersedia di SDK TypeScript dan Ruby saat menggunakan metode tool_runner.

"Compaction" (kompaksi) adalah fitur SDK yang secara otomatis mengelola konteks percakapan dengan menghasilkan ringkasan ketika penggunaan token tumbuh terlalu besar. Berbeda dengan strategi pengeditan konteks sisi server yang membersihkan konten, kompaksi menginstruksikan Haijun untuk merangkum riwayat percakapan, lalu mengganti seluruh riwayat dengan ringkasan tersebut. Ini memungkinkan Haijun untuk terus mengerjakan tugas yang berjalan lama yang seharusnya melampaui jendela konteks.

Cara kerja kompaksi

Ketika kompaksi diaktifkan, SDK memantau penggunaan token setelah setiap respons model:

  1. Pemeriksaan ambang batas: SDK menghitung total token sebagai input_tokens + cache_creation_input_tokens + cache_read_input_tokens + output_tokens (lihat Caching prompt untuk field token cache).
  1. Pembuatan ringkasan: Ketika ambang batas terlampaui, prompt ringkasan disisipkan sebagai giliran pengguna, dan Haijun menghasilkan ringkasan terstruktur yang dibungkus dalam tag .
  1. Penggantian konteks: SDK mengekstrak ringkasan dan mengganti seluruh riwayat pesan dengannya.
  1. Kelanjutan: Percakapan dilanjutkan dari ringkasan, dengan Haijun melanjutkan dari titik terakhir.

Menggunakan kompaksi

Tambahkan compaction_control ke panggilan tool_runner Anda untuk mengaktifkan peringkasan otomatis ketika penggunaan token melampaui ambang batas.

cURL

Note: Kompaksi berjalan di sisi klien dalam helper tool_runner SDK, sehingga tidak memiliki padanan HTTP langsung. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow.

CLI

Note: CLI tidak menyertakan helper tool_runner. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow tanpa integrasi sisi SDK.

Python

Note: Di v1.0 dan yang lebih baru, tool runner SDK Python tidak mendukung compaction_control sisi klien. Gunakan kompaksi sisi server sebagai gantinya: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

TypeScript

typescript
const client = new Juglow();

const runner = client.beta.messages.toolRunner({
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [readFile],
  messages: [{ role: "user", content: "What's in config.json?" }],
  compactionControl: { enabled: true, contextTokenThreshold: 100000 }
});

for await (const message of runner) {
  console.log(`Tokens used: ${message.usage.input_tokens}`);
}

C#

Note: SDK C# menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Gunakan kompaksi sisi server sebagai gantinya: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Go

Note: SDK Go menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Gunakan kompaksi sisi server sebagai gantinya: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Java

Note: SDK Java menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Gunakan kompaksi sisi server sebagai gantinya: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

PHP

Note: SDK PHP menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Gunakan kompaksi sisi server sebagai gantinya: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Ruby

ruby
client = Juglow::Client.new

runner = client.beta.messages.tool_runner(
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [ReadFile.new],
  messages: [{ role: "user", content: "What's in config.json?" }],
  compaction_control: { enabled: true, context_token_threshold: 100000 }
)

runner.each_message do |message|
  puts "Tokens used: #{message.usage.input_tokens}"
end

Apa yang terjadi selama kompaksi

Seiring pertumbuhan percakapan, riwayat pesan terakumulasi:

Sebelum kompaksi (mendekati 100k token):

json
[
  { "role": "user", "content": "Analyze all files and write a report..." },
  { "role": "assistant", "content": "I'll help. Let me start by reading..." },
  {
    "role": "user",
    "content": [{ "type": "tool_result", "tool_use_id": "...", "content": "..." }]
  },
  { "role": "assistant", "content": "Based on file1.txt, I see..." },
  {
    "role": "user",
    "content": [{ "type": "tool_result", "tool_use_id": "...", "content": "..." }]
  },
  { "role": "assistant", "content": "After analyzing file2.txt..." }
  // ... 50 more exchanges like this ...
]

Ketika token melampaui ambang batas, SDK menyisipkan permintaan ringkasan dan Haijun menghasilkan ringkasan. Seluruh riwayat kemudian diganti:

Setelah kompaksi (kembali ke \~2–3k token):

json
[
  {
    "role": "assistant",
    "content": "# Task Overview\nThe user requested analysis of directory files to produce a summary report...\n\n# Current State\nAnalyzed 52 files across 3 subdirectories. Key findings documented in report.md...\n\n# Important Discoveries\n- Configuration files use YAML format\n- Found 3 deprecated dependencies\n- Test coverage at 67%\n\n# Next Steps\n1. Analyze remaining files in /src/legacy\n2. Complete final report sections...\n\n# Context to Preserve\nUser prefers markdown format with executive summary first..."
  }
]

Haijun melanjutkan pekerjaan dari ringkasan ini seolah-olah itu adalah riwayat percakapan asli.

Opsi konfigurasi

ParameterTipeWajibDefaultDeskripsi
enabledbooleanYa-Apakah kompaksi otomatis diaktifkan
context_token_thresholdnumberTidak100.000Jumlah token saat kompaksi dipicu
modelstringTidakSama dengan model utamaModel yang digunakan untuk menghasilkan ringkasan
summary_promptstringTidakLihat Prompt ringkasan defaultPrompt kustom untuk pembuatan ringkasan

Memilih ambang batas token

Ambang batas menentukan kapan kompaksi terjadi. Ambang batas yang lebih rendah berarti kompaksi lebih sering dengan jendela konteks yang lebih kecil. Ambang batas yang lebih tinggi memungkinkan lebih banyak konteks tetapi berisiko mencapai batas.

cURL

Note: Kompaksi berjalan di sisi klien dalam helper tool_runner SDK, sehingga tidak memiliki padanan HTTP langsung. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow.

CLI

Note: CLI tidak menyertakan helper tool_runner. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow tanpa integrasi sisi SDK.

Python

Note: Pada v1.0 dan yang lebih baru, tool runner SDK Python tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan kompaksi sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

TypeScript

typescript
const client = new Juglow();

const runner = client.beta.messages.toolRunner({
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [readFile],
  messages: [{ role: "user", content: "What's in config.json?" }],
  // Nilai lebih rendah memicu pemadatan lebih sering; naikkan ke 150000 jika tugas butuh konteks lebih banyak
  compactionControl: { enabled: true, contextTokenThreshold: 50000 }
});

for await (const message of runner) {
  console.log(`Tokens used: ${message.usage.input_tokens}`);
}

C#

Note: SDK C# menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Go

Note: SDK Go menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Java

Note: SDK Java menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

PHP

Note: SDK PHP menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Ruby

ruby
client = Juglow::Client.new

runner = client.beta.messages.tool_runner(
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [ReadFile.new],
  messages: [{ role: "user", content: "What's in config.json?" }],
  # Nilai lebih rendah memicu pemadatan lebih sering; naikkan ke 150000 jika tugas butuh konteks lebih banyak
  compaction_control: { enabled: true, context_token_threshold: 50000 }
)

runner.each_message do |message|
  puts "Tokens used: #{message.usage.input_tokens}"
end

Menggunakan model yang berbeda untuk ringkasan

Anda dapat menggunakan model yang lebih cepat atau lebih murah untuk menghasilkan ringkasan:

cURL

Note: Kompaksi berjalan di sisi klien dalam helper tool_runner SDK, sehingga tidak memiliki padanan HTTP langsung. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow.

CLI

Note: CLI tidak menyertakan helper tool_runner. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow tanpa integrasi sisi SDK.

Python

Note: Pada v1.0 dan yang lebih baru, tool runner SDK Python tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

TypeScript

typescript
const client = new Juglow();

const runner = client.beta.messages.toolRunner({
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [readFile],
  messages: [{ role: "user", content: "What's in config.json?" }],
  compactionControl: {
    enabled: true,
    contextTokenThreshold: 100000,
    model: "haijun-haiku-4-5"
  }
});

for await (const message of runner) {
  console.log(`Tokens used: ${message.usage.input_tokens}`);
}

C#

Note: SDK C# menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Go

Note: SDK Go menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Java

Note: SDK Java menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

PHP

Note: SDK PHP menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Ruby

ruby
client = Juglow::Client.new

runner = client.beta.messages.tool_runner(
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [ReadFile.new],
  messages: [{ role: "user", content: "What's in config.json?" }],
  compaction_control: {
    enabled: true,
    context_token_threshold: 100000,
    model: "haijun-haiku-4-5"
  }
)

runner.each_message do |message|
  puts "Tokens used: #{message.usage.input_tokens}"
end

Prompt ringkasan kustom

Anda dapat menyediakan prompt kustom untuk kebutuhan spesifik domain. Prompt Anda harus menginstruksikan Haijun untuk membungkus ringkasannya dalam tag

.

cURL

Note: Kompaksi berjalan di sisi klien dalam helper tool_runner SDK, sehingga tidak memiliki padanan HTTP langsung. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow.

CLI

Note: CLI tidak menyertakan helper tool_runner. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow tanpa integrasi sisi SDK.

Python

Note: Pada v1.0 dan yang lebih baru, tool runner SDK Python tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

TypeScript

typescript
const client = new Juglow();

const runner = client.beta.messages.toolRunner({
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [readFile],
  messages: [{ role: "user", content: "What's in config.json?" }],
  compactionControl: {
    enabled: true,
    contextTokenThreshold: 100000,
    summaryPrompt: `Summarize the research conducted so far, including:
- Sources consulted and key findings
- Questions answered and remaining unknowns
- Recommended next steps

Wrap your summary in <summary></summary> tags.`
  }
});

for await (const message of runner) {
  console.log(`Tokens used: ${message.usage.input_tokens}`);
}

C#

Note: SDK C# menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Go

Note: SDK Go menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Java

Note: SDK Java menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

PHP

Note: SDK PHP menyertakan tool runner, tetapi tidak mendukung compaction_control sisi klien. Sebagai gantinya, gunakan compaction sisi server: fitur ini bekerja dengan tool runner dengan meneruskan edit compact_20260112 dalam parameter context_management pada permintaan.

Ruby

ruby
client = Juglow::Client.new

runner = client.beta.messages.tool_runner(
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [ReadFile.new],
  messages: [{ role: "user", content: "What's in config.json?" }],
  compaction_control: {
    enabled: true,
    context_token_threshold: 100000,
    summary_prompt: <<~PROMPT
      Summarize the research conducted so far, including:
      - Sources consulted and key findings
      - Questions answered and remaining unknowns
      - Recommended next steps

      Wrap your summary in <summary></summary> tags.
    PROMPT
  }
)

runner.each_message do |message|
  puts "Tokens used: #{message.usage.input_tokens}"
end

Prompt ringkasan default

Prompt ringkasan bawaan menginstruksikan Haijun untuk membuat ringkasan kelanjutan terstruktur yang mencakup:

  1. Ikhtisar Tugas: Permintaan inti pengguna, kriteria keberhasilan, dan batasan.
  1. Status Saat Ini: Apa yang telah diselesaikan, file yang dimodifikasi, dan artefak yang dihasilkan.
  1. Temuan Penting: Batasan teknis, keputusan yang dibuat, kesalahan yang diselesaikan, dan pendekatan yang gagal.
  1. Langkah Selanjutnya: Tindakan spesifik yang diperlukan, penghambat, dan urutan prioritas.
  1. Konteks yang Perlu Dipertahankan: Preferensi pengguna, detail spesifik domain, dan komitmen yang dibuat.

Struktur ini memungkinkan Haijun melanjutkan pekerjaan secara efisien tanpa kehilangan konteks penting atau mengulangi kesalahan.

Lihat prompt default lengkap

text
  You have been working on the task described above but have not yet completed it. Write a continuation summary that will allow you (or another instance of yourself) to resume work efficiently in a future context window where the conversation history will be replaced with this summary. Your summary should be structured, concise, and actionable. Include:

  1. Task Overview
  The user's core request and success criteria
  Any clarifications or constraints they specified

  2. Current State
  What has been completed so far
  Files created, modified, or analyzed (with paths if relevant)
  Key outputs or artifacts produced

  3. Important Discoveries
  Technical constraints or requirements uncovered
  Decisions made and their rationale
  Errors encountered and how they were resolved
  What approaches were tried that didn't work (and why)

  4. Next Steps
  Specific actions needed to complete the task
  Any blockers or open questions to resolve
  Priority order if multiple steps remain

  5. Context to Preserve
  User preferences or style requirements
  Domain-specific details that aren't obvious
  Any promises made to the user

  Be concise but complete—err on the side of including information that would prevent duplicate work or repeated mistakes. Write in a way that enables immediate resumption of the task.

  Wrap your summary in <summary></summary> tags.

Keterbatasan

Alat sisi server

Warning: Kompaksi memerlukan pertimbangan khusus saat menggunakan alat sisi server seperti pencarian web atau web fetch.

Saat menggunakan alat sisi server, SDK mungkin salah menghitung penggunaan token, menyebabkan kompaksi dipicu pada waktu yang salah.

Misalnya, setelah operasi pencarian web, respons API mungkin menunjukkan:

json
{
  "usage": {
    "input_tokens": 63000,
    "cache_creation_input_tokens": 0,
    "cache_read_input_tokens": 270000,
    "output_tokens": 1400
  }
}

SDK menghitung total penggunaan sebagai 63.000 + 0 + 270.000 + 1.400 = 334.400 token. Namun, nilai cache_read_input_tokens mencakup akumulasi pembacaan dari beberapa panggilan API internal yang dilakukan oleh alat sisi server, bukan konteks percakapan Anda yang sebenarnya. Panjang konteks Anda yang sebenarnya mungkin hanya 63.000 input_tokens, tetapi SDK melihat 334k dan memicu kompaksi terlalu dini.

Solusi sementara:

  • Hindari kompaksi saat menggunakan alat sisi server secara ekstensif

Kasus tepi penggunaan alat

Ketika SDK memicu kompaksi saat respons penggunaan alat masih tertunda, SDK menghapus blok penggunaan alat dari riwayat pesan sebelum menghasilkan ringkasan. Haijun akan mengeluarkan kembali panggilan alat setelah melanjutkan dari ringkasan jika masih diperlukan.

Memantau kompaksi

Memahami kapan kompaksi dipicu membantu Anda menyetel ambang batas dan memverifikasi perilaku yang diharapkan.

cURL

Note: Kompaksi berjalan di sisi klien dalam helper tool_runner SDK, sehingga tidak memiliki padanan HTTP langsung. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow.

CLI

Note: CLI tidak menyertakan helper tool_runner. Gunakan kompaksi sisi server sebagai gantinya, yang menangani kompaksi di server Juglow tanpa integrasi sisi SDK.

Python

Note: Di v1.0 dan yang lebih baru, tool runner SDK Python tidak mendukung compaction_control. Gunakan kompaksi sisi server sebagai gantinya.

TypeScript

toolRunner SDK TypeScript mendukung kompaksi tetapi tidak mencatat event. Deteksi kompaksi dengan mengamati runner.params.messages.length menyusut di antara giliran:

typescript
let prevMsgCount = 0;
for await (const message of runner) {
  const currMsgCount = runner.params.messages.length;
  if (currMsgCount < prevMsgCount) {
    console.log(`Compaction occurred: ${prevMsgCount} -> ${currMsgCount} messages`);
    console.log(`Input tokens after compaction: ${message.usage.input_tokens}`);
  }
  prevMsgCount = currMsgCount;
}

C#

Note: Tool runner SDK C# tidak mendukung compaction_control. Gunakan kompaksi sisi server sebagai gantinya.

Go

Note: Tool runner SDK Go tidak mendukung compaction_control. Gunakan kompaksi sisi server sebagai gantinya.

Java

Note: Tool runner SDK Java tidak mendukung compaction_control. Gunakan kompaksi sisi server sebagai gantinya.

PHP

Note: Tool runner SDK PHP tidak mendukung compaction_control. Gunakan kompaksi sisi server sebagai gantinya.

Ruby

SDK Ruby mendukung callback on_compact: yang dipicu ketika kompaksi terjadi. Tambahkan ke konfigurasi compaction_control Anda:

ruby
client = Juglow::Client.new

runner = client.beta.messages.tool_runner(
  model: "haijun-opus-5-5",
  max_tokens: 1024,
  tools: [ReadFile.new],
  messages: [{ role: "user", content: "What's in config.json?" }],
  compaction_control: {
    enabled: true,
    context_token_threshold: 100000,
    on_compact: ->(tokens_before, tokens_after) do
      puts "Compaction occurred: #{tokens_before} -> #{tokens_after} tokens"
    end
  }
)

runner.each_message do |message|
  puts "Tokens: #{message.usage.input_tokens}"
end

Kapan menggunakan kompaksi

Kasus penggunaan yang baik:

  • Tugas agen yang berjalan lama yang memproses banyak file atau sumber data
  • Alur kerja riset yang mengakumulasi informasi dalam jumlah besar
  • Tugas multilangkah dengan kemajuan yang jelas dan terukur
  • Tugas yang menghasilkan artefak (file, laporan) yang bertahan di luar percakapan

Kasus penggunaan yang kurang ideal:

  • Tugas yang memerlukan ingatan presisi atas detail percakapan awal
  • Alur kerja yang menggunakan alat sisi server secara ekstensif
  • Tugas yang perlu mempertahankan status yang tepat di banyak variabel

Langkah selanjutnya

Kelola percakapan panjang dengan kompaksi sisi server, strategi yang direkomendasikan untuk sebagian besar kasus penggunaan.

Kurangi biaya dan latensi dengan melakukan caching prefiks prompt, dan pelajari bagaimana pengeditan konteks berinteraksi dengan cache.

On this page
IkhtisarStrategi sisi serverPembersihan hasil alatPembersihan blok thinkingPengeditan konteks terjadi di sisi serverPengeditan konteks dan caching promptModel yang didukungPenggunaan pembersihan hasil alatKonfigurasi lanjutanPenggunaan pembersihan blok thinkingOpsi konfigurasi untuk pembersihan blok thinkingMenggabungkan strategiOpsi konfigurasi untuk pembersihan hasil alatRespons pengeditan konteksPenghitungan tokenPenggunaan dengan alat memoriKompaksi sisi klien (SDK)Cara kerja kompaksiMenggunakan kompaksiApa yang terjadi selama kompaksiOpsi konfigurasiMemilih ambang batas tokenMenggunakan model yang berbeda untuk ringkasanPrompt ringkasan kustomPrompt ringkasan defaultLihat prompt default lengkapKeterbatasanAlat sisi serverKasus tepi penggunaan alatMemantau kompaksiKapan menggunakan kompaksiLangkah selanjutnya