Skills

Prompt engineering,
on the server.

Ship a Skill ZIP with a Jinja2 template + tool schemas. Pin by version (fact-check@v3). The proxy injects everything server-side — your client never sees the prompt.

Before

Prompt hell in client code

  • System prompts embedded in React/Vue components
  • No version control — "works on my machine"
  • Tool schemas duplicated across services
  • Can't A/B test without redeploying frontend
  • Security: prompts exposed in client bundles
After

Server-side Skill engine

  • Prompts live on the proxy, rendered server-side
  • Version pinning: skills=["fact-check@v3"]
  • Atomic publish — immutable after release
  • Tool schemas bundled in the ZIP
  • A/B by pointing to different skill versions

Anatomy of a Skill

A Skill is a ZIP bundle. Upload it once, version it, then reference it by name + version in any completion call.

fact-check.zip
fact-check/
├── manifest.yaml          # display_title, category, tags
├── SKILL.md               # Jinja2 system prompt template
├── tools.json             # OpenAI-shape tool array
└── README.md              # description fallback
manifest.yaml
display_title: "Fact Check"
description: "Verify claims with citations."
version: "3"
is_public: false
category: research
tags: [verification, science]
xct:
  difficulty: hard
  model_recommendations: [gpt-4o, claude-3-7-sonnet]

One line to inject

Pass skills and skill_inputs to any chat completion call. The proxy handles rendering, injection, and dedup.

xct@solar:~
reply = xct.chat.completions.create(
    model="deepseek-v3.2",
    messages=[{"role": "user", "content": "Is the moon a planet?"}],
    skills=["fact-check@v3"],
    skill_inputs={"strictness": "high"},
)

# Proxy behavior:
# 1. Resolve "fact-check@v3" → 404 if missing
# 2. Render SKILL.md with skill_inputs (Jinja2 or format-string)
# 3. Prepend as role:"system" message
# 4. Concat tools.json into request tools array
# 5. Strip skills / skill_inputs before provider sees them

Immutable after publish

Published skills are frozen on system_prompt_template, tool_schema, and instructions. Subsequent PATCH on a content field returns 409. The template never drifts.

Build your first Skill Read the docs →

Try Skills today

Free tier includes 10 uploaded skills and unlimited injections across all models.

Start free