cai/ref/run/index.html

7466 lines
394 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="prev" href="../agent/">
<link rel="next" href="../tool/">
<link rel="icon" href="../../assets/imago.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11">
<title>Runner - CAI</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.4af4bdda.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../../assets/_mkdocstrings.css">
<link rel="stylesheet" href="../../stylesheets/extra.css">
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="custom" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#runner" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="CAI" class="md-header__button md-logo" aria-label="CAI" data-md-component="logo">
<img src="../../assets/imago.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
CAI
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Runner
</span>
</div>
</div>
</div>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/aliasrobotics/cai" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
aliasrobotics/cai
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="CAI" class="md-nav__button md-logo" aria-label="CAI" data-md-component="logo">
<img src="../../assets/imago.png" alt="logo">
</a>
CAI
</label>
<div class="md-nav__source">
<a href="https://github.com/aliasrobotics/cai" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8M97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2"/></svg>
</div>
<div class="md-source__repository">
aliasrobotics/cai
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_1" >
<label class="md-nav__link" for="__nav_1" id="__nav_1_label" tabindex="">
<span class="md-ellipsis">
Getting Started
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_1">
<span class="md-nav__icon md-icon"></span>
Getting Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Welcome
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai_installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai_quickstart/" class="md-nav__link">
<span class="md-ellipsis">
Quickstart
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai_list_of_models/" class="md-nav__link">
<span class="md-ellipsis">
Available Models
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_1_5" >
<label class="md-nav__link" for="__nav_1_5" id="__nav_1_5_label" tabindex="0">
<span class="md-ellipsis">
Model Providers
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_1_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_1_5">
<span class="md-nav__icon md-icon"></span>
Model Providers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../providers/openrouter.md" class="md-nav__link">
<span class="md-ellipsis">
OpenRouter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../providers/ollama/" class="md-nav__link">
<span class="md-ellipsis">
Ollama
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../providers/azure.md" class="md-nav__link">
<span class="md-ellipsis">
Azure OpenAI
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../cai_pro/" class="md-nav__link">
<span class="md-ellipsis">
🚀 CAI PRO
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="">
<span class="md-ellipsis">
Core Concepts
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Core Concepts
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cai_architecture/" class="md-nav__link">
<span class="md-ellipsis">
Architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/" class="md-nav__link">
<span class="md-ellipsis">
Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tools/" class="md-nav__link">
<span class="md-ellipsis">
Tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../handoffs/" class="md-nav__link">
<span class="md-ellipsis">
Handoffs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../multi_agent/" class="md-nav__link">
<span class="md-ellipsis">
Multi-Agent Systems
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="">
<span class="md-ellipsis">
Benchmarking
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Benchmarking
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../benchmarking/overview/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../benchmarking/running_benchmarks/" class="md-nav__link">
<span class="md-ellipsis">
Running Benchmarks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../benchmarking/attack_defense/" class="md-nav__link">
<span class="md-ellipsis">
Attack & Defense CTFs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../benchmarking/jeopardy_ctfs/" class="md-nav__link">
<span class="md-ellipsis">
Jeopardy CTFs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../benchmarking/cyber_ranges/" class="md-nav__link">
<span class="md-ellipsis">
Cyber Ranges
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../benchmarking/knowledge_benchmarks/" class="md-nav__link">
<span class="md-ellipsis">
Knowledge Benchmarks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../benchmarking/privacy_benchmarks/" class="md-nav__link">
<span class="md-ellipsis">
Privacy Benchmarks
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="">
<span class="md-ellipsis">
Guides
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../running_agents/" class="md-nav__link">
<span class="md-ellipsis">
Running Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../continue_mode/" class="md-nav__link">
<span class="md-ellipsis">
Continue Mode
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../results/" class="md-nav__link">
<span class="md-ellipsis">
Working with Results
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../streaming/" class="md-nav__link">
<span class="md-ellipsis">
Streaming
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tracing/" class="md-nav__link">
<span class="md-ellipsis">
Tracing & Debugging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../context/" class="md-nav__link">
<span class="md-ellipsis">
Context Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../guardrails/" class="md-nav__link">
<span class="md-ellipsis">
Guardrails & Security
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../environment_variables/" class="md-nav__link">
<span class="md-ellipsis">
Environment Variables
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai/getting-started/packet_capture_wsl/" class="md-nav__link">
<span class="md-ellipsis">
Packet Capture on WSL2
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="">
<span class="md-ellipsis">
Troubleshooting
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Troubleshooting
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cai/troubleshooting/operator_feedback_reproduction/" class="md-nav__link">
<span class="md-ellipsis">
Operator Feedback Reproduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai/troubleshooting/platform_limitations/" class="md-nav__link">
<span class="md-ellipsis">
Platform Limitations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_7" >
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
<span class="md-ellipsis">
Case Studies
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Case Studies
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cai/case-studies/operator-artifact-evidence/" class="md-nav__link">
<span class="md-ellipsis">
Operator Artifact Evidence
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="">
<span class="md-ellipsis">
Mobile UI (iOS)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Mobile UI (iOS)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../mui/mui_index/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mui/getting_started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mui/user_interface/" class="md-nav__link">
<span class="md-ellipsis">
User Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mui/gestures_shortcuts/" class="md-nav__link">
<span class="md-ellipsis">
Gestures & Shortcuts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../mui/chat_features/" class="md-nav__link">
<span class="md-ellipsis">
Chat Features
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="">
<span class="md-ellipsis">
Terminal UI (TUI) - Deprecated
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
Terminal UI (TUI) - Deprecated
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../tui/tui_index/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/getting_started/" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/user_interface/" class="md-nav__link">
<span class="md-ellipsis">
User Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/terminals_management/" class="md-nav__link">
<span class="md-ellipsis">
Terminals Management
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/teams_and_parallel_execution/" class="md-nav__link">
<span class="md-ellipsis">
Teams & Parallel Execution
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/sidebar_features/" class="md-nav__link">
<span class="md-ellipsis">
Sidebar Features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/keyboard_shortcuts/" class="md-nav__link">
<span class="md-ellipsis">
Keyboard Shortcuts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/commands_reference/" class="md-nav__link">
<span class="md-ellipsis">
Commands Reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/advanced_features/" class="md-nav__link">
<span class="md-ellipsis">
Advanced Features
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tui/troubleshooting/" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" checked>
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="">
<span class="md-ellipsis">
API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10_1" checked>
<label class="md-nav__link" for="__nav_10_1" id="__nav_10_1_label" tabindex="0">
<span class="md-ellipsis">
Agents
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_1_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_10_1">
<span class="md-nav__icon md-icon"></span>
Agents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../agent/" class="md-nav__link">
<span class="md-ellipsis">
Agent
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Runner
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Runner
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run" class="md-nav__link">
<span class="md-ellipsis">
run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner" class="md-nav__link">
<span class="md-ellipsis">
Runner
</span>
</a>
<nav class="md-nav" aria-label="Runner">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner.run" class="md-nav__link">
<span class="md-ellipsis">
run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner.run_sync" class="md-nav__link">
<span class="md-ellipsis">
run_sync
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner.run_streamed" class="md-nav__link">
<span class="md-ellipsis">
run_streamed
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig" class="md-nav__link">
<span class="md-ellipsis">
RunConfig
</span>
</a>
<nav class="md-nav" aria-label="RunConfig">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.model" class="md-nav__link">
<span class="md-ellipsis">
model
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.model_provider" class="md-nav__link">
<span class="md-ellipsis">
model_provider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.model_settings" class="md-nav__link">
<span class="md-ellipsis">
model_settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.handoff_input_filter" class="md-nav__link">
<span class="md-ellipsis">
handoff_input_filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.input_guardrails" class="md-nav__link">
<span class="md-ellipsis">
input_guardrails
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.output_guardrails" class="md-nav__link">
<span class="md-ellipsis">
output_guardrails
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.tracing_disabled" class="md-nav__link">
<span class="md-ellipsis">
tracing_disabled
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.trace_include_sensitive_data" class="md-nav__link">
<span class="md-ellipsis">
trace_include_sensitive_data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.workflow_name" class="md-nav__link">
<span class="md-ellipsis">
workflow_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.trace_id" class="md-nav__link">
<span class="md-ellipsis">
trace_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.group_id" class="md-nav__link">
<span class="md-ellipsis">
group_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.trace_metadata" class="md-nav__link">
<span class="md-ellipsis">
trace_metadata
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../tool/" class="md-nav__link">
<span class="md-ellipsis">
Tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../result/" class="md-nav__link">
<span class="md-ellipsis">
Result
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../stream_events/" class="md-nav__link">
<span class="md-ellipsis">
Stream Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../handoffs/" class="md-nav__link">
<span class="md-ellipsis">
Handoffs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lifecycle/" class="md-nav__link">
<span class="md-ellipsis">
Lifecycle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../items/" class="md-nav__link">
<span class="md-ellipsis">
Items
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../run_context/" class="md-nav__link">
<span class="md-ellipsis">
Run Context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usage/" class="md-nav__link">
<span class="md-ellipsis">
Usage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../exceptions/" class="md-nav__link">
<span class="md-ellipsis">
Exceptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../guardrail/" class="md-nav__link">
<span class="md-ellipsis">
Guardrail
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../model_settings/" class="md-nav__link">
<span class="md-ellipsis">
Model Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../agent_output/" class="md-nav__link">
<span class="md-ellipsis">
Agent Output
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../function_schema/" class="md-nav__link">
<span class="md-ellipsis">
Function Schema
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10_2" >
<label class="md-nav__link" for="__nav_10_2" id="__nav_10_2_label" tabindex="0">
<span class="md-ellipsis">
Models
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10_2">
<span class="md-nav__icon md-icon"></span>
Models
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../models/interface/" class="md-nav__link">
<span class="md-ellipsis">
Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../models/openai_chatcompletions/" class="md-nav__link">
<span class="md-ellipsis">
OpenAI Chat Completions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../models/openai_responses/" class="md-nav__link">
<span class="md-ellipsis">
OpenAI Responses
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10_3" >
<label class="md-nav__link" for="__nav_10_3" id="__nav_10_3_label" tabindex="0">
<span class="md-ellipsis">
Extensions
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10_3">
<span class="md-nav__icon md-icon"></span>
Extensions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../extensions/handoff_filters/" class="md-nav__link">
<span class="md-ellipsis">
Handoff Filters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../extensions/handoff_prompt/" class="md-nav__link">
<span class="md-ellipsis">
Handoff Prompt
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_11" >
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="">
<span class="md-ellipsis">
Advanced
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
Advanced
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cai_development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_12" >
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="">
<span class="md-ellipsis">
Research
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
Research
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../research/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_13" >
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="">
<span class="md-ellipsis">
Resources
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
Resources
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cai_faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai_find_us/" class="md-nav__link">
<span class="md-ellipsis">
Find Us
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai_citation_and_acknowledgments/" class="md-nav__link">
<span class="md-ellipsis">
Citation & Acknowledgments
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run" class="md-nav__link">
<span class="md-ellipsis">
run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner" class="md-nav__link">
<span class="md-ellipsis">
Runner
</span>
</a>
<nav class="md-nav" aria-label="Runner">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner.run" class="md-nav__link">
<span class="md-ellipsis">
run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner.run_sync" class="md-nav__link">
<span class="md-ellipsis">
run_sync
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.Runner.run_streamed" class="md-nav__link">
<span class="md-ellipsis">
run_streamed
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig" class="md-nav__link">
<span class="md-ellipsis">
RunConfig
</span>
</a>
<nav class="md-nav" aria-label="RunConfig">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.model" class="md-nav__link">
<span class="md-ellipsis">
model
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.model_provider" class="md-nav__link">
<span class="md-ellipsis">
model_provider
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.model_settings" class="md-nav__link">
<span class="md-ellipsis">
model_settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.handoff_input_filter" class="md-nav__link">
<span class="md-ellipsis">
handoff_input_filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.input_guardrails" class="md-nav__link">
<span class="md-ellipsis">
input_guardrails
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.output_guardrails" class="md-nav__link">
<span class="md-ellipsis">
output_guardrails
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.tracing_disabled" class="md-nav__link">
<span class="md-ellipsis">
tracing_disabled
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.trace_include_sensitive_data" class="md-nav__link">
<span class="md-ellipsis">
trace_include_sensitive_data
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.workflow_name" class="md-nav__link">
<span class="md-ellipsis">
workflow_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.trace_id" class="md-nav__link">
<span class="md-ellipsis">
trace_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.group_id" class="md-nav__link">
<span class="md-ellipsis">
group_id
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.run.RunConfig.trace_metadata" class="md-nav__link">
<span class="md-ellipsis">
trace_metadata
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="runner"><code>Runner</code></h1>
<div class="doc doc-object doc-module">
<a id="cai.sdk.agents.run"></a>
<div class="doc doc-contents first">
<div class="doc doc-children">
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.run.Runner" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">Runner</span>
</h3>
<div class="doc doc-contents ">
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/run.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 134</span>
<span class="normal"> 135</span>
<span class="normal"> 136</span>
<span class="normal"> 137</span>
<span class="normal"> 138</span>
<span class="normal"> 139</span>
<span class="normal"> 140</span>
<span class="normal"> 141</span>
<span class="normal"> 142</span>
<span class="normal"> 143</span>
<span class="normal"> 144</span>
<span class="normal"> 145</span>
<span class="normal"> 146</span>
<span class="normal"> 147</span>
<span class="normal"> 148</span>
<span class="normal"> 149</span>
<span class="normal"> 150</span>
<span class="normal"> 151</span>
<span class="normal"> 152</span>
<span class="normal"> 153</span>
<span class="normal"> 154</span>
<span class="normal"> 155</span>
<span class="normal"> 156</span>
<span class="normal"> 157</span>
<span class="normal"> 158</span>
<span class="normal"> 159</span>
<span class="normal"> 160</span>
<span class="normal"> 161</span>
<span class="normal"> 162</span>
<span class="normal"> 163</span>
<span class="normal"> 164</span>
<span class="normal"> 165</span>
<span class="normal"> 166</span>
<span class="normal"> 167</span>
<span class="normal"> 168</span>
<span class="normal"> 169</span>
<span class="normal"> 170</span>
<span class="normal"> 171</span>
<span class="normal"> 172</span>
<span class="normal"> 173</span>
<span class="normal"> 174</span>
<span class="normal"> 175</span>
<span class="normal"> 176</span>
<span class="normal"> 177</span>
<span class="normal"> 178</span>
<span class="normal"> 179</span>
<span class="normal"> 180</span>
<span class="normal"> 181</span>
<span class="normal"> 182</span>
<span class="normal"> 183</span>
<span class="normal"> 184</span>
<span class="normal"> 185</span>
<span class="normal"> 186</span>
<span class="normal"> 187</span>
<span class="normal"> 188</span>
<span class="normal"> 189</span>
<span class="normal"> 190</span>
<span class="normal"> 191</span>
<span class="normal"> 192</span>
<span class="normal"> 193</span>
<span class="normal"> 194</span>
<span class="normal"> 195</span>
<span class="normal"> 196</span>
<span class="normal"> 197</span>
<span class="normal"> 198</span>
<span class="normal"> 199</span>
<span class="normal"> 200</span>
<span class="normal"> 201</span>
<span class="normal"> 202</span>
<span class="normal"> 203</span>
<span class="normal"> 204</span>
<span class="normal"> 205</span>
<span class="normal"> 206</span>
<span class="normal"> 207</span>
<span class="normal"> 208</span>
<span class="normal"> 209</span>
<span class="normal"> 210</span>
<span class="normal"> 211</span>
<span class="normal"> 212</span>
<span class="normal"> 213</span>
<span class="normal"> 214</span>
<span class="normal"> 215</span>
<span class="normal"> 216</span>
<span class="normal"> 217</span>
<span class="normal"> 218</span>
<span class="normal"> 219</span>
<span class="normal"> 220</span>
<span class="normal"> 221</span>
<span class="normal"> 222</span>
<span class="normal"> 223</span>
<span class="normal"> 224</span>
<span class="normal"> 225</span>
<span class="normal"> 226</span>
<span class="normal"> 227</span>
<span class="normal"> 228</span>
<span class="normal"> 229</span>
<span class="normal"> 230</span>
<span class="normal"> 231</span>
<span class="normal"> 232</span>
<span class="normal"> 233</span>
<span class="normal"> 234</span>
<span class="normal"> 235</span>
<span class="normal"> 236</span>
<span class="normal"> 237</span>
<span class="normal"> 238</span>
<span class="normal"> 239</span>
<span class="normal"> 240</span>
<span class="normal"> 241</span>
<span class="normal"> 242</span>
<span class="normal"> 243</span>
<span class="normal"> 244</span>
<span class="normal"> 245</span>
<span class="normal"> 246</span>
<span class="normal"> 247</span>
<span class="normal"> 248</span>
<span class="normal"> 249</span>
<span class="normal"> 250</span>
<span class="normal"> 251</span>
<span class="normal"> 252</span>
<span class="normal"> 253</span>
<span class="normal"> 254</span>
<span class="normal"> 255</span>
<span class="normal"> 256</span>
<span class="normal"> 257</span>
<span class="normal"> 258</span>
<span class="normal"> 259</span>
<span class="normal"> 260</span>
<span class="normal"> 261</span>
<span class="normal"> 262</span>
<span class="normal"> 263</span>
<span class="normal"> 264</span>
<span class="normal"> 265</span>
<span class="normal"> 266</span>
<span class="normal"> 267</span>
<span class="normal"> 268</span>
<span class="normal"> 269</span>
<span class="normal"> 270</span>
<span class="normal"> 271</span>
<span class="normal"> 272</span>
<span class="normal"> 273</span>
<span class="normal"> 274</span>
<span class="normal"> 275</span>
<span class="normal"> 276</span>
<span class="normal"> 277</span>
<span class="normal"> 278</span>
<span class="normal"> 279</span>
<span class="normal"> 280</span>
<span class="normal"> 281</span>
<span class="normal"> 282</span>
<span class="normal"> 283</span>
<span class="normal"> 284</span>
<span class="normal"> 285</span>
<span class="normal"> 286</span>
<span class="normal"> 287</span>
<span class="normal"> 288</span>
<span class="normal"> 289</span>
<span class="normal"> 290</span>
<span class="normal"> 291</span>
<span class="normal"> 292</span>
<span class="normal"> 293</span>
<span class="normal"> 294</span>
<span class="normal"> 295</span>
<span class="normal"> 296</span>
<span class="normal"> 297</span>
<span class="normal"> 298</span>
<span class="normal"> 299</span>
<span class="normal"> 300</span>
<span class="normal"> 301</span>
<span class="normal"> 302</span>
<span class="normal"> 303</span>
<span class="normal"> 304</span>
<span class="normal"> 305</span>
<span class="normal"> 306</span>
<span class="normal"> 307</span>
<span class="normal"> 308</span>
<span class="normal"> 309</span>
<span class="normal"> 310</span>
<span class="normal"> 311</span>
<span class="normal"> 312</span>
<span class="normal"> 313</span>
<span class="normal"> 314</span>
<span class="normal"> 315</span>
<span class="normal"> 316</span>
<span class="normal"> 317</span>
<span class="normal"> 318</span>
<span class="normal"> 319</span>
<span class="normal"> 320</span>
<span class="normal"> 321</span>
<span class="normal"> 322</span>
<span class="normal"> 323</span>
<span class="normal"> 324</span>
<span class="normal"> 325</span>
<span class="normal"> 326</span>
<span class="normal"> 327</span>
<span class="normal"> 328</span>
<span class="normal"> 329</span>
<span class="normal"> 330</span>
<span class="normal"> 331</span>
<span class="normal"> 332</span>
<span class="normal"> 333</span>
<span class="normal"> 334</span>
<span class="normal"> 335</span>
<span class="normal"> 336</span>
<span class="normal"> 337</span>
<span class="normal"> 338</span>
<span class="normal"> 339</span>
<span class="normal"> 340</span>
<span class="normal"> 341</span>
<span class="normal"> 342</span>
<span class="normal"> 343</span>
<span class="normal"> 344</span>
<span class="normal"> 345</span>
<span class="normal"> 346</span>
<span class="normal"> 347</span>
<span class="normal"> 348</span>
<span class="normal"> 349</span>
<span class="normal"> 350</span>
<span class="normal"> 351</span>
<span class="normal"> 352</span>
<span class="normal"> 353</span>
<span class="normal"> 354</span>
<span class="normal"> 355</span>
<span class="normal"> 356</span>
<span class="normal"> 357</span>
<span class="normal"> 358</span>
<span class="normal"> 359</span>
<span class="normal"> 360</span>
<span class="normal"> 361</span>
<span class="normal"> 362</span>
<span class="normal"> 363</span>
<span class="normal"> 364</span>
<span class="normal"> 365</span>
<span class="normal"> 366</span>
<span class="normal"> 367</span>
<span class="normal"> 368</span>
<span class="normal"> 369</span>
<span class="normal"> 370</span>
<span class="normal"> 371</span>
<span class="normal"> 372</span>
<span class="normal"> 373</span>
<span class="normal"> 374</span>
<span class="normal"> 375</span>
<span class="normal"> 376</span>
<span class="normal"> 377</span>
<span class="normal"> 378</span>
<span class="normal"> 379</span>
<span class="normal"> 380</span>
<span class="normal"> 381</span>
<span class="normal"> 382</span>
<span class="normal"> 383</span>
<span class="normal"> 384</span>
<span class="normal"> 385</span>
<span class="normal"> 386</span>
<span class="normal"> 387</span>
<span class="normal"> 388</span>
<span class="normal"> 389</span>
<span class="normal"> 390</span>
<span class="normal"> 391</span>
<span class="normal"> 392</span>
<span class="normal"> 393</span>
<span class="normal"> 394</span>
<span class="normal"> 395</span>
<span class="normal"> 396</span>
<span class="normal"> 397</span>
<span class="normal"> 398</span>
<span class="normal"> 399</span>
<span class="normal"> 400</span>
<span class="normal"> 401</span>
<span class="normal"> 402</span>
<span class="normal"> 403</span>
<span class="normal"> 404</span>
<span class="normal"> 405</span>
<span class="normal"> 406</span>
<span class="normal"> 407</span>
<span class="normal"> 408</span>
<span class="normal"> 409</span>
<span class="normal"> 410</span>
<span class="normal"> 411</span>
<span class="normal"> 412</span>
<span class="normal"> 413</span>
<span class="normal"> 414</span>
<span class="normal"> 415</span>
<span class="normal"> 416</span>
<span class="normal"> 417</span>
<span class="normal"> 418</span>
<span class="normal"> 419</span>
<span class="normal"> 420</span>
<span class="normal"> 421</span>
<span class="normal"> 422</span>
<span class="normal"> 423</span>
<span class="normal"> 424</span>
<span class="normal"> 425</span>
<span class="normal"> 426</span>
<span class="normal"> 427</span>
<span class="normal"> 428</span>
<span class="normal"> 429</span>
<span class="normal"> 430</span>
<span class="normal"> 431</span>
<span class="normal"> 432</span>
<span class="normal"> 433</span>
<span class="normal"> 434</span>
<span class="normal"> 435</span>
<span class="normal"> 436</span>
<span class="normal"> 437</span>
<span class="normal"> 438</span>
<span class="normal"> 439</span>
<span class="normal"> 440</span>
<span class="normal"> 441</span>
<span class="normal"> 442</span>
<span class="normal"> 443</span>
<span class="normal"> 444</span>
<span class="normal"> 445</span>
<span class="normal"> 446</span>
<span class="normal"> 447</span>
<span class="normal"> 448</span>
<span class="normal"> 449</span>
<span class="normal"> 450</span>
<span class="normal"> 451</span>
<span class="normal"> 452</span>
<span class="normal"> 453</span>
<span class="normal"> 454</span>
<span class="normal"> 455</span>
<span class="normal"> 456</span>
<span class="normal"> 457</span>
<span class="normal"> 458</span>
<span class="normal"> 459</span>
<span class="normal"> 460</span>
<span class="normal"> 461</span>
<span class="normal"> 462</span>
<span class="normal"> 463</span>
<span class="normal"> 464</span>
<span class="normal"> 465</span>
<span class="normal"> 466</span>
<span class="normal"> 467</span>
<span class="normal"> 468</span>
<span class="normal"> 469</span>
<span class="normal"> 470</span>
<span class="normal"> 471</span>
<span class="normal"> 472</span>
<span class="normal"> 473</span>
<span class="normal"> 474</span>
<span class="normal"> 475</span>
<span class="normal"> 476</span>
<span class="normal"> 477</span>
<span class="normal"> 478</span>
<span class="normal"> 479</span>
<span class="normal"> 480</span>
<span class="normal"> 481</span>
<span class="normal"> 482</span>
<span class="normal"> 483</span>
<span class="normal"> 484</span>
<span class="normal"> 485</span>
<span class="normal"> 486</span>
<span class="normal"> 487</span>
<span class="normal"> 488</span>
<span class="normal"> 489</span>
<span class="normal"> 490</span>
<span class="normal"> 491</span>
<span class="normal"> 492</span>
<span class="normal"> 493</span>
<span class="normal"> 494</span>
<span class="normal"> 495</span>
<span class="normal"> 496</span>
<span class="normal"> 497</span>
<span class="normal"> 498</span>
<span class="normal"> 499</span>
<span class="normal"> 500</span>
<span class="normal"> 501</span>
<span class="normal"> 502</span>
<span class="normal"> 503</span>
<span class="normal"> 504</span>
<span class="normal"> 505</span>
<span class="normal"> 506</span>
<span class="normal"> 507</span>
<span class="normal"> 508</span>
<span class="normal"> 509</span>
<span class="normal"> 510</span>
<span class="normal"> 511</span>
<span class="normal"> 512</span>
<span class="normal"> 513</span>
<span class="normal"> 514</span>
<span class="normal"> 515</span>
<span class="normal"> 516</span>
<span class="normal"> 517</span>
<span class="normal"> 518</span>
<span class="normal"> 519</span>
<span class="normal"> 520</span>
<span class="normal"> 521</span>
<span class="normal"> 522</span>
<span class="normal"> 523</span>
<span class="normal"> 524</span>
<span class="normal"> 525</span>
<span class="normal"> 526</span>
<span class="normal"> 527</span>
<span class="normal"> 528</span>
<span class="normal"> 529</span>
<span class="normal"> 530</span>
<span class="normal"> 531</span>
<span class="normal"> 532</span>
<span class="normal"> 533</span>
<span class="normal"> 534</span>
<span class="normal"> 535</span>
<span class="normal"> 536</span>
<span class="normal"> 537</span>
<span class="normal"> 538</span>
<span class="normal"> 539</span>
<span class="normal"> 540</span>
<span class="normal"> 541</span>
<span class="normal"> 542</span>
<span class="normal"> 543</span>
<span class="normal"> 544</span>
<span class="normal"> 545</span>
<span class="normal"> 546</span>
<span class="normal"> 547</span>
<span class="normal"> 548</span>
<span class="normal"> 549</span>
<span class="normal"> 550</span>
<span class="normal"> 551</span>
<span class="normal"> 552</span>
<span class="normal"> 553</span>
<span class="normal"> 554</span>
<span class="normal"> 555</span>
<span class="normal"> 556</span>
<span class="normal"> 557</span>
<span class="normal"> 558</span>
<span class="normal"> 559</span>
<span class="normal"> 560</span>
<span class="normal"> 561</span>
<span class="normal"> 562</span>
<span class="normal"> 563</span>
<span class="normal"> 564</span>
<span class="normal"> 565</span>
<span class="normal"> 566</span>
<span class="normal"> 567</span>
<span class="normal"> 568</span>
<span class="normal"> 569</span>
<span class="normal"> 570</span>
<span class="normal"> 571</span>
<span class="normal"> 572</span>
<span class="normal"> 573</span>
<span class="normal"> 574</span>
<span class="normal"> 575</span>
<span class="normal"> 576</span>
<span class="normal"> 577</span>
<span class="normal"> 578</span>
<span class="normal"> 579</span>
<span class="normal"> 580</span>
<span class="normal"> 581</span>
<span class="normal"> 582</span>
<span class="normal"> 583</span>
<span class="normal"> 584</span>
<span class="normal"> 585</span>
<span class="normal"> 586</span>
<span class="normal"> 587</span>
<span class="normal"> 588</span>
<span class="normal"> 589</span>
<span class="normal"> 590</span>
<span class="normal"> 591</span>
<span class="normal"> 592</span>
<span class="normal"> 593</span>
<span class="normal"> 594</span>
<span class="normal"> 595</span>
<span class="normal"> 596</span>
<span class="normal"> 597</span>
<span class="normal"> 598</span>
<span class="normal"> 599</span>
<span class="normal"> 600</span>
<span class="normal"> 601</span>
<span class="normal"> 602</span>
<span class="normal"> 603</span>
<span class="normal"> 604</span>
<span class="normal"> 605</span>
<span class="normal"> 606</span>
<span class="normal"> 607</span>
<span class="normal"> 608</span>
<span class="normal"> 609</span>
<span class="normal"> 610</span>
<span class="normal"> 611</span>
<span class="normal"> 612</span>
<span class="normal"> 613</span>
<span class="normal"> 614</span>
<span class="normal"> 615</span>
<span class="normal"> 616</span>
<span class="normal"> 617</span>
<span class="normal"> 618</span>
<span class="normal"> 619</span>
<span class="normal"> 620</span>
<span class="normal"> 621</span>
<span class="normal"> 622</span>
<span class="normal"> 623</span>
<span class="normal"> 624</span>
<span class="normal"> 625</span>
<span class="normal"> 626</span>
<span class="normal"> 627</span>
<span class="normal"> 628</span>
<span class="normal"> 629</span>
<span class="normal"> 630</span>
<span class="normal"> 631</span>
<span class="normal"> 632</span>
<span class="normal"> 633</span>
<span class="normal"> 634</span>
<span class="normal"> 635</span>
<span class="normal"> 636</span>
<span class="normal"> 637</span>
<span class="normal"> 638</span>
<span class="normal"> 639</span>
<span class="normal"> 640</span>
<span class="normal"> 641</span>
<span class="normal"> 642</span>
<span class="normal"> 643</span>
<span class="normal"> 644</span>
<span class="normal"> 645</span>
<span class="normal"> 646</span>
<span class="normal"> 647</span>
<span class="normal"> 648</span>
<span class="normal"> 649</span>
<span class="normal"> 650</span>
<span class="normal"> 651</span>
<span class="normal"> 652</span>
<span class="normal"> 653</span>
<span class="normal"> 654</span>
<span class="normal"> 655</span>
<span class="normal"> 656</span>
<span class="normal"> 657</span>
<span class="normal"> 658</span>
<span class="normal"> 659</span>
<span class="normal"> 660</span>
<span class="normal"> 661</span>
<span class="normal"> 662</span>
<span class="normal"> 663</span>
<span class="normal"> 664</span>
<span class="normal"> 665</span>
<span class="normal"> 666</span>
<span class="normal"> 667</span>
<span class="normal"> 668</span>
<span class="normal"> 669</span>
<span class="normal"> 670</span>
<span class="normal"> 671</span>
<span class="normal"> 672</span>
<span class="normal"> 673</span>
<span class="normal"> 674</span>
<span class="normal"> 675</span>
<span class="normal"> 676</span>
<span class="normal"> 677</span>
<span class="normal"> 678</span>
<span class="normal"> 679</span>
<span class="normal"> 680</span>
<span class="normal"> 681</span>
<span class="normal"> 682</span>
<span class="normal"> 683</span>
<span class="normal"> 684</span>
<span class="normal"> 685</span>
<span class="normal"> 686</span>
<span class="normal"> 687</span>
<span class="normal"> 688</span>
<span class="normal"> 689</span>
<span class="normal"> 690</span>
<span class="normal"> 691</span>
<span class="normal"> 692</span>
<span class="normal"> 693</span>
<span class="normal"> 694</span>
<span class="normal"> 695</span>
<span class="normal"> 696</span>
<span class="normal"> 697</span>
<span class="normal"> 698</span>
<span class="normal"> 699</span>
<span class="normal"> 700</span>
<span class="normal"> 701</span>
<span class="normal"> 702</span>
<span class="normal"> 703</span>
<span class="normal"> 704</span>
<span class="normal"> 705</span>
<span class="normal"> 706</span>
<span class="normal"> 707</span>
<span class="normal"> 708</span>
<span class="normal"> 709</span>
<span class="normal"> 710</span>
<span class="normal"> 711</span>
<span class="normal"> 712</span>
<span class="normal"> 713</span>
<span class="normal"> 714</span>
<span class="normal"> 715</span>
<span class="normal"> 716</span>
<span class="normal"> 717</span>
<span class="normal"> 718</span>
<span class="normal"> 719</span>
<span class="normal"> 720</span>
<span class="normal"> 721</span>
<span class="normal"> 722</span>
<span class="normal"> 723</span>
<span class="normal"> 724</span>
<span class="normal"> 725</span>
<span class="normal"> 726</span>
<span class="normal"> 727</span>
<span class="normal"> 728</span>
<span class="normal"> 729</span>
<span class="normal"> 730</span>
<span class="normal"> 731</span>
<span class="normal"> 732</span>
<span class="normal"> 733</span>
<span class="normal"> 734</span>
<span class="normal"> 735</span>
<span class="normal"> 736</span>
<span class="normal"> 737</span>
<span class="normal"> 738</span>
<span class="normal"> 739</span>
<span class="normal"> 740</span>
<span class="normal"> 741</span>
<span class="normal"> 742</span>
<span class="normal"> 743</span>
<span class="normal"> 744</span>
<span class="normal"> 745</span>
<span class="normal"> 746</span>
<span class="normal"> 747</span>
<span class="normal"> 748</span>
<span class="normal"> 749</span>
<span class="normal"> 750</span>
<span class="normal"> 751</span>
<span class="normal"> 752</span>
<span class="normal"> 753</span>
<span class="normal"> 754</span>
<span class="normal"> 755</span>
<span class="normal"> 756</span>
<span class="normal"> 757</span>
<span class="normal"> 758</span>
<span class="normal"> 759</span>
<span class="normal"> 760</span>
<span class="normal"> 761</span>
<span class="normal"> 762</span>
<span class="normal"> 763</span>
<span class="normal"> 764</span>
<span class="normal"> 765</span>
<span class="normal"> 766</span>
<span class="normal"> 767</span>
<span class="normal"> 768</span>
<span class="normal"> 769</span>
<span class="normal"> 770</span>
<span class="normal"> 771</span>
<span class="normal"> 772</span>
<span class="normal"> 773</span>
<span class="normal"> 774</span>
<span class="normal"> 775</span>
<span class="normal"> 776</span>
<span class="normal"> 777</span>
<span class="normal"> 778</span>
<span class="normal"> 779</span>
<span class="normal"> 780</span>
<span class="normal"> 781</span>
<span class="normal"> 782</span>
<span class="normal"> 783</span>
<span class="normal"> 784</span>
<span class="normal"> 785</span>
<span class="normal"> 786</span>
<span class="normal"> 787</span>
<span class="normal"> 788</span>
<span class="normal"> 789</span>
<span class="normal"> 790</span>
<span class="normal"> 791</span>
<span class="normal"> 792</span>
<span class="normal"> 793</span>
<span class="normal"> 794</span>
<span class="normal"> 795</span>
<span class="normal"> 796</span>
<span class="normal"> 797</span>
<span class="normal"> 798</span>
<span class="normal"> 799</span>
<span class="normal"> 800</span>
<span class="normal"> 801</span>
<span class="normal"> 802</span>
<span class="normal"> 803</span>
<span class="normal"> 804</span>
<span class="normal"> 805</span>
<span class="normal"> 806</span>
<span class="normal"> 807</span>
<span class="normal"> 808</span>
<span class="normal"> 809</span>
<span class="normal"> 810</span>
<span class="normal"> 811</span>
<span class="normal"> 812</span>
<span class="normal"> 813</span>
<span class="normal"> 814</span>
<span class="normal"> 815</span>
<span class="normal"> 816</span>
<span class="normal"> 817</span>
<span class="normal"> 818</span>
<span class="normal"> 819</span>
<span class="normal"> 820</span>
<span class="normal"> 821</span>
<span class="normal"> 822</span>
<span class="normal"> 823</span>
<span class="normal"> 824</span>
<span class="normal"> 825</span>
<span class="normal"> 826</span>
<span class="normal"> 827</span>
<span class="normal"> 828</span>
<span class="normal"> 829</span>
<span class="normal"> 830</span>
<span class="normal"> 831</span>
<span class="normal"> 832</span>
<span class="normal"> 833</span>
<span class="normal"> 834</span>
<span class="normal"> 835</span>
<span class="normal"> 836</span>
<span class="normal"> 837</span>
<span class="normal"> 838</span>
<span class="normal"> 839</span>
<span class="normal"> 840</span>
<span class="normal"> 841</span>
<span class="normal"> 842</span>
<span class="normal"> 843</span>
<span class="normal"> 844</span>
<span class="normal"> 845</span>
<span class="normal"> 846</span>
<span class="normal"> 847</span>
<span class="normal"> 848</span>
<span class="normal"> 849</span>
<span class="normal"> 850</span>
<span class="normal"> 851</span>
<span class="normal"> 852</span>
<span class="normal"> 853</span>
<span class="normal"> 854</span>
<span class="normal"> 855</span>
<span class="normal"> 856</span>
<span class="normal"> 857</span>
<span class="normal"> 858</span>
<span class="normal"> 859</span>
<span class="normal"> 860</span>
<span class="normal"> 861</span>
<span class="normal"> 862</span>
<span class="normal"> 863</span>
<span class="normal"> 864</span>
<span class="normal"> 865</span>
<span class="normal"> 866</span>
<span class="normal"> 867</span>
<span class="normal"> 868</span>
<span class="normal"> 869</span>
<span class="normal"> 870</span>
<span class="normal"> 871</span>
<span class="normal"> 872</span>
<span class="normal"> 873</span>
<span class="normal"> 874</span>
<span class="normal"> 875</span>
<span class="normal"> 876</span>
<span class="normal"> 877</span>
<span class="normal"> 878</span>
<span class="normal"> 879</span>
<span class="normal"> 880</span>
<span class="normal"> 881</span>
<span class="normal"> 882</span>
<span class="normal"> 883</span>
<span class="normal"> 884</span>
<span class="normal"> 885</span>
<span class="normal"> 886</span>
<span class="normal"> 887</span>
<span class="normal"> 888</span>
<span class="normal"> 889</span>
<span class="normal"> 890</span>
<span class="normal"> 891</span>
<span class="normal"> 892</span>
<span class="normal"> 893</span>
<span class="normal"> 894</span>
<span class="normal"> 895</span>
<span class="normal"> 896</span>
<span class="normal"> 897</span>
<span class="normal"> 898</span>
<span class="normal"> 899</span>
<span class="normal"> 900</span>
<span class="normal"> 901</span>
<span class="normal"> 902</span>
<span class="normal"> 903</span>
<span class="normal"> 904</span>
<span class="normal"> 905</span>
<span class="normal"> 906</span>
<span class="normal"> 907</span>
<span class="normal"> 908</span>
<span class="normal"> 909</span>
<span class="normal"> 910</span>
<span class="normal"> 911</span>
<span class="normal"> 912</span>
<span class="normal"> 913</span>
<span class="normal"> 914</span>
<span class="normal"> 915</span>
<span class="normal"> 916</span>
<span class="normal"> 917</span>
<span class="normal"> 918</span>
<span class="normal"> 919</span>
<span class="normal"> 920</span>
<span class="normal"> 921</span>
<span class="normal"> 922</span>
<span class="normal"> 923</span>
<span class="normal"> 924</span>
<span class="normal"> 925</span>
<span class="normal"> 926</span>
<span class="normal"> 927</span>
<span class="normal"> 928</span>
<span class="normal"> 929</span>
<span class="normal"> 930</span>
<span class="normal"> 931</span>
<span class="normal"> 932</span>
<span class="normal"> 933</span>
<span class="normal"> 934</span>
<span class="normal"> 935</span>
<span class="normal"> 936</span>
<span class="normal"> 937</span>
<span class="normal"> 938</span>
<span class="normal"> 939</span>
<span class="normal"> 940</span>
<span class="normal"> 941</span>
<span class="normal"> 942</span>
<span class="normal"> 943</span>
<span class="normal"> 944</span>
<span class="normal"> 945</span>
<span class="normal"> 946</span>
<span class="normal"> 947</span>
<span class="normal"> 948</span>
<span class="normal"> 949</span>
<span class="normal"> 950</span>
<span class="normal"> 951</span>
<span class="normal"> 952</span>
<span class="normal"> 953</span>
<span class="normal"> 954</span>
<span class="normal"> 955</span>
<span class="normal"> 956</span>
<span class="normal"> 957</span>
<span class="normal"> 958</span>
<span class="normal"> 959</span>
<span class="normal"> 960</span>
<span class="normal"> 961</span>
<span class="normal"> 962</span>
<span class="normal"> 963</span>
<span class="normal"> 964</span>
<span class="normal"> 965</span>
<span class="normal"> 966</span>
<span class="normal"> 967</span>
<span class="normal"> 968</span>
<span class="normal"> 969</span>
<span class="normal"> 970</span>
<span class="normal"> 971</span>
<span class="normal"> 972</span>
<span class="normal"> 973</span>
<span class="normal"> 974</span>
<span class="normal"> 975</span>
<span class="normal"> 976</span>
<span class="normal"> 977</span>
<span class="normal"> 978</span>
<span class="normal"> 979</span>
<span class="normal"> 980</span>
<span class="normal"> 981</span>
<span class="normal"> 982</span>
<span class="normal"> 983</span>
<span class="normal"> 984</span>
<span class="normal"> 985</span>
<span class="normal"> 986</span>
<span class="normal"> 987</span>
<span class="normal"> 988</span>
<span class="normal"> 989</span>
<span class="normal"> 990</span>
<span class="normal"> 991</span>
<span class="normal"> 992</span>
<span class="normal"> 993</span>
<span class="normal"> 994</span>
<span class="normal"> 995</span>
<span class="normal"> 996</span>
<span class="normal"> 997</span>
<span class="normal"> 998</span>
<span class="normal"> 999</span>
<span class="normal">1000</span>
<span class="normal">1001</span>
<span class="normal">1002</span>
<span class="normal">1003</span>
<span class="normal">1004</span>
<span class="normal">1005</span>
<span class="normal">1006</span>
<span class="normal">1007</span>
<span class="normal">1008</span>
<span class="normal">1009</span>
<span class="normal">1010</span>
<span class="normal">1011</span>
<span class="normal">1012</span>
<span class="normal">1013</span>
<span class="normal">1014</span>
<span class="normal">1015</span>
<span class="normal">1016</span>
<span class="normal">1017</span>
<span class="normal">1018</span>
<span class="normal">1019</span>
<span class="normal">1020</span>
<span class="normal">1021</span>
<span class="normal">1022</span>
<span class="normal">1023</span>
<span class="normal">1024</span>
<span class="normal">1025</span>
<span class="normal">1026</span>
<span class="normal">1027</span>
<span class="normal">1028</span>
<span class="normal">1029</span>
<span class="normal">1030</span>
<span class="normal">1031</span>
<span class="normal">1032</span>
<span class="normal">1033</span>
<span class="normal">1034</span>
<span class="normal">1035</span>
<span class="normal">1036</span>
<span class="normal">1037</span>
<span class="normal">1038</span>
<span class="normal">1039</span>
<span class="normal">1040</span>
<span class="normal">1041</span>
<span class="normal">1042</span>
<span class="normal">1043</span>
<span class="normal">1044</span>
<span class="normal">1045</span>
<span class="normal">1046</span>
<span class="normal">1047</span>
<span class="normal">1048</span>
<span class="normal">1049</span>
<span class="normal">1050</span>
<span class="normal">1051</span>
<span class="normal">1052</span>
<span class="normal">1053</span>
<span class="normal">1054</span>
<span class="normal">1055</span>
<span class="normal">1056</span>
<span class="normal">1057</span>
<span class="normal">1058</span>
<span class="normal">1059</span>
<span class="normal">1060</span>
<span class="normal">1061</span>
<span class="normal">1062</span>
<span class="normal">1063</span>
<span class="normal">1064</span>
<span class="normal">1065</span>
<span class="normal">1066</span>
<span class="normal">1067</span>
<span class="normal">1068</span>
<span class="normal">1069</span>
<span class="normal">1070</span>
<span class="normal">1071</span>
<span class="normal">1072</span>
<span class="normal">1073</span>
<span class="normal">1074</span>
<span class="normal">1075</span>
<span class="normal">1076</span>
<span class="normal">1077</span>
<span class="normal">1078</span>
<span class="normal">1079</span>
<span class="normal">1080</span>
<span class="normal">1081</span>
<span class="normal">1082</span>
<span class="normal">1083</span>
<span class="normal">1084</span>
<span class="normal">1085</span>
<span class="normal">1086</span>
<span class="normal">1087</span>
<span class="normal">1088</span>
<span class="normal">1089</span>
<span class="normal">1090</span>
<span class="normal">1091</span>
<span class="normal">1092</span>
<span class="normal">1093</span>
<span class="normal">1094</span>
<span class="normal">1095</span>
<span class="normal">1096</span>
<span class="normal">1097</span>
<span class="normal">1098</span>
<span class="normal">1099</span>
<span class="normal">1100</span>
<span class="normal">1101</span>
<span class="normal">1102</span>
<span class="normal">1103</span>
<span class="normal">1104</span>
<span class="normal">1105</span>
<span class="normal">1106</span>
<span class="normal">1107</span>
<span class="normal">1108</span>
<span class="normal">1109</span>
<span class="normal">1110</span>
<span class="normal">1111</span>
<span class="normal">1112</span>
<span class="normal">1113</span>
<span class="normal">1114</span>
<span class="normal">1115</span>
<span class="normal">1116</span>
<span class="normal">1117</span>
<span class="normal">1118</span>
<span class="normal">1119</span>
<span class="normal">1120</span>
<span class="normal">1121</span>
<span class="normal">1122</span>
<span class="normal">1123</span>
<span class="normal">1124</span>
<span class="normal">1125</span>
<span class="normal">1126</span>
<span class="normal">1127</span>
<span class="normal">1128</span>
<span class="normal">1129</span>
<span class="normal">1130</span>
<span class="normal">1131</span>
<span class="normal">1132</span>
<span class="normal">1133</span>
<span class="normal">1134</span>
<span class="normal">1135</span>
<span class="normal">1136</span>
<span class="normal">1137</span>
<span class="normal">1138</span>
<span class="normal">1139</span>
<span class="normal">1140</span>
<span class="normal">1141</span>
<span class="normal">1142</span>
<span class="normal">1143</span>
<span class="normal">1144</span>
<span class="normal">1145</span>
<span class="normal">1146</span>
<span class="normal">1147</span>
<span class="normal">1148</span>
<span class="normal">1149</span>
<span class="normal">1150</span>
<span class="normal">1151</span>
<span class="normal">1152</span>
<span class="normal">1153</span>
<span class="normal">1154</span>
<span class="normal">1155</span>
<span class="normal">1156</span>
<span class="normal">1157</span>
<span class="normal">1158</span>
<span class="normal">1159</span>
<span class="normal">1160</span>
<span class="normal">1161</span>
<span class="normal">1162</span>
<span class="normal">1163</span>
<span class="normal">1164</span>
<span class="normal">1165</span>
<span class="normal">1166</span>
<span class="normal">1167</span>
<span class="normal">1168</span>
<span class="normal">1169</span>
<span class="normal">1170</span>
<span class="normal">1171</span>
<span class="normal">1172</span>
<span class="normal">1173</span>
<span class="normal">1174</span>
<span class="normal">1175</span>
<span class="normal">1176</span>
<span class="normal">1177</span>
<span class="normal">1178</span>
<span class="normal">1179</span>
<span class="normal">1180</span>
<span class="normal">1181</span>
<span class="normal">1182</span>
<span class="normal">1183</span>
<span class="normal">1184</span>
<span class="normal">1185</span>
<span class="normal">1186</span>
<span class="normal">1187</span>
<span class="normal">1188</span>
<span class="normal">1189</span>
<span class="normal">1190</span>
<span class="normal">1191</span>
<span class="normal">1192</span>
<span class="normal">1193</span>
<span class="normal">1194</span>
<span class="normal">1195</span>
<span class="normal">1196</span>
<span class="normal">1197</span>
<span class="normal">1198</span>
<span class="normal">1199</span>
<span class="normal">1200</span>
<span class="normal">1201</span>
<span class="normal">1202</span>
<span class="normal">1203</span>
<span class="normal">1204</span>
<span class="normal">1205</span>
<span class="normal">1206</span>
<span class="normal">1207</span>
<span class="normal">1208</span>
<span class="normal">1209</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-134"><span class="k">class</span><span class="w"> </span><span class="nc">Runner</span><span class="p">:</span>
</span><span id="__span-0-135"> <span class="nd">@classmethod</span>
</span><span id="__span-0-136"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span>
</span><span id="__span-0-137"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-138"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-139"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-140"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-141"> <span class="n">context</span><span class="p">:</span> <span class="n">TContext</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-142"> <span class="n">max_turns</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">DEFAULT_MAX_TURNS</span><span class="p">,</span>
</span><span id="__span-0-143"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-144"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-145"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RunResult</span><span class="p">:</span>
</span><span id="__span-0-146"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a workflow starting at the given agent. The agent will run in a loop until a final</span>
</span><span id="__span-0-147"><span class="sd"> output is generated. The loop runs like so:</span>
</span><span id="__span-0-148"><span class="sd"> 1. The agent is invoked with the given input.</span>
</span><span id="__span-0-149"><span class="sd"> 2. If there is a final output (i.e. the agent produces something of type</span>
</span><span id="__span-0-150"><span class="sd"> `agent.output_type`, the loop terminates.</span>
</span><span id="__span-0-151"><span class="sd"> 3. If there&#39;s a handoff, we run the loop again, with the new agent.</span>
</span><span id="__span-0-152"><span class="sd"> 4. Else, we run tool calls (if any), and re-run the loop.</span>
</span><span id="__span-0-153">
</span><span id="__span-0-154"><span class="sd"> In two cases, the agent may raise an exception:</span>
</span><span id="__span-0-155"><span class="sd"> 1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.</span>
</span><span id="__span-0-156"><span class="sd"> 2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</span>
</span><span id="__span-0-157">
</span><span id="__span-0-158"><span class="sd"> Note that only the first agent&#39;s input guardrails are run.</span>
</span><span id="__span-0-159">
</span><span id="__span-0-160"><span class="sd"> Args:</span>
</span><span id="__span-0-161"><span class="sd"> starting_agent: The starting agent to run.</span>
</span><span id="__span-0-162"><span class="sd"> input: The initial input to the agent. You can pass a single string for a user message,</span>
</span><span id="__span-0-163"><span class="sd"> or a list of input items.</span>
</span><span id="__span-0-164"><span class="sd"> context: The context to run the agent with.</span>
</span><span id="__span-0-165"><span class="sd"> max_turns: The maximum number of turns to run the agent for. A turn is defined as one</span>
</span><span id="__span-0-166"><span class="sd"> AI invocation (including any tool calls that might occur).</span>
</span><span id="__span-0-167"><span class="sd"> hooks: An object that receives callbacks on various lifecycle events.</span>
</span><span id="__span-0-168"><span class="sd"> run_config: Global settings for the entire agent run.</span>
</span><span id="__span-0-169">
</span><span id="__span-0-170"><span class="sd"> Returns:</span>
</span><span id="__span-0-171"><span class="sd"> A run result containing all the inputs, guardrail results and the output of the last</span>
</span><span id="__span-0-172"><span class="sd"> agent. Agents may perform handoffs, so we don&#39;t know the specific type of the output.</span>
</span><span id="__span-0-173"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-174"> <span class="k">if</span> <span class="n">hooks</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-175"> <span class="n">hooks</span> <span class="o">=</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">Any</span><span class="p">]()</span>
</span><span id="__span-0-176"> <span class="k">if</span> <span class="n">run_config</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-177"> <span class="n">run_config</span> <span class="o">=</span> <span class="n">RunConfig</span><span class="p">()</span>
</span><span id="__span-0-178">
</span><span id="__span-0-179"> <span class="n">tool_use_tracker</span> <span class="o">=</span> <span class="n">AgentToolUseTracker</span><span class="p">()</span>
</span><span id="__span-0-180">
</span><span id="__span-0-181"> <span class="k">with</span> <span class="n">TraceCtxManager</span><span class="p">(</span>
</span><span id="__span-0-182"> <span class="n">workflow_name</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">workflow_name</span><span class="p">,</span>
</span><span id="__span-0-183"> <span class="n">trace_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_id</span><span class="p">,</span>
</span><span id="__span-0-184"> <span class="n">group_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">group_id</span><span class="p">,</span>
</span><span id="__span-0-185"> <span class="n">metadata</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_metadata</span><span class="p">,</span>
</span><span id="__span-0-186"> <span class="n">disabled</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">tracing_disabled</span><span class="p">,</span>
</span><span id="__span-0-187"> <span class="p">):</span>
</span><span id="__span-0-188"> <span class="n">current_turn</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="__span-0-189"> <span class="n">original_input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
</span><span id="__span-0-190"> <span class="n">generated_items</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">RunItem</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-191"> <span class="n">model_responses</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">ModelResponse</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-192">
</span><span id="__span-0-193"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">=</span> <span class="n">RunContextWrapper</span><span class="p">(</span>
</span><span id="__span-0-194"> <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span> <span class="c1"># type: ignore</span>
</span><span id="__span-0-195"> <span class="p">)</span>
</span><span id="__span-0-196">
</span><span id="__span-0-197"> <span class="n">input_guardrail_results</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">InputGuardrailResult</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-198">
</span><span id="__span-0-199"> <span class="n">current_span</span><span class="p">:</span> <span class="n">Span</span><span class="p">[</span><span class="n">AgentSpanData</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-200"> <span class="n">current_agent</span> <span class="o">=</span> <span class="n">starting_agent</span>
</span><span id="__span-0-201"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-202">
</span><span id="__span-0-203"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-204"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="__span-0-205"> <span class="c1"># Start an agent span if we don&#39;t have one. This span is ended if the current</span>
</span><span id="__span-0-206"> <span class="c1"># agent changes, or if the agent loop ends.</span>
</span><span id="__span-0-207"> <span class="k">if</span> <span class="n">current_span</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-208"> <span class="n">handoff_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">h</span><span class="o">.</span><span class="n">agent_name</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_handoffs</span><span class="p">(</span><span class="n">current_agent</span><span class="p">)]</span>
</span><span id="__span-0-209"> <span class="k">if</span> <span class="n">output_schema</span> <span class="o">:=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_output_schema</span><span class="p">(</span><span class="n">current_agent</span><span class="p">):</span>
</span><span id="__span-0-210"> <span class="n">output_type_name</span> <span class="o">=</span> <span class="n">output_schema</span><span class="o">.</span><span class="n">output_type_name</span><span class="p">()</span>
</span><span id="__span-0-211"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-212"> <span class="n">output_type_name</span> <span class="o">=</span> <span class="s2">&quot;str&quot;</span>
</span><span id="__span-0-213">
</span><span id="__span-0-214"> <span class="n">current_span</span> <span class="o">=</span> <span class="n">agent_span</span><span class="p">(</span>
</span><span id="__span-0-215"> <span class="n">name</span><span class="o">=</span><span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-216"> <span class="n">handoffs</span><span class="o">=</span><span class="n">handoff_names</span><span class="p">,</span>
</span><span id="__span-0-217"> <span class="n">output_type</span><span class="o">=</span><span class="n">output_type_name</span><span class="p">,</span>
</span><span id="__span-0-218"> <span class="p">)</span>
</span><span id="__span-0-219"> <span class="n">current_span</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">mark_as_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-220">
</span><span id="__span-0-221"> <span class="n">all_tools</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_all_tools</span><span class="p">(</span><span class="n">current_agent</span><span class="p">)</span>
</span><span id="__span-0-222"> <span class="n">current_span</span><span class="o">.</span><span class="n">span_data</span><span class="o">.</span><span class="n">tools</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">all_tools</span><span class="p">]</span>
</span><span id="__span-0-223">
</span><span id="__span-0-224"> <span class="n">current_turn</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="__span-0-225">
</span><span id="__span-0-226"> <span class="c1"># Run registered loop hooks (extensions, pricing, etc.)</span>
</span><span id="__span-0-227"> <span class="k">for</span> <span class="n">loop_hook</span> <span class="ow">in</span> <span class="n">DEFAULT_LOOP_HOOKS</span><span class="p">:</span>
</span><span id="__span-0-228"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-229"> <span class="k">await</span> <span class="n">loop_hook</span><span class="o">.</span><span class="n">on_turn_start</span><span class="p">(</span>
</span><span id="__span-0-230"> <span class="n">current_turn</span><span class="p">,</span> <span class="n">context_wrapper</span><span class="p">,</span> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-231"> <span class="p">)</span>
</span><span id="__span-0-232"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-233"> <span class="k">pass</span> <span class="c1"># Hooks must not break the agent loop</span>
</span><span id="__span-0-234">
</span><span id="__span-0-235"> <span class="k">if</span> <span class="n">current_turn</span> <span class="o">&gt;</span> <span class="n">max_turns</span><span class="p">:</span>
</span><span id="__span-0-236"> <span class="n">_error_tracing</span><span class="o">.</span><span class="n">attach_error_to_span</span><span class="p">(</span>
</span><span id="__span-0-237"> <span class="n">current_span</span><span class="p">,</span>
</span><span id="__span-0-238"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-239"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Max turns exceeded&quot;</span><span class="p">,</span>
</span><span id="__span-0-240"> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;max_turns&quot;</span><span class="p">:</span> <span class="n">max_turns</span><span class="p">},</span>
</span><span id="__span-0-241"> <span class="p">),</span>
</span><span id="__span-0-242"> <span class="p">)</span>
</span><span id="__span-0-243"> <span class="k">raise</span> <span class="n">MaxTurnsExceeded</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Max turns (</span><span class="si">{</span><span class="n">max_turns</span><span class="si">}</span><span class="s2">) exceeded&quot;</span><span class="p">)</span>
</span><span id="__span-0-244">
</span><span id="__span-0-245"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="__span-0-246"> <span class="sa">f</span><span class="s2">&quot;Running agent </span><span class="si">{</span><span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> (turn </span><span class="si">{</span><span class="n">current_turn</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">,</span>
</span><span id="__span-0-247"> <span class="p">)</span>
</span><span id="__span-0-248">
</span><span id="__span-0-249"> <span class="k">if</span> <span class="n">current_turn</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="__span-0-250"> <span class="n">input_guardrail_results</span><span class="p">,</span> <span class="n">turn_result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span>
</span><span id="__span-0-251"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_input_guardrails</span><span class="p">(</span>
</span><span id="__span-0-252"> <span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-253"> <span class="n">starting_agent</span><span class="o">.</span><span class="n">input_guardrails</span>
</span><span id="__span-0-254"> <span class="o">+</span> <span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">input_guardrails</span> <span class="ow">or</span> <span class="p">[]),</span>
</span><span id="__span-0-255"> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="nb">input</span><span class="p">),</span>
</span><span id="__span-0-256"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-257"> <span class="p">),</span>
</span><span id="__span-0-258"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_single_turn</span><span class="p">(</span>
</span><span id="__span-0-259"> <span class="n">agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-260"> <span class="n">all_tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-261"> <span class="n">original_input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-262"> <span class="n">generated_items</span><span class="o">=</span><span class="n">generated_items</span><span class="p">,</span>
</span><span id="__span-0-263"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-264"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-265"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-266"> <span class="n">should_run_agent_start_hooks</span><span class="o">=</span><span class="n">should_run_agent_start_hooks</span><span class="p">,</span>
</span><span id="__span-0-267"> <span class="n">tool_use_tracker</span><span class="o">=</span><span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-268"> <span class="p">),</span>
</span><span id="__span-0-269"> <span class="p">)</span>
</span><span id="__span-0-270"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-271"> <span class="n">turn_result</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_single_turn</span><span class="p">(</span>
</span><span id="__span-0-272"> <span class="n">agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-273"> <span class="n">all_tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-274"> <span class="n">original_input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-275"> <span class="n">generated_items</span><span class="o">=</span><span class="n">generated_items</span><span class="p">,</span>
</span><span id="__span-0-276"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-277"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-278"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-279"> <span class="n">should_run_agent_start_hooks</span><span class="o">=</span><span class="n">should_run_agent_start_hooks</span><span class="p">,</span>
</span><span id="__span-0-280"> <span class="n">tool_use_tracker</span><span class="o">=</span><span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-281"> <span class="p">)</span>
</span><span id="__span-0-282"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="__span-0-283">
</span><span id="__span-0-284"> <span class="n">model_responses</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">model_response</span><span class="p">)</span>
</span><span id="__span-0-285"> <span class="n">original_input</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">original_input</span>
</span><span id="__span-0-286"> <span class="n">generated_items</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">generated_items</span>
</span><span id="__span-0-287">
</span><span id="__span-0-288"> <span class="c1"># Run on_turn_end hooks and check should_continue</span>
</span><span id="__span-0-289"> <span class="k">for</span> <span class="n">loop_hook</span> <span class="ow">in</span> <span class="n">DEFAULT_LOOP_HOOKS</span><span class="p">:</span>
</span><span id="__span-0-290"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-291"> <span class="kn">from</span><span class="w"> </span><span class="nn">.hooks</span><span class="w"> </span><span class="kn">import</span> <span class="n">TurnResult</span> <span class="k">as</span> <span class="n">_TurnResult</span>
</span><span id="__span-0-292">
</span><span id="__span-0-293"> <span class="k">await</span> <span class="n">loop_hook</span><span class="o">.</span><span class="n">on_turn_end</span><span class="p">(</span>
</span><span id="__span-0-294"> <span class="n">current_turn</span><span class="p">,</span>
</span><span id="__span-0-295"> <span class="n">_TurnResult</span><span class="p">(</span>
</span><span id="__span-0-296"> <span class="n">turn</span><span class="o">=</span><span class="n">current_turn</span><span class="p">,</span>
</span><span id="__span-0-297"> <span class="n">agent_name</span><span class="o">=</span><span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-298"> <span class="n">generated_items_count</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">generated_items</span><span class="p">),</span>
</span><span id="__span-0-299"> <span class="p">),</span>
</span><span id="__span-0-300"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-301"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-302"> <span class="p">)</span>
</span><span id="__span-0-303"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-304"> <span class="k">pass</span>
</span><span id="__span-0-305"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-306"> <span class="k">if</span> <span class="ow">not</span> <span class="k">await</span> <span class="n">loop_hook</span><span class="o">.</span><span class="n">should_continue</span><span class="p">(</span>
</span><span id="__span-0-307"> <span class="n">current_turn</span><span class="p">,</span> <span class="n">context_wrapper</span><span class="p">,</span> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-308"> <span class="p">):</span>
</span><span id="__span-0-309"> <span class="c1"># Hook requested early termination</span>
</span><span id="__span-0-310"> <span class="k">break</span>
</span><span id="__span-0-311"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-312"> <span class="k">pass</span>
</span><span id="__span-0-313">
</span><span id="__span-0-314"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepFinalOutput</span><span class="p">):</span>
</span><span id="__span-0-315"> <span class="n">output_guardrail_results</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_output_guardrails</span><span class="p">(</span>
</span><span id="__span-0-316"> <span class="n">current_agent</span><span class="o">.</span><span class="n">output_guardrails</span> <span class="o">+</span> <span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">output_guardrails</span> <span class="ow">or</span> <span class="p">[]),</span>
</span><span id="__span-0-317"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-318"> <span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">output</span><span class="p">,</span>
</span><span id="__span-0-319"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-320"> <span class="p">)</span>
</span><span id="__span-0-321"> <span class="k">return</span> <span class="n">RunResult</span><span class="p">(</span>
</span><span id="__span-0-322"> <span class="nb">input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-323"> <span class="n">new_items</span><span class="o">=</span><span class="n">generated_items</span><span class="p">,</span>
</span><span id="__span-0-324"> <span class="n">raw_responses</span><span class="o">=</span><span class="n">model_responses</span><span class="p">,</span>
</span><span id="__span-0-325"> <span class="n">final_output</span><span class="o">=</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">output</span><span class="p">,</span>
</span><span id="__span-0-326"> <span class="n">_last_agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-327"> <span class="n">input_guardrail_results</span><span class="o">=</span><span class="n">input_guardrail_results</span><span class="p">,</span>
</span><span id="__span-0-328"> <span class="n">output_guardrail_results</span><span class="o">=</span><span class="n">output_guardrail_results</span><span class="p">,</span>
</span><span id="__span-0-329"> <span class="p">)</span>
</span><span id="__span-0-330"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepHandoff</span><span class="p">):</span>
</span><span id="__span-0-331"> <span class="c1"># Get the previous agent before switching</span>
</span><span id="__span-0-332"> <span class="n">previous_agent</span> <span class="o">=</span> <span class="n">current_agent</span>
</span><span id="__span-0-333"> <span class="n">current_agent</span> <span class="o">=</span> <span class="n">cast</span><span class="p">(</span><span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">new_agent</span><span class="p">)</span>
</span><span id="__span-0-334">
</span><span id="__span-0-335"> <span class="c1"># Transfer message history for swarm patterns</span>
</span><span id="__span-0-336"> <span class="c1"># Check if both agents have models with message_history</span>
</span><span id="__span-0-337"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-338"> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
</span><span id="__span-0-339"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;message_history&quot;</span><span class="p">)</span>
</span><span id="__span-0-340"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
</span><span id="__span-0-341"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;message_history&quot;</span><span class="p">)</span>
</span><span id="__span-0-342"> <span class="p">):</span>
</span><span id="__span-0-343"> <span class="c1"># Import the is_swarm_pattern function from patterns utils</span>
</span><span id="__span-0-344"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-345"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.agents.patterns.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">is_swarm_pattern</span>
</span><span id="__span-0-346">
</span><span id="__span-0-347"> <span class="c1"># Check if either agent is part of a swarm pattern</span>
</span><span id="__span-0-348"> <span class="k">if</span> <span class="n">is_swarm_pattern</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">)</span> <span class="ow">or</span> <span class="n">is_swarm_pattern</span><span class="p">(</span>
</span><span id="__span-0-349"> <span class="n">current_agent</span>
</span><span id="__span-0-350"> <span class="p">):</span>
</span><span id="__span-0-351"> <span class="c1"># Transfer the message history to the new agent</span>
</span><span id="__span-0-352"> <span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-353"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span>
</span><span id="__span-0-354"> <span class="p">)</span>
</span><span id="__span-0-355"> <span class="c1"># Also share history in AGENT_MANAGER</span>
</span><span id="__span-0-356"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span>
</span><span id="__span-0-357"> <span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span>
</span><span id="__span-0-358"> <span class="p">):</span>
</span><span id="__span-0-359"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.sdk.agents.simple_agent_manager</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
</span><span id="__span-0-360"> <span class="n">AGENT_MANAGER</span><span class="p">,</span>
</span><span id="__span-0-361"> <span class="p">)</span>
</span><span id="__span-0-362">
</span><span id="__span-0-363"> <span class="n">AGENT_MANAGER</span><span class="o">.</span><span class="n">share_swarm_history</span><span class="p">(</span>
</span><span id="__span-0-364"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">name</span>
</span><span id="__span-0-365"> <span class="p">)</span>
</span><span id="__span-0-366"> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
</span><span id="__span-0-367"> <span class="c1"># If we can&#39;t import, check if agents have bidirectional handoffs</span>
</span><span id="__span-0-368"> <span class="c1"># by looking if the new agent can handoff back to the previous agent</span>
</span><span id="__span-0-369"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;handoffs&quot;</span><span class="p">):</span>
</span><span id="__span-0-370"> <span class="k">for</span> <span class="n">handoff_item</span> <span class="ow">in</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">handoffs</span><span class="p">:</span>
</span><span id="__span-0-371"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-372"> <span class="nb">hasattr</span><span class="p">(</span><span class="n">handoff_item</span><span class="p">,</span> <span class="s2">&quot;agent_name&quot;</span><span class="p">)</span>
</span><span id="__span-0-373"> <span class="ow">and</span> <span class="n">handoff_item</span><span class="o">.</span><span class="n">agent_name</span> <span class="o">==</span> <span class="n">previous_agent</span><span class="o">.</span><span class="n">name</span>
</span><span id="__span-0-374"> <span class="p">):</span>
</span><span id="__span-0-375"> <span class="c1"># Bidirectional handoff detected, share history</span>
</span><span id="__span-0-376"> <span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-377"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span>
</span><span id="__span-0-378"> <span class="p">)</span>
</span><span id="__span-0-379"> <span class="k">break</span>
</span><span id="__span-0-380">
</span><span id="__span-0-381"> <span class="c1"># Register the handoff agent with AGENT_MANAGER for tracking</span>
</span><span id="__span-0-382"> <span class="c1"># This ensures patterns/swarms work with commands like /history and /graph</span>
</span><span id="__span-0-383"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.sdk.agents.simple_agent_manager</span><span class="w"> </span><span class="kn">import</span> <span class="n">AGENT_MANAGER</span>
</span><span id="__span-0-384">
</span><span id="__span-0-385"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">):</span>
</span><span id="__span-0-386"> <span class="c1"># Preserve terminal-specific identity in TUI mode to avoid phantom agents</span>
</span><span id="__span-0-387"> <span class="n">agent_id_override</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-388"> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s2">&quot;CAI_TUI_MODE&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;true&quot;</span><span class="p">:</span>
</span><span id="__span-0-389"> <span class="n">model</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="__span-0-390"> <span class="n">agent_id_override</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;agent_id&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="__span-0-391">
</span><span id="__span-0-392"> <span class="k">if</span> <span class="n">agent_id_override</span><span class="p">:</span>
</span><span id="__span-0-393"> <span class="n">AGENT_MANAGER</span><span class="o">.</span><span class="n">set_active_agent</span><span class="p">(</span>
</span><span id="__span-0-394"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-395"> <span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-396"> <span class="n">agent_id</span><span class="o">=</span><span class="n">agent_id_override</span><span class="p">,</span>
</span><span id="__span-0-397"> <span class="p">)</span>
</span><span id="__span-0-398"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-399"> <span class="c1"># Fallback to legacy behaviour outside the TUI</span>
</span><span id="__span-0-400"> <span class="n">AGENT_MANAGER</span><span class="o">.</span><span class="n">set_active_agent</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="__span-0-401">
</span><span id="__span-0-402"> <span class="n">current_span</span><span class="o">.</span><span class="n">finish</span><span class="p">(</span><span class="n">reset_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-403"> <span class="n">current_span</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-404"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-405"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepRunAgain</span><span class="p">):</span>
</span><span id="__span-0-406"> <span class="k">pass</span>
</span><span id="__span-0-407"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-408"> <span class="k">raise</span> <span class="n">AgentsException</span><span class="p">(</span>
</span><span id="__span-0-409"> <span class="sa">f</span><span class="s2">&quot;Unknown next step type: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="__span-0-410"> <span class="p">)</span>
</span><span id="__span-0-411"> <span class="k">finally</span><span class="p">:</span>
</span><span id="__span-0-412"> <span class="k">if</span> <span class="n">current_span</span><span class="p">:</span>
</span><span id="__span-0-413"> <span class="n">current_span</span><span class="o">.</span><span class="n">finish</span><span class="p">(</span><span class="n">reset_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-414">
</span><span id="__span-0-415"> <span class="nd">@classmethod</span>
</span><span id="__span-0-416"> <span class="k">def</span><span class="w"> </span><span class="nf">run_sync</span><span class="p">(</span>
</span><span id="__span-0-417"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-418"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-419"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-420"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-421"> <span class="n">context</span><span class="p">:</span> <span class="n">TContext</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-422"> <span class="n">max_turns</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">DEFAULT_MAX_TURNS</span><span class="p">,</span>
</span><span id="__span-0-423"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-424"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-425"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RunResult</span><span class="p">:</span>
</span><span id="__span-0-426"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a workflow synchronously, starting at the given agent. Note that this just wraps the</span>
</span><span id="__span-0-427"><span class="sd"> `run` method, so it will not work if there&#39;s already an event loop (e.g. inside an async</span>
</span><span id="__span-0-428"><span class="sd"> function, or in a Jupyter notebook or async context like FastAPI). For those cases, use</span>
</span><span id="__span-0-429"><span class="sd"> the `run` method instead.</span>
</span><span id="__span-0-430">
</span><span id="__span-0-431"><span class="sd"> The agent will run in a loop until a final output is generated. The loop runs like so:</span>
</span><span id="__span-0-432"><span class="sd"> 1. The agent is invoked with the given input.</span>
</span><span id="__span-0-433"><span class="sd"> 2. If there is a final output (i.e. the agent produces something of type</span>
</span><span id="__span-0-434"><span class="sd"> `agent.output_type`, the loop terminates.</span>
</span><span id="__span-0-435"><span class="sd"> 3. If there&#39;s a handoff, we run the loop again, with the new agent.</span>
</span><span id="__span-0-436"><span class="sd"> 4. Else, we run tool calls (if any), and re-run the loop.</span>
</span><span id="__span-0-437">
</span><span id="__span-0-438"><span class="sd"> In two cases, the agent may raise an exception:</span>
</span><span id="__span-0-439"><span class="sd"> 1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.</span>
</span><span id="__span-0-440"><span class="sd"> 2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</span>
</span><span id="__span-0-441">
</span><span id="__span-0-442"><span class="sd"> Note that only the first agent&#39;s input guardrails are run.</span>
</span><span id="__span-0-443">
</span><span id="__span-0-444"><span class="sd"> Args:</span>
</span><span id="__span-0-445"><span class="sd"> starting_agent: The starting agent to run.</span>
</span><span id="__span-0-446"><span class="sd"> input: The initial input to the agent. You can pass a single string for a user message,</span>
</span><span id="__span-0-447"><span class="sd"> or a list of input items.</span>
</span><span id="__span-0-448"><span class="sd"> context: The context to run the agent with.</span>
</span><span id="__span-0-449"><span class="sd"> max_turns: The maximum number of turns to run the agent for. A turn is defined as one</span>
</span><span id="__span-0-450"><span class="sd"> AI invocation (including any tool calls that might occur).</span>
</span><span id="__span-0-451"><span class="sd"> hooks: An object that receives callbacks on various lifecycle events.</span>
</span><span id="__span-0-452"><span class="sd"> run_config: Global settings for the entire agent run.</span>
</span><span id="__span-0-453">
</span><span id="__span-0-454"><span class="sd"> Returns:</span>
</span><span id="__span-0-455"><span class="sd"> A run result containing all the inputs, guardrail results and the output of the last</span>
</span><span id="__span-0-456"><span class="sd"> agent. Agents may perform handoffs, so we don&#39;t know the specific type of the output.</span>
</span><span id="__span-0-457"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-458"> <span class="k">return</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span>
</span><span id="__span-0-459"> <span class="bp">cls</span><span class="o">.</span><span class="n">run</span><span class="p">(</span>
</span><span id="__span-0-460"> <span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-461"> <span class="nb">input</span><span class="p">,</span>
</span><span id="__span-0-462"> <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span>
</span><span id="__span-0-463"> <span class="n">max_turns</span><span class="o">=</span><span class="n">max_turns</span><span class="p">,</span>
</span><span id="__span-0-464"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-465"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-466"> <span class="p">)</span>
</span><span id="__span-0-467"> <span class="p">)</span>
</span><span id="__span-0-468">
</span><span id="__span-0-469"> <span class="nd">@classmethod</span>
</span><span id="__span-0-470"> <span class="k">def</span><span class="w"> </span><span class="nf">run_streamed</span><span class="p">(</span>
</span><span id="__span-0-471"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-472"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-473"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-474"> <span class="n">context</span><span class="p">:</span> <span class="n">TContext</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-475"> <span class="n">max_turns</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">DEFAULT_MAX_TURNS</span><span class="p">,</span>
</span><span id="__span-0-476"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-477"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-478"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RunResultStreaming</span><span class="p">:</span>
</span><span id="__span-0-479"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a workflow starting at the given agent in streaming mode. The returned result object</span>
</span><span id="__span-0-480"><span class="sd"> contains a method you can use to stream semantic events as they are generated.</span>
</span><span id="__span-0-481">
</span><span id="__span-0-482"><span class="sd"> The agent will run in a loop until a final output is generated. The loop runs like so:</span>
</span><span id="__span-0-483"><span class="sd"> 1. The agent is invoked with the given input.</span>
</span><span id="__span-0-484"><span class="sd"> 2. If there is a final output (i.e. the agent produces something of type</span>
</span><span id="__span-0-485"><span class="sd"> `agent.output_type`, the loop terminates.</span>
</span><span id="__span-0-486"><span class="sd"> 3. If there&#39;s a handoff, we run the loop again, with the new agent.</span>
</span><span id="__span-0-487"><span class="sd"> 4. Else, we run tool calls (if any), and re-run the loop.</span>
</span><span id="__span-0-488">
</span><span id="__span-0-489"><span class="sd"> In two cases, the agent may raise an exception:</span>
</span><span id="__span-0-490"><span class="sd"> 1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.</span>
</span><span id="__span-0-491"><span class="sd"> 2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</span>
</span><span id="__span-0-492">
</span><span id="__span-0-493"><span class="sd"> Note that only the first agent&#39;s input guardrails are run.</span>
</span><span id="__span-0-494">
</span><span id="__span-0-495"><span class="sd"> Args:</span>
</span><span id="__span-0-496"><span class="sd"> starting_agent: The starting agent to run.</span>
</span><span id="__span-0-497"><span class="sd"> input: The initial input to the agent. You can pass a single string for a user message,</span>
</span><span id="__span-0-498"><span class="sd"> or a list of input items.</span>
</span><span id="__span-0-499"><span class="sd"> context: The context to run the agent with.</span>
</span><span id="__span-0-500"><span class="sd"> max_turns: The maximum number of turns to run the agent for. A turn is defined as one</span>
</span><span id="__span-0-501"><span class="sd"> AI invocation (including any tool calls that might occur).</span>
</span><span id="__span-0-502"><span class="sd"> hooks: An object that receives callbacks on various lifecycle events.</span>
</span><span id="__span-0-503"><span class="sd"> run_config: Global settings for the entire agent run.</span>
</span><span id="__span-0-504">
</span><span id="__span-0-505"><span class="sd"> Returns:</span>
</span><span id="__span-0-506"><span class="sd"> A result object that contains data about the run, as well as a method to stream events.</span>
</span><span id="__span-0-507"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-508"> <span class="k">if</span> <span class="n">hooks</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-509"> <span class="n">hooks</span> <span class="o">=</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">Any</span><span class="p">]()</span>
</span><span id="__span-0-510"> <span class="k">if</span> <span class="n">run_config</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-511"> <span class="n">run_config</span> <span class="o">=</span> <span class="n">RunConfig</span><span class="p">()</span>
</span><span id="__span-0-512">
</span><span id="__span-0-513"> <span class="c1"># If there&#39;s already a trace, we don&#39;t create a new one. In addition, we can&#39;t end the</span>
</span><span id="__span-0-514"> <span class="c1"># trace here, because the actual work is done in `stream_events` and this method ends</span>
</span><span id="__span-0-515"> <span class="c1"># before that.</span>
</span><span id="__span-0-516"> <span class="n">new_trace</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-517"> <span class="kc">None</span>
</span><span id="__span-0-518"> <span class="k">if</span> <span class="n">get_current_trace</span><span class="p">()</span>
</span><span id="__span-0-519"> <span class="k">else</span> <span class="n">trace</span><span class="p">(</span>
</span><span id="__span-0-520"> <span class="n">workflow_name</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">workflow_name</span><span class="p">,</span>
</span><span id="__span-0-521"> <span class="n">trace_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_id</span><span class="p">,</span>
</span><span id="__span-0-522"> <span class="n">group_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">group_id</span><span class="p">,</span>
</span><span id="__span-0-523"> <span class="n">metadata</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_metadata</span><span class="p">,</span>
</span><span id="__span-0-524"> <span class="n">disabled</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">tracing_disabled</span><span class="p">,</span>
</span><span id="__span-0-525"> <span class="p">)</span>
</span><span id="__span-0-526"> <span class="p">)</span>
</span><span id="__span-0-527"> <span class="c1"># Need to start the trace here, because the current trace contextvar is captured at</span>
</span><span id="__span-0-528"> <span class="c1"># asyncio.create_task time</span>
</span><span id="__span-0-529"> <span class="k">if</span> <span class="n">new_trace</span><span class="p">:</span>
</span><span id="__span-0-530"> <span class="n">new_trace</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">mark_as_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-531">
</span><span id="__span-0-532"> <span class="n">output_schema</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_output_schema</span><span class="p">(</span><span class="n">starting_agent</span><span class="p">)</span>
</span><span id="__span-0-533"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">=</span> <span class="n">RunContextWrapper</span><span class="p">(</span>
</span><span id="__span-0-534"> <span class="n">context</span><span class="o">=</span><span class="n">context</span> <span class="c1"># type: ignore</span>
</span><span id="__span-0-535"> <span class="p">)</span>
</span><span id="__span-0-536">
</span><span id="__span-0-537"> <span class="n">streamed_result</span> <span class="o">=</span> <span class="n">RunResultStreaming</span><span class="p">(</span>
</span><span id="__span-0-538"> <span class="nb">input</span><span class="o">=</span><span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="nb">input</span><span class="p">),</span>
</span><span id="__span-0-539"> <span class="n">new_items</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-540"> <span class="n">current_agent</span><span class="o">=</span><span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-541"> <span class="n">raw_responses</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-542"> <span class="n">final_output</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-543"> <span class="n">is_complete</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-544"> <span class="n">current_turn</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-0-545"> <span class="n">max_turns</span><span class="o">=</span><span class="n">max_turns</span><span class="p">,</span>
</span><span id="__span-0-546"> <span class="n">input_guardrail_results</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-547"> <span class="n">output_guardrail_results</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-548"> <span class="n">_current_agent_output_schema</span><span class="o">=</span><span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-549"> <span class="n">_trace</span><span class="o">=</span><span class="n">new_trace</span><span class="p">,</span>
</span><span id="__span-0-550"> <span class="p">)</span>
</span><span id="__span-0-551">
</span><span id="__span-0-552"> <span class="c1"># Kick off the actual agent loop in the background and return the streamed result object.</span>
</span><span id="__span-0-553"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_run_impl_task</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span>
</span><span id="__span-0-554"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_streamed_impl</span><span class="p">(</span>
</span><span id="__span-0-555"> <span class="n">starting_input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span>
</span><span id="__span-0-556"> <span class="n">streamed_result</span><span class="o">=</span><span class="n">streamed_result</span><span class="p">,</span>
</span><span id="__span-0-557"> <span class="n">starting_agent</span><span class="o">=</span><span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-558"> <span class="n">max_turns</span><span class="o">=</span><span class="n">max_turns</span><span class="p">,</span>
</span><span id="__span-0-559"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-560"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-561"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-562"> <span class="p">)</span>
</span><span id="__span-0-563"> <span class="p">)</span>
</span><span id="__span-0-564"> <span class="k">return</span> <span class="n">streamed_result</span>
</span><span id="__span-0-565">
</span><span id="__span-0-566"> <span class="nd">@classmethod</span>
</span><span id="__span-0-567"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_run_input_guardrails_with_queue</span><span class="p">(</span>
</span><span id="__span-0-568"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-569"> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span>
</span><span id="__span-0-570"> <span class="n">guardrails</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">InputGuardrail</span><span class="p">[</span><span class="n">TContext</span><span class="p">]],</span>
</span><span id="__span-0-571"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-572"> <span class="n">context</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-573"> <span class="n">streamed_result</span><span class="p">:</span> <span class="n">RunResultStreaming</span><span class="p">,</span>
</span><span id="__span-0-574"> <span class="n">parent_span</span><span class="p">:</span> <span class="n">Span</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span>
</span><span id="__span-0-575"> <span class="p">):</span>
</span><span id="__span-0-576"> <span class="n">queue</span> <span class="o">=</span> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_input_guardrail_queue</span>
</span><span id="__span-0-577">
</span><span id="__span-0-578"> <span class="c1"># We&#39;ll run the guardrails and push them onto the queue as they complete</span>
</span><span id="__span-0-579"> <span class="n">guardrail_tasks</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="__span-0-580"> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span>
</span><span id="__span-0-581"> <span class="n">RunImpl</span><span class="o">.</span><span class="n">run_single_input_guardrail</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">guardrail</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
</span><span id="__span-0-582"> <span class="p">)</span>
</span><span id="__span-0-583"> <span class="k">for</span> <span class="n">guardrail</span> <span class="ow">in</span> <span class="n">guardrails</span>
</span><span id="__span-0-584"> <span class="p">]</span>
</span><span id="__span-0-585"> <span class="n">guardrail_results</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-586"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-587"> <span class="k">for</span> <span class="n">done</span> <span class="ow">in</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">as_completed</span><span class="p">(</span><span class="n">guardrail_tasks</span><span class="p">):</span>
</span><span id="__span-0-588"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">done</span>
</span><span id="__span-0-589"> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">output</span><span class="o">.</span><span class="n">tripwire_triggered</span><span class="p">:</span>
</span><span id="__span-0-590"> <span class="n">_error_tracing</span><span class="o">.</span><span class="n">attach_error_to_span</span><span class="p">(</span>
</span><span id="__span-0-591"> <span class="n">parent_span</span><span class="p">,</span>
</span><span id="__span-0-592"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-593"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Guardrail tripwire triggered&quot;</span><span class="p">,</span>
</span><span id="__span-0-594"> <span class="n">data</span><span class="o">=</span><span class="p">{</span>
</span><span id="__span-0-595"> <span class="s2">&quot;guardrail&quot;</span><span class="p">:</span> <span class="n">result</span><span class="o">.</span><span class="n">guardrail</span><span class="o">.</span><span class="n">get_name</span><span class="p">(),</span>
</span><span id="__span-0-596"> <span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="s2">&quot;input_guardrail&quot;</span><span class="p">,</span>
</span><span id="__span-0-597"> <span class="p">},</span>
</span><span id="__span-0-598"> <span class="p">),</span>
</span><span id="__span-0-599"> <span class="p">)</span>
</span><span id="__span-0-600"> <span class="n">queue</span><span class="o">.</span><span class="n">put_nowait</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="__span-0-601"> <span class="n">guardrail_results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="__span-0-602"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-603"> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">guardrail_tasks</span><span class="p">:</span>
</span><span id="__span-0-604"> <span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
</span><span id="__span-0-605"> <span class="k">raise</span>
</span><span id="__span-0-606">
</span><span id="__span-0-607"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">input_guardrail_results</span> <span class="o">=</span> <span class="n">guardrail_results</span>
</span><span id="__span-0-608">
</span><span id="__span-0-609"> <span class="nd">@classmethod</span>
</span><span id="__span-0-610"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_run_streamed_impl</span><span class="p">(</span>
</span><span id="__span-0-611"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-612"> <span class="n">starting_input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-613"> <span class="n">streamed_result</span><span class="p">:</span> <span class="n">RunResultStreaming</span><span class="p">,</span>
</span><span id="__span-0-614"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-615"> <span class="n">max_turns</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
</span><span id="__span-0-616"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-617"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-618"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span><span class="p">,</span>
</span><span id="__span-0-619"> <span class="p">):</span>
</span><span id="__span-0-620"> <span class="n">current_span</span><span class="p">:</span> <span class="n">Span</span><span class="p">[</span><span class="n">AgentSpanData</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-621"> <span class="n">current_agent</span> <span class="o">=</span> <span class="n">starting_agent</span>
</span><span id="__span-0-622"> <span class="n">current_turn</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="__span-0-623"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-624"> <span class="n">tool_use_tracker</span> <span class="o">=</span> <span class="n">AgentToolUseTracker</span><span class="p">()</span>
</span><span id="__span-0-625">
</span><span id="__span-0-626"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put_nowait</span><span class="p">(</span><span class="n">AgentUpdatedStreamEvent</span><span class="p">(</span><span class="n">new_agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">))</span>
</span><span id="__span-0-627">
</span><span id="__span-0-628"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-629"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="__span-0-630"> <span class="k">if</span> <span class="n">streamed_result</span><span class="o">.</span><span class="n">is_complete</span><span class="p">:</span>
</span><span id="__span-0-631"> <span class="k">break</span>
</span><span id="__span-0-632">
</span><span id="__span-0-633"> <span class="c1"># Start an agent span if we don&#39;t have one. This span is ended if the current</span>
</span><span id="__span-0-634"> <span class="c1"># agent changes, or if the agent loop ends.</span>
</span><span id="__span-0-635"> <span class="k">if</span> <span class="n">current_span</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-636"> <span class="n">handoff_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">h</span><span class="o">.</span><span class="n">agent_name</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_handoffs</span><span class="p">(</span><span class="n">current_agent</span><span class="p">)]</span>
</span><span id="__span-0-637"> <span class="k">if</span> <span class="n">output_schema</span> <span class="o">:=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_output_schema</span><span class="p">(</span><span class="n">current_agent</span><span class="p">):</span>
</span><span id="__span-0-638"> <span class="n">output_type_name</span> <span class="o">=</span> <span class="n">output_schema</span><span class="o">.</span><span class="n">output_type_name</span><span class="p">()</span>
</span><span id="__span-0-639"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-640"> <span class="n">output_type_name</span> <span class="o">=</span> <span class="s2">&quot;str&quot;</span>
</span><span id="__span-0-641">
</span><span id="__span-0-642"> <span class="n">current_span</span> <span class="o">=</span> <span class="n">agent_span</span><span class="p">(</span>
</span><span id="__span-0-643"> <span class="n">name</span><span class="o">=</span><span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-644"> <span class="n">handoffs</span><span class="o">=</span><span class="n">handoff_names</span><span class="p">,</span>
</span><span id="__span-0-645"> <span class="n">output_type</span><span class="o">=</span><span class="n">output_type_name</span><span class="p">,</span>
</span><span id="__span-0-646"> <span class="p">)</span>
</span><span id="__span-0-647"> <span class="n">current_span</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">mark_as_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-648">
</span><span id="__span-0-649"> <span class="n">all_tools</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_all_tools</span><span class="p">(</span><span class="n">current_agent</span><span class="p">)</span>
</span><span id="__span-0-650"> <span class="n">tool_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">all_tools</span><span class="p">]</span>
</span><span id="__span-0-651"> <span class="n">current_span</span><span class="o">.</span><span class="n">span_data</span><span class="o">.</span><span class="n">tools</span> <span class="o">=</span> <span class="n">tool_names</span>
</span><span id="__span-0-652"> <span class="n">current_turn</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="__span-0-653"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">current_turn</span> <span class="o">=</span> <span class="n">current_turn</span>
</span><span id="__span-0-654">
</span><span id="__span-0-655"> <span class="k">if</span> <span class="n">current_turn</span> <span class="o">&gt;</span> <span class="n">max_turns</span><span class="p">:</span>
</span><span id="__span-0-656"> <span class="n">_error_tracing</span><span class="o">.</span><span class="n">attach_error_to_span</span><span class="p">(</span>
</span><span id="__span-0-657"> <span class="n">current_span</span><span class="p">,</span>
</span><span id="__span-0-658"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-659"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Max turns exceeded&quot;</span><span class="p">,</span>
</span><span id="__span-0-660"> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;max_turns&quot;</span><span class="p">:</span> <span class="n">max_turns</span><span class="p">},</span>
</span><span id="__span-0-661"> <span class="p">),</span>
</span><span id="__span-0-662"> <span class="p">)</span>
</span><span id="__span-0-663"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put_nowait</span><span class="p">(</span><span class="n">QueueCompleteSentinel</span><span class="p">())</span>
</span><span id="__span-0-664"> <span class="k">break</span>
</span><span id="__span-0-665">
</span><span id="__span-0-666"> <span class="k">if</span> <span class="n">current_turn</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="__span-0-667"> <span class="c1"># Run the input guardrails in the background and put the results on the queue</span>
</span><span id="__span-0-668"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_input_guardrails_task</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span>
</span><span id="__span-0-669"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_input_guardrails_with_queue</span><span class="p">(</span>
</span><span id="__span-0-670"> <span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-671"> <span class="n">starting_agent</span><span class="o">.</span><span class="n">input_guardrails</span> <span class="o">+</span> <span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">input_guardrails</span> <span class="ow">or</span> <span class="p">[]),</span>
</span><span id="__span-0-672"> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">ItemHelpers</span><span class="o">.</span><span class="n">input_to_new_input_list</span><span class="p">(</span><span class="n">starting_input</span><span class="p">)),</span>
</span><span id="__span-0-673"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-674"> <span class="n">streamed_result</span><span class="p">,</span>
</span><span id="__span-0-675"> <span class="n">current_span</span><span class="p">,</span>
</span><span id="__span-0-676"> <span class="p">)</span>
</span><span id="__span-0-677"> <span class="p">)</span>
</span><span id="__span-0-678"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-679"> <span class="n">turn_result</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_single_turn_streamed</span><span class="p">(</span>
</span><span id="__span-0-680"> <span class="n">streamed_result</span><span class="p">,</span>
</span><span id="__span-0-681"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-682"> <span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-683"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-684"> <span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-685"> <span class="n">should_run_agent_start_hooks</span><span class="p">,</span>
</span><span id="__span-0-686"> <span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-687"> <span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-688"> <span class="p">)</span>
</span><span id="__span-0-689"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="__span-0-690">
</span><span id="__span-0-691"> <span class="c1"># Process the turn result</span>
</span><span id="__span-0-692"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">raw_responses</span> <span class="o">=</span> <span class="n">streamed_result</span><span class="o">.</span><span class="n">raw_responses</span> <span class="o">+</span> <span class="p">[</span>
</span><span id="__span-0-693"> <span class="n">turn_result</span><span class="o">.</span><span class="n">model_response</span>
</span><span id="__span-0-694"> <span class="p">]</span>
</span><span id="__span-0-695"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">input</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">original_input</span>
</span><span id="__span-0-696"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">new_items</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">generated_items</span>
</span><span id="__span-0-697">
</span><span id="__span-0-698"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepHandoff</span><span class="p">):</span>
</span><span id="__span-0-699"> <span class="c1"># Get the previous agent before switching</span>
</span><span id="__span-0-700"> <span class="n">previous_agent</span> <span class="o">=</span> <span class="n">current_agent</span>
</span><span id="__span-0-701"> <span class="n">current_agent</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">new_agent</span>
</span><span id="__span-0-702">
</span><span id="__span-0-703"> <span class="c1"># Transfer message history for swarm patterns</span>
</span><span id="__span-0-704"> <span class="c1"># Check if both agents have models with message_history</span>
</span><span id="__span-0-705"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-706"> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
</span><span id="__span-0-707"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;message_history&quot;</span><span class="p">)</span>
</span><span id="__span-0-708"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
</span><span id="__span-0-709"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;message_history&quot;</span><span class="p">)</span>
</span><span id="__span-0-710"> <span class="p">):</span>
</span><span id="__span-0-711"> <span class="c1"># Import the is_swarm_pattern function from patterns utils</span>
</span><span id="__span-0-712"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-713"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.agents.patterns.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">is_swarm_pattern</span>
</span><span id="__span-0-714">
</span><span id="__span-0-715"> <span class="c1"># Check if either agent is part of a swarm pattern</span>
</span><span id="__span-0-716"> <span class="k">if</span> <span class="n">is_swarm_pattern</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">)</span> <span class="ow">or</span> <span class="n">is_swarm_pattern</span><span class="p">(</span>
</span><span id="__span-0-717"> <span class="n">current_agent</span>
</span><span id="__span-0-718"> <span class="p">):</span>
</span><span id="__span-0-719"> <span class="c1"># Transfer the message history to the new agent</span>
</span><span id="__span-0-720"> <span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-721"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span>
</span><span id="__span-0-722"> <span class="p">)</span>
</span><span id="__span-0-723"> <span class="c1"># Also share history in AGENT_MANAGER</span>
</span><span id="__span-0-724"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span>
</span><span id="__span-0-725"> <span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span>
</span><span id="__span-0-726"> <span class="p">):</span>
</span><span id="__span-0-727"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.sdk.agents.simple_agent_manager</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
</span><span id="__span-0-728"> <span class="n">AGENT_MANAGER</span><span class="p">,</span>
</span><span id="__span-0-729"> <span class="p">)</span>
</span><span id="__span-0-730">
</span><span id="__span-0-731"> <span class="n">AGENT_MANAGER</span><span class="o">.</span><span class="n">share_swarm_history</span><span class="p">(</span>
</span><span id="__span-0-732"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">name</span>
</span><span id="__span-0-733"> <span class="p">)</span>
</span><span id="__span-0-734"> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
</span><span id="__span-0-735"> <span class="c1"># If we can&#39;t import, check if agents have bidirectional handoffs</span>
</span><span id="__span-0-736"> <span class="c1"># by looking if the new agent can handoff back to the previous agent</span>
</span><span id="__span-0-737"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;handoffs&quot;</span><span class="p">):</span>
</span><span id="__span-0-738"> <span class="k">for</span> <span class="n">handoff_item</span> <span class="ow">in</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">handoffs</span><span class="p">:</span>
</span><span id="__span-0-739"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-740"> <span class="nb">hasattr</span><span class="p">(</span><span class="n">handoff_item</span><span class="p">,</span> <span class="s2">&quot;agent_name&quot;</span><span class="p">)</span>
</span><span id="__span-0-741"> <span class="ow">and</span> <span class="n">handoff_item</span><span class="o">.</span><span class="n">agent_name</span> <span class="o">==</span> <span class="n">previous_agent</span><span class="o">.</span><span class="n">name</span>
</span><span id="__span-0-742"> <span class="p">):</span>
</span><span id="__span-0-743"> <span class="c1"># Bidirectional handoff detected, share history</span>
</span><span id="__span-0-744"> <span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-745"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span>
</span><span id="__span-0-746"> <span class="p">)</span>
</span><span id="__span-0-747"> <span class="k">break</span>
</span><span id="__span-0-748">
</span><span id="__span-0-749"> <span class="n">current_span</span><span class="o">.</span><span class="n">finish</span><span class="p">(</span><span class="n">reset_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-750"> <span class="n">current_span</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-751"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-752"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put_nowait</span><span class="p">(</span>
</span><span id="__span-0-753"> <span class="n">AgentUpdatedStreamEvent</span><span class="p">(</span><span class="n">new_agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">)</span>
</span><span id="__span-0-754"> <span class="p">)</span>
</span><span id="__span-0-755"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepFinalOutput</span><span class="p">):</span>
</span><span id="__span-0-756"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_output_guardrails_task</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span>
</span><span id="__span-0-757"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_output_guardrails</span><span class="p">(</span>
</span><span id="__span-0-758"> <span class="n">current_agent</span><span class="o">.</span><span class="n">output_guardrails</span>
</span><span id="__span-0-759"> <span class="o">+</span> <span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">output_guardrails</span> <span class="ow">or</span> <span class="p">[]),</span>
</span><span id="__span-0-760"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-761"> <span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">output</span><span class="p">,</span>
</span><span id="__span-0-762"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-763"> <span class="p">)</span>
</span><span id="__span-0-764"> <span class="p">)</span>
</span><span id="__span-0-765">
</span><span id="__span-0-766"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-767"> <span class="n">output_guardrail_results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_output_guardrails_task</span>
</span><span id="__span-0-768"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-769"> <span class="c1"># Exceptions will be checked in the stream_events loop</span>
</span><span id="__span-0-770"> <span class="n">output_guardrail_results</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-771">
</span><span id="__span-0-772"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">output_guardrail_results</span> <span class="o">=</span> <span class="n">output_guardrail_results</span>
</span><span id="__span-0-773"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">final_output</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">output</span>
</span><span id="__span-0-774"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">is_complete</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-775"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put_nowait</span><span class="p">(</span><span class="n">QueueCompleteSentinel</span><span class="p">())</span>
</span><span id="__span-0-776"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepRunAgain</span><span class="p">):</span>
</span><span id="__span-0-777"> <span class="k">pass</span>
</span><span id="__span-0-778"> <span class="k">except</span> <span class="p">(</span><span class="ne">KeyboardInterrupt</span><span class="p">,</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">CancelledError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-779"> <span class="c1"># Re-raise to propagate the interruption</span>
</span><span id="__span-0-780"> <span class="k">raise</span> <span class="n">e</span>
</span><span id="__span-0-781"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-782"> <span class="k">if</span> <span class="n">current_span</span><span class="p">:</span>
</span><span id="__span-0-783"> <span class="n">_error_tracing</span><span class="o">.</span><span class="n">attach_error_to_span</span><span class="p">(</span>
</span><span id="__span-0-784"> <span class="n">current_span</span><span class="p">,</span>
</span><span id="__span-0-785"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-786"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Error in agent run&quot;</span><span class="p">,</span>
</span><span id="__span-0-787"> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)},</span>
</span><span id="__span-0-788"> <span class="p">),</span>
</span><span id="__span-0-789"> <span class="p">)</span>
</span><span id="__span-0-790"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">is_complete</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-791"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put_nowait</span><span class="p">(</span><span class="n">QueueCompleteSentinel</span><span class="p">())</span>
</span><span id="__span-0-792"> <span class="k">raise</span>
</span><span id="__span-0-793">
</span><span id="__span-0-794"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">is_complete</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-795"> <span class="k">finally</span><span class="p">:</span>
</span><span id="__span-0-796"> <span class="k">if</span> <span class="n">current_span</span><span class="p">:</span>
</span><span id="__span-0-797"> <span class="n">current_span</span><span class="o">.</span><span class="n">finish</span><span class="p">(</span><span class="n">reset_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-798">
</span><span id="__span-0-799"> <span class="nd">@classmethod</span>
</span><span id="__span-0-800"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_run_single_turn_streamed</span><span class="p">(</span>
</span><span id="__span-0-801"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-802"> <span class="n">streamed_result</span><span class="p">:</span> <span class="n">RunResultStreaming</span><span class="p">,</span>
</span><span id="__span-0-803"> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-804"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-805"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-806"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span><span class="p">,</span>
</span><span id="__span-0-807"> <span class="n">should_run_agent_start_hooks</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span>
</span><span id="__span-0-808"> <span class="n">tool_use_tracker</span><span class="p">:</span> <span class="n">AgentToolUseTracker</span><span class="p">,</span>
</span><span id="__span-0-809"> <span class="n">all_tools</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">Tool</span><span class="p">],</span>
</span><span id="__span-0-810"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">SingleStepResult</span><span class="p">:</span>
</span><span id="__span-0-811"> <span class="k">if</span> <span class="n">should_run_agent_start_hooks</span><span class="p">:</span>
</span><span id="__span-0-812"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span>
</span><span id="__span-0-813"> <span class="n">hooks</span><span class="o">.</span><span class="n">on_agent_start</span><span class="p">(</span><span class="n">context_wrapper</span><span class="p">,</span> <span class="n">agent</span><span class="p">),</span>
</span><span id="__span-0-814"> <span class="p">(</span>
</span><span id="__span-0-815"> <span class="n">agent</span><span class="o">.</span><span class="n">hooks</span><span class="o">.</span><span class="n">on_start</span><span class="p">(</span><span class="n">context_wrapper</span><span class="p">,</span> <span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-816"> <span class="k">if</span> <span class="n">agent</span><span class="o">.</span><span class="n">hooks</span>
</span><span id="__span-0-817"> <span class="k">else</span> <span class="n">_coro</span><span class="o">.</span><span class="n">noop_coroutine</span><span class="p">()</span>
</span><span id="__span-0-818"> <span class="p">),</span>
</span><span id="__span-0-819"> <span class="p">)</span>
</span><span id="__span-0-820">
</span><span id="__span-0-821"> <span class="n">output_schema</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_output_schema</span><span class="p">(</span><span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-822">
</span><span id="__span-0-823"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">current_agent</span> <span class="o">=</span> <span class="n">agent</span>
</span><span id="__span-0-824"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_current_agent_output_schema</span> <span class="o">=</span> <span class="n">output_schema</span>
</span><span id="__span-0-825">
</span><span id="__span-0-826"> <span class="n">system_prompt</span> <span class="o">=</span> <span class="k">await</span> <span class="n">agent</span><span class="o">.</span><span class="n">get_system_prompt</span><span class="p">(</span><span class="n">context_wrapper</span><span class="p">)</span>
</span><span id="__span-0-827">
</span><span id="__span-0-828"> <span class="n">handoffs</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_handoffs</span><span class="p">(</span><span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-829"> <span class="n">model</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_model</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">run_config</span><span class="p">)</span>
</span><span id="__span-0-830"> <span class="n">model_settings</span> <span class="o">=</span> <span class="n">agent</span><span class="o">.</span><span class="n">model_settings</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">model_settings</span><span class="p">)</span>
</span><span id="__span-0-831"> <span class="n">model_settings</span> <span class="o">=</span> <span class="n">RunImpl</span><span class="o">.</span><span class="n">maybe_reset_tool_choice</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">tool_use_tracker</span><span class="p">,</span> <span class="n">model_settings</span><span class="p">)</span>
</span><span id="__span-0-832">
</span><span id="__span-0-833"> <span class="c1"># Ensure agent model is set in model_settings for streaming mode</span>
</span><span id="__span-0-834"> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model_settings</span><span class="p">,</span> <span class="s2">&quot;agent_model&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">model_settings</span><span class="o">.</span><span class="n">agent_model</span><span class="p">:</span>
</span><span id="__span-0-835"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="__span-0-836"> <span class="n">model_settings</span><span class="o">.</span><span class="n">agent_model</span> <span class="o">=</span> <span class="n">agent</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-837"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="__span-0-838"> <span class="n">model_settings</span><span class="o">.</span><span class="n">agent_model</span> <span class="o">=</span> <span class="n">run_config</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-839">
</span><span id="__span-0-840"> <span class="n">final_response</span><span class="p">:</span> <span class="n">ModelResponse</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-841">
</span><span id="__span-0-842"> <span class="nb">input</span> <span class="o">=</span> <span class="n">ItemHelpers</span><span class="o">.</span><span class="n">input_to_new_input_list</span><span class="p">(</span><span class="n">streamed_result</span><span class="o">.</span><span class="n">input</span><span class="p">)</span>
</span><span id="__span-0-843"> <span class="nb">input</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">item</span><span class="o">.</span><span class="n">to_input_item</span><span class="p">()</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">streamed_result</span><span class="o">.</span><span class="n">new_items</span><span class="p">])</span>
</span><span id="__span-0-844">
</span><span id="__span-0-845"> <span class="c1"># 1. Stream the output events</span>
</span><span id="__span-0-846"> <span class="k">async</span> <span class="k">for</span> <span class="n">event</span> <span class="ow">in</span> <span class="n">model</span><span class="o">.</span><span class="n">stream_response</span><span class="p">(</span>
</span><span id="__span-0-847"> <span class="n">system_prompt</span><span class="p">,</span>
</span><span id="__span-0-848"> <span class="nb">input</span><span class="p">,</span>
</span><span id="__span-0-849"> <span class="n">model_settings</span><span class="p">,</span>
</span><span id="__span-0-850"> <span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-851"> <span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-852"> <span class="n">handoffs</span><span class="p">,</span>
</span><span id="__span-0-853"> <span class="n">get_model_tracing_impl</span><span class="p">(</span>
</span><span id="__span-0-854"> <span class="n">run_config</span><span class="o">.</span><span class="n">tracing_disabled</span><span class="p">,</span> <span class="n">run_config</span><span class="o">.</span><span class="n">trace_include_sensitive_data</span>
</span><span id="__span-0-855"> <span class="p">),</span>
</span><span id="__span-0-856"> <span class="p">):</span>
</span><span id="__span-0-857"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">event</span><span class="p">,</span> <span class="n">ResponseCompletedEvent</span><span class="p">):</span>
</span><span id="__span-0-858"> <span class="c1"># Extract cache metrics if available</span>
</span><span id="__span-0-859"> <span class="n">cache_creation</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-860"> <span class="n">cache_read</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-861"> <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">usage</span><span class="p">:</span>
</span><span id="__span-0-862"> <span class="n">cache_creation</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">usage</span><span class="p">,</span> <span class="s1">&#39;cache_creation_input_tokens&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="__span-0-863"> <span class="n">cache_read</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">usage</span><span class="p">,</span> <span class="s1">&#39;cache_read_input_tokens&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="__span-0-864">
</span><span id="__span-0-865"> <span class="n">usage</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-866"> <span class="n">Usage</span><span class="p">(</span>
</span><span id="__span-0-867"> <span class="n">requests</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
</span><span id="__span-0-868"> <span class="n">input_tokens</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">usage</span><span class="o">.</span><span class="n">input_tokens</span><span class="p">,</span>
</span><span id="__span-0-869"> <span class="n">output_tokens</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">usage</span><span class="o">.</span><span class="n">output_tokens</span><span class="p">,</span>
</span><span id="__span-0-870"> <span class="n">total_tokens</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">usage</span><span class="o">.</span><span class="n">total_tokens</span><span class="p">,</span>
</span><span id="__span-0-871"> <span class="n">cache_creation_input_tokens</span><span class="o">=</span><span class="n">cache_creation</span><span class="p">,</span>
</span><span id="__span-0-872"> <span class="n">cache_read_input_tokens</span><span class="o">=</span><span class="n">cache_read</span><span class="p">,</span>
</span><span id="__span-0-873"> <span class="p">)</span>
</span><span id="__span-0-874"> <span class="k">if</span> <span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">usage</span>
</span><span id="__span-0-875"> <span class="k">else</span> <span class="n">Usage</span><span class="p">()</span>
</span><span id="__span-0-876"> <span class="p">)</span>
</span><span id="__span-0-877"> <span class="n">final_response</span> <span class="o">=</span> <span class="n">ModelResponse</span><span class="p">(</span>
</span><span id="__span-0-878"> <span class="n">output</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">output</span><span class="p">,</span>
</span><span id="__span-0-879"> <span class="n">usage</span><span class="o">=</span><span class="n">usage</span><span class="p">,</span>
</span><span id="__span-0-880"> <span class="n">referenceable_id</span><span class="o">=</span><span class="n">event</span><span class="o">.</span><span class="n">response</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</span><span id="__span-0-881"> <span class="p">)</span>
</span><span id="__span-0-882">
</span><span id="__span-0-883"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span><span class="o">.</span><span class="n">put_nowait</span><span class="p">(</span><span class="n">RawResponsesStreamEvent</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">event</span><span class="p">))</span>
</span><span id="__span-0-884">
</span><span id="__span-0-885"> <span class="c1"># 2. At this point, the streaming is complete for this turn of the agent loop.</span>
</span><span id="__span-0-886"> <span class="k">if</span> <span class="ow">not</span> <span class="n">final_response</span><span class="p">:</span>
</span><span id="__span-0-887"> <span class="k">raise</span> <span class="n">ModelBehaviorError</span><span class="p">(</span><span class="s2">&quot;Model did not produce a final response!&quot;</span><span class="p">)</span>
</span><span id="__span-0-888">
</span><span id="__span-0-889"> <span class="c1"># 3. Now, we can process the turn as we do in the non-streaming case</span>
</span><span id="__span-0-890"> <span class="n">single_step_result</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-891"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-892"> <span class="n">single_step_result</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_single_step_result_from_response</span><span class="p">(</span>
</span><span id="__span-0-893"> <span class="n">agent</span><span class="o">=</span><span class="n">agent</span><span class="p">,</span>
</span><span id="__span-0-894"> <span class="n">original_input</span><span class="o">=</span><span class="n">streamed_result</span><span class="o">.</span><span class="n">input</span><span class="p">,</span>
</span><span id="__span-0-895"> <span class="n">pre_step_items</span><span class="o">=</span><span class="n">streamed_result</span><span class="o">.</span><span class="n">new_items</span><span class="p">,</span>
</span><span id="__span-0-896"> <span class="n">new_response</span><span class="o">=</span><span class="n">final_response</span><span class="p">,</span>
</span><span id="__span-0-897"> <span class="n">output_schema</span><span class="o">=</span><span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-898"> <span class="n">all_tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-899"> <span class="n">handoffs</span><span class="o">=</span><span class="n">handoffs</span><span class="p">,</span>
</span><span id="__span-0-900"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-901"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-902"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-903"> <span class="n">tool_use_tracker</span><span class="o">=</span><span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-904"> <span class="p">)</span>
</span><span id="__span-0-905">
</span><span id="__span-0-906"> <span class="n">RunImpl</span><span class="o">.</span><span class="n">stream_step_result_to_queue</span><span class="p">(</span><span class="n">single_step_result</span><span class="p">,</span> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span><span class="p">)</span>
</span><span id="__span-0-907"> <span class="k">return</span> <span class="n">single_step_result</span>
</span><span id="__span-0-908"> <span class="k">except</span> <span class="p">(</span><span class="ne">KeyboardInterrupt</span><span class="p">,</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">CancelledError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-909"> <span class="c1"># When interrupted, we need to ensure the message history is consistent</span>
</span><span id="__span-0-910"> <span class="c1"># The tool calls were already added during streaming, but results were not</span>
</span><span id="__span-0-911"> <span class="c1"># If we have a partial result, stream it before re-raising</span>
</span><span id="__span-0-912"> <span class="k">if</span> <span class="n">single_step_result</span><span class="p">:</span>
</span><span id="__span-0-913"> <span class="n">RunImpl</span><span class="o">.</span><span class="n">stream_step_result_to_queue</span><span class="p">(</span>
</span><span id="__span-0-914"> <span class="n">single_step_result</span><span class="p">,</span> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_event_queue</span>
</span><span id="__span-0-915"> <span class="p">)</span>
</span><span id="__span-0-916"> <span class="k">raise</span> <span class="n">e</span>
</span><span id="__span-0-917">
</span><span id="__span-0-918"> <span class="nd">@classmethod</span>
</span><span id="__span-0-919"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_run_single_turn</span><span class="p">(</span>
</span><span id="__span-0-920"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-921"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-922"> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-923"> <span class="n">all_tools</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">Tool</span><span class="p">],</span>
</span><span id="__span-0-924"> <span class="n">original_input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-925"> <span class="n">generated_items</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">RunItem</span><span class="p">],</span>
</span><span id="__span-0-926"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-927"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-928"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span><span class="p">,</span>
</span><span id="__span-0-929"> <span class="n">should_run_agent_start_hooks</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span>
</span><span id="__span-0-930"> <span class="n">tool_use_tracker</span><span class="p">:</span> <span class="n">AgentToolUseTracker</span><span class="p">,</span>
</span><span id="__span-0-931"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">SingleStepResult</span><span class="p">:</span>
</span><span id="__span-0-932"> <span class="c1"># Ensure we run the hooks before anything else</span>
</span><span id="__span-0-933"> <span class="k">if</span> <span class="n">should_run_agent_start_hooks</span><span class="p">:</span>
</span><span id="__span-0-934"> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span>
</span><span id="__span-0-935"> <span class="n">hooks</span><span class="o">.</span><span class="n">on_agent_start</span><span class="p">(</span><span class="n">context_wrapper</span><span class="p">,</span> <span class="n">agent</span><span class="p">),</span>
</span><span id="__span-0-936"> <span class="p">(</span>
</span><span id="__span-0-937"> <span class="n">agent</span><span class="o">.</span><span class="n">hooks</span><span class="o">.</span><span class="n">on_start</span><span class="p">(</span><span class="n">context_wrapper</span><span class="p">,</span> <span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-938"> <span class="k">if</span> <span class="n">agent</span><span class="o">.</span><span class="n">hooks</span>
</span><span id="__span-0-939"> <span class="k">else</span> <span class="n">_coro</span><span class="o">.</span><span class="n">noop_coroutine</span><span class="p">()</span>
</span><span id="__span-0-940"> <span class="p">),</span>
</span><span id="__span-0-941"> <span class="p">)</span>
</span><span id="__span-0-942">
</span><span id="__span-0-943"> <span class="n">system_prompt</span> <span class="o">=</span> <span class="k">await</span> <span class="n">agent</span><span class="o">.</span><span class="n">get_system_prompt</span><span class="p">(</span><span class="n">context_wrapper</span><span class="p">)</span>
</span><span id="__span-0-944">
</span><span id="__span-0-945"> <span class="n">output_schema</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_output_schema</span><span class="p">(</span><span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-946"> <span class="n">handoffs</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_handoffs</span><span class="p">(</span><span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-947"> <span class="nb">input</span> <span class="o">=</span> <span class="n">ItemHelpers</span><span class="o">.</span><span class="n">input_to_new_input_list</span><span class="p">(</span><span class="n">original_input</span><span class="p">)</span>
</span><span id="__span-0-948"> <span class="nb">input</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">generated_item</span><span class="o">.</span><span class="n">to_input_item</span><span class="p">()</span> <span class="k">for</span> <span class="n">generated_item</span> <span class="ow">in</span> <span class="n">generated_items</span><span class="p">])</span>
</span><span id="__span-0-949">
</span><span id="__span-0-950"> <span class="n">new_response</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_new_response</span><span class="p">(</span>
</span><span id="__span-0-951"> <span class="n">agent</span><span class="p">,</span>
</span><span id="__span-0-952"> <span class="n">system_prompt</span><span class="p">,</span>
</span><span id="__span-0-953"> <span class="nb">input</span><span class="p">,</span>
</span><span id="__span-0-954"> <span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-955"> <span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-956"> <span class="n">handoffs</span><span class="p">,</span>
</span><span id="__span-0-957"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-958"> <span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-959"> <span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-960"> <span class="p">)</span>
</span><span id="__span-0-961">
</span><span id="__span-0-962"> <span class="k">return</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_single_step_result_from_response</span><span class="p">(</span>
</span><span id="__span-0-963"> <span class="n">agent</span><span class="o">=</span><span class="n">agent</span><span class="p">,</span>
</span><span id="__span-0-964"> <span class="n">original_input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-965"> <span class="n">pre_step_items</span><span class="o">=</span><span class="n">generated_items</span><span class="p">,</span>
</span><span id="__span-0-966"> <span class="n">new_response</span><span class="o">=</span><span class="n">new_response</span><span class="p">,</span>
</span><span id="__span-0-967"> <span class="n">output_schema</span><span class="o">=</span><span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-968"> <span class="n">all_tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-969"> <span class="n">handoffs</span><span class="o">=</span><span class="n">handoffs</span><span class="p">,</span>
</span><span id="__span-0-970"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-971"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-972"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-973"> <span class="n">tool_use_tracker</span><span class="o">=</span><span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-974"> <span class="p">)</span>
</span><span id="__span-0-975">
</span><span id="__span-0-976"> <span class="nd">@classmethod</span>
</span><span id="__span-0-977"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_get_single_step_result_from_response</span><span class="p">(</span>
</span><span id="__span-0-978"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-979"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-980"> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-981"> <span class="n">all_tools</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">Tool</span><span class="p">],</span>
</span><span id="__span-0-982"> <span class="n">original_input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-983"> <span class="n">pre_step_items</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">RunItem</span><span class="p">],</span>
</span><span id="__span-0-984"> <span class="n">new_response</span><span class="p">:</span> <span class="n">ModelResponse</span><span class="p">,</span>
</span><span id="__span-0-985"> <span class="n">output_schema</span><span class="p">:</span> <span class="n">AgentOutputSchema</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-986"> <span class="n">handoffs</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">Handoff</span><span class="p">],</span>
</span><span id="__span-0-987"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-988"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-989"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span><span class="p">,</span>
</span><span id="__span-0-990"> <span class="n">tool_use_tracker</span><span class="p">:</span> <span class="n">AgentToolUseTracker</span><span class="p">,</span>
</span><span id="__span-0-991"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">SingleStepResult</span><span class="p">:</span>
</span><span id="__span-0-992"> <span class="n">processed_response</span> <span class="o">=</span> <span class="n">RunImpl</span><span class="o">.</span><span class="n">process_model_response</span><span class="p">(</span>
</span><span id="__span-0-993"> <span class="n">agent</span><span class="o">=</span><span class="n">agent</span><span class="p">,</span>
</span><span id="__span-0-994"> <span class="n">all_tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-995"> <span class="n">response</span><span class="o">=</span><span class="n">new_response</span><span class="p">,</span>
</span><span id="__span-0-996"> <span class="n">output_schema</span><span class="o">=</span><span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-997"> <span class="n">handoffs</span><span class="o">=</span><span class="n">handoffs</span><span class="p">,</span>
</span><span id="__span-0-998"> <span class="p">)</span>
</span><span id="__span-0-999">
</span><span id="__span-0-1000"> <span class="c1"># Log tools used with robust type checking</span>
</span><span id="__span-0-1001"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">processed_response</span><span class="p">,</span> <span class="s2">&quot;tools_used&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">processed_response</span><span class="o">.</span><span class="n">tools_used</span><span class="p">:</span>
</span><span id="__span-0-1002"> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">tool_call</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">processed_response</span><span class="o">.</span><span class="n">tools_used</span><span class="p">):</span>
</span><span id="__span-0-1003"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-1004"> <span class="c1"># Safely extract tool name with multiple fallbacks</span>
</span><span id="__span-0-1005"> <span class="n">tool_name</span> <span class="o">=</span> <span class="s2">&quot;Unknown&quot;</span>
</span><span id="__span-0-1006"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-1007"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">tool_call</span><span class="p">,</span> <span class="s2">&quot;tool&quot;</span><span class="p">):</span>
</span><span id="__span-0-1008"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tool_call</span><span class="o">.</span><span class="n">tool</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="__span-0-1009"> <span class="n">tool_name</span> <span class="o">=</span> <span class="n">tool_call</span><span class="o">.</span><span class="n">tool</span>
</span><span id="__span-0-1010"> <span class="k">elif</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">tool_call</span><span class="o">.</span><span class="n">tool</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">):</span>
</span><span id="__span-0-1011"> <span class="n">tool_name</span> <span class="o">=</span> <span class="n">tool_call</span><span class="o">.</span><span class="n">tool</span><span class="o">.</span><span class="n">name</span>
</span><span id="__span-0-1012"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-1013"> <span class="n">tool_name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">tool_call</span><span class="o">.</span><span class="n">tool</span><span class="p">)</span>
</span><span id="__span-0-1014"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-1015"> <span class="k">pass</span>
</span><span id="__span-0-1016">
</span><span id="__span-0-1017"> <span class="c1"># Safely extract call_id</span>
</span><span id="__span-0-1018"> <span class="n">call_id</span> <span class="o">=</span> <span class="s2">&quot;Unknown&quot;</span>
</span><span id="__span-0-1019"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-1020"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">tool_call</span><span class="p">,</span> <span class="s2">&quot;call_id&quot;</span><span class="p">):</span>
</span><span id="__span-0-1021"> <span class="n">call_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">tool_call</span><span class="o">.</span><span class="n">call_id</span><span class="p">)</span>
</span><span id="__span-0-1022"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-1023"> <span class="k">pass</span>
</span><span id="__span-0-1024">
</span><span id="__span-0-1025"> <span class="c1"># Safely extract parsed_args</span>
</span><span id="__span-0-1026"> <span class="n">parsed_args</span> <span class="o">=</span> <span class="s2">&quot;Unknown&quot;</span>
</span><span id="__span-0-1027"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-1028"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">tool_call</span><span class="p">,</span> <span class="s2">&quot;parsed_args&quot;</span><span class="p">):</span>
</span><span id="__span-0-1029"> <span class="n">parsed_args</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">tool_call</span><span class="o">.</span><span class="n">parsed_args</span><span class="p">)</span>
</span><span id="__span-0-1030"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-1031"> <span class="k">pass</span>
</span><span id="__span-0-1032"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-1033"> <span class="k">pass</span>
</span><span id="__span-0-1034">
</span><span id="__span-0-1035"> <span class="n">tool_use_tracker</span><span class="o">.</span><span class="n">add_tool_use</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">processed_response</span><span class="o">.</span><span class="n">tools_used</span><span class="p">)</span>
</span><span id="__span-0-1036">
</span><span id="__span-0-1037"> <span class="k">return</span> <span class="k">await</span> <span class="n">RunImpl</span><span class="o">.</span><span class="n">execute_tools_and_side_effects</span><span class="p">(</span>
</span><span id="__span-0-1038"> <span class="n">agent</span><span class="o">=</span><span class="n">agent</span><span class="p">,</span>
</span><span id="__span-0-1039"> <span class="n">original_input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-1040"> <span class="n">pre_step_items</span><span class="o">=</span><span class="n">pre_step_items</span><span class="p">,</span>
</span><span id="__span-0-1041"> <span class="n">new_response</span><span class="o">=</span><span class="n">new_response</span><span class="p">,</span>
</span><span id="__span-0-1042"> <span class="n">processed_response</span><span class="o">=</span><span class="n">processed_response</span><span class="p">,</span>
</span><span id="__span-0-1043"> <span class="n">output_schema</span><span class="o">=</span><span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-1044"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-1045"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-1046"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-1047"> <span class="p">)</span>
</span><span id="__span-0-1048">
</span><span id="__span-0-1049"> <span class="nd">@classmethod</span>
</span><span id="__span-0-1050"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_run_input_guardrails</span><span class="p">(</span>
</span><span id="__span-0-1051"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-1052"> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span>
</span><span id="__span-0-1053"> <span class="n">guardrails</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">InputGuardrail</span><span class="p">[</span><span class="n">TContext</span><span class="p">]],</span>
</span><span id="__span-0-1054"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-1055"> <span class="n">context</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-1056"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">InputGuardrailResult</span><span class="p">]:</span>
</span><span id="__span-0-1057"> <span class="k">if</span> <span class="ow">not</span> <span class="n">guardrails</span><span class="p">:</span>
</span><span id="__span-0-1058"> <span class="k">return</span> <span class="p">[]</span>
</span><span id="__span-0-1059">
</span><span id="__span-0-1060"> <span class="n">guardrail_tasks</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="__span-0-1061"> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span>
</span><span id="__span-0-1062"> <span class="n">RunImpl</span><span class="o">.</span><span class="n">run_single_input_guardrail</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">guardrail</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
</span><span id="__span-0-1063"> <span class="p">)</span>
</span><span id="__span-0-1064"> <span class="k">for</span> <span class="n">guardrail</span> <span class="ow">in</span> <span class="n">guardrails</span>
</span><span id="__span-0-1065"> <span class="p">]</span>
</span><span id="__span-0-1066">
</span><span id="__span-0-1067"> <span class="n">guardrail_results</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-1068">
</span><span id="__span-0-1069"> <span class="k">for</span> <span class="n">done</span> <span class="ow">in</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">as_completed</span><span class="p">(</span><span class="n">guardrail_tasks</span><span class="p">):</span>
</span><span id="__span-0-1070"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">done</span>
</span><span id="__span-0-1071"> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">output</span><span class="o">.</span><span class="n">tripwire_triggered</span><span class="p">:</span>
</span><span id="__span-0-1072"> <span class="c1"># Cancel all guardrail tasks if a tripwire is triggered.</span>
</span><span id="__span-0-1073"> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">guardrail_tasks</span><span class="p">:</span>
</span><span id="__span-0-1074"> <span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
</span><span id="__span-0-1075"> <span class="n">_error_tracing</span><span class="o">.</span><span class="n">attach_error_to_current_span</span><span class="p">(</span>
</span><span id="__span-0-1076"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-1077"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Guardrail tripwire triggered&quot;</span><span class="p">,</span>
</span><span id="__span-0-1078"> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;guardrail&quot;</span><span class="p">:</span> <span class="n">result</span><span class="o">.</span><span class="n">guardrail</span><span class="o">.</span><span class="n">get_name</span><span class="p">()},</span>
</span><span id="__span-0-1079"> <span class="p">)</span>
</span><span id="__span-0-1080"> <span class="p">)</span>
</span><span id="__span-0-1081"> <span class="k">raise</span> <span class="n">InputGuardrailTripwireTriggered</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="__span-0-1082"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-1083"> <span class="n">guardrail_results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="__span-0-1084">
</span><span id="__span-0-1085"> <span class="k">return</span> <span class="n">guardrail_results</span>
</span><span id="__span-0-1086">
</span><span id="__span-0-1087"> <span class="nd">@classmethod</span>
</span><span id="__span-0-1088"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_run_output_guardrails</span><span class="p">(</span>
</span><span id="__span-0-1089"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-1090"> <span class="n">guardrails</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">OutputGuardrail</span><span class="p">[</span><span class="n">TContext</span><span class="p">]],</span>
</span><span id="__span-0-1091"> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-1092"> <span class="n">agent_output</span><span class="p">:</span> <span class="n">Any</span><span class="p">,</span>
</span><span id="__span-0-1093"> <span class="n">context</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-1094"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">OutputGuardrailResult</span><span class="p">]:</span>
</span><span id="__span-0-1095"> <span class="k">if</span> <span class="ow">not</span> <span class="n">guardrails</span><span class="p">:</span>
</span><span id="__span-0-1096"> <span class="k">return</span> <span class="p">[]</span>
</span><span id="__span-0-1097">
</span><span id="__span-0-1098"> <span class="n">guardrail_tasks</span> <span class="o">=</span> <span class="p">[</span>
</span><span id="__span-0-1099"> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span>
</span><span id="__span-0-1100"> <span class="n">RunImpl</span><span class="o">.</span><span class="n">run_single_output_guardrail</span><span class="p">(</span><span class="n">guardrail</span><span class="p">,</span> <span class="n">agent</span><span class="p">,</span> <span class="n">agent_output</span><span class="p">,</span> <span class="n">context</span><span class="p">)</span>
</span><span id="__span-0-1101"> <span class="p">)</span>
</span><span id="__span-0-1102"> <span class="k">for</span> <span class="n">guardrail</span> <span class="ow">in</span> <span class="n">guardrails</span>
</span><span id="__span-0-1103"> <span class="p">]</span>
</span><span id="__span-0-1104">
</span><span id="__span-0-1105"> <span class="n">guardrail_results</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-1106">
</span><span id="__span-0-1107"> <span class="k">for</span> <span class="n">done</span> <span class="ow">in</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">as_completed</span><span class="p">(</span><span class="n">guardrail_tasks</span><span class="p">):</span>
</span><span id="__span-0-1108"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">done</span>
</span><span id="__span-0-1109"> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">output</span><span class="o">.</span><span class="n">tripwire_triggered</span><span class="p">:</span>
</span><span id="__span-0-1110"> <span class="c1"># Cancel all guardrail tasks if a tripwire is triggered.</span>
</span><span id="__span-0-1111"> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">guardrail_tasks</span><span class="p">:</span>
</span><span id="__span-0-1112"> <span class="n">t</span><span class="o">.</span><span class="n">cancel</span><span class="p">()</span>
</span><span id="__span-0-1113"> <span class="n">_error_tracing</span><span class="o">.</span><span class="n">attach_error_to_current_span</span><span class="p">(</span>
</span><span id="__span-0-1114"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-1115"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Guardrail tripwire triggered&quot;</span><span class="p">,</span>
</span><span id="__span-0-1116"> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;guardrail&quot;</span><span class="p">:</span> <span class="n">result</span><span class="o">.</span><span class="n">guardrail</span><span class="o">.</span><span class="n">get_name</span><span class="p">()},</span>
</span><span id="__span-0-1117"> <span class="p">)</span>
</span><span id="__span-0-1118"> <span class="p">)</span>
</span><span id="__span-0-1119"> <span class="k">raise</span> <span class="n">OutputGuardrailTripwireTriggered</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="__span-0-1120"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-1121"> <span class="n">guardrail_results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</span><span id="__span-0-1122">
</span><span id="__span-0-1123"> <span class="k">return</span> <span class="n">guardrail_results</span>
</span><span id="__span-0-1124">
</span><span id="__span-0-1125"> <span class="nd">@classmethod</span>
</span><span id="__span-0-1126"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_get_new_response</span><span class="p">(</span>
</span><span id="__span-0-1127"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-1128"> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-1129"> <span class="n">system_prompt</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-1130"> <span class="nb">input</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-1131"> <span class="n">output_schema</span><span class="p">:</span> <span class="n">AgentOutputSchema</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-1132"> <span class="n">all_tools</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">Tool</span><span class="p">],</span>
</span><span id="__span-0-1133"> <span class="n">handoffs</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">Handoff</span><span class="p">],</span>
</span><span id="__span-0-1134"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-1135"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span><span class="p">,</span>
</span><span id="__span-0-1136"> <span class="n">tool_use_tracker</span><span class="p">:</span> <span class="n">AgentToolUseTracker</span><span class="p">,</span>
</span><span id="__span-0-1137"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">ModelResponse</span><span class="p">:</span>
</span><span id="__span-0-1138"> <span class="n">model</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_model</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">run_config</span><span class="p">)</span>
</span><span id="__span-0-1139"> <span class="n">model_settings</span> <span class="o">=</span> <span class="n">agent</span><span class="o">.</span><span class="n">model_settings</span><span class="o">.</span><span class="n">resolve</span><span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">model_settings</span><span class="p">)</span>
</span><span id="__span-0-1140"> <span class="n">model_settings</span> <span class="o">=</span> <span class="n">RunImpl</span><span class="o">.</span><span class="n">maybe_reset_tool_choice</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">tool_use_tracker</span><span class="p">,</span> <span class="n">model_settings</span><span class="p">)</span>
</span><span id="__span-0-1141">
</span><span id="__span-0-1142"> <span class="c1"># Ensure agent model is set in model_settings</span>
</span><span id="__span-0-1143"> <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model_settings</span><span class="p">,</span> <span class="s2">&quot;agent_model&quot;</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">model_settings</span><span class="o">.</span><span class="n">agent_model</span><span class="p">:</span>
</span><span id="__span-0-1144"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="__span-0-1145"> <span class="n">model_settings</span><span class="o">.</span><span class="n">agent_model</span> <span class="o">=</span> <span class="n">agent</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-1146"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="__span-0-1147"> <span class="n">model_settings</span><span class="o">.</span><span class="n">agent_model</span> <span class="o">=</span> <span class="n">run_config</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-1148">
</span><span id="__span-0-1149"> <span class="n">new_response</span> <span class="o">=</span> <span class="k">await</span> <span class="n">model</span><span class="o">.</span><span class="n">get_response</span><span class="p">(</span>
</span><span id="__span-0-1150"> <span class="n">system_instructions</span><span class="o">=</span><span class="n">system_prompt</span><span class="p">,</span>
</span><span id="__span-0-1151"> <span class="nb">input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span>
</span><span id="__span-0-1152"> <span class="n">model_settings</span><span class="o">=</span><span class="n">model_settings</span><span class="p">,</span>
</span><span id="__span-0-1153"> <span class="n">tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-1154"> <span class="n">output_schema</span><span class="o">=</span><span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-1155"> <span class="n">handoffs</span><span class="o">=</span><span class="n">handoffs</span><span class="p">,</span>
</span><span id="__span-0-1156"> <span class="n">tracing</span><span class="o">=</span><span class="n">get_model_tracing_impl</span><span class="p">(</span>
</span><span id="__span-0-1157"> <span class="n">run_config</span><span class="o">.</span><span class="n">tracing_disabled</span><span class="p">,</span> <span class="n">run_config</span><span class="o">.</span><span class="n">trace_include_sensitive_data</span>
</span><span id="__span-0-1158"> <span class="p">),</span>
</span><span id="__span-0-1159"> <span class="p">)</span>
</span><span id="__span-0-1160">
</span><span id="__span-0-1161"> <span class="n">context_wrapper</span><span class="o">.</span><span class="n">usage</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">new_response</span><span class="o">.</span><span class="n">usage</span><span class="p">)</span>
</span><span id="__span-0-1162">
</span><span id="__span-0-1163"> <span class="k">return</span> <span class="n">new_response</span>
</span><span id="__span-0-1164">
</span><span id="__span-0-1165"> <span class="nd">@classmethod</span>
</span><span id="__span-0-1166"> <span class="k">def</span><span class="w"> </span><span class="nf">_get_output_schema</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">AgentOutputSchema</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-1167"> <span class="k">if</span> <span class="n">agent</span><span class="o">.</span><span class="n">output_type</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">agent</span><span class="o">.</span><span class="n">output_type</span> <span class="ow">is</span> <span class="nb">str</span><span class="p">:</span>
</span><span id="__span-0-1168"> <span class="k">return</span> <span class="kc">None</span>
</span><span id="__span-0-1169">
</span><span id="__span-0-1170"> <span class="k">return</span> <span class="n">AgentOutputSchema</span><span class="p">(</span><span class="n">agent</span><span class="o">.</span><span class="n">output_type</span><span class="p">)</span>
</span><span id="__span-0-1171">
</span><span id="__span-0-1172"> <span class="nd">@classmethod</span>
</span><span id="__span-0-1173"> <span class="k">def</span><span class="w"> </span><span class="nf">_get_handoffs</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">Handoff</span><span class="p">]:</span>
</span><span id="__span-0-1174"> <span class="n">handoffs</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-1175"> <span class="k">for</span> <span class="n">handoff_item</span> <span class="ow">in</span> <span class="n">agent</span><span class="o">.</span><span class="n">handoffs</span><span class="p">:</span>
</span><span id="__span-0-1176"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">handoff_item</span><span class="p">,</span> <span class="n">Handoff</span><span class="p">):</span>
</span><span id="__span-0-1177"> <span class="n">handoffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">handoff_item</span><span class="p">)</span>
</span><span id="__span-0-1178"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">handoff_item</span><span class="p">,</span> <span class="n">Agent</span><span class="p">):</span>
</span><span id="__span-0-1179"> <span class="n">handoffs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">handoff</span><span class="p">(</span><span class="n">handoff_item</span><span class="p">))</span>
</span><span id="__span-0-1180"> <span class="k">return</span> <span class="n">handoffs</span>
</span><span id="__span-0-1181">
</span><span id="__span-0-1182"> <span class="nd">@classmethod</span>
</span><span id="__span-0-1183"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_get_all_tools</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">Any</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">list</span><span class="p">[</span><span class="n">Tool</span><span class="p">]:</span>
</span><span id="__span-0-1184"> <span class="k">return</span> <span class="k">await</span> <span class="n">agent</span><span class="o">.</span><span class="n">get_all_tools</span><span class="p">()</span>
</span><span id="__span-0-1185">
</span><span id="__span-0-1186"> <span class="nd">@classmethod</span>
</span><span id="__span-0-1187"> <span class="k">def</span><span class="w"> </span><span class="nf">_get_model</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Model</span><span class="p">:</span>
</span><span id="__span-0-1188"> <span class="n">model</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-1189"> <span class="n">agent_model</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-1190"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
</span><span id="__span-0-1191"> <span class="n">model</span> <span class="o">=</span> <span class="n">run_config</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-1192"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
</span><span id="__span-0-1193"> <span class="n">model</span> <span class="o">=</span> <span class="n">run_config</span><span class="o">.</span><span class="n">model_provider</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
</span><span id="__span-0-1194"> <span class="n">agent_model</span> <span class="o">=</span> <span class="n">run_config</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-1195"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="n">Model</span><span class="p">):</span>
</span><span id="__span-0-1196"> <span class="n">model</span> <span class="o">=</span> <span class="n">agent</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-1197"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-1198"> <span class="n">model</span> <span class="o">=</span> <span class="n">run_config</span><span class="o">.</span><span class="n">model_provider</span><span class="o">.</span><span class="n">get_model</span><span class="p">(</span><span class="n">agent</span><span class="o">.</span><span class="n">model</span><span class="p">)</span>
</span><span id="__span-0-1199"> <span class="n">agent_model</span> <span class="o">=</span> <span class="n">agent</span><span class="o">.</span><span class="n">model</span>
</span><span id="__span-0-1200">
</span><span id="__span-0-1201"> <span class="c1"># Store the original agent model in model_settings for later use</span>
</span><span id="__span-0-1202"> <span class="k">if</span> <span class="n">agent_model</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="s2">&quot;model_settings&quot;</span><span class="p">):</span>
</span><span id="__span-0-1203"> <span class="n">agent</span><span class="o">.</span><span class="n">model_settings</span><span class="o">.</span><span class="n">agent_model</span> <span class="o">=</span> <span class="n">agent_model</span>
</span><span id="__span-0-1204">
</span><span id="__span-0-1205"> <span class="c1"># Set agent name if the model supports it (for CLI display)</span>
</span><span id="__span-0-1206"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;set_agent_name&quot;</span><span class="p">):</span>
</span><span id="__span-0-1207"> <span class="n">model</span><span class="o">.</span><span class="n">set_agent_name</span><span class="p">(</span><span class="n">agent</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="__span-0-1208">
</span><span id="__span-0-1209"> <span class="k">return</span> <span class="n">model</span>
</span></code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.run.Runner.run" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">run</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-async"><code>async</code></small>
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">run</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="Agent
dataclass
(cai.sdk.agents.agent.Agent)" href="../agent/#cai.sdk.agents.agent.Agent">Agent</a></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span><span class="p">],</span>
</span><span id="__span-0-3"> <span class="nb">input</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="TResponseInputItem
module-attribute
(cai.sdk.agents.items.TResponseInputItem)" href="../items/#cai.sdk.agents.items.TResponseInputItem">TResponseInputItem</a></span><span class="p">],</span>
</span><span id="__span-0-4"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-5"> <span class="n">context</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"> <span class="n">max_turns</span><span class="p">:</span> <span class="n"><span title="int">int</span></span> <span class="o">=</span> <span class="n"><span title="cai.sdk.agents.run.DEFAULT_MAX_TURNS">DEFAULT_MAX_TURNS</span></span><span class="p">,</span>
</span><span id="__span-0-7"> <span class="n">hooks</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="RunHooks (cai.sdk.agents.lifecycle.RunHooks)" href="../lifecycle/#cai.sdk.agents.lifecycle.RunHooks">RunHooks</a></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"> <span class="n">run_config</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="RunConfig
dataclass
(cai.sdk.agents.run.RunConfig)" href="#cai.sdk.agents.run.RunConfig">RunConfig</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-9"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="RunResult
dataclass
(cai.sdk.agents.result.RunResult)" href="../result/#cai.sdk.agents.result.RunResult">RunResult</a></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Run a workflow starting at the given agent. The agent will run in a loop until a final
output is generated. The loop runs like so:
1. The agent is invoked with the given input.
2. If there is a final output (i.e. the agent produces something of type
<code>agent.output_type</code>, the loop terminates.
3. If there's a handoff, we run the loop again, with the new agent.
4. Else, we run tool calls (if any), and re-run the loop.</p>
<p>In two cases, the agent may raise an exception:
1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.
2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</p>
<p>Note that only the first agent's input guardrails are run.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>starting_agent</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="Agent
dataclass
(cai.sdk.agents.agent.Agent)" href="../agent/#cai.sdk.agents.agent.Agent">Agent</a>[<span title="cai.sdk.agents.run_context.TContext">TContext</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The starting agent to run.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>input</code>
</td>
<td>
<code><span title="str">str</span> | <a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a>[<a class="autorefs autorefs-internal" title="TResponseInputItem
module-attribute
(cai.sdk.agents.items.TResponseInputItem)" href="../items/#cai.sdk.agents.items.TResponseInputItem">TResponseInputItem</a>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The initial input to the agent. You can pass a single string for a user message,
or a list of input items.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>context</code>
</td>
<td>
<code><span title="cai.sdk.agents.run_context.TContext">TContext</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>The context to run the agent with.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>max_turns</code>
</td>
<td>
<code><span title="int">int</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The maximum number of turns to run the agent for. A turn is defined as one
AI invocation (including any tool calls that might occur).</p>
</div>
</td>
<td>
<code><span title="cai.sdk.agents.run.DEFAULT_MAX_TURNS">DEFAULT_MAX_TURNS</span></code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>hooks</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="RunHooks (cai.sdk.agents.lifecycle.RunHooks)" href="../lifecycle/#cai.sdk.agents.lifecycle.RunHooks">RunHooks</a>[<span title="cai.sdk.agents.run_context.TContext">TContext</span>] | None</code>
</td>
<td>
<div class="doc-md-description">
<p>An object that receives callbacks on various lifecycle events.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>run_config</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="RunConfig
dataclass
(cai.sdk.agents.run.RunConfig)" href="#cai.sdk.agents.run.RunConfig">RunConfig</a> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Global settings for the entire agent run.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="RunResult
dataclass
(cai.sdk.agents.result.RunResult)" href="../result/#cai.sdk.agents.result.RunResult">RunResult</a></code>
</td>
<td>
<div class="doc-md-description">
<p>A run result containing all the inputs, guardrail results and the output of the last</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="RunResult
dataclass
(cai.sdk.agents.result.RunResult)" href="../result/#cai.sdk.agents.result.RunResult">RunResult</a></code>
</td>
<td>
<div class="doc-md-description">
<p>agent. Agents may perform handoffs, so we don't know the specific type of the output.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/run.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">135</span>
<span class="normal">136</span>
<span class="normal">137</span>
<span class="normal">138</span>
<span class="normal">139</span>
<span class="normal">140</span>
<span class="normal">141</span>
<span class="normal">142</span>
<span class="normal">143</span>
<span class="normal">144</span>
<span class="normal">145</span>
<span class="normal">146</span>
<span class="normal">147</span>
<span class="normal">148</span>
<span class="normal">149</span>
<span class="normal">150</span>
<span class="normal">151</span>
<span class="normal">152</span>
<span class="normal">153</span>
<span class="normal">154</span>
<span class="normal">155</span>
<span class="normal">156</span>
<span class="normal">157</span>
<span class="normal">158</span>
<span class="normal">159</span>
<span class="normal">160</span>
<span class="normal">161</span>
<span class="normal">162</span>
<span class="normal">163</span>
<span class="normal">164</span>
<span class="normal">165</span>
<span class="normal">166</span>
<span class="normal">167</span>
<span class="normal">168</span>
<span class="normal">169</span>
<span class="normal">170</span>
<span class="normal">171</span>
<span class="normal">172</span>
<span class="normal">173</span>
<span class="normal">174</span>
<span class="normal">175</span>
<span class="normal">176</span>
<span class="normal">177</span>
<span class="normal">178</span>
<span class="normal">179</span>
<span class="normal">180</span>
<span class="normal">181</span>
<span class="normal">182</span>
<span class="normal">183</span>
<span class="normal">184</span>
<span class="normal">185</span>
<span class="normal">186</span>
<span class="normal">187</span>
<span class="normal">188</span>
<span class="normal">189</span>
<span class="normal">190</span>
<span class="normal">191</span>
<span class="normal">192</span>
<span class="normal">193</span>
<span class="normal">194</span>
<span class="normal">195</span>
<span class="normal">196</span>
<span class="normal">197</span>
<span class="normal">198</span>
<span class="normal">199</span>
<span class="normal">200</span>
<span class="normal">201</span>
<span class="normal">202</span>
<span class="normal">203</span>
<span class="normal">204</span>
<span class="normal">205</span>
<span class="normal">206</span>
<span class="normal">207</span>
<span class="normal">208</span>
<span class="normal">209</span>
<span class="normal">210</span>
<span class="normal">211</span>
<span class="normal">212</span>
<span class="normal">213</span>
<span class="normal">214</span>
<span class="normal">215</span>
<span class="normal">216</span>
<span class="normal">217</span>
<span class="normal">218</span>
<span class="normal">219</span>
<span class="normal">220</span>
<span class="normal">221</span>
<span class="normal">222</span>
<span class="normal">223</span>
<span class="normal">224</span>
<span class="normal">225</span>
<span class="normal">226</span>
<span class="normal">227</span>
<span class="normal">228</span>
<span class="normal">229</span>
<span class="normal">230</span>
<span class="normal">231</span>
<span class="normal">232</span>
<span class="normal">233</span>
<span class="normal">234</span>
<span class="normal">235</span>
<span class="normal">236</span>
<span class="normal">237</span>
<span class="normal">238</span>
<span class="normal">239</span>
<span class="normal">240</span>
<span class="normal">241</span>
<span class="normal">242</span>
<span class="normal">243</span>
<span class="normal">244</span>
<span class="normal">245</span>
<span class="normal">246</span>
<span class="normal">247</span>
<span class="normal">248</span>
<span class="normal">249</span>
<span class="normal">250</span>
<span class="normal">251</span>
<span class="normal">252</span>
<span class="normal">253</span>
<span class="normal">254</span>
<span class="normal">255</span>
<span class="normal">256</span>
<span class="normal">257</span>
<span class="normal">258</span>
<span class="normal">259</span>
<span class="normal">260</span>
<span class="normal">261</span>
<span class="normal">262</span>
<span class="normal">263</span>
<span class="normal">264</span>
<span class="normal">265</span>
<span class="normal">266</span>
<span class="normal">267</span>
<span class="normal">268</span>
<span class="normal">269</span>
<span class="normal">270</span>
<span class="normal">271</span>
<span class="normal">272</span>
<span class="normal">273</span>
<span class="normal">274</span>
<span class="normal">275</span>
<span class="normal">276</span>
<span class="normal">277</span>
<span class="normal">278</span>
<span class="normal">279</span>
<span class="normal">280</span>
<span class="normal">281</span>
<span class="normal">282</span>
<span class="normal">283</span>
<span class="normal">284</span>
<span class="normal">285</span>
<span class="normal">286</span>
<span class="normal">287</span>
<span class="normal">288</span>
<span class="normal">289</span>
<span class="normal">290</span>
<span class="normal">291</span>
<span class="normal">292</span>
<span class="normal">293</span>
<span class="normal">294</span>
<span class="normal">295</span>
<span class="normal">296</span>
<span class="normal">297</span>
<span class="normal">298</span>
<span class="normal">299</span>
<span class="normal">300</span>
<span class="normal">301</span>
<span class="normal">302</span>
<span class="normal">303</span>
<span class="normal">304</span>
<span class="normal">305</span>
<span class="normal">306</span>
<span class="normal">307</span>
<span class="normal">308</span>
<span class="normal">309</span>
<span class="normal">310</span>
<span class="normal">311</span>
<span class="normal">312</span>
<span class="normal">313</span>
<span class="normal">314</span>
<span class="normal">315</span>
<span class="normal">316</span>
<span class="normal">317</span>
<span class="normal">318</span>
<span class="normal">319</span>
<span class="normal">320</span>
<span class="normal">321</span>
<span class="normal">322</span>
<span class="normal">323</span>
<span class="normal">324</span>
<span class="normal">325</span>
<span class="normal">326</span>
<span class="normal">327</span>
<span class="normal">328</span>
<span class="normal">329</span>
<span class="normal">330</span>
<span class="normal">331</span>
<span class="normal">332</span>
<span class="normal">333</span>
<span class="normal">334</span>
<span class="normal">335</span>
<span class="normal">336</span>
<span class="normal">337</span>
<span class="normal">338</span>
<span class="normal">339</span>
<span class="normal">340</span>
<span class="normal">341</span>
<span class="normal">342</span>
<span class="normal">343</span>
<span class="normal">344</span>
<span class="normal">345</span>
<span class="normal">346</span>
<span class="normal">347</span>
<span class="normal">348</span>
<span class="normal">349</span>
<span class="normal">350</span>
<span class="normal">351</span>
<span class="normal">352</span>
<span class="normal">353</span>
<span class="normal">354</span>
<span class="normal">355</span>
<span class="normal">356</span>
<span class="normal">357</span>
<span class="normal">358</span>
<span class="normal">359</span>
<span class="normal">360</span>
<span class="normal">361</span>
<span class="normal">362</span>
<span class="normal">363</span>
<span class="normal">364</span>
<span class="normal">365</span>
<span class="normal">366</span>
<span class="normal">367</span>
<span class="normal">368</span>
<span class="normal">369</span>
<span class="normal">370</span>
<span class="normal">371</span>
<span class="normal">372</span>
<span class="normal">373</span>
<span class="normal">374</span>
<span class="normal">375</span>
<span class="normal">376</span>
<span class="normal">377</span>
<span class="normal">378</span>
<span class="normal">379</span>
<span class="normal">380</span>
<span class="normal">381</span>
<span class="normal">382</span>
<span class="normal">383</span>
<span class="normal">384</span>
<span class="normal">385</span>
<span class="normal">386</span>
<span class="normal">387</span>
<span class="normal">388</span>
<span class="normal">389</span>
<span class="normal">390</span>
<span class="normal">391</span>
<span class="normal">392</span>
<span class="normal">393</span>
<span class="normal">394</span>
<span class="normal">395</span>
<span class="normal">396</span>
<span class="normal">397</span>
<span class="normal">398</span>
<span class="normal">399</span>
<span class="normal">400</span>
<span class="normal">401</span>
<span class="normal">402</span>
<span class="normal">403</span>
<span class="normal">404</span>
<span class="normal">405</span>
<span class="normal">406</span>
<span class="normal">407</span>
<span class="normal">408</span>
<span class="normal">409</span>
<span class="normal">410</span>
<span class="normal">411</span>
<span class="normal">412</span>
<span class="normal">413</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-135"><span class="nd">@classmethod</span>
</span><span id="__span-0-136"><span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">run</span><span class="p">(</span>
</span><span id="__span-0-137"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-138"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-139"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-140"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-141"> <span class="n">context</span><span class="p">:</span> <span class="n">TContext</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-142"> <span class="n">max_turns</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">DEFAULT_MAX_TURNS</span><span class="p">,</span>
</span><span id="__span-0-143"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-144"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-145"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RunResult</span><span class="p">:</span>
</span><span id="__span-0-146"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a workflow starting at the given agent. The agent will run in a loop until a final</span>
</span><span id="__span-0-147"><span class="sd"> output is generated. The loop runs like so:</span>
</span><span id="__span-0-148"><span class="sd"> 1. The agent is invoked with the given input.</span>
</span><span id="__span-0-149"><span class="sd"> 2. If there is a final output (i.e. the agent produces something of type</span>
</span><span id="__span-0-150"><span class="sd"> `agent.output_type`, the loop terminates.</span>
</span><span id="__span-0-151"><span class="sd"> 3. If there&#39;s a handoff, we run the loop again, with the new agent.</span>
</span><span id="__span-0-152"><span class="sd"> 4. Else, we run tool calls (if any), and re-run the loop.</span>
</span><span id="__span-0-153">
</span><span id="__span-0-154"><span class="sd"> In two cases, the agent may raise an exception:</span>
</span><span id="__span-0-155"><span class="sd"> 1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.</span>
</span><span id="__span-0-156"><span class="sd"> 2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</span>
</span><span id="__span-0-157">
</span><span id="__span-0-158"><span class="sd"> Note that only the first agent&#39;s input guardrails are run.</span>
</span><span id="__span-0-159">
</span><span id="__span-0-160"><span class="sd"> Args:</span>
</span><span id="__span-0-161"><span class="sd"> starting_agent: The starting agent to run.</span>
</span><span id="__span-0-162"><span class="sd"> input: The initial input to the agent. You can pass a single string for a user message,</span>
</span><span id="__span-0-163"><span class="sd"> or a list of input items.</span>
</span><span id="__span-0-164"><span class="sd"> context: The context to run the agent with.</span>
</span><span id="__span-0-165"><span class="sd"> max_turns: The maximum number of turns to run the agent for. A turn is defined as one</span>
</span><span id="__span-0-166"><span class="sd"> AI invocation (including any tool calls that might occur).</span>
</span><span id="__span-0-167"><span class="sd"> hooks: An object that receives callbacks on various lifecycle events.</span>
</span><span id="__span-0-168"><span class="sd"> run_config: Global settings for the entire agent run.</span>
</span><span id="__span-0-169">
</span><span id="__span-0-170"><span class="sd"> Returns:</span>
</span><span id="__span-0-171"><span class="sd"> A run result containing all the inputs, guardrail results and the output of the last</span>
</span><span id="__span-0-172"><span class="sd"> agent. Agents may perform handoffs, so we don&#39;t know the specific type of the output.</span>
</span><span id="__span-0-173"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-174"> <span class="k">if</span> <span class="n">hooks</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-175"> <span class="n">hooks</span> <span class="o">=</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">Any</span><span class="p">]()</span>
</span><span id="__span-0-176"> <span class="k">if</span> <span class="n">run_config</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-177"> <span class="n">run_config</span> <span class="o">=</span> <span class="n">RunConfig</span><span class="p">()</span>
</span><span id="__span-0-178">
</span><span id="__span-0-179"> <span class="n">tool_use_tracker</span> <span class="o">=</span> <span class="n">AgentToolUseTracker</span><span class="p">()</span>
</span><span id="__span-0-180">
</span><span id="__span-0-181"> <span class="k">with</span> <span class="n">TraceCtxManager</span><span class="p">(</span>
</span><span id="__span-0-182"> <span class="n">workflow_name</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">workflow_name</span><span class="p">,</span>
</span><span id="__span-0-183"> <span class="n">trace_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_id</span><span class="p">,</span>
</span><span id="__span-0-184"> <span class="n">group_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">group_id</span><span class="p">,</span>
</span><span id="__span-0-185"> <span class="n">metadata</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_metadata</span><span class="p">,</span>
</span><span id="__span-0-186"> <span class="n">disabled</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">tracing_disabled</span><span class="p">,</span>
</span><span id="__span-0-187"> <span class="p">):</span>
</span><span id="__span-0-188"> <span class="n">current_turn</span> <span class="o">=</span> <span class="mi">0</span>
</span><span id="__span-0-189"> <span class="n">original_input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">]</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
</span><span id="__span-0-190"> <span class="n">generated_items</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">RunItem</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-191"> <span class="n">model_responses</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">ModelResponse</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-192">
</span><span id="__span-0-193"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">=</span> <span class="n">RunContextWrapper</span><span class="p">(</span>
</span><span id="__span-0-194"> <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span> <span class="c1"># type: ignore</span>
</span><span id="__span-0-195"> <span class="p">)</span>
</span><span id="__span-0-196">
</span><span id="__span-0-197"> <span class="n">input_guardrail_results</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">InputGuardrailResult</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
</span><span id="__span-0-198">
</span><span id="__span-0-199"> <span class="n">current_span</span><span class="p">:</span> <span class="n">Span</span><span class="p">[</span><span class="n">AgentSpanData</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-200"> <span class="n">current_agent</span> <span class="o">=</span> <span class="n">starting_agent</span>
</span><span id="__span-0-201"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-202">
</span><span id="__span-0-203"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-204"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span><span id="__span-0-205"> <span class="c1"># Start an agent span if we don&#39;t have one. This span is ended if the current</span>
</span><span id="__span-0-206"> <span class="c1"># agent changes, or if the agent loop ends.</span>
</span><span id="__span-0-207"> <span class="k">if</span> <span class="n">current_span</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-208"> <span class="n">handoff_names</span> <span class="o">=</span> <span class="p">[</span><span class="n">h</span><span class="o">.</span><span class="n">agent_name</span> <span class="k">for</span> <span class="n">h</span> <span class="ow">in</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_handoffs</span><span class="p">(</span><span class="n">current_agent</span><span class="p">)]</span>
</span><span id="__span-0-209"> <span class="k">if</span> <span class="n">output_schema</span> <span class="o">:=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_output_schema</span><span class="p">(</span><span class="n">current_agent</span><span class="p">):</span>
</span><span id="__span-0-210"> <span class="n">output_type_name</span> <span class="o">=</span> <span class="n">output_schema</span><span class="o">.</span><span class="n">output_type_name</span><span class="p">()</span>
</span><span id="__span-0-211"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-212"> <span class="n">output_type_name</span> <span class="o">=</span> <span class="s2">&quot;str&quot;</span>
</span><span id="__span-0-213">
</span><span id="__span-0-214"> <span class="n">current_span</span> <span class="o">=</span> <span class="n">agent_span</span><span class="p">(</span>
</span><span id="__span-0-215"> <span class="n">name</span><span class="o">=</span><span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-216"> <span class="n">handoffs</span><span class="o">=</span><span class="n">handoff_names</span><span class="p">,</span>
</span><span id="__span-0-217"> <span class="n">output_type</span><span class="o">=</span><span class="n">output_type_name</span><span class="p">,</span>
</span><span id="__span-0-218"> <span class="p">)</span>
</span><span id="__span-0-219"> <span class="n">current_span</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">mark_as_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-220">
</span><span id="__span-0-221"> <span class="n">all_tools</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_all_tools</span><span class="p">(</span><span class="n">current_agent</span><span class="p">)</span>
</span><span id="__span-0-222"> <span class="n">current_span</span><span class="o">.</span><span class="n">span_data</span><span class="o">.</span><span class="n">tools</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span><span class="o">.</span><span class="n">name</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">all_tools</span><span class="p">]</span>
</span><span id="__span-0-223">
</span><span id="__span-0-224"> <span class="n">current_turn</span> <span class="o">+=</span> <span class="mi">1</span>
</span><span id="__span-0-225">
</span><span id="__span-0-226"> <span class="c1"># Run registered loop hooks (extensions, pricing, etc.)</span>
</span><span id="__span-0-227"> <span class="k">for</span> <span class="n">loop_hook</span> <span class="ow">in</span> <span class="n">DEFAULT_LOOP_HOOKS</span><span class="p">:</span>
</span><span id="__span-0-228"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-229"> <span class="k">await</span> <span class="n">loop_hook</span><span class="o">.</span><span class="n">on_turn_start</span><span class="p">(</span>
</span><span id="__span-0-230"> <span class="n">current_turn</span><span class="p">,</span> <span class="n">context_wrapper</span><span class="p">,</span> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-231"> <span class="p">)</span>
</span><span id="__span-0-232"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-233"> <span class="k">pass</span> <span class="c1"># Hooks must not break the agent loop</span>
</span><span id="__span-0-234">
</span><span id="__span-0-235"> <span class="k">if</span> <span class="n">current_turn</span> <span class="o">&gt;</span> <span class="n">max_turns</span><span class="p">:</span>
</span><span id="__span-0-236"> <span class="n">_error_tracing</span><span class="o">.</span><span class="n">attach_error_to_span</span><span class="p">(</span>
</span><span id="__span-0-237"> <span class="n">current_span</span><span class="p">,</span>
</span><span id="__span-0-238"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-239"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Max turns exceeded&quot;</span><span class="p">,</span>
</span><span id="__span-0-240"> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;max_turns&quot;</span><span class="p">:</span> <span class="n">max_turns</span><span class="p">},</span>
</span><span id="__span-0-241"> <span class="p">),</span>
</span><span id="__span-0-242"> <span class="p">)</span>
</span><span id="__span-0-243"> <span class="k">raise</span> <span class="n">MaxTurnsExceeded</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Max turns (</span><span class="si">{</span><span class="n">max_turns</span><span class="si">}</span><span class="s2">) exceeded&quot;</span><span class="p">)</span>
</span><span id="__span-0-244">
</span><span id="__span-0-245"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span>
</span><span id="__span-0-246"> <span class="sa">f</span><span class="s2">&quot;Running agent </span><span class="si">{</span><span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> (turn </span><span class="si">{</span><span class="n">current_turn</span><span class="si">}</span><span class="s2">)&quot;</span><span class="p">,</span>
</span><span id="__span-0-247"> <span class="p">)</span>
</span><span id="__span-0-248">
</span><span id="__span-0-249"> <span class="k">if</span> <span class="n">current_turn</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="__span-0-250"> <span class="n">input_guardrail_results</span><span class="p">,</span> <span class="n">turn_result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">gather</span><span class="p">(</span>
</span><span id="__span-0-251"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_input_guardrails</span><span class="p">(</span>
</span><span id="__span-0-252"> <span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-253"> <span class="n">starting_agent</span><span class="o">.</span><span class="n">input_guardrails</span>
</span><span id="__span-0-254"> <span class="o">+</span> <span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">input_guardrails</span> <span class="ow">or</span> <span class="p">[]),</span>
</span><span id="__span-0-255"> <span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="nb">input</span><span class="p">),</span>
</span><span id="__span-0-256"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-257"> <span class="p">),</span>
</span><span id="__span-0-258"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_single_turn</span><span class="p">(</span>
</span><span id="__span-0-259"> <span class="n">agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-260"> <span class="n">all_tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-261"> <span class="n">original_input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-262"> <span class="n">generated_items</span><span class="o">=</span><span class="n">generated_items</span><span class="p">,</span>
</span><span id="__span-0-263"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-264"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-265"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-266"> <span class="n">should_run_agent_start_hooks</span><span class="o">=</span><span class="n">should_run_agent_start_hooks</span><span class="p">,</span>
</span><span id="__span-0-267"> <span class="n">tool_use_tracker</span><span class="o">=</span><span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-268"> <span class="p">),</span>
</span><span id="__span-0-269"> <span class="p">)</span>
</span><span id="__span-0-270"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-271"> <span class="n">turn_result</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_single_turn</span><span class="p">(</span>
</span><span id="__span-0-272"> <span class="n">agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-273"> <span class="n">all_tools</span><span class="o">=</span><span class="n">all_tools</span><span class="p">,</span>
</span><span id="__span-0-274"> <span class="n">original_input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-275"> <span class="n">generated_items</span><span class="o">=</span><span class="n">generated_items</span><span class="p">,</span>
</span><span id="__span-0-276"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-277"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-278"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-279"> <span class="n">should_run_agent_start_hooks</span><span class="o">=</span><span class="n">should_run_agent_start_hooks</span><span class="p">,</span>
</span><span id="__span-0-280"> <span class="n">tool_use_tracker</span><span class="o">=</span><span class="n">tool_use_tracker</span><span class="p">,</span>
</span><span id="__span-0-281"> <span class="p">)</span>
</span><span id="__span-0-282"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="__span-0-283">
</span><span id="__span-0-284"> <span class="n">model_responses</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">model_response</span><span class="p">)</span>
</span><span id="__span-0-285"> <span class="n">original_input</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">original_input</span>
</span><span id="__span-0-286"> <span class="n">generated_items</span> <span class="o">=</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">generated_items</span>
</span><span id="__span-0-287">
</span><span id="__span-0-288"> <span class="c1"># Run on_turn_end hooks and check should_continue</span>
</span><span id="__span-0-289"> <span class="k">for</span> <span class="n">loop_hook</span> <span class="ow">in</span> <span class="n">DEFAULT_LOOP_HOOKS</span><span class="p">:</span>
</span><span id="__span-0-290"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-291"> <span class="kn">from</span><span class="w"> </span><span class="nn">.hooks</span><span class="w"> </span><span class="kn">import</span> <span class="n">TurnResult</span> <span class="k">as</span> <span class="n">_TurnResult</span>
</span><span id="__span-0-292">
</span><span id="__span-0-293"> <span class="k">await</span> <span class="n">loop_hook</span><span class="o">.</span><span class="n">on_turn_end</span><span class="p">(</span>
</span><span id="__span-0-294"> <span class="n">current_turn</span><span class="p">,</span>
</span><span id="__span-0-295"> <span class="n">_TurnResult</span><span class="p">(</span>
</span><span id="__span-0-296"> <span class="n">turn</span><span class="o">=</span><span class="n">current_turn</span><span class="p">,</span>
</span><span id="__span-0-297"> <span class="n">agent_name</span><span class="o">=</span><span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-298"> <span class="n">generated_items_count</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">generated_items</span><span class="p">),</span>
</span><span id="__span-0-299"> <span class="p">),</span>
</span><span id="__span-0-300"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-301"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-302"> <span class="p">)</span>
</span><span id="__span-0-303"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-304"> <span class="k">pass</span>
</span><span id="__span-0-305"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-306"> <span class="k">if</span> <span class="ow">not</span> <span class="k">await</span> <span class="n">loop_hook</span><span class="o">.</span><span class="n">should_continue</span><span class="p">(</span>
</span><span id="__span-0-307"> <span class="n">current_turn</span><span class="p">,</span> <span class="n">context_wrapper</span><span class="p">,</span> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-308"> <span class="p">):</span>
</span><span id="__span-0-309"> <span class="c1"># Hook requested early termination</span>
</span><span id="__span-0-310"> <span class="k">break</span>
</span><span id="__span-0-311"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
</span><span id="__span-0-312"> <span class="k">pass</span>
</span><span id="__span-0-313">
</span><span id="__span-0-314"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepFinalOutput</span><span class="p">):</span>
</span><span id="__span-0-315"> <span class="n">output_guardrail_results</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_output_guardrails</span><span class="p">(</span>
</span><span id="__span-0-316"> <span class="n">current_agent</span><span class="o">.</span><span class="n">output_guardrails</span> <span class="o">+</span> <span class="p">(</span><span class="n">run_config</span><span class="o">.</span><span class="n">output_guardrails</span> <span class="ow">or</span> <span class="p">[]),</span>
</span><span id="__span-0-317"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-318"> <span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">output</span><span class="p">,</span>
</span><span id="__span-0-319"> <span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-320"> <span class="p">)</span>
</span><span id="__span-0-321"> <span class="k">return</span> <span class="n">RunResult</span><span class="p">(</span>
</span><span id="__span-0-322"> <span class="nb">input</span><span class="o">=</span><span class="n">original_input</span><span class="p">,</span>
</span><span id="__span-0-323"> <span class="n">new_items</span><span class="o">=</span><span class="n">generated_items</span><span class="p">,</span>
</span><span id="__span-0-324"> <span class="n">raw_responses</span><span class="o">=</span><span class="n">model_responses</span><span class="p">,</span>
</span><span id="__span-0-325"> <span class="n">final_output</span><span class="o">=</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">output</span><span class="p">,</span>
</span><span id="__span-0-326"> <span class="n">_last_agent</span><span class="o">=</span><span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-327"> <span class="n">input_guardrail_results</span><span class="o">=</span><span class="n">input_guardrail_results</span><span class="p">,</span>
</span><span id="__span-0-328"> <span class="n">output_guardrail_results</span><span class="o">=</span><span class="n">output_guardrail_results</span><span class="p">,</span>
</span><span id="__span-0-329"> <span class="p">)</span>
</span><span id="__span-0-330"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepHandoff</span><span class="p">):</span>
</span><span id="__span-0-331"> <span class="c1"># Get the previous agent before switching</span>
</span><span id="__span-0-332"> <span class="n">previous_agent</span> <span class="o">=</span> <span class="n">current_agent</span>
</span><span id="__span-0-333"> <span class="n">current_agent</span> <span class="o">=</span> <span class="n">cast</span><span class="p">(</span><span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span> <span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="o">.</span><span class="n">new_agent</span><span class="p">)</span>
</span><span id="__span-0-334">
</span><span id="__span-0-335"> <span class="c1"># Transfer message history for swarm patterns</span>
</span><span id="__span-0-336"> <span class="c1"># Check if both agents have models with message_history</span>
</span><span id="__span-0-337"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-338"> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
</span><span id="__span-0-339"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;message_history&quot;</span><span class="p">)</span>
</span><span id="__span-0-340"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">)</span>
</span><span id="__span-0-341"> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;message_history&quot;</span><span class="p">)</span>
</span><span id="__span-0-342"> <span class="p">):</span>
</span><span id="__span-0-343"> <span class="c1"># Import the is_swarm_pattern function from patterns utils</span>
</span><span id="__span-0-344"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-345"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.agents.patterns.utils</span><span class="w"> </span><span class="kn">import</span> <span class="n">is_swarm_pattern</span>
</span><span id="__span-0-346">
</span><span id="__span-0-347"> <span class="c1"># Check if either agent is part of a swarm pattern</span>
</span><span id="__span-0-348"> <span class="k">if</span> <span class="n">is_swarm_pattern</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">)</span> <span class="ow">or</span> <span class="n">is_swarm_pattern</span><span class="p">(</span>
</span><span id="__span-0-349"> <span class="n">current_agent</span>
</span><span id="__span-0-350"> <span class="p">):</span>
</span><span id="__span-0-351"> <span class="c1"># Transfer the message history to the new agent</span>
</span><span id="__span-0-352"> <span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-353"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span>
</span><span id="__span-0-354"> <span class="p">)</span>
</span><span id="__span-0-355"> <span class="c1"># Also share history in AGENT_MANAGER</span>
</span><span id="__span-0-356"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">previous_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">hasattr</span><span class="p">(</span>
</span><span id="__span-0-357"> <span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span>
</span><span id="__span-0-358"> <span class="p">):</span>
</span><span id="__span-0-359"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.sdk.agents.simple_agent_manager</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
</span><span id="__span-0-360"> <span class="n">AGENT_MANAGER</span><span class="p">,</span>
</span><span id="__span-0-361"> <span class="p">)</span>
</span><span id="__span-0-362">
</span><span id="__span-0-363"> <span class="n">AGENT_MANAGER</span><span class="o">.</span><span class="n">share_swarm_history</span><span class="p">(</span>
</span><span id="__span-0-364"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">name</span>
</span><span id="__span-0-365"> <span class="p">)</span>
</span><span id="__span-0-366"> <span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
</span><span id="__span-0-367"> <span class="c1"># If we can&#39;t import, check if agents have bidirectional handoffs</span>
</span><span id="__span-0-368"> <span class="c1"># by looking if the new agent can handoff back to the previous agent</span>
</span><span id="__span-0-369"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;handoffs&quot;</span><span class="p">):</span>
</span><span id="__span-0-370"> <span class="k">for</span> <span class="n">handoff_item</span> <span class="ow">in</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">handoffs</span><span class="p">:</span>
</span><span id="__span-0-371"> <span class="k">if</span> <span class="p">(</span>
</span><span id="__span-0-372"> <span class="nb">hasattr</span><span class="p">(</span><span class="n">handoff_item</span><span class="p">,</span> <span class="s2">&quot;agent_name&quot;</span><span class="p">)</span>
</span><span id="__span-0-373"> <span class="ow">and</span> <span class="n">handoff_item</span><span class="o">.</span><span class="n">agent_name</span> <span class="o">==</span> <span class="n">previous_agent</span><span class="o">.</span><span class="n">name</span>
</span><span id="__span-0-374"> <span class="p">):</span>
</span><span id="__span-0-375"> <span class="c1"># Bidirectional handoff detected, share history</span>
</span><span id="__span-0-376"> <span class="n">current_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-377"> <span class="n">previous_agent</span><span class="o">.</span><span class="n">model</span><span class="o">.</span><span class="n">message_history</span>
</span><span id="__span-0-378"> <span class="p">)</span>
</span><span id="__span-0-379"> <span class="k">break</span>
</span><span id="__span-0-380">
</span><span id="__span-0-381"> <span class="c1"># Register the handoff agent with AGENT_MANAGER for tracking</span>
</span><span id="__span-0-382"> <span class="c1"># This ensures patterns/swarms work with commands like /history and /graph</span>
</span><span id="__span-0-383"> <span class="kn">from</span><span class="w"> </span><span class="nn">cai.sdk.agents.simple_agent_manager</span><span class="w"> </span><span class="kn">import</span> <span class="n">AGENT_MANAGER</span>
</span><span id="__span-0-384">
</span><span id="__span-0-385"> <span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;name&quot;</span><span class="p">):</span>
</span><span id="__span-0-386"> <span class="c1"># Preserve terminal-specific identity in TUI mode to avoid phantom agents</span>
</span><span id="__span-0-387"> <span class="n">agent_id_override</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-388"> <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">getenv</span><span class="p">(</span><span class="s2">&quot;CAI_TUI_MODE&quot;</span><span class="p">)</span> <span class="o">==</span> <span class="s2">&quot;true&quot;</span><span class="p">:</span>
</span><span id="__span-0-389"> <span class="n">model</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="s2">&quot;model&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="__span-0-390"> <span class="n">agent_id_override</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="s2">&quot;agent_id&quot;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
</span><span id="__span-0-391">
</span><span id="__span-0-392"> <span class="k">if</span> <span class="n">agent_id_override</span><span class="p">:</span>
</span><span id="__span-0-393"> <span class="n">AGENT_MANAGER</span><span class="o">.</span><span class="n">set_active_agent</span><span class="p">(</span>
</span><span id="__span-0-394"> <span class="n">current_agent</span><span class="p">,</span>
</span><span id="__span-0-395"> <span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-396"> <span class="n">agent_id</span><span class="o">=</span><span class="n">agent_id_override</span><span class="p">,</span>
</span><span id="__span-0-397"> <span class="p">)</span>
</span><span id="__span-0-398"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-399"> <span class="c1"># Fallback to legacy behaviour outside the TUI</span>
</span><span id="__span-0-400"> <span class="n">AGENT_MANAGER</span><span class="o">.</span><span class="n">set_active_agent</span><span class="p">(</span><span class="n">current_agent</span><span class="p">,</span> <span class="n">current_agent</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
</span><span id="__span-0-401">
</span><span id="__span-0-402"> <span class="n">current_span</span><span class="o">.</span><span class="n">finish</span><span class="p">(</span><span class="n">reset_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-403"> <span class="n">current_span</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-404"> <span class="n">should_run_agent_start_hooks</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-405"> <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">,</span> <span class="n">NextStepRunAgain</span><span class="p">):</span>
</span><span id="__span-0-406"> <span class="k">pass</span>
</span><span id="__span-0-407"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-408"> <span class="k">raise</span> <span class="n">AgentsException</span><span class="p">(</span>
</span><span id="__span-0-409"> <span class="sa">f</span><span class="s2">&quot;Unknown next step type: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">turn_result</span><span class="o">.</span><span class="n">next_step</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="__span-0-410"> <span class="p">)</span>
</span><span id="__span-0-411"> <span class="k">finally</span><span class="p">:</span>
</span><span id="__span-0-412"> <span class="k">if</span> <span class="n">current_span</span><span class="p">:</span>
</span><span id="__span-0-413"> <span class="n">current_span</span><span class="o">.</span><span class="n">finish</span><span class="p">(</span><span class="n">reset_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.run.Runner.run_sync" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">run_sync</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">run_sync</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="Agent
dataclass
(cai.sdk.agents.agent.Agent)" href="../agent/#cai.sdk.agents.agent.Agent">Agent</a></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span><span class="p">],</span>
</span><span id="__span-0-3"> <span class="nb">input</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="TResponseInputItem
module-attribute
(cai.sdk.agents.items.TResponseInputItem)" href="../items/#cai.sdk.agents.items.TResponseInputItem">TResponseInputItem</a></span><span class="p">],</span>
</span><span id="__span-0-4"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-5"> <span class="n">context</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-6"> <span class="n">max_turns</span><span class="p">:</span> <span class="n"><span title="int">int</span></span> <span class="o">=</span> <span class="n"><span title="cai.sdk.agents.run.DEFAULT_MAX_TURNS">DEFAULT_MAX_TURNS</span></span><span class="p">,</span>
</span><span id="__span-0-7"> <span class="n">hooks</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="RunHooks (cai.sdk.agents.lifecycle.RunHooks)" href="../lifecycle/#cai.sdk.agents.lifecycle.RunHooks">RunHooks</a></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"> <span class="n">run_config</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="RunConfig
dataclass
(cai.sdk.agents.run.RunConfig)" href="#cai.sdk.agents.run.RunConfig">RunConfig</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-9"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="RunResult
dataclass
(cai.sdk.agents.result.RunResult)" href="../result/#cai.sdk.agents.result.RunResult">RunResult</a></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Run a workflow synchronously, starting at the given agent. Note that this just wraps the
<code>run</code> method, so it will not work if there's already an event loop (e.g. inside an async
function, or in a Jupyter notebook or async context like FastAPI). For those cases, use
the <code>run</code> method instead.</p>
<p>The agent will run in a loop until a final output is generated. The loop runs like so:
1. The agent is invoked with the given input.
2. If there is a final output (i.e. the agent produces something of type
<code>agent.output_type</code>, the loop terminates.
3. If there's a handoff, we run the loop again, with the new agent.
4. Else, we run tool calls (if any), and re-run the loop.</p>
<p>In two cases, the agent may raise an exception:
1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.
2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</p>
<p>Note that only the first agent's input guardrails are run.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>starting_agent</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="Agent
dataclass
(cai.sdk.agents.agent.Agent)" href="../agent/#cai.sdk.agents.agent.Agent">Agent</a>[<span title="cai.sdk.agents.run_context.TContext">TContext</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The starting agent to run.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>input</code>
</td>
<td>
<code><span title="str">str</span> | <a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a>[<a class="autorefs autorefs-internal" title="TResponseInputItem
module-attribute
(cai.sdk.agents.items.TResponseInputItem)" href="../items/#cai.sdk.agents.items.TResponseInputItem">TResponseInputItem</a>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The initial input to the agent. You can pass a single string for a user message,
or a list of input items.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>context</code>
</td>
<td>
<code><span title="cai.sdk.agents.run_context.TContext">TContext</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>The context to run the agent with.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>max_turns</code>
</td>
<td>
<code><span title="int">int</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The maximum number of turns to run the agent for. A turn is defined as one
AI invocation (including any tool calls that might occur).</p>
</div>
</td>
<td>
<code><span title="cai.sdk.agents.run.DEFAULT_MAX_TURNS">DEFAULT_MAX_TURNS</span></code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>hooks</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="RunHooks (cai.sdk.agents.lifecycle.RunHooks)" href="../lifecycle/#cai.sdk.agents.lifecycle.RunHooks">RunHooks</a>[<span title="cai.sdk.agents.run_context.TContext">TContext</span>] | None</code>
</td>
<td>
<div class="doc-md-description">
<p>An object that receives callbacks on various lifecycle events.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>run_config</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="RunConfig
dataclass
(cai.sdk.agents.run.RunConfig)" href="#cai.sdk.agents.run.RunConfig">RunConfig</a> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Global settings for the entire agent run.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="RunResult
dataclass
(cai.sdk.agents.result.RunResult)" href="../result/#cai.sdk.agents.result.RunResult">RunResult</a></code>
</td>
<td>
<div class="doc-md-description">
<p>A run result containing all the inputs, guardrail results and the output of the last</p>
</div>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="RunResult
dataclass
(cai.sdk.agents.result.RunResult)" href="../result/#cai.sdk.agents.result.RunResult">RunResult</a></code>
</td>
<td>
<div class="doc-md-description">
<p>agent. Agents may perform handoffs, so we don't know the specific type of the output.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/run.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">415</span>
<span class="normal">416</span>
<span class="normal">417</span>
<span class="normal">418</span>
<span class="normal">419</span>
<span class="normal">420</span>
<span class="normal">421</span>
<span class="normal">422</span>
<span class="normal">423</span>
<span class="normal">424</span>
<span class="normal">425</span>
<span class="normal">426</span>
<span class="normal">427</span>
<span class="normal">428</span>
<span class="normal">429</span>
<span class="normal">430</span>
<span class="normal">431</span>
<span class="normal">432</span>
<span class="normal">433</span>
<span class="normal">434</span>
<span class="normal">435</span>
<span class="normal">436</span>
<span class="normal">437</span>
<span class="normal">438</span>
<span class="normal">439</span>
<span class="normal">440</span>
<span class="normal">441</span>
<span class="normal">442</span>
<span class="normal">443</span>
<span class="normal">444</span>
<span class="normal">445</span>
<span class="normal">446</span>
<span class="normal">447</span>
<span class="normal">448</span>
<span class="normal">449</span>
<span class="normal">450</span>
<span class="normal">451</span>
<span class="normal">452</span>
<span class="normal">453</span>
<span class="normal">454</span>
<span class="normal">455</span>
<span class="normal">456</span>
<span class="normal">457</span>
<span class="normal">458</span>
<span class="normal">459</span>
<span class="normal">460</span>
<span class="normal">461</span>
<span class="normal">462</span>
<span class="normal">463</span>
<span class="normal">464</span>
<span class="normal">465</span>
<span class="normal">466</span>
<span class="normal">467</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-415"><span class="nd">@classmethod</span>
</span><span id="__span-0-416"><span class="k">def</span><span class="w"> </span><span class="nf">run_sync</span><span class="p">(</span>
</span><span id="__span-0-417"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-418"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-419"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-420"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-421"> <span class="n">context</span><span class="p">:</span> <span class="n">TContext</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-422"> <span class="n">max_turns</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">DEFAULT_MAX_TURNS</span><span class="p">,</span>
</span><span id="__span-0-423"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-424"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-425"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RunResult</span><span class="p">:</span>
</span><span id="__span-0-426"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a workflow synchronously, starting at the given agent. Note that this just wraps the</span>
</span><span id="__span-0-427"><span class="sd"> `run` method, so it will not work if there&#39;s already an event loop (e.g. inside an async</span>
</span><span id="__span-0-428"><span class="sd"> function, or in a Jupyter notebook or async context like FastAPI). For those cases, use</span>
</span><span id="__span-0-429"><span class="sd"> the `run` method instead.</span>
</span><span id="__span-0-430">
</span><span id="__span-0-431"><span class="sd"> The agent will run in a loop until a final output is generated. The loop runs like so:</span>
</span><span id="__span-0-432"><span class="sd"> 1. The agent is invoked with the given input.</span>
</span><span id="__span-0-433"><span class="sd"> 2. If there is a final output (i.e. the agent produces something of type</span>
</span><span id="__span-0-434"><span class="sd"> `agent.output_type`, the loop terminates.</span>
</span><span id="__span-0-435"><span class="sd"> 3. If there&#39;s a handoff, we run the loop again, with the new agent.</span>
</span><span id="__span-0-436"><span class="sd"> 4. Else, we run tool calls (if any), and re-run the loop.</span>
</span><span id="__span-0-437">
</span><span id="__span-0-438"><span class="sd"> In two cases, the agent may raise an exception:</span>
</span><span id="__span-0-439"><span class="sd"> 1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.</span>
</span><span id="__span-0-440"><span class="sd"> 2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</span>
</span><span id="__span-0-441">
</span><span id="__span-0-442"><span class="sd"> Note that only the first agent&#39;s input guardrails are run.</span>
</span><span id="__span-0-443">
</span><span id="__span-0-444"><span class="sd"> Args:</span>
</span><span id="__span-0-445"><span class="sd"> starting_agent: The starting agent to run.</span>
</span><span id="__span-0-446"><span class="sd"> input: The initial input to the agent. You can pass a single string for a user message,</span>
</span><span id="__span-0-447"><span class="sd"> or a list of input items.</span>
</span><span id="__span-0-448"><span class="sd"> context: The context to run the agent with.</span>
</span><span id="__span-0-449"><span class="sd"> max_turns: The maximum number of turns to run the agent for. A turn is defined as one</span>
</span><span id="__span-0-450"><span class="sd"> AI invocation (including any tool calls that might occur).</span>
</span><span id="__span-0-451"><span class="sd"> hooks: An object that receives callbacks on various lifecycle events.</span>
</span><span id="__span-0-452"><span class="sd"> run_config: Global settings for the entire agent run.</span>
</span><span id="__span-0-453">
</span><span id="__span-0-454"><span class="sd"> Returns:</span>
</span><span id="__span-0-455"><span class="sd"> A run result containing all the inputs, guardrail results and the output of the last</span>
</span><span id="__span-0-456"><span class="sd"> agent. Agents may perform handoffs, so we don&#39;t know the specific type of the output.</span>
</span><span id="__span-0-457"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-458"> <span class="k">return</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span><span class="o">.</span><span class="n">run_until_complete</span><span class="p">(</span>
</span><span id="__span-0-459"> <span class="bp">cls</span><span class="o">.</span><span class="n">run</span><span class="p">(</span>
</span><span id="__span-0-460"> <span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-461"> <span class="nb">input</span><span class="p">,</span>
</span><span id="__span-0-462"> <span class="n">context</span><span class="o">=</span><span class="n">context</span><span class="p">,</span>
</span><span id="__span-0-463"> <span class="n">max_turns</span><span class="o">=</span><span class="n">max_turns</span><span class="p">,</span>
</span><span id="__span-0-464"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-465"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-466"> <span class="p">)</span>
</span><span id="__span-0-467"> <span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
<div class="doc doc-object doc-function">
<h4 id="cai.sdk.agents.run.Runner.run_streamed" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">run_streamed</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-classmethod"><code>classmethod</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">run_streamed</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="Agent
dataclass
(cai.sdk.agents.agent.Agent)" href="../agent/#cai.sdk.agents.agent.Agent">Agent</a></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span><span class="p">],</span>
</span><span id="__span-0-3"> <span class="nb">input</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="TResponseInputItem
module-attribute
(cai.sdk.agents.items.TResponseInputItem)" href="../items/#cai.sdk.agents.items.TResponseInputItem">TResponseInputItem</a></span><span class="p">],</span>
</span><span id="__span-0-4"> <span class="n">context</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-5"> <span class="n">max_turns</span><span class="p">:</span> <span class="n"><span title="int">int</span></span> <span class="o">=</span> <span class="n"><span title="cai.sdk.agents.run.DEFAULT_MAX_TURNS">DEFAULT_MAX_TURNS</span></span><span class="p">,</span>
</span><span id="__span-0-6"> <span class="n">hooks</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="RunHooks (cai.sdk.agents.lifecycle.RunHooks)" href="../lifecycle/#cai.sdk.agents.lifecycle.RunHooks">RunHooks</a></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.run_context.TContext">TContext</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-7"> <span class="n">run_config</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="RunConfig
dataclass
(cai.sdk.agents.run.RunConfig)" href="#cai.sdk.agents.run.RunConfig">RunConfig</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-8"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="RunResultStreaming
dataclass
(cai.sdk.agents.result.RunResultStreaming)" href="../result/#cai.sdk.agents.result.RunResultStreaming">RunResultStreaming</a></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Run a workflow starting at the given agent in streaming mode. The returned result object
contains a method you can use to stream semantic events as they are generated.</p>
<p>The agent will run in a loop until a final output is generated. The loop runs like so:
1. The agent is invoked with the given input.
2. If there is a final output (i.e. the agent produces something of type
<code>agent.output_type</code>, the loop terminates.
3. If there's a handoff, we run the loop again, with the new agent.
4. Else, we run tool calls (if any), and re-run the loop.</p>
<p>In two cases, the agent may raise an exception:
1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.
2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</p>
<p>Note that only the first agent's input guardrails are run.</p>
<p><span class="doc-section-title">Parameters:</span></p>
<table>
<thead>
<tr>
<th>Name</th>
<th>Type</th>
<th>Description</th>
<th>Default</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code>starting_agent</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="Agent
dataclass
(cai.sdk.agents.agent.Agent)" href="../agent/#cai.sdk.agents.agent.Agent">Agent</a>[<span title="cai.sdk.agents.run_context.TContext">TContext</span>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The starting agent to run.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>input</code>
</td>
<td>
<code><span title="str">str</span> | <a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a>[<a class="autorefs autorefs-internal" title="TResponseInputItem
module-attribute
(cai.sdk.agents.items.TResponseInputItem)" href="../items/#cai.sdk.agents.items.TResponseInputItem">TResponseInputItem</a>]</code>
</td>
<td>
<div class="doc-md-description">
<p>The initial input to the agent. You can pass a single string for a user message,
or a list of input items.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>context</code>
</td>
<td>
<code><span title="cai.sdk.agents.run_context.TContext">TContext</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>The context to run the agent with.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>max_turns</code>
</td>
<td>
<code><span title="int">int</span></code>
</td>
<td>
<div class="doc-md-description">
<p>The maximum number of turns to run the agent for. A turn is defined as one
AI invocation (including any tool calls that might occur).</p>
</div>
</td>
<td>
<code><span title="cai.sdk.agents.run.DEFAULT_MAX_TURNS">DEFAULT_MAX_TURNS</span></code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>hooks</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="RunHooks (cai.sdk.agents.lifecycle.RunHooks)" href="../lifecycle/#cai.sdk.agents.lifecycle.RunHooks">RunHooks</a>[<span title="cai.sdk.agents.run_context.TContext">TContext</span>] | None</code>
</td>
<td>
<div class="doc-md-description">
<p>An object that receives callbacks on various lifecycle events.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>run_config</code>
</td>
<td>
<code><a class="autorefs autorefs-internal" title="RunConfig
dataclass
(cai.sdk.agents.run.RunConfig)" href="#cai.sdk.agents.run.RunConfig">RunConfig</a> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Global settings for the entire agent run.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<p><span class="doc-section-title">Returns:</span></p>
<table>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="doc-section-item">
<td>
<code><a class="autorefs autorefs-internal" title="RunResultStreaming
dataclass
(cai.sdk.agents.result.RunResultStreaming)" href="../result/#cai.sdk.agents.result.RunResultStreaming">RunResultStreaming</a></code>
</td>
<td>
<div class="doc-md-description">
<p>A result object that contains data about the run, as well as a method to stream events.</p>
</div>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/run.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">469</span>
<span class="normal">470</span>
<span class="normal">471</span>
<span class="normal">472</span>
<span class="normal">473</span>
<span class="normal">474</span>
<span class="normal">475</span>
<span class="normal">476</span>
<span class="normal">477</span>
<span class="normal">478</span>
<span class="normal">479</span>
<span class="normal">480</span>
<span class="normal">481</span>
<span class="normal">482</span>
<span class="normal">483</span>
<span class="normal">484</span>
<span class="normal">485</span>
<span class="normal">486</span>
<span class="normal">487</span>
<span class="normal">488</span>
<span class="normal">489</span>
<span class="normal">490</span>
<span class="normal">491</span>
<span class="normal">492</span>
<span class="normal">493</span>
<span class="normal">494</span>
<span class="normal">495</span>
<span class="normal">496</span>
<span class="normal">497</span>
<span class="normal">498</span>
<span class="normal">499</span>
<span class="normal">500</span>
<span class="normal">501</span>
<span class="normal">502</span>
<span class="normal">503</span>
<span class="normal">504</span>
<span class="normal">505</span>
<span class="normal">506</span>
<span class="normal">507</span>
<span class="normal">508</span>
<span class="normal">509</span>
<span class="normal">510</span>
<span class="normal">511</span>
<span class="normal">512</span>
<span class="normal">513</span>
<span class="normal">514</span>
<span class="normal">515</span>
<span class="normal">516</span>
<span class="normal">517</span>
<span class="normal">518</span>
<span class="normal">519</span>
<span class="normal">520</span>
<span class="normal">521</span>
<span class="normal">522</span>
<span class="normal">523</span>
<span class="normal">524</span>
<span class="normal">525</span>
<span class="normal">526</span>
<span class="normal">527</span>
<span class="normal">528</span>
<span class="normal">529</span>
<span class="normal">530</span>
<span class="normal">531</span>
<span class="normal">532</span>
<span class="normal">533</span>
<span class="normal">534</span>
<span class="normal">535</span>
<span class="normal">536</span>
<span class="normal">537</span>
<span class="normal">538</span>
<span class="normal">539</span>
<span class="normal">540</span>
<span class="normal">541</span>
<span class="normal">542</span>
<span class="normal">543</span>
<span class="normal">544</span>
<span class="normal">545</span>
<span class="normal">546</span>
<span class="normal">547</span>
<span class="normal">548</span>
<span class="normal">549</span>
<span class="normal">550</span>
<span class="normal">551</span>
<span class="normal">552</span>
<span class="normal">553</span>
<span class="normal">554</span>
<span class="normal">555</span>
<span class="normal">556</span>
<span class="normal">557</span>
<span class="normal">558</span>
<span class="normal">559</span>
<span class="normal">560</span>
<span class="normal">561</span>
<span class="normal">562</span>
<span class="normal">563</span>
<span class="normal">564</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-469"><span class="nd">@classmethod</span>
</span><span id="__span-0-470"><span class="k">def</span><span class="w"> </span><span class="nf">run_streamed</span><span class="p">(</span>
</span><span id="__span-0-471"> <span class="bp">cls</span><span class="p">,</span>
</span><span id="__span-0-472"> <span class="n">starting_agent</span><span class="p">:</span> <span class="n">Agent</span><span class="p">[</span><span class="n">TContext</span><span class="p">],</span>
</span><span id="__span-0-473"> <span class="nb">input</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">list</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">],</span>
</span><span id="__span-0-474"> <span class="n">context</span><span class="p">:</span> <span class="n">TContext</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-475"> <span class="n">max_turns</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">DEFAULT_MAX_TURNS</span><span class="p">,</span>
</span><span id="__span-0-476"> <span class="n">hooks</span><span class="p">:</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-477"> <span class="n">run_config</span><span class="p">:</span> <span class="n">RunConfig</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-478"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">RunResultStreaming</span><span class="p">:</span>
</span><span id="__span-0-479"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Run a workflow starting at the given agent in streaming mode. The returned result object</span>
</span><span id="__span-0-480"><span class="sd"> contains a method you can use to stream semantic events as they are generated.</span>
</span><span id="__span-0-481">
</span><span id="__span-0-482"><span class="sd"> The agent will run in a loop until a final output is generated. The loop runs like so:</span>
</span><span id="__span-0-483"><span class="sd"> 1. The agent is invoked with the given input.</span>
</span><span id="__span-0-484"><span class="sd"> 2. If there is a final output (i.e. the agent produces something of type</span>
</span><span id="__span-0-485"><span class="sd"> `agent.output_type`, the loop terminates.</span>
</span><span id="__span-0-486"><span class="sd"> 3. If there&#39;s a handoff, we run the loop again, with the new agent.</span>
</span><span id="__span-0-487"><span class="sd"> 4. Else, we run tool calls (if any), and re-run the loop.</span>
</span><span id="__span-0-488">
</span><span id="__span-0-489"><span class="sd"> In two cases, the agent may raise an exception:</span>
</span><span id="__span-0-490"><span class="sd"> 1. If the max_turns is exceeded, a MaxTurnsExceeded exception is raised.</span>
</span><span id="__span-0-491"><span class="sd"> 2. If a guardrail tripwire is triggered, a GuardrailTripwireTriggered exception is raised.</span>
</span><span id="__span-0-492">
</span><span id="__span-0-493"><span class="sd"> Note that only the first agent&#39;s input guardrails are run.</span>
</span><span id="__span-0-494">
</span><span id="__span-0-495"><span class="sd"> Args:</span>
</span><span id="__span-0-496"><span class="sd"> starting_agent: The starting agent to run.</span>
</span><span id="__span-0-497"><span class="sd"> input: The initial input to the agent. You can pass a single string for a user message,</span>
</span><span id="__span-0-498"><span class="sd"> or a list of input items.</span>
</span><span id="__span-0-499"><span class="sd"> context: The context to run the agent with.</span>
</span><span id="__span-0-500"><span class="sd"> max_turns: The maximum number of turns to run the agent for. A turn is defined as one</span>
</span><span id="__span-0-501"><span class="sd"> AI invocation (including any tool calls that might occur).</span>
</span><span id="__span-0-502"><span class="sd"> hooks: An object that receives callbacks on various lifecycle events.</span>
</span><span id="__span-0-503"><span class="sd"> run_config: Global settings for the entire agent run.</span>
</span><span id="__span-0-504">
</span><span id="__span-0-505"><span class="sd"> Returns:</span>
</span><span id="__span-0-506"><span class="sd"> A result object that contains data about the run, as well as a method to stream events.</span>
</span><span id="__span-0-507"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-508"> <span class="k">if</span> <span class="n">hooks</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-509"> <span class="n">hooks</span> <span class="o">=</span> <span class="n">RunHooks</span><span class="p">[</span><span class="n">Any</span><span class="p">]()</span>
</span><span id="__span-0-510"> <span class="k">if</span> <span class="n">run_config</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-511"> <span class="n">run_config</span> <span class="o">=</span> <span class="n">RunConfig</span><span class="p">()</span>
</span><span id="__span-0-512">
</span><span id="__span-0-513"> <span class="c1"># If there&#39;s already a trace, we don&#39;t create a new one. In addition, we can&#39;t end the</span>
</span><span id="__span-0-514"> <span class="c1"># trace here, because the actual work is done in `stream_events` and this method ends</span>
</span><span id="__span-0-515"> <span class="c1"># before that.</span>
</span><span id="__span-0-516"> <span class="n">new_trace</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-517"> <span class="kc">None</span>
</span><span id="__span-0-518"> <span class="k">if</span> <span class="n">get_current_trace</span><span class="p">()</span>
</span><span id="__span-0-519"> <span class="k">else</span> <span class="n">trace</span><span class="p">(</span>
</span><span id="__span-0-520"> <span class="n">workflow_name</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">workflow_name</span><span class="p">,</span>
</span><span id="__span-0-521"> <span class="n">trace_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_id</span><span class="p">,</span>
</span><span id="__span-0-522"> <span class="n">group_id</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">group_id</span><span class="p">,</span>
</span><span id="__span-0-523"> <span class="n">metadata</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">trace_metadata</span><span class="p">,</span>
</span><span id="__span-0-524"> <span class="n">disabled</span><span class="o">=</span><span class="n">run_config</span><span class="o">.</span><span class="n">tracing_disabled</span><span class="p">,</span>
</span><span id="__span-0-525"> <span class="p">)</span>
</span><span id="__span-0-526"> <span class="p">)</span>
</span><span id="__span-0-527"> <span class="c1"># Need to start the trace here, because the current trace contextvar is captured at</span>
</span><span id="__span-0-528"> <span class="c1"># asyncio.create_task time</span>
</span><span id="__span-0-529"> <span class="k">if</span> <span class="n">new_trace</span><span class="p">:</span>
</span><span id="__span-0-530"> <span class="n">new_trace</span><span class="o">.</span><span class="n">start</span><span class="p">(</span><span class="n">mark_as_current</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-531">
</span><span id="__span-0-532"> <span class="n">output_schema</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_get_output_schema</span><span class="p">(</span><span class="n">starting_agent</span><span class="p">)</span>
</span><span id="__span-0-533"> <span class="n">context_wrapper</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">TContext</span><span class="p">]</span> <span class="o">=</span> <span class="n">RunContextWrapper</span><span class="p">(</span>
</span><span id="__span-0-534"> <span class="n">context</span><span class="o">=</span><span class="n">context</span> <span class="c1"># type: ignore</span>
</span><span id="__span-0-535"> <span class="p">)</span>
</span><span id="__span-0-536">
</span><span id="__span-0-537"> <span class="n">streamed_result</span> <span class="o">=</span> <span class="n">RunResultStreaming</span><span class="p">(</span>
</span><span id="__span-0-538"> <span class="nb">input</span><span class="o">=</span><span class="n">copy</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="nb">input</span><span class="p">),</span>
</span><span id="__span-0-539"> <span class="n">new_items</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-540"> <span class="n">current_agent</span><span class="o">=</span><span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-541"> <span class="n">raw_responses</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-542"> <span class="n">final_output</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
</span><span id="__span-0-543"> <span class="n">is_complete</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-544"> <span class="n">current_turn</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
</span><span id="__span-0-545"> <span class="n">max_turns</span><span class="o">=</span><span class="n">max_turns</span><span class="p">,</span>
</span><span id="__span-0-546"> <span class="n">input_guardrail_results</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-547"> <span class="n">output_guardrail_results</span><span class="o">=</span><span class="p">[],</span>
</span><span id="__span-0-548"> <span class="n">_current_agent_output_schema</span><span class="o">=</span><span class="n">output_schema</span><span class="p">,</span>
</span><span id="__span-0-549"> <span class="n">_trace</span><span class="o">=</span><span class="n">new_trace</span><span class="p">,</span>
</span><span id="__span-0-550"> <span class="p">)</span>
</span><span id="__span-0-551">
</span><span id="__span-0-552"> <span class="c1"># Kick off the actual agent loop in the background and return the streamed result object.</span>
</span><span id="__span-0-553"> <span class="n">streamed_result</span><span class="o">.</span><span class="n">_run_impl_task</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">create_task</span><span class="p">(</span>
</span><span id="__span-0-554"> <span class="bp">cls</span><span class="o">.</span><span class="n">_run_streamed_impl</span><span class="p">(</span>
</span><span id="__span-0-555"> <span class="n">starting_input</span><span class="o">=</span><span class="nb">input</span><span class="p">,</span>
</span><span id="__span-0-556"> <span class="n">streamed_result</span><span class="o">=</span><span class="n">streamed_result</span><span class="p">,</span>
</span><span id="__span-0-557"> <span class="n">starting_agent</span><span class="o">=</span><span class="n">starting_agent</span><span class="p">,</span>
</span><span id="__span-0-558"> <span class="n">max_turns</span><span class="o">=</span><span class="n">max_turns</span><span class="p">,</span>
</span><span id="__span-0-559"> <span class="n">hooks</span><span class="o">=</span><span class="n">hooks</span><span class="p">,</span>
</span><span id="__span-0-560"> <span class="n">context_wrapper</span><span class="o">=</span><span class="n">context_wrapper</span><span class="p">,</span>
</span><span id="__span-0-561"> <span class="n">run_config</span><span class="o">=</span><span class="n">run_config</span><span class="p">,</span>
</span><span id="__span-0-562"> <span class="p">)</span>
</span><span id="__span-0-563"> <span class="p">)</span>
</span><span id="__span-0-564"> <span class="k">return</span> <span class="n">streamed_result</span>
</span></code></pre></div></td></tr></table></div>
</details>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.run.RunConfig" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">RunConfig</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-dataclass"><code>dataclass</code></small>
</span>
</h3>
<div class="doc doc-contents ">
<p>Configures settings for the entire agent run.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/run.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 75</span>
<span class="normal"> 76</span>
<span class="normal"> 77</span>
<span class="normal"> 78</span>
<span class="normal"> 79</span>
<span class="normal"> 80</span>
<span class="normal"> 81</span>
<span class="normal"> 82</span>
<span class="normal"> 83</span>
<span class="normal"> 84</span>
<span class="normal"> 85</span>
<span class="normal"> 86</span>
<span class="normal"> 87</span>
<span class="normal"> 88</span>
<span class="normal"> 89</span>
<span class="normal"> 90</span>
<span class="normal"> 91</span>
<span class="normal"> 92</span>
<span class="normal"> 93</span>
<span class="normal"> 94</span>
<span class="normal"> 95</span>
<span class="normal"> 96</span>
<span class="normal"> 97</span>
<span class="normal"> 98</span>
<span class="normal"> 99</span>
<span class="normal">100</span>
<span class="normal">101</span>
<span class="normal">102</span>
<span class="normal">103</span>
<span class="normal">104</span>
<span class="normal">105</span>
<span class="normal">106</span>
<span class="normal">107</span>
<span class="normal">108</span>
<span class="normal">109</span>
<span class="normal">110</span>
<span class="normal">111</span>
<span class="normal">112</span>
<span class="normal">113</span>
<span class="normal">114</span>
<span class="normal">115</span>
<span class="normal">116</span>
<span class="normal">117</span>
<span class="normal">118</span>
<span class="normal">119</span>
<span class="normal">120</span>
<span class="normal">121</span>
<span class="normal">122</span>
<span class="normal">123</span>
<span class="normal">124</span>
<span class="normal">125</span>
<span class="normal">126</span>
<span class="normal">127</span>
<span class="normal">128</span>
<span class="normal">129</span>
<span class="normal">130</span>
<span class="normal">131</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-75"><span class="nd">@dataclass</span>
</span><span id="__span-0-76"><span class="k">class</span><span class="w"> </span><span class="nc">RunConfig</span><span class="p">:</span>
</span><span id="__span-0-77"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Configures settings for the entire agent run.&quot;&quot;&quot;</span>
</span><span id="__span-0-78">
</span><span id="__span-0-79"> <span class="n">model</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="n">Model</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-80"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The model to use for the entire agent run. If set, will override the model set on every</span>
</span><span id="__span-0-81"><span class="sd"> agent. The model_provider passed in below must be able to resolve this model name.</span>
</span><span id="__span-0-82"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-83">
</span><span id="__span-0-84"> <span class="n">model_provider</span><span class="p">:</span> <span class="n">ModelProvider</span> <span class="o">=</span> <span class="n">field</span><span class="p">(</span><span class="n">default_factory</span><span class="o">=</span><span class="n">OpenAIProvider</span><span class="p">)</span>
</span><span id="__span-0-85"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The model provider to use when looking up string model names. Defaults to OpenAI.&quot;&quot;&quot;</span>
</span><span id="__span-0-86">
</span><span id="__span-0-87"> <span class="n">model_settings</span><span class="p">:</span> <span class="n">ModelSettings</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-88"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Configure global model settings. Any non-null values will override the agent-specific model</span>
</span><span id="__span-0-89"><span class="sd"> settings.</span>
</span><span id="__span-0-90"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-91">
</span><span id="__span-0-92"> <span class="n">handoff_input_filter</span><span class="p">:</span> <span class="n">HandoffInputFilter</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-93"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A global input filter to apply to all handoffs. If `Handoff.input_filter` is set, then that</span>
</span><span id="__span-0-94"><span class="sd"> will take precedence. The input filter allows you to edit the inputs that are sent to the new</span>
</span><span id="__span-0-95"><span class="sd"> agent. See the documentation in `Handoff.input_filter` for more details.</span>
</span><span id="__span-0-96"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-97">
</span><span id="__span-0-98"> <span class="n">input_guardrails</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">InputGuardrail</span><span class="p">[</span><span class="n">Any</span><span class="p">]]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-99"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A list of input guardrails to run on the initial run input.&quot;&quot;&quot;</span>
</span><span id="__span-0-100">
</span><span id="__span-0-101"> <span class="n">output_guardrails</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">OutputGuardrail</span><span class="p">[</span><span class="n">Any</span><span class="p">]]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-102"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A list of output guardrails to run on the final output of the run.&quot;&quot;&quot;</span>
</span><span id="__span-0-103">
</span><span id="__span-0-104"> <span class="n">tracing_disabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
</span><span id="__span-0-105"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Whether tracing is disabled for the agent run. If disabled, we will not trace the agent run.</span>
</span><span id="__span-0-106"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-107">
</span><span id="__span-0-108"> <span class="n">trace_include_sensitive_data</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-109"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Whether we include potentially sensitive data (for example: inputs/outputs of tool calls or</span>
</span><span id="__span-0-110"><span class="sd"> LLM generations) in traces. If False, we&#39;ll still create spans for these events, but the</span>
</span><span id="__span-0-111"><span class="sd"> sensitive data will not be included.</span>
</span><span id="__span-0-112"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-113">
</span><span id="__span-0-114"> <span class="n">workflow_name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;Agent workflow&quot;</span>
</span><span id="__span-0-115"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The name of the run, used for tracing. Should be a logical name for the run, like</span>
</span><span id="__span-0-116"><span class="sd"> &quot;Code generation workflow&quot; or &quot;Customer support agent&quot;.</span>
</span><span id="__span-0-117"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-118">
</span><span id="__span-0-119"> <span class="n">trace_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-120"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A custom trace ID to use for tracing. If not provided, we will generate a new trace ID.&quot;&quot;&quot;</span>
</span><span id="__span-0-121">
</span><span id="__span-0-122"> <span class="n">group_id</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-123"><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="__span-0-124"><span class="sd"> A grouping identifier to use for tracing, to link multiple traces from the same conversation</span>
</span><span id="__span-0-125"><span class="sd"> or process. For example, you might use a chat thread ID.</span>
</span><span id="__span-0-126"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-127">
</span><span id="__span-0-128"> <span class="n">trace_metadata</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-129"><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="__span-0-130"><span class="sd"> An optional dictionary of additional metadata to include with the trace.</span>
</span><span id="__span-0-131"><span class="sd"> &quot;&quot;&quot;</span>
</span></code></pre></div></td></tr></table></div>
</details>
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.model" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">model</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">model</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="n"><a class="autorefs autorefs-internal" title="Model (cai.sdk.agents.models.interface.Model)" href="../models/interface/#cai.sdk.agents.models.interface.Model">Model</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The model to use for the entire agent run. If set, will override the model set on every
agent. The model_provider passed in below must be able to resolve this model name.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.model_provider" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">model_provider</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">model_provider</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="ModelProvider (cai.sdk.agents.models.interface.ModelProvider)" href="../models/interface/#cai.sdk.agents.models.interface.ModelProvider">ModelProvider</a></span> <span class="o">=</span> <span class="n"><span title="dataclasses.field">field</span></span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n"><span title="dataclasses.field(default_factory)">default_factory</span></span><span class="o">=</span><span class="n"><span title="cai.sdk.agents.models.openai_provider.OpenAIProvider">OpenAIProvider</span></span>
</span><span id="__span-0-3"><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The model provider to use when looking up string model names. Defaults to OpenAI.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.model_settings" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">model_settings</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">model_settings</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="ModelSettings
dataclass
(cai.sdk.agents.model_settings.ModelSettings)" href="../model_settings/#cai.sdk.agents.model_settings.ModelSettings">ModelSettings</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Configure global model settings. Any non-null values will override the agent-specific model
settings.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.handoff_input_filter" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">handoff_input_filter</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">handoff_input_filter</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" title="HandoffInputFilter
module-attribute
(cai.sdk.agents.handoffs.HandoffInputFilter)" href="../handoffs/#cai.sdk.agents.handoffs.HandoffInputFilter">HandoffInputFilter</a></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A global input filter to apply to all handoffs. If <code>Handoff.input_filter</code> is set, then that
will take precedence. The input filter allows you to edit the inputs that are sent to the new
agent. See the documentation in <code>Handoff.input_filter</code> for more details.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.input_guardrails" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">input_guardrails</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">input_guardrails</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="InputGuardrail
dataclass
(cai.sdk.agents.guardrail.InputGuardrail)" href="../guardrail/#cai.sdk.agents.guardrail.InputGuardrail">InputGuardrail</a></span><span class="p">[</span><span class="n"><span title="typing.Any">Any</span></span><span class="p">]]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A list of input guardrails to run on the initial run input.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.output_guardrails" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">output_guardrails</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">output_guardrails</span><span class="p">:</span> <span class="n"><a class="autorefs autorefs-internal" href="../../tui/commands_reference/#list">list</a></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="OutputGuardrail
dataclass
(cai.sdk.agents.guardrail.OutputGuardrail)" href="../guardrail/#cai.sdk.agents.guardrail.OutputGuardrail">OutputGuardrail</a></span><span class="p">[</span><span class="n"><span title="typing.Any">Any</span></span><span class="p">]]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A list of output guardrails to run on the final output of the run.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.tracing_disabled" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">tracing_disabled</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">tracing_disabled</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">False</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether tracing is disabled for the agent run. If disabled, we will not trace the agent run.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.trace_include_sensitive_data" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">trace_include_sensitive_data</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">trace_include_sensitive_data</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether we include potentially sensitive data (for example: inputs/outputs of tool calls or
LLM generations) in traces. If False, we'll still create spans for these events, but the
sensitive data will not be included.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.workflow_name" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">workflow_name</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">workflow_name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">=</span> <span class="s1">&#39;Agent workflow&#39;</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The name of the run, used for tracing. Should be a logical name for the run, like
"Code generation workflow" or "Customer support agent".</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.trace_id" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">trace_id</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">trace_id</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A custom trace ID to use for tracing. If not provided, we will generate a new trace ID.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.group_id" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">group_id</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">group_id</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A grouping identifier to use for tracing, to link multiple traces from the same conversation
or process. For example, you might use a chat thread ID.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.run.RunConfig.trace_metadata" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">trace_metadata</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-class-attribute"><code>class-attribute</code></small>
<small class="doc doc-label doc-label-instance-attribute"><code>instance-attribute</code></small>
</span>
</h4>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">trace_metadata</span><span class="p">:</span> <span class="n"><span title="dict">dict</span></span><span class="p">[</span><span class="n"><span title="str">str</span></span><span class="p">,</span> <span class="n"><span title="typing.Any">Any</span></span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>An optional dictionary of additional metadata to include with the trace.</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "../..", "features": ["content.code.copy", "content.code.select", "navigation.path", "navigation.sections", "navigation.expand", "content.code.annotate"], "search": "../../assets/javascripts/workers/search.f8cc74c7.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.c8b220af.min.js"></script>
</body>
</html>