Agent → tool_call("search", {query: "weather london"}) → result
Agent → tool_call("search", {query: "weather tokyo"}) → result
Agent → tool_call("compare", {a: result1, b: result2}) → result
- Agent → tool_call("search", {query: "weather london"}) → natija
- Agent → tool_call("search", {query: "weather tokyo"}) → natija
- Agent → tool_call("compare", {a: natija1, b: natija2}) → natija
Ushbu usul har bir vosita uchun alohida model chaqiruvini talab qiladi, bu tezlik va xarajatlarni salbiy ta'sir qiladi. Monty-go bilan LLM bitta model chaqiruvida quyidagi Python kodini generatsiya qilishi mumkin:
london = search(query="weather london")
tokyo = search(query="weather tokyo")
compare(a=london, b=tokyo)
Ushbu kod ichida har bir search va compare funksiyalari Go tarafida e'lon qilinmonty-go tomonidan aniqlangan tashqi funksiya deb hisoblanadi. Monty-go kodni WASM ichida bajaradi, lekin har bir tashqi funksiya uchrashganda to'xtatadi, Go callback funksiyasi chaqiriladi, uning natiji monty-go ga qaytariladi va kod davom etadi. Natijada bitta model chaqiruvida marhamat bajariladi.
london = search(query="weather london")
tokyo = search(query="weather tokyo")
compare(a=london, b=tokyo)
Monty-go ishlash prinsipi
Monty-go ishlash siklini tushuntirish uchun asosiy komponentlarni ko‘rib chiqaylik:
- Runner – montygo.New() funksiyasi yordamida yaralanuvchi obyekt, WASM instansiyasini boshqaradi.
- Execute metodi – Python kodni, kirish parametrlarini va tashqi funksiya qo‘llab-quvvatlash sozlamalarini qabul qiladi.
- WithExternalFunc – Go funksiyalarini monty-go ga ulash, ularning nomini va argumentlarini belgilash.
- WithLimits – xotira, vaqt, rekursiya va allocation chegaralarini o‘rnatish, bu cheksiz siljik yoki xotira bombalari oldini oladi.
- WithPrintFunc – Pythonning
print() chiqishini Go tarafida yakunlash.
- WithOsCallFunc – fayl tizini yoki muhit murojaatlarini Go callback orqali filtrlash.
Misol: foydalanuvchi x * 2 + y ifodani hisoblashni xohlaydi. Kodni monty-go ga uzatish, x va y qiymatlarini map orqali uzatish, natija 25 qaytariladi. Buning ichida hech qanday tashqi funksiya chaqirilmaganligi tufayli, monty-go kodni WASM ichida to‘liq bajaradi va natijani qaytaradi.
package main
import (
"context"
"fmt"
"log"
montygo "github.com/fugue-labs/monty-go"
)
func main() {
runner, err := montygo.New()
if err != nil {
log.Fatal(err)
}
defer runner.Close()
result, err := runner.Execute(context.Background(),
"x * 2 + y",
map[string]any{"x": 10, "y": 5},
)
if err != nil {
log.Fatal(err)
}
fmt.Println(result) // 25
}
Tashqi funksiya bilan ishlashda monty-go quyidagicha harakat qiladi:
- Python kod ichida
get_weather("London") deb funksiya chaqiriladi.
- Monty-go bu chaqiruvni aniqlaydi, WASM bajarishini to'xtatadi.
- Go callback funksiyasi chaqiriladi, u shu yerda HTTP so‘rov yuborish, ma'lumotlar bazasidan o‘qish yoki istalgan amalni bajarishi mumkin.
- Callback natijani (masalan,
{ "city": "London", "temp": 22 }) monty-go ga qaytaradi.
- Monty-go natijani Python kodga o‘rnatib, bajarishni davom ettiradi.
Bu mekanizm LLM tomonidan yozilgan kodni Go funksiyalari bilan sekinliksiz, xavfsiz va predictable tarzda bog‘lashga imkon beradi.
result, err := runner.Execute(ctx,
`
london = get_weather("London")
tokyo = get_weather("Tokyo")
f"{london['city']}: {london['temp']}°C, {tokyo['city']}: {tokyo['temp']}°C"
`,
nil,
montygo.WithExternalFunc(func(ctx context.Context, call *montygo.FunctionCall) (any, error) {
city, _ := call.Args["city"].(string)
// Your real implementation here — HTTP call, database query, anything.
return map[string]any{"city": city, "temp": 22}, nil
}, montygo.Func("get_weather", "city")),
)
// result: "London: 22°C, Tokyo: 22°C"
Xavfsizlik cheklovlari
Monty-go, WASm sandboxining afzalliklarini foydalanib, bir necha darajadagi himoya taqdim etadi:
- Vaqt chegarasi –
MaxDuration parametri orqali kodning necha sekund ishlashi mumkinligini belgilash.
- Xotira chegarasi –
MaxMemoryBytes (masalan, 10 MB) orqali WASM instansiyasining foydalanishi mumkin bo‘lgan maksimal xotira ni cheklash.
- Allocation chegarasi –
MaxAllocations parametri orqali heap allocationlar soni chegarasini o‘rnatish.
- Rekursiya chegarasi –
MaxRecursionDepth orqali funksiya rekursiyasi chuqurligini cheklash.
Ushbu chegaralar cheksiz siljik, xotira bombalari yoki chuqur rekursiya hamda MontyError exceptionini tushurib, Go konteksti orqali bekor qilishni ham qo‘llab-quvvatlaydi. Agar context.Context bekor qilsa, WASM instansiyasi to‘xtatadi, bu resurs sarfini oldini oladi.
result, err := runner.Execute(ctx, code, nil,
montygo.WithExternalFunc(func(ctx context.Context, call *montygo.FunctionCall) (any, error) {
switch call.Name {
case "search":
return doSearch(call.Args)
case "calculate":
return doCalculate(call.Args)
case "store":
return doStore(call.Args)
default:
return nil, fmt.Errorf("unknown function: %s", call.Name)
}
},
montygo.Func("search", "query"),
montygo.Func("calculate", "expression"),
montygo.Func("store", "key", "value"),
),
)
Monty-go va Gollem integratsiyasi
Monty-go, Gollem agent frameworki bilan ham integratsiya qilinishi mumkin. Gollem, Go tilida yasashgan agentlar uchun tayyorlash vositalari, vosita chaqirishlari va tizim boshqaruvi funksiyalarini taqdim etadi. Monty-go yordamida Gollem ichida "code-mode" vositasi yarating:
- Go vositalari (search, calculate, store)
gollem.FuncTool yordamida e'lon qilinadi.
NewCodeModeTool funksiyasi monty-go runnerini va e'lon qilingan vositalarni qabul qilib, LLM tomonidan yozilgan Python kodini vositalarga ulatishni ta'minlaydi.
- Agent system promptida modelga beriladigan tushuntirishda, qaysi vositalar mavjud va ularni qanday chaqirish kerakligi ko‘rsatiladi.
Misol: agent "Q3 va Q4 daromadlarini solishtirish va o‘sish foizini hisoblash" topshirig‘ini bajarishi kerak. LLM quyidagi kodni yozadi:
result, err := runner.Execute(ctx, code, inputs,
montygo.WithLimits(montygo.Limits{
MaxDuration: 5 * time.Second,
MaxMemoryBytes: 10 * 1024 * 1024, // 10 MB
MaxAllocations: 100000,
MaxRecursionDepth: 100,
}),
)
q3 = search(query="Q3 revenue")
q4 = search(query="Q4 revenue")
growth = calculate(expression=f"({q4['revenue']} - {q3['revenue']}) / {q3['revenue']} * 100")
Monty-go bu kodni WASM ichida bajaradi, har bir search va calculate chaqiruvida to‘xtatadi, Go vositalarni chaqiradi, natijalarni Python kodga o‘rnatib, yakuniy natijani (q3, q4, growth) Gollem ichidagi typed output kanaliga qaytaradi. Bu jarayonda faqat bitta model chaqiruv talab qilinadi, vosita chaqirishlar soni kamayadi va agent tezroq javob beradi.
Xulosa
Monty-go — Bu LLM agentlar uchun vosita chaqirishlarini optimallashtirishga mo‘ljallangan yangilangan vosita. Pydanticning Monty Python interpreterini to’liq Go kodidan WASMga o‘tkazib, wazero yordamida Go dastur ichida yuklaydi. Bunday yondashuv CGO, konteyner yoki subprocess foydalanishini talab qilmasligi tufayli, dastur yig‘inchi ikkilik fayl sifatida tarqaladi, uning hajmi faqat 2,9 MB.
var output strings.Builder
_, err := runner.Execute(ctx, `print("step 1 done")`, nil,
montygo.WithPrintFunc(func(s string) { output.WriteString(s) }),
)
fmt.Print(output.String()) // "step 1 done\n"
Monty-go ning asosiy quvvatlari — tashqi funksiya chaqiruvlari кезida kodni to‘xtatish, Go callback orqali ularni bajarish, natijani qayta WASM ichida davom ettirish. Bu mekanizm LLM tomonidan yozilgan Python kodni Go vositalari bilan sekinliksiz, xavfsiz va predictable tarzda bog‘lashga imkon beradi. Qo‘shimcha xavfsizlik chegaralari (vaqt, xotira, allocation, rekursiya) cheksiz siljik yoki xotira bombalari oldini oladi, kontekst orqali bekor qilishni ham qo‘llab-quvvatlaydi.
Gollem bilan integratsiya, monty-go "code-mode" vositasini taqdim etadi, bu LLM bitta model chaqiruvida murakkab vosita ketma-ketliklarini Python kodicha ifodalashini, vositalarni Go tarafida bajarishini va natijani agentning typed output kanalida qaytarishini ta'minlaydi. Natijada agentlar tezroq, arzonroq va ishonchliroq ishlaydi, vosita chaqirishlar soni kamayadi va tizim yukki pasayadi.
Monty-go, LLM-agent ekosistemasida kodni vosita sifatida ishlatish paradigmasini o‘zgartirishi mumkin: vosita ketma-ket chaqirishlari o‘rniga, model bitta marta Python kod yozadi, shu kod vositalarni Go tarafida chaqiradi, monty-go esa buni xavfsiz WASM ichida bajaradi. Bu yondashuv, agentlarning murakkab topshiriqlarni bajarishida samarali va scalable yechim taqdim etadi.
Asl manba: github.com