gizai:agent
an agent is a model, its instructions, typed tools and the conversation so far. run streams one answer: the model writes, calls tools (the calls of one turn run at once), reads their results and writes again, until it answers or a limit ends the run. ask<T> asks for a record T and gives a T. A tool is a plain function of a record: its JSON Schema comes from the record's declaration and docs (Memory.describe), and its arguments are read as that record (Json.decode), so no schema is written by hand. A model is one function that streams a turn: endpoint is any OpenAI-compatible API (gizlang:hub), and a test gives a scripted one.
import * as Agent from "gizai:agent";Types
Call
type Call = Hub.CallA tool call the model made: its id, the tool, and its arguments (a JSON object's text).
Message
type Message = { role: string; text: string; reasoning: string; calls: Vec<Call>; call: string; details: Vec<string>; images?: Vec<string>; }One message of the conversation: "user", "assistant" (its text, reasoning, the calls it made and the provider's
reasoning details that continue it) or "tool" (the result text of the call call).
role:stringtext:stringreasoning:stringcalls:Vec<gizlang_hub.Call>call:stringdetails:Vec<string>images:_gizlang_sdk_core.Option<Vec<string>>— The pictures the person showed with a "user" message, as data URLs (data:image/png;base64,...).
Piece
type Piece = { kind: string; text: string; call: Call; }What a run shows as it goes: "text" and "reasoning" as the model writes them, "call" when it calls a tool (call:
its name and JSON input), "result" or "failed" with the tool's answer, and at the end "done" with the answer or
"error" with why the run failed, or "stopped" with the text written when stop ended it.
kind:stringtext:stringcall:gizlang_hub.Call
Request
type Request = { instructions: string; messages: Vec<Message>; tools: Vec<JsonValue>; answer: bool; }What the model is asked for one turn: the instructions, the conversation, the tools (OpenAI function objects),
and answer: write, do not call a tool.
instructions:stringmessages:Vec<M19.Message>tools:Vec<gizlang_json.Json>answer:bool
Turn
type Turn = { text: string; reasoning: string; calls: Vec<Call>; details: Vec<string>; tokens: i64; input: i64; window: i64; }One turn of the model: its text, reasoning, tool calls and reasoning details, the tokens it wrote and read, and the model's context window in tokens (0: unknown).
text:stringreasoning:stringcalls:Vec<gizlang_hub.Call>details:Vec<string>tokens:i64input:i64window:i64
Model
type Model = { name: string; turn: (sys: System, r: Request, each: (p: Piece) => bool) => Result<Turn, string>; }A model: its name and the function that writes a turn, giving each text or reasoning piece to each as it comes
(a false from each stops the turn).
name:stringturn:(sys: gizlang_system.System, r: M19.Request, each: (p: M19.Piece) => bool) => _gizlang_sdk_core.Result<M19.Turn, string>
Tool
type Tool = { name: string; description: string; parameters: JsonValue; readOnly: bool; run: (arguments: string) => Result<string, string>; }A tool: its name, what it does, the JSON Schema of its input, whether it only reads (a call of it runs without
approve), and the function that runs it on its arguments' text and answers JSON text.
name:stringdescription:stringparameters:gizlang_json.JsonreadOnly:boolrun:(arguments: string) => _gizlang_sdk_core.Result<string, string>
Agent
type Agent = { model: Model; instructions: string; tools: Vec<Tool>; history: Vec<Message>; rounds: i64; maxTokens: i64; maxMs: i64; stop: () => bool; approve: (c: Call) => bool; tokens: i64; input: i64; context: i64; window: i64; }An agent: the model, its instructions and tools, the conversation so far (each run adds to it), its limits (tool
rounds of one run; tokens written and milliseconds of one run, 0: none), the tokens its runs wrote and read, how
many tokens the conversation holds after the last turn (context) of the model's window (window, 0: unknown), and
what a person does to a running agent: stop, asked between pieces and between rounds (true ends the run, keeping
what was written, with a "stopped" piece), and approve, asked before each tool call runs (it may wait for the
person; false gives the model DECLINED as the result).
model:M19.Modelinstructions:stringtools:Vec<M19.Tool>history:Vec<M19.Message>rounds:i64maxTokens:i64maxMs:i64stop:() => boolapprove:(c: gizlang_hub.Call) => booltokens:i64input:i64context:i64window:i64
Attachment
type Attachment = { name: string; type: string; path: string; }A file the person gives with a message: its name, its media type (image/png, application/pdf, text/csv...) and where it is on this computer. A picture goes to the model as a picture; a document's text (a PDF's words, a text file) joins the message, and a long one is read in parts with the tool read_file.
name:stringtype:stringpath:string
Functions
agent
function agent(model: Model, instructions: string, tools: Vec<Tool>): AgentAn agent of model with instructions and tools, an empty conversation and at most 16 tool rounds a run.
tool
function tool<I, O>(name: string, run: (input: I) => Result<O, string>): ToolThe tool name that runs run on its input record I and answers O as JSON. Its description is I's doc comment
and each field's doc describes that field. run is a function (input: I): O throws string; what it throws goes
back to the model as the tool's error.
schema
function schema<T>(): JsonValueThe JSON Schema of the record or union T, from its declaration.
run
function run(sys: System, a: mut Agent, prompt: string, each?: (p: Piece) => void, files: Vec<Attachment> = []): string throws stringAsks the agent prompt with the attached files (Attachment) and gives its answer, after the tool calls it makes;
each piece goes to each as it comes.
The prompt and every message of the run join a.history.
Effects: fail, read, write, console, io.
ask
function ask<T>(sys: System, a: mut Agent, prompt: string, each?: (p: Piece) => void): T throws stringAsks the agent prompt for a record T: the model answers by calling the tool answer with a T, which is read and
checked as T. An answer that does not read as T goes back to the model as the error of its call.
title
function title(sys: System, model: Model, first: string): string throws stringA short title for a conversation that begins with first, for a list of conversations: one turn of model, no
tools, its first line without quotes, at most 60 characters.
Effects: fail, read, write, console, io.
endpoint
function endpoint(sys: System, model: string = ""): Model throws stringThe model model (by default AI_MODEL) of the OpenAI-compatible API of AI_URL and AI_API_KEY (gizlang:hub's
modelApi: OpenRouter when AI_URL is unset; vLLM, Ollama, llama.cpp or giz ai serve by AI_URL).
Effects: fail, write, io.
served
function served(name: string, id: string, window: i64, api: (s: System) => Result<Hub.ModelApi, string>): ModelModel id of the API that api gives at each turn, shown as name; window is its context window (-1: read
from the API at the first turn). The API is taken per turn because its key may expire (a sign-in's token): a key
that cannot be had fails that turn with why, and the next turn tries again.
Effects: fail, write.
windowOf
function windowOf(api: Hub.ModelApi, name: string): i64The context window of model name as the API api lists it (GET /models, asked once a model); 0 when it does not
say or does not answer, which only leaves the window unknown.
Effects: fail, read, write, console, io.
streamed
function streamed(api: Hub.ModelApi, name: string, window: i64, r: Request, each: (p: Piece) => bool): Result<Turn, string>One turn of r from model name of the API api, streamed; window is the model's context window (0: unknown).
Effects: fail, read, write, console, io.
scripted
function scripted(turns: Vec<Turn>): ModelA model that gives turns in order, one a request, each text in pieces of at most 4 bytes. For tests and
examples that need no GPU and no network.
Effects: fail, write.
says
function says(text: string): TurnA scripted turn that says text.
calls
function calls(named: Vec<Call>): TurnA scripted turn that calls calls (each a tool name and its arguments' JSON text), with ids call_0, call_1...
Constants
ANSWER
const ANSWER = "answer"The name of the tool that ask adds: its input is the record asked for.
DECLINED
const DECLINED = "The person declined this call."What a declined call gives the model as its result.
READ_FILE
const READ_FILE = "read_file"The name of the tool that reads a long document in parts.