Migrating Openai Agents SDK To Pydantic AI
pydantic/pydantic-ai
Migrate Python OpenAI Agents SDK applications to Pydantic AI and, when warranted, Pydantic AI Harness.
A skill your agent uses when building or debugging OpenAI Agents SDK workflows — defining agents with tools and handoffs, wiring typed context, streaming responses, adding guardrails, or integrating…
$ npx skills add kid-sid/claude-spellbook --skill openai-agents -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kid-sid/claude-spellbook openai-agents --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/kid-sid/claude-spellbook.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/openai-agents .claude/skills/openai-agents && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "openai-agents" agent skill from https://github.com/kid-sid/claude-spellbook/tree/main/skills/openai-agents into .claude/skills/openai-agents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openai-agents", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/kid-sid/claude-spellbook/tree/main/skills/openai-agentsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add kid-sid/claude-spellbook --skill openai-agents -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kid-sid/claude-spellbook openai-agents --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kid-sid/claude-spellbook.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/openai-agents .agents/skills/openai-agents && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "openai-agents" agent skill from https://github.com/kid-sid/claude-spellbook/tree/main/skills/openai-agents into .agents/skills/openai-agents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openai-agents", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kid-sid/claude-spellbook --skill openai-agents -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kid-sid/claude-spellbook openai-agents --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kid-sid/claude-spellbook.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/openai-agents .cursor/skills/openai-agents && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "openai-agents" agent skill from https://github.com/kid-sid/claude-spellbook/tree/main/skills/openai-agents into .cursor/skills/openai-agents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openai-agents", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/kid-sid/claude-spellbook.git --path skills/openai-agents--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add kid-sid/claude-spellbook --skill openai-agents -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kid-sid/claude-spellbook openai-agents --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kid-sid/claude-spellbook.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/openai-agents .gemini/skills/openai-agents && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "openai-agents" agent skill from https://github.com/kid-sid/claude-spellbook/tree/main/skills/openai-agents into .gemini/skills/openai-agents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openai-agents", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install kid-sid/claude-spellbook openai-agentsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add kid-sid/claude-spellbook --skill openai-agents -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kid-sid/claude-spellbook.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/openai-agents .github/skills/openai-agents && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "openai-agents" agent skill from https://github.com/kid-sid/claude-spellbook/tree/main/skills/openai-agents into .github/skills/openai-agents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openai-agents", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kid-sid/claude-spellbook --skill openai-agents -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install kid-sid/claude-spellbook openai-agents --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kid-sid/claude-spellbook.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/openai-agents .opencode/skills/openai-agents && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "openai-agents" agent skill from https://github.com/kid-sid/claude-spellbook/tree/main/skills/openai-agents into .opencode/skills/openai-agents/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "openai-agents", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
openai-agentsA skill your agent uses when building or debugging OpenAI Agents SDK workflows — defining agents with tools and handoffs, wiring typed context, streaming responses, adding guardrails, or integrating…
Openai Agents is an agent skill from kid-sid/claude-spellbook. Use when building or debugging OpenAI Agents SDK workflows — defining agents with tools and handoffs, wiring typed context, streaming responses, adding guardrails, or integrating with the Agentex ADK.
Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in AI & LLM Engineering, covering LLM API integration and LLM guardrails. It works with OpenAI and OpenAI Agents SDK. The repository describes itself as: A curated collection of skills, prompts, and workflows that extend Claude's capabilities — your personal grimoire for AI-powered development. The licence is MIT.
Read from SKILL.md and the folder at commit a7c2ac9. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are python).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Openai Agents loads about 3.4k tokens when it runs. Until then it costs about 54 tokens; SKILL.md has 539 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from kid-sid/claude-spellbook at commit a7c2ac9, republished under its MIT licence (© kid-sid). 539 words, ~3,351 tokens.
.claude/skills/openai-agents/SKILL.md (or your agent's skills folder).The OpenAI Agents SDK (openai-agents) orchestrates LLM agents with tools, handoffs, and tracing.
@function_tool decorators and tool schemasRunner.run() or streaming with Runner.run_streamed()adk.providers.openaiAgent
├── name, instructions (system prompt)
├── tools — functions the agent can call
├── handoffs — other agents it can delegate to
├── model — LLM to use (default: gpt-4o)
└── output_type — structured Pydantic output (optional)
Runner
├── .run() — async, returns final output
├── .run_streamed() — async generator, streams events
└── .run_sync() — sync wrapper (testing/scripts)from agents import Agent, Runner, function_tool
@function_tool
def get_weather(city: str) -> str:
"""Get current weather for a city."""
return f"It's sunny and 72°F in {city}."
agent = Agent(
name="Weather Agent",
instructions="You help users check weather. Always use the get_weather tool.",
tools=[get_weather],
model="gpt-4o-mini",
)
# Run
result = await Runner.run(agent, "What's the weather in Tokyo?")
print(result.final_output)from agents import function_tool
from pydantic import BaseModel
# Simple tool — docstring becomes the tool description
@function_tool
def search_web(query: str) -> str:
"""Search the web for current information. Returns the top results."""
return web_search_api(query)
# Tool with multiple typed params
# NOTE: `eval()` on a tool argument is RCE — the model can pass `__import__(...)`.
# Use a constrained evaluator like `simpleeval` (or `ast.literal_eval` for literals).
from simpleeval import simple_eval
@function_tool
def calculate(expression: str, precision: int = 2) -> str:
"""Evaluate a mathematical expression and return the result."""
result = simple_eval(expression)
return str(round(result, precision))
# Tool returning structured data
class SearchResult(BaseModel):
title: str
url: str
snippet: str
@function_tool
def search_docs(query: str, limit: int = 5) -> list[SearchResult]:
"""Search the documentation. Returns matching articles."""
return [SearchResult(...) for r in docs_search(query, limit)]
# Async tool
@function_tool
async def fetch_user(user_id: str) -> dict:
"""Fetch user profile from the database."""
user = await db.get_user(user_id)
return user.model_dump()Tool naming: the function name becomes the tool name. Keep names short and action-oriented (search_web, not search_the_web_for_information).
from agents import Agent, Runner, RunContextWrapper, function_tool
from dataclasses import dataclass
@dataclass
class AppContext:
user_id: str
db_session: AsyncSession
# Tools receive context as first param (not exposed to LLM)
@function_tool
async def get_my_orders(ctx: RunContextWrapper[AppContext]) -> list[dict]:
"""Get the current user's orders."""
orders = await OrderCRUD(ctx.context.db_session).list_for_user(ctx.context.user_id)
return [o.model_dump() for o in orders]
agent = Agent[AppContext](
name="Order Agent",
instructions="Help users check their orders.",
tools=[get_my_orders],
)
context = AppContext(user_id="u-123", db_session=session)
result = await Runner.run(agent, "Show my recent orders", context=context)from pydantic import BaseModel
from agents import Agent, Runner
class EmailDraft(BaseModel):
subject: str
body: str
tone: Literal["formal", "casual", "urgent"]
agent = Agent(
name="Email Writer",
instructions="Draft professional emails based on user requests.",
output_type=EmailDraft, # forces structured JSON response
)
result = await Runner.run(agent, "Write a follow-up email for a job interview")
email: EmailDraft = result.final_output # typed, validated by Pydantic
print(email.subject)Handoffs let one agent delegate to another specialized agent. The triage agent decides which specialist handles the task.
from agents import Agent, handoff, Runner
coding_agent = Agent(
name="Coding Assistant",
instructions="You solve programming problems. Write clean, working code.",
tools=[search_docs, run_code],
)
writing_agent = Agent(
name="Writing Assistant",
instructions="You help with writing, editing, and proofreading.",
)
triage_agent = Agent(
name="Triage",
instructions="""Route the user to the right specialist:
- For code/programming questions → coding_assistant
- For writing/editing requests → writing_assistant
- Handle simple questions yourself.""",
handoffs=[coding_agent, writing_agent],
)
result = await Runner.run(triage_agent, "Fix this Python bug: ...")
# triage_agent may hand off to coding_agent, which runs to completion
print(result.final_output)Customizing handoff behavior:
from agents import handoff
def on_handoff_to_billing(ctx: RunContextWrapper[AppContext]):
# Called when handoff happens — log, update state, etc.
logger.info(f"Handing off to billing for user {ctx.context.user_id}")
billing_agent = Agent(name="Billing", instructions="...")
triage_agent = Agent(
handoffs=[
handoff(billing_agent, on_handoff=on_handoff_to_billing),
]
)from agents import Runner
from agents.stream_events import RunItemStreamEvent, AgentUpdatedStreamEvent
async def stream_agent(agent, prompt: str):
stream = Runner.run_streamed(agent, prompt)
async for event in stream.stream_events():
if isinstance(event, RunItemStreamEvent):
# Each completed item (tool call, tool result, message)
item = event.item
if hasattr(item, "raw_item"):
raw = item.raw_item
if raw.get("type") == "response.output_text.delta":
print(raw["delta"], end="", flush=True)
return await stream.get_final_output()
# FastAPI SSE endpoint
@router.get("/stream")
async def stream_response(prompt: str):
async def generate():
stream = Runner.run_streamed(agent, prompt)
async for event in stream.stream_events():
if isinstance(event, RunItemStreamEvent):
item = event.item
if hasattr(item, "raw_item"):
delta = item.raw_item.get("delta", "")
if delta:
yield f"data: {delta}\n\n"
return StreamingResponse(generate(), media_type="text/event-stream")Guardrails validate input/output before the agent processes or responds.
from agents import Agent, input_guardrail, output_guardrail, GuardrailFunctionOutput
@input_guardrail
async def no_pii(ctx, agent, input) -> GuardrailFunctionOutput:
text = input if isinstance(input, str) else str(input)
if contains_pii(text):
return GuardrailFunctionOutput(
output_info="PII detected",
tripwire_triggered=True, # stops the agent
)
return GuardrailFunctionOutput(output_info="clean", tripwire_triggered=False)
@output_guardrail
async def no_harmful_content(ctx, agent, output) -> GuardrailFunctionOutput:
if is_harmful(str(output)):
return GuardrailFunctionOutput(
output_info="harmful content",
tripwire_triggered=True,
)
return GuardrailFunctionOutput(output_info="safe", tripwire_triggered=False)
agent = Agent(
name="Safe Agent",
instructions="...",
input_guardrails=[no_pii],
output_guardrails=[no_harmful_content],
)from agents import Agent, Runner
from agents.tracing import trace, custom_span
# Runner automatically creates a root trace
result = await Runner.run(agent, "Hello", run_config=RunConfig(
trace_id="my-trace-123", # link to your own tracing system
trace_metadata={"user_id": "u-123"},
))
# Add custom spans inside tools
@function_tool
async def complex_search(query: str) -> str:
"""Search across multiple sources."""
with custom_span("db_search"):
db_results = await db.search(query)
with custom_span("web_search"):
web_results = await web.search(query)
return combine(db_results, web_results)In Agentex Temporal agents, use adk.providers.openai instead of calling Runner directly — it handles message streaming to the UI automatically.
from agentex.lib import adk
from agents import Agent, function_tool
@function_tool
async def search_web(query: str) -> str:
"""Search the web for information."""
return await web_search(query)
agent = Agent(
name="Research Agent",
instructions="Research topics thoroughly using web search.",
tools=[search_web],
model="gpt-4o",
)
# In a Temporal activity:
async def run_research_agent(params: AgentParams) -> str:
result = await adk.providers.openai.run_agent_streamed_auto_send(
agent=agent,
task_id=params.task_id,
input=params.user_message,
# context=AppContext(...) if using typed context
)
return result.final_output
# run_agent_streamed_auto_send:
# - streams each token to the Agentex UI via adk.messages
# - wraps Runner.run_streamed internally
# - handles tracing integrationfrom agents import RunConfig
result = await Runner.run(
agent,
"Hello",
run_config=RunConfig(
model="gpt-4o", # override agent's model
model_settings=ModelSettings(
temperature=0.2,
max_tokens=2000,
),
max_turns=10, # prevent infinite agent loops
trace_id="req-abc-123",
workflow_name="my-workflow", # appears in traces
),
)| Error | Cause | Fix |
|---|---|---|
MaxTurnsExceeded | Agent looping (tool → agent → tool) | Set max_turns, check for circular handoffs |
| Tool not called | Weak system prompt | Be explicit: "You MUST use X tool to answer" |
| Wrong handoff | Ambiguous triage instructions | List exact conditions for each handoff |
ValidationError in tool | Pydantic type mismatch in return | Ensure return type matches annotation |
Context None in tool | Forgot to pass context= to Runner | Pass context=your_context in Runner.run() |
max_turns set — without a turn limit an agent that calls a tool whose result triggers another tool call can loop indefinitely; always pass RunConfig(max_turns=N) to cap runaway executioncontext (RunContextWrapper) so tools receive state without the LLM ever seeing itRunner.run() directly inside an Agentex activity — Runner.run() doesn't stream tokens to the Agentex UI; use adk.providers.openai.run_agent_streamed_auto_send() which wraps Runner.run_streamed() and handles token delivery automatically@input_guardrail and @output_guardrail for sensitive deploymentssearch_the_web_for_current_information is worse than search_web; keep tool names short, lowercase, and verb-nounoutput_type set for structured outputs — avoids parsing LLM textmax_turns set to prevent runaway agent loopsrun_agent_streamed_auto_send used in Agentex activities (not Runner directly)get_user, search_docs, send_email© kid-sid, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/openai-agents of kid-sid/claude-spellbook.
Open the folder on GitHubat commit a7c2ac9
Openai Agents next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Openai Agents this skillkid-sid/claude-spellbook | 190 | — | ~3.4k | Automated safety check: Pass | MIT | |
| Migrating Openai Agents SDK To Pydantic AIpydantic/pydantic-ai | 20k | — | ~1.8k | Automated safety check: Pass | MIT | |
| Openai Agentscoco-research/coco | 503 | — | ~3.3k | Automated safety check: Pass | MIT | |
| New Openai SDK Appsandgardenhq/sgai | 137 | — | ~3.9k | Automated safety check: Notes | Custom licence | |
| Scaffolding Openai Agentsaiskillstore/marketplace | 430 | — | ~3.3k | Automated safety check: Pass | None | |
| ModLens Image Vision Bridgeliustack/modlens | 4.2k | — | ~1.3k | Automated safety check: Notes | MIT |
pydantic/pydantic-ai
Migrate Python OpenAI Agents SDK applications to Pydantic AI and, when warranted, Pydantic AI Harness.
coco-research/coco
Build AI applications with OpenAI Agents SDK - text agents, voice agents, multi-agent handoffs, tools with Zod schemas, guardrails, and streaming.
sandgardenhq/sgai
Create and setup a new OpenAI Agents SDK application with interactive guidance for language choice, agent type selection (Basic, Voice, Realtime), project setup, and automatic verification.
aiskillstore/marketplace
Builds AI agents using OpenAI Agents SDK with async/await patterns and multi-agent orchestration.
liustack/modlens
Gives text-only models sight by running the modlens CLI on an image path or URL and returning structured JSON evidence with transcribed text, layout and semantics.
decolua/9router
Sets up access to the 9Router AI gateway, an OpenAI-compatible REST endpoint for chat, images, speech, embeddings, web search and web fetch, and indexes its capability skills.
kid-sid/claude-spellbook
A skill your agent uses when building or reviewing UI components for keyboard and screen reader compatibility, adding ARIA to custom widgets, auditing a page for WCAG AA conformance, or preparing…
kid-sid/claude-spellbook
A skill your agent uses when building, wiring, or debugging an Agentex agent — choosing agent type, configuring acp.py and manifest.yaml, using adk.messages or adk.state, or resolving…
kid-sid/claude-spellbook
A skill your agent uses when building production LLM applications — designing RAG pipelines, choosing vector databases, implementing agent orchestration, optimizing cost, or adding AI safety…
kid-sid/claude-spellbook
A skill your agent uses when building or refactoring Angular applications — choosing between signals, RxJS, and NgRx for state, configuring routing with guards and lazy loading, optimizing change…
kid-sid/claude-spellbook
A skill your agent uses when designing new REST endpoints, reviewing an existing API contract, adding pagination or filtering, planning a versioning strategy, or building a public or partner-facing…
kid-sid/claude-spellbook
A skill your agent uses when implementing login flows, issuing or validating JWTs, setting up OAuth2/OIDC with a provider, designing role-based or attribute-based access control, securing API…
Works with
Categories
A skill your agent uses when building or debugging OpenAI Agents SDK workflows — defining agents with tools and handoffs, wiring typed context, streaming responses, adding guardrails, or integrating…. Openai Agents is an agent skill from kid-sid/claude-spellbook. Use when building or debugging OpenAI Agents SDK workflows — defining agents with tools and handoffs, wiring typed context, streaming responses, adding guardrails, or integrating with the Agentex ADK.
Openai Agents fits situations like: debugging OpenAI Agents SDK workflows — defining agents with tools and handoffs; wiring typed context; streaming responses; adding guardrails.
Run `npx skills add kid-sid/claude-spellbook --skill openai-agents -a claude-code`. Or copy the skill folder (skills/openai-agents in kid-sid/claude-spellbook) into .claude/skills/openai-agents in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kid-sid/claude-spellbook --skill openai-agents -a codex`. Or copy the skill folder (skills/openai-agents in kid-sid/claude-spellbook) into .agents/skills/openai-agents in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add kid-sid/claude-spellbook --skill openai-agents -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/openai-agents, .gemini/skills/openai-agents, .github/skills/openai-agents and .opencode/skills/openai-agents in your project.
SKILL.md names no scripts, command-line tools or credentials: Openai Agents is instructions for the agent only. Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Openai Agents is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.4k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Openai Agents: Migrating Openai Agents SDK To Pydantic AI (pydantic/pydantic-ai, 20k stars), Openai Agents (coco-research/coco, 503 stars), New Openai SDK App (sandgardenhq/sgai, 137 stars) and Scaffolding Openai Agents (aiskillstore/marketplace, 430 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
kid-sid (a GitHub user) maintains it in kid-sid/claude-spellbook, which has 190 GitHub stars. The repository holds 55 skills in this directory. The repository was last updated on August 5, 2026.
Source: kid-sid/claude-spellbook on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.