Tugas 2: Tambah Tools (Aksi Bisnis)¶
Target: mengeksekusi aksi nyata dengan aman lewat konfirmasi, retry, dan timeout.
Step 0: Tentukan Batas Tool¶
Gunakan tool untuk aksi yang punya efek samping (booking, pembayaran, tiket), bukan untuk reasoning murni. Ini membuat perilaku LLM lebih deterministik dan mudah diaudit.
Peta Sistem¶
flowchart LR
Caller((Caller))
Transport[Transport]
STT[STT]
LLM[LLM]
Confirm[Gerbang Konfirmasi]
Dispatcher[Tool Dispatcher]
Registry[Tool Registry]
External[Sistem Eksternal]
TTS[TTS]
Caller --> Transport --> STT --> LLM
LLM --> Confirm --> Dispatcher --> Registry --> External
External --> Registry --> Dispatcher --> LLM
LLM --> TTS --> Transport --> Caller
Step 1: Definisikan Skema Tool¶
llm.Tool{
Name: "schedule_visit",
Description: "Schedule a technician visit.",
RequiresConfirmation: true,
ConfirmationPromptByLanguage: map[string]string{
"id": "Sebelum saya jadwalkan kunjungan, apakah Anda ingin saya lanjutkan?",
"en": "Before I schedule the visit, do you want me to proceed?",
},
Schema: map[string]any{
"type": "object",
"properties": map[string]any{
"location": map[string]any{"type": "string"},
"preferred_time": map[string]any{"type": "string"},
},
"required": []string{"location", "preferred_time"},
},
}
Kenapa: skema memaksa input terstruktur sehingga LLM tidak menebak-nebak parameter.
Step 2: Implement llm.ToolRegistry¶
type HVACTools struct{}
func (t *HVACTools) Tools() []llm.Tool {
return []llm.Tool{ /* tool definitions */ }
}
func (t *HVACTools) HandleTool(name string, args map[string]any) (string, error) {
switch name {
case "schedule_visit":
// panggil sistem kamu, lalu kembalikan ringkasan singkat untuk LLM
return "visit scheduled for Tue 10am, confirmation id ABC123", nil
default:
return "", fmt.Errorf("unknown tool: %s", name)
}
}
Return value akan masuk ke konteks LLM, jadi harus singkat dan faktual.
Step 3: Pasang Tools ke Engine¶
tools := &HVACTools{}
engine := ranya.NewEngine(ranya.EngineOptions{
Config: cfg,
Tools: tools,
})
Step 4: Konfigurasi Safety Defaults¶
tools:
timeout_ms: 6000
retries: 1
retry_backoff_ms: 200
serialize_by_stream: true
confirmation:
mode: "llm"
llm_fallback: true
timeout_ms: 600
Kenapa: eksekusi harus terukur dan konfirmasi jelas sebelum ada efek samping.
Step 5: Ajarkan LLM Kapan Memanggil Tool¶
Update base_prompt untuk menyebut tool dan field wajibnya. Tanpa ini, tool sering tidak dipanggil.
Step 6: Validasi di Call¶
Pastikan terlihat:
tool_callcontrol frame.tool_resultsystem frame.- Prompt konfirmasi sebelum eksekusi.
Perbaikan Umum¶
- Tool tidak jalan: nama tool tidak cocok atau prompt tidak menyebut tool.
- Konfirmasi berulang: user tidak jelas, aktifkan
confirmation.llm_fallback. - Timeout: naikkan
tools.timeout_msatau optimalkan handler.