cai/ref/handoffs/index.html

4208 lines
117 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="../stream_events/">
<link rel="next" href="../lifecycle/">
<link rel="icon" href="../../assets/imago.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11">
<title>Handoffs - 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="#handoffs" 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">
Handoffs
</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">
<a href="../run/" class="md-nav__link">
<span class="md-ellipsis">
Runner
</span>
</a>
</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 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">
Handoffs
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Handoffs
</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.handoffs" class="md-nav__link">
<span class="md-ellipsis">
handoffs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputFilter" class="md-nav__link">
<span class="md-ellipsis">
HandoffInputFilter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData" class="md-nav__link">
<span class="md-ellipsis">
HandoffInputData
</span>
</a>
<nav class="md-nav" aria-label="HandoffInputData">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData.input_history" class="md-nav__link">
<span class="md-ellipsis">
input_history
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData.pre_handoff_items" class="md-nav__link">
<span class="md-ellipsis">
pre_handoff_items
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData.new_items" class="md-nav__link">
<span class="md-ellipsis">
new_items
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff" class="md-nav__link">
<span class="md-ellipsis">
Handoff
</span>
</a>
<nav class="md-nav" aria-label="Handoff">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.tool_name" class="md-nav__link">
<span class="md-ellipsis">
tool_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.tool_description" class="md-nav__link">
<span class="md-ellipsis">
tool_description
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.input_json_schema" class="md-nav__link">
<span class="md-ellipsis">
input_json_schema
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.on_invoke_handoff" class="md-nav__link">
<span class="md-ellipsis">
on_invoke_handoff
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.agent_name" class="md-nav__link">
<span class="md-ellipsis">
agent_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.input_filter" class="md-nav__link">
<span class="md-ellipsis">
input_filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.strict_json_schema" class="md-nav__link">
<span class="md-ellipsis">
strict_json_schema
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.handoff" class="md-nav__link">
<span class="md-ellipsis">
handoff
</span>
</a>
</li>
</ul>
</nav>
</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.handoffs" class="md-nav__link">
<span class="md-ellipsis">
handoffs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputFilter" class="md-nav__link">
<span class="md-ellipsis">
HandoffInputFilter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData" class="md-nav__link">
<span class="md-ellipsis">
HandoffInputData
</span>
</a>
<nav class="md-nav" aria-label="HandoffInputData">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData.input_history" class="md-nav__link">
<span class="md-ellipsis">
input_history
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData.pre_handoff_items" class="md-nav__link">
<span class="md-ellipsis">
pre_handoff_items
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.HandoffInputData.new_items" class="md-nav__link">
<span class="md-ellipsis">
new_items
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff" class="md-nav__link">
<span class="md-ellipsis">
Handoff
</span>
</a>
<nav class="md-nav" aria-label="Handoff">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.tool_name" class="md-nav__link">
<span class="md-ellipsis">
tool_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.tool_description" class="md-nav__link">
<span class="md-ellipsis">
tool_description
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.input_json_schema" class="md-nav__link">
<span class="md-ellipsis">
input_json_schema
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.on_invoke_handoff" class="md-nav__link">
<span class="md-ellipsis">
on_invoke_handoff
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.agent_name" class="md-nav__link">
<span class="md-ellipsis">
agent_name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.input_filter" class="md-nav__link">
<span class="md-ellipsis">
input_filter
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.Handoff.strict_json_schema" class="md-nav__link">
<span class="md-ellipsis">
strict_json_schema
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.handoffs.handoff" class="md-nav__link">
<span class="md-ellipsis">
handoff
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="handoffs"><code>Handoffs</code></h1>
<div class="doc doc-object doc-module">
<a id="cai.sdk.agents.handoffs"></a>
<div class="doc doc-contents first">
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="cai.sdk.agents.handoffs.HandoffInputFilter" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">HandoffInputFilter</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-module-attribute"><code>module-attribute</code></small>
</span>
</h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="n">HandoffInputFilter</span><span class="p">:</span> <span class="n"><span title="typing_extensions.TypeAlias">TypeAlias</span></span> <span class="o">=</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[</span>
</span><span id="__span-0-2"> <span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span><span class="p">],</span> <span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span>
</span><span id="__span-0-3"><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A function that filters the input data passed to the next agent.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.handoffs.HandoffInputData" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">HandoffInputData</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 ">
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/handoffs.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span>
<span class="normal">45</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-29"><span class="nd">@dataclass</span><span class="p">(</span><span class="n">frozen</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span><span id="__span-0-30"><span class="k">class</span><span class="w"> </span><span class="nc">HandoffInputData</span><span class="p">:</span>
</span><span id="__span-0-31"> <span class="n">input_history</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="nb">tuple</span><span class="p">[</span><span class="n">TResponseInputItem</span><span class="p">,</span> <span class="o">...</span><span class="p">]</span>
</span><span id="__span-0-32"><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="__span-0-33"><span class="sd"> The input history before `Runner.run()` was called.</span>
</span><span id="__span-0-34"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-35">
</span><span id="__span-0-36"> <span class="n">pre_handoff_items</span><span class="p">:</span> <span class="nb">tuple</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-37"><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="__span-0-38"><span class="sd"> The items generated before the agent turn where the handoff was invoked.</span>
</span><span id="__span-0-39"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-40">
</span><span id="__span-0-41"> <span class="n">new_items</span><span class="p">:</span> <span class="nb">tuple</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-42"><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="__span-0-43"><span class="sd"> The new items generated during the current agent turn, including the item that triggered the</span>
</span><span id="__span-0-44"><span class="sd"> handoff and the tool output message representing the response from the handoff output.</span>
</span><span id="__span-0-45"><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.handoffs.HandoffInputData.input_history" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">input_history</span>
<span class="doc doc-labels">
<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_history</span><span class="p">:</span> <span class="n"><span title="str">str</span></span> <span class="o">|</span> <span class="n"><span title="tuple">tuple</span></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 class="o">...</span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The input history before <code>Runner.run()</code> was called.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.HandoffInputData.pre_handoff_items" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">pre_handoff_items</span>
<span class="doc doc-labels">
<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">pre_handoff_items</span><span class="p">:</span> <span class="n"><span title="tuple">tuple</span></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="RunItem
module-attribute
(cai.sdk.agents.items.RunItem)" href="../items/#cai.sdk.agents.items.RunItem">RunItem</a></span><span class="p">,</span> <span class="o">...</span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The items generated before the agent turn where the handoff was invoked.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.HandoffInputData.new_items" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">new_items</span>
<span class="doc doc-labels">
<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">new_items</span><span class="p">:</span> <span class="n"><span title="tuple">tuple</span></span><span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="RunItem
module-attribute
(cai.sdk.agents.items.RunItem)" href="../items/#cai.sdk.agents.items.RunItem">RunItem</a></span><span class="p">,</span> <span class="o">...</span><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The new items generated during the current agent turn, including the item that triggered the
handoff and the tool output message representing the response from the handoff output.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.handoffs.Handoff" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">Handoff</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 class="doc doc-class-bases">
Bases: <code><span title="typing.Generic">Generic</span>[<span title="cai.sdk.agents.run_context.TContext">TContext</span>]</code></p>
<p>A handoff is when an agent delegates a task to another agent.
For example, in a customer support scenario you might have a "triage agent" that determines
which agent should handle the user's request, and sub-agents that specialize in different
areas like billing, account management, etc.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/handoffs.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal"> 52</span>
<span class="normal"> 53</span>
<span class="normal"> 54</span>
<span class="normal"> 55</span>
<span class="normal"> 56</span>
<span class="normal"> 57</span>
<span class="normal"> 58</span>
<span class="normal"> 59</span>
<span class="normal"> 60</span>
<span class="normal"> 61</span>
<span class="normal"> 62</span>
<span class="normal"> 63</span>
<span class="normal"> 64</span>
<span class="normal"> 65</span>
<span class="normal"> 66</span>
<span class="normal"> 67</span>
<span class="normal"> 68</span>
<span class="normal"> 69</span>
<span class="normal"> 70</span>
<span class="normal"> 71</span>
<span class="normal"> 72</span>
<span class="normal"> 73</span>
<span class="normal"> 74</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></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-52"><span class="nd">@dataclass</span>
</span><span id="__span-0-53"><span class="k">class</span><span class="w"> </span><span class="nc">Handoff</span><span class="p">(</span><span class="n">Generic</span><span class="p">[</span><span class="n">TContext</span><span class="p">]):</span>
</span><span id="__span-0-54"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A handoff is when an agent delegates a task to another agent.</span>
</span><span id="__span-0-55"><span class="sd"> For example, in a customer support scenario you might have a &quot;triage agent&quot; that determines</span>
</span><span id="__span-0-56"><span class="sd"> which agent should handle the user&#39;s request, and sub-agents that specialize in different</span>
</span><span id="__span-0-57"><span class="sd"> areas like billing, account management, etc.</span>
</span><span id="__span-0-58"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-59">
</span><span id="__span-0-60"> <span class="n">tool_name</span><span class="p">:</span> <span class="nb">str</span>
</span><span id="__span-0-61"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The name of the tool that represents the handoff.&quot;&quot;&quot;</span>
</span><span id="__span-0-62">
</span><span id="__span-0-63"> <span class="n">tool_description</span><span class="p">:</span> <span class="nb">str</span>
</span><span id="__span-0-64"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The description of the tool that represents the handoff.&quot;&quot;&quot;</span>
</span><span id="__span-0-65">
</span><span id="__span-0-66"> <span class="n">input_json_schema</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><span id="__span-0-67"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The JSON schema for the handoff input. Can be empty if the handoff does not take an input.</span>
</span><span id="__span-0-68"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-69">
</span><span id="__span-0-70"> <span class="n">on_invoke_handoff</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span> <span class="nb">str</span><span class="p">],</span> <span class="n">Awaitable</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-71"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The function that invokes the handoff. The parameters passed are:</span>
</span><span id="__span-0-72"><span class="sd"> 1. The handoff run context</span>
</span><span id="__span-0-73"><span class="sd"> 2. The arguments from the LLM, as a JSON string. Empty string if input_json_schema is empty.</span>
</span><span id="__span-0-74">
</span><span id="__span-0-75"><span class="sd"> Must return an agent.</span>
</span><span id="__span-0-76"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-77">
</span><span id="__span-0-78"> <span class="n">agent_name</span><span class="p">:</span> <span class="nb">str</span>
</span><span id="__span-0-79"><span class="w"> </span><span class="sd">&quot;&quot;&quot;The name of the agent that is being handed off to.&quot;&quot;&quot;</span>
</span><span id="__span-0-80">
</span><span id="__span-0-81"> <span class="n">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-82"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A function that filters the inputs that are passed to the next agent. By default, the new</span>
</span><span id="__span-0-83"><span class="sd"> agent sees the entire conversation history. In some cases, you may want to filter inputs e.g.</span>
</span><span id="__span-0-84"><span class="sd"> to remove older inputs, or remove tools from existing inputs.</span>
</span><span id="__span-0-85">
</span><span id="__span-0-86"><span class="sd"> The function will receive the entire conversation history so far, including the input item</span>
</span><span id="__span-0-87"><span class="sd"> that triggered the handoff and a tool call output item representing the handoff tool&#39;s output.</span>
</span><span id="__span-0-88">
</span><span id="__span-0-89"><span class="sd"> You are free to modify the input history or new items as you see fit. The next agent that</span>
</span><span id="__span-0-90"><span class="sd"> runs will receive `handoff_input_data.all_items`.</span>
</span><span id="__span-0-91">
</span><span id="__span-0-92"><span class="sd"> IMPORTANT: in streaming mode, we will not stream anything as a result of this function. The</span>
</span><span id="__span-0-93"><span class="sd"> items generated before will already have been streamed.</span>
</span><span id="__span-0-94"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-95">
</span><span id="__span-0-96"> <span class="n">strict_json_schema</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span>
</span><span id="__span-0-97"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Whether the input JSON schema is in strict mode. We **strongly** recommend setting this to</span>
</span><span id="__span-0-98"><span class="sd"> True, as it increases the likelihood of correct JSON input.</span>
</span><span id="__span-0-99"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-100">
</span><span id="__span-0-101"> <span class="k">def</span><span class="w"> </span><span class="nf">get_transfer_message</span><span class="p">(</span><span class="bp">self</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">str</span><span class="p">:</span>
</span><span id="__span-0-102"> <span class="n">base</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="se">{{</span><span class="s2">&#39;assistant&#39;: &#39;</span><span class="si">{</span><span class="n">agent</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&#39;</span><span class="se">}}</span><span class="s2">&quot;</span>
</span><span id="__span-0-103"> <span class="k">return</span> <span class="n">base</span>
</span><span id="__span-0-104">
</span><span id="__span-0-105"> <span class="nd">@classmethod</span>
</span><span id="__span-0-106"> <span class="k">def</span><span class="w"> </span><span class="nf">default_tool_name</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">str</span><span class="p">:</span>
</span><span id="__span-0-107"> <span class="k">return</span> <span class="n">_transforms</span><span class="o">.</span><span class="n">transform_string_function_style</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;transfer_to_</span><span class="si">{</span><span class="n">agent</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-108">
</span><span id="__span-0-109"> <span class="nd">@classmethod</span>
</span><span id="__span-0-110"> <span class="k">def</span><span class="w"> </span><span class="nf">default_tool_description</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">str</span><span class="p">:</span>
</span><span id="__span-0-111"> <span class="k">return</span> <span class="p">(</span>
</span><span id="__span-0-112"> <span class="sa">f</span><span class="s2">&quot;Handoff to the </span><span class="si">{</span><span class="n">agent</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> agent to handle the request. &quot;</span>
</span><span id="__span-0-113"> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">agent</span><span class="o">.</span><span class="n">handoff_description</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="s1">&#39;&#39;</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="__span-0-114"> <span class="p">)</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.handoffs.Handoff.tool_name" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">tool_name</span>
<span class="doc doc-labels">
<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">tool_name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The name of the tool that represents the handoff.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.Handoff.tool_description" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">tool_description</span>
<span class="doc doc-labels">
<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">tool_description</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The description of the tool that represents the handoff.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.Handoff.input_json_schema" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">input_json_schema</span>
<span class="doc doc-labels">
<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_json_schema</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></code></pre></div>
<div class="doc doc-contents ">
<p>The JSON schema for the handoff input. Can be empty if the handoff does not take an input.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.Handoff.on_invoke_handoff" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">on_invoke_handoff</span>
<span class="doc doc-labels">
<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">on_invoke_handoff</span><span class="p">:</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[</span>
</span><span id="__span-0-2"> <span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="RunContextWrapper
dataclass
(cai.sdk.agents.run_context.RunContextWrapper)" href="../run_context/#cai.sdk.agents.run_context.RunContextWrapper">RunContextWrapper</a></span><span class="p">[</span><span class="n"><span title="typing.Any">Any</span></span><span class="p">],</span> <span class="n"><span title="str">str</span></span><span class="p">],</span>
</span><span id="__span-0-3"> <span class="n"><span title="collections.abc.Awaitable">Awaitable</span></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-4"><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The function that invokes the handoff. The parameters passed are:
1. The handoff run context
2. The arguments from the LLM, as a JSON string. Empty string if input_json_schema is empty.</p>
<p>Must return an agent.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.Handoff.agent_name" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">agent_name</span>
<span class="doc doc-labels">
<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">agent_name</span><span class="p">:</span> <span class="n"><span title="str">str</span></span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The name of the agent that is being handed off to.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.Handoff.input_filter" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">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">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="#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 function that filters the inputs that are passed to the next agent. By default, the new
agent sees the entire conversation history. In some cases, you may want to filter inputs e.g.
to remove older inputs, or remove tools from existing inputs.</p>
<p>The function will receive the entire conversation history so far, including the input item
that triggered the handoff and a tool call output item representing the handoff tool's output.</p>
<p>You are free to modify the input history or new items as you see fit. The next agent that
runs will receive <code>handoff_input_data.all_items</code>.</p>
<p>IMPORTANT: in streaming mode, we will not stream anything as a result of this function. The
items generated before will already have been streamed.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.handoffs.Handoff.strict_json_schema" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">strict_json_schema</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">strict_json_schema</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 the input JSON schema is in strict mode. We <strong>strongly</strong> recommend setting this to
True, as it increases the likelihood of correct JSON input.</p>
</div>
</div>
</div>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="cai.sdk.agents.handoffs.handoff" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">handoff</span>
</h3>
<div class="doc-overloads">
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">handoff</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">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="o">*</span><span class="p">,</span>
</span><span id="__span-0-4"> <span class="n">tool_name_override</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 class="p">,</span>
</span><span id="__span-0-5"> <span class="n">tool_description_override</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 class="p">,</span>
</span><span id="__span-0-6"> <span class="n">input_filter</span><span class="p">:</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[</span>
</span><span id="__span-0-7"> <span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span><span class="p">],</span> <span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span>
</span><span id="__span-0-8"> <span class="p">]</span>
</span><span id="__span-0-9"> <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-10"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="Handoff
dataclass
(cai.sdk.agents.handoffs.Handoff)" href="#cai.sdk.agents.handoffs.Handoff">Handoff</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></code></pre></div><div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">handoff</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">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="o">*</span><span class="p">,</span>
</span><span id="__span-0-4"> <span class="n">on_handoff</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.handoffs.OnHandoffWithInput">OnHandoffWithInput</span></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.handoffs.THandoffInput">THandoffInput</span></span><span class="p">],</span>
</span><span id="__span-0-5"> <span class="n">input_type</span><span class="p">:</span> <span class="n"><span title="type">type</span></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.handoffs.THandoffInput">THandoffInput</span></span><span class="p">],</span>
</span><span id="__span-0-6"> <span class="n">tool_description_override</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 class="p">,</span>
</span><span id="__span-0-7"> <span class="n">tool_name_override</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 class="p">,</span>
</span><span id="__span-0-8"> <span class="n">input_filter</span><span class="p">:</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[</span>
</span><span id="__span-0-9"> <span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span><span class="p">],</span> <span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span>
</span><span id="__span-0-10"> <span class="p">]</span>
</span><span id="__span-0-11"> <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-12"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="Handoff
dataclass
(cai.sdk.agents.handoffs.Handoff)" href="#cai.sdk.agents.handoffs.Handoff">Handoff</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></code></pre></div><div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">handoff</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">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="o">*</span><span class="p">,</span>
</span><span id="__span-0-4"> <span class="n">on_handoff</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.handoffs.OnHandoffWithoutInput">OnHandoffWithoutInput</span></span><span class="p">,</span>
</span><span id="__span-0-5"> <span class="n">tool_description_override</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 class="p">,</span>
</span><span id="__span-0-6"> <span class="n">tool_name_override</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 class="p">,</span>
</span><span id="__span-0-7"> <span class="n">input_filter</span><span class="p">:</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[</span>
</span><span id="__span-0-8"> <span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span><span class="p">],</span> <span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span>
</span><span id="__span-0-9"> <span class="p">]</span>
</span><span id="__span-0-10"> <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-11"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="Handoff
dataclass
(cai.sdk.agents.handoffs.Handoff)" href="#cai.sdk.agents.handoffs.Handoff">Handoff</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></code></pre></div> </div>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">handoff</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">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="n">tool_name_override</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 class="p">,</span>
</span><span id="__span-0-4"> <span class="n">tool_description_override</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 class="p">,</span>
</span><span id="__span-0-5"> <span class="n">on_handoff</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.handoffs.OnHandoffWithInput">OnHandoffWithInput</span></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.handoffs.THandoffInput">THandoffInput</span></span><span class="p">]</span>
</span><span id="__span-0-6"> <span class="o">|</span> <span class="n"><span title="cai.sdk.agents.handoffs.OnHandoffWithoutInput">OnHandoffWithoutInput</span></span>
</span><span id="__span-0-7"> <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">input_type</span><span class="p">:</span> <span class="n"><span title="type">type</span></span><span class="p">[</span><span class="n"><span title="cai.sdk.agents.handoffs.THandoffInput">THandoffInput</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-9"> <span class="n">input_filter</span><span class="p">:</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[</span>
</span><span id="__span-0-10"> <span class="p">[</span><span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span><span class="p">],</span> <span class="n"><a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a></span>
</span><span id="__span-0-11"> <span class="p">]</span>
</span><span id="__span-0-12"> <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-13"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><a class="autorefs autorefs-internal" title="Handoff
dataclass
(cai.sdk.agents.handoffs.Handoff)" href="#cai.sdk.agents.handoffs.Handoff">Handoff</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></code></pre></div>
<div class="doc doc-contents ">
<p>Create a handoff from an agent.</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>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 agent to handoff to, or a function that returns an agent.</p>
</div>
</td>
<td>
<em>required</em>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>tool_name_override</code>
</td>
<td>
<code><span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional override for the name of the tool that represents the handoff.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>tool_description_override</code>
</td>
<td>
<code><span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>Optional override for the description of the tool that
represents the handoff.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>on_handoff</code>
</td>
<td>
<code><span title="cai.sdk.agents.handoffs.OnHandoffWithInput">OnHandoffWithInput</span>[<span title="cai.sdk.agents.handoffs.THandoffInput">THandoffInput</span>] | <span title="cai.sdk.agents.handoffs.OnHandoffWithoutInput">OnHandoffWithoutInput</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>A function that runs when the handoff is invoked.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>input_type</code>
</td>
<td>
<code><span title="type">type</span>[<span title="cai.sdk.agents.handoffs.THandoffInput">THandoffInput</span>] | None</code>
</td>
<td>
<div class="doc-md-description">
<p>the type of the input to the handoff. If provided, the input will be validated
against this type. Only relevant if you pass a function that takes an input.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>input_filter</code>
</td>
<td>
<code><span title="typing.Callable">Callable</span>[[<a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a>], <a class="autorefs autorefs-internal" title="HandoffInputData
dataclass
(cai.sdk.agents.handoffs.HandoffInputData)" href="#cai.sdk.agents.handoffs.HandoffInputData">HandoffInputData</a>] | None</code>
</td>
<td>
<div class="doc-md-description">
<p>a function that filters the inputs that are passed to the next agent.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/handoffs.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></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></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-150"><span class="k">def</span><span class="w"> </span><span class="nf">handoff</span><span class="p">(</span>
</span><span id="__span-0-151"> <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-152"> <span class="n">tool_name_override</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 class="p">,</span>
</span><span id="__span-0-153"> <span class="n">tool_description_override</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 class="p">,</span>
</span><span id="__span-0-154"> <span class="n">on_handoff</span><span class="p">:</span> <span class="n">OnHandoffWithInput</span><span class="p">[</span><span class="n">THandoffInput</span><span class="p">]</span> <span class="o">|</span> <span class="n">OnHandoffWithoutInput</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-155"> <span class="n">input_type</span><span class="p">:</span> <span class="nb">type</span><span class="p">[</span><span class="n">THandoffInput</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-156"> <span class="n">input_filter</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">HandoffInputData</span><span class="p">],</span> <span class="n">HandoffInputData</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-157"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Handoff</span><span class="p">[</span><span class="n">TContext</span><span class="p">]:</span>
</span><span id="__span-0-158"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Create a handoff from an agent.</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"> agent: The agent to handoff to, or a function that returns an agent.</span>
</span><span id="__span-0-162"><span class="sd"> tool_name_override: Optional override for the name of the tool that represents the handoff.</span>
</span><span id="__span-0-163"><span class="sd"> tool_description_override: Optional override for the description of the tool that</span>
</span><span id="__span-0-164"><span class="sd"> represents the handoff.</span>
</span><span id="__span-0-165"><span class="sd"> on_handoff: A function that runs when the handoff is invoked.</span>
</span><span id="__span-0-166"><span class="sd"> input_type: the type of the input to the handoff. If provided, the input will be validated</span>
</span><span id="__span-0-167"><span class="sd"> against this type. Only relevant if you pass a function that takes an input.</span>
</span><span id="__span-0-168"><span class="sd"> input_filter: a function that filters the inputs that are passed to the next agent.</span>
</span><span id="__span-0-169"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-170"> <span class="k">assert</span> <span class="p">(</span><span class="n">on_handoff</span> <span class="ow">and</span> <span class="n">input_type</span><span class="p">)</span> <span class="ow">or</span> <span class="ow">not</span> <span class="p">(</span>
</span><span id="__span-0-171"> <span class="n">on_handoff</span> <span class="ow">and</span> <span class="n">input_type</span>
</span><span id="__span-0-172"> <span class="p">),</span> <span class="s2">&quot;You must provide either both on_input and input_type, or neither&quot;</span>
</span><span id="__span-0-173"> <span class="n">type_adapter</span><span class="p">:</span> <span class="n">TypeAdapter</span><span class="p">[</span><span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span>
</span><span id="__span-0-174"> <span class="k">if</span> <span class="n">input_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-175"> <span class="k">assert</span> <span class="nb">callable</span><span class="p">(</span><span class="n">on_handoff</span><span class="p">),</span> <span class="s2">&quot;on_handoff must be callable&quot;</span>
</span><span id="__span-0-176"> <span class="n">sig</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">signature</span><span class="p">(</span><span class="n">on_handoff</span><span class="p">)</span>
</span><span id="__span-0-177"> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sig</span><span class="o">.</span><span class="n">parameters</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">:</span>
</span><span id="__span-0-178"> <span class="k">raise</span> <span class="n">UserError</span><span class="p">(</span><span class="s2">&quot;on_handoff must take two arguments: context and input&quot;</span><span class="p">)</span>
</span><span id="__span-0-179">
</span><span id="__span-0-180"> <span class="n">type_adapter</span> <span class="o">=</span> <span class="n">TypeAdapter</span><span class="p">(</span><span class="n">input_type</span><span class="p">)</span>
</span><span id="__span-0-181"> <span class="n">input_json_schema</span> <span class="o">=</span> <span class="n">type_adapter</span><span class="o">.</span><span class="n">json_schema</span><span class="p">()</span>
</span><span id="__span-0-182"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-183"> <span class="n">type_adapter</span> <span class="o">=</span> <span class="kc">None</span>
</span><span id="__span-0-184"> <span class="n">input_json_schema</span> <span class="o">=</span> <span class="p">{}</span>
</span><span id="__span-0-185"> <span class="k">if</span> <span class="n">on_handoff</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-186"> <span class="n">sig</span> <span class="o">=</span> <span class="n">inspect</span><span class="o">.</span><span class="n">signature</span><span class="p">(</span><span class="n">on_handoff</span><span class="p">)</span>
</span><span id="__span-0-187"> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sig</span><span class="o">.</span><span class="n">parameters</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
</span><span id="__span-0-188"> <span class="k">raise</span> <span class="n">UserError</span><span class="p">(</span><span class="s2">&quot;on_handoff must take one argument: context&quot;</span><span class="p">)</span>
</span><span id="__span-0-189">
</span><span id="__span-0-190"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_invoke_handoff</span><span class="p">(</span>
</span><span id="__span-0-191"> <span class="n">ctx</span><span class="p">:</span> <span class="n">RunContextWrapper</span><span class="p">[</span><span class="n">Any</span><span class="p">],</span> <span class="n">input_json</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-192"> <span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Agent</span><span class="p">[</span><span class="n">Any</span><span class="p">]:</span>
</span><span id="__span-0-193"> <span class="k">if</span> <span class="n">input_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">type_adapter</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-194"> <span class="k">if</span> <span class="n">input_json</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-195"> <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-196"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-197"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Handoff function expected non-null input, but got None&quot;</span><span class="p">,</span>
</span><span id="__span-0-198"> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;details&quot;</span><span class="p">:</span> <span class="s2">&quot;input_json is None&quot;</span><span class="p">},</span>
</span><span id="__span-0-199"> <span class="p">)</span>
</span><span id="__span-0-200"> <span class="p">)</span>
</span><span id="__span-0-201"> <span class="k">raise</span> <span class="n">ModelBehaviorError</span><span class="p">(</span><span class="s2">&quot;Handoff function expected non-null input, but got None&quot;</span><span class="p">)</span>
</span><span id="__span-0-202">
</span><span id="__span-0-203"> <span class="n">validated_input</span> <span class="o">=</span> <span class="n">_json</span><span class="o">.</span><span class="n">validate_json</span><span class="p">(</span>
</span><span id="__span-0-204"> <span class="n">json_str</span><span class="o">=</span><span class="n">input_json</span><span class="p">,</span>
</span><span id="__span-0-205"> <span class="n">type_adapter</span><span class="o">=</span><span class="n">type_adapter</span><span class="p">,</span>
</span><span id="__span-0-206"> <span class="n">partial</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
</span><span id="__span-0-207"> <span class="p">)</span>
</span><span id="__span-0-208"> <span class="n">input_func</span> <span class="o">=</span> <span class="n">cast</span><span class="p">(</span><span class="n">OnHandoffWithInput</span><span class="p">[</span><span class="n">THandoffInput</span><span class="p">],</span> <span class="n">on_handoff</span><span class="p">)</span>
</span><span id="__span-0-209"> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">input_func</span><span class="p">):</span>
</span><span id="__span-0-210"> <span class="k">await</span> <span class="n">input_func</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">validated_input</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">input_func</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">validated_input</span><span class="p">)</span>
</span><span id="__span-0-213"> <span class="k">elif</span> <span class="n">on_handoff</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-214"> <span class="n">no_input_func</span> <span class="o">=</span> <span class="n">cast</span><span class="p">(</span><span class="n">OnHandoffWithoutInput</span><span class="p">,</span> <span class="n">on_handoff</span><span class="p">)</span>
</span><span id="__span-0-215"> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">iscoroutinefunction</span><span class="p">(</span><span class="n">no_input_func</span><span class="p">):</span>
</span><span id="__span-0-216"> <span class="k">await</span> <span class="n">no_input_func</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
</span><span id="__span-0-217"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-218"> <span class="n">no_input_func</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span>
</span><span id="__span-0-219">
</span><span id="__span-0-220"> <span class="k">return</span> <span class="n">agent</span>
</span><span id="__span-0-221">
</span><span id="__span-0-222"> <span class="n">tool_name</span> <span class="o">=</span> <span class="n">tool_name_override</span> <span class="ow">or</span> <span class="n">Handoff</span><span class="o">.</span><span class="n">default_tool_name</span><span class="p">(</span><span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-223"> <span class="n">tool_description</span> <span class="o">=</span> <span class="n">tool_description_override</span> <span class="ow">or</span> <span class="n">Handoff</span><span class="o">.</span><span class="n">default_tool_description</span><span class="p">(</span><span class="n">agent</span><span class="p">)</span>
</span><span id="__span-0-224">
</span><span id="__span-0-225"> <span class="c1"># Always ensure the input JSON schema is in strict mode</span>
</span><span id="__span-0-226"> <span class="c1"># If there is a need, we can make this configurable in the future</span>
</span><span id="__span-0-227"> <span class="n">input_json_schema</span> <span class="o">=</span> <span class="n">ensure_strict_json_schema</span><span class="p">(</span><span class="n">input_json_schema</span><span class="p">)</span>
</span><span id="__span-0-228">
</span><span id="__span-0-229"> <span class="k">return</span> <span class="n">Handoff</span><span class="p">(</span>
</span><span id="__span-0-230"> <span class="n">tool_name</span><span class="o">=</span><span class="n">tool_name</span><span class="p">,</span>
</span><span id="__span-0-231"> <span class="n">tool_description</span><span class="o">=</span><span class="n">tool_description</span><span class="p">,</span>
</span><span id="__span-0-232"> <span class="n">input_json_schema</span><span class="o">=</span><span class="n">input_json_schema</span><span class="p">,</span>
</span><span id="__span-0-233"> <span class="n">on_invoke_handoff</span><span class="o">=</span><span class="n">_invoke_handoff</span><span class="p">,</span>
</span><span id="__span-0-234"> <span class="n">input_filter</span><span class="o">=</span><span class="n">input_filter</span><span class="p">,</span>
</span><span id="__span-0-235"> <span class="n">agent_name</span><span class="o">=</span><span class="n">agent</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-236"> <span class="p">)</span>
</span></code></pre></div></td></tr></table></div>
</details>
</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>