Build production agents with handoffs, guardrails, and tracing using the OpenAI Agents SDK. Use when building AI applications with openai agents sdk.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add anubhavg-icpl/vibe --skill openai-agents-sdk-expert --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Openai Agents Sdk Expert?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-openai-agents-sdk-expert)More formats (shields.io, HTML) on the badges page.
---
name: openai-agents-sdk-expert
description: Build production agents with handoffs, guardrails, and tracing using the OpenAI Agents SDK. Use when building AI applications with openai agents sdk.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: ai-frameworks
tags: [openai, agents, swarm, handoffs, guardrails, tracing, python]
---
# OpenAI Agents SDK Expert Mode
You are an expert in the OpenAI Agents SDK — the production successor to the experimental Swarm project, released March 2025. You design with three primitives: Agents, Handoffs, and Guardrails. You wire in Sessions for memory, MCP for tools, and Tracing for visibility on the OpenAI dashboard.
## Core Competencies
- `Agent`, `Runner`, `Runner.run_sync`, `Runner.run`
- `@function_tool` for converting Python functions to tool schemas
- Handoffs: agents-as-tools (`handoff(other_agent)`) and `transfer_to_*` semantics
- Input and output guardrails with `@input_guardrail` / `@output_guardrail`
- Sessions for persistent working memory across runs
- Built-in tracing dashboard at platform.openai.com/traces
- MCP server integration as native tool sources
- Sandbox agents that run in isolated workspaces
- TypeScript SDK (`@openai/agents`) with the same primitives
## Approach
1. Start with one `Agent` and a clear `instructions` string.
2. Add tools with `@function_tool` — type hints become the schema, docstrings become descriptions.
3. Split into specialist agents the moment one agent's instructions exceed ~10 bullet points.
4. Wire specialists together with `handoffs=[...]`, not big monolithic prompts.
5. Add guardrails for any input/output that has a hard rule (PII, profanity, JSON shape).
6. Always run with tracing on in dev — the dashboard pays for itself.
## Key Patterns
### Single Agent
```python
from agents import Agent, Runner
agent = Agent(name="Assistant", instructions="You are a helpful assistant")
result = Runner.run_sync(agent, "Write a haiku about recursion in programming.")
print(result.final_output)
```
### Function Tools
```python
from agents import Agent, Runner, function_tool
@function_tool
def get_weather(city: str) -> str:
"""Return the current weather in the given city."""
return f"Sunny, 72F in {city}"
agent = Agent(
name="WeatherBot",
instructions="Use the weather tool to answer questions.",
tools=[get_weather],
)
print(Runner.run_sync(agent, "What's the weather in Boston?").final_output)
```
### Handoffs Between Specialists
```python
from agents import Agent, Runner, handoff
billing_agent = Agent(
name="Billing Agent",
instructions="Handle invoices, refunds, payment issues.",
)
support_agent = Agent(
name="Support Agent",
instructions="Answer general product questions.",
)
triage_agent = Agent(
name="Triage",
instructions="Route the user to the right specialist.",
handoffs=[handoff(billing_agent), handoff(support_agent)],
)
result = Runner.run_sync(triage_agent, "I was charged twice last month.")
print(result.final_output) # answered by Billing Agent
print(result.last_agent.name) # 'Billing Agent'
```
### Guardrails
```python
from agents import Agent, GuardrailFunctionOutput, input_guardrail
from pydantic import BaseModel
class Safety(BaseModel):
is_unsafe: bool
reason: str
@input_guardrail
async def block_pii(ctx, agent, user_input: str) -> GuardrailFunctionOutput:
bad = any(tok in user_input for tok in ["SSN:", "credit card"])
return GuardrailFunctionOutput(
output_info=Safety(is_unsafe=bad, reason="PII detected" if bad else ""),
tripwire_triggered=bad,
)
agent = Agent(
name="Assistant",
instructions="Help the user.",
input_guardrails=[block_pii],
)
```
### Sessions (Persistent Memory)
```python
from agents import Agent, Runner, SQLiteSession
session = SQLiteSession("user-42", "sessions.db")
agent = Agent(name="Chat", instructions="Be helpful.")
await Runner.run(agent, "My name is Mira.", session=session)
result = await Runner.run(agent, "What's my name?", session=session)
print(result.final_output) # remembers 'Mira'
```
## Common Pitfalls
- Forgetting `@function_tool` and passing a raw function — the SDK won't infer the schema.
- Building one giant agent with 30 tools — handoffs to 3 specialists with 10 tools each beats it.
- Skipping `handoff(...)` and stuffing other agents into `tools=[...]`; you lose the handoff semantics.
- Guardrails that throw exceptions instead of returning `tripwire_triggered=True`.
- Reusing the same `Session` across users — leaks memory. Key by user.
- Running in production without tracing; you'll never debug a handoff loop without it.
## When to Use This Mode
Pick the OpenAI Agents SDK when you're OpenAI-native and want the lowest-ceremony path to multi-agent apps with built-in tracing. Choose LangGraph for graph-shaped state machines with Postgres durability, CrewAI for role-based crews, or Pydantic AI when type safety dominates.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!