Tools
एक tool एक नाम वाली कार्रवाई है जिसे AI कॉल कर सकता है, टाइप किए गए इनपुट के साथ — जैसेsend_email(to, subject, body)। Tools को एक skill के tools.ts में घोषित किया जाता है और, जिन tools को आपका app serve करता है, उन्हें आपके किसी एक component में एक HTTP route द्वारा समर्थित किया जाता है। यह पृष्ठ tool contract के लिए सत्य का स्रोत है; Skills में tools.ts कहाँ रहता है यह बताया गया है।
Tool घोषित करना
tools.ts में प्रत्येक entry में एक provider-safe name, एक friendly displayName, एक description, एक Zod input schema, और एक target होता है जो बताता है कि Kazzle क्या invoke करता है।
Targets
target एक tool या required-action button के लिए पुन: प्रयोग करने योग्य पता है। एक direct AI tool call और एक button click एक ही target object का उपयोग कर सकते हैं, इसलिए दोनों एक ही code चलाते हैं।
HTTP targets एक ही request fields का उपयोग करते हैं:
body: '${input}' लिखें।
References
Kazzle dispatch से पहले HTTP targetquery, headers, body, और url fields में references को resolve करता है:
${input}— पूरा tool input, या पूरा button input।${input.path}— input से एक nested value।${env.NAME}— owning app component के declaredenv.collection+env.environmentसे एक named environment variable।
${input.name} text की आवश्यकता हो तो $${input.name} का उपयोग करें।
Handler request
एकapp target के लिए, target component में matching route जोड़ें। body: '${input}' के साथ, Kazzle typed input को JSON body के रूप में भेजता है:
app targets को यह भी मिलते हैं:
App targets
headers के माध्यम से Authorization set नहीं कर सकते; Kazzle उस header का मालिक है। जब handler को thread vs Tools API को branch करना चाहिए तो @kazzle/app/tools से toolContext(req) के साथ context को पढ़ें।
एक tool जो कोई matching route के साथ घोषित किया गया है वह कुछ भी उपयोगी नहीं करता — दोनों को एक साथ जोड़ें। tools.json समर्थित नहीं है; यदि app compiler को एक मिलता है तो वह fail हो जाता है।
Handler response
Plain text, या JSON को तीन channels तक return करें:content— plain result जिसे AI पढ़ता है (model को feed किया जाता है)। Required।markdown— optional। एक short rich-text summary जो tool card में render होता है (react-markdown; raw HTML escaped है)। एक sentence, एक small list, एक inline link के लिए अच्छा है। एक bare relative path dead preformatted text के रूप में render होता है — links absolute होने चाहिए।embedUrl— optional। एक absolute URL जिसे आपका app serve करता है; card इसे एक sandboxed iframe में render करता है। यह है कि आप एक real, full-width UI कैसे दिखाते हैं — एक connect screen, एक dashboard, एक chart। आपका app page को host और own करता है, इसलिए यह आपने अपने backend, cookies, और OAuth के विरुद्ध पूरी तरह interactive हो सकता है। कुछ भी drive में नहीं लिखा जाता है।
embedUrl जब दोनों set हों तो markdown को जीतता है। हमेशा एक meaningful content रखें — वह है जो AI पढ़ता है।
Required action
एक app tool thread को pause कर सकता है जब इसे एक user (या device) action की आवश्यकता होती है।type: 'action_required' को एक card title और buttons के साथ return करें। केवल तब valid है जब toolContext(req).source === 'thread' — Tools API (source: 'api') के ऊपर, एक normal domain error return करें।
/chat/resume के माध्यम से resume करता है। Matching clients को author buttons दिखाई देते हैं; non-matching clients को अभी भी Skip/Cancel plus “Continue on ” दिखाई देता है। target के बिना एक button अपने input को tool result के रूप में submit करता है। target के साथ एक button पहले उस target को चलाता है, फिर target result को tool result के रूप में उपयोग करता है।
Rich UI — एक app-hosted page को embed करें
जब एक tool का result visual या interactive हो (एक connect screen, एक chart, एक summary dashboard), तो page को अपने किसी एक component से serve करें और इसका absolute URLembedUrl के रूप में return करें। URL को injected component URL से build करें — कभी relative path नहीं।
embedUrl को prefer करें: आपका app पहले से ही pages serve करता है, UI interactive और आपके code के साथ versioned रहता है, और कोई भी per-call artifacts कहीं भी नहीं लिखे जाते हैं।