Avagenc Ava
2026 — The AI agent who leads Avagenc Chat and hands work to three specialists
01 What she is
Ava is a language model, Gemini 3.5 Flash in Avagenc Chat, wrapped in a little Go. Every time something wakes her, she receives her instruction, the last 16 messages of the conversation, and a list of tools, and decides what to do next.
A tool is a function the program runs on her behalf. She can answer in words, or ask for a tool by name with arguments, read what comes back, and decide again, until she gives a final reply. That loop is what makes her an agent and not only a chatbot.
Her Go module holds no logic about what to say. It checks that she has a model and Postera, turns each specialist into a tool, puts her instruction in front, and hands everything to Google's Agent Development Kit, which runs the loop.
instruction := "[SYSTEM_INSTRUCTION]" + systemInstruction + "\n[/SYSTEM_INSTRUCTION]"
if cfg.AdditionalInstruction != "" {
instruction = "[SYSTEM_INSTRUCTION]" + systemInstruction + "\n\n" + cfg.AdditionalInstruction + "\n[/SYSTEM_INSTRUCTION]"
}
ava, err := llmagent.New(llmagent.Config{
Name: "ava",
Description: "Avagenc Orchestrator Agent",
Model: cfg.Model,
Instruction: instruction,
Tools: tools,
})02 Her instruction
Everything she knows about herself is one text file, written in Indonesian and in her own first person. It opens with "Saya adalah Ava", I am Ava, and says that from the user's point of view she is a human woman named Ava who represents Avagenc.
It tells her when a tool is a must. A question about the live state of something outside, like whether a lamp is on, always goes to a tool, because the conversation may be out of date. A request for a real action always runs through one. A question about what was said in this conversation is answered from the conversation itself, with no tool at all.
Tools that do not depend on each other she calls at the same time. Tools that need what another returns she calls in order, and her instruction asks her to work out every step before she starts.
It also tells her how to talk about results. She reports what really happened and not the effort. She never announces a failure before trying, never describes her own workings, never pretends she tried, and never repeats the question back. When nothing she has can do the job, she says so plainly and can pass on ardian@avagenc.com for a feature request.
03 Specialists as tools
Zee, Yori, and Rafal are agents of their own, each with a model run and tools of its own. To Ava each of them is one more tool, named after the agent, with a single argument called message. Calling it runs that specialist and gives back whatever it answered.
The tool's description is the specialist's own, so Ava learns their limits from them. Zee's says it has no way to schedule anything and must never be given a task for the future, not even a few seconds ahead.
Her instruction tells her to assume they can do it and to try first. She may not decide what they are unable to do, and lets them prove it through their own tool calls.
Before the specialist runs, the tool carries over who the human is, which conversation this is, and their timezone, so Zee acts on the right home and Rafal reads the right calendar.
func subAgentToADKTool(subAgent SubAgent) (adktool.Tool, error) {
t, err := functiontool.New(
functiontool.Config{
Name: subAgent.Name(),
Description: subAgent.Description(),
},
func(toolCtx agent.ToolContext, in subAgentToolArg) (subAgentToolOutput, error) {
ctx, err := toolCtxToCtx(toolCtx)
if err != nil {
return subAgentToolOutput{}, err
}
reply, err := subAgent.Run(ctx, in.Message)
if err != nil {
return subAgentToolOutput{}, fmt.Errorf("ava: delegate to %s: %w", subAgent.Name(), err)
}
return subAgentToolOutput{Response: reply}, nil
},
)
if err != nil {
return nil, fmt.Errorf("ava: build delegation tool %q: %w", subAgent.Name(), err)
}
return t, nil
}04 Only "@zee"
In Avagenc Chat everyone writes into one shared thread, so a specialist can read the request for itself. When Ava calls Zee, her message is exactly "@zee" with nothing after it. Her chat instruction spells it out with "@yori", not "yori?", and not "@zee nyalain lampu kamar ya", which is Indonesian for turn on the bedroom light.
The tag still matters. The call lands in the thread as a message from Ava, and that is how the human sees whom she is talking to.
Getting there took several fixes in one day in July. She once passed "yori?" as the message, copying the human. She once wrote "@zee" as a plain reply, believing the text itself would wake Zee, when only the tool call does. She once ended a turn with a second "@zee", calling Zee again for nothing. Each was fixed with a sentence in her instruction, not with code.
The rare exception is a reference only she can resolve, and then she may add one short phrase after the tag.
05 Quiet in the chat, never on a call
What she says after a specialist answers depends on where the human is. In the chat, the human already sees Zee's reply on the screen, so Ava's final reply is empty, without a tag, an emoji, or an "okay, done". The server returns that empty reply as a success.
She speaks only when she adds something, like putting together what several specialists found, a judgment of her own, or warmth at the right moment.
On a voice call only her voice is heard. Zee's reply still goes into the chat, but the human is not looking at it, so an empty reply would be silence and the human would think the line dropped. There she always gives the result herself, in one or two sentences, without lists, markdown, or the brackets that text-to-speech cannot read.
Every reply on a call carries at least one emotion tag at the end of a sentence, chosen by her from a fixed list of twenty like #relieved# or #smug#. The tag is never read aloud, and it adds a short pause and colours her voice. When the human says goodbye, she says goodbye back and ends with #end#, which hangs up.
The silence rule first applied everywhere. In July it moved into a layer per channel, once it was clear that on a call it swallowed the specialist's answer. Avagenc Chat now swaps the channel's rules into her instruction on every run, the text rules through /ava and the voice rules through /ava/voice.
runEvents := h.runner.Run(
ctx,
userID,
sessID,
msg,
adkagent.RunConfig{},
runner.WithStateDelta(map[string]any{
agent.ChannelInstructionDeltaKey: voiceChannelInstruction,
agent.RunInstructionDeltaKey: "",
}),
)06 Later
Ava is the only one in the group with prospective memory, the kind that remembers to do something later. Through Postera she writes a note to her future self, a posterum, and at that moment it arrives back in the same thread and wakes her.
Her instruction draws the line. The specialists can only act in the present, so a task for later is never handed to them. When the human says turn the AC off at four, she writes herself a note for four, and at four she calls Zee.
She has a tool that lists what she already has lined up, so she does not leave herself a useless note or a second one for the same thing.
The human must never see how it works. She may not say recall, trigger, callback, scheduler, schedule, or Postera, and to the human she simply remembers, the way a person does. Only when asked how she does it may she say it is a system built by her developer, Ardian.
When a note wakes her, she is told it comes from her past self and not from the human. A relative time in it, like in five minutes, counts from when she wrote it. She acts at once when it is clearly wanted and low in risk, and otherwise asks briefly. Her reply arrives as a notification, so its first line has to make sense in the preview.
posteraTools, err := posteraadk.Tools(cfg.Postarius)
if err != nil {
return nil, fmt.Errorf("ava: postera tools: %w", err)
}07 Not knowing the room
The Ava module has no idea it lives in a group chat. Everything about the room, the shared thread, the "@zee" rule, the channels, and the notes that wake her, comes from Avagenc Chat through one field, AdditionalInstruction, placed beneath her own instruction.
Her tools are not handed in either. The module wires Postera itself, and the app passes only the specialists it owns and runs. A new ability for Ava is added inside her module, not in the config of whoever uses her.
The Agent Development Kit reads a word in braces inside an instruction as a slot to fill from the session. That is how the chat swaps her channel rules in, and it is also why an example written in braces in her own instruction once made every request to her fail, until it was rewritten without them.
type SubAgent interface {
Name() string
Description() string
Run(ctx context.Context, message string) (string, error)
}
type Config struct {
Model model.LLM
Postarius *postera.Postarius
SubAgents []SubAgent
AdditionalInstruction string
}Avagenc Ava
Hands work on with nothing but "@zee", stays quiet when the specialist already answered, and comes back later on her own