cai/ref/tool/index.html

3854 lines
109 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="../run/">
<link rel="next" href="../result/">
<link rel="icon" href="../../assets/imago.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.6.11">
<title>Tool - 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="#tools" 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">
Tool
</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 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">
Tool
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Tool
</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.tool" class="md-nav__link">
<span class="md-ellipsis">
tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.Tool" class="md-nav__link">
<span class="md-ellipsis">
Tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool" class="md-nav__link">
<span class="md-ellipsis">
FunctionTool
</span>
</a>
<nav class="md-nav" aria-label="FunctionTool">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.name" class="md-nav__link">
<span class="md-ellipsis">
name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.description" class="md-nav__link">
<span class="md-ellipsis">
description
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.params_json_schema" class="md-nav__link">
<span class="md-ellipsis">
params_json_schema
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.on_invoke_tool" class="md-nav__link">
<span class="md-ellipsis">
on_invoke_tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.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.tool.function_tool" class="md-nav__link">
<span class="md-ellipsis">
function_tool
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../result/" class="md-nav__link">
<span class="md-ellipsis">
Result
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../stream_events/" class="md-nav__link">
<span class="md-ellipsis">
Stream Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../handoffs/" class="md-nav__link">
<span class="md-ellipsis">
Handoffs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../lifecycle/" class="md-nav__link">
<span class="md-ellipsis">
Lifecycle
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../items/" class="md-nav__link">
<span class="md-ellipsis">
Items
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../run_context/" class="md-nav__link">
<span class="md-ellipsis">
Run Context
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../usage/" class="md-nav__link">
<span class="md-ellipsis">
Usage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../exceptions/" class="md-nav__link">
<span class="md-ellipsis">
Exceptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../guardrail/" class="md-nav__link">
<span class="md-ellipsis">
Guardrail
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../model_settings/" class="md-nav__link">
<span class="md-ellipsis">
Model Settings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../agent_output/" class="md-nav__link">
<span class="md-ellipsis">
Agent Output
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../function_schema/" class="md-nav__link">
<span class="md-ellipsis">
Function Schema
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10_2" >
<label class="md-nav__link" for="__nav_10_2" id="__nav_10_2_label" tabindex="0">
<span class="md-ellipsis">
Models
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10_2">
<span class="md-nav__icon md-icon"></span>
Models
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../models/interface/" class="md-nav__link">
<span class="md-ellipsis">
Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../models/openai_chatcompletions/" class="md-nav__link">
<span class="md-ellipsis">
OpenAI Chat Completions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../models/openai_responses/" class="md-nav__link">
<span class="md-ellipsis">
OpenAI Responses
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_10_3" >
<label class="md-nav__link" for="__nav_10_3" id="__nav_10_3_label" tabindex="0">
<span class="md-ellipsis">
Extensions
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_10_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10_3">
<span class="md-nav__icon md-icon"></span>
Extensions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../extensions/handoff_filters/" class="md-nav__link">
<span class="md-ellipsis">
Handoff Filters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../extensions/handoff_prompt/" class="md-nav__link">
<span class="md-ellipsis">
Handoff Prompt
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_11" >
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="">
<span class="md-ellipsis">
Advanced
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
Advanced
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cai_development/" class="md-nav__link">
<span class="md-ellipsis">
Development
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_12" >
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="">
<span class="md-ellipsis">
Research
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
Research
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../research/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_13" >
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="">
<span class="md-ellipsis">
Resources
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
Resources
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../cai_faq/" class="md-nav__link">
<span class="md-ellipsis">
FAQ
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai_find_us/" class="md-nav__link">
<span class="md-ellipsis">
Find Us
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../cai_citation_and_acknowledgments/" class="md-nav__link">
<span class="md-ellipsis">
Citation & Acknowledgments
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool" class="md-nav__link">
<span class="md-ellipsis">
tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.Tool" class="md-nav__link">
<span class="md-ellipsis">
Tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool" class="md-nav__link">
<span class="md-ellipsis">
FunctionTool
</span>
</a>
<nav class="md-nav" aria-label="FunctionTool">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.name" class="md-nav__link">
<span class="md-ellipsis">
name
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.description" class="md-nav__link">
<span class="md-ellipsis">
description
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.params_json_schema" class="md-nav__link">
<span class="md-ellipsis">
params_json_schema
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.on_invoke_tool" class="md-nav__link">
<span class="md-ellipsis">
on_invoke_tool
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cai.sdk.agents.tool.FunctionTool.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.tool.function_tool" class="md-nav__link">
<span class="md-ellipsis">
function_tool
</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="tools"><code>Tools</code></h1>
<div class="doc doc-object doc-module">
<a id="cai.sdk.agents.tool"></a>
<div class="doc doc-contents first">
<div class="doc doc-children">
<div class="doc doc-object doc-attribute">
<h3 id="cai.sdk.agents.tool.Tool" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">Tool</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">Tool</span> <span class="o">=</span> <span class="n"><span title="typing.Union">Union</span></span><span class="p">[</span>
</span><span id="__span-0-2"> <span class="n"><a class="autorefs autorefs-internal" title="FunctionTool
dataclass
(cai.sdk.agents.tool.FunctionTool)" href="#cai.sdk.agents.tool.FunctionTool">FunctionTool</a></span><span class="p">,</span>
</span><span id="__span-0-3"> <span class="n"><span title="cai.sdk.agents.tool.FileSearchTool">FileSearchTool</span></span><span class="p">,</span>
</span><span id="__span-0-4"> <span class="n"><span title="cai.sdk.agents.tool.WebSearchTool">WebSearchTool</span></span><span class="p">,</span>
</span><span id="__span-0-5"> <span class="n"><span title="cai.sdk.agents.tool.ComputerTool">ComputerTool</span></span><span class="p">,</span>
</span><span id="__span-0-6"><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A tool that can be used in an agent.</p>
</div>
</div>
<div class="doc doc-object doc-class">
<h3 id="cai.sdk.agents.tool.FunctionTool" class="doc doc-heading">
<span class="doc doc-object-name doc-class-name">FunctionTool</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>A tool that wraps a function. In most cases, you should use the <code>function_tool</code> helpers to
create a FunctionTool, as they let you easily wrap a Python function.</p>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/tool.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></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></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-54"><span class="nd">@dataclass</span>
</span><span id="__span-0-55"><span class="k">class</span><span class="w"> </span><span class="nc">FunctionTool</span><span class="p">:</span>
</span><span id="__span-0-56"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A tool that wraps a function. In most cases, you should use the `function_tool` helpers to</span>
</span><span id="__span-0-57"><span class="sd"> create a FunctionTool, as they let you easily wrap a Python function.</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">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, as shown to the LLM. Generally the name of the function.&quot;&quot;&quot;</span>
</span><span id="__span-0-62">
</span><span id="__span-0-63"> <span class="n">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;A description of the tool, as shown to the LLM.&quot;&quot;&quot;</span>
</span><span id="__span-0-65">
</span><span id="__span-0-66"> <span class="n">params_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 tool&#39;s parameters.&quot;&quot;&quot;</span>
</span><span id="__span-0-68">
</span><span id="__span-0-69"> <span class="n">on_invoke_tool</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">Any</span><span class="p">]]</span>
</span><span id="__span-0-70"><span class="w"> </span><span class="sd">&quot;&quot;&quot;A function that invokes the tool with the given context and parameters. The params passed</span>
</span><span id="__span-0-71"><span class="sd"> are:</span>
</span><span id="__span-0-72"><span class="sd"> 1. The tool run context.</span>
</span><span id="__span-0-73"><span class="sd"> 2. The arguments from the LLM, as a JSON string.</span>
</span><span id="__span-0-74">
</span><span id="__span-0-75"><span class="sd"> You must return a string representation of the tool output, or something we can call `str()` on.</span>
</span><span id="__span-0-76"><span class="sd"> In case of errors, you can either raise an Exception (which will cause the run to fail) or</span>
</span><span id="__span-0-77"><span class="sd"> return a string error message (which will be sent back to the LLM).</span>
</span><span id="__span-0-78"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-79">
</span><span id="__span-0-80"> <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-81"><span class="w"> </span><span class="sd">&quot;&quot;&quot;Whether the JSON schema is in strict mode. We **strongly** recommend setting this to True,</span>
</span><span id="__span-0-82"><span class="sd"> as it increases the likelihood of correct JSON input.&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.tool.FunctionTool.name" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">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">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, as shown to the LLM. Generally the name of the function.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.tool.FunctionTool.description" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">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">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>A description of the tool, as shown to the LLM.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.tool.FunctionTool.params_json_schema" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">params_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">params_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 tool's parameters.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.tool.FunctionTool.on_invoke_tool" class="doc doc-heading">
<span class="doc doc-object-name doc-attribute-name">on_invoke_tool</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_tool</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 class="n"><span title="collections.abc.Awaitable">Awaitable</span></span><span class="p">[</span><span class="n"><span title="typing.Any">Any</span></span><span class="p">]</span>
</span><span id="__span-0-3"><span class="p">]</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A function that invokes the tool with the given context and parameters. The params passed
are:
1. The tool run context.
2. The arguments from the LLM, as a JSON string.</p>
<p>You must return a string representation of the tool output, or something we can call <code>str()</code> on.
In case of errors, you can either raise an Exception (which will cause the run to fail) or
return a string error message (which will be sent back to the LLM).</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h4 id="cai.sdk.agents.tool.FunctionTool.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 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.tool.function_tool" class="doc doc-heading">
<span class="doc doc-object-name doc-function-name">function_tool</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">function_tool</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">func</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.tool.ToolFunction">ToolFunction</span></span><span class="p">[</span><span class="o">...</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">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">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">docstring_style</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.function_schema.DocstringStyle">DocstringStyle</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">use_docstring_info</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-8"> <span class="n">failure_error_function</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.tool.ToolErrorFunction">ToolErrorFunction</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-9"> <span class="n">strict_mode</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</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="FunctionTool
dataclass
(cai.sdk.agents.tool.FunctionTool)" href="#cai.sdk.agents.tool.FunctionTool">FunctionTool</a></span>
</span></code></pre></div><div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><span class="nf">function_tool</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-3"> <span class="n">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">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">docstring_style</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.function_schema.DocstringStyle">DocstringStyle</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">use_docstring_info</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-7"> <span class="n">failure_error_function</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.tool.ToolErrorFunction">ToolErrorFunction</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">strict_mode</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-9"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[[</span><span class="n"><span title="cai.sdk.agents.tool.ToolFunction">ToolFunction</span></span><span class="p">[</span><span class="o">...</span><span class="p">]],</span> <span class="n"><a class="autorefs autorefs-internal" title="FunctionTool
dataclass
(cai.sdk.agents.tool.FunctionTool)" href="#cai.sdk.agents.tool.FunctionTool">FunctionTool</a></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">function_tool</span><span class="p">(</span>
</span><span id="__span-0-2"> <span class="n">func</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.tool.ToolFunction">ToolFunction</span></span><span class="p">[</span><span class="o">...</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-3"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-4"> <span class="n">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">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">docstring_style</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.function_schema.DocstringStyle">DocstringStyle</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">use_docstring_info</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-8"> <span class="n">failure_error_function</span><span class="p">:</span> <span class="n"><span title="cai.sdk.agents.tool.ToolErrorFunction">ToolErrorFunction</span></span>
</span><span id="__span-0-9"> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="n"><span title="cai.sdk.agents.tool.default_tool_error_function">default_tool_error_function</span></span><span class="p">,</span>
</span><span id="__span-0-10"> <span class="n">strict_mode</span><span class="p">:</span> <span class="n"><span title="bool">bool</span></span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-11"><span class="p">)</span> <span class="o">-&gt;</span> <span class="p">(</span>
</span><span id="__span-0-12"> <span class="n"><a class="autorefs autorefs-internal" title="FunctionTool
dataclass
(cai.sdk.agents.tool.FunctionTool)" href="#cai.sdk.agents.tool.FunctionTool">FunctionTool</a></span>
</span><span id="__span-0-13"> <span class="o">|</span> <span class="n"><span title="typing.Callable">Callable</span></span><span class="p">[[</span><span class="n"><span title="cai.sdk.agents.tool.ToolFunction">ToolFunction</span></span><span class="p">[</span><span class="o">...</span><span class="p">]],</span> <span class="n"><a class="autorefs autorefs-internal" title="FunctionTool
dataclass
(cai.sdk.agents.tool.FunctionTool)" href="#cai.sdk.agents.tool.FunctionTool">FunctionTool</a></span><span class="p">]</span>
</span><span id="__span-0-14"><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Decorator to create a FunctionTool from a function. By default, we will:
1. Parse the function signature to create a JSON schema for the tool's parameters.
2. Use the function's docstring to populate the tool's description.
3. Use the function's docstring to populate argument descriptions.
The docstring style is detected automatically, but you can override it.</p>
<p>If the function takes a <code>RunContextWrapper</code> as the first argument, it <em>must</em> match the
context type of the agent that uses the tool.</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>func</code>
</td>
<td>
<code><span title="cai.sdk.agents.tool.ToolFunction">ToolFunction</span>[...] | None</code>
</td>
<td>
<div class="doc-md-description">
<p>The function to wrap.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>name_override</code>
</td>
<td>
<code><span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>If provided, use this name for the tool instead of the function's name.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>description_override</code>
</td>
<td>
<code><span title="str">str</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>If provided, use this description for the tool instead of the
function's docstring.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>docstring_style</code>
</td>
<td>
<code><span title="cai.sdk.agents.function_schema.DocstringStyle">DocstringStyle</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>If provided, use this style for the tool's docstring. If not provided,
we will attempt to auto-detect the style.</p>
</div>
</td>
<td>
<code>None</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>use_docstring_info</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>If True, use the function's docstring to populate the tool's
description and argument descriptions.</p>
</div>
</td>
<td>
<code>True</code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>failure_error_function</code>
</td>
<td>
<code><span title="cai.sdk.agents.tool.ToolErrorFunction">ToolErrorFunction</span> | None</code>
</td>
<td>
<div class="doc-md-description">
<p>If provided, use this function to generate an error message when
the tool call fails. The error message is sent to the LLM. If you pass None, then no
error message will be sent and instead an Exception will be raised.</p>
</div>
</td>
<td>
<code><span title="cai.sdk.agents.tool.default_tool_error_function">default_tool_error_function</span></code>
</td>
</tr>
<tr class="doc-section-item">
<td>
<code>strict_mode</code>
</td>
<td>
<code><span title="bool">bool</span></code>
</td>
<td>
<div class="doc-md-description">
<p>Whether to enable strict mode for the tool's JSON schema. We <em>strongly</em>
recommend setting this to True, as it increases the likelihood of correct JSON input.
If False, it allows non-strict JSON schemas. For example, if a parameter has a default
value, it will be optional, additional properties are allowed, etc. See here for more:
https://platform.openai.com/docs/guides/structured-outputs?api-mode=responses#supported-schemas</p>
</div>
</td>
<td>
<code>True</code>
</td>
</tr>
</tbody>
</table>
<details class="quote">
<summary>Source code in <code>src/cai/sdk/agents/tool.py</code></summary>
<div class="language-python highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span></span><span class="normal">183</span>
<span class="normal">184</span>
<span class="normal">185</span>
<span class="normal">186</span>
<span class="normal">187</span>
<span class="normal">188</span>
<span class="normal">189</span>
<span class="normal">190</span>
<span class="normal">191</span>
<span class="normal">192</span>
<span class="normal">193</span>
<span class="normal">194</span>
<span class="normal">195</span>
<span class="normal">196</span>
<span class="normal">197</span>
<span class="normal">198</span>
<span class="normal">199</span>
<span class="normal">200</span>
<span class="normal">201</span>
<span class="normal">202</span>
<span class="normal">203</span>
<span class="normal">204</span>
<span class="normal">205</span>
<span class="normal">206</span>
<span class="normal">207</span>
<span class="normal">208</span>
<span class="normal">209</span>
<span class="normal">210</span>
<span class="normal">211</span>
<span class="normal">212</span>
<span class="normal">213</span>
<span class="normal">214</span>
<span class="normal">215</span>
<span class="normal">216</span>
<span class="normal">217</span>
<span class="normal">218</span>
<span class="normal">219</span>
<span class="normal">220</span>
<span class="normal">221</span>
<span class="normal">222</span>
<span class="normal">223</span>
<span class="normal">224</span>
<span class="normal">225</span>
<span class="normal">226</span>
<span class="normal">227</span>
<span class="normal">228</span>
<span class="normal">229</span>
<span class="normal">230</span>
<span class="normal">231</span>
<span class="normal">232</span>
<span class="normal">233</span>
<span class="normal">234</span>
<span class="normal">235</span>
<span class="normal">236</span>
<span class="normal">237</span>
<span class="normal">238</span>
<span class="normal">239</span>
<span class="normal">240</span>
<span class="normal">241</span>
<span class="normal">242</span>
<span class="normal">243</span>
<span class="normal">244</span>
<span class="normal">245</span>
<span class="normal">246</span>
<span class="normal">247</span>
<span class="normal">248</span>
<span class="normal">249</span>
<span class="normal">250</span>
<span class="normal">251</span>
<span class="normal">252</span>
<span class="normal">253</span>
<span class="normal">254</span>
<span class="normal">255</span>
<span class="normal">256</span>
<span class="normal">257</span>
<span class="normal">258</span>
<span class="normal">259</span>
<span class="normal">260</span>
<span class="normal">261</span>
<span class="normal">262</span>
<span class="normal">263</span>
<span class="normal">264</span>
<span class="normal">265</span>
<span class="normal">266</span>
<span class="normal">267</span>
<span class="normal">268</span>
<span class="normal">269</span>
<span class="normal">270</span>
<span class="normal">271</span>
<span class="normal">272</span>
<span class="normal">273</span>
<span class="normal">274</span>
<span class="normal">275</span>
<span class="normal">276</span>
<span class="normal">277</span>
<span class="normal">278</span>
<span class="normal">279</span>
<span class="normal">280</span>
<span class="normal">281</span>
<span class="normal">282</span>
<span class="normal">283</span>
<span class="normal">284</span>
<span class="normal">285</span>
<span class="normal">286</span>
<span class="normal">287</span>
<span class="normal">288</span>
<span class="normal">289</span>
<span class="normal">290</span>
<span class="normal">291</span>
<span class="normal">292</span>
<span class="normal">293</span>
<span class="normal">294</span>
<span class="normal">295</span>
<span class="normal">296</span>
<span class="normal">297</span>
<span class="normal">298</span>
<span class="normal">299</span>
<span class="normal">300</span>
<span class="normal">301</span>
<span class="normal">302</span>
<span class="normal">303</span>
<span class="normal">304</span>
<span class="normal">305</span>
<span class="normal">306</span>
<span class="normal">307</span>
<span class="normal">308</span>
<span class="normal">309</span>
<span class="normal">310</span>
<span class="normal">311</span>
<span class="normal">312</span>
<span class="normal">313</span>
<span class="normal">314</span>
<span class="normal">315</span>
<span class="normal">316</span>
<span class="normal">317</span>
<span class="normal">318</span>
<span class="normal">319</span>
<span class="normal">320</span>
<span class="normal">321</span>
<span class="normal">322</span>
<span class="normal">323</span>
<span class="normal">324</span>
<span class="normal">325</span>
<span class="normal">326</span>
<span class="normal">327</span>
<span class="normal">328</span>
<span class="normal">329</span>
<span class="normal">330</span>
<span class="normal">331</span>
<span class="normal">332</span>
<span class="normal">333</span>
<span class="normal">334</span>
<span class="normal">335</span>
<span class="normal">336</span></pre></div></td><td class="code"><div><pre><span></span><code><span id="__span-0-183"><span class="k">def</span><span class="w"> </span><span class="nf">function_tool</span><span class="p">(</span>
</span><span id="__span-0-184"> <span class="n">func</span><span class="p">:</span> <span class="n">ToolFunction</span><span class="p">[</span><span class="o">...</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-185"> <span class="o">*</span><span class="p">,</span>
</span><span id="__span-0-186"> <span class="n">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-187"> <span class="n">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-188"> <span class="n">docstring_style</span><span class="p">:</span> <span class="n">DocstringStyle</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-189"> <span class="n">use_docstring_info</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-190"> <span class="n">failure_error_function</span><span class="p">:</span> <span class="n">ToolErrorFunction</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="n">default_tool_error_function</span><span class="p">,</span>
</span><span id="__span-0-191"> <span class="n">strict_mode</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
</span><span id="__span-0-192"><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">FunctionTool</span> <span class="o">|</span> <span class="n">Callable</span><span class="p">[[</span><span class="n">ToolFunction</span><span class="p">[</span><span class="o">...</span><span class="p">]],</span> <span class="n">FunctionTool</span><span class="p">]:</span>
</span><span id="__span-0-193"><span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
</span><span id="__span-0-194"><span class="sd"> Decorator to create a FunctionTool from a function. By default, we will:</span>
</span><span id="__span-0-195"><span class="sd"> 1. Parse the function signature to create a JSON schema for the tool&#39;s parameters.</span>
</span><span id="__span-0-196"><span class="sd"> 2. Use the function&#39;s docstring to populate the tool&#39;s description.</span>
</span><span id="__span-0-197"><span class="sd"> 3. Use the function&#39;s docstring to populate argument descriptions.</span>
</span><span id="__span-0-198"><span class="sd"> The docstring style is detected automatically, but you can override it.</span>
</span><span id="__span-0-199">
</span><span id="__span-0-200"><span class="sd"> If the function takes a `RunContextWrapper` as the first argument, it *must* match the</span>
</span><span id="__span-0-201"><span class="sd"> context type of the agent that uses the tool.</span>
</span><span id="__span-0-202">
</span><span id="__span-0-203"><span class="sd"> Args:</span>
</span><span id="__span-0-204"><span class="sd"> func: The function to wrap.</span>
</span><span id="__span-0-205"><span class="sd"> name_override: If provided, use this name for the tool instead of the function&#39;s name.</span>
</span><span id="__span-0-206"><span class="sd"> description_override: If provided, use this description for the tool instead of the</span>
</span><span id="__span-0-207"><span class="sd"> function&#39;s docstring.</span>
</span><span id="__span-0-208"><span class="sd"> docstring_style: If provided, use this style for the tool&#39;s docstring. If not provided,</span>
</span><span id="__span-0-209"><span class="sd"> we will attempt to auto-detect the style.</span>
</span><span id="__span-0-210"><span class="sd"> use_docstring_info: If True, use the function&#39;s docstring to populate the tool&#39;s</span>
</span><span id="__span-0-211"><span class="sd"> description and argument descriptions.</span>
</span><span id="__span-0-212"><span class="sd"> failure_error_function: If provided, use this function to generate an error message when</span>
</span><span id="__span-0-213"><span class="sd"> the tool call fails. The error message is sent to the LLM. If you pass None, then no</span>
</span><span id="__span-0-214"><span class="sd"> error message will be sent and instead an Exception will be raised.</span>
</span><span id="__span-0-215"><span class="sd"> strict_mode: Whether to enable strict mode for the tool&#39;s JSON schema. We *strongly*</span>
</span><span id="__span-0-216"><span class="sd"> recommend setting this to True, as it increases the likelihood of correct JSON input.</span>
</span><span id="__span-0-217"><span class="sd"> If False, it allows non-strict JSON schemas. For example, if a parameter has a default</span>
</span><span id="__span-0-218"><span class="sd"> value, it will be optional, additional properties are allowed, etc. See here for more:</span>
</span><span id="__span-0-219"><span class="sd"> https://platform.openai.com/docs/guides/structured-outputs?api-mode=responses#supported-schemas</span>
</span><span id="__span-0-220"><span class="sd"> &quot;&quot;&quot;</span>
</span><span id="__span-0-221">
</span><span id="__span-0-222"> <span class="k">def</span><span class="w"> </span><span class="nf">_create_function_tool</span><span class="p">(</span><span class="n">the_func</span><span class="p">:</span> <span class="n">ToolFunction</span><span class="p">[</span><span class="o">...</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">FunctionTool</span><span class="p">:</span>
</span><span id="__span-0-223"> <span class="n">schema</span> <span class="o">=</span> <span class="n">function_schema</span><span class="p">(</span>
</span><span id="__span-0-224"> <span class="n">func</span><span class="o">=</span><span class="n">the_func</span><span class="p">,</span>
</span><span id="__span-0-225"> <span class="n">name_override</span><span class="o">=</span><span class="n">name_override</span><span class="p">,</span>
</span><span id="__span-0-226"> <span class="n">description_override</span><span class="o">=</span><span class="n">description_override</span><span class="p">,</span>
</span><span id="__span-0-227"> <span class="n">docstring_style</span><span class="o">=</span><span class="n">docstring_style</span><span class="p">,</span>
</span><span id="__span-0-228"> <span class="n">use_docstring_info</span><span class="o">=</span><span class="n">use_docstring_info</span><span class="p">,</span>
</span><span id="__span-0-229"> <span class="n">strict_json_schema</span><span class="o">=</span><span class="n">strict_mode</span><span class="p">,</span>
</span><span id="__span-0-230"> <span class="p">)</span>
</span><span id="__span-0-231">
</span><span id="__span-0-232"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_on_invoke_tool_impl</span><span class="p">(</span><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="nb">input</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="__span-0-233"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-234"> <span class="n">json_data</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="k">if</span> <span class="nb">input</span> <span class="k">else</span> <span class="p">{}</span>
</span><span id="__span-0-235"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-236"> <span class="k">if</span> <span class="n">_debug</span><span class="o">.</span><span class="n">DONT_LOG_TOOL_DATA</span><span class="p">:</span>
</span><span id="__span-0-237"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid JSON input for tool </span><span class="si">{</span><span class="n">schema</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-238"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-239"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid JSON input for tool </span><span class="si">{</span><span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">input</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-240"> <span class="k">raise</span> <span class="n">ModelBehaviorError</span><span class="p">(</span>
</span><span id="__span-0-241"> <span class="sa">f</span><span class="s2">&quot;Invalid JSON input for tool </span><span class="si">{</span><span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">input</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span id="__span-0-242"> <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="__span-0-243">
</span><span id="__span-0-244"> <span class="c1"># Filter out None values so that function defaults are used</span>
</span><span id="__span-0-245"> <span class="c1"># LLMs may generate explicit null/None or string &quot;None&quot; for optional parameters</span>
</span><span id="__span-0-246"> <span class="n">json_data</span> <span class="o">=</span> <span class="p">{</span>
</span><span id="__span-0-247"> <span class="n">k</span><span class="p">:</span> <span class="n">v</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">json_data</span><span class="o">.</span><span class="n">items</span><span class="p">()</span>
</span><span id="__span-0-248"> <span class="k">if</span> <span class="n">v</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">v</span> <span class="o">!=</span> <span class="s2">&quot;None&quot;</span>
</span><span id="__span-0-249"> <span class="p">}</span>
</span><span id="__span-0-250">
</span><span id="__span-0-251"> <span class="k">if</span> <span class="n">_debug</span><span class="o">.</span><span class="n">DONT_LOG_TOOL_DATA</span><span class="p">:</span>
</span><span id="__span-0-252"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invoking tool </span><span class="si">{</span><span class="n">schema</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-253"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-254"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invoking tool </span><span class="si">{</span><span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> with input </span><span class="si">{</span><span class="nb">input</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-255">
</span><span id="__span-0-256"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-257"> <span class="n">parsed</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-0-258"> <span class="n">schema</span><span class="o">.</span><span class="n">params_pydantic_model</span><span class="p">(</span><span class="o">**</span><span class="n">json_data</span><span class="p">)</span>
</span><span id="__span-0-259"> <span class="k">if</span> <span class="n">json_data</span>
</span><span id="__span-0-260"> <span class="k">else</span> <span class="n">schema</span><span class="o">.</span><span class="n">params_pydantic_model</span><span class="p">()</span>
</span><span id="__span-0-261"> <span class="p">)</span>
</span><span id="__span-0-262"> <span class="k">except</span> <span class="n">ValidationError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-263"> <span class="k">raise</span> <span class="n">ModelBehaviorError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid JSON input for tool </span><span class="si">{</span><span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
</span><span id="__span-0-264">
</span><span id="__span-0-265"> <span class="n">args</span><span class="p">,</span> <span class="n">kwargs_dict</span> <span class="o">=</span> <span class="n">schema</span><span class="o">.</span><span class="n">to_call_args</span><span class="p">(</span><span class="n">parsed</span><span class="p">)</span>
</span><span id="__span-0-266">
</span><span id="__span-0-267"> <span class="k">if</span> <span class="ow">not</span> <span class="n">_debug</span><span class="o">.</span><span class="n">DONT_LOG_TOOL_DATA</span><span class="p">:</span>
</span><span id="__span-0-268"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Tool call args: </span><span class="si">{</span><span class="n">args</span><span class="si">}</span><span class="s2">, kwargs: </span><span class="si">{</span><span class="n">kwargs_dict</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-269">
</span><span id="__span-0-270"> <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">the_func</span><span class="p">):</span>
</span><span id="__span-0-271"> <span class="k">if</span> <span class="n">schema</span><span class="o">.</span><span class="n">takes_context</span><span class="p">:</span>
</span><span id="__span-0-272"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">the_func</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs_dict</span><span class="p">)</span>
</span><span id="__span-0-273"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-274"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">the_func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs_dict</span><span class="p">)</span>
</span><span id="__span-0-275"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-276"> <span class="c1"># Run synchronous functions in a thread pool to avoid blocking the event loop</span>
</span><span id="__span-0-277"> <span class="kn">import</span><span class="w"> </span><span class="nn">asyncio</span>
</span><span id="__span-0-278"> <span class="kn">import</span><span class="w"> </span><span class="nn">functools</span>
</span><span id="__span-0-279">
</span><span id="__span-0-280"> <span class="k">if</span> <span class="n">schema</span><span class="o">.</span><span class="n">takes_context</span><span class="p">:</span>
</span><span id="__span-0-281"> <span class="n">func_with_args</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span><span class="n">the_func</span><span class="p">,</span> <span class="n">ctx</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs_dict</span><span class="p">)</span>
</span><span id="__span-0-282"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-283"> <span class="n">func_with_args</span> <span class="o">=</span> <span class="n">functools</span><span class="o">.</span><span class="n">partial</span><span class="p">(</span><span class="n">the_func</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs_dict</span><span class="p">)</span>
</span><span id="__span-0-284">
</span><span id="__span-0-285"> <span class="c1"># Run in thread pool executor to prevent blocking</span>
</span><span id="__span-0-286"> <span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">get_event_loop</span><span class="p">()</span>
</span><span id="__span-0-287"> <span class="n">result</span> <span class="o">=</span> <span class="k">await</span> <span class="n">loop</span><span class="o">.</span><span class="n">run_in_executor</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">func_with_args</span><span class="p">)</span>
</span><span id="__span-0-288">
</span><span id="__span-0-289"> <span class="k">if</span> <span class="n">_debug</span><span class="o">.</span><span class="n">DONT_LOG_TOOL_DATA</span><span class="p">:</span>
</span><span id="__span-0-290"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Tool </span><span class="si">{</span><span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> completed.&quot;</span><span class="p">)</span>
</span><span id="__span-0-291"> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-0-292"> <span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Tool </span><span class="si">{</span><span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s2"> returned </span><span class="si">{</span><span class="n">truncate_for_logging</span><span class="p">(</span><span class="n">result</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span id="__span-0-293">
</span><span id="__span-0-294"> <span class="k">return</span> <span class="n">result</span>
</span><span id="__span-0-295">
</span><span id="__span-0-296"> <span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">_on_invoke_tool</span><span class="p">(</span><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="nb">input</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Any</span><span class="p">:</span>
</span><span id="__span-0-297"> <span class="k">try</span><span class="p">:</span>
</span><span id="__span-0-298"> <span class="k">return</span> <span class="k">await</span> <span class="n">_on_invoke_tool_impl</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="nb">input</span><span class="p">)</span>
</span><span id="__span-0-299"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
</span><span id="__span-0-300"> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">UserCancelledCommand</span><span class="p">):</span>
</span><span id="__span-0-301"> <span class="k">raise</span>
</span><span id="__span-0-302"> <span class="k">if</span> <span class="n">failure_error_function</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
</span><span id="__span-0-303"> <span class="k">raise</span>
</span><span id="__span-0-304">
</span><span id="__span-0-305"> <span class="n">result</span> <span class="o">=</span> <span class="n">failure_error_function</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">e</span><span class="p">)</span>
</span><span id="__span-0-306"> <span class="k">if</span> <span class="n">inspect</span><span class="o">.</span><span class="n">isawaitable</span><span class="p">(</span><span class="n">result</span><span class="p">):</span>
</span><span id="__span-0-307"> <span class="k">return</span> <span class="k">await</span> <span class="n">result</span>
</span><span id="__span-0-308">
</span><span id="__span-0-309"> <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-310"> <span class="n">SpanError</span><span class="p">(</span>
</span><span id="__span-0-311"> <span class="n">message</span><span class="o">=</span><span class="s2">&quot;Error running tool (non-fatal)&quot;</span><span class="p">,</span>
</span><span id="__span-0-312"> <span class="n">data</span><span class="o">=</span><span class="p">{</span>
</span><span id="__span-0-313"> <span class="s2">&quot;tool_name&quot;</span><span class="p">:</span> <span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-314"> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span>
</span><span id="__span-0-315"> <span class="p">},</span>
</span><span id="__span-0-316"> <span class="p">)</span>
</span><span id="__span-0-317"> <span class="p">)</span>
</span><span id="__span-0-318"> <span class="k">return</span> <span class="n">result</span>
</span><span id="__span-0-319">
</span><span id="__span-0-320"> <span class="k">return</span> <span class="n">FunctionTool</span><span class="p">(</span>
</span><span id="__span-0-321"> <span class="n">name</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
</span><span id="__span-0-322"> <span class="n">description</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">description</span> <span class="ow">or</span> <span class="s2">&quot;&quot;</span><span class="p">,</span>
</span><span id="__span-0-323"> <span class="n">params_json_schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">params_json_schema</span><span class="p">,</span>
</span><span id="__span-0-324"> <span class="n">on_invoke_tool</span><span class="o">=</span><span class="n">_on_invoke_tool</span><span class="p">,</span>
</span><span id="__span-0-325"> <span class="n">strict_json_schema</span><span class="o">=</span><span class="n">strict_mode</span><span class="p">,</span>
</span><span id="__span-0-326"> <span class="p">)</span>
</span><span id="__span-0-327">
</span><span id="__span-0-328"> <span class="c1"># If func is actually a callable, we were used as @function_tool with no parentheses</span>
</span><span id="__span-0-329"> <span class="k">if</span> <span class="nb">callable</span><span class="p">(</span><span class="n">func</span><span class="p">):</span>
</span><span id="__span-0-330"> <span class="k">return</span> <span class="n">_create_function_tool</span><span class="p">(</span><span class="n">func</span><span class="p">)</span>
</span><span id="__span-0-331">
</span><span id="__span-0-332"> <span class="c1"># Otherwise, we were used as @function_tool(...), so return a decorator</span>
</span><span id="__span-0-333"> <span class="k">def</span><span class="w"> </span><span class="nf">decorator</span><span class="p">(</span><span class="n">real_func</span><span class="p">:</span> <span class="n">ToolFunction</span><span class="p">[</span><span class="o">...</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">FunctionTool</span><span class="p">:</span>
</span><span id="__span-0-334"> <span class="k">return</span> <span class="n">_create_function_tool</span><span class="p">(</span><span class="n">real_func</span><span class="p">)</span>
</span><span id="__span-0-335">
</span><span id="__span-0-336"> <span class="k">return</span> <span class="n">decorator</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>