From ddbe2f44def09ca6f562cdaa1ff3444ca841c145 Mon Sep 17 00:00:00 2001 From: zaidmukaddam Date: Fri, 16 Aug 2024 23:21:42 +0530 Subject: [PATCH] few changes --- app/api/chat/route.ts | 196 ++++++++++++++++++++++++------------------ app/page.tsx | 4 +- 2 files changed, 115 insertions(+), 85 deletions(-) diff --git a/app/api/chat/route.ts b/app/api/chat/route.ts index 4fe0596..d92b1b0 100644 --- a/app/api/chat/route.ts +++ b/app/api/chat/route.ts @@ -1,8 +1,8 @@ -import { anthropic } from '@ai-sdk/anthropic' +import { anthropic } from "@ai-sdk/anthropic"; import { convertToCoreMessages, streamText, tool } from "ai"; -import { CodeInterpreter } from '@e2b/code-interpreter' +import { CodeInterpreter } from "@e2b/code-interpreter"; import { z } from "zod"; -import { geolocation } from '@vercel/functions' +import { geolocation } from "@vercel/functions"; // Allow streaming responses up to 30 seconds export const maxDuration = 60; @@ -21,6 +21,7 @@ export async function POST(req: Request) { system: "You are an AI web search engine that helps users find information on the internet.\n" + "Always start with running the tool(s) and then and then only write your response AT ALL COSTS!!\n" + + "Your basic task to first and foremost gather information from a tool and then write your response with images(with web_search)!.\n" + "Never write a response without running the tool(s) first!\n" + "Do not announce or inform the user in any way that your going to run a tool at ALL COSTS!! Just `run` it and then write your response AT ALL COSTS!!!!!." + "Tool Usage Instructions:\n" + @@ -30,14 +31,14 @@ export async function POST(req: Request) { "Incomplete details or any other said words before the search tool result in a bad response." + "Always call the 'web_search' tool to get the information, no need to do a chain of thought or say anything else, go straight to the point." + "Once you have found the information, you provide the user with the information you found in brief like a news paper detail." + - "The detail should be 3-5 paragraphs in 10-12 sentences and put citations using the markdown link format like this always: [source text](link to the site) in the end of each paragraph!" + + "The detail should be 3-5 paragraphs in 10-12 sentences and put citations using the markdown link format like this always: [](link to the site) in the end of each paragraph!" + "Citations will the render in the client side, so please make sure you format them correctly!" + "Never use pointers, unless asked to." + "Do not start the responses with newline characters, always start with the first sentence." + "When the user asks about a Stock, you should 'always' first gather news about it with web search tool, then show the chart and then write your response. Follow these steps in this order only!" + "Never use the retrieve tool for general search. Always use it when the user provides an url! " + - "For weather related questions, use get_weather_data tool and write your response. No need to call any other tool. DO NOT put citation to OpenWeatherMaps API EVER!" + - "Use the 'programming' tool to execute Python code for cases like calculating, sorting, etc. that require computation. " + + "For weather related questions, use get_weather_data tool and write your response. No need to call any other tool. DO NOT put citation to OpenWeatherMaps API EVER!" + + "Use the 'programming' tool to execute Python code for cases like calculating, sorting, etc. that require computation. " + "The environment is like a jupyter notebook so don't write print statements at all costs!, just write variables in the end.\n\n" + "The current date is: " + new Date() @@ -50,8 +51,9 @@ export async function POST(req: Request) { .replace(/(\w+), (\w+) (\d+), (\d+)/, "$4-$2-$3 ($1)") + "." + "Rules for the response:\n" + - "Never use tags like , or in the response." + - "Use a story telling format in your response, like a news article ALWAYS! This is for all tools except programming!" + + "Please do not use tags like , or in the response. it breaks the reader's attention to these stupid mistakes." + + "Remember to always use the 'web_search' tool to gather information before writing a response." + + "You are a graduate level AI, so please write responses accordingly." + "Never start with 'based on the search results,...' EVER! Always start with the information you found like an article!" + "Never use the heading format in your response!." + "Do not use print statements in the code execution tool, just the variables." + @@ -59,158 +61,186 @@ export async function POST(req: Request) { "IMPORTANT!!!: Refrain from saying things like that mention that your going to perform a certain action, example: 'Certainly! I'll search for information about using the web search tool.'", tools: { web_search: tool({ - description: 'Search the web for information with the given query, max results and search depth.', + description: + "Search the web for information with the given query, max results and search depth.", parameters: z.object({ - query: z.string() - .describe('The search query to look up on the web.'), - maxResults: z.number() - .describe('The maximum number of results to return. Default to be used is 10.'), - searchDepth: - z.enum(['basic', 'advanced']) - .describe('The search depth to use for the search. Default is basic.') + query: z.string().describe("The search query to look up on the web."), + maxResults: z + .number() + .describe( + "The maximum number of results to return. Default to be used is 10.", + ), + searchDepth: z + .enum(["basic", "advanced"]) + .describe( + "The search depth to use for the search. Default is basic.", + ), + exclude_domains: z + .array(z.string()) + .optional() + .describe( + "A list of domains to specifically exclude from the search results. Default is None, which doesn't exclude any domains.", + ), }), - execute: async ({ query, maxResults, searchDepth }: { query: string, maxResults: number, searchDepth: 'basic' | 'advanced' }) => { - const apiKey = process.env.TAVILY_API_KEY - const response = await fetch('https://api.tavily.com/search', { - method: 'POST', + execute: async ({ + query, + maxResults, + searchDepth, + exclude_domains, + }: { + query: string; + maxResults: number; + searchDepth: "basic" | "advanced"; + exclude_domains?: string[]; + }) => { + const apiKey = process.env.TAVILY_API_KEY; + const response = await fetch("https://api.tavily.com/search", { + method: "POST", headers: { - 'Content-Type': 'application/json' + "Content-Type": "application/json", }, body: JSON.stringify({ api_key: apiKey, query, max_results: maxResults < 5 ? 5 : maxResults, search_depth: searchDepth, - include_images: true, - include_answers: true - }) - }) + include_answers: true, + exclude_domains: exclude_domains, + }), + }); - const data = await response.json() + const data = await response.json(); - let context = data.results.map((obj: { url: any; content: any; title: any; raw_content: any; }) => { - return { - url: obj.url, - title: obj.title, - content: obj.content, - raw_content: obj.raw_content - } - }) + let context = data.results.map( + (obj: { url: any; content: any; title: any; raw_content: any }) => { + return { + url: obj.url, + title: obj.title, + content: obj.content, + raw_content: obj.raw_content, + }; + }, + ); return { - results: context - } - } + results: context, + }; + }, }), retrieve: tool({ - description: 'Retrieve the information from a URL.', + description: "Retrieve the information from a URL.", parameters: z.object({ - url: z.string().describe('The URL to retrieve the information from.') + url: z.string().describe("The URL to retrieve the information from."), }), execute: async ({ url }: { url: string }) => { - let hasError = false + let hasError = false; let results; try { const response = await fetch(`https://r.jina.ai/${url}`, { - method: 'GET', + method: "GET", headers: { - Accept: 'application/json', - 'X-With-Generated-Alt': 'true' - } - }) - const json = await response.json() + Accept: "application/json", + "X-With-Generated-Alt": "true", + }, + }); + const json = await response.json(); if (!json.data || json.data.length === 0) { - hasError = true + hasError = true; } else { // Limit the content to 5000 characters if (json.data.content.length > 5000) { - json.data.content = json.data.content.slice(0, 5000) + json.data.content = json.data.content.slice(0, 5000); } results = { results: [ { title: json.data.title, content: json.data.content, - url: json.data.url - } + url: json.data.url, + }, ], - query: '', - images: [] - } + query: "", + images: [], + }; } } catch (error) { - hasError = true - console.error('Retrieve API error:', error) + hasError = true; + console.error("Retrieve API error:", error); } if (hasError || !results) { - return results + return results; } - return results - } + return results; + }, }), get_weather_data: tool({ description: "Get the weather data for the given coordinates.", parameters: z.object({ - lat: z.number().describe('The latitude of the location.'), - lon: z.number().describe('The longitude of the location.') + lat: z.number().describe("The latitude of the location."), + lon: z.number().describe("The longitude of the location."), }), - execute: async ({ lat, lon }: { lat: number, lon: number }) => { - const apiKey = process.env.OPENWEATHER_API_KEY - const response = await fetch(`https://api.openweathermap.org/data/2.5/forecast?lat=${lat}&lon=${lon}&appid=${apiKey}`) - const data = await response.json() - return data - } + execute: async ({ lat, lon }: { lat: number; lon: number }) => { + const apiKey = process.env.OPENWEATHER_API_KEY; + const response = await fetch( + `https://api.openweathermap.org/data/2.5/forecast?lat=${lat}&lon=${lon}&appid=${apiKey}`, + ); + const data = await response.json(); + return data; + }, }), stock_chart_ui: tool({ - description: 'Display the stock chart for the given stock symbol after web search.', + description: + "Display the stock chart for the given stock symbol after web search.", parameters: z.object({ - symbol: z.string().describe('The stock symbol to display the chart for.') + symbol: z + .string() + .describe("The stock symbol to display the chart for."), }), }), programming: tool({ - description: 'Write and execute Python code.', + description: "Write and execute Python code.", parameters: z.object({ - code: z.string().describe('The Python code to execute.') + code: z.string().describe("The Python code to execute."), }), execute: async ({ code }: { code: string }) => { - const sandbox = await CodeInterpreter.create() - const execution = await sandbox.notebook.execCell(code) + const sandbox = await CodeInterpreter.create(); + const execution = await sandbox.notebook.execCell(code); if (execution.results.length > 0) { - let message: string = ''; + let message: string = ""; for (const result of execution.results) { if (result.isMainResult) { - message += `${result.text}\n` + message += `${result.text}\n`; } else { - message += `${result.text}\n` + message += `${result.text}\n`; } if (result.formats().length > 0) { - message += `It has following formats: ${result.formats()}\n` + message += `It has following formats: ${result.formats()}\n`; } } - return message + return message; } if ( execution.logs.stdout.length > 0 || execution.logs.stderr.length > 0 ) { - let message = '' + let message = ""; if (execution.logs.stdout.length > 0) { - message += `${execution.logs.stdout.join('\n')}\n` + message += `${execution.logs.stdout.join("\n")}\n`; } if (execution.logs.stderr.length > 0) { - message += `${execution.logs.stderr.join('\n')}\n` + message += `${execution.logs.stderr.join("\n")}\n`; } - return message + return message; } - return 'There was no output of the execution.' - } + return "There was no output of the execution."; + }, }), }, }); diff --git a/app/page.tsx b/app/page.tsx index c5401e5..ea4a05b 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -188,7 +188,7 @@ export default function Home() { const models = [ { name: 'Speed', description: 'High speed, but lower quality.', details: '(Anthropic/Claude-3-Haiku)', icon: FastForward }, - { name: 'Quality (Claude)', description: 'High quality generation.', details: '(Anthropic/Claude-3.5-Sonnet)', icon: Sparkles }, + { name: 'Quality', description: 'High quality generation.', details: '(Anthropic/Claude-3.5-Sonnet)', icon: Sparkles }, ]; const handleModelChange = (value: string) => { @@ -855,7 +855,7 @@ export default function Home() { className={`flex items-center font-semibold ${models.find((model) => model.name === selectedModel)?.name.includes('Quality') ? 'text-purple-500' : 'text-green-500'} focus:outline-none focus:ring-0 `} > {selectedModel === 'Speed' && } - {(selectedModel === 'Quality (Claude)') && } + {(selectedModel === 'Quality') && } {selectedModel}