Skip to main content
Skills are the unit of reusable agent knowledge in DecimalAI. The SDK has two flows: sync (push your local SKILL.md files to the platform during install()) and pull (download platform skills to disk). At runtime, the Skill Router is what your agent talks to — it picks which skills to load on every query and emits the telemetry that powers per-skill effectiveness. This page covers the SDK surface; the Router page covers strategies, response shape, and the routing-id → trace join.

Sync skills from code to platform

from decimalai.openai_agents import install

install(
    agent=agent,
    skill_dirs=["./skills/"],  # scans for SKILL.md files
)
# Skills are auto-synced to platform on install()
The skill_dirs argument is supported by all framework install() calls — OpenAI Agents, LangChain, LlamaIndex, etc.

Pull skills from platform to disk

from decimalai import SkillRouter

router = SkillRouter(api_key="dai_sk_...", base_url="https://api.decimal.ai")
result = router.pull_missing(
    local_skill_names={"existing_skill"},
    agents=["my-agent"],
)
print(f"Pulled {result['pulled']} new skills")

Pull a public skill — no signup required

For consumers who just want to read a published skill without forking it into an org, the CLI’s pull command works against the public registry endpoint with no auth:
# Writes ./code-review-security/SKILL.md
decimalai skills pull code-review-security

# Or print to stdout for piping into another tool
decimalai skills pull pdf --stdout > pdf.md
pull is read-only — no fork is created, no activation telemetry is recorded. Use install() (Python) once you sign up to get the full lifecycle. In the SDK, install() = fork + write SKILL.md to disk (plus per-trace activation tracking); use fork() for the workspace copy without the disk write.

SkillRouter — full CRUD

For programmatic skill management, instantiate SkillRouter directly:
from decimalai import SkillRouter

router = SkillRouter(api_key="dai_sk_...", base_url="https://api.decimal.ai")

# Registry browsing
menu = router.get_menu(agent_name="support-agent")

# Smart routing — let the router pick the best skill for a query
chosen = router.smart_route(query="How do I cancel my subscription?",
                            agent_name="support-agent")

# CRUD
router.create_skill(name="refund_policy", description="Refund policy", body_markdown="...")
router.list_skills()
router.get_skill("refund_policy")
router.update_skill("skill_abc", body_markdown="...")
router.delete_skill("skill_abc")

# Bulk — sync_skills takes a list of skill dicts
router.sync_skills([{"name": "refund_policy", "body_markdown": "..."}])
router.export_to_disk(agents=["claude-code"])  # writes into the project's agent skill dirs
router.pull_missing(local_skill_names={"foo"}, agents=["support-agent"])
See the Skills API reference for the underlying REST surface.

What’s next

Skills guide

File format, registry, and SkillScore for skill effectiveness.

Skills Observability tutorial

Real-world example of measuring skill impact with experiments.