1+
2+
3+ <!DOCTYPE html>
4+ < html class ="writer-html5 " lang ="en " data-content_root ="../../../../ ">
5+ < head >
6+ < meta charset ="utf-8 " />
7+ < meta name ="viewport " content ="width=device-width, initial-scale=1.0 " />
8+ < title > agentopera.chatflow.base.handoff — AgentOpera API References 0.1.0 documentation</ title >
9+ < link rel ="stylesheet " type ="text/css " href ="../../../../_static/pygments.css?v=b86133f3 " />
10+ < link rel ="stylesheet " type ="text/css " href ="../../../../_static/css/theme.css?v=e59714d7 " />
11+
12+
13+ < script src ="../../../../_static/jquery.js?v=5d32c60e "> </ script >
14+ < script src ="../../../../_static/_sphinx_javascript_frameworks_compat.js?v=2cd50e6c "> </ script >
15+ < script src ="../../../../_static/documentation_options.js?v=01f34227 "> </ script >
16+ < script src ="../../../../_static/doctools.js?v=888ff710 "> </ script >
17+ < script src ="../../../../_static/sphinx_highlight.js?v=dc90522c "> </ script >
18+ < script src ="../../../../_static/js/theme.js "> </ script >
19+ < link rel ="index " title ="Index " href ="../../../../genindex.html " />
20+ < link rel ="search " title ="Search " href ="../../../../search.html " />
21+ </ head >
22+
23+ < body class ="wy-body-for-nav ">
24+ < div class ="wy-grid-for-nav ">
25+ < nav data-toggle ="wy-nav-shift " class ="wy-nav-side ">
26+ < div class ="wy-side-scroll ">
27+ < div class ="wy-side-nav-search " >
28+
29+
30+
31+ < a href ="../../../../index.html " class ="icon icon-home ">
32+ AgentOpera API References
33+ </ a >
34+ < div role ="search ">
35+ < form id ="rtd-search-form " class ="wy-form " action ="../../../../search.html " method ="get ">
36+ < input type ="text " name ="q " placeholder ="Search docs " aria-label ="Search docs " />
37+ < input type ="hidden " name ="check_keywords " value ="yes " />
38+ < input type ="hidden " name ="area " value ="default " />
39+ </ form >
40+ </ div >
41+ </ div > < div class ="wy-menu wy-menu-vertical " data-spy ="affix " role ="navigation " aria-label ="Navigation menu ">
42+ < p class ="caption " role ="heading "> < span class ="caption-text "> Chatflow Module</ span > </ p >
43+ < ul >
44+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.html "> chatflow</ a > </ li >
45+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.agents.html "> chatflow.agents</ a > </ li >
46+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.base.html "> chatflow.base</ a > </ li >
47+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.conditions.html "> chatflow.conditions</ a > </ li >
48+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.media.html "> chatflow.media</ a > </ li >
49+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.state.html "> chatflow.state</ a > </ li >
50+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.team.html "> chatflow.team</ a > </ li >
51+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.ui.html "> chatflow.ui</ a > </ li >
52+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../chatflow/chatflow.utils.html "> chatflow.utils</ a > </ li >
53+ </ ul >
54+ < p class ="caption " role ="heading "> < span class ="caption-text "> Engine Module</ span > </ p >
55+ < ul >
56+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../engine/engine.html "> engine</ a > </ li >
57+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../engine/engine.agent.html "> engine.agent</ a > </ li >
58+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../engine/engine.function_call.html "> engine.function_call</ a > </ li >
59+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../engine/engine.protocol.html "> engine.protocol</ a > </ li >
60+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../engine/engine.runtime.html "> engine.runtime</ a > </ li >
61+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../engine/engine.telemetry.html "> engine.telemetry</ a > </ li >
62+ < li class ="toctree-l1 "> < a class ="reference internal " href ="../../../../engine/engine.types.html "> engine.types</ a > </ li >
63+ </ ul >
64+
65+ </ div >
66+ </ div >
67+ </ nav >
68+
69+ < section data-toggle ="wy-nav-shift " class ="wy-nav-content-wrap "> < nav class ="wy-nav-top " aria-label ="Mobile navigation menu " >
70+ < i data-toggle ="wy-nav-top " class ="fa fa-bars "> </ i >
71+ < a href ="../../../../index.html "> AgentOpera API References</ a >
72+ </ nav >
73+
74+ < div class ="wy-nav-content ">
75+ < div class ="rst-content ">
76+ < div role ="navigation " aria-label ="Page navigation ">
77+ < ul class ="wy-breadcrumbs ">
78+ < li > < a href ="../../../../index.html " class ="icon icon-home " aria-label ="Home "> </ a > </ li >
79+ < li class ="breadcrumb-item "> < a href ="../../../index.html "> Module code</ a > </ li >
80+ < li class ="breadcrumb-item active "> agentopera.chatflow.base.handoff</ li >
81+ < li class ="wy-breadcrumbs-aside ">
82+ </ li >
83+ </ ul >
84+ < hr />
85+ </ div >
86+ < div role ="main " class ="document " itemscope ="itemscope " itemtype ="http://schema.org/Article ">
87+ < div itemprop ="articleBody ">
88+
89+ < h1 > Source code for agentopera.chatflow.base.handoff</ h1 > < div class ="highlight "> < pre >
90+ < span > </ span > < span class ="kn "> import</ span > < span class ="w "> </ span > < span class ="nn "> logging</ span >
91+ < span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> typing</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> Any</ span > < span class ="p "> ,</ span > < span class ="n "> Dict</ span >
92+
93+ < span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> agentopera.engine.function_call</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> BaseTool</ span > < span class ="p "> ,</ span > < span class ="n "> FunctionTool</ span >
94+ < span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> pydantic</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> BaseModel</ span > < span class ="p "> ,</ span > < span class ="n "> Field</ span > < span class ="p "> ,</ span > < span class ="n "> model_validator</ span >
95+
96+ < span class ="kn "> from</ span > < span class ="w "> </ span > < span class ="nn "> ..</ span > < span class ="w "> </ span > < span class ="kn "> import</ span > < span class ="n "> EVENT_LOGGER_NAME</ span >
97+
98+ < span class ="n "> event_logger</ span > < span class ="o "> =</ span > < span class ="n "> logging</ span > < span class ="o "> .</ span > < span class ="n "> getLogger</ span > < span class ="p "> (</ span > < span class ="n "> EVENT_LOGGER_NAME</ span > < span class ="p "> )</ span >
99+
100+
101+ < div class ="viewcode-block " id ="Handoff ">
102+ < a class ="viewcode-back " href ="../../../../chatflow/chatflow.base.html#agentopera.chatflow.base.Handoff "> [docs]</ a >
103+ < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> Handoff</ span > < span class ="p "> (</ span > < span class ="n "> BaseModel</ span > < span class ="p "> ):</ span >
104+ < span class ="w "> </ span > < span class ="sd "> """Handoff configuration."""</ span >
105+
106+ < span class ="n "> target</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span >
107+ < span class ="w "> </ span > < span class ="sd "> """The name of the target agent to handoff to."""</ span >
108+
109+ < span class ="n "> description</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> =</ span > < span class ="n "> Field</ span > < span class ="p "> (</ span > < span class ="n "> default</ span > < span class ="o "> =</ span > < span class ="s2 "> ""</ span > < span class ="p "> )</ span >
110+ < span class ="w "> </ span > < span class ="sd "> """The description of the handoff such as the condition under which it should happen and the target agent's ability.</ span >
111+ < span class ="sd "> If not provided, it is generated from the target agent's name."""</ span >
112+
113+ < span class ="n "> name</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> =</ span > < span class ="n "> Field</ span > < span class ="p "> (</ span > < span class ="n "> default</ span > < span class ="o "> =</ span > < span class ="s2 "> ""</ span > < span class ="p "> )</ span >
114+ < span class ="w "> </ span > < span class ="sd "> """The name of this handoff configuration. If not provided, it is generated from the target agent's name."""</ span >
115+
116+ < span class ="n "> message</ span > < span class ="p "> :</ span > < span class ="nb "> str</ span > < span class ="o "> =</ span > < span class ="n "> Field</ span > < span class ="p "> (</ span > < span class ="n "> default</ span > < span class ="o "> =</ span > < span class ="s2 "> ""</ span > < span class ="p "> )</ span >
117+ < span class ="w "> </ span > < span class ="sd "> """The message to the target agent.</ span >
118+ < span class ="sd "> If not provided, it is generated from the target agent's name."""</ span >
119+
120+ < div class ="viewcode-block " id ="Handoff.set_defaults ">
121+ < a class ="viewcode-back " href ="../../../../chatflow/chatflow.base.html#agentopera.chatflow.base.Handoff.set_defaults "> [docs]</ a >
122+ < span class ="nd "> @model_validator</ span > < span class ="p "> (</ span > < span class ="n "> mode</ span > < span class ="o "> =</ span > < span class ="s2 "> "before"</ span > < span class ="p "> )</ span >
123+ < span class ="nd "> @classmethod</ span >
124+ < span class ="k "> def</ span > < span class ="w "> </ span > < span class ="nf "> set_defaults</ span > < span class ="p "> (</ span > < span class ="bp "> cls</ span > < span class ="p "> ,</ span > < span class ="n "> values</ span > < span class ="p "> :</ span > < span class ="n "> 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 "> Dict</ span > < span class ="p "> [</ span > < span class ="nb "> str</ span > < span class ="p "> ,</ span > < span class ="n "> Any</ span > < span class ="p "> ]:</ span >
125+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> values</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span > < span class ="s2 "> "description"</ span > < span class ="p "> ):</ span >
126+ < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s2 "> "description"</ span > < span class ="p "> ]</ span > < span class ="o "> =</ span > < span class ="sa "> f</ span > < span class ="s2 "> "Handoff to </ span > < span class ="si "> {</ span > < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s1 "> 'target'</ span > < span class ="p "> ]</ span > < span class ="si "> }</ span > < span class ="s2 "> ."</ span >
127+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> values</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span > < span class ="s2 "> "name"</ span > < span class ="p "> ):</ span >
128+ < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s2 "> "name"</ span > < span class ="p "> ]</ span > < span class ="o "> =</ span > < span class ="sa "> f</ span > < span class ="s2 "> "transfer_to_</ span > < span class ="si "> {</ span > < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s1 "> 'target'</ span > < span class ="p "> ]</ span > < span class ="si "> }</ span > < span class ="s2 "> "</ span > < span class ="o "> .</ span > < span class ="n "> lower</ span > < span class ="p "> ()</ span >
129+ < span class ="k "> else</ span > < span class ="p "> :</ span >
130+ < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s2 "> "name"</ span > < span class ="p "> ]</ span >
131+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="nb "> isinstance</ span > < span class ="p "> (</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="nb "> str</ span > < span class ="p "> ):</ span >
132+ < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="sa "> f</ span > < span class ="s2 "> "Handoff name must be a string: </ span > < span class ="si "> {</ span > < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s1 "> 'name'</ span > < span class ="p "> ]</ span > < span class ="si "> }</ span > < span class ="s2 "> "</ span > < span class ="p "> )</ span >
133+ < span class ="c1 "> # Check if name is a valid identifier.</ span >
134+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> name</ span > < span class ="o "> .</ span > < span class ="n "> isidentifier</ span > < span class ="p "> ():</ span >
135+ < span class ="k "> raise</ span > < span class ="ne "> ValueError</ span > < span class ="p "> (</ span > < span class ="sa "> f</ span > < span class ="s2 "> "Handoff name must be a valid identifier: </ span > < span class ="si "> {</ span > < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s1 "> 'name'</ span > < span class ="p "> ]</ span > < span class ="si "> }</ span > < span class ="s2 "> "</ span > < span class ="p "> )</ span >
136+ < span class ="k "> if</ span > < span class ="ow "> not</ span > < span class ="n "> values</ span > < span class ="o "> .</ span > < span class ="n "> get</ span > < span class ="p "> (</ span > < span class ="s2 "> "message"</ span > < span class ="p "> ):</ span >
137+ < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s2 "> "message"</ span > < span class ="p "> ]</ span > < span class ="o "> =</ span > < span class ="p "> (</ span >
138+ < span class ="sa "> f</ span > < span class ="s2 "> "Transferred to </ span > < span class ="si "> {</ span > < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s1 "> 'target'</ span > < span class ="p "> ]</ span > < span class ="si "> }</ span > < span class ="s2 "> , adopting the role of </ span > < span class ="si "> {</ span > < span class ="n "> values</ span > < span class ="p "> [</ span > < span class ="s1 "> 'target'</ span > < span class ="p "> ]</ span > < span class ="si "> }</ span > < span class ="s2 "> immediately."</ span >
139+ < span class ="p "> )</ span >
140+ < span class ="k "> return</ span > < span class ="n "> values</ span > </ div >
141+
142+
143+ < span class ="nd "> @property</ span >
144+ < span class ="k "> def</ span > < span class ="w "> </ span > < span class ="nf "> handoff_tool</ span > < span class ="p "> (</ span > < span class ="bp "> self</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="n "> BaseTool</ span > < span class ="p "> [</ span > < span class ="n "> BaseModel</ span > < span class ="p "> ,</ span > < span class ="n "> BaseModel</ span > < span class ="p "> ]:</ span >
145+ < span class ="w "> </ span > < span class ="sd "> """Create a handoff tool from this handoff configuration."""</ span >
146+
147+ < span class ="k "> def</ span > < span class ="w "> </ span > < span class ="nf "> _handoff_tool</ span > < span class ="p "> ()</ span > < span class ="o "> -></ span > < span class ="nb "> str</ span > < span class ="p "> :</ span >
148+ < span class ="k "> return</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> message</ span >
149+
150+ < span class ="k "> return</ span > < span class ="n "> FunctionTool</ span > < span class ="p "> (</ span > < span class ="n "> _handoff_tool</ span > < span class ="p "> ,</ span > < span class ="n "> name</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> name</ span > < span class ="p "> ,</ span > < span class ="n "> description</ span > < span class ="o "> =</ span > < span class ="bp "> self</ span > < span class ="o "> .</ span > < span class ="n "> description</ span > < span class ="p "> ,</ span > < span class ="n "> strict</ span > < span class ="o "> =</ span > < span class ="kc "> True</ span > < span class ="p "> )</ span > </ div >
151+
152+ </ pre > </ div >
153+
154+ </ div >
155+ </ div >
156+ < footer >
157+
158+ < hr />
159+
160+ < div role ="contentinfo ">
161+ < p > © Copyright 2025, tensoropera.ai.</ p >
162+ </ div >
163+
164+ Built with < a href ="https://www.sphinx-doc.org/ "> Sphinx</ a > using a
165+ < a href ="https://github.com/readthedocs/sphinx_rtd_theme "> theme</ a >
166+ provided by < a href ="https://readthedocs.org "> Read the Docs</ a > .
167+
168+
169+ </ footer >
170+ </ div >
171+ </ div >
172+ </ section >
173+ </ div >
174+ < script >
175+ jQuery ( function ( ) {
176+ SphinxRtdTheme . Navigation . enable ( true ) ;
177+ } ) ;
178+ </ script >
179+
180+ </ body >
181+ </ html >
0 commit comments