Every message you send kicks off a request that bundles your active skills, the tools available at that point in the conversation, and your conversation history — the LLM uses that to decide what to say and which tools to call. Skills and tools work together but do different jobs: tools give the AI capability, while skills give it judgment about when and why to use it.
How the AI works
Your message
API Request
system All active skills concatenated into one cached block
tools Only the tools the request needs right now: a small always-on set, plus any capability groups already activated in this conversation
messages Conversation history
LLM Decides
Skills tell it when and why to act
Tool descriptions tell it how
→ Text response shown to you
→ Tool calls executed by the app
Tool Execution
Read tools → auto-executed
Mutation tools → you approve/reject
Results sent back to LLM · Loop continues until done
Tools vs Skills
Tool | Skill | |
What | A function the AI can call | Markdown instructions in the system prompt |
Gives the AI | Capability — "here is a function and its parameters" | Judgment — "when to use it, why, and what to watch out for" |
Defined in | Code (tools.ts) — wrappers around Giraffe SDK RPC functions. If a tool isn't available in the core set, the AI can call any Giraffe SDK function directly via invoke_rpc / get_state, and look up docs first via fetch_docs. | Markdown (.md files) — editable in Settings. Create your own or modify the built-in core skills. |
Togglable | Not by hand — most tools activate automatically in groups the first time a request needs them | Yes — toggle off to remove from prompt and save tokens |
Example | updateUsages({ usages: {...} }) | "Only call updateUsages when user says 'assumptions'. For buildings, use updateSections." |
Capability gating
Most tools sit behind a one-time activation call instead of loading into every request from the start. Before the AI can call a tool like getLayers or updateUsages, it first calls a meta-tool for that tool's group, such as use_layers or use_usages. Once a group is activated, it stays activated for the rest of the conversation.
A small set of tools skips this step and is available from your very first message: flyTo, getMapLocation, queryJSON, create_artifact, get_state, invoke_rpc, web_search, and web_fetch.
This keeps each request lean. Asking about layers doesn't pull in the parcel search or analytics tools, so a request only carries the tool definitions it's actually likely to use.
Watch this happen turn by turn. Turn on Show prompt inspector in the status bar (see Getting started with aiChat) to see exactly which tools were sent with a given request.
Available tools
Tools are functions the AI can call. It reads the tool name and description to decide which one to use. Skills provide the behavioral guidance for when and why.
Group | Tools | Activated by |
Always available |
| No activation needed |
Layers |
|
|
Sections |
|
|
Usage Types |
|
|
Flows |
|
|
Parcels |
|
|
Giraffe Analytics |
|
|
Content Library |
|
|
SDK Docs |
|
|