Haijun Platform Docs
EN

Sesi adalah instans agen di dalam sebuah environment (lingkungan). Setiap sesi mereferensikan sebuah agen dan sebuah environment (keduanya dibuat secara terpisah), serta mempertahankan riwayat percakapan di berbagai interaksi. Sesi mengikuti siklus hidup dua langkah: pertama buat sesi, lalu kirim event pengguna untuk memulai pekerjaan. Anda juga dapat menggabungkan kedua langkah tersebut menjadi satu panggilan dengan initial_events.

Membuat sesi

Sesi memerlukan ID agent dan ID environment. Agen adalah sumber daya berversi; meneruskan ID agent sebagai string akan membuat sesi dengan versi agen terbaru.

bash
  curl -fsSL https://haijun.my.id/v1/sessions \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01" \
    -H "content-type: application/json" \
    -d @- <<EOF
  {
    "agent": "$AGENT_ID",
    "environment_id": "$ENVIRONMENT_ID"
  }
  EOF
bash
  ant beta:sessions create \
    --agent "$AGENT_ID" \
    --environment-id "$ENVIRONMENT_ID"
python
  session = client.beta.sessions.create(
      agent=agent.id,
      environment_id=environment.id,
  )
typescript
  const session = await client.beta.sessions.create({
    agent: agent.id,
    environment_id: environment.id
  });
csharp
  var session = await client.Beta.Sessions.Create(new()
  {
      Agent = agent.ID,
      EnvironmentID = environment.ID,
  });
go
  session, err := client.Beta.Sessions.New(ctx, juglow.BetaSessionNewParams{
  	Agent: juglow.BetaSessionNewParamsAgentUnion{
  		OfString: juglow.String(agent.ID),
  	},
  	EnvironmentID: environment.ID,
  })
  if err != nil {
  	panic(err)
  }
java
  var session = client.beta().sessions().create(SessionCreateParams.builder()
      .agent(agent.id())
      .environmentId(environment.id())
      .build());
php
  $session = $client->beta->sessions->create(
      agent: $agent->id,
      environmentID: $environment->id,
  );
ruby
  session = client.beta.sessions.create(
    agent: agent.id,
    environment_id: environment.id
  )

Untuk menyematkan sesi ke versi agen tertentu, teruskan sebuah objek. Ini memungkinkan Anda mengontrol dengan tepat versi mana yang berjalan dan melakukan peluncuran bertahap versi baru secara independen.

bash
  curl -fsSL https://haijun.my.id/v1/sessions \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01" \
    -H "content-type: application/json" \
    -d @- <<EOF
  {
    "agent": {"type": "agent", "id": "$AGENT_ID", "version": 1},
    "environment_id": "$ENVIRONMENT_ID"
  }
  EOF
bash
  ant beta:sessions create <<YAML
  agent:
    type: agent
    id: $AGENT_ID
    version: 1
  environment_id: $ENVIRONMENT_ID
  YAML
python
  pinned_session = client.beta.sessions.create(
      agent={"type": "agent", "id": agent.id, "version": 1},
      environment_id=environment.id,
  )
typescript
  const pinnedSession = await client.beta.sessions.create({
    agent: { type: "agent", id: agent.id, version: 1 },
    environment_id: environment.id
  });
csharp
  var pinnedSession = await client.Beta.Sessions.Create(new()
  {
      Agent = new BetaManagedAgentsAgentParams
      {
          Type = BetaManagedAgentsAgentParamsType.Agent,
          ID = agent.ID,
          Version = 1,
      },
      EnvironmentID = environment.ID,
  });
go
  pinnedSession, err := client.Beta.Sessions.New(ctx, juglow.BetaSessionNewParams{
  	Agent: juglow.BetaSessionNewParamsAgentUnion{
  		OfBetaManagedAgentsAgents: &juglow.BetaManagedAgentsAgentParams{
  			Type:    juglow.BetaManagedAgentsAgentParamsTypeAgent,
  			ID:      agent.ID,
  			Version: juglow.Int(1),
  		},
  	},
  	EnvironmentID: environment.ID,
  })
  if err != nil {
  	panic(err)
  }
java
  var pinnedSession = client.beta().sessions().create(SessionCreateParams.builder()
      .agent(BetaManagedAgentsAgentParams.builder()
          .type(BetaManagedAgentsAgentParams.Type.AGENT)
          .id(agent.id())
          .version(1)
          .build())
      .environmentId(environment.id())
      .build());
php
  $pinnedSession = $client->beta->sessions->create(
      agent: ['type' => 'agent', 'id' => $agent->id, 'version' => 1],
      environmentID: $environment->id,
  );
ruby
  pinned_session = client.beta.sessions.create(
    agent: {type: :agent, id: agent.id, version: 1},
    environment_id: environment.id
  )

Mengisi sesi dengan event awal

Anda dapat membuat sesi dan memulai pekerjaannya dalam satu panggilan. initial_events adalah array opsional berisi event awal yang dikirim ke sesi saat pembuatan, diproses secara berurutan. Array ini mendukung event user.message dan user.define_outcome, serta menerima maksimum 50 event. Daftar yang tidak kosong akan memulai loop agen dalam panggilan yang sama: sesi dibuat langsung dalam status running, tanpa permintaan lebih lanjut.

Contoh berikut membuat sesi dengan satu user.message di initial_events:

bash
  seeded_session=$(curl -fsSL https://haijun.my.id/v1/sessions \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01" \
    -H "content-type: application/json" \
    -d @- <<EOF
  {
    "agent": "$AGENT_ID",
    "environment_id": "$ENVIRONMENT_ID",
    "initial_events": [
      {
        "type": "user.message",
        "content": [{"type": "text", "text": "List the files in the working directory."}]
      }
    ]
  }
  EOF
  )
  SEEDED_SESSION_ID=$(jq -r '.id' <<< "$seeded_session")

  # initial_events tidak ikut dikembalikan pada respons create; tampilkan daftar
  # event sesi untuk melihat pesan yang di-seed.
  seeded_events=$(curl -fsSL \
    "https://haijun.my.id/v1/sessions/$SEEDED_SESSION_ID/events" \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01")
  echo "Seeded event: $(jq -r \
    '.data[] | select(.type == "user.message") | .content[0].text' <<< "$seeded_events")"
bash
  SEEDED_SESSION_ID=$(ant beta:sessions create \
    --transform id --raw-output <<YAML
  agent: $AGENT_ID
  environment_id: $ENVIRONMENT_ID
  initial_events:
    - type: user.message
      content:
        - type: text
          text: List the files in the working directory.
  YAML
  )

  # initial_events tidak ikut dikembalikan pada respons create; tampilkan daftar
  # event sesi untuk melihat pesan yang di-seed.
  echo "Seeded event: $(ant beta:sessions:events list \
    --session-id "$SEEDED_SESSION_ID" \
    --format raw \
    --transform 'data.#(type=="user.message").content.0.text' --raw-output)"
python
  seeded_session = client.beta.sessions.create(
      agent=agent.id,
      environment_id=environment.id,
      initial_events=[
          {
              "type": "user.message",
              "content": [
                  {"type": "text", "text": "List the files in the working directory."}
              ],
          },
      ],
  )
  # initial_events tidak digemakan pada respons create; baca kembali
  # dari daftar event milik sesi.
  for event in client.beta.sessions.events.list(seeded_session.id):
      if event.type == "user.message":
          for block in event.content:
              if block.type == "text":
                  print(f"Seeded event: {block.text}")
typescript
  const seededSession = await client.beta.sessions.create({
    agent: agent.id,
    environment_id: environment.id,
    initial_events: [
      {
        type: "user.message",
        content: [{ type: "text", text: "List the files in the working directory." }]
      }
    ]
  });

  // initial_events tidak digemakan pada respons create; daftarkan event
  // sesi untuk membaca kembali pesan yang di-seed.
  for await (const event of client.beta.sessions.events.list(seededSession.id)) {
    if (event.type === "user.message") {
      for (const block of event.content) {
        if (block.type === "text") {
          console.log(`Seeded event: ${block.text}`);
        }
      }
    }
  }
csharp
  var seededSession = await client.Beta.Sessions.Create(new()
  {
      Agent = agent.ID,
      EnvironmentID = environment.ID,
      InitialEvents =
      [
          new BetaManagedAgentsUserMessageEventParams
          {
              Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage,
              Content =
              [
                  new BetaManagedAgentsTextBlock
                  {
                      Type = BetaManagedAgentsTextBlockType.Text,
                      Text = "List the files in the working directory.",
                  },
              ],
          },
      ],
  });
  // initial_events tidak digemakan pada respons create; baca kembali
  // dari daftar event sesi.
  var seededEvents = await client.Beta.Sessions.Events.List(seededSession.ID);
  await foreach (var sessionEvent in seededEvents.Paginate())
  {
      if (sessionEvent.TryPickUserMessage(out var userMessage))
      {
          foreach (var contentBlock in userMessage.Content)
          {
              if (contentBlock.TryPickBetaManagedAgentsTextBlock(out var textBlock))
              {
                  Console.WriteLine($"Seeded event: {textBlock.Text}");
              }
          }
      }
  }
go
  seededSession, err := client.Beta.Sessions.New(ctx, juglow.BetaSessionNewParams{
  	Agent: juglow.BetaSessionNewParamsAgentUnion{
  		OfString: juglow.String(agent.ID),
  	},
  	EnvironmentID: environment.ID,
  	InitialEvents: []juglow.BetaSessionNewParamsInitialEventUnion{{
  		OfUserMessage: &juglow.BetaManagedAgentsUserMessageEventParams{
  			Type: juglow.BetaManagedAgentsUserMessageEventParamsTypeUserMessage,
  			Content: []juglow.BetaManagedAgentsUserMessageEventParamsContentUnion{{
  				OfText: &juglow.BetaManagedAgentsTextBlockParam{
  					Type: juglow.BetaManagedAgentsTextBlockTypeText,
  					Text: "List the files in the working directory.",
  				},
  			}},
  		},
  	}},
  })
  if err != nil {
  	panic(err)
  }
  // initial_events tidak digaungkan pada respons create, jadi daftarkan
  // event sesi untuk membaca kembali user.message yang di-seed.
  seededEvents, err := client.Beta.Sessions.Events.List(ctx, seededSession.ID, juglow.BetaSessionEventListParams{})
  if err != nil {
  	panic(err)
  }
  for _, event := range seededEvents.Data {
  	if event.Type != "user.message" {
  		continue
  	}
  	for _, contentBlock := range event.AsUserMessage().Content {
  		if contentBlock.Type == "text" {
  			fmt.Printf("Seeded event: %s\n", contentBlock.AsText().Text)
  		}
  	}
  }
java
  var seededSession = client.beta().sessions().create(SessionCreateParams.builder()
      .agent(agent.id())
      .environmentId(environment.id())
      .addInitialEvent(BetaManagedAgentsUserMessageEventParams.builder()
          .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE)
          .addTextContent("List the files in the working directory.")
          .build())
      .build());
  // initial_events tidak digemakan pada respons create; daftarkan
  // event sesi untuk membaca kembali user.message yang di-seed.
  for (var event : client.beta().sessions().events().list(seededSession.id()).autoPager()) {
      if (event.isUserMessage()) {
          for (var contentBlock : event.asUserMessage().content()) {
              if (contentBlock.isText()) {
                  IO.println("Seeded event: " + contentBlock.asText().text());
              }
          }
      }
  }
php
  $seededSession = $client->beta->sessions->create(
      agent: $agent->id,
      environmentID: $environment->id,
      initialEvents: [
          [
              'type' => 'user.message',
              'content' => [['type' => 'text', 'text' => 'List the files in the working directory.']],
          ],
      ],
  );

  // initial_events tidak digemakan pada respons create; baca kembali
  // dari daftar event sesi.
  $seededEvents = $client->beta->sessions->events->list($seededSession->id);
  foreach ($seededEvents->getItems() as $event) {
      if ($event->type === 'user.message') {
          echo "Seeded event: {$event->content[0]->text}\n";
      }
  }
ruby
  seeded_session = client.beta.sessions.create(
    agent: agent.id,
    environment_id: environment.id,
    initial_events: [
      {
        type: :"user.message",
        content: [{type: :text, text: "List the files in the working directory."}]
      }
    ]
  )

  # initial_events tidak digemakan pada respons create; baca kembali dari
  # daftar event milik sesi.
  client.beta.sessions.events.list(seeded_session.id).auto_paging_each do |event|
    next unless event.type == :"user.message"
    event.content.each do |block|
      puts "Seeded event: #{block.text}" if block.type == :text
    end
  end

Tidak ada tipe event lain yang diterima. Event yang merespons giliran agen (user.tool_confirmation, user.tool_result, dan user.custom_tool_result) tidak diterima karena belum ada giliran agen, dan user.interrupt tidak diterima karena tidak ada giliran yang perlu dihentikan. Berbeda dengan initial_events pada deployment terjadwal, initial_events milik sesi tidak menerima system.message.

Setiap event di initial_events divalidasi dan disimpan sebelum respons pembuatan dikembalikan, sesuai urutan daftar, dengan ID yang ditetapkan server, persis seolah-olah Anda mengirimkannya ke endpoint kirim event segera setelah pembuatan. Aturan konten per event juga sama dengan endpoint tersebut. Daftar kosong setara dengan menghilangkan field tersebut. Validasi bersifat semua-atau-tidak-sama-sekali: jika ada event yang gagal validasi, seluruh permintaan ditolak dan tidak ada sesi yang dibuat.

Permintaan pembuatan ditolak dalam kasus-kasus berikut:

KondisiStatus
Lebih dari satu event user.define_outcome400
Event user.define_outcome tanpa rubric400
Lebih dari 100 blok konten document bersumber file di seluruh daftar400
Body permintaan lebih dari 32 MB413

Event user.define_outcome di initial_events diterima dengan kondisi yang sama seperti mengirimkannya ke sesi yang sudah ada; lihat Mendefinisikan outcome.

Menimpa konfigurasi agen untuk sebuah sesi

Anda dapat meneruskan agent dalam tiga bentuk: string ID agen, objek versi tersemat (type: "agent"), atau objek override (penimpaan). Bentuk override mengubah sebagian konfigurasi agen untuk satu sesi. Gunakan bentuk ini untuk mencoba model yang berbeda atau memberikan alat tambahan dalam satu sesi tanpa membuat versi agen baru. Untuk bentuk override, atur type ke agent_with_overrides dan teruskan id agen serta secara opsional version (hilangkan version untuk menggunakan versi terbaru agen). Kemudian sertakan salah satu dari model, system, tools, mcp_servers, atau tracks dengan nilai yang harus digunakan sesi.

Setiap field yang dapat ditimpa mengikuti tiga aturan yang sama:

  • Hilangkan field: Sesi mewarisi nilai dari versi agen yang direferensikannya.
  • Atur field ke null, atau ke array kosong untuk field daftar: Sesi berjalan dengan field tersebut dikosongkan. Aturan ini berlaku sepenuhnya untuk system dan tracks. Ada tiga pengecualian:
  • model tidak pernah dapat dikosongkan. Sesi selalu membutuhkan model, sehingga model: null mengembalikan error 400 agent_model_required.
  • Mengosongkan tools mengembalikan error 400 ketika tracks efektif sesi tidak kosong, karena tracks memerlukan alat read. Selain itu, tools: null dan tools: [] mengosongkan field tersebut.
  • Mengosongkan mcp_servers mengembalikan error 400 ketika tools efektif sesi masih berisi mcp_toolset yang mereferensikan salah satu server agen. Timpa tools dalam permintaan yang sama untuk menghapus entri mcp_toolset tersebut, lalu kosongkan mcp_servers.
  • Atur field ke sebuah nilai: Nilai tersebut menggantikan nilai agen secara penuh. Override tidak pernah digabungkan dengan konfigurasi agen, sehingga override tools harus mencantumkan setiap alat yang harus dimiliki sesi. Demikian pula, override model menggantikan objek model agen secara penuh, sehingga effort milik agen tidak ikut terbawa. Untuk menjalankan sesi pada tingkat effort tertentu, atur effort di dalam objek model pada override. Tingkat yang tidak didukung model akan mengembalikan error 400, dan override model tanpa effort berjalan pada tingkat effort default model tersebut.

Override hanya berlaku untuk sesi yang Anda buat. Override tidak memodifikasi sumber daya agen atau membuat versi agen baru, sehingga sesi lain yang mereferensikan agen yang sama tidak terpengaruh.

Dalam respons, objek agent mencerminkan konfigurasi yang digunakan sesi setelah override diterapkan. id dan version-nya tetap mengidentifikasi agen dan versi tempat override diterapkan. Ini memungkinkan Anda menelusuri sesi kembali ke agen dasarnya.

Contoh berikut memulai sesi yang menimpa model dan mengosongkan prompt sistem:

bash
  curl -fsSL https://haijun.my.id/v1/sessions \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01" \
    -H "content-type: application/json" \
    -d @- <<EOF
  {
    "agent": {
      "type": "agent_with_overrides",
      "id": "$AGENT_ID",
      "model": {"id": "haijun-sonnet-5"},
      "system": null
    },
    "environment_id": "$ENVIRONMENT_ID"
  }
  EOF
bash
  # `agent` pada respons adalah snapshot hasil resolusi: setiap override mengganti
  # field tersebut hanya untuk sesi ini, dan resource agen tetap menyimpan id dan versinya.
  ant beta:sessions create <<YAML
  agent:
    type: agent_with_overrides
    id: $AGENT_ID
    model:
      id: haijun-sonnet-5
    system: null
  environment_id: $ENVIRONMENT_ID
  YAML
python
  override_session = client.beta.sessions.create(
      agent={
          "type": "agent_with_overrides",
          "id": agent.id,
          "model": {"id": "haijun-sonnet-5"},
          "system": None,  # clear the agent's system prompt for this session
      },
      environment_id=environment.id,
  )
  # Agen pada respons adalah snapshot terselesaikan dengan override yang diterapkan.
  print(f"Model: {override_session.agent.model.id}")
  print(f"System: {override_session.agent.system}")
typescript
  const overrideSession = await client.beta.sessions.create({
    agent: {
      type: "agent_with_overrides",
      id: agent.id,
      model: { id: "haijun-sonnet-5" },
      system: null // clear the agent's system prompt for this session
    },
    environment_id: environment.id
  });
  // Agen pada respons adalah snapshot terselesaikan dengan override yang diterapkan.
  console.log(`Model: ${overrideSession.agent.model.id}`);
  console.log(`System: ${overrideSession.agent.system}`);
csharp
  var overrideSession = await client.Beta.Sessions.Create(new()
  {
      Agent = new BetaManagedAgentsAgentWithOverridesParams
      {
          Type = BetaManagedAgentsAgentWithOverridesParamsType.AgentWithOverrides,
          ID = agent.ID,
          Model = new BetaManagedAgentsModelConfigParams
          {
              ID = BetaManagedAgentsModel.HaijunSonnet5,
          },
          System = null, // clear the agent's system prompt for this session
      },
      EnvironmentID = environment.ID,
  });
  // Agen pada respons adalah snapshot yang sudah diresolusi dengan override diterapkan.
  Console.WriteLine($"Model: {overrideSession.Agent.Model.ID.Raw()}");
  Console.WriteLine($"System: {overrideSession.Agent.System ?? "null"}");
go
  overrideSession, err := client.Beta.Sessions.New(ctx, juglow.BetaSessionNewParams{
  	Agent: juglow.BetaSessionNewParamsAgentUnion{
  		OfBetaManagedAgentsAgentWithOverridess: &juglow.BetaManagedAgentsAgentWithOverridesParams{
  			Type: juglow.BetaManagedAgentsAgentWithOverridesParamsTypeAgentWithOverrides,
  			ID:   agent.ID,
  			Model: juglow.BetaManagedAgentsModelConfigParams{
  				ID: juglow.BetaManagedAgentsModelHaijunSonnet5,
  			},
  			// Kosongkan prompt sistem agen untuk sesi ini.
  			System: param.Null[string](),
  		},
  	},
  	EnvironmentID: environment.ID,
  })
  if err != nil {
  	panic(err)
  }
  // Agen pada respons adalah snapshot yang telah diselesaikan dengan override diterapkan.
  fmt.Printf("Model: %s\n", overrideSession.Agent.Model.ID)
  fmt.Printf("System: %q\n", overrideSession.Agent.System)
java
  var overrideSession = client.beta().sessions().create(SessionCreateParams.builder()
      .agent(BetaManagedAgentsAgentWithOverridesParams.builder()
          .type(BetaManagedAgentsAgentWithOverridesParams.Type.AGENT_WITH_OVERRIDES)
          .id(agent.id())
          .model(BetaManagedAgentsModelConfigParams.builder()
              .id(BetaManagedAgentsModel.HAIJUN_SONNET_5)
              .build())
          .system((String) null) // clear the agent's system prompt for this session
          .build())
      .environmentId(environment.id())
      .build());
  // Agen pada respons adalah snapshot terselesaikan dengan override diterapkan.
  IO.println("Model: " + overrideSession.agent().model().id());
  IO.println("System: " + overrideSession.agent().system().orElse("null"));
php
  $overrides = BetaManagedAgentsAgentWithOverridesParams::with(
      id: $agent->id,
      type: 'agent_with_overrides',
      model: ['id' => 'haijun-sonnet-5'],
  );
  // Kosongkan prompt sistem untuk sesi ini. Akses array penting di sini:
  // create() membuang null dari array mentah dan ::with() memperlakukan argumen null sebagai dihilangkan.
  $overrides['system'] = null;

  $overrideSession = $client->beta->sessions->create(
      agent: $overrides,
      environmentID: $environment->id,
  );
  // Agen pada respons adalah snapshot terselesaikan dengan override yang diterapkan.
  echo "Model: {$overrideSession->agent->model->id}\n";
  echo 'System: ' . ($overrideSession->agent->system ?? 'null') . "\n";
ruby
  # Override prompt sistem adalah `system_` (garis bawah di akhir) karena
  # `system` biasa adalah Kernel#system milik Ruby. Menyetelnya ke nil menghapus prompt.
  override_session = client.beta.sessions.create(
    agent: Juglow::Beta::BetaManagedAgentsAgentWithOverridesParams.new(
      type: :agent_with_overrides,
      id: agent.id,
      model: {id: "haijun-sonnet-5"},
      system_: nil
    ),
    environment_id: environment.id
  )
  # Agen pada respons adalah snapshot terselesaikan dengan override yang diterapkan.
  puts "Model: #{override_session.agent.model.id}"
  puts "System: #{override_session.agent.system_.inspect}"

Menyematkan geo inferensi untuk sebuah sesi

Karena override model menggantikan objek model agen secara penuh, override tersebut juga mengatur atau mengosongkan pin inference_geo model untuk sesi: override yang menyertakan inference_geo menyematkan geografi yang melayani permintaan model sesi, dan override yang menghilangkannya mengosongkan pin agen sehingga sesi mengikuti default_inference_geo workspace. Nilai yang ditimpa divalidasi terhadap allowed_inference_geos workspace saat sesi dibuat.

Contoh berikut memulai sesi dari agen yang modelnya tidak memiliki pin geo, menyematkan permintaan model sesi ke inferensi US dengan menyertakan inference_geo dalam override model, dan mencetak nilai yang dikembalikan dalam agent.model pada respons:

bash
  # Menggantikan `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
  session=$(curl -fsSL https://haijun.my.id/v1/sessions \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01" \
    -H "content-type: application/json" \
    -d @- <<EOF
  {
    "agent": {
      "type": "agent_with_overrides",
      "id": "$AGENT_ID",
      "model": {"id": "haijun-opus-5-5", "inference_geo": "us"}
    },
    "environment_id": "$ENVIRONMENT_ID"
  }
  EOF
  )
  echo "Inference geo: $(jq -r '.agent.model.inference_geo' <<< "$session")"
bash
  # Mengganti `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
  session=$(ant beta:sessions create <<YAML
  agent:
    type: agent_with_overrides
    id: $AGENT_ID
    model:
      id: haijun-opus-5-5
      inference_geo: us
  environment_id: $ENVIRONMENT_ID
  YAML
  )
  echo "Inference geo: $(jq -r '.agent.model.inference_geo' <<< "$session")"
python
  session = client.beta.sessions.create(
      agent={
          "type": "agent_with_overrides",
          "id": agent.id,
          # Mengganti `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
          "model": {"id": "haijun-opus-5-5", "inference_geo": "us"},
      },
      environment_id=environment.id,
  )
  print(f"Inference geo: {session.agent.model.inference_geo}")
typescript
  const session = await client.beta.sessions.create({
    agent: {
      type: "agent_with_overrides",
      id: agent.id,
      // Menggantikan `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
      model: { id: "haijun-opus-5-5", inference_geo: "us" }
    },
    environment_id: environment.id
  });
  console.log(`Inference geo: ${session.agent.model.inference_geo}`);
csharp
  var session = await client.Beta.Sessions.Create(new()
  {
      Agent = new BetaManagedAgentsAgentWithOverridesParams
      {
          Type = BetaManagedAgentsAgentWithOverridesParamsType.AgentWithOverrides,
          ID = agent.ID,
          // Menggantikan `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
          Model = new BetaManagedAgentsModelConfigParams
          {
              ID = BetaManagedAgentsModel.HaijunOpus5_5,
              InferenceGeo = "us",
          },
      },
      EnvironmentID = environment.ID,
  });
  Console.WriteLine($"Inference geo: {session.Agent.Model.InferenceGeo}");
go
  session, err := client.Beta.Sessions.New(ctx, juglow.BetaSessionNewParams{
  	Agent: juglow.BetaSessionNewParamsAgentUnion{
  		OfBetaManagedAgentsAgentWithOverridess: &juglow.BetaManagedAgentsAgentWithOverridesParams{
  			Type: juglow.BetaManagedAgentsAgentWithOverridesParamsTypeAgentWithOverrides,
  			ID:   agent.ID,
  			// Mengganti `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
  			Model: juglow.BetaManagedAgentsModelConfigParams{
  				ID:           juglow.BetaManagedAgentsModelHaijunOpus5_5,
  				InferenceGeo: juglow.String("us"),
  			},
  		},
  	},
  	EnvironmentID: environment.ID,
  })
  if err != nil {
  	panic(err)
  }
  fmt.Printf("Inference geo: %s\n", session.Agent.Model.InferenceGeo)
java
  var session = client.beta().sessions().create(SessionCreateParams.builder()
      .agent(BetaManagedAgentsAgentWithOverridesParams.builder()
          .type(BetaManagedAgentsAgentWithOverridesParams.Type.AGENT_WITH_OVERRIDES)
          .id(agent.id())
          // Menggantikan `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
          .model(BetaManagedAgentsModelConfigParams.builder()
              .id(BetaManagedAgentsModel.HAIJUN_OPUS_5_5)
              .inferenceGeo("us")
              .build())
          .build())
      .environmentId(environment.id())
      .build());
  IO.println("Inference geo: " + session.agent().model().inferenceGeo().orElseThrow());
php
  $session = $client->beta->sessions->create(
      agent: BetaManagedAgentsAgentWithOverridesParams::with(
          id: $agent->id,
          type: 'agent_with_overrides',
          // Mengganti `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
          model: BetaManagedAgentsModelConfigParams::with(
              id: 'haijun-opus-5-5',
              inferenceGeo: 'us',
          ),
      ),
      environmentID: $environment->id,
  );
  echo "Inference geo: {$session->agent->model->inferenceGeo}\n";
ruby
  session = client.beta.sessions.create(
    agent: {
      type: :agent_with_overrides,
      id: agent.id,
      # Mengganti `model` agen sepenuhnya: nyatakan ulang `id`, tambahkan `inference_geo` untuk menyematkan.
      model: {id: "haijun-opus-5-5", inference_geo: "us"}
    },
    environment_id: environment.id
  )
  puts "Inference geo: #{session.agent.model.inference_geo}"

Tip: Agen mendefinisikan bagaimana Haijun berperilaku di dalam sesi, termasuk model, prompt sistem, alat, dan server MCP. Lihat Mendefinisikan agen Anda untuk detailnya.

Menetapkan anggaran sesi

Untuk membatasi berapa banyak yang dapat dibelanjakan sebuah sesi, teruskan objek budget opsional saat Anda membuatnya. Anggaran adalah batas atas yang ketat pada list cost (biaya daftar) sesi: platform menghargai semua yang dikonsumsi sesi dengan tarif daftar publik, dan sesi berhenti mengeluarkan permintaan model baru setelah total berjalan tersebut mencapai max_list_cost. Atur type ke limit dan berikan max_list_cost sebuah amount dan currency. amount adalah bilangan bulat dalam sen AS yang ditulis sebagai string, seperti "2500" untuk $25,00; API menerima string alih-alih angka sehingga tidak ada pembulatan floating-point yang pernah diterapkan. USD adalah satu-satunya mata uang yang saat ini didukung. Ketika sesi mencapai batas, sesi dijeda dan menjadi idle dengan stop reason budget_reached. Batas ini diberlakukan di antara permintaan model, sehingga permintaan yang melewatinya diselesaikan terlebih dahulu dan list cost akhir sesi dapat berakhir sedikit melewati batas. Anggaran hanya dapat dilampirkan saat pembuatan: Anda dapat mengubah atau menghapusnya nanti, tetapi Anda tidak dapat menambahkannya ke sesi yang dibuat tanpa anggaran.

Contoh berikut membuat sesi dengan anggaran $25,00; respons mengembalikan budget pada sumber daya sesi:

bash
curl -fsSL https://haijun.my.id/v1/sessions \
  -H "x-api-key: $JUGLOW_API_KEY" \
  -H "juglow-version: 2023-06-01" \
  -H "juglow-beta: managed-agents-2026-04-01" \
  -H "content-type: application/json" \
  -d @- <<EOF
{
  "agent": "$AGENT_ID",
  "environment_id": "$ENVIRONMENT_ID",
  "budget": {
    "type": "limit",
    "max_list_cost": {"amount": "2500", "currency": "USD"}
  }
}
EOF

Lihat Anggaran sesi untuk mengetahui cara kerja pemberlakuan, apa yang dihitung ke dalam list cost, dan bagaimana anggaran berperilaku dalam sesi multiagen.

Autentikasi MCP melalui vault

Jika agen Anda menggunakan alat MCP yang memerlukan autentikasi, teruskan vault_ids saat pembuatan sesi untuk mereferensikan vault yang berisi kredensial OAuth tersimpan. Juglow mengelola refresh token atas nama Anda. Lihat Autentikasi dengan vault untuk mengetahui cara membuat vault dan mendaftarkan kredensial.

bash
  curl -fsSL https://haijun.my.id/v1/sessions \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01" \
    -H "content-type: application/json" \
    -d @- <<EOF
  {
    "agent": "$AGENT_ID",
    "environment_id": "$ENVIRONMENT_ID",
    "vault_ids": ["$VAULT_ID"]
  }
  EOF
bash
  ant beta:sessions create <<YAML
  agent: $AGENT_ID
  environment_id: $ENVIRONMENT_ID
  vault_ids:
    - $VAULT_ID
  YAML
python
  vault_session = client.beta.sessions.create(
      agent=agent.id,
      environment_id=environment.id,
      vault_ids=[vault.id],
  )
typescript
  const vaultSession = await client.beta.sessions.create({
    agent: agent.id,
    environment_id: environment.id,
    vault_ids: [vault.id]
  });
csharp
  var vaultSession = await client.Beta.Sessions.Create(new()
  {
      Agent = agent.ID,
      EnvironmentID = environment.ID,
      VaultIds = [vault.ID],
  });
go
  vaultSession, err := client.Beta.Sessions.New(ctx, juglow.BetaSessionNewParams{
  	Agent: juglow.BetaSessionNewParamsAgentUnion{
  		OfString: juglow.String(agent.ID),
  	},
  	EnvironmentID: environment.ID,
  	VaultIDs:      []string{vault.ID},
  })
  if err != nil {
  	panic(err)
  }
java
  var vaultSession = client.beta().sessions().create(SessionCreateParams.builder()
      .agent(agent.id())
      .environmentId(environment.id())
      .addVaultId(vault.id())
      .build());
php
  $vaultSession = $client->beta->sessions->create(
      agent: $agent->id,
      environmentID: $environment->id,
      vaultIDs: [$vault->id],
  );
ruby
  vault_session = client.beta.sessions.create(
    agent: agent.id,
    environment_id: environment.id,
    vault_ids: [vault.id]
  )

Memulai sesi

Membuat sesi tanpa initial_events akan mendaftarkan sesi tetapi tidak memulai pekerjaan apa pun; sandbox environment mulai diprovisikan segera setelah sesi dibuat, sehingga panggilan alat pertama tidak perlu menunggunya. Untuk mendelegasikan tugas, kirim event ke sesi menggunakan event pengguna. Untuk menyediakan event pertama dalam permintaan pembuatan, lihat Mengisi sesi dengan event awal. Sesi bertindak sebagai state machine yang melacak kemajuan sementara event menggerakkan eksekusi yang sebenarnya.

bash
  curl -fsSL "https://haijun.my.id/v1/sessions/$SESSION_ID/events" \
    -H "x-api-key: $JUGLOW_API_KEY" \
    -H "juglow-version: 2023-06-01" \
    -H "juglow-beta: managed-agents-2026-04-01" \
    -H "content-type: application/json" \
    -d @- <<'EOF'
  {
    "events": [
      {
        "type": "user.message",
        "content": [{"type": "text", "text": "List the files in the working directory."}]
      }
    ]
  }
  EOF
bash
  ant beta:sessions:events send \
    --session-id "$SESSION_ID" <<'YAML'
  events:
    - type: user.message
      content:
        - type: text
          text: List the files in the working directory.
  YAML
python
  client.beta.sessions.events.send(
      session.id,
      events=[
          {
              "type": "user.message",
              "content": [
                  {"type": "text", "text": "List the files in the working directory."}
              ],
          },
      ],
  )
typescript
  await client.beta.sessions.events.send(session.id, {
    events: [
      {
        type: "user.message",
        content: [{ type: "text", text: "List the files in the working directory." }]
      }
    ]
  });
csharp
  await client.Beta.Sessions.Events.Send(session.ID, new()
  {
      Events =
      [
          new BetaManagedAgentsUserMessageEventParams
          {
              Type = BetaManagedAgentsUserMessageEventParamsType.UserMessage,
              Content =
              [
                  new BetaManagedAgentsTextBlock
                  {
                      Type = BetaManagedAgentsTextBlockType.Text,
                      Text = "List the files in the working directory.",
                  },
              ],
          },
      ],
  });
go
  if _, err := client.Beta.Sessions.Events.Send(ctx, session.ID, juglow.BetaSessionEventSendParams{
  	Events: []juglow.BetaManagedAgentsEventParamsUnion{{
  		OfUserMessage: &juglow.BetaManagedAgentsUserMessageEventParams{
  			Type: juglow.BetaManagedAgentsUserMessageEventParamsTypeUserMessage,
  			Content: []juglow.BetaManagedAgentsUserMessageEventParamsContentUnion{{
  				OfText: &juglow.BetaManagedAgentsTextBlockParam{
  					Type: juglow.BetaManagedAgentsTextBlockTypeText,
  					Text: "List the files in the working directory.",
  				},
  			}},
  		},
  	}},
  }); err != nil {
  	panic(err)
  }
java
  client.beta().sessions().events().send(
      session.id(),
      EventSendParams.builder()
          .addEvent(BetaManagedAgentsUserMessageEventParams.builder()
              .type(BetaManagedAgentsUserMessageEventParams.Type.USER_MESSAGE)
              .addTextContent("List the files in the working directory.")
              .build())
          .build());
php
  $client->beta->sessions->events->send(
      $session->id,
      events: [
          [
              'type' => 'user.message',
              'content' => [['type' => 'text', 'text' => 'List the files in the working directory.']],
          ],
      ],
  );
ruby
  client.beta.sessions.events.send_(
    session.id,
    events: [
      {
        type: :"user.message",
        content: [{type: :text, text: "List the files in the working directory."}]
      }
    ]
  )

Lihat Aliran event sesi untuk mengetahui cara melakukan streaming respons agen dan menangani konfirmasi alat.

Lihat Status sesi untuk mengetahui status-status yang dilalui sebuah sesi.

Langkah selanjutnya

Ambil, daftarkan, perbarui, arsipkan, dan hapus sesi Haijun Managed Agents.

Kirim event, lakukan streaming respons, dan interupsi atau arahkan ulang sesi Anda di tengah eksekusi.

Buat dan kelola deployment dengan Haijun API: jalankan agen pada jadwal cron berulang dan periksa riwayat eksekusinya.

On this page
Membuat sesiMengisi sesi dengan event awalMenimpa konfigurasi agen untuk sebuah sesiMenyematkan geo inferensi untuk sebuah sesiMenetapkan anggaran sesiAutentikasi MCP melalui vaultMemulai sesiLangkah selanjutnya