import * as weave from "weave";
import { FunctionTool, Gemini, InMemoryRunner, LlmAgent } from "@google/adk";
import { WeaveAdkPlugin } from "weave";
import { z } from "zod";
const GEMINI_API_KEY = process.env.GEMINI_API_KEY
const wikipediaSearchTool = new FunctionTool({
name: "wikipedia_search",
description: "Search Wikipedia for a topic and return its title and intro paragraph.",
parameters: z.object({
query: z.string().describe("The topic to search for"),
}),
execute: async ({ query }) => {
const url = new URL("https://en.wikipedia.org/w/api.php");
url.search = new URLSearchParams({
action: "query",
generator: "search",
gsrsearch: query,
gsrlimit: "1",
prop: "extracts",
exintro: "true",
explaintext: "true",
format: "json",
}).toString();
const response = await fetch(url, { headers: { "User-Agent": "weave-demo" } });
const data = await response.json();
const page = Object.values(data.query.pages)[0] as { title: string; extract: string };
return { title: page.title, extract: page.extract };
},
});
async function main() {
await weave.init("<your-team>/<your-project-name>");
const agent = new LlmAgent({
name: "research_assistant",
description: "Answers research questions using Wikipedia.",
instruction:
"You are a research assistant. Use the wikipedia_search tool to look up " +
"topics when needed, and cite the article titles you used.",
model: new Gemini({ model: "gemini-2.5-flash", apiKey: GEMINI_API_KEY }),
tools: [wikipediaSearchTool],
});
const APP_NAME = "weave-adk-example";
const USER_ID = "example-user";
const runner = new InMemoryRunner({
agent,
appName: APP_NAME,
plugins: [new WeaveAdkPlugin()],
});
const session = await runner.sessionService.createSession({
appName: APP_NAME,
userId: USER_ID,
});
const questions = [
"Who founded Anthropic?",
"What is Claude (the AI assistant)?",
"Summarize what we discussed in one sentence.",
];
for (const question of questions) {
console.log(`USER: ${question}`);
for await (const event of runner.runAsync({
userId: USER_ID,
sessionId: session.id,
newMessage: {
role: "user",
parts: [{ text: question }],
},
})) {
const text = event.content?.parts
?.map(part => part.text)
.filter(Boolean)
.join("");
if (text) {
console.log(`AGENT: ${text}\n`);
}
}
}
await weave.flushOTel();
}
main().catch(console.error);