Blok kode

Saat menentukan playbook, Anda dapat secara opsional memberikan blok kode, yang merupakan kode Python inline yang dapat digunakan untuk mengontrol perilaku agen dengan lebih baik. Kode ini terdiri dari fungsi dengan dekorator khusus dan fungsi utilitas apa pun yang Anda perlukan.

Saat menulis kode, Anda dapat menggunakan library sistem blok kode untuk mengontrol perilaku agen.

Masalah Umum

Masalah umum berikut berlaku:

  • Project dalam perimeter VPC-SC yang membatasi akses Artifact Registry juga akan menolak deployment Blok Kode

Batasan

Batasan berikut berlaku:

  • Blok kode tidak boleh berisi objek yang menyimpan data. Namun, Anda dapat menggunakan alat untuk mempertahankan data dan mempertahankan status.
  • Blok kode tidak dapat melakukan panggilan jarak jauh secara langsung. Misalnya, Anda tidak dapat menggunakan library permintaan Python. Namun, Anda dapat menggunakan alat untuk melakukan panggilan jarak jauh secara tidak langsung.
  • Nama resource yang dikonversi menjadi nama Python harus berupa nama Python yang valid.
  • Blok kode tidak dapat membaca atau menulis parameter sesi, kecuali jika terjadi transisi alur.

Tindakan Inline

Tindakan inline berperilaku mirip dengan tindakan alat. Fungsi ini memiliki skema input dan output yang ditentukan, yang ditentukan oleh tanda tangan fungsi Python, termasuk anotasi jenis dan docstring. Mirip dengan panggilan alat, LLM tidak mengetahui kode yang menerapkan tindakan.

Contoh:

@Action
def is_prime(n: int): bool
  """Returns true if n is prime."""
  import math
  return (all([False for i in range(2, math.sqrt(n)
               if n % i == 0 ]) and not n < 2)

Untuk fungsi ini, LLM akan diberi informasi tentang tindakan, input, dan outputnya.

Untuk mereferensikan tindakan inline dalam petunjuk playbook Anda, cukup referensikan nama tindakan dalam tanda petik terbalik dan jelaskan cara menggunakannya.

Contoh tindakan inline place_order:

Take the customer's order, then call the `place_order` action when the order is ready.

Untuk membuat contoh yang menggunakan tindakan inline, gunakan jenis alat inline-action di bagian Input & Output.

Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi @Action.

Memicu fungsi

Fungsi pemicu digunakan untuk menentukan tindakan bersyarat dalam kode.

Fungsi pemicu dideklarasikan menggunakan dekorator. Anda dapat menggunakan dekorator fungsi pemicu berikut:

Dekorator Parameter dekorator Deskripsi
@EventTrigger event: str, condition: str, dengan kondisi bersifat opsional Dipicu oleh peristiwa
@BeforeModelTrigger condition: str, dengan kondisi bersifat opsional Dipicu setiap kali sebelum LLM memprediksi tindakan berikutnya.
@BeforeActionTrigger condition: str, dengan kondisi bersifat opsional Dipicu setiap kali sebelum LLM menjalankan tindakan.
@BeforePlaybookTrigger condition: str, dengan kondisi bersifat opsional Dipicu saat playbook dimulai untuk pertama kalinya.

Misalnya, fungsi ini menunjukkan cara menggunakan decorator dan parameter decorator, serta cara menggunakan fungsi library sistem blok kode respond.

# No decorator parameter
@PlaybookStartTrigger
def my_playbook_conditional_action():
  respond("How can I help?")

# With a condition decorator parameter
@BeforeActionTrigger('$next-action.name = "search"')
def my_before_action_conditional_action():
  respond("One moment please")

# Event
@EventTrigger(event="welcome")
def my_welcome_event():
  respond("hi")

# Event with a condition:
@EventTrigger(event="welcome",
              condition="$sys.func.NOW().hours < 10")
def my_good_morning_event():
  respond("Good morning ☕")

Mereferensikan alur, playbook, dan alat

Dalam blok kode, Anda dapat mereferensikan alur, playbook, dan alat tertentu menggunakan variabel global flows, playbooks, dan tools.

Setiap objek ini memiliki anggota yang cocok dengan nama resource yang sesuai. Nama ini harus berupa nama Python yang valid.

Contoh:

  add_override(playbooks.troubleshooting, {})
  add_override(flows.billing)
  add_override(tools.weather_api.get_weather, {"location": "San Francisco"})

Saat mereferensikan alur dan playbook dalam blok kode, Anda juga harus mereferensikannya dalam petunjuk playbook dengan sintaksis berikut:

${RESOURCE_TYPE: my_resource_name}

Misalnya, jika blok kode Anda berisi flows.myflow dan playbooks.myplaybook, petunjuk playbook Anda harus menyertakan:

${FLOW: myflow}
${PLAYBOOK: myplaybook}

Penggantian tindakan

Anda dapat menggunakan blok kode untuk membuat antrean tindakan yang akan dilakukan sebelum tindakan lebih lanjut ditentukan oleh LLM, dan berpotensi menggantikannya. Anda membuat penggantian tindakan menggunakan fungsi global add_override.

Semua tindakan penggantian dalam antrean akan dieksekusi secara berurutan, dan output tindakan akan tersedia untuk LLM. Setelah antrean kosong, operasi kembali ke LLM untuk pemilihan tindakan dan input, kecuali jika penggantian mengakhiri giliran dengan respond atau fungsi lain yang menyelesaikan giliran.

Argumen fungsi:

  • tindakan: Tindakan yang akan dilakukan. Untuk tindakan inline, gunakan my_function_name. Untuk tindakan alat, gunakan tools.my_tool_name.my_tool_action. Untuk tindakan alur, gunakan flows.my_flow_name.
  • inputs: Input opsional untuk tindakan. Misalnya: {"location": "Omaha"}.

Contoh:

# Assuming remote tool named "dmv" with operationId "search_offices"
# remote tool with only requestBody
add_override(tools.dmv.search_offices,{"address": "95030"})

# remote tool with only parameters
add_override(tools.pets.get_pet, {"id": "123"})

# remote tool with requestBody + parameters:
add_override(tools.pets.create_pet, {"requestBody": {"arg1":"foo"}, "param1": "bar"})

# datastore. Assumes existing datastore tool named "Menu".
add_override(tools.menu.Menu, {"query": "what is the menu"})

# code block action. Assumes another code block @Action my_action.
add_override(my_action)

Penggantian respons

Mirip dengan penggantian tindakan, tetapi khusus untuk respons agen, Anda dapat menggunakan fungsi global respond untuk memaksa agen merespons pengguna dengan konten tertentu.

Contoh:

respond("Hello")

Alat panggilan

Dalam fungsi blok kode, Anda dapat memanggil alat yang ditentukan untuk agen Anda. Tidak seperti saat Anda mengganti tindakan alat, saat Anda memanggil alat secara langsung, hasil eksekusi alat tidak tersedia untuk LLM.

Contoh:

# Assumes existing tool named "DMV" with operationId "search_offices"
# remote tool with only request body.
offices = tools.dmv.search_offices({"address": "95030"})

# remote tool with parameters and request body
offices = tools.dmv.search_offices({"requestBody": {"address":"95030"}, "param1":"foo"})

# datastore actions. Assumes existing datastore tool named "Menu".
data = tools.menu.Menu({"query": "get the menu"})["snippets"]

Mencocokkan maksud

Blok kode dapat mencocokkan intent secara terprogram untuk alur tertentu menggunakan fungsi Flow.match_intent.

Contoh:

matches = flows.flow1.match_intent(history.last_user_utterance).matches
if matches and matches[0].intent == "some_intent":
  to_country = matches[0].parameters.get("to_country")
  if to_country:
    respond(f"To confirm, you're going to {to_country}, right?")

Proses Debug

Anda dapat menggunakan simulator untuk men-debug fungsi blok kode. Fungsi ini akan ditampilkan sebagai tindakan di simulator, dan akan memberikan detail kita sesuai kebutuhan.

Kontrol tambahan

Panduan ini membahas beberapa penggunaan umum library sistem blok kode. Untuk jenis kontrol tambahan, lihat dokumentasi library.