Skip to content

Composed Support Agent

A support agent with multiple local tools and a structured Skill roster so it can be discovered by a Team.

Demonstrates

  • team.add_agent(model_capability=..., tools=, skills=, memory=, instructions=)
  • Skill(id, description, tags, scopes)
  • agent.card
  • Multiple local tools passed as a plain list

Code

import asyncio
import os

from coactra import ModelProfile, ModelResolver, ModelRoute, Policy, Scope, Skill, Team


def search_knowledge_base(query: str) -> list[str]:
    return [f"Article: How to fix '{query}'"]


def escalate_ticket(ticket_id: str, reason: str) -> str:
    return f"Ticket {ticket_id} escalated: {reason}"


def update_ticket_status(ticket_id: str, status: str) -> str:
    return f"Ticket {ticket_id} set to {status}"


async def build_support_agent():
    team = Team(
        scope=Scope(tenant_id="acme", namespace="support"),
        policy=Policy.permissive(),
        model_resolver=ModelResolver([
            ModelRoute(
                capability="tier1-support",
                profile=ModelProfile(
                    name="tier1-support",
                    model="openai/deepseek-v4-pro",
                    api_base="https://opencode.ai/zen/go/v1",
                    api_key=os.environ["OC_KEY"],
                ),
            )
        ]),
    )
    return await team.add_agent(
        model_capability="tier1-support",
        name="tier1-support",
        auth="dev-token",
        tools=[search_knowledge_base, escalate_ticket, update_ticket_status],
        memory="inprocess",
        skills=[
            Skill(
                "support",
                description="Handle tier-1 customer support tickets",
                tags=["helpdesk", "tier1"],
                scopes=["tickets:read", "tickets:write"],
            )
        ],
        instructions=(
            "You are a tier-1 support agent. Search the KB first, then resolve "
            "or escalate. Always update the ticket status."
        ),
        expose=True,
    )