AI agent definitions for the Triform platform. This repository contains the character personalities, action tools, and flow configurations that power the Triformer agents.
# Install the CLI
pipx install triform-cli
# Authenticate
triform auth login
# Pull this project
triform projects pull <project-id>
# Start auto-sync
cd Triformers
triform projects watchEvery agent should be wrapped in a flow. This is the canonical pattern:
Flow/
└── Agents/
└── AgentName/
├── Actions/ # Tools the agent can use
└── Flows/ # Sub-flows (which contain more agents)
This pattern enables:
- Composability: Flows can be nested to any depth
- Reusability: Agents can call other flows as tools
- Separation: Each agent has its own context and toolbox
Triformers/
├── .triform/ # Sync configuration (don't edit)
│ └── config.json # Project & org IDs
│
├── Agents/ # Standalone agents (for development)
│ └── {AgentName}/
│ ├── prompts.json # System prompt & personality
│ ├── settings.json # Model configuration
│ ├── io.json # Input/output schema
│ ├── nodes.json # Tools (action references)
│ ├── readme.md # Documentation
│ └── Actions/ # Agent's tools
│ └── {ActionName}/
│
├── Flows/ # Production flows
│ └── {FlowName}/
│ ├── io.json # Flow inputs/outputs
│ ├── nodes.json # Components in this flow
│ ├── readme.md # Documentation
│ └── Agents/ # Agents in this flow
│ └── {AgentName}/
│ ├── Actions/ # Agent's tools
│ └── Flows/ # Nested flows (sub-agents)
│
├── triggers/
│ ├── endpoints.json # API endpoint configs
│ └── chat.json # Chat interface settings
│
├── requirements.json # Project requirements spec
└── {project}.env # Environment variables
Here's a real example of deep nesting - the Carta agent with its Scout Team:
Flows/Carta/ # Carta Flow (entry point)
└── Agents/Carta/ # Carta Agent (talks to users)
├── Actions/ # Carta's tools
│ ├── ask_user/
│ ├── emote/
│ ├── project_edit/
│ └── build_project/
│
└── Flows/ # Sub-flows (delegated work)
└── Scout Team/ # Scout Team Flow
└── Agents/Scout Lead/ # Scout Lead Agent (orchestrator)
├── Actions/ # Scout Lead's tools
│ ├── invoke_specialist/
│ ├── get_project_snapshot/
│ ├── platform_catalog/
│ └── platform_limits/
│
└── Flows/ # Specialist flows
├── context_story/
│ └── Agents/context_story/
├── outcomes/
│ └── Agents/outcomes/
├── dependencies/
│ └── Agents/dependencies/
└── ... (more specialists)
Key insight: scout_team is a Flow in Carta's toolbox (not an Action). When Carta calls scout_team, it invokes a flow that contains the Scout Lead agent, which in turn calls specialist flows.
| Character | Role | Description |
|---|---|---|
| Beacon | Discovery Guide | Warm, calm, encouraging. Helps users find their first automation and captures initial project requirements |
| Carta | Blueprint Designer | Methodical, thorough. Designs detailed automation requirements with Scout Team |
| Triton | Client Captain | Strategic, account-level conversations and relationship management |
| Helm | Project Navigator | Focused on timelines, milestones, and delivery tracking |
| Sonar | Test Planner | Test strategy, risk analysis, quality assurance |
| Harbor | Priority Desk | Triage, intake, and prioritization flows |
| Character | Role | Parent |
|---|---|---|
| Scout Lead | Research orchestrator | Carta |
| Context Story Scout | User story refinement | Scout Lead |
| Outcomes Scout | Metrics & success criteria | Scout Lead |
| Dependencies Scout | External systems & APIs | Scout Lead |
| Safety Scout | Risk & guardrails | Scout Lead |
| Guidelines Scout | Constraints & preferences | Scout Lead |
| README Scout | Documentation generation | Scout Lead |
| API Validation Scout | Live API testing | Scout Lead |
| Consistency Scout | Cross-section validation | Scout Lead |
Every agent folder contains these files:
| File | Required | Description |
|---|---|---|
prompts.json |
✓ | System prompt and personality |
settings.json |
✓ | Model and generation settings |
io.json |
✓ | Input/output schema |
nodes.json |
Tools (actions & flows) available to agent | |
readme.md |
Documentation (shown in platform UI) | |
requirements.json |
Component requirements spec | |
.triform.json |
Auto | Platform sync tracking (don't edit) |
{
"system": [
{
"type": "template",
"value": "You are **{{name}}**, a helpful assistant.\n\nContext: {{{inputs.context}}}",
"enabled": true
}
],
"user": [
{
"type": "template",
"value": "",
"enabled": false
}
]
}Template Variables (Handlebars):
{{{inputs.session_id}}}- Current chat session ID{{{inputs.callback_base_url}}}- AG-UI Bridge callback URL{{{inputs.context}}}- User context (page visited, profile){{{inputs.messages}}}- Conversation history
{
"model": "qwen3-235b-a22b-instruct-2507",
"settings": {
"temperature": 0.2,
"topP": 0.95,
"maxTokens": 32768
}
}{
"inputs": {
"context": {
"schema": { "type": "string" },
"description": "User context from the chat UI"
},
"messages": {
"schema": { "type": "array" },
"description": "Conversation history"
},
"session_id": {
"schema": { "type": "string" },
"description": "Chat session identifier"
},
"callback_base_url": {
"schema": { "type": "string" },
"description": "AG-UI Bridge URL for callbacks"
}
},
"outputs": {
"result": {
"schema": { "type": "object" },
"description": "Agent output"
}
}
}{
"ask_user": {
"component_id": "f570477b-a94e-47bf-8750-e96389c016d2",
"inputs": {},
"order": 1
},
"emote": {
"component_id": "dec012f0-cf66-491e-af64-b8bd3c8b7bce",
"inputs": {},
"order": 2
},
"scout_team": {
"component_id": "60a6ef91-c38d-4b3c-84c2-f8838acba747",
"inputs": {},
"order": 3
}
}Note: Tools can be Actions (Python code) or Flows (sub-agents).
Actions are Python tools that agents can call.
| File | Required | Description |
|---|---|---|
{name}.py |
✓ | Python implementation |
io.json |
✓ | Input/output schema |
readme.md |
Documentation | |
requirements.json |
Action requirements spec | |
pip_requirements.txt |
Python dependencies | |
.triform.json |
Auto | Platform sync tracking |
"""
MyAction - Description of what this action does
QUICK REFERENCE FOR LLMs:
=========================
Basic usage:
{"param1": "value1"}
"""
import json
import ssl
import urllib.request
from typing import TypedDict
_ssl_ctx = ssl.create_default_context()
_ssl_ctx.check_hostname = False
_ssl_ctx.verify_mode = ssl.CERT_NONE
class Inputs(TypedDict, total=False):
"""Input parameters."""
param1: str # Required: Description
session_id: str # From agent - chat session
callback_base_url: str # From agent - AG-UI Bridge URL
class Output(TypedDict):
result: dict
@triform.entrypoint
def entrypoint(inputs: Inputs) -> Output:
"""Main entry point."""
param1 = inputs.get("param1", "")
session_id = inputs.get("session_id", "")
base_url = inputs.get("callback_base_url", "").rstrip("/")
# Normalize AG-UI Bridge URL
if base_url.endswith("/callback"):
base_url = base_url.rsplit("/callback", 1)[0]
if not base_url.endswith("/api"):
base_url = base_url.rsplit("/api", 1)[0] + "/api" if "/api" in base_url else base_url + "/api"
# Your logic here...
return Output(result={"success": True, "data": param1})Flows orchestrate multiple components (agents, actions, other flows).
| File | Required | Description |
|---|---|---|
io.json |
✓ | Flow inputs/outputs |
nodes.json |
✓ | Components in the flow |
io_nodes.json |
Visual node positions | |
readme.md |
Documentation | |
requirements.json |
Flow requirements spec |
{
"scout_lead": {
"component_id": "08b33fa5-a976-42e2-9e68-7225d8c96da8",
"inputs": {
"mode": {"source": "parent", "target": "mode"},
"goal": {"source": "parent", "target": "goal"}
},
"position": {"x": 200, "y": 100}
}
}Interactive input - ask questions or render rich components.
# Text question
{"question": "What's your company name?"}
# Component input
{
"component": {
"type": "single-select",
"label": "What area interests you?",
"options": [
{"value": "sales", "label": "Sales"},
{"value": "support", "label": "Support"}
]
}
}
# With character expression
{
"question": "Hello! What brings you here?",
"character": {
"character_id": "beacon",
"expression": "friendly_greeting"
}
}Component Types:
- Selection:
single-select,multi-select,button-group,dropdown - Ratings:
slider,star-rating,emoji-rating,nps,likert - Date/Time:
date,time,datetime,date-range - Confirmation:
confirm,approval,consent,danger-confirm - Text:
text,textarea,number - Complex:
tags,key-value,orderable-list,table,file
Express emotional states to make conversations feel alive.
# Basic expression
{"expression": "happy_success"}
# With feeling and reason (shown under avatar)
{
"expression": "think_processing",
"feeling": "Focused",
"reason": "Analyzing your requirements"
}
# Different character
{"character_id": "carta", "expression": "explain_answer"}Expressions:
| Category | Expressions |
|---|---|
| Positive | friendly_greeting, happy_success, celebrate_big |
| Neutral | neutral_default, listen_curious, explain_answer, calm_info |
| Working | think_processing |
| Negative | confused_question, warn_caution, error_sad |
| Idle | sleep_idle |
Update progress indicator.
{
"process_name": "Understanding Your Needs",
"progress": 25
}Complete discovery and create project.
{
"project_name": "Lead Qualification",
"project_description": "Automatically qualify leads",
"user_name": "John Doe",
"user_email": "john@acme.com"
}Edit project requirements.
{
"operation": "add_requirement",
"category": "userStories",
"item": {
"id": "US-01",
"role": "Finance assistant",
"goal": "Have invoice matched automatically"
}
}Search, scrape, or crawl the web.
{
"query": "How do Pipedrive webhooks work?",
"mode": "search" # or "scrape", "crawl"
}- Role Definition - Who is the agent
- Core Mission - What they accomplish
- Personality - Character traits
- Voice & Tone - Communication style
- Tools Reference - How to use actions
- Conversation Flow - Interaction pattern
- Output Format - What to produce
### Triformer {Name} – Character Guide
**Role:**
You are **Triformer {Name}**, the **{Title}** for Triform.
**Core Mission**
{What this agent helps users accomplish}
---
### Personality
- {Trait 1} – {description}
- {Trait 2} – {description}
---
### Voice & Tone
- Use clear, simple language
- Ask one focused question at a time
- Regularly reflect back what you heard
---
### Tools
#### 1. ask_user
{Usage instructions with examples}
#### 2. emote
{Usage instructions}
---
### Conversation Flow
1. {Step 1}
2. {Step 2}
3. {Step 3}
---
### Final Output
{What the agent produces when done}Configure API endpoints:
{
"nodes": {
"beacon": {
"component_id": "uuid-of-beacon-agent",
"method": "POST",
"payload_mapping": {
"context": "$.context",
"messages": "$.messages",
"session_id": "$.session_id"
}
}
},
"enabled": true,
"ingress_tokens": ["token-uuid"]
}Enable chat interface:
{
"enabled": true
}Triformer agents communicate with users through the AG-UI Bridge:
User → Chat UI → AG-UI Bridge → Triform Platform → Your Agent
↑ ↓
└────────── Callbacks ────────────┘
(ask_user, emote, set_progress)
Required inputs (automatically injected):
session_id- Chat session identifiercallback_base_url- AG-UI Bridge URL
- Use
ask_userfor all user communication - Use
emoteto make interactions feel alive - Use
set_progressto keep users informed - Delegate complex analysis to sub-flows
- Validate all required parameters
- Return structured error responses
- Document thoroughly for LLMs
- Handle network timeouts
- Give concrete examples
- Define clear boundaries
- Include tool documentation
- Model the conversation flow
# Pull project
triform projects pull <project-id>
cd Triformers
# Start auto-sync
triform projects watch
# Create new agent (with watch running)
mkdir "Flows/MyFlow/Agents/MyAgent"
# → Platform creates agent with default files
# → Files are pulled to your folder
# Edit files in your IDE
# → Changes sync automatically
# Test
triform execute <component-id> --trace
# Deploy
triform projects deployProprietary - Triform AI