matt HOFFNER
commited on
Commit
β’
1c1c1be
1
Parent(s):
f4e05b5
cleanup
Browse files- app/tools/serp-api.ts +3 -2
- app/tools/surfer.ts +1 -23
- pages/api/functions/index.ts +25 -24
app/tools/serp-api.ts
CHANGED
@@ -17,8 +17,9 @@ function createSerpApi({ apiKey }: { apiKey: string }) {
|
|
17 |
q: input,
|
18 |
location: "Seattle, Washington",
|
19 |
});
|
20 |
-
|
21 |
-
|
|
|
22 |
} catch (error) {
|
23 |
throw new Error(`Error in serpApi: ${error}`);
|
24 |
}
|
|
|
17 |
q: input,
|
18 |
location: "Seattle, Washington",
|
19 |
});
|
20 |
+
|
21 |
+
console.log(response);
|
22 |
+
return JSON.stringify(response);
|
23 |
} catch (error) {
|
24 |
throw new Error(`Error in serpApi: ${error}`);
|
25 |
}
|
app/tools/surfer.ts
CHANGED
@@ -8,29 +8,7 @@ function createUrlSurfer() {
|
|
8 |
const name = 'surfer';
|
9 |
const description = 'A custom URL navigator. Useful when a URL is provided with a question. Input should be a prompt with a URL. Outputs a JSON array of relevant results.';
|
10 |
|
11 |
-
|
12 |
-
try {
|
13 |
-
const res = await fetch('/api/surfer', {
|
14 |
-
method: 'POST',
|
15 |
-
headers: {
|
16 |
-
'Content-Type': 'application/json',
|
17 |
-
},
|
18 |
-
body: JSON.stringify({ prompt: input }),
|
19 |
-
});
|
20 |
-
|
21 |
-
if (!res.ok) {
|
22 |
-
throw new Error(`HTTP error! status: ${res.status}`);
|
23 |
-
}
|
24 |
-
|
25 |
-
const data = await res.json();
|
26 |
-
return data;
|
27 |
-
} catch (error) {
|
28 |
-
// @ts-ignore
|
29 |
-
throw new Error(`Error in UrlSurfer: ${error.message}`);
|
30 |
-
}
|
31 |
-
};
|
32 |
-
|
33 |
-
return new Tool(paramsSchema, name, description, execute).tool;
|
34 |
}
|
35 |
|
36 |
export { createUrlSurfer };
|
|
|
8 |
const name = 'surfer';
|
9 |
const description = 'A custom URL navigator. Useful when a URL is provided with a question. Input should be a prompt with a URL. Outputs a JSON array of relevant results.';
|
10 |
|
11 |
+
return new Tool(paramsSchema, name, description, {} as any).tool;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12 |
}
|
13 |
|
14 |
export { createUrlSurfer };
|
pages/api/functions/index.ts
CHANGED
@@ -64,39 +64,40 @@ const handleContentText = async (targetUrl: string) => {
|
|
64 |
return content;
|
65 |
}
|
66 |
|
67 |
-
|
68 |
-
const
|
69 |
-
const functionName = req.body.name as string;
|
70 |
-
const urls = prompt.match(urlRegex);
|
71 |
const targetUrl = urls ? urls[0] : null;
|
72 |
-
const promptWithoutUrl = urls ?
|
73 |
|
74 |
-
|
75 |
-
|
|
|
76 |
}
|
77 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
try {
|
79 |
if (functionName === 'serpApi') {
|
80 |
const result = await serpApi({ input: prompt });
|
81 |
return res.status(200).send(result);
|
82 |
} else {
|
83 |
-
const
|
84 |
-
|
85 |
-
return `Couldn't find ${targetUrl}, here is the prompt: ${promptWithoutUrl}`;
|
86 |
-
}
|
87 |
-
|
88 |
-
const documents = await textSplitter.createDocuments([content]);
|
89 |
-
|
90 |
-
const vectorStore = await MemoryVectorStore.fromTexts(
|
91 |
-
// @ts-ignore
|
92 |
-
[...documents.map(doc => doc.pageContent)],
|
93 |
-
// @ts-ignore
|
94 |
-
[...documents.map((v, k) => k)],
|
95 |
-
model
|
96 |
-
)
|
97 |
-
const queryResult = await vectorStore.similaritySearch(promptWithoutUrl, VECTOR_STORE_SIZE);
|
98 |
-
return res.status(200).send(
|
99 |
-
`Here is the context: ${JSON.stringify(queryResult.map(result => result.pageContent))} from using the prompt to lookup relevant information. Here is the prompt: ${promptWithoutUrl}`);
|
100 |
}
|
101 |
} catch (error) {
|
102 |
console.error(error);
|
|
|
64 |
return content;
|
65 |
}
|
66 |
|
67 |
+
const surferApi = async ({ input }: any) => {
|
68 |
+
const urls = input.match(urlRegex);
|
|
|
|
|
69 |
const targetUrl = urls ? urls[0] : null;
|
70 |
+
const promptWithoutUrl = urls ? input.replace(urlRegex, '').trim() : input;
|
71 |
|
72 |
+
const content: string = await handleContentText(targetUrl)
|
73 |
+
if (!content) {
|
74 |
+
return `Couldn't find ${targetUrl}, here is the prompt: ${promptWithoutUrl}`;
|
75 |
}
|
76 |
|
77 |
+
const documents = await textSplitter.createDocuments([content]);
|
78 |
+
|
79 |
+
const vectorStore = await MemoryVectorStore.fromTexts(
|
80 |
+
// @ts-ignore
|
81 |
+
[...documents.map(doc => doc.pageContent)],
|
82 |
+
// @ts-ignore
|
83 |
+
[...documents.map((v, k) => k)],
|
84 |
+
model
|
85 |
+
)
|
86 |
+
const queryResult = await vectorStore.similaritySearch(promptWithoutUrl, VECTOR_STORE_SIZE);
|
87 |
+
return `Here is the context: ${JSON.stringify(queryResult.map(result => result.pageContent))} from using the prompt to lookup relevant information. Here is the prompt: ${promptWithoutUrl}`;
|
88 |
+
}
|
89 |
+
|
90 |
+
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
91 |
+
const prompt = req.body.prompt as string;
|
92 |
+
const functionName = req.body.name as string;
|
93 |
+
|
94 |
try {
|
95 |
if (functionName === 'serpApi') {
|
96 |
const result = await serpApi({ input: prompt });
|
97 |
return res.status(200).send(result);
|
98 |
} else {
|
99 |
+
const result = await surferApi({ input: prompt })
|
100 |
+
return res.status(200).send(result);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
101 |
}
|
102 |
} catch (error) {
|
103 |
console.error(error);
|