greenie-msft details strategies for making AI agents more reliable in production using the OpenAI Agent SDK with Azure Durable Functions, showing how automatic state management and durable orchestration reduce failures and lost progress.

Enhancing AI Agent Reliability with OpenAI Agent SDK and Azure Durable Functions

AI agents operating in production frequently encounter issues like rate limits, network failures, or crashes, often resulting in lost progress or unreliable workflows. Integrating the OpenAI Agent SDK with Azure Durable Functions addresses these challenges by enabling agents to persist state and recover from failures automatically.

Why Agent Reliability Matters

When deploying AI agents—especially those handling large workloads or multi-step tasks—failures like API rate limits, timeouts, or system errors can disrupt the workflow and require starting over. Reliable agent orchestration is crucial for business scenarios where disruption carries a significant cost.

The Solution: Azure Durable Functions Integration

The integration brings together:

  • OpenAI Agent SDK (Python): Used for building sophisticated AI agent behaviors.
  • Azure Durable Functions: A serverless orchestration framework supporting persistent, reliable, and scalable execution of complex workflows.

Core Reliability Features

  • Automatic State Persistence: Agents recover and resume exactly where they left off after any failure.
  • Built-in Retry Logic: Durable operations automatically retry failed LLM/tool calls.
  • Multi-Agent Workflow Resilience: One agent’s failure doesn’t terminate the entire multi-agent orchestration.
  • Visibility & Observability: Monitor execution and debug issues using the Durable Task Scheduler dashboard (when enabled).
  • Minimal Code Change: Agent logic remains familiar; reliability patterns require only lightweight modifications.
  • Distributed Scaling: Workflows can scale out across compute instances as agent tasks grow.

Integration Components

To enable these features in your agent applications:

  • @durable_openai_agent_orchestrator – Decorator for running agent invocations durably
  • run_sync – Runs the agent synchronously with built-in durability
  • create_activity_tool – Wraps tool calls for durable activity execution
  • State Persistence – Workflow state is kept between process restarts or failures

Code Example: From Standard to Durable

Standard OpenAI Agent SDK usage:

import asyncio
from agents import Agent, Runner

async def main():
    agent = Agent(name="Assistant", instructions="You only respond in haikus.")
    result = await Runner.run(agent, "Tell me about recursion in programming.")
    print(result.final_output)

With Durable Functions integration:

from agents import Agent, Runner

@app.orchestration_trigger(context_name="context")
@app.durable_openai_agent_orchestrator
def hello_world(context):
    agent = Agent(name="Assistant", instructions="You only respond in haikus.")
    result = Runner.run_sync(agent, "Tell me about recursion in programming.")
    return result.final_output

The only significant change is the decorator and the use of run_sync, allowing the orchestrator to persist progress and resume after failure, without major refactoring.

Tool Invocation Patterns

For agents that use tools:

  • Direct within orchestration: Use @function_tool to run tools deterministically as part of the orchestration.
  • Durable activity: Use create_activity_tool for non-deterministic or expensive operations so they run as durable activities (ensuring costly steps aren’t repeated after replays).

Durable activity tool example:

@app.orchestration_trigger(context_name="context")
@app.durable_openai_agent_orchestrator
def weather_expert(context):
    agent = Agent(name="Hello world", instructions="You are a helpful agent.", tools=[context.create_activity_tool(get_weather)])
    result = Runner.run_sync(agent, "What is the weather in Tokio?")
    return result.final_output

@app.activity_trigger(input_name="city")
async def get_weather(city: str) -> Weather:
    # return a Weather instance as defined elsewhere
    ...

Advanced Orchestration Patterns

Leverage Durable Functions’ orchestration for advanced workflows:

  • External Events: context.wait_for_external_event() for approvals, webhooks, or time-based triggers
  • Fan-out/Fan-in: Parallel task orchestration
  • Long-running Processes: Persistence over hours, days, or weeks
  • Conditional Logic: Dynamic branching based on runtime events

Human-in-the-loop approval example:

@.durable_openai_agent_orchestrator
def agent_with_approval(context):
    agent = Agent(name="DataAnalyzer", instructions="Analyze the provided dataset")
    initial_result = Runner.run_sync(agent, context.get_input())
    approval_event = context.wait_for_external_event("approval_received")
    if approval_event.get("approved"):
        final_agent = Agent(name="Reporter", instructions="Generate final report")
        final_result = Runner.run_sync(final_agent, initial_result.final_output)
        return final_result.final_output
    else:
        return "Workflow cancelled by user"

Get Started

You can quickly onboard by modifying your existing agent code with a few well-placed decorators and function calls as shown above.

These tools help you build AI-powered systems that are dependable and production-ready.

This post appeared first on “Microsoft Tech Community”. Read the entire article here