mirror of
https://github.com/jina-ai/node-DeepResearch.git
synced 2025-12-26 06:28:56 +08:00
fix: enhance error logging and validation in app
This commit is contained in:
parent
37b71eb86f
commit
a8afbd323a
@ -824,7 +824,7 @@ But then you realized you have asked them before. You decided to to think out of
|
|||||||
} as AnswerAction;
|
} as AnswerAction;
|
||||||
candidateAnswers = subproblemResponses.map(r => (r.result as AnswerAction).mdAnswer).filter(a => a) as string[];
|
candidateAnswers = subproblemResponses.map(r => (r.result as AnswerAction).mdAnswer).filter(a => a) as string[];
|
||||||
// dedup references by their urls
|
// dedup references by their urls
|
||||||
const uniqueURLs = new Set(thisStep.references.map(r => r.url));
|
const uniqueURLs = new Set(thisStep.references.filter(r => r?.url).map(r => r.url));
|
||||||
thisStep.references = Array.from(uniqueURLs).map(url => (thisStep as AnswerAction).references.find(r => r?.url === url)) as Reference[];
|
thisStep.references = Array.from(uniqueURLs).map(url => (thisStep as AnswerAction).references.find(r => r?.url === url)) as Reference[];
|
||||||
|
|
||||||
// aggregate urls
|
// aggregate urls
|
||||||
|
|||||||
24
src/app.ts
24
src/app.ts
@ -314,8 +314,8 @@ if (secret) {
|
|||||||
app.use((req, res, next) => {
|
app.use((req, res, next) => {
|
||||||
const authHeader = req.headers.authorization;
|
const authHeader = req.headers.authorization;
|
||||||
if (!authHeader || !authHeader.startsWith('Bearer ') || authHeader.split(' ')[1] !== secret) {
|
if (!authHeader || !authHeader.startsWith('Bearer ') || authHeader.split(' ')[1] !== secret) {
|
||||||
logError('[chat/completions] Unauthorized request');
|
logError('Unauthorized request');
|
||||||
res.status(401).json({ error: 'Unauthorized' });
|
res.status(401).json({ error: 'Unauthorized. Please provide a valid Jina API key.' });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -385,15 +385,15 @@ const validationRules = [
|
|||||||
|
|
||||||
app.post('/v1/chat/completions', validationRules, (async (req: Request, res: Response) => {
|
app.post('/v1/chat/completions', validationRules, (async (req: Request, res: Response) => {
|
||||||
const clientIp = req.headers['cf-connecting-ip'] ||
|
const clientIp = req.headers['cf-connecting-ip'] ||
|
||||||
req.headers['x-forwarded-for'] ||
|
req.headers['x-forwarded-for'] ||
|
||||||
req.ip ||
|
req.ip ||
|
||||||
req.socket.remoteAddress ||
|
req.socket.remoteAddress ||
|
||||||
'unknown';
|
'unknown';
|
||||||
|
|
||||||
// Validate request body
|
// Validate request body
|
||||||
const errors = validationResult(req);
|
const errors = validationResult(req);
|
||||||
if (!errors.isEmpty()) {
|
if (!errors.isEmpty()) {
|
||||||
logError('[chat/completions] Validation errors:', { errors: errors.array(), ip: clientIp });
|
logError('Validation errors:', { errors: errors.array(), ip: clientIp });
|
||||||
return res.status(400).json({ error: 'Invalid request body', details: errors.array() });
|
return res.status(400).json({ error: 'Invalid request body', details: errors.array() });
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,14 +401,14 @@ app.post('/v1/chat/completions', validationRules, (async (req: Request, res: Res
|
|||||||
if (secret) {
|
if (secret) {
|
||||||
const authHeader = req.headers.authorization;
|
const authHeader = req.headers.authorization;
|
||||||
if (!authHeader || !authHeader.startsWith('Bearer ') || authHeader.split(' ')[1] !== secret) {
|
if (!authHeader || !authHeader.startsWith('Bearer ') || authHeader.split(' ')[1] !== secret) {
|
||||||
logError('[chat/completions] Unauthorized request');
|
logError('Unauthorized request');
|
||||||
res.status(401).json({ error: 'Unauthorized' });
|
res.status(401).json({ error: 'Unauthorized. Please provide a valid Jina API key.' });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log request details (excluding sensitive data)
|
// Log request details (excluding sensitive data)
|
||||||
logInfo('[chat/completions] Request:', {
|
logInfo('[chat/completions] Start:', {
|
||||||
model: req.body.model,
|
model: req.body.model,
|
||||||
stream: req.body.stream,
|
stream: req.body.stream,
|
||||||
messageCount: req.body.messages?.length,
|
messageCount: req.body.messages?.length,
|
||||||
@ -466,12 +466,12 @@ app.post('/v1/chat/completions', validationRules, (async (req: Request, res: Res
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (!body.messages?.length) {
|
if (!body.messages?.length) {
|
||||||
logError('[chat/completions] Messages array is required and must not be empty', { messages: body.messages });
|
logError('Messages array is required and must not be empty', { messages: body.messages });
|
||||||
return res.status(400).json({ error: 'Messages array is required and must not be empty' });
|
return res.status(400).json({ error: 'Messages array is required and must not be empty' });
|
||||||
}
|
}
|
||||||
const lastMessage = body.messages[body.messages.length - 1];
|
const lastMessage = body.messages[body.messages.length - 1];
|
||||||
if (lastMessage.role !== 'user') {
|
if (lastMessage.role !== 'user') {
|
||||||
logError('[chat/completions] Last message must be from user', { messages: body.messages });
|
logError('Last message must be from user', { messages: body.messages });
|
||||||
return res.status(400).json({ error: 'Last message must be from user' });
|
return res.status(400).json({ error: 'Last message must be from user' });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user