---
title: "Bunraku"
description: "让模型写一小段程序去循环和过滤，40 个文件里找 3 处，上下文里只出现那 3 处——循环交给程序，人只看结果。"
---

> Documentation Index
> Fetch the complete documentation index at: https://colmugx.github.io/cetas/llms.txt
> Use this file to discover all available pages before exploring further.

# Bunraku

## 40 个文件里找 3 处，不该付 40 个文件的钱

普通的 agent 找引用是一条一条读。40 次工具调用、40 段结果全部记进上下文，哪怕你要的只是其中 3 处。钱照付，窗口照占。

`run_code` 换了个方向。模型写一小段 MoonBit 程序，程序自己去循环、自己过滤，只把那 3 处带回对话：

```moonbit
let hits = []
for path in paths {
  match ctx.call("grep", {"pattern": "OldAuth", "path": path}) {
    {"error": _, ..} => ()
    result => hits.push({ "path": path, "hit": result })
  }
}
{ "count": hits.length(), "hits": hits }
```

中间结果活在程序里，不进上下文，也就不进账单。这不是压缩，那些内容从头到尾没有产生过。

## 模型写的代码，凭什么放心跑

程序跑在 Wasm 沙箱里，文件系统、网络、进程访问全部拒绝。它唯一能做的是调用你允许的工具，列表之外是一句明确的报错，不会悄悄放行。

程序是编译执行的。类型错误在运行前就是编译错误，作为有上限的诊断（8K 字符）交还给模型自己修。

返回值有大小上限，程序能被取消。一个写歪的循环不会变成一次账单事故。


## 什么时候别用它

两三个工具调用的事，直接调更快，它的收益从循环和过滤开始。嵌套调用目前是串行的，需要并发请求时别用它。

Source: https://colmugx.github.io/cetas/features/bunraku/index.mdx
