> ## Documentation Index
> Fetch the complete documentation index at: https://docs.restate.dev/llms.txt
> Use this file to discover all available pages before exploring further.

<AgentInstructions>

## Submitting Feedback

If you encounter incorrect, outdated, or confusing documentation on this page, submit feedback:

POST https://docs.restate.dev/feedback

```json
{
  "path": "/ai/patterns/workflow-orchestrator",
  "feedback": "Description of the issue"
}
```

Only submit feedback when you have something specific and actionable to report.

</AgentInstructions>

# Orchestrator-Worker

> An orchestrator agent dynamically plans tasks and dispatches them to worker agents. Plans and results are durably persisted.

export const GitHubLink = ({url}) => <div style={{
  marginTop: '-8px',
  marginBottom: '8px',
  textAlign: 'right'
}}>
    <a href={url} target="_blank" rel="noopener noreferrer" style={{
  fontSize: '0.75rem',
  color: '#6B7280',
  textDecoration: 'none',
  display: 'inline-flex',
  alignItems: 'center',
  gap: '3px',
  padding: '2px 6px',
  borderRadius: '3px',
  border: '1px solid #E5E7EB',
  backgroundColor: 'transparent',
  transition: 'all 0.2s ease'
}} onMouseOver={e => {
  e.target.style.color = '#6B7280';
  e.target.style.backgroundColor = '#F9FAFB';
}} onMouseOut={e => {
  e.target.style.color = '#6B7280';
  e.target.style.backgroundColor = 'transparent';
}}>
      <svg width="12" height="12" viewBox="0 0 24 24" fill="currentColor">
        <path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.230 3.297-1.230.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
      </svg>
      View on GitHub
    </a>
  </div>;

export const GlobalTab = ({title, icon, children}) => {
  return <div>{children}</div>;
};

export const GlobalTabs = ({children, className = ''}) => {
  const [activeTab, setActiveTab] = useState(0);
  const tabs = React.Children.toArray(children).filter(child => child.type && child.type.name === 'GlobalTab');
  useEffect(() => {
    const savedLanguage = localStorage.getItem('language');
    if (savedLanguage) {
      const matchingIndex = tabs.findIndex(tab => tab.props.title === savedLanguage);
      if (matchingIndex !== -1) {
        setActiveTab(matchingIndex);
      }
    }
  }, [tabs]);
  useEffect(() => {
    const handleGlobalTabChange = event => {
      const targetTitle = event.detail.title;
      const matchingIndex = tabs.findIndex(tab => tab.props.title === targetTitle);
      if (matchingIndex !== -1 && matchingIndex !== activeTab) {
        setActiveTab(matchingIndex);
      }
    };
    window.addEventListener('globalTabChange', handleGlobalTabChange);
    return () => window.removeEventListener('globalTabChange', handleGlobalTabChange);
  }, [tabs, activeTab]);
  const handleTabClick = index => {
    setActiveTab(index);
    const title = tabs[index].props.title;
    localStorage.setItem('language', title);
    window.dispatchEvent(new CustomEvent('globalTabChange', {
      detail: {
        title
      }
    }));
  };
  return <div className={`tabs tabs tab-container ${className}`}>
            <ul className="not-prose mb-6 pb-[1px] flex-none min-w-full overflow-auto border-b border-gray-200 gap-x-6 flex dark:border-gray-200/10" data-component-part="tabs-list">
                {tabs.map((tab, index) => <li key={index} className="cursor-pointer">
                        <button className={index === activeTab ? "flex text-sm items-center gap-1.5 leading-6 font-semibold whitespace-nowrap pt-3 pb-2.5 -mb-px max-w-max border-b text-primary dark:text-primary-light border-current" : "flex text-sm items-center gap-1.5 leading-6 font-semibold whitespace-nowrap pt-3 pb-2.5 -mb-px max-w-max border-b text-gray-900 border-transparent hover:border-gray-300 dark:text-gray-200 dark:hover:border-gray-700"} data-component-part="tab-button" data-active={index === activeTab} onClick={() => handleTabClick(index)}>
                            {tab.props.icon && <img src={tab.props.icon} alt="" className="h-4 w-4 not-prose" noZoom />}
                            {tab.props.title}
                        </button>
                    </li>)}
            </ul>
            <div className="prose dark:prose-dark overflow-x-auto" data-component-part="tab-content">
                {tabs[activeTab]?.props.children}
            </div>
        </div>;
};

An orchestrator agent dynamically decides what tasks to dispatch, and worker agents execute them. The orchestrator can plan, delegate, and combine results in any order. Restate ensures the orchestrator's plan and each worker's result are durably persisted.

```mermaid theme={null}
graph LR
    A[Orchestrator] -->|plan| B[Worker 1]
    A -->|plan| C[Worker 2]
    B --> D[Combine]
    C --> D
    D --> E[Final result]
```

## Example: research report generation

Select your SDK:

<GlobalTabs>
  <GlobalTab title="Vercel AI" icon={"/img/languages/typescript.svg"} />

  <GlobalTab title="OpenAI Agents" icon={"/img/languages/python.svg"} />

  <GlobalTab title="Google ADK" icon={"/img/languages/python.svg"} />

  <GlobalTab title="Pydantic AI" icon={"/img/languages/python.svg"} />

  <GlobalTab title="Restate TS" icon={"/img/languages/typescript.svg"} />

  <GlobalTab title="Restate Py" icon={"/img/languages/python.svg"} />
</GlobalTabs>

An orchestrator agent breaks a research topic into sub-tasks, dispatches them to worker agents, and combines the results into a report.

<GlobalTabs className={"hidden-tabs"}>
  <GlobalTab title="Vercel AI">
    ```typescript workflow-orchestrator.ts {"CODE_LOAD::https://raw.githubusercontent.com/restatedev/ai-examples/refs/heads/main/vercel-ai/tour-of-agents/src/workflow-orchestrator.ts#here"}  theme={null}
    export const researchWorker = restate.service({
      name: "ResearchWorker",
      handlers: {
        research: async (ctx: restate.Context, {question}: { question: string }) => {
          const model = wrapLanguageModel({
            model: openai("gpt-4o"),
            middleware: durableCalls(ctx, { maxRetryAttempts: 3 }),
          });
          const { text: answer } = await generateText({
            model,
            system:
              "You are a research assistant. Provide a concise, factual answer.",
            prompt: question,
          });
          return { question, answer };
        },
      },
    });

    const orchestrator = restate.service({
      name: "ResearchReport",
      handlers: {
        generate: restate.createServiceHandler(
          { input: schema(ResearchRequestSchema) },
          async (ctx: restate.Context, {topic}: { topic: string }) => {
            const model = wrapLanguageModel({
              model: openai("gpt-4o"),
              middleware: durableCalls(ctx, { maxRetryAttempts: 3 }),
            });

            // Step 1: Orchestrator creates a research plan
            const { output: tasks } = await generateText({
              model,
              system: `You are a research planner. Break the topic into 2-4 research
              sub-tasks. Respond with a JSON array of strings, each a specific
              research question. Example: ["question 1", "question 2"]`,
              prompt: topic,
              output: Output.array({element: z.string()})
            });

            // Step 2: Dispatch workers in parallel
            const workerResults = await RestatePromise.all(
              tasks.map((question) =>
                ctx.serviceClient(researchWorker).research({ question }),
              ),
            );

            // Step 3: Combine results into a report
            const { text: report } = await generateText({
              model,
              system:
                "You are a report writer. Combine the research findings into a cohesive report.",
              prompt: `Topic: ${topic}\n\nResearch findings:\n${JSON.stringify(workerResults)}`,
            });

            return { report, taskCount: tasks.length };
          },
        ),
      },
    });
    ```

    <GitHubLink url="https://github.com/restatedev/ai-examples/blob/main/vercel-ai/tour-of-agents/src/workflow-orchestrator.ts" />

    <Accordion title="Run this example" icon="laptop">
      [Install Restate](/installation) and launch it:

      ```bash theme={null}
      npm install --global @restatedev/restate-server@latest @restatedev/restate@latest
      restate-server
      ```

      Get the example:

      ```bash theme={null}
      restate example typescript-vercel-ai-tour-of-agents && cd typescript-vercel-ai-tour-of-agents
      npm install
      ```

      Export your [OpenAI API key](https://platform.openai.com/api-keys) and run the agent:

      ```bash theme={null}
      export OPENAI_API_KEY=sk-...
      ```

      ```bash theme={null}
      npx tsx ./src/workflow-orchestrator.ts
      ```

      Register the agents with Restate:

      ```bash theme={null}
      restate deployments register http://localhost:9080 --force --yes # dev only: overrides previous registrations
      ```

      Send a request to the agent:

      ```shell theme={null}
      curl localhost:8080/ResearchReport/generate \
      --json '{
          "topic": "Benefits of durable execution in distributed systems"
      }'
      ```
    </Accordion>
  </GlobalTab>

  <GlobalTab title="OpenAI Agents">
    ```python workflow_orchestrator.py {"CODE_LOAD::https://raw.githubusercontent.com/restatedev/ai-examples/refs/heads/main/openai-agents/tour-of-agents/app/workflow_orchestrator.py#here"}  theme={null}
    planner = Agent(
        name="ResearchPlanner",
        instructions="You are a research planner. Break the topic into 2-4 research sub-tasks.",
        output_type=TaskList
    )

    researcher = Agent(
        name="Researcher",
        instructions="You are a research assistant. Provide a concise, factual answer."
    )

    writer = Agent(
        name="ReportWriter",
        instructions="You are a report writer. Combine the research findings into a cohesive report.",
    )

    report_service = restate.Service("ResearchReport")


    @report_service.handler()
    async def generate(ctx: restate.Context, req: ReportRequest) -> dict:
        # Step 1: Orchestrator creates a research plan
        plan_result = await DurableRunner.run(planner, req.topic)
        tasks = plan_result.final_output.tasks

        # Step 2: Dispatch workers in parallel
        worker_promises = []
        for task in tasks:
            promise = ctx.service_call(run_researcher, task)
            worker_promises.append(promise)

        await restate.gather(*worker_promises)
        findings = [await p for p in worker_promises]

        # Step 3: Combine results into a report
        report_result = await DurableRunner.run(
            writer,
            f"Topic: {req.topic}\n\nResearch findings:\n{json.dumps(findings, indent=2)}",
        )

        return {"report": report_result.final_output, "task_count": len(tasks)}


    researcher_service = restate.Service("Researcher")


    @researcher_service.handler()
    async def run_researcher(ctx: restate.Context, task: ResearchTask) -> str:
        result = await DurableRunner.run(researcher, task.question)
        return result.final_output
    ```

    <GitHubLink url="https://github.com/restatedev/ai-examples/blob/main/openai-agents/tour-of-agents/app/workflow_orchestrator.py" />

    <Accordion title="Run this example" icon="laptop">
      [Install Restate](/installation) and launch it:

      ```bash theme={null}
      restate-server
      ```

      Get the example:

      ```bash theme={null}
      restate example python-openai-agents-tour-of-agents && cd python-openai-agents-tour-of-agents
      ```

      Export your [OpenAI API key](https://platform.openai.com/api-keys) and run the agent:

      ```bash theme={null}
      export OPENAI_API_KEY=sk-...
      ```

      ```bash theme={null}
      uv run app/workflow_orchestrator.py
      ```

      Register the agents with Restate:

      ```bash theme={null}
      restate deployments register http://localhost:9080 --force --yes # dev only: overrides previous registrations
      ```

      Send a request:

      ```bash theme={null}
      curl localhost:8080/ResearchReport/generate \
        --json '{"topic": "The impact of renewable energy on global economies"}'
      ```
    </Accordion>
  </GlobalTab>

  <GlobalTab title="Google ADK">
    ```python workflow_orchestrator.py {"CODE_LOAD::https://raw.githubusercontent.com/restatedev/ai-examples/refs/heads/main/google-adk/tour-of-agents/app/workflow_orchestrator.py#here"}  theme={null}
    report_service = restate.VirtualObject("ResearchReport")


    @report_service.handler()
    async def generate(ctx: restate.ObjectContext, req: ReportRequest) -> dict:
        session_id = str(ctx.uuid())
        # Step 1: Orchestrator creates a research plan
        plan_events = plan_runner.run_async(
            user_id=ctx.key(),
            session_id=session_id,
            new_message=Content(role="user", parts=[Part.from_text(text=req.topic)]),
        )
        plan_output = await parse_agent_response(plan_events)
        tasks = TaskList.model_validate_json(plan_output).tasks

        # Step 2: Dispatch workers in parallel
        worker_promises = []
        for task in tasks:
            promise = ctx.object_call(run_researcher, key=str(ctx.uuid()), arg=task)
            worker_promises.append(promise)

        await restate.gather(*worker_promises)
        findings = [await p for p in worker_promises]

        # Step 3: Combine results into a report
        results = f"Topic: {req.topic}\n\nResearch findings:\n{json.dumps(findings)}"
        events = writer_runner.run_async(
            user_id=ctx.key(),
            session_id=session_id,
            new_message=Content(role="user", parts=[Part.from_text(text=results)]),
        )
        report = await parse_agent_response(events)

        return {"report": report, "task_count": len(tasks)}


    researcher_service = restate.VirtualObject("Researcher")


    @researcher_service.handler()
    async def run_researcher(ctx: restate.ObjectContext, task: ResearchTask) -> str:
        events = research_runner.run_async(
            user_id=ctx.key(),
            session_id=str(ctx.uuid()),
            new_message=Content(role="user", parts=[Part.from_text(text=task.question)]),
        )
        return await parse_agent_response(events)
    ```

    <GitHubLink url="https://github.com/restatedev/ai-examples/blob/main/google-adk/tour-of-agents/app/workflow_orchestrator.py" />

    <Accordion title="Run this example" icon="laptop">
      [Install Restate](/installation) and launch it:

      ```bash theme={null}
      restate-server
      ```

      Get the example:

      ```bash theme={null}
      restate example python-google-adk-tour-of-agents && cd python-google-adk-tour-of-agents
      ```

      Export your [Google API key](https://aistudio.google.com/app/apikey) and run the agent:

      ```bash theme={null}
      export GOOGLE_API_KEY=your-api-key
      ```

      ```bash theme={null}
      uv run app/workflow_orchestrator.py
      ```

      Register the agents with Restate:

      ```bash theme={null}
      restate deployments register http://localhost:9080 --force --yes # dev only: overrides previous registrations
      ```

      Send a request:

      ```bash theme={null}
      curl localhost:8080/ResearchReport/user123/generate \
        --json '{
          "sessionId": "session-123",
          "topic": "The impact of renewable energy on global economies"
        }'
      ```
    </Accordion>
  </GlobalTab>

  <GlobalTab title="Pydantic AI">
    ```python workflow_orchestrator.py {"CODE_LOAD::https://raw.githubusercontent.com/restatedev/ai-examples/refs/heads/main/pydantic-ai/tour-of-agents/app/workflow_orchestrator.py#here"}  theme={null}
    planner = Agent(
        "openai:gpt-4o-mini",
        system_prompt="You are a research planner. Break the topic into 2-4 research sub-tasks.",
        output_type=TaskList,
    )
    restate_planner = RestateAgent(planner)

    researcher = Agent(
        "openai:gpt-4o-mini",
        system_prompt="You are a research assistant. Provide a concise, factual answer.",
    )
    restate_researcher = RestateAgent(researcher)

    writer = Agent(
        "openai:gpt-4o-mini",
        system_prompt="You are a report writer. Combine the research findings into a cohesive report.",
    )
    restate_writer = RestateAgent(writer)

    report_service = restate.Service("ResearchReport")


    @report_service.handler()
    async def generate(ctx: restate.Context, req: ReportRequest) -> dict:
        # Step 1: Orchestrator creates a research plan
        plan_result = await restate_planner.run(req.topic)
        tasks = plan_result.output.tasks

        # Step 2: Dispatch workers in parallel
        worker_promises = []
        for task in tasks:
            promise = ctx.service_call(run_researcher, task)
            worker_promises.append(promise)

        await restate.gather(*worker_promises)
        findings = [await p for p in worker_promises]

        # Step 3: Combine results into a report
        report_result = await restate_writer.run(
            f"Topic: {req.topic}\n\nResearch findings:\n{json.dumps(findings)}",
        )

        return {"report": report_result.output, "task_count": len(tasks)}


    researcher_service = restate.Service("Researcher")


    @researcher_service.handler()
    async def run_researcher(_ctx: restate.Context, task: ResearchTask) -> str:
        result = await restate_researcher.run(task.question)
        return result.output
    ```

    <GitHubLink url="https://github.com/restatedev/ai-examples/blob/main/pydantic-ai/tour-of-agents/app/workflow_orchestrator.py" />

    <Accordion title="Run this example" icon="laptop">
      [Install Restate](/installation) and launch it:

      ```bash theme={null}
      restate-server
      ```

      Get the example:

      ```bash theme={null}
      restate example python-pydantic-ai-tour-of-agents && cd python-pydantic-ai-tour-of-agents
      ```

      Export your [OpenAI API key](https://platform.openai.com/api-keys) and run the agent:

      ```bash theme={null}
      export OPENAI_API_KEY=sk-...
      ```

      ```bash theme={null}
      uv run app/workflow_orchestrator.py
      ```

      Register the agents with Restate:

      ```bash theme={null}
      restate deployments register http://localhost:9080 --force --yes # dev only: overrides previous registrations
      ```

      Send a request:

      ```bash theme={null}
      curl localhost:8080/ResearchReport/generate \
        --json '{"topic": "The impact of renewable energy on global economies"}'
      ```
    </Accordion>
  </GlobalTab>

  <GlobalTab title="Restate TS">
    ```typescript workflow-orchestrator.ts {"CODE_LOAD::https://raw.githubusercontent.com/restatedev/ai-examples/refs/heads/main/typescript-restate-only/tour-of-agents/src/workflow-orchestrator.ts#here"}  theme={null}
    export const researchWorker = restate.service({
      name: "ResearchWorker",
      handlers: {
        research: async (ctx: restate.Context, req: { question: string }) => {
          const answer = await ctx.run(
            "Research",
            async () =>
              llmCall(
                `You are a research assistant. Provide a concise, factual answer.\n\n${req.question}`,
              ),
            { maxRetryAttempts: 3 },
          );
          return { question: req.question, answer: answer.text };
        },
      },
    });

    const orchestrator = restate.service({
      name: "ResearchReport",
      handlers: {
        generate: restate.createServiceHandler(
            { input: schema(ResearchRequestSchema) },
            async (ctx: restate.Context, {topic}: { topic: string }) => {
          // Step 1: Orchestrator creates a research plan
          const planJson = await ctx.run(
            "Create research plan",
            async () =>
              llmCall(
                `You are a research planner. Break the topic into 2-4 research
              sub-tasks. Respond with a JSON array of strings, each a specific
              research question. Example: ["question 1", "question 2"]\n\nTopic: ${topic}`,
              ),
            { maxRetryAttempts: 3 },
          );
          const tasks: string[] = JSON.parse(planJson.text);

          // Step 2: Dispatch workers in parallel
          const workerResults = await RestatePromise.all(
            tasks.map((question) =>
              ctx.serviceClient(researchWorker).research({ question }),
            ),
          );

          // Step 3: Combine results into a report
          const report = await ctx.run(
            "Write report",
            async () =>
              llmCall(
                `You are a report writer. Combine the research findings into a cohesive report.\n\n
                Topic: ${topic}\n\nResearch findings:\n${JSON.stringify(workerResults)}`,
              ),
            { maxRetryAttempts: 3 },
          );

          return { report: report.text, taskCount: tasks.length };
            },
        ),
      },
    });
    ```

    <GitHubLink url="https://github.com/restatedev/ai-examples/blob/main/typescript-restate-only/tour-of-agents/src/workflow-orchestrator.ts" />

    <Accordion title="Run this example" icon="laptop">
      [Install Restate](/installation) and launch it:

      ```bash theme={null}
      restate-server
      ```

      Get the example:

      ```bash theme={null}
      restate example typescript-restate-tour-of-agents && cd typescript-restate-tour-of-agents
      npm install
      ```

      Export your API key:

      ```bash theme={null}
      export OPENAI_API_KEY=sk-...
      ```

      ```bash theme={null}
      npx tsx ./src/workflow-orchestrator.ts
      ```

      Register the services with Restate:

      ```bash theme={null}
      restate deployments register http://localhost:9080 --force --yes # dev only: overrides previous registrations
      ```

      Send a request:

      ```bash theme={null}
      curl localhost:8080/ResearchReport/generate \
        --json '{"topic": "The impact of renewable energy on global economies"}'
      ```
    </Accordion>
  </GlobalTab>

  <GlobalTab title="Restate Py">
    ```python workflow_orchestrator.py {"CODE_LOAD::https://raw.githubusercontent.com/restatedev/ai-examples/refs/heads/main/python-restate-only/tour-of-agents/app/workflow_orchestrator.py#here"}  theme={null}
    researcher_service = restate.Service("ResearchWorker")


    @researcher_service.handler()
    async def research(ctx: restate.Context, req: ResearchTask) -> dict:
        answer = await ctx.run_typed(
            "Research",
            llm_call,
            RunOptions(max_attempts=3),
            messages=f"You are a research assistant. Provide a concise, factual answer. {req.question}",
        )
        return {"question": req.question, "answer": answer.content}


    report_service = restate.Service("ResearchReport")


    @report_service.handler()
    async def generate(ctx: restate.Context, req: ReportRequest) -> dict:
        # Step 1: Orchestrator creates a research plan
        plan_result = await ctx.run_typed(
            "Create research plan",
            llm_call,
            RunOptions(max_attempts=3),
            messages=f"You are a research planner. Break the topic into 2-4 research sub-tasks. {req.topic}",
            response_format=TaskList,
        )
        if not plan_result.content:
            raise restate.TerminalError("No research plan created")
        tasks = TaskList.model_validate_json(plan_result.content).tasks

        # Step 2: Dispatch workers in parallel
        worker_promises = []
        for task in tasks:
            promise = ctx.service_call(research, task)
            worker_promises.append(promise)

        await restate.gather(*worker_promises)
        findings = [await p for p in worker_promises]

        # Step 3: Combine results into a report
        report = await ctx.run_typed(
            "Write report",
            llm_call,
            RunOptions(max_attempts=3),
            messages=f"You are a report writer. Combine the research findings into a cohesive report."
                   f"Topic: {req.topic}\n\nResearch findings:\n{json.dumps(findings)}",
        )

        return {"report": report.content, "task_count": len(tasks)}
    ```

    <GitHubLink url="https://github.com/restatedev/ai-examples/blob/main/python-restate-only/tour-of-agents/app/workflow_orchestrator.py" />

    <Accordion title="Run this example" icon="laptop">
      [Install Restate](/installation) and launch it:

      ```bash theme={null}
      restate-server
      ```

      Get the example:

      ```bash theme={null}
      restate example python-restate-tour-of-agents && cd python-restate-tour-of-agents
      ```

      Export your API key:

      ```bash theme={null}
      export OPENAI_API_KEY=sk-...
      ```

      ```bash theme={null}
      uv run app/workflow_orchestrator.py
      ```

      Register the services with Restate:

      ```bash theme={null}
      restate deployments register http://localhost:9080 --force --yes # dev only: overrides previous registrations
      ```

      Send a request:

      ```bash theme={null}
      curl localhost:8080/ResearchReport/generate \
        --json '{"topic": "The impact of renewable energy on global economies"}'
      ```
    </Accordion>
  </GlobalTab>
</GlobalTabs>

The orchestrator's plan is persisted as a durable step. If the process crashes after two of four workers have completed, recovery replays those two results from the journal and only runs the remaining two workers.

<Frame>
  <img src="https://mintcdn.com/restate-6d46e1dc/nke_4ubyE4pFymRy/img/tour/agents/pydantic/workflow-orchestrator.png?fit=max&auto=format&n=nke_4ubyE4pFymRy&q=85&s=a6117183b6b03018f1bb85ebdc1ee25b" alt="Invocation overview" width="1612" height="542" data-path="img/tour/agents/pydantic/workflow-orchestrator.png" />
</Frame>
