Files
2026-09-13 21:55:56 +00:00

8892 lines
306 KiB
HTML

<!--
Copyright 2026 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Build powerful multi-agent systems with Agent Development Kit (ADK)">
<link rel="canonical" href="https://adk.dev/tutorials/multi-tool-agent/">
<link rel="prev" href="../">
<link rel="next" href="../agent-team/">
<link rel="icon" href="../../assets/agent-development-kit.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.0">
<title>Multi-tool agent - Agent Development Kit (ADK)</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.618322db.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.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="../../stylesheets/custom.css">
<link rel="stylesheet" href="../../stylesheets/language-tags.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>
<script id="__analytics">function __md_analytics(){function e(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],e("js",new Date),e("config","G-DKHZS27PHP"),document.addEventListener("DOMContentLoaded",(function(){document.forms.search&&document.forms.search.query.addEventListener("blur",(function(){this.value&&e("event","search",{search_term:this.value})}));document$.subscribe((function(){var t=document.forms.feedback;if(void 0!==t)for(var a of t.querySelectorAll("[type=submit]"))a.addEventListener("click",(function(a){a.preventDefault();var n=document.location.pathname,d=this.getAttribute("data-md-value");e("event","feedback",{page:n,data:d}),t.firstElementChild.disabled=!0;var r=t.querySelector(".md-feedback__note [data-md-value='"+d+"']");r&&(r.hidden=!1)})),t.hidden=!1})),location$.subscribe((function(t){e("config","G-DKHZS27PHP",{page_path:t.pathname})}))}));var t=document.createElement("script");t.async=!0,t.src="https://www.googletagmanager.com/gtag/js?id=G-DKHZS27PHP",document.getElementById("__analytics").insertAdjacentElement("afterEnd",t)}</script>
<script>if("undefined"!=typeof __md_analytics){var consent=__md_get("__consent");consent&&consent.analytics&&__md_analytics()}</script>
<!-- HTML Meta Tags -->
<title>Agent Development Kit (ADK)</title>
<meta name="description" content="Build powerful multi-agent systems with Agent Development Kit (ADK)">
<!-- Facebook Meta Tags -->
<meta property="og:url" content="https://adk.dev">
<meta property="og:type" content="website">
<meta property="og:title" content="Agent Development Kit (ADK)">
<meta property="og:description" content="Build powerful multi-agent systems with Agent Development Kit (ADK)">
<meta property="og:image" content="https://adk.dev/assets/adk-social-card.png">
<!-- Twitter Meta Tags -->
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="adk.dev">
<meta property="twitter:url" content="https://adk.dev">
<meta name="twitter:title" content="Agent Development Kit (ADK)">
<meta name="twitter:description" content="Build powerful multi-agent systems with Agent Development Kit (ADK)">
<meta name="twitter:image" content="https://adk.dev/assets/adk-social-card.png">
<!-- Pagefind search UI. hooks/pagefind.py builds the index and guards both
filenames, so a third asset added here needs adding there too. -->
<link rel="stylesheet" href="../../pagefind/pagefind-component-ui.css">
<script type="module" src="../../pagefind/pagefind-component-ui.js"></script>
<!-- `| url` covers only the assets above. document.currentScript is null in a
module script, so the bundle always fetches its index from the origin
root: correct at a root domain, wrong under a subpath. -->
<!-- Raise termSimilarity so "LlmAgent" beats pages that merely say "agent"
often. Set on pagefindOptions, which is read lazily; configureInstance()
is ignored once the components create the instance on connect. -->
<script type="module">
window.PagefindComponents
.getInstanceManager()
.getInstance("default")
.pagefindOptions.ranking = { termSimilarity: 2.0 };
</script>
<!-- Mirror Material's data-md-color-scheme onto data-pf-theme, the only
thing that switches Pagefind's dark palette. -->
<script>
(function () {
var sync = function () {
var root = document.documentElement;
if (document.body.getAttribute("data-md-color-scheme") === "slate") {
root.setAttribute("data-pf-theme", "dark");
} else {
root.removeAttribute("data-pf-theme");
}
};
document.addEventListener("DOMContentLoaded", function () {
sync();
new MutationObserver(sync).observe(document.body, {
attributes: true,
attributeFilter: ["data-md-color-scheme"],
});
});
})();
</script>
<!-- Upstream bug: reset-on-close clears the results but never the input, so
the next keystroke appends to the old query. Writing through the native
setter keeps the component in step. Delete this once Pagefind fixes it. -->
<script>
(function () {
document.addEventListener("DOMContentLoaded", function () {
var modal = document.querySelector("pagefind-modal");
// Bind once: the modal outlives instant navigation.
if (!modal || modal.dataset.adkPfClearOnClose) return;
modal.dataset.adkPfClearOnClose = "1";
modal.addEventListener(
"close",
function () {
var input =
modal.querySelector("input") ||
(modal.shadowRoot && modal.shadowRoot.querySelector("input"));
if (!input || !input.value) return;
Object.getOwnPropertyDescriptor(
HTMLInputElement.prototype,
"value",
).set.call(input, "");
input.dispatchEvent(
new Event("input", { bubbles: true, composed: true }),
);
},
true, // `close` does not bubble, but capture still reaches it.
);
});
})();
</script>
<!-- Result links are light DOM, so navigation.instant swaps the page without
unloading the header and the modal stays open. document$ emits after every
swap; close() no-ops when the modal is already closed. -->
<script>
(function () {
document.addEventListener("DOMContentLoaded", function () {
if (!window.document$ || window.__adkPagefindCloseOnNav) return;
window.__adkPagefindCloseOnNav = true;
window.document$.subscribe(function () {
var modal = document.querySelector("pagefind-modal");
if (modal && typeof modal.close === "function") modal.close();
});
});
})();
</script>
<!-- Restore the `/` and `s` shortcuts lost with Material's search plugin;
Pagefind's trigger parses one binding only, already spent on mod+k.
Ignore them with a modifier held, while typing, or while already open. -->
<script>
(function () {
if (window.__adkPagefindSearchKeys) return;
window.__adkPagefindSearchKeys = true;
document.addEventListener("keydown", function (event) {
if (event.key !== "/" && event.key !== "s") return;
if (event.ctrlKey || event.metaKey || event.altKey) return;
var target = event.target;
if (target instanceof Element) {
if (target.isContentEditable) return;
if (target.closest("input, textarea, select")) return;
}
var modal = document.querySelector("pagefind-modal");
if (!modal || typeof modal.open !== "function") return;
var dialog = modal.querySelector("dialog");
if (dialog && dialog.open) return;
event.preventDefault();
modal.open();
});
})();
</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="white">
<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="#build-a-multi-tool-agent" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
<aside class="md-banner">
<div class="md-banner__inner md-grid md-typeset">
<span class="announce-item">
<strong>Released!</strong>
<a href="/2.0/">
ADK TypeScript 2.0 GA
</a>
is now available with graph workflows support! <a href="/graphs/#typescript">Get started</a>
</span>
</div>
</aside>
</div>
<!--
Copyright 2025 Google LLC
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- Determine classes -->
<!-- Header -->
<header class="md-header" data-md-component="header">
<nav
class="md-header__inner md-grid"
aria-label="Header"
>
<!-- Link to home -->
<a
href="../.."
title="Agent Development Kit (ADK)"
class="md-header__button md-logo"
aria-label="Agent Development Kit (ADK)"
data-md-component="logo"
>
<img src="../../assets/agent-development-kit.png" alt="logo">
</a>
<!-- Button to open drawer -->
<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>
<!-- Header title -->
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
<a
href="../.."
title="Agent Development Kit (ADK)"
aria-label="Agent Development Kit (ADK)"
data-md-component="logo"
>
Agent Development Kit (ADK)
</a>
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Multi-tool agent
</a>
</span>
</div>
</div>
</div>
<!-- Language SDK repository links -->
<div class="lang-header-repos">
<div class="lang-repos">
<a href="https://github.com/google/adk-python"
title="adk-python on GitHub"
class="lang-item">
<img src="/assets/icon-python.svg"
alt="Python" class="lang-icon" width="24" height="24" />
<span class="lang-label">Python</span>
</a>
<a href="https://github.com/google/adk-js"
title="adk-js on GitHub"
class="lang-item">
<img src="/assets/icon-typescript.svg"
alt="TypeScript" class="lang-icon" width="24" height="24" />
<span class="lang-label">JS</span>
</a>
<a href="https://github.com/google/adk-go"
title="adk-go on GitHub"
class="lang-item">
<img src="/assets/icon-go.svg"
alt="Go" class="lang-icon" width="24" height="24" />
<span class="lang-label">Go</span>
</a>
<a href="https://github.com/google/adk-java"
title="adk-java on GitHub"
class="lang-item">
<img src="/assets/icon-java.svg"
alt="Java" class="lang-icon" width="24" height="24" />
<span class="lang-label">Java</span>
</a>
<a href="https://github.com/google/adk-kotlin"
title="adk-kotlin on GitHub"
class="lang-item">
<img src="/assets/icon-kotlin.svg"
alt="Kotlin" class="lang-icon" width="24" height="24" />
<span class="lang-label">Kotlin</span>
</a>
</div>
</div>
<!-- Color palette toggle -->
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="white" data-md-color-accent="white" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a4 4 0 0 0-4 4 4 4 0 0 0 4 4 4 4 0 0 0 4-4 4 4 0 0 0-4-4m0 10a6 6 0 0 1-6-6 6 6 0 0 1 6-6 6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="grey" data-md-color-accent="grey" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 18c-.89 0-1.74-.2-2.5-.55C11.56 16.5 13 14.42 13 12s-1.44-4.5-3.5-5.45C10.26 6.2 11.11 6 12 6a6 6 0 0 1 6 6 6 6 0 0 1-6 6m8-9.31V4h-4.69L12 .69 8.69 4H4v4.69L.69 12 4 15.31V20h4.69L12 23.31 15.31 20H20v-4.69L23.31 12z"/></svg>
</label>
</form>
<!-- User preference: color palette -->
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<!-- Site language selector -->
<!-- Pagefind search. Both live in the header nav, which survives
navigation.instant DOM swaps, so the modal keeps its state. -->
<pagefind-modal-trigger placeholder="Search"></pagefind-modal-trigger>
<pagefind-modal reset-on-close></pagefind-modal>
</nav>
<!-- Navigation tabs (sticky) -->
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="../../get-started/" class="md-tabs__link">
Build Agents
</a>
</li>
<li class="md-tabs__item">
<a href="../../runtime/" class="md-tabs__link">
Run Agents
</a>
</li>
<li class="md-tabs__item">
<a href="../../get-started/about/" class="md-tabs__link">
Components
</a>
</li>
<li class="md-tabs__item">
<a href="../../integrations/" class="md-tabs__link">
Integrations
</a>
</li>
<li class="md-tabs__item">
<a href="../../api-reference/" class="md-tabs__link">
Reference
</a>
</li>
<li class="md-tabs__item">
<a href="../../community/" class="md-tabs__link">
Community
</a>
</li>
<li class="md-tabs__item">
<a href="../../2.0/" class="md-tabs__link">
ADK 2.0
</a>
</li>
</ul>
</div>
</nav>
<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">
<!--
Copyright (c) 2016-2025 Martin Donath <martin.donath@squidfunk.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
-->
<!-- Determine classes -->
<!-- Navigation -->
<nav
class="md-nav md-nav--primary md-nav--lifted"
aria-label="Navigation"
data-md-level="0"
>
<!-- Repository information -->
<div class="md-nav__source">
<div class="lang-repos">
<a href="https://github.com/google/adk-python"
title="adk-python on GitHub"
class="lang-item">
<img src="/assets/icon-python.svg"
alt="Python" class="lang-icon" width="24" height="24" />
<span class="lang-label">Python</span>
</a>
<a href="https://github.com/google/adk-js"
title="adk-js on GitHub"
class="lang-item">
<img src="/assets/icon-typescript.svg"
alt="TypeScript" class="lang-icon" width="24" height="24" />
<span class="lang-label">JS</span>
</a>
<a href="https://github.com/google/adk-go"
title="adk-go on GitHub"
class="lang-item">
<img src="/assets/icon-go.svg"
alt="Go" class="lang-icon" width="24" height="24" />
<span class="lang-label">Go</span>
</a>
<a href="https://github.com/google/adk-java"
title="adk-java on GitHub"
class="lang-item">
<img src="/assets/icon-java.svg"
alt="Java" class="lang-icon" width="24" height="24" />
<span class="lang-label">Java</span>
</a>
<a href="https://github.com/google/adk-kotlin"
title="adk-kotlin on GitHub"
class="lang-item">
<img src="/assets/icon-kotlin.svg"
alt="Kotlin" class="lang-icon" width="24" height="24" />
<span class="lang-label">Kotlin</span>
</a>
</div>
</div>
<!-- Navigation list -->
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</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_2" checked>
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="">
<span class="md-ellipsis">
Build Agents
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2">
<span class="md-nav__icon md-icon"></span>
Build Agents
</label>
<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 " type="checkbox" id="__nav_2_1" >
<div class="md-nav__link md-nav__container">
<a href="../../get-started/" class="md-nav__link ">
<span class="md-ellipsis">
Get Started
</span>
</a>
<label class="md-nav__link " for="__nav_2_1" id="__nav_2_1_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_1">
<span class="md-nav__icon md-icon"></span>
Get Started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../get-started/python/" class="md-nav__link">
<span class="md-ellipsis">
Python
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/typescript/" class="md-nav__link">
<span class="md-ellipsis">
TypeScript
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/go/" class="md-nav__link">
<span class="md-ellipsis">
Go
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/java/" class="md-nav__link">
<span class="md-ellipsis">
Java
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/kotlin/" class="md-nav__link">
<span class="md-ellipsis">
Kotlin
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/agents-cli/" class="md-nav__link">
<span class="md-ellipsis">
Agents CLI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/installation/" class="md-nav__link">
<span class="md-ellipsis">
Installation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/google-cloud/" class="md-nav__link">
<span class="md-ellipsis">
Google Cloud
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../get-started/migrate/" class="md-nav__link">
<span class="md-ellipsis">
Migrate to ADK
</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_2_2" checked>
<div class="md-nav__link md-nav__container">
<a href="../" class="md-nav__link ">
<span class="md-ellipsis">
Build your Agent
</span>
</a>
<label class="md-nav__link " for="__nav_2_2" id="__nav_2_2_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_2_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_2_2">
<span class="md-nav__icon md-icon"></span>
Build your Agent
</label>
<ul class="md-nav__list" data-md-scrollfix>
<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">
Multi-tool agent
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Multi-tool agent
</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="#set-up-environment-install-adk" class="md-nav__link">
<span class="md-ellipsis">
1. Set up Environment &amp; Install ADK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-a-new-go-module" class="md-nav__link">
<span class="md-ellipsis">
Create a new Go module
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#install-adk" class="md-nav__link">
<span class="md-ellipsis">
Install ADK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-agent-project" class="md-nav__link">
<span class="md-ellipsis">
2. Create Agent Project
</span>
</a>
<nav class="md-nav" aria-label="2. Create Agent Project">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#project-structure" class="md-nav__link">
<span class="md-ellipsis">
Project structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#__init__py" class="md-nav__link">
<span class="md-ellipsis">
__init__.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#agentpy" class="md-nav__link">
<span class="md-ellipsis">
agent.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#env" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#agentts" class="md-nav__link">
<span class="md-ellipsis">
agent.ts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#env_1" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#agentgo" class="md-nav__link">
<span class="md-ellipsis">
agent.go
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#env_2" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-multitoolagentjava" class="md-nav__link">
<span class="md-ellipsis">
Create MultiToolAgent.java
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-multitoolagentkt" class="md-nav__link">
<span class="md-ellipsis">
Create MultiToolAgent.kt
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#set-up-the-model" class="md-nav__link">
<span class="md-ellipsis">
3. Set up the model
</span>
</a>
<nav class="md-nav" aria-label="3. Set up the model">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#model-connection-and-authentication" class="md-nav__link">
<span class="md-ellipsis">
Model connection and authentication
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#run-your-agent" class="md-nav__link">
<span class="md-ellipsis">
4. Run Your Agent
</span>
</a>
<nav class="md-nav" aria-label="4. Run Your Agent">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#run-your-agent_1" class="md-nav__link">
<span class="md-ellipsis">
Run your Agent
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#example-prompts-to-try" class="md-nav__link">
<span class="md-ellipsis">
📝 Example prompts to try
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#congratulations" class="md-nav__link">
<span class="md-ellipsis">
🎉 Congratulations!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
<span class="md-ellipsis">
🛣️ Next steps
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../agent-team/" class="md-nav__link">
<span class="md-ellipsis">
Agent team
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../coding-with-ai/" class="md-nav__link">
<span class="md-ellipsis">
Code with AI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/config/" class="md-nav__link">
<span class="md-ellipsis">
Agent Config
</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 " type="checkbox" id="__nav_2_3" >
<div class="md-nav__link md-nav__container">
<a href="../../agents/" class="md-nav__link ">
<span class="md-ellipsis">
Agents
</span>
</a>
<label class="md-nav__link " for="__nav_2_3" id="__nav_2_3_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_3">
<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="../../agents/llm-agents/" class="md-nav__link">
<span class="md-ellipsis">
Simple agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/managed-agents/" class="md-nav__link">
<span class="md-ellipsis">
Managed agents
</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 " type="checkbox" id="__nav_2_4" >
<div class="md-nav__link md-nav__container">
<a href="../../graphs/" class="md-nav__link ">
<span class="md-ellipsis">
Graph Workflows
</span>
</a>
<label class="md-nav__link " for="__nav_2_4" id="__nav_2_4_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_4">
<span class="md-nav__icon md-icon"></span>
Graph Workflows
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../graphs/routes/" class="md-nav__link">
<span class="md-ellipsis">
Graph routes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../graphs/data-handling/" class="md-nav__link">
<span class="md-ellipsis">
Data handling
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../graphs/human-input/" class="md-nav__link">
<span class="md-ellipsis">
Human input
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../graphs/dynamic/" class="md-nav__link">
<span class="md-ellipsis">
Dynamic workflows
</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 " type="checkbox" id="__nav_2_5" >
<div class="md-nav__link md-nav__container">
<a href="../../workflows/" class="md-nav__link ">
<span class="md-ellipsis">
Multi-Agent Workflows
</span>
</a>
<label class="md-nav__link " for="__nav_2_5" id="__nav_2_5_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5">
<span class="md-nav__icon md-icon"></span>
Multi-Agent Workflows
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../workflows/collaboration/" class="md-nav__link">
<span class="md-ellipsis">
Collaborative workflows
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_2_5_3" >
<div class="md-nav__link md-nav__container">
<a href="../../agents/workflow-agents/" class="md-nav__link ">
<span class="md-ellipsis">
Template workflows
</span>
</a>
<label class="md-nav__link " for="__nav_2_5_3" id="__nav_2_5_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_2_5_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_5_3">
<span class="md-nav__icon md-icon"></span>
Template workflows
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../agents/workflow-agents/sequential-agents/" class="md-nav__link">
<span class="md-ellipsis">
Sequential workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/workflow-agents/loop-agents/" class="md-nav__link">
<span class="md-ellipsis">
Loop workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/workflow-agents/parallel-agents/" class="md-nav__link">
<span class="md-ellipsis">
Parallel workflow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/custom-agents/" class="md-nav__link">
<span class="md-ellipsis">
Custom template workflows
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../agents/routing/" class="md-nav__link">
<span class="md-ellipsis">
Agent routing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../workflows/patterns/" class="md-nav__link">
<span class="md-ellipsis">
Workflow patterns
</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 " type="checkbox" id="__nav_2_6" >
<div class="md-nav__link md-nav__container">
<a href="../../agents/models/" class="md-nav__link ">
<span class="md-ellipsis">
Models for Agents
</span>
</a>
<label class="md-nav__link " for="__nav_2_6" id="__nav_2_6_label" tabindex="">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_2_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_2_6">
<span class="md-nav__icon md-icon"></span>
Models for Agents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../agents/models/google-gemini/" class="md-nav__link">
<span class="md-ellipsis">
Gemini
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/google-gemma/" class="md-nav__link">
<span class="md-ellipsis">
Gemma
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/anthropic/" class="md-nav__link">
<span class="md-ellipsis">
Claude
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/agent-platform/" class="md-nav__link">
<span class="md-ellipsis">
Agent Platform hosted
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/apigee/" class="md-nav__link">
<span class="md-ellipsis">
Apigee AI Gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/routing/" class="md-nav__link">
<span class="md-ellipsis">
Model routing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/openai/" class="md-nav__link">
<span class="md-ellipsis">
OpenAI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/ollama/" class="md-nav__link">
<span class="md-ellipsis">
Ollama
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/vllm/" class="md-nav__link">
<span class="md-ellipsis">
vLLM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/litellm/" class="md-nav__link">
<span class="md-ellipsis">
LiteLLM
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../agents/models/litert-lm/" class="md-nav__link">
<span class="md-ellipsis">
LiteRT-LM
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Run Agents
</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>
Run Agents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1" >
<div class="md-nav__link md-nav__container">
<a href="../../runtime/" class="md-nav__link ">
<span class="md-ellipsis">
Agent Runtime
</span>
</a>
<label class="md-nav__link " for="__nav_3_1" id="__nav_3_1_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1">
<span class="md-nav__icon md-icon"></span>
Agent Runtime
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_1_2" >
<div class="md-nav__link md-nav__container">
<a href="../../runtime/web-interface/" class="md-nav__link ">
<span class="md-ellipsis">
Web Interface
</span>
</a>
<label class="md-nav__link " for="__nav_3_1_2" id="__nav_3_1_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_1_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_1_2">
<span class="md-nav__icon md-icon"></span>
Web Interface
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../visual-builder/" class="md-nav__link">
<span class="md-ellipsis">
Visual Builder
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../runtime/command-line/" class="md-nav__link">
<span class="md-ellipsis">
Command Line
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../runtime/api-server/" class="md-nav__link">
<span class="md-ellipsis">
API Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../runtime/ambient-agents/" class="md-nav__link">
<span class="md-ellipsis">
Ambient Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../runtime/resume/" class="md-nav__link">
<span class="md-ellipsis">
Resume Agents
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../runtime/cancel/" class="md-nav__link">
<span class="md-ellipsis">
Cancel Agent Runs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../runtime/runconfig/" class="md-nav__link">
<span class="md-ellipsis">
Runtime Config
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../runtime/event-loop/" class="md-nav__link">
<span class="md-ellipsis">
Event Loop
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2" >
<div class="md-nav__link md-nav__container">
<a href="../../deploy/" class="md-nav__link ">
<span class="md-ellipsis">
Deployment
</span>
</a>
<label class="md-nav__link " for="__nav_3_2" id="__nav_3_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_2">
<span class="md-nav__icon md-icon"></span>
Deployment
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_2_2" >
<div class="md-nav__link md-nav__container">
<a href="../../deploy/agent-runtime/" class="md-nav__link ">
<span class="md-ellipsis">
Agent Runtime
</span>
</a>
<label class="md-nav__link " for="__nav_3_2_2" id="__nav_3_2_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_3_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_2_2">
<span class="md-nav__icon md-icon"></span>
Agent Runtime
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../deploy/agent-runtime/deploy/" class="md-nav__link">
<span class="md-ellipsis">
Standard deployment
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deploy/agent-runtime/agents-cli/" class="md-nav__link">
<span class="md-ellipsis">
agents-cli
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deploy/agent-runtime/test/" class="md-nav__link">
<span class="md-ellipsis">
Test deployed agents
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../deploy/cloud-run/" class="md-nav__link">
<span class="md-ellipsis">
Cloud Run
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../deploy/gke/" class="md-nav__link">
<span class="md-ellipsis">
GKE
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_3" >
<div class="md-nav__link md-nav__container">
<a href="../../observability/" class="md-nav__link ">
<span class="md-ellipsis">
Observability
</span>
</a>
<label class="md-nav__link " for="__nav_3_3" id="__nav_3_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_3">
<span class="md-nav__icon md-icon"></span>
Observability
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../observability/logging/" class="md-nav__link">
<span class="md-ellipsis">
Logging
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../observability/metrics/" class="md-nav__link">
<span class="md-ellipsis">
Metrics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../observability/traces/" class="md-nav__link">
<span class="md-ellipsis">
Traces
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_4" >
<div class="md-nav__link md-nav__container">
<a href="../../evaluate/" class="md-nav__link ">
<span class="md-ellipsis">
Evaluation
</span>
</a>
<label class="md-nav__link " for="__nav_3_4" id="__nav_3_4_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_4">
<span class="md-nav__icon md-icon"></span>
Evaluation
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../evaluate/criteria/" class="md-nav__link">
<span class="md-ellipsis">
Criteria
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../evaluate/user-sim/" class="md-nav__link">
<span class="md-ellipsis">
User Simulation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../evaluate/environment_simulation/" class="md-nav__link">
<span class="md-ellipsis">
Environment Simulation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../evaluate/custom_metrics/" class="md-nav__link">
<span class="md-ellipsis">
Custom Metrics
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../optimize/" class="md-nav__link">
<span class="md-ellipsis">
Optimization
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3_5" >
<div class="md-nav__link md-nav__container">
<a href="../../safety/" class="md-nav__link ">
<span class="md-ellipsis">
Safety and Security
</span>
</a>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_3_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3_5">
<span class="md-nav__icon md-icon"></span>
Safety and Security
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Components
</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>
Components
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../get-started/about/" class="md-nav__link">
<span class="md-ellipsis">
Technical Overview
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2" >
<div class="md-nav__link md-nav__container">
<a href="../../tools-custom/" class="md-nav__link ">
<span class="md-ellipsis">
Custom Tools
</span>
</a>
<label class="md-nav__link " for="__nav_4_2" id="__nav_4_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_2">
<span class="md-nav__icon md-icon"></span>
Custom Tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_2_2" >
<label class="md-nav__link" for="__nav_4_2_2" id="__nav_4_2_2_label" tabindex="0">
<span class="md-ellipsis">
Function tools
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_2_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_2_2">
<span class="md-nav__icon md-icon"></span>
Function tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../tools-custom/function-tools/" class="md-nav__link">
<span class="md-ellipsis">
Overview
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tools-custom/performance/" class="md-nav__link">
<span class="md-ellipsis">
Tool performance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tools-custom/confirmation/" class="md-nav__link">
<span class="md-ellipsis">
Action confirmations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../tools-custom/mcp-tools/" class="md-nav__link">
<span class="md-ellipsis">
MCP tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tools-custom/openapi-tools/" class="md-nav__link">
<span class="md-ellipsis">
OpenAPI tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tools-custom/authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../tools/limitations/" class="md-nav__link">
<span class="md-ellipsis">
Tool limitations
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_3" >
<div class="md-nav__link md-nav__container">
<a href="../../artifacts/" class="md-nav__link ">
<span class="md-ellipsis">
Artifacts
</span>
</a>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_3">
<span class="md-nav__icon md-icon"></span>
Artifacts
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_4" >
<div class="md-nav__link md-nav__container">
<a href="../../skills/" class="md-nav__link ">
<span class="md-ellipsis">
Skills for Agents
</span>
</a>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_4">
<span class="md-nav__icon md-icon"></span>
Skills for Agents
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_5" >
<div class="md-nav__link md-nav__container">
<a href="../../apps/" class="md-nav__link ">
<span class="md-ellipsis">
App management
</span>
</a>
<label class="md-nav__link " for="__nav_4_5" id="__nav_4_5_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_5">
<span class="md-nav__icon md-icon"></span>
App management
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_5_2" >
<div class="md-nav__link md-nav__container">
<a href="../../callbacks/" class="md-nav__link ">
<span class="md-ellipsis">
Callbacks
</span>
</a>
<label class="md-nav__link " for="__nav_4_5_2" id="__nav_4_5_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_5_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_5_2">
<span class="md-nav__icon md-icon"></span>
Callbacks
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../callbacks/types-of-callbacks/" class="md-nav__link">
<span class="md-ellipsis">
Types of callbacks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../callbacks/design-patterns-and-best-practices/" class="md-nav__link">
<span class="md-ellipsis">
Callback patterns
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../plugins/" class="md-nav__link">
<span class="md-ellipsis">
Plugins
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_6" >
<div class="md-nav__link md-nav__container">
<a href="../../context/" class="md-nav__link ">
<span class="md-ellipsis">
Agent context
</span>
</a>
<label class="md-nav__link " for="__nav_4_6" id="__nav_4_6_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_6">
<span class="md-nav__icon md-icon"></span>
Agent context
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../sessions/" class="md-nav__link">
<span class="md-ellipsis">
Conversational context
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_6_3" >
<div class="md-nav__link md-nav__container">
<a href="../../sessions/session/" class="md-nav__link ">
<span class="md-ellipsis">
Sessions
</span>
</a>
<label class="md-nav__link " for="__nav_4_6_3" id="__nav_4_6_3_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_6_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_6_3">
<span class="md-nav__icon md-icon"></span>
Sessions
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../sessions/session/rewind/" class="md-nav__link">
<span class="md-ellipsis">
Rewind sessions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../sessions/session/migrate/" class="md-nav__link">
<span class="md-ellipsis">
Migrate sessions
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../sessions/state/" class="md-nav__link">
<span class="md-ellipsis">
State
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../events/" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../sessions/memory/" class="md-nav__link">
<span class="md-ellipsis">
Memory
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../context/compaction/" class="md-nav__link">
<span class="md-ellipsis">
Context compression
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../context/caching/" class="md-nav__link">
<span class="md-ellipsis">
Model context caching
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_7" >
<div class="md-nav__link md-nav__container">
<a href="../../mcp/" class="md-nav__link ">
<span class="md-ellipsis">
MCP
</span>
</a>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_7">
<span class="md-nav__icon md-icon"></span>
MCP
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8" >
<div class="md-nav__link md-nav__container">
<a href="../../a2a/" class="md-nav__link ">
<span class="md-ellipsis">
A2A Protocol
</span>
</a>
<label class="md-nav__link " for="__nav_4_8" id="__nav_4_8_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8">
<span class="md-nav__icon md-icon"></span>
A2A Protocol
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../a2a/intro/" class="md-nav__link">
<span class="md-ellipsis">
Introduction to A2A
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8_3" >
<label class="md-nav__link" for="__nav_4_8_3" id="__nav_4_8_3_label" tabindex="0">
<span class="md-ellipsis">
A2A Quickstart (Exposing)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8_3">
<span class="md-nav__icon md-icon"></span>
A2A Quickstart (Exposing)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../a2a/quickstart-exposing/" class="md-nav__link">
<span class="md-ellipsis">
Python
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../a2a/quickstart-exposing-go/" class="md-nav__link">
<span class="md-ellipsis">
Go
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../a2a/quickstart-exposing-java/" class="md-nav__link">
<span class="md-ellipsis">
Java
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_8_4" >
<label class="md-nav__link" for="__nav_4_8_4" id="__nav_4_8_4_label" tabindex="0">
<span class="md-ellipsis">
A2A Quickstart (Consuming)
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_8_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_8_4">
<span class="md-nav__icon md-icon"></span>
A2A Quickstart (Consuming)
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../a2a/quickstart-consuming/" class="md-nav__link">
<span class="md-ellipsis">
Python
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../a2a/quickstart-consuming-go/" class="md-nav__link">
<span class="md-ellipsis">
Go
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../a2a/quickstart-consuming-java/" class="md-nav__link">
<span class="md-ellipsis">
Java
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../a2a/quickstart-consuming-kotlin/" class="md-nav__link">
<span class="md-ellipsis">
Kotlin
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../a2a/a2a-extension/" class="md-nav__link">
<span class="md-ellipsis">
A2A Extension
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9" >
<div class="md-nav__link md-nav__container">
<a href="../../live/" class="md-nav__link ">
<span class="md-ellipsis">
Live and Voice Agents
</span>
</a>
<label class="md-nav__link " for="__nav_4_9" id="__nav_4_9_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_9">
<span class="md-nav__icon md-icon"></span>
Live and Voice Agents
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_2" >
<div class="md-nav__link md-nav__container">
<a href="../../live/get-started/" class="md-nav__link ">
<span class="md-ellipsis">
Get started
</span>
</a>
<label class="md-nav__link " for="__nav_4_9_2" id="__nav_4_9_2_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_2_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_9_2">
<span class="md-nav__icon md-icon"></span>
Get started
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../live/get-started/streaming-python/" class="md-nav__link">
<span class="md-ellipsis">
Python
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../live/get-started/streaming-java/" class="md-nav__link">
<span class="md-ellipsis">
Java
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_3" >
<label class="md-nav__link" for="__nav_4_9_3" id="__nav_4_9_3_label" tabindex="0">
<span class="md-ellipsis">
Building
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_9_3">
<span class="md-nav__icon md-icon"></span>
Building
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../live/workflows/" class="md-nav__link">
<span class="md-ellipsis">
Workflows
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../live/tools/" class="md-nav__link">
<span class="md-ellipsis">
Tools
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../live/sessions/" class="md-nav__link">
<span class="md-ellipsis">
Sessions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../live/events/" class="md-nav__link">
<span class="md-ellipsis">
Events
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../live/audio-video/" class="md-nav__link">
<span class="md-ellipsis">
Audio and video
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../live/configuration/" class="md-nav__link">
<span class="md-ellipsis">
Configuration
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_9_4" >
<label class="md-nav__link" for="__nav_4_9_4" id="__nav_4_9_4_label" tabindex="0">
<span class="md-ellipsis">
Production
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_4_9_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_9_4">
<span class="md-nav__icon md-icon"></span>
Production
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../live/evaluation/" class="md-nav__link">
<span class="md-ellipsis">
Evaluation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../live/custom-server/" class="md-nav__link">
<span class="md-ellipsis">
Build a custom server
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../live/models/" class="md-nav__link">
<span class="md-ellipsis">
Supported models
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4_10" >
<div class="md-nav__link md-nav__container">
<a href="../../grounding/" class="md-nav__link ">
<span class="md-ellipsis">
Grounding
</span>
</a>
<label class="md-nav__link " for="__nav_4_10" id="__nav_4_10_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_4_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4_10">
<span class="md-nav__icon md-icon"></span>
Grounding
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../grounding/google_search_grounding/" class="md-nav__link">
<span class="md-ellipsis">
Google Search Grounding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../grounding/grounding_with_search/" class="md-nav__link">
<span class="md-ellipsis">
Grounding with Search
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<div class="md-nav__link md-nav__container">
<a href="../../integrations/" class="md-nav__link ">
<span class="md-ellipsis">
Integrations
</span>
</a>
</div>
<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>
Integrations
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Reference
</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>
Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_1" >
<div class="md-nav__link md-nav__container">
<a href="../../api-reference/" class="md-nav__link ">
<span class="md-ellipsis">
API Reference
</span>
</a>
<label class="md-nav__link " for="__nav_6_1" id="__nav_6_1_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="2" aria-labelledby="__nav_6_1_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6_1">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../api-reference/python/" class="md-nav__link">
<span class="md-ellipsis">
Python ADK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/typescript/" class="md-nav__link">
<span class="md-ellipsis">
TypeScript ADK
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6_1_4" >
<label class="md-nav__link" for="__nav_6_1_4" id="__nav_6_1_4_label" tabindex="0">
<span class="md-ellipsis">
Go ADK
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="3" aria-labelledby="__nav_6_1_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6_1_4">
<span class="md-nav__icon md-icon"></span>
Go ADK
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="https://pkg.go.dev/google.golang.org/adk/v2" target="_blank" class="md-nav__link">
<span class="md-ellipsis">
Go v2.x
</span>
</a>
</li>
<li class="md-nav__item">
<a href="https://pkg.go.dev/google.golang.org/adk" target="_blank" class="md-nav__link">
<span class="md-ellipsis">
Go v1.x
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../api-reference/java/" class="md-nav__link">
<span class="md-ellipsis">
Java ADK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/kotlin/" class="md-nav__link">
<span class="md-ellipsis">
Kotlin ADK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/cli/" class="md-nav__link">
<span class="md-ellipsis">
CLI Reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/agentconfig/" class="md-nav__link">
<span class="md-ellipsis">
Agent Config Reference
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../api-reference/rest/" class="md-nav__link">
<span class="md-ellipsis">
REST API
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../../release-notes/" class="md-nav__link">
<span class="md-ellipsis">
Release Notes
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
<div class="md-nav__link md-nav__container">
<a href="../../community/" class="md-nav__link ">
<span class="md-ellipsis">
Community
</span>
</a>
<label class="md-nav__link " for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<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>
Community
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../community/contributing-guide/" class="md-nav__link">
<span class="md-ellipsis">
Contributing Guide
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<div class="md-nav__link md-nav__container">
<a href="../../2.0/" class="md-nav__link ">
<span class="md-ellipsis">
ADK 2.0
</span>
</a>
</div>
<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>
ADK 2.0
</label>
<ul class="md-nav__list" data-md-scrollfix>
</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="#set-up-environment-install-adk" class="md-nav__link">
<span class="md-ellipsis">
1. Set up Environment &amp; Install ADK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-a-new-go-module" class="md-nav__link">
<span class="md-ellipsis">
Create a new Go module
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#install-adk" class="md-nav__link">
<span class="md-ellipsis">
Install ADK
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-agent-project" class="md-nav__link">
<span class="md-ellipsis">
2. Create Agent Project
</span>
</a>
<nav class="md-nav" aria-label="2. Create Agent Project">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#project-structure" class="md-nav__link">
<span class="md-ellipsis">
Project structure
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#__init__py" class="md-nav__link">
<span class="md-ellipsis">
__init__.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#agentpy" class="md-nav__link">
<span class="md-ellipsis">
agent.py
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#env" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#agentts" class="md-nav__link">
<span class="md-ellipsis">
agent.ts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#env_1" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#agentgo" class="md-nav__link">
<span class="md-ellipsis">
agent.go
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#env_2" class="md-nav__link">
<span class="md-ellipsis">
.env
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-multitoolagentjava" class="md-nav__link">
<span class="md-ellipsis">
Create MultiToolAgent.java
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#create-multitoolagentkt" class="md-nav__link">
<span class="md-ellipsis">
Create MultiToolAgent.kt
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#set-up-the-model" class="md-nav__link">
<span class="md-ellipsis">
3. Set up the model
</span>
</a>
<nav class="md-nav" aria-label="3. Set up the model">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#model-connection-and-authentication" class="md-nav__link">
<span class="md-ellipsis">
Model connection and authentication
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#run-your-agent" class="md-nav__link">
<span class="md-ellipsis">
4. Run Your Agent
</span>
</a>
<nav class="md-nav" aria-label="4. Run Your Agent">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#run-your-agent_1" class="md-nav__link">
<span class="md-ellipsis">
Run your Agent
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#example-prompts-to-try" class="md-nav__link">
<span class="md-ellipsis">
📝 Example prompts to try
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#congratulations" class="md-nav__link">
<span class="md-ellipsis">
🎉 Congratulations!
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#next-steps" class="md-nav__link">
<span class="md-ellipsis">
🛣️ Next steps
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<nav class="md-path" aria-label="Navigation" >
<ol class="md-path__list">
<li class="md-path__item">
<a href="../.." class="md-path__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-path__item">
<a href="../../get-started/" class="md-path__link">
<span class="md-ellipsis">
Build Agents
</span>
</a>
</li>
<li class="md-path__item">
<a href="../" class="md-path__link">
<span class="md-ellipsis">
Build your Agent
</span>
</a>
</li>
</ol>
</nav>
<article class="md-content__inner md-typeset" data-pagefind-body>
<a href="https://github.com/google/adk-docs/edit/main/docs/tutorials/multi-tool-agent.md" title="Edit this page on GitHub" class="md-content__button md-icon" rel="edit">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M10 20H6V4h7v5h5v3.1l2-2V8l-6-6H6c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h4zm10.2-7c.1 0 .3.1.4.2l1.3 1.3c.2.2.2.6 0 .8l-1 1-2.1-2.1 1-1c.1-.1.2-.2.4-.2m0 3.9L14.1 23H12v-2.1l6.1-6.1z"/></svg>
</a>
<a href="./index.md" title="View this page as Markdown" class="md-content__button md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M17 18c.56 0 1 .44 1 1s-.44 1-1 1-1-.44-1-1 .44-1 1-1m0-3c-2.73 0-5.06 1.66-6 4 .94 2.34 3.27 4 6 4s5.06-1.66 6-4c-.94-2.34-3.27-4-6-4m0 6.5a2.5 2.5 0 0 1-2.5-2.5 2.5 2.5 0 0 1 2.5-2.5 2.5 2.5 0 0 1 2.5 2.5 2.5 2.5 0 0 1-2.5 2.5M9.27 20H6V4h7v5h5v4.07c.7.08 1.36.25 2 .49V8l-6-6H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h4.5a8.2 8.2 0 0 1-1.23-2"/></svg>
</a>
<button id="copy-page-btn" class="md-content__button md-icon" title="Copy page as Markdown" data-url="./index.md">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z"/></svg>
</button>
<h1 id="build-a-multi-tool-agent">Build a multi-tool agent<a class="headerlink" href="#build-a-multi-tool-agent" title="Permanent link">&para;</a></h1>
<div class="language-support-tag">
<span class="lst-supported">Supported in ADK</span><span class="lst-python">Python v0.1.0</span><span class="lst-typescript">TypeScript v0.2.0</span><span class="lst-go">Go v0.1.0</span><span class="lst-java">Java v0.1.0</span><span class="lst-kotlin">Kotlin v0.1.0</span>
</div>
<p>This quickstart guides you through installing Agent Development Kit (ADK),
setting up a basic agent with multiple tools, and running it locally either in
the terminal or in the interactive, browser-based dev UI.</p>
<!-- <img src="../../assets/quickstart.png" alt="Quickstart setup"> -->
<p>This quickstart assumes a local IDE (VS Code, PyCharm, IntelliJ IDEA, etc.) with
Python 3.10+ or Java 17+ and terminal access. This method runs the application
entirely on your machine and is recommended for internal development.</p>
<h2 id="set-up-environment-install-adk">1. Set up Environment &amp; Install ADK<a class="headerlink" href="#set-up-environment-install-adk" title="Permanent link">&para;</a></h2>
<div class="tabbed-set tabbed-alternate" data-tabs="1:5"><input checked="checked" id="python" name="__tabbed_1" type="radio" /><input id="typescript" name="__tabbed_1" type="radio" /><input id="go" name="__tabbed_1" type="radio" /><input id="java" name="__tabbed_1" type="radio" /><input id="kotlin" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="python">Python</label><label for="typescript">TypeScript</label><label for="go">Go</label><label for="java">Java</label><label for="kotlin">Kotlin</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p>Create &amp; Activate Virtual Environment (Recommended):</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="c1"># Create</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>python3<span class="w"> </span>-m<span class="w"> </span>venv<span class="w"> </span>.venv
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="c1"># Activate (each new terminal)</span>
</span><span id="__span-0-4"><a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a><span class="c1"># macOS/Linux: source .venv/bin/activate</span>
</span><span id="__span-0-5"><a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a><span class="c1"># Windows CMD: .venv\Scripts\activate.bat</span>
</span><span id="__span-0-6"><a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a><span class="c1"># Windows PowerShell: .venv\Scripts\Activate.ps1</span>
</span></code></pre></div>
<p>Install ADK:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-1-1"><a id="__codelineno-1-1" name="__codelineno-1-1" href="#__codelineno-1-1"></a>pip<span class="w"> </span>install<span class="w"> </span>google-adk
</span></code></pre></div>
</div>
<div class="tabbed-block">
<p>Create a new project directory, initialize it, and install dependencies:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-2-1"><a id="__codelineno-2-1" name="__codelineno-2-1" href="#__codelineno-2-1"></a>mkdir<span class="w"> </span>my-adk-agent
</span><span id="__span-2-2"><a id="__codelineno-2-2" name="__codelineno-2-2" href="#__codelineno-2-2"></a><span class="nb">cd</span><span class="w"> </span>my-adk-agent
</span><span id="__span-2-3"><a id="__codelineno-2-3" name="__codelineno-2-3" href="#__codelineno-2-3"></a>npm<span class="w"> </span>init<span class="w"> </span>-y
</span><span id="__span-2-4"><a id="__codelineno-2-4" name="__codelineno-2-4" href="#__codelineno-2-4"></a>npm<span class="w"> </span>install<span class="w"> </span>@google/adk<span class="w"> </span>@google/adk-devtools
</span><span id="__span-2-5"><a id="__codelineno-2-5" name="__codelineno-2-5" href="#__codelineno-2-5"></a>npm<span class="w"> </span>install<span class="w"> </span>-D<span class="w"> </span>typescript
</span></code></pre></div>
<p>Create a <code>tsconfig.json</code> file with the following content. This configuration
ensures your project correctly handles modern Node.js modules.</p>
<div class="language-json highlight"><span class="filename">tsconfig.json</span><pre><span></span><code><span id="__span-3-1"><a id="__codelineno-3-1" name="__codelineno-3-1" href="#__codelineno-3-1"></a><span class="p">{</span>
</span><span id="__span-3-2"><a id="__codelineno-3-2" name="__codelineno-3-2" href="#__codelineno-3-2"></a><span class="w"> </span><span class="nt">"compilerOptions"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-3-3"><a id="__codelineno-3-3" name="__codelineno-3-3" href="#__codelineno-3-3"></a><span class="w"> </span><span class="nt">"target"</span><span class="p">:</span><span class="w"> </span><span class="s2">"es2020"</span><span class="p">,</span>
</span><span id="__span-3-4"><a id="__codelineno-3-4" name="__codelineno-3-4" href="#__codelineno-3-4"></a><span class="w"> </span><span class="nt">"module"</span><span class="p">:</span><span class="w"> </span><span class="s2">"nodenext"</span><span class="p">,</span>
</span><span id="__span-3-5"><a id="__codelineno-3-5" name="__codelineno-3-5" href="#__codelineno-3-5"></a><span class="w"> </span><span class="nt">"moduleResolution"</span><span class="p">:</span><span class="w"> </span><span class="s2">"nodenext"</span><span class="p">,</span>
</span><span id="__span-3-6"><a id="__codelineno-3-6" name="__codelineno-3-6" href="#__codelineno-3-6"></a><span class="w"> </span><span class="nt">"esModuleInterop"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
</span><span id="__span-3-7"><a id="__codelineno-3-7" name="__codelineno-3-7" href="#__codelineno-3-7"></a><span class="w"> </span><span class="nt">"strict"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
</span><span id="__span-3-8"><a id="__codelineno-3-8" name="__codelineno-3-8" href="#__codelineno-3-8"></a><span class="w"> </span><span class="nt">"skipLibCheck"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span>
</span><span id="__span-3-9"><a id="__codelineno-3-9" name="__codelineno-3-9" href="#__codelineno-3-9"></a><span class="w"> </span><span class="c1">// set to false to allow CommonJS module syntax:</span>
</span><span id="__span-3-10"><a id="__codelineno-3-10" name="__codelineno-3-10" href="#__codelineno-3-10"></a><span class="w"> </span><span class="nt">"verbatimModuleSyntax"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span>
</span><span id="__span-3-11"><a id="__codelineno-3-11" name="__codelineno-3-11" href="#__codelineno-3-11"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-3-12"><a id="__codelineno-3-12" name="__codelineno-3-12" href="#__codelineno-3-12"></a><span class="p">}</span>
</span></code></pre></div>
</div>
<div class="tabbed-block">
<h2 id="create-a-new-go-module">Create a new Go module<a class="headerlink" href="#create-a-new-go-module" title="Permanent link">&para;</a></h2>
<p>If you are starting a new project, you can create a new Go module:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-4-1"><a id="__codelineno-4-1" name="__codelineno-4-1" href="#__codelineno-4-1"></a>mkdir<span class="w"> </span>my-adk-agent
</span><span id="__span-4-2"><a id="__codelineno-4-2" name="__codelineno-4-2" href="#__codelineno-4-2"></a><span class="nb">cd</span><span class="w"> </span>my-adk-agent
</span><span id="__span-4-3"><a id="__codelineno-4-3" name="__codelineno-4-3" href="#__codelineno-4-3"></a>go<span class="w"> </span>mod<span class="w"> </span>init<span class="w"> </span>example.com/my-agent
</span></code></pre></div>
<h2 id="install-adk">Install ADK<a class="headerlink" href="#install-adk" title="Permanent link">&para;</a></h2>
<p>To add the ADK to your project, run the following command:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-5-1"><a id="__codelineno-5-1" name="__codelineno-5-1" href="#__codelineno-5-1"></a>go<span class="w"> </span>get<span class="w"> </span>google.golang.org/adk/v2
</span></code></pre></div>
<p>This will add the ADK as a dependency to your <code>go.mod</code> file.</p>
</div>
<div class="tabbed-block">
<p>To install ADK Java and set up the environment, see the <a href="/get-started/java/">Java
Quickstart</a>.</p>
</div>
<div class="tabbed-block">
<p>To install ADK Kotlin and set up the environment, see the <a href="/get-started/kotlin/">Kotlin
Quickstart</a>.</p>
</div>
</div>
</div>
<h2 id="create-agent-project">2. Create Agent Project<a class="headerlink" href="#create-agent-project" title="Permanent link">&para;</a></h2>
<h3 id="project-structure">Project structure<a class="headerlink" href="#project-structure" title="Permanent link">&para;</a></h3>
<div class="tabbed-set tabbed-alternate" data-tabs="2:5"><input checked="checked" id="python_1" name="__tabbed_2" type="radio" /><input id="typescript_1" name="__tabbed_2" type="radio" /><input id="go_1" name="__tabbed_2" type="radio" /><input id="java_1" name="__tabbed_2" type="radio" /><input id="kotlin_1" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="python_1">Python</label><label for="typescript_1">TypeScript</label><label for="go_1">Go</label><label for="java_1">Java</label><label for="kotlin_1">Kotlin</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p>You will need to create the following project structure:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-6-1"><a id="__codelineno-6-1" name="__codelineno-6-1" href="#__codelineno-6-1"></a><span class="go">parent_folder/</span>
</span><span id="__span-6-2"><a id="__codelineno-6-2" name="__codelineno-6-2" href="#__codelineno-6-2"></a><span class="go"> multi_tool_agent/</span>
</span><span id="__span-6-3"><a id="__codelineno-6-3" name="__codelineno-6-3" href="#__codelineno-6-3"></a><span class="go"> __init__.py</span>
</span><span id="__span-6-4"><a id="__codelineno-6-4" name="__codelineno-6-4" href="#__codelineno-6-4"></a><span class="go"> agent.py</span>
</span><span id="__span-6-5"><a id="__codelineno-6-5" name="__codelineno-6-5" href="#__codelineno-6-5"></a><span class="go"> .env</span>
</span></code></pre></div>
<p>Create the folder <code>multi_tool_agent</code>:</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>mkdir<span class="w"> </span>multi_tool_agent/
</span></code></pre></div>
<div class="admonition info">
<p class="admonition-title">Note for Windows users</p>
<p>When using ADK on Windows for the next few steps, we recommend creating
Python files using File Explorer or an IDE because the following commands
(<code>mkdir</code>, <code>echo</code>) typically generate files with null bytes and/or incorrect
encoding.</p>
</div>
<h3 id="__init__py"><code>__init__.py</code><a class="headerlink" href="#__init__py" title="Permanent link">&para;</a></h3>
<p>Now create an <code>__init__.py</code> file in the folder:</p>
<div class="language-shell highlight"><pre><span></span><code><span id="__span-8-1"><a id="__codelineno-8-1" name="__codelineno-8-1" href="#__codelineno-8-1"></a><span class="nb">echo</span><span class="w"> </span><span class="s2">"from . import agent"</span><span class="w"> </span>&gt;<span class="w"> </span>multi_tool_agent/__init__.py
</span></code></pre></div>
<p>Your <code>__init__.py</code> should now look like this:</p>
<div class="language-python highlight"><span class="filename">multi_tool_agent/__init__.py</span><pre><span></span><code><span id="__span-9-1"><a id="__codelineno-9-1" name="__codelineno-9-1" href="#__codelineno-9-1"></a><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">agent</span>
</span></code></pre></div>
<h3 id="agentpy"><code>agent.py</code><a class="headerlink" href="#agentpy" title="Permanent link">&para;</a></h3>
<p>Create an <code>agent.py</code> file in the same folder:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="3:2"><input checked="checked" id="os-x--linux" name="__tabbed_3" type="radio" /><input id="windows" name="__tabbed_3" type="radio" /><div class="tabbed-labels"><label for="os-x--linux">OS X &amp; Linux</label><label for="windows">Windows</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-10-1"><a id="__codelineno-10-1" name="__codelineno-10-1" href="#__codelineno-10-1"></a>touch<span class="w"> </span>multi_tool_agent/agent.py
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-11-1"><a id="__codelineno-11-1" name="__codelineno-11-1" href="#__codelineno-11-1"></a><span class="nb">type</span><span class="w"> </span>nul<span class="w"> </span>&gt;<span class="w"> </span>multi_tool_agent/agent.py
</span></code></pre></div>
</div>
</div>
</div>
<p>Copy and paste the following code into <code>agent.py</code>:</p>
<div class="language-python highlight"><span class="filename">multi_tool_agent/agent.py</span><pre><span></span><code><span id="__span-12-1"><a id="__codelineno-12-1" name="__codelineno-12-1" href="#__codelineno-12-1"></a><span class="c1"># Copyright 2026 Google LLC</span>
</span><span id="__span-12-2"><a id="__codelineno-12-2" name="__codelineno-12-2" href="#__codelineno-12-2"></a><span class="c1">#</span>
</span><span id="__span-12-3"><a id="__codelineno-12-3" name="__codelineno-12-3" href="#__codelineno-12-3"></a><span class="c1"># Licensed under the Apache License, Version 2.0 (the "License");</span>
</span><span id="__span-12-4"><a id="__codelineno-12-4" name="__codelineno-12-4" href="#__codelineno-12-4"></a><span class="c1"># you may not use this file except in compliance with the License.</span>
</span><span id="__span-12-5"><a id="__codelineno-12-5" name="__codelineno-12-5" href="#__codelineno-12-5"></a><span class="c1"># You may obtain a copy of the License at</span>
</span><span id="__span-12-6"><a id="__codelineno-12-6" name="__codelineno-12-6" href="#__codelineno-12-6"></a><span class="c1">#</span>
</span><span id="__span-12-7"><a id="__codelineno-12-7" name="__codelineno-12-7" href="#__codelineno-12-7"></a><span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
</span><span id="__span-12-8"><a id="__codelineno-12-8" name="__codelineno-12-8" href="#__codelineno-12-8"></a><span class="c1">#</span>
</span><span id="__span-12-9"><a id="__codelineno-12-9" name="__codelineno-12-9" href="#__codelineno-12-9"></a><span class="c1"># Unless required by applicable law or agreed to in writing, software</span>
</span><span id="__span-12-10"><a id="__codelineno-12-10" name="__codelineno-12-10" href="#__codelineno-12-10"></a><span class="c1"># distributed under the License is distributed on an "AS IS" BASIS,</span>
</span><span id="__span-12-11"><a id="__codelineno-12-11" name="__codelineno-12-11" href="#__codelineno-12-11"></a><span class="c1"># WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span>
</span><span id="__span-12-12"><a id="__codelineno-12-12" name="__codelineno-12-12" href="#__codelineno-12-12"></a><span class="c1"># See the License for the specific language governing permissions and</span>
</span><span id="__span-12-13"><a id="__codelineno-12-13" name="__codelineno-12-13" href="#__codelineno-12-13"></a><span class="c1"># limitations under the License.</span>
</span><span id="__span-12-14"><a id="__codelineno-12-14" name="__codelineno-12-14" href="#__codelineno-12-14"></a>
</span><span id="__span-12-15"><a id="__codelineno-12-15" name="__codelineno-12-15" href="#__codelineno-12-15"></a><span class="kn">import</span><span class="w"> </span><span class="nn">datetime</span>
</span><span id="__span-12-16"><a id="__codelineno-12-16" name="__codelineno-12-16" href="#__codelineno-12-16"></a><span class="kn">from</span><span class="w"> </span><span class="nn">zoneinfo</span><span class="w"> </span><span class="kn">import</span> <span class="n">ZoneInfo</span>
</span><span id="__span-12-17"><a id="__codelineno-12-17" name="__codelineno-12-17" href="#__codelineno-12-17"></a><span class="kn">from</span><span class="w"> </span><span class="nn">google.adk.agents</span><span class="w"> </span><span class="kn">import</span> <span class="n">Agent</span>
</span><span id="__span-12-18"><a id="__codelineno-12-18" name="__codelineno-12-18" href="#__codelineno-12-18"></a>
</span><span id="__span-12-19"><a id="__codelineno-12-19" name="__codelineno-12-19" href="#__codelineno-12-19"></a><span class="k">def</span><span class="w"> </span><span class="nf">get_weather</span><span class="p">(</span><span class="n">city</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="__span-12-20"><a id="__codelineno-12-20" name="__codelineno-12-20" href="#__codelineno-12-20"></a><span class="w"> </span><span class="sd">"""Retrieves the current weather report for a specified city.</span>
</span><span id="__span-12-21"><a id="__codelineno-12-21" name="__codelineno-12-21" href="#__codelineno-12-21"></a>
</span><span id="__span-12-22"><a id="__codelineno-12-22" name="__codelineno-12-22" href="#__codelineno-12-22"></a><span class="sd"> Args:</span>
</span><span id="__span-12-23"><a id="__codelineno-12-23" name="__codelineno-12-23" href="#__codelineno-12-23"></a><span class="sd"> city (str): The name of the city for which to retrieve the weather report.</span>
</span><span id="__span-12-24"><a id="__codelineno-12-24" name="__codelineno-12-24" href="#__codelineno-12-24"></a>
</span><span id="__span-12-25"><a id="__codelineno-12-25" name="__codelineno-12-25" href="#__codelineno-12-25"></a><span class="sd"> Returns:</span>
</span><span id="__span-12-26"><a id="__codelineno-12-26" name="__codelineno-12-26" href="#__codelineno-12-26"></a><span class="sd"> dict: status and result or error msg.</span>
</span><span id="__span-12-27"><a id="__codelineno-12-27" name="__codelineno-12-27" href="#__codelineno-12-27"></a><span class="sd"> """</span>
</span><span id="__span-12-28"><a id="__codelineno-12-28" name="__codelineno-12-28" href="#__codelineno-12-28"></a> <span class="k">if</span> <span class="n">city</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"new york"</span><span class="p">:</span>
</span><span id="__span-12-29"><a id="__codelineno-12-29" name="__codelineno-12-29" href="#__codelineno-12-29"></a> <span class="k">return</span> <span class="p">{</span>
</span><span id="__span-12-30"><a id="__codelineno-12-30" name="__codelineno-12-30" href="#__codelineno-12-30"></a> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span>
</span><span id="__span-12-31"><a id="__codelineno-12-31" name="__codelineno-12-31" href="#__codelineno-12-31"></a> <span class="s2">"report"</span><span class="p">:</span> <span class="p">(</span>
</span><span id="__span-12-32"><a id="__codelineno-12-32" name="__codelineno-12-32" href="#__codelineno-12-32"></a> <span class="s2">"The weather in New York is sunny with a temperature of 25 degrees"</span>
</span><span id="__span-12-33"><a id="__codelineno-12-33" name="__codelineno-12-33" href="#__codelineno-12-33"></a> <span class="s2">" Celsius (77 degrees Fahrenheit)."</span>
</span><span id="__span-12-34"><a id="__codelineno-12-34" name="__codelineno-12-34" href="#__codelineno-12-34"></a> <span class="p">),</span>
</span><span id="__span-12-35"><a id="__codelineno-12-35" name="__codelineno-12-35" href="#__codelineno-12-35"></a> <span class="p">}</span>
</span><span id="__span-12-36"><a id="__codelineno-12-36" name="__codelineno-12-36" href="#__codelineno-12-36"></a> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-12-37"><a id="__codelineno-12-37" name="__codelineno-12-37" href="#__codelineno-12-37"></a> <span class="k">return</span> <span class="p">{</span>
</span><span id="__span-12-38"><a id="__codelineno-12-38" name="__codelineno-12-38" href="#__codelineno-12-38"></a> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span>
</span><span id="__span-12-39"><a id="__codelineno-12-39" name="__codelineno-12-39" href="#__codelineno-12-39"></a> <span class="s2">"error_message"</span><span class="p">:</span> <span class="sa">f</span><span class="s2">"Weather information for '</span><span class="si">{</span><span class="n">city</span><span class="si">}</span><span class="s2">' is not available."</span><span class="p">,</span>
</span><span id="__span-12-40"><a id="__codelineno-12-40" name="__codelineno-12-40" href="#__codelineno-12-40"></a> <span class="p">}</span>
</span><span id="__span-12-41"><a id="__codelineno-12-41" name="__codelineno-12-41" href="#__codelineno-12-41"></a>
</span><span id="__span-12-42"><a id="__codelineno-12-42" name="__codelineno-12-42" href="#__codelineno-12-42"></a>
</span><span id="__span-12-43"><a id="__codelineno-12-43" name="__codelineno-12-43" href="#__codelineno-12-43"></a><span class="k">def</span><span class="w"> </span><span class="nf">get_current_time</span><span class="p">(</span><span class="n">city</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
</span><span id="__span-12-44"><a id="__codelineno-12-44" name="__codelineno-12-44" href="#__codelineno-12-44"></a><span class="w"> </span><span class="sd">"""Returns the current time in a specified city.</span>
</span><span id="__span-12-45"><a id="__codelineno-12-45" name="__codelineno-12-45" href="#__codelineno-12-45"></a>
</span><span id="__span-12-46"><a id="__codelineno-12-46" name="__codelineno-12-46" href="#__codelineno-12-46"></a><span class="sd"> Args:</span>
</span><span id="__span-12-47"><a id="__codelineno-12-47" name="__codelineno-12-47" href="#__codelineno-12-47"></a><span class="sd"> city (str): The name of the city for which to retrieve the current time.</span>
</span><span id="__span-12-48"><a id="__codelineno-12-48" name="__codelineno-12-48" href="#__codelineno-12-48"></a>
</span><span id="__span-12-49"><a id="__codelineno-12-49" name="__codelineno-12-49" href="#__codelineno-12-49"></a><span class="sd"> Returns:</span>
</span><span id="__span-12-50"><a id="__codelineno-12-50" name="__codelineno-12-50" href="#__codelineno-12-50"></a><span class="sd"> dict: status and result or error msg.</span>
</span><span id="__span-12-51"><a id="__codelineno-12-51" name="__codelineno-12-51" href="#__codelineno-12-51"></a><span class="sd"> """</span>
</span><span id="__span-12-52"><a id="__codelineno-12-52" name="__codelineno-12-52" href="#__codelineno-12-52"></a>
</span><span id="__span-12-53"><a id="__codelineno-12-53" name="__codelineno-12-53" href="#__codelineno-12-53"></a> <span class="k">if</span> <span class="n">city</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">"new york"</span><span class="p">:</span>
</span><span id="__span-12-54"><a id="__codelineno-12-54" name="__codelineno-12-54" href="#__codelineno-12-54"></a> <span class="n">tz_identifier</span> <span class="o">=</span> <span class="s2">"America/New_York"</span>
</span><span id="__span-12-55"><a id="__codelineno-12-55" name="__codelineno-12-55" href="#__codelineno-12-55"></a> <span class="k">else</span><span class="p">:</span>
</span><span id="__span-12-56"><a id="__codelineno-12-56" name="__codelineno-12-56" href="#__codelineno-12-56"></a> <span class="k">return</span> <span class="p">{</span>
</span><span id="__span-12-57"><a id="__codelineno-12-57" name="__codelineno-12-57" href="#__codelineno-12-57"></a> <span class="s2">"status"</span><span class="p">:</span> <span class="s2">"error"</span><span class="p">,</span>
</span><span id="__span-12-58"><a id="__codelineno-12-58" name="__codelineno-12-58" href="#__codelineno-12-58"></a> <span class="s2">"error_message"</span><span class="p">:</span> <span class="p">(</span>
</span><span id="__span-12-59"><a id="__codelineno-12-59" name="__codelineno-12-59" href="#__codelineno-12-59"></a> <span class="sa">f</span><span class="s2">"Sorry, I don't have timezone information for </span><span class="si">{</span><span class="n">city</span><span class="si">}</span><span class="s2">."</span>
</span><span id="__span-12-60"><a id="__codelineno-12-60" name="__codelineno-12-60" href="#__codelineno-12-60"></a> <span class="p">),</span>
</span><span id="__span-12-61"><a id="__codelineno-12-61" name="__codelineno-12-61" href="#__codelineno-12-61"></a> <span class="p">}</span>
</span><span id="__span-12-62"><a id="__codelineno-12-62" name="__codelineno-12-62" href="#__codelineno-12-62"></a>
</span><span id="__span-12-63"><a id="__codelineno-12-63" name="__codelineno-12-63" href="#__codelineno-12-63"></a> <span class="n">tz</span> <span class="o">=</span> <span class="n">ZoneInfo</span><span class="p">(</span><span class="n">tz_identifier</span><span class="p">)</span>
</span><span id="__span-12-64"><a id="__codelineno-12-64" name="__codelineno-12-64" href="#__codelineno-12-64"></a> <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">datetime</span><span class="o">.</span><span class="n">now</span><span class="p">(</span><span class="n">tz</span><span class="p">)</span>
</span><span id="__span-12-65"><a id="__codelineno-12-65" name="__codelineno-12-65" href="#__codelineno-12-65"></a> <span class="n">report</span> <span class="o">=</span> <span class="p">(</span>
</span><span id="__span-12-66"><a id="__codelineno-12-66" name="__codelineno-12-66" href="#__codelineno-12-66"></a> <span class="sa">f</span><span class="s1">'The current time in </span><span class="si">{</span><span class="n">city</span><span class="si">}</span><span class="s1"> is </span><span class="si">{</span><span class="n">now</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S %Z%z"</span><span class="p">)</span><span class="si">}</span><span class="s1">'</span>
</span><span id="__span-12-67"><a id="__codelineno-12-67" name="__codelineno-12-67" href="#__codelineno-12-67"></a> <span class="p">)</span>
</span><span id="__span-12-68"><a id="__codelineno-12-68" name="__codelineno-12-68" href="#__codelineno-12-68"></a> <span class="k">return</span> <span class="p">{</span><span class="s2">"status"</span><span class="p">:</span> <span class="s2">"success"</span><span class="p">,</span> <span class="s2">"report"</span><span class="p">:</span> <span class="n">report</span><span class="p">}</span>
</span><span id="__span-12-69"><a id="__codelineno-12-69" name="__codelineno-12-69" href="#__codelineno-12-69"></a>
</span><span id="__span-12-70"><a id="__codelineno-12-70" name="__codelineno-12-70" href="#__codelineno-12-70"></a>
</span><span id="__span-12-71"><a id="__codelineno-12-71" name="__codelineno-12-71" href="#__codelineno-12-71"></a><span class="n">root_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span>
</span><span id="__span-12-72"><a id="__codelineno-12-72" name="__codelineno-12-72" href="#__codelineno-12-72"></a> <span class="n">name</span><span class="o">=</span><span class="s2">"weather_time_agent"</span><span class="p">,</span>
</span><span id="__span-12-73"><a id="__codelineno-12-73" name="__codelineno-12-73" href="#__codelineno-12-73"></a> <span class="n">model</span><span class="o">=</span><span class="s2">"gemini-flash-latest"</span><span class="p">,</span>
</span><span id="__span-12-74"><a id="__codelineno-12-74" name="__codelineno-12-74" href="#__codelineno-12-74"></a> <span class="n">description</span><span class="o">=</span><span class="p">(</span>
</span><span id="__span-12-75"><a id="__codelineno-12-75" name="__codelineno-12-75" href="#__codelineno-12-75"></a> <span class="s2">"Agent to answer questions about the time and weather in a city."</span>
</span><span id="__span-12-76"><a id="__codelineno-12-76" name="__codelineno-12-76" href="#__codelineno-12-76"></a> <span class="p">),</span>
</span><span id="__span-12-77"><a id="__codelineno-12-77" name="__codelineno-12-77" href="#__codelineno-12-77"></a> <span class="n">instruction</span><span class="o">=</span><span class="p">(</span>
</span><span id="__span-12-78"><a id="__codelineno-12-78" name="__codelineno-12-78" href="#__codelineno-12-78"></a> <span class="s2">"You are a helpful agent who can answer user questions about the time and weather in a city."</span>
</span><span id="__span-12-79"><a id="__codelineno-12-79" name="__codelineno-12-79" href="#__codelineno-12-79"></a> <span class="p">),</span>
</span><span id="__span-12-80"><a id="__codelineno-12-80" name="__codelineno-12-80" href="#__codelineno-12-80"></a> <span class="n">tools</span><span class="o">=</span><span class="p">[</span><span class="n">get_weather</span><span class="p">,</span> <span class="n">get_current_time</span><span class="p">],</span>
</span><span id="__span-12-81"><a id="__codelineno-12-81" name="__codelineno-12-81" href="#__codelineno-12-81"></a><span class="p">)</span>
</span></code></pre></div>
<h3 id="env"><code>.env</code><a class="headerlink" href="#env" title="Permanent link">&para;</a></h3>
<p>Create a <code>.env</code> file in the same folder:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="4:2"><input checked="checked" id="os-x--linux_1" name="__tabbed_4" type="radio" /><input id="windows_1" name="__tabbed_4" type="radio" /><div class="tabbed-labels"><label for="os-x--linux_1">OS X &amp; Linux</label><label for="windows_1">Windows</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-13-1"><a id="__codelineno-13-1" name="__codelineno-13-1" href="#__codelineno-13-1"></a>touch<span class="w"> </span>multi_tool_agent/.env
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-14-1"><a id="__codelineno-14-1" name="__codelineno-14-1" href="#__codelineno-14-1"></a><span class="nb">type</span><span class="w"> </span>nul<span class="w"> </span>&gt;<span class="w"> </span>multi_tool_agent<span class="se">\.</span>env
</span></code></pre></div>
</div>
</div>
</div>
<p>More instructions about this file are described in the next section on <a href="#set-up-the-model">Set up the model</a>.</p>
</div>
<div class="tabbed-block">
<p>You will need to create the following project structure in your <code>my-adk-agent</code> directory:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-15-1"><a id="__codelineno-15-1" name="__codelineno-15-1" href="#__codelineno-15-1"></a><span class="go">my-adk-agent/</span>
</span><span id="__span-15-2"><a id="__codelineno-15-2" name="__codelineno-15-2" href="#__codelineno-15-2"></a><span class="go"> agent.ts</span>
</span><span id="__span-15-3"><a id="__codelineno-15-3" name="__codelineno-15-3" href="#__codelineno-15-3"></a><span class="go"> .env</span>
</span><span id="__span-15-4"><a id="__codelineno-15-4" name="__codelineno-15-4" href="#__codelineno-15-4"></a><span class="go"> package.json</span>
</span><span id="__span-15-5"><a id="__codelineno-15-5" name="__codelineno-15-5" href="#__codelineno-15-5"></a><span class="go"> tsconfig.json</span>
</span></code></pre></div>
<h3 id="agentts"><code>agent.ts</code><a class="headerlink" href="#agentts" title="Permanent link">&para;</a></h3>
<p>Create an <code>agent.ts</code> file in your project folder:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="5:2"><input checked="checked" id="os-x--linux_2" name="__tabbed_5" type="radio" /><input id="windows_2" name="__tabbed_5" type="radio" /><div class="tabbed-labels"><label for="os-x--linux_2">OS X &amp; Linux</label><label for="windows_2">Windows</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-16-1"><a id="__codelineno-16-1" name="__codelineno-16-1" href="#__codelineno-16-1"></a>touch<span class="w"> </span>agent.ts
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-17-1"><a id="__codelineno-17-1" name="__codelineno-17-1" href="#__codelineno-17-1"></a><span class="nb">type</span><span class="w"> </span>nul<span class="w"> </span>&gt;<span class="w"> </span>agent.ts
</span></code></pre></div>
</div>
</div>
</div>
<p>Copy and paste the following code into <code>agent.ts</code>:</p>
<div class="language-typescript highlight"><span class="filename">agent.ts</span><pre><span></span><code><span id="__span-18-1"><a id="__codelineno-18-1" name="__codelineno-18-1" href="#__codelineno-18-1"></a><span class="k">import</span><span class="w"> </span><span class="s1">'dotenv/config'</span><span class="p">;</span>
</span><span id="__span-18-2"><a id="__codelineno-18-2" name="__codelineno-18-2" href="#__codelineno-18-2"></a><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">FunctionTool</span><span class="p">,</span><span class="w"> </span><span class="nx">LlmAgent</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">'@google/adk'</span><span class="p">;</span>
</span><span id="__span-18-3"><a id="__codelineno-18-3" name="__codelineno-18-3" href="#__codelineno-18-3"></a><span class="k">import</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">z</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="kr">from</span><span class="w"> </span><span class="s1">'zod'</span><span class="p">;</span>
</span><span id="__span-18-4"><a id="__codelineno-18-4" name="__codelineno-18-4" href="#__codelineno-18-4"></a>
</span><span id="__span-18-5"><a id="__codelineno-18-5" name="__codelineno-18-5" href="#__codelineno-18-5"></a><span class="kd">const</span><span class="w"> </span><span class="nx">getWeather</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">FunctionTool</span><span class="p">({</span>
</span><span id="__span-18-6"><a id="__codelineno-18-6" name="__codelineno-18-6" href="#__codelineno-18-6"></a><span class="w"> </span><span class="nx">name</span><span class="o">:</span><span class="w"> </span><span class="s1">'get_weather'</span><span class="p">,</span>
</span><span id="__span-18-7"><a id="__codelineno-18-7" name="__codelineno-18-7" href="#__codelineno-18-7"></a><span class="w"> </span><span class="nx">description</span><span class="o">:</span><span class="w"> </span><span class="s1">'Retrieves the current weather report for a specified city.'</span><span class="p">,</span>
</span><span id="__span-18-8"><a id="__codelineno-18-8" name="__codelineno-18-8" href="#__codelineno-18-8"></a><span class="w"> </span><span class="nx">parameters</span><span class="o">:</span><span class="w"> </span><span class="kt">z.object</span><span class="p">({</span>
</span><span id="__span-18-9"><a id="__codelineno-18-9" name="__codelineno-18-9" href="#__codelineno-18-9"></a><span class="w"> </span><span class="nx">city</span><span class="o">:</span><span class="w"> </span><span class="kt">z.string</span><span class="p">().</span><span class="nx">describe</span><span class="p">(</span><span class="s1">'The name of the city for which to retrieve the weather report.'</span><span class="p">),</span>
</span><span id="__span-18-10"><a id="__codelineno-18-10" name="__codelineno-18-10" href="#__codelineno-18-10"></a><span class="w"> </span><span class="p">}),</span>
</span><span id="__span-18-11"><a id="__codelineno-18-11" name="__codelineno-18-11" href="#__codelineno-18-11"></a><span class="w"> </span><span class="nx">execute</span><span class="o">:</span><span class="w"> </span><span class="p">({</span><span class="w"> </span><span class="nx">city</span><span class="w"> </span><span class="p">})</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-12"><a id="__codelineno-18-12" name="__codelineno-18-12" href="#__codelineno-18-12"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">city</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">()</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="s1">'new york'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-13"><a id="__codelineno-18-13" name="__codelineno-18-13" href="#__codelineno-18-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-14"><a id="__codelineno-18-14" name="__codelineno-18-14" href="#__codelineno-18-14"></a><span class="w"> </span><span class="nx">status</span><span class="o">:</span><span class="w"> </span><span class="s1">'success'</span><span class="p">,</span>
</span><span id="__span-18-15"><a id="__codelineno-18-15" name="__codelineno-18-15" href="#__codelineno-18-15"></a><span class="w"> </span><span class="nx">report</span><span class="o">:</span>
</span><span id="__span-18-16"><a id="__codelineno-18-16" name="__codelineno-18-16" href="#__codelineno-18-16"></a><span class="w"> </span><span class="s1">'The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit).'</span><span class="p">,</span>
</span><span id="__span-18-17"><a id="__codelineno-18-17" name="__codelineno-18-17" href="#__codelineno-18-17"></a><span class="w"> </span><span class="p">};</span>
</span><span id="__span-18-18"><a id="__codelineno-18-18" name="__codelineno-18-18" href="#__codelineno-18-18"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-19"><a id="__codelineno-18-19" name="__codelineno-18-19" href="#__codelineno-18-19"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-20"><a id="__codelineno-18-20" name="__codelineno-18-20" href="#__codelineno-18-20"></a><span class="w"> </span><span class="nx">status</span><span class="o">:</span><span class="w"> </span><span class="s1">'error'</span><span class="p">,</span>
</span><span id="__span-18-21"><a id="__codelineno-18-21" name="__codelineno-18-21" href="#__codelineno-18-21"></a><span class="w"> </span><span class="nx">error_message</span><span class="o">:</span><span class="w"> </span><span class="sb">`Weather information for '</span><span class="si">${</span><span class="nx">city</span><span class="si">}</span><span class="sb">' is not available.`</span><span class="p">,</span>
</span><span id="__span-18-22"><a id="__codelineno-18-22" name="__codelineno-18-22" href="#__codelineno-18-22"></a><span class="w"> </span><span class="p">};</span>
</span><span id="__span-18-23"><a id="__codelineno-18-23" name="__codelineno-18-23" href="#__codelineno-18-23"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-18-24"><a id="__codelineno-18-24" name="__codelineno-18-24" href="#__codelineno-18-24"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-18-25"><a id="__codelineno-18-25" name="__codelineno-18-25" href="#__codelineno-18-25"></a><span class="p">});</span>
</span><span id="__span-18-26"><a id="__codelineno-18-26" name="__codelineno-18-26" href="#__codelineno-18-26"></a>
</span><span id="__span-18-27"><a id="__codelineno-18-27" name="__codelineno-18-27" href="#__codelineno-18-27"></a><span class="kd">const</span><span class="w"> </span><span class="nx">getCurrentTime</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">FunctionTool</span><span class="p">({</span>
</span><span id="__span-18-28"><a id="__codelineno-18-28" name="__codelineno-18-28" href="#__codelineno-18-28"></a><span class="w"> </span><span class="nx">name</span><span class="o">:</span><span class="w"> </span><span class="s1">'get_current_time'</span><span class="p">,</span>
</span><span id="__span-18-29"><a id="__codelineno-18-29" name="__codelineno-18-29" href="#__codelineno-18-29"></a><span class="w"> </span><span class="nx">description</span><span class="o">:</span><span class="w"> </span><span class="s1">'Returns the current time in a specified city.'</span><span class="p">,</span>
</span><span id="__span-18-30"><a id="__codelineno-18-30" name="__codelineno-18-30" href="#__codelineno-18-30"></a><span class="w"> </span><span class="nx">parameters</span><span class="o">:</span><span class="w"> </span><span class="kt">z.object</span><span class="p">({</span>
</span><span id="__span-18-31"><a id="__codelineno-18-31" name="__codelineno-18-31" href="#__codelineno-18-31"></a><span class="w"> </span><span class="nx">city</span><span class="o">:</span><span class="w"> </span><span class="kt">z.string</span><span class="p">().</span><span class="nx">describe</span><span class="p">(</span><span class="s2">"The name of the city for which to retrieve the current time."</span><span class="p">),</span>
</span><span id="__span-18-32"><a id="__codelineno-18-32" name="__codelineno-18-32" href="#__codelineno-18-32"></a><span class="w"> </span><span class="p">}),</span>
</span><span id="__span-18-33"><a id="__codelineno-18-33" name="__codelineno-18-33" href="#__codelineno-18-33"></a><span class="w"> </span><span class="nx">execute</span><span class="o">:</span><span class="w"> </span><span class="p">({</span><span class="w"> </span><span class="nx">city</span><span class="w"> </span><span class="p">})</span><span class="w"> </span><span class="p">=&gt;</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-34"><a id="__codelineno-18-34" name="__codelineno-18-34" href="#__codelineno-18-34"></a><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nx">tz_identifier</span><span class="o">:</span><span class="w"> </span><span class="kt">string</span><span class="p">;</span>
</span><span id="__span-18-35"><a id="__codelineno-18-35" name="__codelineno-18-35" href="#__codelineno-18-35"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">city</span><span class="p">.</span><span class="nx">toLowerCase</span><span class="p">()</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="s1">'new york'</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-36"><a id="__codelineno-18-36" name="__codelineno-18-36" href="#__codelineno-18-36"></a><span class="w"> </span><span class="nx">tz_identifier</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'America/New_York'</span><span class="p">;</span>
</span><span id="__span-18-37"><a id="__codelineno-18-37" name="__codelineno-18-37" href="#__codelineno-18-37"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-38"><a id="__codelineno-18-38" name="__codelineno-18-38" href="#__codelineno-18-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-18-39"><a id="__codelineno-18-39" name="__codelineno-18-39" href="#__codelineno-18-39"></a><span class="w"> </span><span class="nx">status</span><span class="o">:</span><span class="w"> </span><span class="s1">'error'</span><span class="p">,</span>
</span><span id="__span-18-40"><a id="__codelineno-18-40" name="__codelineno-18-40" href="#__codelineno-18-40"></a><span class="w"> </span><span class="nx">error_message</span><span class="o">:</span><span class="w"> </span><span class="sb">`Sorry, I don't have timezone information for </span><span class="si">${</span><span class="nx">city</span><span class="si">}</span><span class="sb">.`</span><span class="p">,</span>
</span><span id="__span-18-41"><a id="__codelineno-18-41" name="__codelineno-18-41" href="#__codelineno-18-41"></a><span class="w"> </span><span class="p">};</span>
</span><span id="__span-18-42"><a id="__codelineno-18-42" name="__codelineno-18-42" href="#__codelineno-18-42"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-18-43"><a id="__codelineno-18-43" name="__codelineno-18-43" href="#__codelineno-18-43"></a>
</span><span id="__span-18-44"><a id="__codelineno-18-44" name="__codelineno-18-44" href="#__codelineno-18-44"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nb">Date</span><span class="p">();</span>
</span><span id="__span-18-45"><a id="__codelineno-18-45" name="__codelineno-18-45" href="#__codelineno-18-45"></a><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">report</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="sb">`The current time in </span><span class="si">${</span><span class="nx">city</span><span class="si">}</span><span class="sb"> is </span><span class="si">${</span><span class="nx">now</span><span class="p">.</span><span class="nx">toLocaleString</span><span class="p">(</span><span class="s1">'en-US'</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">timeZone</span><span class="o">:</span><span class="w"> </span><span class="kt">tz_identifier</span><span class="w"> </span><span class="si">}</span><span class="sb">)}`</span><span class="p">;</span>
</span><span id="__span-18-46"><a id="__codelineno-18-46" name="__codelineno-18-46" href="#__codelineno-18-46"></a>
</span><span id="__span-18-47"><a id="__codelineno-18-47" name="__codelineno-18-47" href="#__codelineno-18-47"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">status</span><span class="o">:</span><span class="w"> </span><span class="s1">'success'</span><span class="p">,</span><span class="w"> </span><span class="nx">report</span><span class="o">:</span><span class="w"> </span><span class="kt">report</span><span class="w"> </span><span class="p">};</span>
</span><span id="__span-18-48"><a id="__codelineno-18-48" name="__codelineno-18-48" href="#__codelineno-18-48"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-18-49"><a id="__codelineno-18-49" name="__codelineno-18-49" href="#__codelineno-18-49"></a><span class="p">});</span>
</span><span id="__span-18-50"><a id="__codelineno-18-50" name="__codelineno-18-50" href="#__codelineno-18-50"></a>
</span><span id="__span-18-51"><a id="__codelineno-18-51" name="__codelineno-18-51" href="#__codelineno-18-51"></a><span class="k">export</span><span class="w"> </span><span class="kd">const</span><span class="w"> </span><span class="nx">rootAgent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ow">new</span><span class="w"> </span><span class="nx">LlmAgent</span><span class="p">({</span>
</span><span id="__span-18-52"><a id="__codelineno-18-52" name="__codelineno-18-52" href="#__codelineno-18-52"></a><span class="w"> </span><span class="nx">name</span><span class="o">:</span><span class="w"> </span><span class="s1">'weather_time_agent'</span><span class="p">,</span>
</span><span id="__span-18-53"><a id="__codelineno-18-53" name="__codelineno-18-53" href="#__codelineno-18-53"></a><span class="w"> </span><span class="nx">model</span><span class="o">:</span><span class="w"> </span><span class="s1">'gemini-flash-latest'</span><span class="p">,</span>
</span><span id="__span-18-54"><a id="__codelineno-18-54" name="__codelineno-18-54" href="#__codelineno-18-54"></a><span class="w"> </span><span class="nx">description</span><span class="o">:</span><span class="w"> </span><span class="s1">'Agent to answer questions about the time and weather in a city.'</span><span class="p">,</span>
</span><span id="__span-18-55"><a id="__codelineno-18-55" name="__codelineno-18-55" href="#__codelineno-18-55"></a><span class="w"> </span><span class="nx">instruction</span><span class="o">:</span><span class="w"> </span><span class="s1">'You are a helpful agent who can answer user questions about the time and weather in a city.'</span><span class="p">,</span>
</span><span id="__span-18-56"><a id="__codelineno-18-56" name="__codelineno-18-56" href="#__codelineno-18-56"></a><span class="w"> </span><span class="nx">tools</span><span class="o">:</span><span class="w"> </span><span class="p">[</span><span class="nx">getWeather</span><span class="p">,</span><span class="w"> </span><span class="nx">getCurrentTime</span><span class="p">],</span>
</span><span id="__span-18-57"><a id="__codelineno-18-57" name="__codelineno-18-57" href="#__codelineno-18-57"></a><span class="p">});</span>
</span></code></pre></div>
<h3 id="env_1"><code>.env</code><a class="headerlink" href="#env_1" title="Permanent link">&para;</a></h3>
<p>Create a <code>.env</code> file in the same folder:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="6:2"><input checked="checked" id="os-x--linux_3" name="__tabbed_6" type="radio" /><input id="windows_3" name="__tabbed_6" type="radio" /><div class="tabbed-labels"><label for="os-x--linux_3">OS X &amp; Linux</label><label for="windows_3">Windows</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-19-1"><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a>touch<span class="w"> </span>.env
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-shell highlight"><pre><span></span><code><span id="__span-20-1"><a id="__codelineno-20-1" name="__codelineno-20-1" href="#__codelineno-20-1"></a><span class="nb">type</span><span class="w"> </span>nul<span class="w"> </span>&gt;<span class="w"> </span>.env
</span></code></pre></div>
</div>
</div>
</div>
<p>More instructions about this file are described in the next section on <a href="#set-up-the-model">Set up the model</a>.</p>
</div>
<div class="tabbed-block">
<p>You will need to create the following project structure:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-21-1"><a id="__codelineno-21-1" name="__codelineno-21-1" href="#__codelineno-21-1"></a><span class="go">my-adk-agent/</span>
</span><span id="__span-21-2"><a id="__codelineno-21-2" name="__codelineno-21-2" href="#__codelineno-21-2"></a><span class="go"> agent.go</span>
</span><span id="__span-21-3"><a id="__codelineno-21-3" name="__codelineno-21-3" href="#__codelineno-21-3"></a><span class="go"> .env</span>
</span><span id="__span-21-4"><a id="__codelineno-21-4" name="__codelineno-21-4" href="#__codelineno-21-4"></a><span class="go"> go.mod</span>
</span></code></pre></div>
<h3 id="agentgo"><code>agent.go</code><a class="headerlink" href="#agentgo" title="Permanent link">&para;</a></h3>
<p>Create an <code>agent.go</code> file in your project folder:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="7:2"><input checked="checked" id="os-x--linux_4" name="__tabbed_7" type="radio" /><input id="windows_4" name="__tabbed_7" type="radio" /><div class="tabbed-labels"><label for="os-x--linux_4">OS X &amp; Linux</label><label for="windows_4">Windows</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-bash highlight"><pre><span></span><code><span id="__span-22-1"><a id="__codelineno-22-1" name="__codelineno-22-1" href="#__codelineno-22-1"></a>touch<span class="w"> </span>agent.go
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-console highlight"><pre><span></span><code><span id="__span-23-1"><a id="__codelineno-23-1" name="__codelineno-23-1" href="#__codelineno-23-1"></a><span class="go">type nul &gt; agent.go</span>
</span></code></pre></div>
</div>
</div>
</div>
<p>Copy and paste the following code into <code>agent.go</code>:</p>
<div class="language-go highlight"><span class="filename">agent.go</span><pre><span></span><code><span id="__span-24-1"><a id="__codelineno-24-1" name="__codelineno-24-1" href="#__codelineno-24-1"></a><span class="kn">package</span><span class="w"> </span><span class="nx">main</span>
</span><span id="__span-24-2"><a id="__codelineno-24-2" name="__codelineno-24-2" href="#__codelineno-24-2"></a>
</span><span id="__span-24-3"><a id="__codelineno-24-3" name="__codelineno-24-3" href="#__codelineno-24-3"></a><span class="kn">import</span><span class="w"> </span><span class="p">(</span>
</span><span id="__span-24-4"><a id="__codelineno-24-4" name="__codelineno-24-4" href="#__codelineno-24-4"></a><span class="w"> </span><span class="s">"context"</span>
</span><span id="__span-24-5"><a id="__codelineno-24-5" name="__codelineno-24-5" href="#__codelineno-24-5"></a><span class="w"> </span><span class="s">"log"</span>
</span><span id="__span-24-6"><a id="__codelineno-24-6" name="__codelineno-24-6" href="#__codelineno-24-6"></a><span class="w"> </span><span class="s">"os"</span>
</span><span id="__span-24-7"><a id="__codelineno-24-7" name="__codelineno-24-7" href="#__codelineno-24-7"></a><span class="w"> </span><span class="s">"strings"</span>
</span><span id="__span-24-8"><a id="__codelineno-24-8" name="__codelineno-24-8" href="#__codelineno-24-8"></a><span class="w"> </span><span class="s">"time"</span>
</span><span id="__span-24-9"><a id="__codelineno-24-9" name="__codelineno-24-9" href="#__codelineno-24-9"></a>
</span><span id="__span-24-10"><a id="__codelineno-24-10" name="__codelineno-24-10" href="#__codelineno-24-10"></a><span class="w"> </span><span class="s">"google.golang.org/genai"</span>
</span><span id="__span-24-11"><a id="__codelineno-24-11" name="__codelineno-24-11" href="#__codelineno-24-11"></a>
</span><span id="__span-24-12"><a id="__codelineno-24-12" name="__codelineno-24-12" href="#__codelineno-24-12"></a><span class="w"> </span><span class="s">"google.golang.org/adk/v2/agent"</span>
</span><span id="__span-24-13"><a id="__codelineno-24-13" name="__codelineno-24-13" href="#__codelineno-24-13"></a><span class="w"> </span><span class="s">"google.golang.org/adk/v2/agent/llmagent"</span>
</span><span id="__span-24-14"><a id="__codelineno-24-14" name="__codelineno-24-14" href="#__codelineno-24-14"></a><span class="w"> </span><span class="s">"google.golang.org/adk/v2/cmd/launcher"</span>
</span><span id="__span-24-15"><a id="__codelineno-24-15" name="__codelineno-24-15" href="#__codelineno-24-15"></a><span class="w"> </span><span class="s">"google.golang.org/adk/v2/cmd/launcher/full"</span>
</span><span id="__span-24-16"><a id="__codelineno-24-16" name="__codelineno-24-16" href="#__codelineno-24-16"></a><span class="w"> </span><span class="s">"google.golang.org/adk/v2/model/gemini"</span>
</span><span id="__span-24-17"><a id="__codelineno-24-17" name="__codelineno-24-17" href="#__codelineno-24-17"></a><span class="w"> </span><span class="s">"google.golang.org/adk/v2/tool"</span>
</span><span id="__span-24-18"><a id="__codelineno-24-18" name="__codelineno-24-18" href="#__codelineno-24-18"></a><span class="w"> </span><span class="s">"google.golang.org/adk/v2/tool/functiontool"</span>
</span><span id="__span-24-19"><a id="__codelineno-24-19" name="__codelineno-24-19" href="#__codelineno-24-19"></a><span class="p">)</span>
</span><span id="__span-24-20"><a id="__codelineno-24-20" name="__codelineno-24-20" href="#__codelineno-24-20"></a>
</span><span id="__span-24-21"><a id="__codelineno-24-21" name="__codelineno-24-21" href="#__codelineno-24-21"></a><span class="kd">type</span><span class="w"> </span><span class="nx">CityArgs</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-22"><a id="__codelineno-24-22" name="__codelineno-24-22" href="#__codelineno-24-22"></a><span class="w"> </span><span class="nx">City</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="s">`json:"city"`</span>
</span><span id="__span-24-23"><a id="__codelineno-24-23" name="__codelineno-24-23" href="#__codelineno-24-23"></a><span class="p">}</span>
</span><span id="__span-24-24"><a id="__codelineno-24-24" name="__codelineno-24-24" href="#__codelineno-24-24"></a>
</span><span id="__span-24-25"><a id="__codelineno-24-25" name="__codelineno-24-25" href="#__codelineno-24-25"></a><span class="kd">func</span><span class="w"> </span><span class="nx">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-26"><a id="__codelineno-24-26" name="__codelineno-24-26" href="#__codelineno-24-26"></a><span class="w"> </span><span class="nx">ctx</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">context</span><span class="p">.</span><span class="nx">Background</span><span class="p">()</span>
</span><span id="__span-24-27"><a id="__codelineno-24-27" name="__codelineno-24-27" href="#__codelineno-24-27"></a>
</span><span id="__span-24-28"><a id="__codelineno-24-28" name="__codelineno-24-28" href="#__codelineno-24-28"></a><span class="w"> </span><span class="c1">// 1. Setup the model.</span>
</span><span id="__span-24-29"><a id="__codelineno-24-29" name="__codelineno-24-29" href="#__codelineno-24-29"></a><span class="w"> </span><span class="c1">// Note: Authentication is handled via GOOGLE_API_KEY environment variable.</span>
</span><span id="__span-24-30"><a id="__codelineno-24-30" name="__codelineno-24-30" href="#__codelineno-24-30"></a><span class="w"> </span><span class="nx">model</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">gemini</span><span class="p">.</span><span class="nx">NewModel</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span><span class="w"> </span><span class="s">"gemini-flash-latest"</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">genai</span><span class="p">.</span><span class="nx">ClientConfig</span><span class="p">{</span>
</span><span id="__span-24-31"><a id="__codelineno-24-31" name="__codelineno-24-31" href="#__codelineno-24-31"></a><span class="w"> </span><span class="nx">APIKey</span><span class="p">:</span><span class="w"> </span><span class="nx">os</span><span class="p">.</span><span class="nx">Getenv</span><span class="p">(</span><span class="s">"GOOGLE_API_KEY"</span><span class="p">),</span>
</span><span id="__span-24-32"><a id="__codelineno-24-32" name="__codelineno-24-32" href="#__codelineno-24-32"></a><span class="w"> </span><span class="p">})</span>
</span><span id="__span-24-33"><a id="__codelineno-24-33" name="__codelineno-24-33" href="#__codelineno-24-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-34"><a id="__codelineno-24-34" name="__codelineno-24-34" href="#__codelineno-24-34"></a><span class="w"> </span><span class="nx">log</span><span class="p">.</span><span class="nx">Fatalf</span><span class="p">(</span><span class="s">"Failed to create model: %v"</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="p">)</span>
</span><span id="__span-24-35"><a id="__codelineno-24-35" name="__codelineno-24-35" href="#__codelineno-24-35"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-36"><a id="__codelineno-24-36" name="__codelineno-24-36" href="#__codelineno-24-36"></a>
</span><span id="__span-24-37"><a id="__codelineno-24-37" name="__codelineno-24-37" href="#__codelineno-24-37"></a><span class="w"> </span><span class="nx">weatherTool</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">functiontool</span><span class="p">.</span><span class="nx">New</span><span class="p">[</span><span class="nx">CityArgs</span><span class="p">,</span><span class="w"> </span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">](</span>
</span><span id="__span-24-38"><a id="__codelineno-24-38" name="__codelineno-24-38" href="#__codelineno-24-38"></a><span class="w"> </span><span class="nx">functiontool</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span>
</span><span id="__span-24-39"><a id="__codelineno-24-39" name="__codelineno-24-39" href="#__codelineno-24-39"></a><span class="w"> </span><span class="nx">Name</span><span class="p">:</span><span class="w"> </span><span class="s">"get_weather"</span><span class="p">,</span>
</span><span id="__span-24-40"><a id="__codelineno-24-40" name="__codelineno-24-40" href="#__codelineno-24-40"></a><span class="w"> </span><span class="nx">Description</span><span class="p">:</span><span class="w"> </span><span class="s">"Retrieves the current weather report for a specified city."</span><span class="p">,</span>
</span><span id="__span-24-41"><a id="__codelineno-24-41" name="__codelineno-24-41" href="#__codelineno-24-41"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-24-42"><a id="__codelineno-24-42" name="__codelineno-24-42" href="#__codelineno-24-42"></a><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">ctx</span><span class="w"> </span><span class="nx">agent</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span><span class="w"> </span><span class="nx">args</span><span class="w"> </span><span class="nx">CityArgs</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">,</span><span class="w"> </span><span class="kt">error</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-43"><a id="__codelineno-24-43" name="__codelineno-24-43" href="#__codelineno-24-43"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">strings</span><span class="p">.</span><span class="nx">EqualFold</span><span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">City</span><span class="p">,</span><span class="w"> </span><span class="s">"new york"</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-44"><a id="__codelineno-24-44" name="__codelineno-24-44" href="#__codelineno-24-44"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span>
</span><span id="__span-24-45"><a id="__codelineno-24-45" name="__codelineno-24-45" href="#__codelineno-24-45"></a><span class="w"> </span><span class="s">"status"</span><span class="p">:</span><span class="w"> </span><span class="s">"success"</span><span class="p">,</span>
</span><span id="__span-24-46"><a id="__codelineno-24-46" name="__codelineno-24-46" href="#__codelineno-24-46"></a><span class="w"> </span><span class="s">"report"</span><span class="p">:</span><span class="w"> </span><span class="s">"The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees Fahrenheit)."</span><span class="p">,</span>
</span><span id="__span-24-47"><a id="__codelineno-24-47" name="__codelineno-24-47" href="#__codelineno-24-47"></a><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="kc">nil</span>
</span><span id="__span-24-48"><a id="__codelineno-24-48" name="__codelineno-24-48" href="#__codelineno-24-48"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-49"><a id="__codelineno-24-49" name="__codelineno-24-49" href="#__codelineno-24-49"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span>
</span><span id="__span-24-50"><a id="__codelineno-24-50" name="__codelineno-24-50" href="#__codelineno-24-50"></a><span class="w"> </span><span class="s">"status"</span><span class="p">:</span><span class="w"> </span><span class="s">"error"</span><span class="p">,</span>
</span><span id="__span-24-51"><a id="__codelineno-24-51" name="__codelineno-24-51" href="#__codelineno-24-51"></a><span class="w"> </span><span class="s">"error_message"</span><span class="p">:</span><span class="w"> </span><span class="s">"Weather information for '"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">args</span><span class="p">.</span><span class="nx">City</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">"' is not available."</span><span class="p">,</span>
</span><span id="__span-24-52"><a id="__codelineno-24-52" name="__codelineno-24-52" href="#__codelineno-24-52"></a><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="kc">nil</span>
</span><span id="__span-24-53"><a id="__codelineno-24-53" name="__codelineno-24-53" href="#__codelineno-24-53"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-24-54"><a id="__codelineno-24-54" name="__codelineno-24-54" href="#__codelineno-24-54"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-24-55"><a id="__codelineno-24-55" name="__codelineno-24-55" href="#__codelineno-24-55"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-56"><a id="__codelineno-24-56" name="__codelineno-24-56" href="#__codelineno-24-56"></a><span class="w"> </span><span class="nx">log</span><span class="p">.</span><span class="nx">Fatalf</span><span class="p">(</span><span class="s">"Failed to create get_weather tool: %v"</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="p">)</span>
</span><span id="__span-24-57"><a id="__codelineno-24-57" name="__codelineno-24-57" href="#__codelineno-24-57"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-58"><a id="__codelineno-24-58" name="__codelineno-24-58" href="#__codelineno-24-58"></a>
</span><span id="__span-24-59"><a id="__codelineno-24-59" name="__codelineno-24-59" href="#__codelineno-24-59"></a><span class="w"> </span><span class="nx">currentTimeTool</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">functiontool</span><span class="p">.</span><span class="nx">New</span><span class="p">[</span><span class="nx">CityArgs</span><span class="p">,</span><span class="w"> </span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">](</span>
</span><span id="__span-24-60"><a id="__codelineno-24-60" name="__codelineno-24-60" href="#__codelineno-24-60"></a><span class="w"> </span><span class="nx">functiontool</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span>
</span><span id="__span-24-61"><a id="__codelineno-24-61" name="__codelineno-24-61" href="#__codelineno-24-61"></a><span class="w"> </span><span class="nx">Name</span><span class="p">:</span><span class="w"> </span><span class="s">"get_current_time"</span><span class="p">,</span>
</span><span id="__span-24-62"><a id="__codelineno-24-62" name="__codelineno-24-62" href="#__codelineno-24-62"></a><span class="w"> </span><span class="nx">Description</span><span class="p">:</span><span class="w"> </span><span class="s">"Returns the current time in a specified city."</span><span class="p">,</span>
</span><span id="__span-24-63"><a id="__codelineno-24-63" name="__codelineno-24-63" href="#__codelineno-24-63"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-24-64"><a id="__codelineno-24-64" name="__codelineno-24-64" href="#__codelineno-24-64"></a><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">ctx</span><span class="w"> </span><span class="nx">agent</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span><span class="w"> </span><span class="nx">args</span><span class="w"> </span><span class="nx">CityArgs</span><span class="p">)</span><span class="w"> </span><span class="p">(</span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">,</span><span class="w"> </span><span class="kt">error</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-65"><a id="__codelineno-24-65" name="__codelineno-24-65" href="#__codelineno-24-65"></a><span class="w"> </span><span class="kd">var</span><span class="w"> </span><span class="nx">tzIdentifier</span><span class="w"> </span><span class="kt">string</span>
</span><span id="__span-24-66"><a id="__codelineno-24-66" name="__codelineno-24-66" href="#__codelineno-24-66"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">strings</span><span class="p">.</span><span class="nx">EqualFold</span><span class="p">(</span><span class="nx">args</span><span class="p">.</span><span class="nx">City</span><span class="p">,</span><span class="w"> </span><span class="s">"new york"</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-67"><a id="__codelineno-24-67" name="__codelineno-24-67" href="#__codelineno-24-67"></a><span class="w"> </span><span class="nx">tzIdentifier</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"America/New_York"</span>
</span><span id="__span-24-68"><a id="__codelineno-24-68" name="__codelineno-24-68" href="#__codelineno-24-68"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-69"><a id="__codelineno-24-69" name="__codelineno-24-69" href="#__codelineno-24-69"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span>
</span><span id="__span-24-70"><a id="__codelineno-24-70" name="__codelineno-24-70" href="#__codelineno-24-70"></a><span class="w"> </span><span class="s">"status"</span><span class="p">:</span><span class="w"> </span><span class="s">"error"</span><span class="p">,</span>
</span><span id="__span-24-71"><a id="__codelineno-24-71" name="__codelineno-24-71" href="#__codelineno-24-71"></a><span class="w"> </span><span class="s">"error_message"</span><span class="p">:</span><span class="w"> </span><span class="s">"Sorry, I don't have timezone information for "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">args</span><span class="p">.</span><span class="nx">City</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">"."</span><span class="p">,</span>
</span><span id="__span-24-72"><a id="__codelineno-24-72" name="__codelineno-24-72" href="#__codelineno-24-72"></a><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="kc">nil</span>
</span><span id="__span-24-73"><a id="__codelineno-24-73" name="__codelineno-24-73" href="#__codelineno-24-73"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-74"><a id="__codelineno-24-74" name="__codelineno-24-74" href="#__codelineno-24-74"></a>
</span><span id="__span-24-75"><a id="__codelineno-24-75" name="__codelineno-24-75" href="#__codelineno-24-75"></a><span class="w"> </span><span class="nx">tz</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">time</span><span class="p">.</span><span class="nx">LoadLocation</span><span class="p">(</span><span class="nx">tzIdentifier</span><span class="p">)</span>
</span><span id="__span-24-76"><a id="__codelineno-24-76" name="__codelineno-24-76" href="#__codelineno-24-76"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-77"><a id="__codelineno-24-77" name="__codelineno-24-77" href="#__codelineno-24-77"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kc">nil</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span>
</span><span id="__span-24-78"><a id="__codelineno-24-78" name="__codelineno-24-78" href="#__codelineno-24-78"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-79"><a id="__codelineno-24-79" name="__codelineno-24-79" href="#__codelineno-24-79"></a>
</span><span id="__span-24-80"><a id="__codelineno-24-80" name="__codelineno-24-80" href="#__codelineno-24-80"></a><span class="w"> </span><span class="nx">now</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">time</span><span class="p">.</span><span class="nx">Now</span><span class="p">().</span><span class="nx">In</span><span class="p">(</span><span class="nx">tz</span><span class="p">)</span>
</span><span id="__span-24-81"><a id="__codelineno-24-81" name="__codelineno-24-81" href="#__codelineno-24-81"></a><span class="w"> </span><span class="nx">report</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">"The current time in "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">args</span><span class="p">.</span><span class="nx">City</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" is "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">now</span><span class="p">.</span><span class="nx">Format</span><span class="p">(</span><span class="s">"2006-01-02 15:04:05 MST-0700"</span><span class="p">)</span>
</span><span id="__span-24-82"><a id="__codelineno-24-82" name="__codelineno-24-82" href="#__codelineno-24-82"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="kt">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span>
</span><span id="__span-24-83"><a id="__codelineno-24-83" name="__codelineno-24-83" href="#__codelineno-24-83"></a><span class="w"> </span><span class="s">"status"</span><span class="p">:</span><span class="w"> </span><span class="s">"success"</span><span class="p">,</span>
</span><span id="__span-24-84"><a id="__codelineno-24-84" name="__codelineno-24-84" href="#__codelineno-24-84"></a><span class="w"> </span><span class="s">"report"</span><span class="p">:</span><span class="w"> </span><span class="nx">report</span><span class="p">,</span>
</span><span id="__span-24-85"><a id="__codelineno-24-85" name="__codelineno-24-85" href="#__codelineno-24-85"></a><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="kc">nil</span>
</span><span id="__span-24-86"><a id="__codelineno-24-86" name="__codelineno-24-86" href="#__codelineno-24-86"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-24-87"><a id="__codelineno-24-87" name="__codelineno-24-87" href="#__codelineno-24-87"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-24-88"><a id="__codelineno-24-88" name="__codelineno-24-88" href="#__codelineno-24-88"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-89"><a id="__codelineno-24-89" name="__codelineno-24-89" href="#__codelineno-24-89"></a><span class="w"> </span><span class="nx">log</span><span class="p">.</span><span class="nx">Fatalf</span><span class="p">(</span><span class="s">"Failed to create get_current_time tool: %v"</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="p">)</span>
</span><span id="__span-24-90"><a id="__codelineno-24-90" name="__codelineno-24-90" href="#__codelineno-24-90"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-91"><a id="__codelineno-24-91" name="__codelineno-24-91" href="#__codelineno-24-91"></a>
</span><span id="__span-24-92"><a id="__codelineno-24-92" name="__codelineno-24-92" href="#__codelineno-24-92"></a><span class="w"> </span><span class="c1">// 2. Define the agent.</span>
</span><span id="__span-24-93"><a id="__codelineno-24-93" name="__codelineno-24-93" href="#__codelineno-24-93"></a><span class="w"> </span><span class="nx">a</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">llmagent</span><span class="p">.</span><span class="nx">New</span><span class="p">(</span><span class="nx">llmagent</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span>
</span><span id="__span-24-94"><a id="__codelineno-24-94" name="__codelineno-24-94" href="#__codelineno-24-94"></a><span class="w"> </span><span class="nx">Name</span><span class="p">:</span><span class="w"> </span><span class="s">"weather_time_agent"</span><span class="p">,</span>
</span><span id="__span-24-95"><a id="__codelineno-24-95" name="__codelineno-24-95" href="#__codelineno-24-95"></a><span class="w"> </span><span class="nx">Model</span><span class="p">:</span><span class="w"> </span><span class="nx">model</span><span class="p">,</span>
</span><span id="__span-24-96"><a id="__codelineno-24-96" name="__codelineno-24-96" href="#__codelineno-24-96"></a><span class="w"> </span><span class="nx">Description</span><span class="p">:</span><span class="w"> </span><span class="s">"Agent to answer questions about the time and weather in a city."</span><span class="p">,</span>
</span><span id="__span-24-97"><a id="__codelineno-24-97" name="__codelineno-24-97" href="#__codelineno-24-97"></a><span class="w"> </span><span class="nx">Instruction</span><span class="p">:</span><span class="w"> </span><span class="s">"You are a helpful agent who can answer user questions about the time and weather in a city."</span><span class="p">,</span>
</span><span id="__span-24-98"><a id="__codelineno-24-98" name="__codelineno-24-98" href="#__codelineno-24-98"></a><span class="w"> </span><span class="nx">Tools</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="nx">tool</span><span class="p">.</span><span class="nx">Tool</span><span class="p">{</span>
</span><span id="__span-24-99"><a id="__codelineno-24-99" name="__codelineno-24-99" href="#__codelineno-24-99"></a><span class="w"> </span><span class="nx">weatherTool</span><span class="p">,</span>
</span><span id="__span-24-100"><a id="__codelineno-24-100" name="__codelineno-24-100" href="#__codelineno-24-100"></a><span class="w"> </span><span class="nx">currentTimeTool</span><span class="p">,</span>
</span><span id="__span-24-101"><a id="__codelineno-24-101" name="__codelineno-24-101" href="#__codelineno-24-101"></a><span class="w"> </span><span class="p">},</span>
</span><span id="__span-24-102"><a id="__codelineno-24-102" name="__codelineno-24-102" href="#__codelineno-24-102"></a><span class="w"> </span><span class="p">})</span>
</span><span id="__span-24-103"><a id="__codelineno-24-103" name="__codelineno-24-103" href="#__codelineno-24-103"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-104"><a id="__codelineno-24-104" name="__codelineno-24-104" href="#__codelineno-24-104"></a><span class="w"> </span><span class="nx">log</span><span class="p">.</span><span class="nx">Fatalf</span><span class="p">(</span><span class="s">"Failed to create agent: %v"</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="p">)</span>
</span><span id="__span-24-105"><a id="__codelineno-24-105" name="__codelineno-24-105" href="#__codelineno-24-105"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-106"><a id="__codelineno-24-106" name="__codelineno-24-106" href="#__codelineno-24-106"></a>
</span><span id="__span-24-107"><a id="__codelineno-24-107" name="__codelineno-24-107" href="#__codelineno-24-107"></a><span class="w"> </span><span class="c1">// 3. Configure the launcher and run.</span>
</span><span id="__span-24-108"><a id="__codelineno-24-108" name="__codelineno-24-108" href="#__codelineno-24-108"></a><span class="w"> </span><span class="nx">config</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">launcher</span><span class="p">.</span><span class="nx">Config</span><span class="p">{</span>
</span><span id="__span-24-109"><a id="__codelineno-24-109" name="__codelineno-24-109" href="#__codelineno-24-109"></a><span class="w"> </span><span class="nx">AgentLoader</span><span class="p">:</span><span class="w"> </span><span class="nx">agent</span><span class="p">.</span><span class="nx">NewSingleLoader</span><span class="p">(</span><span class="nx">a</span><span class="p">),</span>
</span><span id="__span-24-110"><a id="__codelineno-24-110" name="__codelineno-24-110" href="#__codelineno-24-110"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-111"><a id="__codelineno-24-111" name="__codelineno-24-111" href="#__codelineno-24-111"></a>
</span><span id="__span-24-112"><a id="__codelineno-24-112" name="__codelineno-24-112" href="#__codelineno-24-112"></a><span class="w"> </span><span class="nx">l</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">full</span><span class="p">.</span><span class="nx">NewLauncher</span><span class="p">()</span>
</span><span id="__span-24-113"><a id="__codelineno-24-113" name="__codelineno-24-113" href="#__codelineno-24-113"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nx">l</span><span class="p">.</span><span class="nx">Execute</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span><span class="w"> </span><span class="nx">config</span><span class="p">,</span><span class="w"> </span><span class="nx">os</span><span class="p">.</span><span class="nx">Args</span><span class="p">[</span><span class="mi">1</span><span class="p">:]);</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-24-114"><a id="__codelineno-24-114" name="__codelineno-24-114" href="#__codelineno-24-114"></a><span class="w"> </span><span class="nx">log</span><span class="p">.</span><span class="nx">Fatalf</span><span class="p">(</span><span class="s">"Run failed: %v\n\n%s"</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="p">,</span><span class="w"> </span><span class="nx">l</span><span class="p">.</span><span class="nx">CommandLineSyntax</span><span class="p">())</span>
</span><span id="__span-24-115"><a id="__codelineno-24-115" name="__codelineno-24-115" href="#__codelineno-24-115"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-24-116"><a id="__codelineno-24-116" name="__codelineno-24-116" href="#__codelineno-24-116"></a><span class="p">}</span>
</span></code></pre></div>
<h3 id="env_2"><code>.env</code><a class="headerlink" href="#env_2" title="Permanent link">&para;</a></h3>
<p>Create a <code>.env</code> file in the same folder:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="8:2"><input checked="checked" id="os-x--linux_5" name="__tabbed_8" type="radio" /><input id="windows_5" name="__tabbed_8" type="radio" /><div class="tabbed-labels"><label for="os-x--linux_5">OS X &amp; Linux</label><label for="windows_5">Windows</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-bash highlight"><pre><span></span><code><span id="__span-25-1"><a id="__codelineno-25-1" name="__codelineno-25-1" href="#__codelineno-25-1"></a>touch<span class="w"> </span>.env
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-console highlight"><pre><span></span><code><span id="__span-26-1"><a id="__codelineno-26-1" name="__codelineno-26-1" href="#__codelineno-26-1"></a><span class="go">type nul &gt; .env</span>
</span></code></pre></div>
</div>
</div>
</div>
</div>
<div class="tabbed-block">
<p>Java projects generally feature the following project structure:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-27-1"><a id="__codelineno-27-1" name="__codelineno-27-1" href="#__codelineno-27-1"></a><span class="go">project_folder/</span>
</span><span id="__span-27-2"><a id="__codelineno-27-2" name="__codelineno-27-2" href="#__codelineno-27-2"></a><span class="go">├── pom.xml (or build.gradle)</span>
</span><span id="__span-27-3"><a id="__codelineno-27-3" name="__codelineno-27-3" href="#__codelineno-27-3"></a><span class="go">├── src/</span>
</span><span id="__span-27-4"><a id="__codelineno-27-4" name="__codelineno-27-4" href="#__codelineno-27-4"></a><span class="go">├── └── main/</span>
</span><span id="__span-27-5"><a id="__codelineno-27-5" name="__codelineno-27-5" href="#__codelineno-27-5"></a><span class="go">│ └── java/</span>
</span><span id="__span-27-6"><a id="__codelineno-27-6" name="__codelineno-27-6" href="#__codelineno-27-6"></a><span class="go">│ └── agents/</span>
</span><span id="__span-27-7"><a id="__codelineno-27-7" name="__codelineno-27-7" href="#__codelineno-27-7"></a><span class="go">│ └── multitool/</span>
</span><span id="__span-27-8"><a id="__codelineno-27-8" name="__codelineno-27-8" href="#__codelineno-27-8"></a><span class="go">└── test/</span>
</span></code></pre></div>
<h3 id="create-multitoolagentjava">Create <code>MultiToolAgent.java</code><a class="headerlink" href="#create-multitoolagentjava" title="Permanent link">&para;</a></h3>
<p>Create a <code>MultiToolAgent.java</code> source file in the <code>agents.multitool</code> package
in the <code>src/main/java/agents/multitool/</code> directory.</p>
<p>Copy and paste the following code into <code>MultiToolAgent.java</code>:</p>
<div class="language-java highlight"><span class="filename">agents/multitool/MultiToolAgent.java</span><pre><span></span><code><span id="__span-28-1"><a id="__codelineno-28-1" name="__codelineno-28-1" href="#__codelineno-28-1"></a><span class="kn">package</span><span class="w"> </span><span class="nn">agents.multitool</span><span class="p">;</span>
</span><span id="__span-28-2"><a id="__codelineno-28-2" name="__codelineno-28-2" href="#__codelineno-28-2"></a>
</span><span id="__span-28-3"><a id="__codelineno-28-3" name="__codelineno-28-3" href="#__codelineno-28-3"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.adk.agents.BaseAgent</span><span class="p">;</span>
</span><span id="__span-28-4"><a id="__codelineno-28-4" name="__codelineno-28-4" href="#__codelineno-28-4"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.adk.agents.LlmAgent</span><span class="p">;</span>
</span><span id="__span-28-5"><a id="__codelineno-28-5" name="__codelineno-28-5" href="#__codelineno-28-5"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.adk.events.Event</span><span class="p">;</span>
</span><span id="__span-28-6"><a id="__codelineno-28-6" name="__codelineno-28-6" href="#__codelineno-28-6"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.adk.runner.InMemoryRunner</span><span class="p">;</span>
</span><span id="__span-28-7"><a id="__codelineno-28-7" name="__codelineno-28-7" href="#__codelineno-28-7"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.adk.sessions.Session</span><span class="p">;</span>
</span><span id="__span-28-8"><a id="__codelineno-28-8" name="__codelineno-28-8" href="#__codelineno-28-8"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.adk.tools.Annotations.Schema</span><span class="p">;</span>
</span><span id="__span-28-9"><a id="__codelineno-28-9" name="__codelineno-28-9" href="#__codelineno-28-9"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.adk.tools.FunctionTool</span><span class="p">;</span>
</span><span id="__span-28-10"><a id="__codelineno-28-10" name="__codelineno-28-10" href="#__codelineno-28-10"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.genai.types.Content</span><span class="p">;</span>
</span><span id="__span-28-11"><a id="__codelineno-28-11" name="__codelineno-28-11" href="#__codelineno-28-11"></a><span class="kn">import</span><span class="w"> </span><span class="nn">com.google.genai.types.Part</span><span class="p">;</span>
</span><span id="__span-28-12"><a id="__codelineno-28-12" name="__codelineno-28-12" href="#__codelineno-28-12"></a><span class="kn">import</span><span class="w"> </span><span class="nn">io.reactivex.rxjava3.core.Flowable</span><span class="p">;</span>
</span><span id="__span-28-13"><a id="__codelineno-28-13" name="__codelineno-28-13" href="#__codelineno-28-13"></a><span class="kn">import</span><span class="w"> </span><span class="nn">java.nio.charset.StandardCharsets</span><span class="p">;</span>
</span><span id="__span-28-14"><a id="__codelineno-28-14" name="__codelineno-28-14" href="#__codelineno-28-14"></a><span class="kn">import</span><span class="w"> </span><span class="nn">java.text.Normalizer</span><span class="p">;</span>
</span><span id="__span-28-15"><a id="__codelineno-28-15" name="__codelineno-28-15" href="#__codelineno-28-15"></a><span class="kn">import</span><span class="w"> </span><span class="nn">java.time.ZoneId</span><span class="p">;</span>
</span><span id="__span-28-16"><a id="__codelineno-28-16" name="__codelineno-28-16" href="#__codelineno-28-16"></a><span class="kn">import</span><span class="w"> </span><span class="nn">java.time.ZonedDateTime</span><span class="p">;</span>
</span><span id="__span-28-17"><a id="__codelineno-28-17" name="__codelineno-28-17" href="#__codelineno-28-17"></a><span class="kn">import</span><span class="w"> </span><span class="nn">java.time.format.DateTimeFormatter</span><span class="p">;</span>
</span><span id="__span-28-18"><a id="__codelineno-28-18" name="__codelineno-28-18" href="#__codelineno-28-18"></a><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Map</span><span class="p">;</span>
</span><span id="__span-28-19"><a id="__codelineno-28-19" name="__codelineno-28-19" href="#__codelineno-28-19"></a><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.Scanner</span><span class="p">;</span>
</span><span id="__span-28-20"><a id="__codelineno-28-20" name="__codelineno-28-20" href="#__codelineno-28-20"></a>
</span><span id="__span-28-21"><a id="__codelineno-28-21" name="__codelineno-28-21" href="#__codelineno-28-21"></a><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">MultiToolAgent</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-22"><a id="__codelineno-28-22" name="__codelineno-28-22" href="#__codelineno-28-22"></a>
</span><span id="__span-28-23"><a id="__codelineno-28-23" name="__codelineno-28-23" href="#__codelineno-28-23"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">USER_ID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"student"</span><span class="p">;</span>
</span><span id="__span-28-24"><a id="__codelineno-28-24" name="__codelineno-28-24" href="#__codelineno-28-24"></a><span class="w"> </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">NAME</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"multi_tool_agent"</span><span class="p">;</span>
</span><span id="__span-28-25"><a id="__codelineno-28-25" name="__codelineno-28-25" href="#__codelineno-28-25"></a>
</span><span id="__span-28-26"><a id="__codelineno-28-26" name="__codelineno-28-26" href="#__codelineno-28-26"></a><span class="w"> </span><span class="c1">// The run your agent with Dev UI, the ROOT_AGENT should be a global public static final variable.</span>
</span><span id="__span-28-27"><a id="__codelineno-28-27" name="__codelineno-28-27" href="#__codelineno-28-27"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">BaseAgent</span><span class="w"> </span><span class="n">ROOT_AGENT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">initAgent</span><span class="p">();</span>
</span><span id="__span-28-28"><a id="__codelineno-28-28" name="__codelineno-28-28" href="#__codelineno-28-28"></a>
</span><span id="__span-28-29"><a id="__codelineno-28-29" name="__codelineno-28-29" href="#__codelineno-28-29"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">BaseAgent</span><span class="w"> </span><span class="nf">initAgent</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-30"><a id="__codelineno-28-30" name="__codelineno-28-30" href="#__codelineno-28-30"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">LlmAgent</span><span class="p">.</span><span class="na">builder</span><span class="p">()</span>
</span><span id="__span-28-31"><a id="__codelineno-28-31" name="__codelineno-28-31" href="#__codelineno-28-31"></a><span class="w"> </span><span class="p">.</span><span class="na">name</span><span class="p">(</span><span class="n">NAME</span><span class="p">)</span>
</span><span id="__span-28-32"><a id="__codelineno-28-32" name="__codelineno-28-32" href="#__codelineno-28-32"></a><span class="w"> </span><span class="p">.</span><span class="na">model</span><span class="p">(</span><span class="s">"gemini-flash-latest"</span><span class="p">)</span>
</span><span id="__span-28-33"><a id="__codelineno-28-33" name="__codelineno-28-33" href="#__codelineno-28-33"></a><span class="w"> </span><span class="p">.</span><span class="na">description</span><span class="p">(</span><span class="s">"Agent to answer questions about the time and weather in a city."</span><span class="p">)</span>
</span><span id="__span-28-34"><a id="__codelineno-28-34" name="__codelineno-28-34" href="#__codelineno-28-34"></a><span class="w"> </span><span class="p">.</span><span class="na">instruction</span><span class="p">(</span>
</span><span id="__span-28-35"><a id="__codelineno-28-35" name="__codelineno-28-35" href="#__codelineno-28-35"></a><span class="w"> </span><span class="s">"You are a helpful agent who can answer user questions about the time and weather"</span>
</span><span id="__span-28-36"><a id="__codelineno-28-36" name="__codelineno-28-36" href="#__codelineno-28-36"></a><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" in a city."</span><span class="p">)</span>
</span><span id="__span-28-37"><a id="__codelineno-28-37" name="__codelineno-28-37" href="#__codelineno-28-37"></a><span class="w"> </span><span class="p">.</span><span class="na">tools</span><span class="p">(</span>
</span><span id="__span-28-38"><a id="__codelineno-28-38" name="__codelineno-28-38" href="#__codelineno-28-38"></a><span class="w"> </span><span class="n">FunctionTool</span><span class="p">.</span><span class="na">create</span><span class="p">(</span><span class="n">MultiToolAgent</span><span class="p">.</span><span class="na">class</span><span class="p">,</span><span class="w"> </span><span class="s">"getCurrentTime"</span><span class="p">),</span>
</span><span id="__span-28-39"><a id="__codelineno-28-39" name="__codelineno-28-39" href="#__codelineno-28-39"></a><span class="w"> </span><span class="n">FunctionTool</span><span class="p">.</span><span class="na">create</span><span class="p">(</span><span class="n">MultiToolAgent</span><span class="p">.</span><span class="na">class</span><span class="p">,</span><span class="w"> </span><span class="s">"getWeather"</span><span class="p">))</span>
</span><span id="__span-28-40"><a id="__codelineno-28-40" name="__codelineno-28-40" href="#__codelineno-28-40"></a><span class="w"> </span><span class="p">.</span><span class="na">build</span><span class="p">();</span>
</span><span id="__span-28-41"><a id="__codelineno-28-41" name="__codelineno-28-41" href="#__codelineno-28-41"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-42"><a id="__codelineno-28-42" name="__codelineno-28-42" href="#__codelineno-28-42"></a>
</span><span id="__span-28-43"><a id="__codelineno-28-43" name="__codelineno-28-43" href="#__codelineno-28-43"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">getCurrentTime</span><span class="p">(</span>
</span><span id="__span-28-44"><a id="__codelineno-28-44" name="__codelineno-28-44" href="#__codelineno-28-44"></a><span class="w"> </span><span class="nd">@Schema</span><span class="p">(</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"city"</span><span class="p">,</span>
</span><span id="__span-28-45"><a id="__codelineno-28-45" name="__codelineno-28-45" href="#__codelineno-28-45"></a><span class="w"> </span><span class="n">description</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"The name of the city for which to retrieve the current time"</span><span class="p">)</span>
</span><span id="__span-28-46"><a id="__codelineno-28-46" name="__codelineno-28-46" href="#__codelineno-28-46"></a><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">city</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-47"><a id="__codelineno-28-47" name="__codelineno-28-47" href="#__codelineno-28-47"></a><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">normalizedCity</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-28-48"><a id="__codelineno-28-48" name="__codelineno-28-48" href="#__codelineno-28-48"></a><span class="w"> </span><span class="n">Normalizer</span><span class="p">.</span><span class="na">normalize</span><span class="p">(</span><span class="n">city</span><span class="p">,</span><span class="w"> </span><span class="n">Normalizer</span><span class="p">.</span><span class="na">Form</span><span class="p">.</span><span class="na">NFD</span><span class="p">)</span>
</span><span id="__span-28-49"><a id="__codelineno-28-49" name="__codelineno-28-49" href="#__codelineno-28-49"></a><span class="w"> </span><span class="p">.</span><span class="na">trim</span><span class="p">()</span>
</span><span id="__span-28-50"><a id="__codelineno-28-50" name="__codelineno-28-50" href="#__codelineno-28-50"></a><span class="w"> </span><span class="p">.</span><span class="na">toLowerCase</span><span class="p">()</span>
</span><span id="__span-28-51"><a id="__codelineno-28-51" name="__codelineno-28-51" href="#__codelineno-28-51"></a><span class="w"> </span><span class="p">.</span><span class="na">replaceAll</span><span class="p">(</span><span class="s">"(\\p{IsM}+|\\p{IsP}+)"</span><span class="p">,</span><span class="w"> </span><span class="s">""</span><span class="p">)</span>
</span><span id="__span-28-52"><a id="__codelineno-28-52" name="__codelineno-28-52" href="#__codelineno-28-52"></a><span class="w"> </span><span class="p">.</span><span class="na">replaceAll</span><span class="p">(</span><span class="s">"\\s+"</span><span class="p">,</span><span class="w"> </span><span class="s">"_"</span><span class="p">);</span>
</span><span id="__span-28-53"><a id="__codelineno-28-53" name="__codelineno-28-53" href="#__codelineno-28-53"></a>
</span><span id="__span-28-54"><a id="__codelineno-28-54" name="__codelineno-28-54" href="#__codelineno-28-54"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">ZoneId</span><span class="p">.</span><span class="na">getAvailableZoneIds</span><span class="p">().</span><span class="na">stream</span><span class="p">()</span>
</span><span id="__span-28-55"><a id="__codelineno-28-55" name="__codelineno-28-55" href="#__codelineno-28-55"></a><span class="w"> </span><span class="p">.</span><span class="na">filter</span><span class="p">(</span><span class="n">zid</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">zid</span><span class="p">.</span><span class="na">toLowerCase</span><span class="p">().</span><span class="na">endsWith</span><span class="p">(</span><span class="s">"/"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">normalizedCity</span><span class="p">))</span>
</span><span id="__span-28-56"><a id="__codelineno-28-56" name="__codelineno-28-56" href="#__codelineno-28-56"></a><span class="w"> </span><span class="p">.</span><span class="na">findFirst</span><span class="p">()</span>
</span><span id="__span-28-57"><a id="__codelineno-28-57" name="__codelineno-28-57" href="#__codelineno-28-57"></a><span class="w"> </span><span class="p">.</span><span class="na">map</span><span class="p">(</span>
</span><span id="__span-28-58"><a id="__codelineno-28-58" name="__codelineno-28-58" href="#__codelineno-28-58"></a><span class="w"> </span><span class="n">zid</span><span class="w"> </span><span class="o">-&gt;</span>
</span><span id="__span-28-59"><a id="__codelineno-28-59" name="__codelineno-28-59" href="#__codelineno-28-59"></a><span class="w"> </span><span class="n">Map</span><span class="p">.</span><span class="na">of</span><span class="p">(</span>
</span><span id="__span-28-60"><a id="__codelineno-28-60" name="__codelineno-28-60" href="#__codelineno-28-60"></a><span class="w"> </span><span class="s">"status"</span><span class="p">,</span>
</span><span id="__span-28-61"><a id="__codelineno-28-61" name="__codelineno-28-61" href="#__codelineno-28-61"></a><span class="w"> </span><span class="s">"success"</span><span class="p">,</span>
</span><span id="__span-28-62"><a id="__codelineno-28-62" name="__codelineno-28-62" href="#__codelineno-28-62"></a><span class="w"> </span><span class="s">"report"</span><span class="p">,</span>
</span><span id="__span-28-63"><a id="__codelineno-28-63" name="__codelineno-28-63" href="#__codelineno-28-63"></a><span class="w"> </span><span class="s">"The current time in "</span>
</span><span id="__span-28-64"><a id="__codelineno-28-64" name="__codelineno-28-64" href="#__codelineno-28-64"></a><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">city</span>
</span><span id="__span-28-65"><a id="__codelineno-28-65" name="__codelineno-28-65" href="#__codelineno-28-65"></a><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" is "</span>
</span><span id="__span-28-66"><a id="__codelineno-28-66" name="__codelineno-28-66" href="#__codelineno-28-66"></a><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">ZonedDateTime</span><span class="p">.</span><span class="na">now</span><span class="p">(</span><span class="n">ZoneId</span><span class="p">.</span><span class="na">of</span><span class="p">(</span><span class="n">zid</span><span class="p">))</span>
</span><span id="__span-28-67"><a id="__codelineno-28-67" name="__codelineno-28-67" href="#__codelineno-28-67"></a><span class="w"> </span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="n">DateTimeFormatter</span><span class="p">.</span><span class="na">ofPattern</span><span class="p">(</span><span class="s">"HH:mm"</span><span class="p">))</span>
</span><span id="__span-28-68"><a id="__codelineno-28-68" name="__codelineno-28-68" href="#__codelineno-28-68"></a><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">"."</span><span class="p">))</span>
</span><span id="__span-28-69"><a id="__codelineno-28-69" name="__codelineno-28-69" href="#__codelineno-28-69"></a><span class="w"> </span><span class="p">.</span><span class="na">orElse</span><span class="p">(</span>
</span><span id="__span-28-70"><a id="__codelineno-28-70" name="__codelineno-28-70" href="#__codelineno-28-70"></a><span class="w"> </span><span class="n">Map</span><span class="p">.</span><span class="na">of</span><span class="p">(</span>
</span><span id="__span-28-71"><a id="__codelineno-28-71" name="__codelineno-28-71" href="#__codelineno-28-71"></a><span class="w"> </span><span class="s">"status"</span><span class="p">,</span>
</span><span id="__span-28-72"><a id="__codelineno-28-72" name="__codelineno-28-72" href="#__codelineno-28-72"></a><span class="w"> </span><span class="s">"error"</span><span class="p">,</span>
</span><span id="__span-28-73"><a id="__codelineno-28-73" name="__codelineno-28-73" href="#__codelineno-28-73"></a><span class="w"> </span><span class="s">"report"</span><span class="p">,</span>
</span><span id="__span-28-74"><a id="__codelineno-28-74" name="__codelineno-28-74" href="#__codelineno-28-74"></a><span class="w"> </span><span class="s">"Sorry, I don't have timezone information for "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">city</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">"."</span><span class="p">));</span>
</span><span id="__span-28-75"><a id="__codelineno-28-75" name="__codelineno-28-75" href="#__codelineno-28-75"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-76"><a id="__codelineno-28-76" name="__codelineno-28-76" href="#__codelineno-28-76"></a>
</span><span id="__span-28-77"><a id="__codelineno-28-77" name="__codelineno-28-77" href="#__codelineno-28-77"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">getWeather</span><span class="p">(</span>
</span><span id="__span-28-78"><a id="__codelineno-28-78" name="__codelineno-28-78" href="#__codelineno-28-78"></a><span class="w"> </span><span class="nd">@Schema</span><span class="p">(</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"city"</span><span class="p">,</span>
</span><span id="__span-28-79"><a id="__codelineno-28-79" name="__codelineno-28-79" href="#__codelineno-28-79"></a><span class="w"> </span><span class="n">description</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"The name of the city for which to retrieve the weather report"</span><span class="p">)</span>
</span><span id="__span-28-80"><a id="__codelineno-28-80" name="__codelineno-28-80" href="#__codelineno-28-80"></a><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">city</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-81"><a id="__codelineno-28-81" name="__codelineno-28-81" href="#__codelineno-28-81"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">city</span><span class="p">.</span><span class="na">toLowerCase</span><span class="p">().</span><span class="na">equals</span><span class="p">(</span><span class="s">"new york"</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-82"><a id="__codelineno-28-82" name="__codelineno-28-82" href="#__codelineno-28-82"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Map</span><span class="p">.</span><span class="na">of</span><span class="p">(</span>
</span><span id="__span-28-83"><a id="__codelineno-28-83" name="__codelineno-28-83" href="#__codelineno-28-83"></a><span class="w"> </span><span class="s">"status"</span><span class="p">,</span>
</span><span id="__span-28-84"><a id="__codelineno-28-84" name="__codelineno-28-84" href="#__codelineno-28-84"></a><span class="w"> </span><span class="s">"success"</span><span class="p">,</span>
</span><span id="__span-28-85"><a id="__codelineno-28-85" name="__codelineno-28-85" href="#__codelineno-28-85"></a><span class="w"> </span><span class="s">"report"</span><span class="p">,</span>
</span><span id="__span-28-86"><a id="__codelineno-28-86" name="__codelineno-28-86" href="#__codelineno-28-86"></a><span class="w"> </span><span class="s">"The weather in New York is sunny with a temperature of 25 degrees Celsius (77 degrees"</span>
</span><span id="__span-28-87"><a id="__codelineno-28-87" name="__codelineno-28-87" href="#__codelineno-28-87"></a><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" Fahrenheit)."</span><span class="p">);</span>
</span><span id="__span-28-88"><a id="__codelineno-28-88" name="__codelineno-28-88" href="#__codelineno-28-88"></a>
</span><span id="__span-28-89"><a id="__codelineno-28-89" name="__codelineno-28-89" href="#__codelineno-28-89"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-90"><a id="__codelineno-28-90" name="__codelineno-28-90" href="#__codelineno-28-90"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">Map</span><span class="p">.</span><span class="na">of</span><span class="p">(</span>
</span><span id="__span-28-91"><a id="__codelineno-28-91" name="__codelineno-28-91" href="#__codelineno-28-91"></a><span class="w"> </span><span class="s">"status"</span><span class="p">,</span><span class="w"> </span><span class="s">"error"</span><span class="p">,</span><span class="w"> </span><span class="s">"report"</span><span class="p">,</span><span class="w"> </span><span class="s">"Weather information for "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">city</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">" is not available."</span><span class="p">);</span>
</span><span id="__span-28-92"><a id="__codelineno-28-92" name="__codelineno-28-92" href="#__codelineno-28-92"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-93"><a id="__codelineno-28-93" name="__codelineno-28-93" href="#__codelineno-28-93"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-94"><a id="__codelineno-28-94" name="__codelineno-28-94" href="#__codelineno-28-94"></a>
</span><span id="__span-28-95"><a id="__codelineno-28-95" name="__codelineno-28-95" href="#__codelineno-28-95"></a><span class="w"> </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-96"><a id="__codelineno-28-96" name="__codelineno-28-96" href="#__codelineno-28-96"></a><span class="w"> </span><span class="n">InMemoryRunner</span><span class="w"> </span><span class="n">runner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">InMemoryRunner</span><span class="p">(</span><span class="n">ROOT_AGENT</span><span class="p">);</span>
</span><span id="__span-28-97"><a id="__codelineno-28-97" name="__codelineno-28-97" href="#__codelineno-28-97"></a>
</span><span id="__span-28-98"><a id="__codelineno-28-98" name="__codelineno-28-98" href="#__codelineno-28-98"></a><span class="w"> </span><span class="n">Session</span><span class="w"> </span><span class="n">session</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-28-99"><a id="__codelineno-28-99" name="__codelineno-28-99" href="#__codelineno-28-99"></a><span class="w"> </span><span class="n">runner</span>
</span><span id="__span-28-100"><a id="__codelineno-28-100" name="__codelineno-28-100" href="#__codelineno-28-100"></a><span class="w"> </span><span class="p">.</span><span class="na">sessionService</span><span class="p">()</span>
</span><span id="__span-28-101"><a id="__codelineno-28-101" name="__codelineno-28-101" href="#__codelineno-28-101"></a><span class="w"> </span><span class="p">.</span><span class="na">createSession</span><span class="p">(</span><span class="n">NAME</span><span class="p">,</span><span class="w"> </span><span class="n">USER_ID</span><span class="p">)</span>
</span><span id="__span-28-102"><a id="__codelineno-28-102" name="__codelineno-28-102" href="#__codelineno-28-102"></a><span class="w"> </span><span class="p">.</span><span class="na">blockingGet</span><span class="p">();</span>
</span><span id="__span-28-103"><a id="__codelineno-28-103" name="__codelineno-28-103" href="#__codelineno-28-103"></a>
</span><span id="__span-28-104"><a id="__codelineno-28-104" name="__codelineno-28-104" href="#__codelineno-28-104"></a><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="p">(</span><span class="n">Scanner</span><span class="w"> </span><span class="n">scanner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Scanner</span><span class="p">(</span><span class="n">System</span><span class="p">.</span><span class="na">in</span><span class="p">,</span><span class="w"> </span><span class="n">StandardCharsets</span><span class="p">.</span><span class="na">UTF_8</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-105"><a id="__codelineno-28-105" name="__codelineno-28-105" href="#__codelineno-28-105"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="kc">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-106"><a id="__codelineno-28-106" name="__codelineno-28-106" href="#__codelineno-28-106"></a><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">print</span><span class="p">(</span><span class="s">"\nYou &gt; "</span><span class="p">);</span>
</span><span id="__span-28-107"><a id="__codelineno-28-107" name="__codelineno-28-107" href="#__codelineno-28-107"></a><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">userInput</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scanner</span><span class="p">.</span><span class="na">nextLine</span><span class="p">();</span>
</span><span id="__span-28-108"><a id="__codelineno-28-108" name="__codelineno-28-108" href="#__codelineno-28-108"></a>
</span><span id="__span-28-109"><a id="__codelineno-28-109" name="__codelineno-28-109" href="#__codelineno-28-109"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="s">"quit"</span><span class="p">.</span><span class="na">equalsIgnoreCase</span><span class="p">(</span><span class="n">userInput</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-28-110"><a id="__codelineno-28-110" name="__codelineno-28-110" href="#__codelineno-28-110"></a><span class="w"> </span><span class="k">break</span><span class="p">;</span>
</span><span id="__span-28-111"><a id="__codelineno-28-111" name="__codelineno-28-111" href="#__codelineno-28-111"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-112"><a id="__codelineno-28-112" name="__codelineno-28-112" href="#__codelineno-28-112"></a>
</span><span id="__span-28-113"><a id="__codelineno-28-113" name="__codelineno-28-113" href="#__codelineno-28-113"></a><span class="w"> </span><span class="n">Content</span><span class="w"> </span><span class="n">userMsg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Content</span><span class="p">.</span><span class="na">fromParts</span><span class="p">(</span><span class="n">Part</span><span class="p">.</span><span class="na">fromText</span><span class="p">(</span><span class="n">userInput</span><span class="p">));</span>
</span><span id="__span-28-114"><a id="__codelineno-28-114" name="__codelineno-28-114" href="#__codelineno-28-114"></a><span class="w"> </span><span class="n">Flowable</span><span class="o">&lt;</span><span class="n">Event</span><span class="o">&gt;</span><span class="w"> </span><span class="n">events</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">runner</span><span class="p">.</span><span class="na">runAsync</span><span class="p">(</span><span class="n">USER_ID</span><span class="p">,</span><span class="w"> </span><span class="n">session</span><span class="p">.</span><span class="na">id</span><span class="p">(),</span><span class="w"> </span><span class="n">userMsg</span><span class="p">);</span>
</span><span id="__span-28-115"><a id="__codelineno-28-115" name="__codelineno-28-115" href="#__codelineno-28-115"></a>
</span><span id="__span-28-116"><a id="__codelineno-28-116" name="__codelineno-28-116" href="#__codelineno-28-116"></a><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">print</span><span class="p">(</span><span class="s">"\nAgent &gt; "</span><span class="p">);</span>
</span><span id="__span-28-117"><a id="__codelineno-28-117" name="__codelineno-28-117" href="#__codelineno-28-117"></a><span class="w"> </span><span class="n">events</span><span class="p">.</span><span class="na">blockingForEach</span><span class="p">(</span><span class="n">event</span><span class="w"> </span><span class="o">-&gt;</span><span class="w"> </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">event</span><span class="p">.</span><span class="na">stringifyContent</span><span class="p">()));</span>
</span><span id="__span-28-118"><a id="__codelineno-28-118" name="__codelineno-28-118" href="#__codelineno-28-118"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-119"><a id="__codelineno-28-119" name="__codelineno-28-119" href="#__codelineno-28-119"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-120"><a id="__codelineno-28-120" name="__codelineno-28-120" href="#__codelineno-28-120"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-28-121"><a id="__codelineno-28-121" name="__codelineno-28-121" href="#__codelineno-28-121"></a><span class="p">}</span>
</span></code></pre></div>
</div>
<div class="tabbed-block">
<p>Kotlin projects generally feature the following project structure:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-29-1"><a id="__codelineno-29-1" name="__codelineno-29-1" href="#__codelineno-29-1"></a><span class="go">project_folder/</span>
</span><span id="__span-29-2"><a id="__codelineno-29-2" name="__codelineno-29-2" href="#__codelineno-29-2"></a><span class="go">├── build.gradle.kts</span>
</span><span id="__span-29-3"><a id="__codelineno-29-3" name="__codelineno-29-3" href="#__codelineno-29-3"></a><span class="go">├── src/</span>
</span><span id="__span-29-4"><a id="__codelineno-29-4" name="__codelineno-29-4" href="#__codelineno-29-4"></a><span class="go">├── └── main/</span>
</span><span id="__span-29-5"><a id="__codelineno-29-5" name="__codelineno-29-5" href="#__codelineno-29-5"></a><span class="go">│ └── kotlin/</span>
</span><span id="__span-29-6"><a id="__codelineno-29-6" name="__codelineno-29-6" href="#__codelineno-29-6"></a><span class="go">│ └── agents/</span>
</span><span id="__span-29-7"><a id="__codelineno-29-7" name="__codelineno-29-7" href="#__codelineno-29-7"></a><span class="go">│ └── multitool/</span>
</span></code></pre></div>
<h3 id="create-multitoolagentkt">Create <code>MultiToolAgent.kt</code><a class="headerlink" href="#create-multitoolagentkt" title="Permanent link">&para;</a></h3>
<p>Create a <code>MultiToolAgent.kt</code> source file in the <code>src/main/kotlin/agents/multitool/</code> directory.</p>
<p>Copy and paste the following code into <code>MultiToolAgent.kt</code>:</p>
<div class="language-kotlin highlight"><span class="filename">src/main/kotlin/agents/multitool/MultiToolAgent.kt</span><pre><span></span><code><span id="__span-30-1"><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a><span class="k">package</span><span class="w"> </span><span class="nn">agents.multitool</span>
</span><span id="__span-30-2"><a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a>
</span><span id="__span-30-3"><a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.agents.Instruction</span>
</span><span id="__span-30-4"><a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.agents.LlmAgent</span>
</span><span id="__span-30-5"><a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.annotations.Param</span>
</span><span id="__span-30-6"><a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.annotations.Tool</span>
</span><span id="__span-30-7"><a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.models.Gemini</span>
</span><span id="__span-30-8"><a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.runners.InMemoryRunner</span>
</span><span id="__span-30-9"><a id="__codelineno-30-9" name="__codelineno-30-9" href="#__codelineno-30-9"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.sessions.InMemorySessionService</span>
</span><span id="__span-30-10"><a id="__codelineno-30-10" name="__codelineno-30-10" href="#__codelineno-30-10"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.sessions.SessionKey</span>
</span><span id="__span-30-11"><a id="__codelineno-30-11" name="__codelineno-30-11" href="#__codelineno-30-11"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.types.Content</span>
</span><span id="__span-30-12"><a id="__codelineno-30-12" name="__codelineno-30-12" href="#__codelineno-30-12"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.types.Part</span>
</span><span id="__span-30-13"><a id="__codelineno-30-13" name="__codelineno-30-13" href="#__codelineno-30-13"></a><span class="k">import</span><span class="w"> </span><span class="nn">com.google.adk.kt.types.Role</span>
</span><span id="__span-30-14"><a id="__codelineno-30-14" name="__codelineno-30-14" href="#__codelineno-30-14"></a><span class="k">import</span><span class="w"> </span><span class="nn">kotlinx.coroutines.flow.toList</span>
</span><span id="__span-30-15"><a id="__codelineno-30-15" name="__codelineno-30-15" href="#__codelineno-30-15"></a><span class="k">import</span><span class="w"> </span><span class="nn">kotlinx.coroutines.runBlocking</span>
</span><span id="__span-30-16"><a id="__codelineno-30-16" name="__codelineno-30-16" href="#__codelineno-30-16"></a><span class="k">import</span><span class="w"> </span><span class="nn">java.text.Normalizer</span>
</span><span id="__span-30-17"><a id="__codelineno-30-17" name="__codelineno-30-17" href="#__codelineno-30-17"></a><span class="k">import</span><span class="w"> </span><span class="nn">java.time.ZoneId</span>
</span><span id="__span-30-18"><a id="__codelineno-30-18" name="__codelineno-30-18" href="#__codelineno-30-18"></a><span class="k">import</span><span class="w"> </span><span class="nn">java.time.ZonedDateTime</span>
</span><span id="__span-30-19"><a id="__codelineno-30-19" name="__codelineno-30-19" href="#__codelineno-30-19"></a><span class="k">import</span><span class="w"> </span><span class="nn">java.time.format.DateTimeFormatter</span>
</span><span id="__span-30-20"><a id="__codelineno-30-20" name="__codelineno-30-20" href="#__codelineno-30-20"></a><span class="k">import</span><span class="w"> </span><span class="nn">java.util.Scanner</span>
</span><span id="__span-30-21"><a id="__codelineno-30-21" name="__codelineno-30-21" href="#__codelineno-30-21"></a>
</span><span id="__span-30-22"><a id="__codelineno-30-22" name="__codelineno-30-22" href="#__codelineno-30-22"></a><span class="kd">class</span><span class="w"> </span><span class="nc">MultiToolService</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-23"><a id="__codelineno-30-23" name="__codelineno-30-23" href="#__codelineno-30-23"></a><span class="w"> </span><span class="nd">@Tool</span>
</span><span id="__span-30-24"><a id="__codelineno-30-24" name="__codelineno-30-24" href="#__codelineno-30-24"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">getCurrentTime</span><span class="p">(</span>
</span><span id="__span-30-25"><a id="__codelineno-30-25" name="__codelineno-30-25" href="#__codelineno-30-25"></a><span class="w"> </span><span class="nd">@Param</span><span class="p">(</span><span class="s">"The name of the city for which to retrieve the current time"</span><span class="p">)</span><span class="w"> </span><span class="n">city</span><span class="p">:</span><span class="w"> </span><span class="kt">String</span><span class="p">,</span>
</span><span id="__span-30-26"><a id="__codelineno-30-26" name="__codelineno-30-26" href="#__codelineno-30-26"></a><span class="w"> </span><span class="p">):</span><span class="w"> </span><span class="n">Map</span><span class="o">&lt;</span><span class="kt">String</span><span class="p">,</span><span class="w"> </span><span class="kt">String</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-27"><a id="__codelineno-30-27" name="__codelineno-30-27" href="#__codelineno-30-27"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">normalizedCity</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-28"><a id="__codelineno-30-28" name="__codelineno-30-28" href="#__codelineno-30-28"></a><span class="w"> </span><span class="n">Normalizer</span><span class="p">.</span><span class="na">normalize</span><span class="p">(</span><span class="n">city</span><span class="p">,</span><span class="w"> </span><span class="n">Normalizer</span><span class="p">.</span><span class="na">Form</span><span class="p">.</span><span class="na">NFD</span><span class="p">)</span>
</span><span id="__span-30-29"><a id="__codelineno-30-29" name="__codelineno-30-29" href="#__codelineno-30-29"></a><span class="w"> </span><span class="p">.</span><span class="na">trim</span><span class="p">()</span>
</span><span id="__span-30-30"><a id="__codelineno-30-30" name="__codelineno-30-30" href="#__codelineno-30-30"></a><span class="w"> </span><span class="p">.</span><span class="na">lowercase</span><span class="p">()</span>
</span><span id="__span-30-31"><a id="__codelineno-30-31" name="__codelineno-30-31" href="#__codelineno-30-31"></a><span class="w"> </span><span class="p">.</span><span class="na">replace</span><span class="p">(</span><span class="n">Regex</span><span class="p">(</span><span class="s">"(\\p{IsM}+|\\p{IsP}+)"</span><span class="p">),</span><span class="w"> </span><span class="s">""</span><span class="p">)</span>
</span><span id="__span-30-32"><a id="__codelineno-30-32" name="__codelineno-30-32" href="#__codelineno-30-32"></a><span class="w"> </span><span class="p">.</span><span class="na">replace</span><span class="p">(</span><span class="n">Regex</span><span class="p">(</span><span class="s">"\\s+"</span><span class="p">),</span><span class="w"> </span><span class="s">"_"</span><span class="p">)</span>
</span><span id="__span-30-33"><a id="__codelineno-30-33" name="__codelineno-30-33" href="#__codelineno-30-33"></a>
</span><span id="__span-30-34"><a id="__codelineno-30-34" name="__codelineno-30-34" href="#__codelineno-30-34"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">zoneId</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-35"><a id="__codelineno-30-35" name="__codelineno-30-35" href="#__codelineno-30-35"></a><span class="w"> </span><span class="n">ZoneId</span><span class="p">.</span><span class="na">getAvailableZoneIds</span><span class="p">()</span>
</span><span id="__span-30-36"><a id="__codelineno-30-36" name="__codelineno-30-36" href="#__codelineno-30-36"></a><span class="w"> </span><span class="p">.</span><span class="na">firstOrNull</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nb">it</span><span class="p">.</span><span class="na">lowercase</span><span class="p">().</span><span class="na">endsWith</span><span class="p">(</span><span class="s">"/</span><span class="si">$</span><span class="n">normalizedCity</span><span class="s">"</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-37"><a id="__codelineno-30-37" name="__codelineno-30-37" href="#__codelineno-30-37"></a>
</span><span id="__span-30-38"><a id="__codelineno-30-38" name="__codelineno-30-38" href="#__codelineno-30-38"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">zoneId</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-39"><a id="__codelineno-30-39" name="__codelineno-30-39" href="#__codelineno-30-39"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">time</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-40"><a id="__codelineno-30-40" name="__codelineno-30-40" href="#__codelineno-30-40"></a><span class="w"> </span><span class="n">ZonedDateTime</span><span class="p">.</span><span class="na">now</span><span class="p">(</span><span class="n">ZoneId</span><span class="p">.</span><span class="na">of</span><span class="p">(</span><span class="n">zoneId</span><span class="p">))</span>
</span><span id="__span-30-41"><a id="__codelineno-30-41" name="__codelineno-30-41" href="#__codelineno-30-41"></a><span class="w"> </span><span class="p">.</span><span class="na">format</span><span class="p">(</span><span class="n">DateTimeFormatter</span><span class="p">.</span><span class="na">ofPattern</span><span class="p">(</span><span class="s">"HH:mm"</span><span class="p">))</span>
</span><span id="__span-30-42"><a id="__codelineno-30-42" name="__codelineno-30-42" href="#__codelineno-30-42"></a><span class="w"> </span><span class="n">mapOf</span><span class="p">(</span>
</span><span id="__span-30-43"><a id="__codelineno-30-43" name="__codelineno-30-43" href="#__codelineno-30-43"></a><span class="w"> </span><span class="s">"status"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"success"</span><span class="p">,</span>
</span><span id="__span-30-44"><a id="__codelineno-30-44" name="__codelineno-30-44" href="#__codelineno-30-44"></a><span class="w"> </span><span class="s">"report"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"The current time in </span><span class="si">$</span><span class="n">city</span><span class="s"> is </span><span class="si">$</span><span class="n">time</span><span class="s">."</span><span class="p">,</span>
</span><span id="__span-30-45"><a id="__codelineno-30-45" name="__codelineno-30-45" href="#__codelineno-30-45"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-30-46"><a id="__codelineno-30-46" name="__codelineno-30-46" href="#__codelineno-30-46"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-47"><a id="__codelineno-30-47" name="__codelineno-30-47" href="#__codelineno-30-47"></a><span class="w"> </span><span class="n">mapOf</span><span class="p">(</span>
</span><span id="__span-30-48"><a id="__codelineno-30-48" name="__codelineno-30-48" href="#__codelineno-30-48"></a><span class="w"> </span><span class="s">"status"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"error"</span><span class="p">,</span>
</span><span id="__span-30-49"><a id="__codelineno-30-49" name="__codelineno-30-49" href="#__codelineno-30-49"></a><span class="w"> </span><span class="s">"report"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"Sorry, I don't have timezone information for </span><span class="si">$</span><span class="n">city</span><span class="s">."</span><span class="p">,</span>
</span><span id="__span-30-50"><a id="__codelineno-30-50" name="__codelineno-30-50" href="#__codelineno-30-50"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-30-51"><a id="__codelineno-30-51" name="__codelineno-30-51" href="#__codelineno-30-51"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-52"><a id="__codelineno-30-52" name="__codelineno-30-52" href="#__codelineno-30-52"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-53"><a id="__codelineno-30-53" name="__codelineno-30-53" href="#__codelineno-30-53"></a>
</span><span id="__span-30-54"><a id="__codelineno-30-54" name="__codelineno-30-54" href="#__codelineno-30-54"></a><span class="w"> </span><span class="nd">@Tool</span>
</span><span id="__span-30-55"><a id="__codelineno-30-55" name="__codelineno-30-55" href="#__codelineno-30-55"></a><span class="w"> </span><span class="kd">fun</span><span class="w"> </span><span class="nf">getWeather</span><span class="p">(</span>
</span><span id="__span-30-56"><a id="__codelineno-30-56" name="__codelineno-30-56" href="#__codelineno-30-56"></a><span class="w"> </span><span class="nd">@Param</span><span class="p">(</span><span class="s">"The name of the city for which to retrieve the weather report"</span><span class="p">)</span><span class="w"> </span><span class="n">city</span><span class="p">:</span><span class="w"> </span><span class="kt">String</span><span class="p">,</span>
</span><span id="__span-30-57"><a id="__codelineno-30-57" name="__codelineno-30-57" href="#__codelineno-30-57"></a><span class="w"> </span><span class="p">):</span><span class="w"> </span><span class="n">Map</span><span class="o">&lt;</span><span class="kt">String</span><span class="p">,</span><span class="w"> </span><span class="kt">String</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-58"><a id="__codelineno-30-58" name="__codelineno-30-58" href="#__codelineno-30-58"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">city</span><span class="p">.</span><span class="na">lowercase</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">"new york"</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-59"><a id="__codelineno-30-59" name="__codelineno-30-59" href="#__codelineno-30-59"></a><span class="w"> </span><span class="n">mapOf</span><span class="p">(</span>
</span><span id="__span-30-60"><a id="__codelineno-30-60" name="__codelineno-30-60" href="#__codelineno-30-60"></a><span class="w"> </span><span class="s">"status"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"success"</span><span class="p">,</span>
</span><span id="__span-30-61"><a id="__codelineno-30-61" name="__codelineno-30-61" href="#__codelineno-30-61"></a><span class="w"> </span><span class="s">"report"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"The weather in New York is sunny with a temperature of "</span><span class="w"> </span><span class="o">+</span>
</span><span id="__span-30-62"><a id="__codelineno-30-62" name="__codelineno-30-62" href="#__codelineno-30-62"></a><span class="w"> </span><span class="s">"25 degrees Celsius (77 degrees Fahrenheit)."</span><span class="p">,</span>
</span><span id="__span-30-63"><a id="__codelineno-30-63" name="__codelineno-30-63" href="#__codelineno-30-63"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-30-64"><a id="__codelineno-30-64" name="__codelineno-30-64" href="#__codelineno-30-64"></a><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-65"><a id="__codelineno-30-65" name="__codelineno-30-65" href="#__codelineno-30-65"></a><span class="w"> </span><span class="n">mapOf</span><span class="p">(</span>
</span><span id="__span-30-66"><a id="__codelineno-30-66" name="__codelineno-30-66" href="#__codelineno-30-66"></a><span class="w"> </span><span class="s">"status"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"error"</span><span class="p">,</span>
</span><span id="__span-30-67"><a id="__codelineno-30-67" name="__codelineno-30-67" href="#__codelineno-30-67"></a><span class="w"> </span><span class="s">"report"</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="s">"Weather information for </span><span class="si">$</span><span class="n">city</span><span class="s"> is not available."</span><span class="p">,</span>
</span><span id="__span-30-68"><a id="__codelineno-30-68" name="__codelineno-30-68" href="#__codelineno-30-68"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-30-69"><a id="__codelineno-30-69" name="__codelineno-30-69" href="#__codelineno-30-69"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-70"><a id="__codelineno-30-70" name="__codelineno-30-70" href="#__codelineno-30-70"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-71"><a id="__codelineno-30-71" name="__codelineno-30-71" href="#__codelineno-30-71"></a><span class="p">}</span>
</span><span id="__span-30-72"><a id="__codelineno-30-72" name="__codelineno-30-72" href="#__codelineno-30-72"></a>
</span><span id="__span-30-73"><a id="__codelineno-30-73" name="__codelineno-30-73" href="#__codelineno-30-73"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-74"><a id="__codelineno-30-74" name="__codelineno-30-74" href="#__codelineno-30-74"></a><span class="w"> </span><span class="n">runBlocking</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-75"><a id="__codelineno-30-75" name="__codelineno-30-75" href="#__codelineno-30-75"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">model</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Gemini</span><span class="p">(</span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"gemini-flash-latest"</span><span class="p">)</span>
</span><span id="__span-30-76"><a id="__codelineno-30-76" name="__codelineno-30-76" href="#__codelineno-30-76"></a>
</span><span id="__span-30-77"><a id="__codelineno-30-77" name="__codelineno-30-77" href="#__codelineno-30-77"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">agent</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-78"><a id="__codelineno-30-78" name="__codelineno-30-78" href="#__codelineno-30-78"></a><span class="w"> </span><span class="n">LlmAgent</span><span class="p">(</span>
</span><span id="__span-30-79"><a id="__codelineno-30-79" name="__codelineno-30-79" href="#__codelineno-30-79"></a><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"multi_tool_agent"</span><span class="p">,</span>
</span><span id="__span-30-80"><a id="__codelineno-30-80" name="__codelineno-30-80" href="#__codelineno-30-80"></a><span class="w"> </span><span class="n">model</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">model</span><span class="p">,</span>
</span><span id="__span-30-81"><a id="__codelineno-30-81" name="__codelineno-30-81" href="#__codelineno-30-81"></a><span class="w"> </span><span class="n">description</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"Agent to answer questions about the time and weather in a city."</span><span class="p">,</span>
</span><span id="__span-30-82"><a id="__codelineno-30-82" name="__codelineno-30-82" href="#__codelineno-30-82"></a><span class="w"> </span><span class="n">instruction</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-83"><a id="__codelineno-30-83" name="__codelineno-30-83" href="#__codelineno-30-83"></a><span class="w"> </span><span class="n">Instruction</span><span class="p">(</span>
</span><span id="__span-30-84"><a id="__codelineno-30-84" name="__codelineno-30-84" href="#__codelineno-30-84"></a><span class="w"> </span><span class="s">"You are a helpful agent who can answer user questions about the "</span><span class="w"> </span><span class="o">+</span>
</span><span id="__span-30-85"><a id="__codelineno-30-85" name="__codelineno-30-85" href="#__codelineno-30-85"></a><span class="w"> </span><span class="s">"time and weather in a city."</span><span class="p">,</span>
</span><span id="__span-30-86"><a id="__codelineno-30-86" name="__codelineno-30-86" href="#__codelineno-30-86"></a><span class="w"> </span><span class="p">),</span>
</span><span id="__span-30-87"><a id="__codelineno-30-87" name="__codelineno-30-87" href="#__codelineno-30-87"></a><span class="w"> </span><span class="n">tools</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MultiToolService</span><span class="p">().</span><span class="na">generatedTools</span><span class="p">(),</span>
</span><span id="__span-30-88"><a id="__codelineno-30-88" name="__codelineno-30-88" href="#__codelineno-30-88"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-30-89"><a id="__codelineno-30-89" name="__codelineno-30-89" href="#__codelineno-30-89"></a>
</span><span id="__span-30-90"><a id="__codelineno-30-90" name="__codelineno-30-90" href="#__codelineno-30-90"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">sessionService</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">InMemorySessionService</span><span class="p">()</span>
</span><span id="__span-30-91"><a id="__codelineno-30-91" name="__codelineno-30-91" href="#__codelineno-30-91"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">runner</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-92"><a id="__codelineno-30-92" name="__codelineno-30-92" href="#__codelineno-30-92"></a><span class="w"> </span><span class="n">InMemoryRunner</span><span class="p">(</span>
</span><span id="__span-30-93"><a id="__codelineno-30-93" name="__codelineno-30-93" href="#__codelineno-30-93"></a><span class="w"> </span><span class="n">agent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">agent</span><span class="p">,</span>
</span><span id="__span-30-94"><a id="__codelineno-30-94" name="__codelineno-30-94" href="#__codelineno-30-94"></a><span class="w"> </span><span class="n">appName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"multi_tool_app"</span><span class="p">,</span>
</span><span id="__span-30-95"><a id="__codelineno-30-95" name="__codelineno-30-95" href="#__codelineno-30-95"></a><span class="w"> </span><span class="n">sessionService</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sessionService</span><span class="p">,</span>
</span><span id="__span-30-96"><a id="__codelineno-30-96" name="__codelineno-30-96" href="#__codelineno-30-96"></a><span class="w"> </span><span class="p">)</span>
</span><span id="__span-30-97"><a id="__codelineno-30-97" name="__codelineno-30-97" href="#__codelineno-30-97"></a>
</span><span id="__span-30-98"><a id="__codelineno-30-98" name="__codelineno-30-98" href="#__codelineno-30-98"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">userId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"student"</span>
</span><span id="__span-30-99"><a id="__codelineno-30-99" name="__codelineno-30-99" href="#__codelineno-30-99"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">sessionId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">"session_1"</span>
</span><span id="__span-30-100"><a id="__codelineno-30-100" name="__codelineno-30-100" href="#__codelineno-30-100"></a>
</span><span id="__span-30-101"><a id="__codelineno-30-101" name="__codelineno-30-101" href="#__codelineno-30-101"></a><span class="w"> </span><span class="n">sessionService</span><span class="p">.</span><span class="na">createSession</span><span class="p">(</span><span class="n">SessionKey</span><span class="p">(</span><span class="s">"multi_tool_app"</span><span class="p">,</span><span class="w"> </span><span class="n">userId</span><span class="p">,</span><span class="w"> </span><span class="n">sessionId</span><span class="p">))</span>
</span><span id="__span-30-102"><a id="__codelineno-30-102" name="__codelineno-30-102" href="#__codelineno-30-102"></a>
</span><span id="__span-30-103"><a id="__codelineno-30-103" name="__codelineno-30-103" href="#__codelineno-30-103"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">scanner</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Scanner</span><span class="p">(</span><span class="n">System</span><span class="p">.</span><span class="n">`in`</span><span class="p">)</span>
</span><span id="__span-30-104"><a id="__codelineno-30-104" name="__codelineno-30-104" href="#__codelineno-30-104"></a><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="kc">true</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-105"><a id="__codelineno-30-105" name="__codelineno-30-105" href="#__codelineno-30-105"></a><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="s">"\nYou &gt; "</span><span class="p">)</span>
</span><span id="__span-30-106"><a id="__codelineno-30-106" name="__codelineno-30-106" href="#__codelineno-30-106"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">userInput</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">scanner</span><span class="p">.</span><span class="na">nextLine</span><span class="p">()</span>
</span><span id="__span-30-107"><a id="__codelineno-30-107" name="__codelineno-30-107" href="#__codelineno-30-107"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">userInput</span><span class="p">.</span><span class="na">lowercase</span><span class="p">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">"quit"</span><span class="p">)</span><span class="w"> </span><span class="k">break</span>
</span><span id="__span-30-108"><a id="__codelineno-30-108" name="__codelineno-30-108" href="#__codelineno-30-108"></a>
</span><span id="__span-30-109"><a id="__codelineno-30-109" name="__codelineno-30-109" href="#__codelineno-30-109"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">userContent</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Content</span><span class="p">(</span><span class="n">role</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Role</span><span class="p">.</span><span class="na">USER</span><span class="p">,</span><span class="w"> </span><span class="n">parts</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">listOf</span><span class="p">(</span><span class="n">Part</span><span class="p">(</span><span class="n">text</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userInput</span><span class="p">)))</span>
</span><span id="__span-30-110"><a id="__codelineno-30-110" name="__codelineno-30-110" href="#__codelineno-30-110"></a><span class="w"> </span><span class="kd">val</span><span class="w"> </span><span class="nv">events</span><span class="w"> </span><span class="o">=</span>
</span><span id="__span-30-111"><a id="__codelineno-30-111" name="__codelineno-30-111" href="#__codelineno-30-111"></a><span class="w"> </span><span class="n">runner</span><span class="p">.</span><span class="na">runAsync</span><span class="p">(</span>
</span><span id="__span-30-112"><a id="__codelineno-30-112" name="__codelineno-30-112" href="#__codelineno-30-112"></a><span class="w"> </span><span class="n">userId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userId</span><span class="p">,</span>
</span><span id="__span-30-113"><a id="__codelineno-30-113" name="__codelineno-30-113" href="#__codelineno-30-113"></a><span class="w"> </span><span class="n">sessionId</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sessionId</span><span class="p">,</span>
</span><span id="__span-30-114"><a id="__codelineno-30-114" name="__codelineno-30-114" href="#__codelineno-30-114"></a><span class="w"> </span><span class="n">newMessage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userContent</span><span class="p">,</span>
</span><span id="__span-30-115"><a id="__codelineno-30-115" name="__codelineno-30-115" href="#__codelineno-30-115"></a><span class="w"> </span><span class="p">).</span><span class="na">toList</span><span class="p">()</span>
</span><span id="__span-30-116"><a id="__codelineno-30-116" name="__codelineno-30-116" href="#__codelineno-30-116"></a>
</span><span id="__span-30-117"><a id="__codelineno-30-117" name="__codelineno-30-117" href="#__codelineno-30-117"></a><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="s">"\nAgent &gt; "</span><span class="p">)</span>
</span><span id="__span-30-118"><a id="__codelineno-30-118" name="__codelineno-30-118" href="#__codelineno-30-118"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">event</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">events</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
</span><span id="__span-30-119"><a id="__codelineno-30-119" name="__codelineno-30-119" href="#__codelineno-30-119"></a><span class="w"> </span><span class="n">event</span><span class="p">.</span><span class="na">content</span><span class="o">?.</span><span class="na">parts</span><span class="o">?.</span><span class="na">forEach</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">part</span><span class="w"> </span><span class="o">-&gt;</span>
</span><span id="__span-30-120"><a id="__codelineno-30-120" name="__codelineno-30-120" href="#__codelineno-30-120"></a><span class="w"> </span><span class="n">part</span><span class="p">.</span><span class="na">text</span><span class="o">?.</span><span class="na">let</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="nb">it</span><span class="p">)</span><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-121"><a id="__codelineno-30-121" name="__codelineno-30-121" href="#__codelineno-30-121"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-122"><a id="__codelineno-30-122" name="__codelineno-30-122" href="#__codelineno-30-122"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-123"><a id="__codelineno-30-123" name="__codelineno-30-123" href="#__codelineno-30-123"></a><span class="w"> </span><span class="n">println</span><span class="p">()</span>
</span><span id="__span-30-124"><a id="__codelineno-30-124" name="__codelineno-30-124" href="#__codelineno-30-124"></a><span class="w"> </span><span class="p">}</span>
</span><span id="__span-30-125"><a id="__codelineno-30-125" name="__codelineno-30-125" href="#__codelineno-30-125"></a><span class="w"> </span><span class="p">}</span>
</span></code></pre></div>
</div>
</div>
</div>
<p><img alt="intro_components.png" src="../../assets/quickstart-flow-tool.png" /></p>
<h2 id="set-up-the-model">3. Set up the model<a class="headerlink" href="#set-up-the-model" title="Permanent link">&para;</a></h2>
<p>Your agent's ability to understand user requests and generate responses is
powered by a generative AI model or Large Language Model (LLM). This guide uses Gemini models as
examples, but ADK is compatible with many AI models from Google and other
providers. For more information on available models and how to configure
them, see <a href="/agents/models/">AI Models for ADK agents</a>.</p>
<h3 id="model-connection-and-authentication">Model connection and authentication<a class="headerlink" href="#model-connection-and-authentication" title="Permanent link">&para;</a></h3>
<p>When using an AI model through a service, such as the Gemini API or Gemini
Enterprise Agent Platform on Google Cloud, you must provide an API key or
authenticate with the service. The most direct way to provide this information
is to use environment variables or an <code>.env</code> file. The following examples show
the most common way to configure an agent for use with the Gemini API or Gemini
Enterprise Agent Platform.</p>
<div class="tabbed-set tabbed-alternate" data-tabs="9:2"><input checked="checked" id="gemini-api" name="__tabbed_9" type="radio" /><input id="google-cloud-agent-platform" name="__tabbed_9" type="radio" /><div class="tabbed-labels"><label for="gemini-api">Gemini API</label><label for="google-cloud-agent-platform">Google Cloud Agent Platform</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="language-text highlight"><pre><span></span><code><span id="__span-31-1"><a id="__codelineno-31-1" name="__codelineno-31-1" href="#__codelineno-31-1"></a># .env configuration file
</span><span id="__span-31-2"><a id="__codelineno-31-2" name="__codelineno-31-2" href="#__codelineno-31-2"></a>GOOGLE_API_KEY="PASTE_YOUR_GEMINI_API_KEY_HERE"
</span></code></pre></div>
</div>
<div class="tabbed-block">
<div class="language-text highlight"><pre><span></span><code><span id="__span-32-1"><a id="__codelineno-32-1" name="__codelineno-32-1" href="#__codelineno-32-1"></a># .env configuration file
</span><span id="__span-32-2"><a id="__codelineno-32-2" name="__codelineno-32-2" href="#__codelineno-32-2"></a>GOOGLE_CLOUD_PROJECT=your-project-id
</span><span id="__span-32-3"><a id="__codelineno-32-3" name="__codelineno-32-3" href="#__codelineno-32-3"></a>GOOGLE_CLOUD_LOCATION=location-code # example: us-central1
</span><span id="__span-32-4"><a id="__codelineno-32-4" name="__codelineno-32-4" href="#__codelineno-32-4"></a>GOOGLE_GENAI_USE_ENTERPRISE=True
</span></code></pre></div>
</div>
</div>
</div>
<p>For more details on connecting ADK agents to Google Cloud hosted models and services,
including Gemini Enterprise Agent Platform, see the
<a href="/get-started/google-cloud/">Connect to Google Cloud and Agent Platform</a> guide.</p>
<h2 id="run-your-agent">4. Run Your Agent<a class="headerlink" href="#run-your-agent" title="Permanent link">&para;</a></h2>
<div class="tabbed-set tabbed-alternate" data-tabs="10:5"><input checked="checked" id="python_2" name="__tabbed_10" type="radio" /><input id="typescript_2" name="__tabbed_10" type="radio" /><input id="go_2" name="__tabbed_10" type="radio" /><input id="java_2" name="__tabbed_10" type="radio" /><input id="kotlin_2" name="__tabbed_10" type="radio" /><div class="tabbed-labels"><label for="python_2">Python</label><label for="typescript_2">TypeScript</label><label for="go_2">Go</label><label for="java_2">Java</label><label for="kotlin_2">Kotlin</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p>Using the terminal, navigate to the parent directory of your agent project
(e.g. using <code>cd ..</code>):</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-33-1"><a id="__codelineno-33-1" name="__codelineno-33-1" href="#__codelineno-33-1"></a><span class="go">parent_folder/ &lt;-- navigate to this directory</span>
</span><span id="__span-33-2"><a id="__codelineno-33-2" name="__codelineno-33-2" href="#__codelineno-33-2"></a><span class="go"> multi_tool_agent/</span>
</span><span id="__span-33-3"><a id="__codelineno-33-3" name="__codelineno-33-3" href="#__codelineno-33-3"></a><span class="go"> __init__.py</span>
</span><span id="__span-33-4"><a id="__codelineno-33-4" name="__codelineno-33-4" href="#__codelineno-33-4"></a><span class="go"> agent.py</span>
</span><span id="__span-33-5"><a id="__codelineno-33-5" name="__codelineno-33-5" href="#__codelineno-33-5"></a><span class="go"> .env</span>
</span></code></pre></div>
<p>There are multiple ways to interact with your agent:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="11:3"><input checked="checked" id="dev-ui-adk-web" name="__tabbed_11" type="radio" /><input id="terminal-adk-run" name="__tabbed_11" type="radio" /><input id="api-server-adk-api_server" name="__tabbed_11" type="radio" /><div class="tabbed-labels"><label for="dev-ui-adk-web">Dev UI (adk web)</label><label for="terminal-adk-run">Terminal (adk run)</label><label for="api-server-adk-api_server">API Server (adk api_server)</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="admonition success">
<p class="admonition-title">Authentication Setup for Agent Platform Users</p>
<p>If you selected <strong>"Gemini - Google Cloud Agent Platform"</strong> in the previous step, you must authenticate with Google Cloud before launching the dev UI.</p>
<p>Run this command and follow the prompts:
<div class="language-bash highlight"><pre><span></span><code><span id="__span-34-1"><a id="__codelineno-34-1" name="__codelineno-34-1" href="#__codelineno-34-1"></a>gcloud<span class="w"> </span>auth<span class="w"> </span>application-default<span class="w"> </span>login
</span></code></pre></div></p>
<p><strong>Note:</strong> Skip this step if you're using "Gemini - Google AI Studio".</p>
</div>
<p>Run the following command to launch the <strong>dev UI</strong>.</p>
<div class="language-shell highlight"><pre><span></span><code><span id="__span-35-1"><a id="__codelineno-35-1" name="__codelineno-35-1" href="#__codelineno-35-1"></a>adk<span class="w"> </span>web
</span></code></pre></div>
<div class="admonition warning">
<p class="admonition-title">Caution: ADK Web for development only</p>
<p>ADK Web is <strong><em>not meant for use in production deployments</em></strong>. You should
use ADK Web for development and debugging purposes only.</p>
</div>
<div class="admonition info">
<p class="admonition-title">Note for Windows users</p>
<p>When hitting the <code>_make_subprocess_transport NotImplementedError</code>, consider using <code>adk web --no-reload</code> instead.</p>
</div>
<p><strong>Step 1:</strong> Open the URL provided (usually <code>http://localhost:8000</code> or
<code>http://127.0.0.1:8000</code>) directly in your browser.</p>
<p><strong>Step 2.</strong> In the top-left corner of the UI, you can select your agent in
the dropdown. Select "multi_tool_agent".</p>
<div class="admonition note">
<p class="admonition-title">Troubleshooting</p>
<p>If you do not see "multi_tool_agent" in the dropdown menu, make sure you
are running <code>adk web</code> in the <strong>parent folder</strong> of your agent folder
(i.e. the parent folder of multi_tool_agent).</p>
</div>
<p><strong>Step 3.</strong> Now you can chat with your agent using the textbox:</p>
<p><img alt="adk-web-dev-ui-chat.png" src="../../assets/adk-web-dev-ui-chat.png" /></p>
<p><strong>Step 4.</strong> By using the <code>Events</code> tab at the left, you can inspect
individual function calls, responses and model responses by clicking on the
actions:</p>
<p><img alt="adk-web-dev-ui-function-call.png" src="../../assets/adk-web-dev-ui-function-call.png" /></p>
<p>On the <code>Events</code> tab, you can also click the <code>Trace</code> button to see the trace logs for each event that shows the latency of each function calls:</p>
<p><img alt="adk-web-dev-ui-trace.png" src="../../assets/adk-web-dev-ui-trace.png" /></p>
<p><strong>Step 5.</strong> You can also enable your microphone and talk to your agent:</p>
<div class="admonition note">
<p class="admonition-title">Model support for voice/video streaming</p>
<p>In order to use voice/video streaming in ADK, you will need to use Gemini models that support the Live API. You can find the <strong>model ID(s)</strong> that supports the Gemini Live API in the documentation:</p>
<ul>
<li><a href="https://ai.google.dev/gemini-api/docs/models#live-api">Google AI Studio: Gemini Live API</a></li>
<li><a href="https://cloud.google.com/vertex-ai/generative-ai/docs/live-api">Agent Platform: Gemini Live API</a></li>
</ul>
<p>You can then replace the <code>model</code> string in <code>root_agent</code> in the <code>agent.py</code> file you created earlier (<a href="#agentpy">jump to section</a>). Your code should look something like:</p>
<div class="language-py highlight"><pre><span></span><code><span id="__span-36-1"><a id="__codelineno-36-1" name="__codelineno-36-1" href="#__codelineno-36-1"></a><span class="n">root_agent</span> <span class="o">=</span> <span class="n">Agent</span><span class="p">(</span>
</span><span id="__span-36-2"><a id="__codelineno-36-2" name="__codelineno-36-2" href="#__codelineno-36-2"></a> <span class="n">name</span><span class="o">=</span><span class="s2">"weather_time_agent"</span><span class="p">,</span>
</span><span id="__span-36-3"><a id="__codelineno-36-3" name="__codelineno-36-3" href="#__codelineno-36-3"></a> <span class="n">model</span><span class="o">=</span><span class="s2">"replace-me-with-model-id"</span><span class="p">,</span> <span class="c1">#e.g. gemini-live-2.5-flash-native-audio</span>
</span><span id="__span-36-4"><a id="__codelineno-36-4" name="__codelineno-36-4" href="#__codelineno-36-4"></a> <span class="o">...</span>
</span></code></pre></div>
</div>
<p><img alt="adk-web-dev-ui-audio.png" src="../../assets/adk-web-dev-ui-audio.png" /></p>
</div>
<div class="tabbed-block">
<div class="admonition tip">
<p class="admonition-title">Tip</p>
<p>When using <code>adk run</code> you can inject prompts into the agent to start by
piping text to the command like so:</p>
<div class="language-shell highlight"><pre><span></span><code><span id="__span-37-1"><a id="__codelineno-37-1" name="__codelineno-37-1" href="#__codelineno-37-1"></a><span class="nb">echo</span><span class="w"> </span><span class="s2">"Please start by listing files"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>adk<span class="w"> </span>run<span class="w"> </span>multi_tool_agent
</span></code></pre></div>
</div>
<p>Run the following command, to chat with your Weather agent.</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-38-1"><a id="__codelineno-38-1" name="__codelineno-38-1" href="#__codelineno-38-1"></a>adk run multi_tool_agent
</span></code></pre></div>
<p><img alt="adk-run.png" src="../../assets/adk-run.png" /></p>
<p>To exit, use Cmd/Ctrl+C.</p>
</div>
<div class="tabbed-block">
<p><code>adk api_server</code> enables you to create a local FastAPI server in a single
command, enabling you to test local cURL requests before you deploy your
agent.</p>
<p><img alt="adk-api-server.png" src="../../assets/adk-api-server.png" /></p>
<p>To learn how to use <code>adk api_server</code> for testing, refer to the
<a href="/runtime/api-server/">documentation on using the API server</a>.</p>
</div>
</div>
</div>
</div>
<div class="tabbed-block">
<p>Using the terminal, navigate to your agent project directory:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-39-1"><a id="__codelineno-39-1" name="__codelineno-39-1" href="#__codelineno-39-1"></a><span class="go">my-adk-agent/ &lt;-- navigate to this directory</span>
</span><span id="__span-39-2"><a id="__codelineno-39-2" name="__codelineno-39-2" href="#__codelineno-39-2"></a><span class="go"> agent.ts</span>
</span><span id="__span-39-3"><a id="__codelineno-39-3" name="__codelineno-39-3" href="#__codelineno-39-3"></a><span class="go"> .env</span>
</span><span id="__span-39-4"><a id="__codelineno-39-4" name="__codelineno-39-4" href="#__codelineno-39-4"></a><span class="go"> package.json</span>
</span><span id="__span-39-5"><a id="__codelineno-39-5" name="__codelineno-39-5" href="#__codelineno-39-5"></a><span class="go"> tsconfig.json</span>
</span></code></pre></div>
<p>There are multiple ways to interact with your agent:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="12:3"><input checked="checked" id="dev-ui-adk-web_1" name="__tabbed_12" type="radio" /><input id="terminal-adk-run_1" name="__tabbed_12" type="radio" /><input id="api-server-adk-api_server_1" name="__tabbed_12" type="radio" /><div class="tabbed-labels"><label for="dev-ui-adk-web_1">Dev UI (adk web)</label><label for="terminal-adk-run_1">Terminal (adk run)</label><label for="api-server-adk-api_server_1">API Server (adk api_server)</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p>Run the following command to launch the <strong>dev UI</strong>.</p>
<div class="language-shell highlight"><pre><span></span><code><span id="__span-40-1"><a id="__codelineno-40-1" name="__codelineno-40-1" href="#__codelineno-40-1"></a>npx<span class="w"> </span>adk<span class="w"> </span>web
</span></code></pre></div>
<p><strong>Step 1:</strong> Open the URL provided (usually <code>http://localhost:8000</code> or
<code>http://127.0.0.1:8000</code>) directly in your browser.</p>
<p><strong>Step 2.</strong> In the top-left corner of the UI, select your agent from the dropdown. The agents are listed by their filenames, so you should select "agent".</p>
<div class="admonition note">
<p class="admonition-title">Troubleshooting</p>
<p>If you do not see "agent" in the dropdown menu, make sure you
are running <code>npx adk web</code> in the directory containing your <code>agent.ts</code> file.</p>
</div>
<p><strong>Step 3.</strong> Now you can chat with your agent using the textbox:</p>
<p><img alt="adk-web-dev-ui-chat.png" src="../../assets/adk-web-dev-ui-chat.png" /></p>
<p><strong>Step 4.</strong> By using the <code>Events</code> tab at the left, you can inspect
individual function calls, responses and model responses by clicking on the
actions:</p>
<p><img alt="adk-web-dev-ui-function-call.png" src="../../assets/adk-web-dev-ui-function-call.png" /></p>
<p>On the <code>Events</code> tab, you can also click the <code>Trace</code> button to see the trace logs for each event that shows the latency of each function calls:</p>
<p><img alt="adk-web-dev-ui-trace.png" src="../../assets/adk-web-dev-ui-trace.png" /></p>
</div>
<div class="tabbed-block">
<p>Run the following command to chat with your agent.</p>
<div class="language-text highlight"><pre><span></span><code><span id="__span-41-1"><a id="__codelineno-41-1" name="__codelineno-41-1" href="#__codelineno-41-1"></a>npx adk run agent.ts
</span></code></pre></div>
<p><img alt="adk-run.png" src="../../assets/adk-run.png" /></p>
<p>To exit, use Cmd/Ctrl+C.</p>
</div>
<div class="tabbed-block">
<p><code>npx adk api_server</code> enables you to create a local Express.js server in a single
command, enabling you to test local cURL requests before you deploy your
agent.</p>
<p><img alt="adk-api-server.png" src="../../assets/adk-api-server.png" /></p>
<p>To learn how to use <code>api_server</code> for testing, refer to the
<a href="/runtime/api-server/">documentation on testing</a>.</p>
</div>
</div>
</div>
</div>
<div class="tabbed-block">
<p>Using the terminal, navigate to your agent project directory:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-42-1"><a id="__codelineno-42-1" name="__codelineno-42-1" href="#__codelineno-42-1"></a><span class="go">my-adk-agent/ &lt;-- navigate to this directory</span>
</span><span id="__span-42-2"><a id="__codelineno-42-2" name="__codelineno-42-2" href="#__codelineno-42-2"></a><span class="go"> agent.go</span>
</span><span id="__span-42-3"><a id="__codelineno-42-3" name="__codelineno-42-3" href="#__codelineno-42-3"></a><span class="go"> .env</span>
</span><span id="__span-42-4"><a id="__codelineno-42-4" name="__codelineno-42-4" href="#__codelineno-42-4"></a><span class="go"> go.mod</span>
</span></code></pre></div>
<p>There are multiple ways to interact with your agent:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="13:2"><input checked="checked" id="dev-ui-web" name="__tabbed_13" type="radio" /><input id="terminal-console" name="__tabbed_13" type="radio" /><div class="tabbed-labels"><label for="dev-ui-web">Dev UI (web)</label><label for="terminal-console">Terminal (console)</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p>Run the following command to launch the <strong>dev UI</strong>. You must specify which sub-launchers to activate (e.g., <code>webui</code>, <code>api</code>).</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-43-1"><a id="__codelineno-43-1" name="__codelineno-43-1" href="#__codelineno-43-1"></a>go<span class="w"> </span>run<span class="w"> </span>agent.go<span class="w"> </span>web<span class="w"> </span>webui<span class="w"> </span>api
</span></code></pre></div>
<p><strong>Step 1:</strong> Open the URL provided (usually <code>http://localhost:8080</code>) directly in your browser.</p>
<p><strong>Step 2.</strong> In the top-left corner of the UI, select your agent from the dropdown. It should be "weather_time_agent".</p>
<p><strong>Step 3.</strong> Now you can chat with your agent using the textbox.</p>
</div>
<div class="tabbed-block">
<p>Run the following command to chat with your agent in the terminal.</p>
<div class="language-bash highlight"><pre><span></span><code><span id="__span-44-1"><a id="__codelineno-44-1" name="__codelineno-44-1" href="#__codelineno-44-1"></a>go<span class="w"> </span>run<span class="w"> </span>agent.go<span class="w"> </span>console
</span></code></pre></div>
<p><strong>Note:</strong> If <code>console</code> is the first sublauncher in your code (as it is with <code>full.NewLauncher()</code>), you can also just run <code>go run agent.go</code>.</p>
<p>To exit, use Cmd/Ctrl+C.</p>
</div>
</div>
</div>
</div>
<div class="tabbed-block">
<p>Using the terminal, navigate to the parent directory of your agent project
(e.g. using <code>cd ..</code>):</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-45-1"><a id="__codelineno-45-1" name="__codelineno-45-1" href="#__codelineno-45-1"></a><span class="go">project_folder/ &lt;-- navigate to this directory</span>
</span><span id="__span-45-2"><a id="__codelineno-45-2" name="__codelineno-45-2" href="#__codelineno-45-2"></a><span class="go">├── pom.xml (or build.gradle)</span>
</span><span id="__span-45-3"><a id="__codelineno-45-3" name="__codelineno-45-3" href="#__codelineno-45-3"></a><span class="go">├── src/</span>
</span><span id="__span-45-4"><a id="__codelineno-45-4" name="__codelineno-45-4" href="#__codelineno-45-4"></a><span class="go">├── └── main/</span>
</span><span id="__span-45-5"><a id="__codelineno-45-5" name="__codelineno-45-5" href="#__codelineno-45-5"></a><span class="go">│ └── java/</span>
</span><span id="__span-45-6"><a id="__codelineno-45-6" name="__codelineno-45-6" href="#__codelineno-45-6"></a><span class="go">│ └── agents/</span>
</span><span id="__span-45-7"><a id="__codelineno-45-7" name="__codelineno-45-7" href="#__codelineno-45-7"></a><span class="go">│ └── multitool/</span>
</span><span id="__span-45-8"><a id="__codelineno-45-8" name="__codelineno-45-8" href="#__codelineno-45-8"></a><span class="go">│ └── MultiToolAgent.java</span>
</span><span id="__span-45-9"><a id="__codelineno-45-9" name="__codelineno-45-9" href="#__codelineno-45-9"></a><span class="go">└── test/</span>
</span></code></pre></div>
<div class="tabbed-set tabbed-alternate" data-tabs="14:3"><input checked="checked" id="dev-ui" name="__tabbed_14" type="radio" /><input id="maven" name="__tabbed_14" type="radio" /><input id="gradle" name="__tabbed_14" type="radio" /><div class="tabbed-labels"><label for="dev-ui">Dev UI</label><label for="maven">Maven</label><label for="gradle">Gradle</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<p>Run the following command from the terminal to launch the Dev UI.</p>
<p><strong>DO NOT change the main class name of the Dev UI server.</strong></p>
<div class="language-console highlight"><span class="filename">terminal</span><pre><span></span><code><span id="__span-46-1"><a id="__codelineno-46-1" name="__codelineno-46-1" href="#__codelineno-46-1"></a><span class="go">mvn exec:java \</span>
</span><span id="__span-46-2"><a id="__codelineno-46-2" name="__codelineno-46-2" href="#__codelineno-46-2"></a><span class="go"> -Dexec.mainClass="com.google.adk.web.AdkWebServer" \</span>
</span><span id="__span-46-3"><a id="__codelineno-46-3" name="__codelineno-46-3" href="#__codelineno-46-3"></a><span class="go"> -Dexec.args="--adk.agents.source-dir=src/main/java" \</span>
</span><span id="__span-46-4"><a id="__codelineno-46-4" name="__codelineno-46-4" href="#__codelineno-46-4"></a><span class="go"> -Dexec.classpathScope="compile"</span>
</span></code></pre></div>
<p><strong>Step 1:</strong> Open the URL provided (usually <code>http://localhost:8080</code> or
<code>http://127.0.0.1:8080</code>) directly in your browser.</p>
<p><strong>Step 2.</strong> In the top-left corner of the UI, you can select your agent in
the dropdown. Select "multi_tool_agent".</p>
<div class="admonition note">
<p class="admonition-title">Troubleshooting</p>
<p>If you do not see "multi_tool_agent" in the dropdown menu, make sure you
are running the <code>mvn</code> command at the location where your Java source code
is located (usually <code>src/main/java</code>).</p>
</div>
<p><strong>Step 3.</strong> Now you can chat with your agent using the textbox:</p>
<p><img alt="adk-web-dev-ui-chat.png" src="../../assets/adk-web-dev-ui-chat.png" /></p>
<p><strong>Step 4.</strong> You can also inspect individual function calls, responses and
model responses by clicking on the actions:</p>
<p><img alt="adk-web-dev-ui-function-call.png" src="../../assets/adk-web-dev-ui-function-call.png" /></p>
<div class="admonition warning">
<p class="admonition-title">Caution: ADK Web for development only</p>
<p>ADK Web is <strong><em>not meant for use in production deployments</em></strong>. You should
use ADK Web for development and debugging purposes only.</p>
</div>
</div>
<div class="tabbed-block">
<p>With Maven, run the <code>main()</code> method of your Java class
with the following command:</p>
<div class="language-console highlight"><span class="filename">terminal</span><pre><span></span><code><span id="__span-47-1"><a id="__codelineno-47-1" name="__codelineno-47-1" href="#__codelineno-47-1"></a><span class="go">mvn compile exec:java -Dexec.mainClass="agents.multitool.MultiToolAgent"</span>
</span></code></pre></div>
</div>
<div class="tabbed-block">
<p>With Gradle, the <code>build.gradle</code> or <code>build.gradle.kts</code> build file
should have the following Java plugin in its <code>plugins</code> section:</p>
<div class="language-groovy highlight"><pre><span></span><code><span id="__span-48-1"><a id="__codelineno-48-1" name="__codelineno-48-1" href="#__codelineno-48-1"></a><span class="n">plugins</span><span class="w"> </span><span class="o">{</span>
</span><span id="__span-48-2"><a id="__codelineno-48-2" name="__codelineno-48-2" href="#__codelineno-48-2"></a><span class="w"> </span><span class="n">id</span><span class="o">(</span><span class="s1">'java'</span><span class="o">)</span>
</span><span id="__span-48-3"><a id="__codelineno-48-3" name="__codelineno-48-3" href="#__codelineno-48-3"></a><span class="w"> </span><span class="c1">// other plugins</span>
</span><span id="__span-48-4"><a id="__codelineno-48-4" name="__codelineno-48-4" href="#__codelineno-48-4"></a><span class="o">}</span>
</span></code></pre></div>
<p>Then, elsewhere in the build file, at the top-level,
create a new task to run the <code>main()</code> method of your agent:</p>
<div class="language-groovy highlight"><pre><span></span><code><span id="__span-49-1"><a id="__codelineno-49-1" name="__codelineno-49-1" href="#__codelineno-49-1"></a><span class="n">tasks</span><span class="o">.</span><span class="na">register</span><span class="o">(</span><span class="s1">'runAgent'</span><span class="o">,</span><span class="w"> </span><span class="n">JavaExec</span><span class="o">)</span><span class="w"> </span><span class="o">{</span>
</span><span id="__span-49-2"><a id="__codelineno-49-2" name="__codelineno-49-2" href="#__codelineno-49-2"></a><span class="w"> </span><span class="n">classpath</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">sourceSets</span><span class="o">.</span><span class="na">main</span><span class="o">.</span><span class="na">runtimeClasspath</span>
</span><span id="__span-49-3"><a id="__codelineno-49-3" name="__codelineno-49-3" href="#__codelineno-49-3"></a><span class="w"> </span><span class="n">mainClass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'agents.multitool.MultiToolAgent'</span>
</span><span id="__span-49-4"><a id="__codelineno-49-4" name="__codelineno-49-4" href="#__codelineno-49-4"></a><span class="o">}</span>
</span></code></pre></div>
<p>Finally, on the command-line, run the following command:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-50-1"><a id="__codelineno-50-1" name="__codelineno-50-1" href="#__codelineno-50-1"></a><span class="go">gradle runAgent</span>
</span></code></pre></div>
</div>
</div>
</div>
</div>
<div class="tabbed-block">
<p>Using the terminal, navigate to your agent project directory:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-51-1"><a id="__codelineno-51-1" name="__codelineno-51-1" href="#__codelineno-51-1"></a><span class="go">project_folder/ &lt;-- navigate to this directory</span>
</span><span id="__span-51-2"><a id="__codelineno-51-2" name="__codelineno-51-2" href="#__codelineno-51-2"></a><span class="go">├── build.gradle.kts</span>
</span><span id="__span-51-3"><a id="__codelineno-51-3" name="__codelineno-51-3" href="#__codelineno-51-3"></a><span class="go">├── src/</span>
</span><span id="__span-51-4"><a id="__codelineno-51-4" name="__codelineno-51-4" href="#__codelineno-51-4"></a><span class="go">├── └── main/</span>
</span><span id="__span-51-5"><a id="__codelineno-51-5" name="__codelineno-51-5" href="#__codelineno-51-5"></a><span class="go">│ └── kotlin/</span>
</span><span id="__span-51-6"><a id="__codelineno-51-6" name="__codelineno-51-6" href="#__codelineno-51-6"></a><span class="go">│ └── agents/</span>
</span><span id="__span-51-7"><a id="__codelineno-51-7" name="__codelineno-51-7" href="#__codelineno-51-7"></a><span class="go">│ └── multitool/</span>
</span><span id="__span-51-8"><a id="__codelineno-51-8" name="__codelineno-51-8" href="#__codelineno-51-8"></a><span class="go">│ └── MultiToolAgent.kt</span>
</span></code></pre></div>
<h3 id="run-your-agent_1">Run your Agent<a class="headerlink" href="#run-your-agent_1" title="Permanent link">&para;</a></h3>
<p>You can run the <code>main()</code> method of your Kotlin class using Gradle:</p>
<div class="language-console highlight"><pre><span></span><code><span id="__span-52-1"><a id="__codelineno-52-1" name="__codelineno-52-1" href="#__codelineno-52-1"></a><span class="go">./gradlew run</span>
</span></code></pre></div>
<p>Or if you are using IntelliJ IDEA, you can just click the green run arrow next to the <code>main()</code> function.</p>
</div>
</div>
</div>
<h3 id="example-prompts-to-try">📝 Example prompts to try<a class="headerlink" href="#example-prompts-to-try" title="Permanent link">&para;</a></h3>
<ul>
<li>What is the weather in New York?</li>
<li>What is the time in New York?</li>
<li>What is the weather in Paris?</li>
<li>What is the time in Paris?</li>
</ul>
<h2 id="congratulations">🎉 Congratulations!<a class="headerlink" href="#congratulations" title="Permanent link">&para;</a></h2>
<p>You've successfully created and interacted with your first agent using ADK!</p>
<hr />
<h2 id="next-steps">🛣️ Next steps<a class="headerlink" href="#next-steps" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>Go to the tutorial</strong>: Learn how to add memory, session, state to your agent:
<a href="/tutorials/">tutorial</a>.</li>
<li><strong>Delve into advanced configuration:</strong> Explore the <a href="/get-started/installation/">setup</a>
section for deeper dives into project structure, configuration, and other
interfaces.</li>
<li><strong>Understand Core Concepts:</strong> Learn about
<a href="/agents/">agents concepts</a>.</li>
</ul>
</article>
</div>
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</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 class="md-copyright__highlight">
Copyright Google 2026&nbsp;&nbsp;|&nbsp;&nbsp;<a href="//github.com/google/adk-docs/blob/main/LICENSE">License</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="//policies.google.com/privacy">Privacy</a>&nbsp;&nbsp;|&nbsp;&nbsp;<a href="#__consent">Manage cookies</a>
</div>
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<div class="md-progress" data-md-component="progress" role="progressbar"></div>
<div class="md-consent" data-md-component="consent" id="__consent" hidden>
<div class="md-consent__overlay"></div>
<aside class="md-consent__inner">
<form class="md-consent__form md-grid md-typeset" name="consent">
<h4>Cookie consent</h4>
<p>We use cookies to recognize repeated visits and preferences, as well as to measure the effectiveness of our documentation and whether users find the information they need. With your consent, you're helping us to make our documentation better.</p>
<input class="md-toggle" type="checkbox" id="__settings" >
<div class="md-consent__settings">
<ul class="task-list">
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="analytics" checked>
<span class="task-list-indicator"></span>
Google Analytics
</label>
</li>
<li class="task-list-item">
<label class="task-list-control">
<input type="checkbox" name="github" checked>
<span class="task-list-indicator"></span>
GitHub
</label>
</li>
</ul>
</div>
<div class="md-consent__controls">
<button class="md-button md-button--primary">Accept</button>
<label class="md-button" for="__settings">Manage settings</label>
</div>
</form>
</aside>
</div>
<script>var consent=__md_get("__consent");if(consent)for(var input of document.forms.consent.elements)input.name&&(input.checked=consent[input.name]||!1);else"file:"!==location.protocol&&setTimeout((function(){document.querySelector("[data-md-component=consent]").hidden=!1}),250);var form=document.forms.consent;for(var action of["submit","reset"])form.addEventListener(action,(function(e){if(e.preventDefault(),"reset"===e.type)for(var n of document.forms.consent.elements)n.name&&(n.checked=!1);__md_set("__consent",Object.fromEntries(Array.from(new FormData(form).keys()).map((function(e){return[e,!0]})))),location.hash="",location.reload()}))</script>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["content.action.edit", "content.action.view", "content.code.copy", "content.tabs.link", "content.tooltips", "navigation.indexes", "navigation.instant", "navigation.instant.progress", "navigation.path", "navigation.sections", "navigation.top", "navigation.tabs", "toc.follow"], "search": "../../assets/javascripts/workers/search.7a47a382.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.e71a0d61.min.js"></script>
<script src="../../javascript/copy-page.js"></script>
</body>
</html>