Why Skills?

From repeated tool payloads to reusable capability references

Before: Raw Tool Calling

Without skills, every request includes full tool definitions — 50+ lines of JSON schema repeated on every call, drifting between copies.

raw-tools.json
{
  "model": "openai/gpt-4.1",
  "messages": [{ "role": "user", "content": "Find contact and create ticket." }],
  "tools": [
    { "type": "function", "function": {
        "name": "lookup_contact",
        "description": "Find a CRM contact by email or name",
        "parameters": { "type": "object",
          "properties": { "query": { "type": "string" },
            "source": { "type": "string", "enum": ["crm", "directory", "all"] } },
          "required": ["query"] }
    }},
    { "type": "function", "function": {
        "name": "create_ticket",
        "description": "Open a support ticket",
        "parameters": { "type": "object",
          "properties": { "subject": { "type": "string" },
            "priority": { "type": "string", "enum": ["low", "medium", "high"] } },
          "required": ["subject", "priority"] }
    }}
  ]
}

After: Skills

Store definitions once as a schema bundle, then reference by ID. Four lines replace fifty.

skills-request.json
{
  "model": "openai/gpt-4.1",
  "messages": [{ "role": "user", "content": "Find contact and create ticket." }],
  "skills": [{ "id": "crm-tools" }]
}

Workflow simplification

  • No client-side retry loops — managed execution handles tool cycling server-side.
  • No per-provider schema workarounds — schema normalization adapts definitions automatically.
  • Consistent annotations — built-in skills return standardized formats across models.

Integration cost reduction

Without skills
Per-request overhead:
  1. Load tool definitions from config
  2. Serialize 2-20 KB of JSON schema per call
  3. Parse tool_calls, execute locally, send results back
  4. Handle provider-specific schema errors
  5. Repeat for each model switch