Host Functions
Give untrusted code a narrow set of host-backed functions it calls as plain JavaScript. Credentials stay in your process.
Untrusted code should never hold your database password or API key. A host function runs in your process with your credentials, and the guest only sees its inputs and outputs. This is what makes Code Mode useful: the model writes one program that chains your tools.
Define host functions
Host functions are a record of collections, keyed by name. Each function needs
only a Zod inputSchema and an execute handler; the keys name the collection
and the function, and .describe() on the schema documents it for the model.
Arguments from the guest are validated before your code runs.
hostFunctions is a VM option. Pass it on a call, or on createVm.
// Host functions run in your process, with your credentials. The guest only
// sees their inputs and outputs. The keys name the collection and the function,
// and `execute` receives the input its own schema describes.
const total = await evaluate<number>(generated, {
hostFunctions: {
orders: {
list: {
inputSchema: z
.object({ customer: z.string() })
.describe("List a customer's orders."),
execute: ({ customer }) => [
{ customer, amount: 40 },
{ customer, amount: 2 },
],
},
},
},
inputs: { customer: "customer_123" },
timeoutMs: 5_000,
output: { capture: "stderr" },
});
console.log(total.outcome === "succeeded" ? total.value : total.stderr); // 42
Call them from guest code
Inside the VM each collection is a global object and each function is async.
// Inside the VM each collection is a global, and each function is async. This
// is the code a model would write.
const generated = `(async () => {
const list = await orders.list({ customer: inputs.customer });
return list.reduce((sum, order) => sum + order.amount, 0);
})()`;
- Keys round-trip:
orderStore.listOrdersin your options isorderStore.listOrders(input)in the guest andagentos-order-store list-orderson the CLI. - Each function takes one input object and resolves to what your
executereturned. A schema violation, a thrown error, or a timeout rejects the promise. - The globals are frozen. A collection whose name is already a global, such as
process, is not defined, and a warning is written to stderr. - The
hostFunctionpermission scope gates which functions a guest may call. See permissions.
The same functions are also available to shell scripts and other languages as commands. Read the agentOS host functions reference for that, and for schemas, timeouts, and examples.