Skip to main content
The OpenAI Agents SDK is OpenAI’s lightweight framework for building tool-using agents. It gives you a small Agent class plus a Runner that drives the LLM loop. xpander.ai supplies the agent’s identity (instructions, tools, model, knowledge bases); this page wires the two together. In this guide, we’ll create an xpander Agent with OpenAI Agents SDK.

What doesn’t come built in

Unlike Agno, some capabilities aren’t auto-wired. Configure them yourself:

Prerequisites

  • Complete the Quickstart so the CLI, SDK, and xpander login are already set up.
  • Python 3.12+ for the local handler.
  • OPENAI_API_KEY in your shell. The OpenAI Agents SDK uses its own OpenAI client and does not pick up the LLM credentials configured on the agent in Agent Studio. If you’ve set a custom key on the agent, mirror it into your .env so the runner uses it.

1. Install

Both packages are required. The OpenAI Agents SDK ships under the openai-agents distribution but imports as agents.

2. Set up scaffolding

These files get created:

xpander_config.json reference

xpander_config.json

3. Create task handler

The full pattern, wrapped in @on_task so the platform routes tasks to it. The highlighted lines are the integration’s load-bearing reads:
xpander_handler.py
Here’s what’s happening:
  1. Agents(configuration=...).aget(agent_id=...) calls the xpander control plane and returns a fully-hydrated Agent object. Its instructions, tool repository, model, and knowledge-base links are all populated.
  2. xpander_agent.instructions.full is a single string that wraps the agent’s general description, role list, and goal list in <description>, <instructions>, and <goals> tags. Drop it straight into the OpenAI Agents SDK’s instructions parameter.
  3. xpander_agent.openai_agents_sdk_tools is a computed property that wraps every xpander tool (connectors, custom @register_tool functions, MCP tools) as a FunctionTool from agents.tool. Each wrapper’s on_invoke_tool calls back into xpander’s tool execution path, so connector auth, observability, and retries still work.
  4. xpander_agent.model_name is the model identifier configured on the agent (e.g. gpt-4.1, gpt-4o). Pass it to the OpenAI Agents SDK’s model parameter.
  5. Runner.run(native, input=task.to_message()) drives the LLM loop. task.to_message() returns the task’s user message (text plus any attachments) in the shape the runner expects.
  6. Writing back to task.result lets xpander store the output and surface it in the API, Agent Studio, and any wired channels.

4. Edit the agent’s system prompt

agent_instructions.json contains the agent’s system prompt and has exactly three fields:
agent_instructions.json
Save the file and the next xpander agent dev syncs it to the control plane.

5. Wire knowledge-base retrieval (optional)

The OpenAI Agents SDK doesn’t auto-wire xpander’s knowledge bases, so expose the retriever as a @function_tool the runner can call. The highlighted lines show the two integration points: building the retriever and concatenating it onto the auto-wired tool list.
xpander_handler.py
The retriever runs concurrent searches across every linked KB and returns the top N results by score.

6. Set up streaming (optional)

For token-by-token output, decorate an async def that yields TaskUpdateEvent objects instead of returning a Task. The decorator detects the difference automatically.
streaming_handler.py
Here’s what’s happening:
  1. Runner.run_streamed(native, input=task.to_message()) returns a RunResultStreaming. Iterating streaming.stream_events() yields raw response events, run-item events, and a final completion event.
  2. The Chunk event forwards each text delta to the platform’s SSE stream so clients render output as it arrives.
  3. The TaskFinished event signals the end of the stream and carries the final task back to the platform.
A streaming handler exposes itself only through POST /invoke, returning Server-Sent Events. The platform’s SSE listener for cloud-deployed agents expects a regular handler that returns a Task. So if you need both an interactive streaming experience and platform-routed tasks, run two handlers, or have your streaming endpoint proxy through a regular handler.

7. Test local development

Run the handler with the dev server. Tasks created from any channel (REST, Slack, Agent Studio) route to your laptop:
Routing cloud traffic to a local instance is a preview feature.When a local instance is running via xpander agent dev, it takes over and all tasks route to your locally running agent instead. Only one can be active at a time.
For one-shot testing without a server:
--output_format and --output_schema are useful for testing structured output without changing the agent’s settings in the control plane.

Troubleshooting

The OpenAI Agents SDK instantiates its own OpenAI client and reads OPENAI_API_KEY from the environment. It does not pick up a custom LLM key configured on the agent in Agent Studio. If the runner is using the wrong key, mirror the cloud-side custom key into your local .env as OPENAI_API_KEY.
Backend.aget_args() currently dispatches only to the Agno builder. For every other framework, including the OpenAI Agents SDK, you load the Agent yourself with Agents().aget(...) and read the fields you need.
There’s no built-in session storage for the OpenAI Agents SDK. The runner exposes result.to_input_list(), which returns the full conversation as input items you can persist (Postgres, Redis, your own store) and pass back as input=previous_items + new_message on the next turn. If you’d rather not build that yourself, switch to the Agno integration.
Yes. xpander_agent.openai_agents_sdk_tools only supplies tools, not the runner’s handoff configuration. You declare handoffs on the native Agent exactly as you would in any OpenAI Agents SDK app. Each agent in the handoff chain can independently load its own xpander tools.
The OpenAI Agents SDK supports other model clients through its model-agnostic interface. xpander_agent.model_name is just a string. Pass it to whichever client you instantiate. The underlying model has to support tool calling for the integration to work end to end.

Next steps

Quickstart

The 10-minute scaffold-to-deploy walkthrough that produced the handler shown above.

Custom Tools

Wrap private APIs as tools with @register_tool and ship them through openai_agents_sdk_tools.

Compare with Agno

What you’d gain by switching: session storage, knowledge-base auto-wiring, Backend.aget_args().

Core Concepts

The SDK class names mapped onto agents, tasks, threads, and memory.

Frameworks overview

What’s auto-wired vs. manual for Agno, OpenAI Agents SDK, LangChain, and AWS Strands.