feat(api): update search api & related documentation

This commit is contained in:
ItzCrazyKns
2025-12-27 13:07:59 +05:30
parent a31a4ab295
commit 50ca7ac73a
2 changed files with 90 additions and 84 deletions

View File

@@ -1,12 +1,13 @@
import ModelRegistry from '@/lib/models/registry';
import { ModelWithProvider } from '@/lib/models/types';
import SessionManager from '@/lib/session';
import SearchAgent from '@/lib/agents/search';
import { ChatTurnMessage } from '@/lib/types';
import { SearchSources } from '@/lib/agents/search/types';
import APISearchAgent from '@/lib/agents/search/api';
interface ChatRequestBody {
optimizationMode: 'speed' | 'balanced';
focusMode: string;
optimizationMode: 'speed' | 'balanced' | 'quality';
sources: SearchSources[];
chatModel: ModelWithProvider;
embeddingModel: ModelWithProvider;
query: string;
@@ -19,15 +20,15 @@ export const POST = async (req: Request) => {
try {
const body: ChatRequestBody = await req.json();
if (!body.focusMode || !body.query) {
if (!body.sources || !body.query) {
return Response.json(
{ message: 'Missing focus mode or query' },
{ message: 'Missing sources or query' },
{ status: 400 },
);
}
body.history = body.history || [];
body.optimizationMode = body.optimizationMode || 'balanced';
body.optimizationMode = body.optimizationMode || 'speed';
body.stream = body.stream || false;
const registry = new ModelRegistry();
@@ -48,18 +49,21 @@ export const POST = async (req: Request) => {
const session = SessionManager.createSession();
const agent = new SearchAgent();
const agent = new APISearchAgent();
agent.searchAsync(session, {
chatHistory: history,
config: {
embedding: embeddings,
llm: llm,
sources: ['web', 'discussions', 'academic'],
mode: 'balanced',
sources: body.sources,
mode: body.optimizationMode,
fileIds: [],
systemInstructions: body.systemInstructions || '',
},
followUp: body.query,
chatId: crypto.randomUUID(),
messageId: crypto.randomUUID(),
});
if (!body.stream) {
@@ -71,36 +75,37 @@ export const POST = async (req: Request) => {
let message = '';
let sources: any[] = [];
session.addListener('data', (data: string) => {
try {
const parsedData = JSON.parse(data);
if (parsedData.type === 'response') {
message += parsedData.data;
} else if (parsedData.type === 'sources') {
sources = parsedData.data;
session.subscribe((event: string, data: Record<string, any>) => {
if (event === 'data') {
try {
if (data.type === 'response') {
message += data.data;
} else if (data.type === 'searchResults') {
sources = data.data;
}
} catch (error) {
reject(
Response.json(
{ message: 'Error parsing data' },
{ status: 500 },
),
);
}
} catch (error) {
}
if (event === 'end') {
resolve(Response.json({ message, sources }, { status: 200 }));
}
if (event === 'error') {
reject(
Response.json(
{ message: 'Error parsing data' },
{ message: 'Search error', error: data },
{ status: 500 },
),
);
}
});
session.addListener('end', () => {
resolve(Response.json({ message, sources }, { status: 200 }));
});
session.addListener('error', (error: any) => {
reject(
Response.json(
{ message: 'Search error', error },
{ status: 500 },
),
);
});
},
);
}
@@ -131,54 +136,54 @@ export const POST = async (req: Request) => {
} catch (error) {}
});
session.addListener('data', (data: string) => {
if (signal.aborted) return;
session.subscribe((event: string, data: Record<string, any>) => {
if (event === 'data') {
if (signal.aborted) return;
try {
const parsedData = JSON.parse(data);
if (parsedData.type === 'response') {
controller.enqueue(
encoder.encode(
JSON.stringify({
type: 'response',
data: parsedData.data,
}) + '\n',
),
);
} else if (parsedData.type === 'sources') {
sources = parsedData.data;
controller.enqueue(
encoder.encode(
JSON.stringify({
type: 'sources',
data: sources,
}) + '\n',
),
);
try {
if (data.type === 'response') {
controller.enqueue(
encoder.encode(
JSON.stringify({
type: 'response',
data: data.data,
}) + '\n',
),
);
} else if (data.type === 'searchResults') {
sources = data.data;
controller.enqueue(
encoder.encode(
JSON.stringify({
type: 'sources',
data: sources,
}) + '\n',
),
);
}
} catch (error) {
controller.error(error);
}
} catch (error) {
controller.error(error);
}
});
session.addListener('end', () => {
if (signal.aborted) return;
if (event === 'end') {
if (signal.aborted) return;
controller.enqueue(
encoder.encode(
JSON.stringify({
type: 'done',
}) + '\n',
),
);
controller.close();
});
controller.enqueue(
encoder.encode(
JSON.stringify({
type: 'done',
}) + '\n',
),
);
controller.close();
}
session.addListener('error', (error: any) => {
if (signal.aborted) return;
if (event === 'error') {
if (signal.aborted) return;
controller.error(error);
controller.error(data);
}
});
},
cancel() {