Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guides users through creating a new TIA XMPP agent based on mistral-minimal. Use when the user wants to create, build, set up, or scaffold a new agent, bot, or when they ask how to get started with TIA.
.claude/skills/majiayu000-create-tia-agent/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 18% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 17% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 30% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 0% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -11% | 0% |
This Skill helps you create a new TIA XMPP agent by copying and customizing the mistral-minimal example.
When a user wants to create a new agent, follow these steps:
Ask the user:
../my-agent)tensegrity.it)general@conference.tensegrity.it)bashcp -r mistral-minimal /path/to/new-agent cd /path/to/new-agent
name field to the agent name.env.example to .envMISTRAL_API_KEY, GROQ_API_KEY, etc.)mistral2.ttl to <agent-name>.ttlmistral2 to the new agent namexmpp:service, xmpp:domain if using different serveragent:roomJid if joining different roomagent:nickname to desired display name<agent-name>.js or keep as-isPROFILE_NAME default to match your agent namemain and start script if renamedIf using a different LLM provider, edit mistral-provider.js:
For Groq:
javascriptimport { Groq } from "hyperdata-clients"; export class GroqProvider extends BaseLLMProvider { initializeClient(apiKey) { return new Groq({ apiKey }); } async completeChatRequest({ messages, maxTokens, temperature }) { return await this.client.client.chat.completions.create({ model: this.model, messages, max_tokens: maxTokens, temperature }); } extractResponseText(response) { return response.choices[0]?.message?.content?.trim() || null; } }
For Claude:
javascriptimport { Claude } from "hyperdata-clients"; export class ClaudeProvider extends BaseLLMProvider { initializeClient(apiKey) { return new Claude({ apiKey }); } async completeChatRequest({ messages, maxTokens, temperature }) { return await this.client.client.messages.create({ model: this.model, messages, max_tokens: maxTokens, temperature }); } extractResponseText(response) { return response.content[0]?.text?.trim() || null; } }
Update the import and class name in the main agent file accordingly.
bashnpm install npm start
The agent should:
Test by sending a message in the room: @agent-name hello
Edit the agent's .ttl file:
turtleagent:aiProvider [ a agent:MistralProvider ; agent:model "mistral-small-latest" ; agent:systemPrompt "You are a helpful assistant specializing in..." ; agent:apiKeyEnv "MISTRAL_API_KEY" ] .
In the .ttl file:
turtleagent:aiProvider [ a agent:MistralProvider ; agent:lingueEnabled true ; agent:lingueConfidenceMin 0.7 ; agent:ibisSummaryEnabled true ] .
Update the model in the .ttl file:
turtleagent:aiProvider [ a agent:MistralProvider ; agent:model "mistral-large-latest" ] .
Or for Groq:
turtleagent:aiProvider [ a agent:GroqProvider ; agent:model "llama-3.3-70b-versatile" ] .
Agents can only join one room via the profile, but you can:
AGENT_PROFILE env varsExtend the provider's handle method or create a custom provider by extending BaseProvider.
my-agent/
├── config/agents/
│ ├── my-agent.ttl # Agent profile
│ ├── mistral-base.ttl # Base profile (keep or customize)
│ └── secrets.json # Auto-generated XMPP passwords
├── my-provider.js # LLM provider implementation
├── my-agent.js # Main agent runner
├── package.json # Dependencies and scripts
├── .env # API keys and overrides
├── .env.example # Template
└── README.md # Documentation
.ttl fileNODE_TLS_REJECT_UNAUTHORIZED=0 if using self-signed certstelnet tensegrity.it 5222.envagent:apiKeyEnv in profile@agent-name hello.ttl syntax (common issue: missing dots at end of statements)After creating your agent:
pm2 or systemdSee mistral-minimal/README.md for the complete reference implementation.
Other measured skills in the registry, with their headline benchmark lift.