AI Agent Tools
Reference and configuration cheat-sheet for the built-in tools an Appivo AI Agent can call
AI Agent Tools
A reference for the built-in tools an Appivo AI Agent can call, what each one does, and how to configure it in an agent's chain definition.
An AI Agent in Appivo runs an AIChain — a named pipeline of one or more steps driven by an LLM, optionally armed with a set of tools. A tool is a capability the model can decide to invoke mid-turn: search an index, read a web page, generate an image, remember a fact, query a knowledge dataset, and so on. The LLM sees each tool's name, description, and parameter schema, and calls it with arguments it fills in; the platform executes the tool and feeds the result back into the conversation.
Tools are declared in the tools array of the chain JSON. Each entry has a type discriminator that selects the tool class, plus tool-specific configuration. This page lists every built-in tool, the type value(s) that select it, its purpose, and its configuration properties.
How tools are declared
Tools live in the tools array of the chain definition. The type field selects the tool; everything else is configuration:
{
"name": "research-agent",
"version": 1,
"description": "Answers questions using the docs index and the web.",
"tools": [
{ "type": "SEARCH", "index": "product-docs", "limit": 8 },
{ "type": "webSearch" },
{ "type": "webGet" }
],
"steps": [
{ "name": "answer", "input": { "message": "$question" } }
]
}
Each type value is matched case-insensitively against the tool type enum, after a small set of friendly aliases are folded in (e.g. createImage → GENERATEIMAGE). Both the canonical enum name and the documented aliases work; see the quick reference for the exact set each tool accepts.
Which tool do I need?
Start from the outcome you want, not the tool list. Find the row that matches what the agent should do, then jump to its catalog entry for the configuration details.
| You want the agent to… | Reach for | type |
|---|---|---|
| Answer from your own indexed content (RAG) | Search | SEARCH |
| Look something up on the public web | Web Search | webSearch |
| Read one specific web page or URL | Web Get | webGet |
| Read a stored document (PDF, image, …) by ID | Document Get | documentGet |
| Condense a long document, page, or media file | Summary | summary |
| Ask exact, relational questions over structured data | Knowledge Query | knowledgeQuery |
| Draw a chart from data | Chart | createChart |
| Produce an Excel spreadsheet | Excel | createExcel |
| Create an image from a prompt | Generate Image | generateImage |
| Turn text into speech / audio | Generate Audio | tts |
| Create a video from a prompt | Generate Video | generateVideo |
| Do exact math, data wrangling, or run code | Execute Code | executeCode |
| Save a durable fact mid-conversation | Create Memory | rememberFact |
| Recall facts by meaning / topic | Recall by Topic | RECALL_BY_TOPIC |
| Recall everything about a person, org, or thing | Recall by Entity | RECALL_BY_ENTITY |
| See what was true over a time window | Recall Timeline | RECALL_TIMELINE |
| Run your own custom logic inline | Script | (omit type) |
Expose internal Java @Tool methods | Java | JAVA |
| Delegate to another named agent | Agent | AGENT |
One way to hold the whole catalog in your head: retrieval tools bring information in (Search, Web, Document, Knowledge), generation tools send rich artifacts out (Chart, Excel, Image, Audio, Video), memory tools persist context across conversations, and Script / Java / Agent let you extend or compose beyond the built-ins.
Properties every tool shares
Every tool inherits these base properties. Most are set automatically (the platform supplies a sensible default name, description, and parameter schema per tool), but you may override them in the JSON:
| Property | Type | Default | Notes |
|---|---|---|---|
name | String | tool-specific | The identifier the LLM calls. Must be unique within the chain. |
description | String | tool-specific | What the LLM reads to decide when to use the tool. Override to steer behaviour. |
timeout | Integer (seconds) | 60 | Max execution time. Only read for Script, Execute Code, Generate Image, Generate Audio, and Generate Video — every other tool ignores a JSON timeout and uses the 60s default. The media/code tools also set higher defaults of their own (see each entry). |
interactive | Boolean | false | Whether the tool requires user interaction before it can run. Only honored for Script tools. |
The arguments (parameter schema) and required (list of required parameter names) properties also exist on the base class but are only authored by hand for Script tools — built-in tools define their own parameter schema in code.
Configuration vs. call-time parameters
Two distinct things are easy to confuse:
- Configuration properties — set by you in the chain JSON. They are fixed for the life of the agent (which index to search, which image provider to use, the timeout).
- Call-time parameters — filled in by the LLM each time it invokes the tool (the search query, the image prompt, the fact to remember). You don't set these; they're listed here so you know what the model controls.
Each tool below documents both.
Minimal config cheat-sheet
Every tool's smallest valid declaration, ready to paste into the tools array. The Common knobs column lists the optional properties you'll reach for most often; the full set lives in the catalog.
| Tool | Minimal declaration | Common knobs |
|---|---|---|
| Search | { "type": "SEARCH", "index": "my-index" } | limit, minScore, type |
| Web Search | { "type": "webSearch" } | — |
| Web Get | { "type": "webGet" } | useSimpleFetch |
| Document Get | { "type": "documentGet" } | model |
| Summary | { "type": "summary" } | model, targetSummaryWords, instructions |
| Chart | { "type": "createChart" } | — |
| Excel | { "type": "createExcel" } | — |
| Generate Image | { "type": "generateImage" } | provider, model, size / aspectRatio |
| Generate Audio | { "type": "tts" } | provider, voice, format |
| Generate Video | { "type": "generateVideo" } | provider, model, duration |
| Execute Code | { "type": "executeCode" } | timeout, instructions |
| Create Memory | { "type": "rememberFact" } | memorySpaceId |
| Recall by Topic | { "type": "RECALL_BY_TOPIC" } | memorySpaceId |
| Recall by Entity | { "type": "RECALL_BY_ENTITY" } | memorySpaceId |
| Recall Timeline | { "type": "RECALL_TIMELINE" } | memorySpaceId |
| Knowledge Query | { "type": "knowledgeQuery" } | — |
| Java | { "type": "JAVA", "class": "com.acme.MathTools" } | — |
| Agent | { "type": "AGENT", "agent": "invoice-extractor" } | name, description |
| Script | { "name": "my_tool", "script": "return {…};" } | arguments, required, description |
Only four tools need any configuration to work: Search (
index), Java (class), Agent (agent), and Script (name+script). Every other tool runs with just itstype— all remaining properties have sensible defaults.
Tool catalog
Custom tools: Script, Java, Agent
These three aren't fixed capabilities — they're how you extend an agent with your own logic or compose agents together.
Script — inline JavaScript tool
Define an ad-hoc tool whose body is JavaScript you write directly in the chain. Selected when type is omitted (null) or "SCRIPT". This is the one tool where you author the full parameter schema yourself.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
name | String | — | Yes | Tool name. |
script | String | — | Yes | JavaScript source executed when the tool is called. |
description | String | — | No | Description shown to the LLM. |
arguments | Object | — | No | JSON-schema-style map describing the tool's parameters. |
required | ArrayString | [] | No | Names of required parameters. |
timeout | Integer | 60 | No | Execution timeout in seconds. |
interactive | Boolean | false | No | Whether user interaction is required. |
A Script tool is only added to the chain if both
nameandscriptare present.
{
"name": "celsius_to_fahrenheit",
"description": "Convert a Celsius temperature to Fahrenheit.",
"arguments": {
"celsius": { "type": "number", "description": "Temperature in °C" }
},
"required": ["celsius"],
"script": "return { fahrenheit: input.celsius * 9 / 5 + 32 };"
}
Java — reflective internal tool
Loads a Java class and exposes its annotated methods as tools via reflection (langchain4j ToolSpecifications). For platform/internal use.
| Property | Type | Required | Description |
|---|---|---|---|
type | String | Yes | "JAVA". |
class | String | Yes | Fully-qualified class name to load. Every @Tool method on it becomes a callable tool. |
{ "type": "JAVA", "class": "com.acme.MathTools" }
Agent — call another agent as a tool
Invoke another named AI Agent as a sub-tool, enabling hierarchical composition (a supervisor agent that delegates to specialists). The sub-agent's input parameters become the tool's call-time parameters automatically.
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
type | String | — | Yes | "AGENT". |
agent | String | — | Yes | Name of the agent to invoke. |
name | String | the agent's name | No | Override the tool name. |
description | String | the agent's description | No | Override the tool description. |
{ "type": "AGENT", "agent": "invoice-extractor",
"description": "Extract structured fields from an invoice document." }
Retrieval & web
Search — SEARCH
Search a configured Appivo search index (vector and/or BM25 keyword) and return ranked documents. The agent's primary RAG retrieval tool.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
index | String | — | Yes | Name of the index to search. |
limit | Integer | 5 | No | Max results returned. |
minScore | Double | 0.7 | No | Minimum relevance score to include a hit. |
candidates | Integer | 100 | No | Number of candidates evaluated before ranking. |
type | String | both | No | Search mode: vector, text, or both. |
queryDescription | String (variable) | built-in | No | Overrides the description the LLM sees for the query parameter. Must be a $variable reference bound to a step input (its runtime value becomes the description); a literal value is ignored. |
name / description | String | SearchForDocuments / built-in | No | Standard overrides. |
Call-time parameters: query (String, required).
{ "type": "SEARCH", "index": "support-kb",
"limit": 8, "minScore": 0.6, "type": "both" }
Web Search — WEBSEARCH / webSearch
Search the public internet and return ranked results (title, URL, snippet). No configuration beyond the standard name/description.
Call-time parameters: query (required), optional startDate / endDate (ISO-8601 YYYY-MM-DD) to bound results by date.
{ "type": "webSearch" }
Web Get — WEBGET / webGet
Download and read a web page from a URL. By default it runs the content through the web scraper and extracts the main text (stripping boilerplate); set useSimpleFetch for a raw HTTP fetch.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
useSimpleFetch | Boolean | false | No | Use a plain HTTP GET instead of the scraper. |
name / description | String | ReadWebPage / built-in | No | Standard overrides. |
Call-time parameters: url (required), extract_text (Boolean, default true).
{ "type": "webGet", "useSimpleFetch": false }
Documents & summarization
Document Get — DOCUMENTGET / documentGet
Read the full contents of a stored document by ID or checksum, extracting text from PDFs, images, and other formats.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
model | String | null | No | Document model name to read from. |
name / description | String | ReadDocument / built-in | No | Standard overrides. |
Call-time parameters: id (required) — document ID or checksum.
{ "type": "documentGet" }
Summary — SUMMARY / summary
Produce a concise summary of a document, web page, image, audio, or video file. Large inputs are chunked and summarized with the configured LLM model.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
model | String | null | No | LLM model used for summarization. |
instructions | String | null | No | Custom guidance for the summarizer. |
maxTokens | Integer | 4096 | No | Max output tokens. |
chunkSize | Integer | 200000 | No | Chunk size in characters (~80K tokens). |
temperature | Double | 0.2 | No | LLM sampling temperature (0.0–1.0). |
targetSummaryWords | Integer | null | No | Target length of the final summary, in words. |
name / description | String | SummarizeDocument / built-in | No | Standard overrides. |
Call-time parameters: file-id (required).
{ "type": "summary", "model": "gpt-4o-mini",
"targetSummaryWords": 200, "temperature": 0.2 }
Content generation
These tools create rich artifacts (charts, spreadsheets, images, audio, video) that the agent can return as embeddable resources.
Chart — CHART / createChart
Render a chart from structured data. No configuration beyond name/description; the chart type, data, and layout are supplied by the LLM at call time.
Call-time parameters: chartType (BAR, STACKED_BAR, LINE, AREA, PIE, SCATTER, BUBBLE), config ({title, width, height, xAxisTitle?, yAxisTitle?, showLegend}), and datasets ([{name, dataPoints:[{x, y, z?}]}]).
{ "type": "createChart" }
Excel — EXCEL / createExcel
Generate an Excel spreadsheet from structured data, with optional sum rows for numeric columns. No configuration beyond name/description.
Call-time parameters: columns ([{headerName, dataType, shouldSum}], required), rowData (array of row arrays, required), optional title and description.
{ "type": "createExcel" }
Generate Image — GENERATEIMAGE / generateImage / createImage
Generate an image from a text prompt. Supports OpenAI (DALL·E / gpt-image), Google Vertex AI Imagen, and OpenRouter (Flux, Stable Diffusion).
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
provider | String | OPENROUTER | No | OPENAI, GOOGLE, or OPENROUTER. |
model | String | provider-specific | No | Model name. |
size | String | 1024x1024 | No | Output dimensions. |
quality | String | auto | No | auto, high, medium, low, standard, hd. |
style | String | vivid | No | vivid or natural (DALL·E only). |
aspectRatio | String | 1:1 | No | Aspect ratio (Google Imagen). |
instructions | String | null | No | Text prepended to every prompt. |
timeout | Integer | 120 | No | Timeout in seconds. |
name / description | String | GenerateImage / built-in | No | Standard overrides. |
Call-time parameters: prompt (required), optional size and quality overrides.
{ "type": "generateImage", "provider": "GOOGLE",
"model": "imagen-4.0", "aspectRatio": "16:9" }
Generate Audio — GENERATEAUDIO / generateAudio / createAudio / textToSpeech / tts
Text-to-speech generation. Supports OpenAI TTS, Google Cloud TTS, and ElevenLabs.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
provider | String | OPENAI | No | OPENAI, GOOGLE, or ELEVENLABS. |
model | String | provider-specific | No | Model name. |
voice | String | provider-specific | No | Voice identifier. |
format | String | mp3 | No | mp3, opus, aac, flac, wav, pcm. |
speed | Double | 1.0 | No | Speech speed multiplier (0.25–4.0). |
languageCode | String | en-US | No | Language code (Google TTS). |
instructions | String | null | No | Extra context for the TTS model. |
timeout | Integer | 120 | No | Timeout in seconds. |
name / description | String | GenerateAudio / built-in | No | Standard overrides. |
Call-time parameters: text (required), optional voice, speed, format overrides.
{ "type": "tts", "provider": "ELEVENLABS",
"voice": "Rachel", "format": "mp3" }
Generate Video — GENERATEVIDEO / generateVideo / createVideo
Generate a video from a text prompt. Supports Google Veo, OpenAI Sora, and Replicate.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
provider | String | GOOGLE | No | GOOGLE, OPENAI, or REPLICATE. |
model | String | provider-specific | No | Model name. |
aspectRatio | String | 16:9 | No | 16:9, 9:16, or 1:1. |
duration | Integer | 6 | No | Duration in seconds. |
resolution | String | 1080p | No | 720p or 1080p. |
includeAudio | Boolean | true | No | Whether to include audio. |
instructions | String | null | No | Text prepended to every prompt. |
timeout | Integer | 300 | No | Timeout in seconds. |
name / description | String | GenerateVideo / built-in | No | Standard overrides. |
Call-time parameters: prompt (required), optional duration, aspectRatio, resolution overrides.
{ "type": "generateVideo", "provider": "GOOGLE",
"model": "veo-3.0-fast", "duration": 8, "resolution": "1080p" }
Code execution
Execute Code — EXECUTECODE / executeCode / codeExecution / codeInterpreter
Run JavaScript in a secure GraalVM sandbox with no access to host resources. Lets the agent do precise calculations, data transformations, and programmatic work it can't reliably do in plain text.
Configuration
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
language | String | JAVASCRIPT | No | Execution language. |
timeout | Integer | 30 | No | Execution timeout in seconds. |
instructions | String | null | No | Extra guidance for code generation. |
allowConsole | Boolean | true | No | Whether console.log output is captured. |
maxOutputLength | Long | 100000 | No | Max captured output length, in bytes. |
name / description | String | ExecuteCode / built-in | No | Standard overrides. |
Call-time parameters: code (required), optional description.
{ "type": "executeCode", "timeout": 15, "allowConsole": true }
Long-term memory
These tools connect the agent to the Appivo AI Memory platform. All four extend a shared base and accept one configuration property:
| Property | Type | Default | Required | Description |
|---|---|---|---|---|
memorySpaceId | String | null | No | The memory space to read/write. A literal ID, or "$paramName" to bind it to a step input variable at runtime. Literal wins over variable. |
When omitted, the tools operate against the agent's default memory space for the current tenant and user. See the AI Memory guide for the memory model (atoms, spaces, entities, bi-temporal validity).
Create Memory — CREATE_MEMORY / createMemory / rememberFact / remember
Save a single, self-contained fact to long-term memory so it can be recalled later. Lets the agent commit durable information (preferences, decisions, constraints, identity facts) mid-conversation instead of waiting for post-conversation extraction.
Call-time parameters: text (required — one complete sentence), category (required — preference, goal, identity, fact, rule, or episode), importance (1–5, default 3), entities (optional [{name, type?, role?}]).
{ "type": "rememberFact" }
Recall by Topic — RECALL_BY_TOPIC
Recall memories semantically related to a free-text query, using vector search over memory atoms.
Call-time parameters: query (required), limit (default 10, max 50).
{ "type": "RECALL_BY_TOPIC", "memorySpaceId": "$spaceId" }
Recall by Entity — RECALL_BY_ENTITY
List every memory atom tagged with a specific entity (person, organization, place, object, concept, event, agreement), newest first, with bi-temporal validity windows.
Call-time parameters: entityIdOrName (required — UUID or canonical name), limit (default 10, max 50).
{ "type": "RECALL_BY_ENTITY" }
Recall Timeline — RECALL_TIMELINE
Recall what was true within a time window using bi-temporal versioning — including superseded atoms — to track what changed and when.
Call-time parameters: entityIdOrName or query (at least one required), optional from / to (ISO-8601 validFrom bounds, inclusive), limit (default 10, max 50).
{ "type": "RECALL_TIMELINE" }
Discriminator note: the three recall tools have no camelCase aliases — use the exact enum names (
RECALL_BY_TOPIC,RECALL_BY_ENTITY,RECALL_TIMELINE). Create Memory does accept the friendly aliases listed above.
Knowledge datasets
A single tool queries structured knowledge datasets (entities, attributes, relationships) under access control, so an agent only sees data it's permitted to. It takes no special configuration beyond name/description — the dataset and scope are passed at call time.
The schema is embedded — the agent doesn't have to discover it. Any agent that carries the knowledge tool automatically gets the dataset schema injected into its system prompt: the entity types with their attributes and dedup keys, the relationship graph (
relType: fromType -> toType, with theout/indirection convention), and each type's taxonomy facets. The model therefore already knows the exactentityType, attribute,relType, anddirectionnames to use, and does not need a separate discovery step before querying.
Knowledge Query — KNOWLEDGE_QUERY / knowledgeQuery
Run a structured query against a knowledge dataset: select entities of a type, look one up by name, filter by attributes, traverse relationships (1–2 hops), and optionally aggregate. Results are always filtered to what the current user is permitted to read — you can't widen that from the tool config.
Call-time parameters: datasetId (required), spec (required — see below), folderIds (optional — scope visibility to specific folders/documents; the record-level ACL still applies).
spec shape (a JSON object; may be passed as a nested object or a JSON string):
| Key | Meaning |
|---|---|
entityType | (required) the configured type to select. |
name | Exact canonical-name lookup for a single entity. This is the only way to look up an entity by name. As a convenience, a where clause of {attr:"name"|"canonicalName", op:"eq", value} on a type that has no name attribute is folded into this filter automatically. |
where | Attribute predicates: a list of {attr, op, value | min | max}. Each attr must be a configured attribute of the type. |
traverse | 1–2 relationship hops: a list of {relType, direction: out|in, as, optional, name, where}. Each hop follows edges of relType to the configured neighbor type and nests the neighbors under as; per-hop name/where filter those neighbors. |
aggregate | Terminal reduce: {op: count | group_by | distinct, attr, over}. |
limit, offset | Pagination (result cap is 500). |
Traversal is a filter by default (inner join). Only roots that have a surviving neighbor are returned — e.g. to answer "who worked in Marketing", select person and traverse the person→industry relationship filtered to the neighbor named Marketing. Set optional: true on a hop to keep every root and just attach whatever neighbors it has (left join). More than two hops is rejected.
Aggregates. count counts the matched roots. group_by / distinct run over the root's own attribute when over is omitted, or over the neighbors reached by the hop whose as equals over (use attr: "canonicalName" to group/dedup by the neighbor's name). A distinct (or group_by) aggregate is also how an agent discovers valid filter values — it returns an attribute's distinct values, access-filtered to the current user — e.g. {"entityType":"person","aggregate":{"op":"distinct","attr":"department"}}.
{ "type": "knowledgeQuery" }
Removed: the
knowledgeVocabulary/KNOWLEDGE_VOCABULARYagent tool. Discovering distinct values is now done withknowledgeQuery'sdistinct/group_byaggregate (same access model), and taxonomy facets are part of the embedded schema described above. The developer JS APIcontext.getKnowledge().vocabulary(...)is unaffected and still works from Actions — only the agent tool was retired. See the Knowledge guide.
Discriminator quick reference
The type value is matched case-insensitively against the enum after the aliases below are applied. The canonical column is always safe; aliases are conveniences.
| Tool | Canonical type | Accepted aliases |
|---|---|---|
| Script | SCRIPT | (omit type) |
| Java | JAVA | — |
| Agent | AGENT | — |
| Search | SEARCH | — |
| Web Search | WEBSEARCH | webSearch |
| Web Get | WEBGET | webGet |
| Document Get | DOCUMENTGET | documentGet |
| Summary | SUMMARY | summary |
| Chart | CHART | createChart |
| Excel | EXCEL | createExcel |
| Generate Image | GENERATEIMAGE | generateImage, createImage |
| Generate Audio | GENERATEAUDIO | generateAudio, createAudio, textToSpeech, tts |
| Generate Video | GENERATEVIDEO | generateVideo, createVideo |
| Execute Code | EXECUTECODE | executeCode, codeExecution, codeInterpreter |
| Create Memory | CREATE_MEMORY | createMemory, rememberFact, remember |
| Recall by Topic | RECALL_BY_TOPIC | — |
| Recall by Entity | RECALL_BY_ENTITY | — |
| Recall Timeline | RECALL_TIMELINE | — |
| Knowledge Query | KNOWLEDGE_QUERY | knowledgeQuery |
Common pitfalls & tips
A short list of things that trip people up.
- Give the step enough cycles. A tool call plus a final answer is at least two model turns, so a step that uses tools needs
maxCycles≥ 2 — and more if you expect several tool calls in a row. The worked examples below use6–8. timeoutis only honored by some tools. A JSONtimeoutis read for Script, Execute Code, Generate Image, Generate Audio, and Generate Video only — every other tool ignores it and uses the 60s default. Execute Code defaults to30s and the media generators default higher (image120, audio120, video300); raise those for heavy work.- Search returning too little?
minScoredefaults to0.7, which is fairly strict — lower it (e.g.0.6) or raiselimitif relevant hits are being filtered out. - Keep tool names unique.
namemust be unique within the chain. If you add two tools of the same type, overridenameon at least one of them. memorySpaceId: literal vs. variable. Pass a literal ID to pin the space, or"$paramName"to bind it to a step input at runtime. If both are somehow set, the literal wins. Omit it to use the tenant/user default space.- Mind the alias gaps. The three recall tools have no camelCase aliases — use the exact enum names (
RECALL_BY_TOPIC,RECALL_BY_ENTITY,RECALL_TIMELINE). And a Script tool is only registered when bothnameandscriptare present. - Scoping is automatic. Knowledge and memory tools only ever see data the current tenant and user are permitted to see — you can't widen that from the tool config.
- Script parameters arrive on
input. Inside a Script body, read each call-time parameter asinput.<name>(e.g.input.celsius), matching the schema you declared inarguments.
Worked examples
Support assistant — retrieval, memory, and a chart
A support agent that searches the knowledge base, can read a linked web page, remembers customer preferences it learns, and can draw a chart of ticket trends:
{
"name": "support-assistant",
"version": 1,
"description": "Answers support questions and remembers customer context.",
"input": {
"message": { "type": "string" },
"spaceId": { "type": "string" }
},
"tools": [
{ "type": "SEARCH", "index": "support-kb", "limit": 8, "minScore": 0.6 },
{ "type": "webGet" },
{ "type": "rememberFact", "memorySpaceId": "$spaceId" },
{ "type": "RECALL_BY_TOPIC", "memorySpaceId": "$spaceId" },
{ "type": "createChart" }
],
"steps": [
{
"name": "respond",
"maxCycles": 6,
"input": { "message": "$message" }
}
]
}
Report builder — compute, then render artifacts
An agent that crunches raw figures with code, then returns a chart, a spreadsheet, and a short written summary — pure generation, no retrieval:
{
"name": "report-builder",
"version": 1,
"description": "Turns raw figures into a chart, a spreadsheet, and a summary.",
"tools": [
{ "type": "executeCode", "timeout": 20 },
{ "type": "createChart" },
{ "type": "createExcel" },
{ "type": "summary", "targetSummaryWords": 150 }
],
"steps": [
{ "name": "build", "maxCycles": 8, "input": { "message": "$message" } }
]
}
Knowledge analyst — exact answers with memory
An agent that issues structured queries for exact relational answers over a knowledge dataset, and remembers what the user cares about for next time. It already knows the dataset schema (that's injected into its system prompt), and discovers concrete filter values with a distinct aggregate when it needs them:
{
"name": "knowledge-analyst",
"version": 1,
"description": "Answers exact, relational questions over a knowledge dataset.",
"input": {
"message": { "type": "string" },
"spaceId": { "type": "string" }
},
"tools": [
{ "type": "knowledgeQuery" },
{ "type": "rememberFact", "memorySpaceId": "$spaceId" },
{ "type": "RECALL_BY_ENTITY", "memorySpaceId": "$spaceId" }
],
"steps": [
{ "name": "analyze", "maxCycles": 6, "input": { "message": "$message" } }
]
}
In every case the LLM decides which tools to call and in what order at runtime; the platform executes each call, enforces tenant/user scoping and access control, and feeds results back until the step completes.