Co-authored-by: Zhuohan Li <zhuohan@openai.com> Co-authored-by: Maratyszcza <marat@openai.com> Co-authored-by: Volodymyr Kyrylov <vol@wilab.org.ua>
91 lines
2.2 KiB
TypeScript
91 lines
2.2 KiB
TypeScript
import { OpenAI } from "openai";
|
|
import {
|
|
Agent,
|
|
run,
|
|
setDefaultOpenAIClient,
|
|
setOpenAIAPI,
|
|
setTracingDisabled,
|
|
tool,
|
|
MCPServerStdio,
|
|
} from "@openai/agents";
|
|
import { z } from "zod";
|
|
import path from "node:path";
|
|
import process from "node:process";
|
|
import { styleText } from "node:util";
|
|
import { createInterface } from "node:readline/promises";
|
|
|
|
async function prompt(question: string) {
|
|
const rl = createInterface({
|
|
input: process.stdin,
|
|
output: process.stdout,
|
|
});
|
|
const answer = await rl.question(question);
|
|
rl.close();
|
|
return answer;
|
|
}
|
|
|
|
const openai = new OpenAI({
|
|
apiKey: "local",
|
|
baseURL: "http://localhost:11434/v1",
|
|
});
|
|
|
|
const samplesDir = path.join(process.cwd());
|
|
|
|
const mcpServer = new MCPServerStdio({
|
|
name: "Filesystem MCP Server, via npx",
|
|
fullCommand: `npx -y @modelcontextprotocol/server-filesystem ${samplesDir}`,
|
|
});
|
|
|
|
await mcpServer.connect();
|
|
|
|
setTracingDisabled(true);
|
|
setDefaultOpenAIClient(openai);
|
|
setOpenAIAPI("chat_completions");
|
|
|
|
const searchTool = tool({
|
|
name: "get_current_weather",
|
|
description: "Get the current weather in a given location",
|
|
parameters: z.object({
|
|
location: z.string(),
|
|
}),
|
|
execute: async ({ location }) => {
|
|
return `The weather in ${location} is sunny.`;
|
|
},
|
|
});
|
|
|
|
const agent = new Agent({
|
|
name: "My Agent",
|
|
instructions: "You are a helpful assistant.",
|
|
tools: [searchTool],
|
|
model: "gpt-oss:20b-test",
|
|
mcpServers: [mcpServer],
|
|
});
|
|
|
|
const input = await prompt("> ");
|
|
|
|
const result = await run(agent, input, {
|
|
stream: true,
|
|
});
|
|
|
|
for await (const event of result) {
|
|
if (event.type === "raw_model_stream_event" && event.data.type === "model") {
|
|
if (event.data.event.choices[0].delta.content) {
|
|
process.stdout.write(event.data.event.choices[0].delta.content);
|
|
} else if (event.data.event.choices[0].delta.reasoning) {
|
|
process.stdout.write(event.data.event.choices[0].delta.reasoning);
|
|
}
|
|
} else if (
|
|
event.type === "run_item_stream_event" &&
|
|
event.item.type === "tool_call_item" &&
|
|
event.item.rawItem.type == "function_call"
|
|
) {
|
|
console.log(
|
|
`\nCalling ${event.item.rawItem.name} with: ${event.item.rawItem.arguments}`
|
|
);
|
|
}
|
|
}
|
|
|
|
console.log("\n");
|
|
await result.completed;
|
|
await mcpServer.close();
|