mirror of
https://github.com/jina-ai/node-DeepResearch.git
synced 2025-12-26 06:28:56 +08:00
chore: update .gitignore, format config.json, add arxiv search functionality (#113)
This commit is contained in:
parent
ebbb13b6bc
commit
d5a31bce52
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,4 +1,6 @@
|
|||||||
.DS_Store
|
.DS_Store
|
||||||
|
messages.json
|
||||||
|
urls.json
|
||||||
|
|
||||||
# Files
|
# Files
|
||||||
tasks/
|
tasks/
|
||||||
|
|||||||
64
config.json
64
config.json
@ -33,15 +33,33 @@
|
|||||||
"maxTokens": 2000
|
"maxTokens": 2000
|
||||||
},
|
},
|
||||||
"tools": {
|
"tools": {
|
||||||
"coder": { "temperature": 0.7 },
|
"coder": {
|
||||||
"searchGrounding": { "temperature": 0 },
|
"temperature": 0.7
|
||||||
"dedup": { "temperature": 0.1 },
|
},
|
||||||
"evaluator": {"temperature": 0.6, "maxTokens": 200},
|
"searchGrounding": {
|
||||||
|
"temperature": 0
|
||||||
|
},
|
||||||
|
"dedup": {
|
||||||
|
"temperature": 0.1
|
||||||
|
},
|
||||||
|
"evaluator": {
|
||||||
|
"temperature": 0.6,
|
||||||
|
"maxTokens": 200
|
||||||
|
},
|
||||||
"errorAnalyzer": {},
|
"errorAnalyzer": {},
|
||||||
"queryRewriter": { "temperature": 0.1 },
|
"queryRewriter": {
|
||||||
"agent": { "temperature": 0.7 },
|
"temperature": 0.1
|
||||||
"agentBeastMode": { "temperature": 0.7 },
|
},
|
||||||
"fallback": {"maxTokens": 8000, "model": "gemini-2.0-flash-lite"}
|
"agent": {
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"agentBeastMode": {
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"fallback": {
|
||||||
|
"maxTokens": 8000,
|
||||||
|
"model": "gemini-2.0-flash-lite"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"openai": {
|
"openai": {
|
||||||
@ -51,16 +69,30 @@
|
|||||||
"maxTokens": 8000
|
"maxTokens": 8000
|
||||||
},
|
},
|
||||||
"tools": {
|
"tools": {
|
||||||
"coder": { "temperature": 0.7 },
|
"coder": {
|
||||||
"searchGrounding": { "temperature": 0 },
|
"temperature": 0.7
|
||||||
"dedup": { "temperature": 0.1 },
|
},
|
||||||
|
"searchGrounding": {
|
||||||
|
"temperature": 0
|
||||||
|
},
|
||||||
|
"dedup": {
|
||||||
|
"temperature": 0.1
|
||||||
|
},
|
||||||
"evaluator": {},
|
"evaluator": {},
|
||||||
"errorAnalyzer": {},
|
"errorAnalyzer": {},
|
||||||
"queryRewriter": { "temperature": 0.1 },
|
"queryRewriter": {
|
||||||
"agent": { "temperature": 0.7 },
|
"temperature": 0.1
|
||||||
"agentBeastMode": { "temperature": 0.7 },
|
},
|
||||||
"fallback": { "temperature": 0 }
|
"agent": {
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"agentBeastMode": {
|
||||||
|
"temperature": 0.7
|
||||||
|
},
|
||||||
|
"fallback": {
|
||||||
|
"temperature": 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -43,6 +43,7 @@ import { formatDateBasedOnType, formatDateRange } from "./utils/date-tools";
|
|||||||
import { repairUnknownChars } from "./tools/broken-ch-fixer";
|
import { repairUnknownChars } from "./tools/broken-ch-fixer";
|
||||||
import { reviseAnswer } from "./tools/md-fixer";
|
import { reviseAnswer } from "./tools/md-fixer";
|
||||||
import { buildReferences } from "./tools/build-ref";
|
import { buildReferences } from "./tools/build-ref";
|
||||||
|
import { arxivSearch } from './tools/arxiv-search';
|
||||||
|
|
||||||
async function sleep(ms: number) {
|
async function sleep(ms: number) {
|
||||||
const seconds = Math.ceil(ms / 1000);
|
const seconds = Math.ceil(ms / 1000);
|
||||||
@ -304,6 +305,9 @@ async function executeSearchQueries(
|
|||||||
case 'brave':
|
case 'brave':
|
||||||
results = (await braveSearch(query.q)).response.web?.results || [];
|
results = (await braveSearch(query.q)).response.web?.results || [];
|
||||||
break;
|
break;
|
||||||
|
case 'arxiv':
|
||||||
|
results = (await arxivSearch(query)).response.results || [];
|
||||||
|
break;
|
||||||
case 'serper':
|
case 'serper':
|
||||||
results = (await serperSearch(query)).response.organic || [];
|
results = (await serperSearch(query)).response.organic || [];
|
||||||
break;
|
break;
|
||||||
@ -395,7 +399,7 @@ export async function getResponse(question?: string,
|
|||||||
let totalStep = 0;
|
let totalStep = 0;
|
||||||
const allContext: StepAction[] = []; // all steps in the current session, including those leads to wrong results
|
const allContext: StepAction[] = []; // all steps in the current session, including those leads to wrong results
|
||||||
|
|
||||||
const updateContext = function(step: any) {
|
const updateContext = function (step: any) {
|
||||||
allContext.push(step);
|
allContext.push(step);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
46
src/tools/arxiv-search.ts
Normal file
46
src/tools/arxiv-search.ts
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import { TokenTracker } from "../utils/token-tracker";
|
||||||
|
import { ArxivSearchResponse, SERPQuery } from '../types';
|
||||||
|
import { JINA_API_KEY } from "../config";
|
||||||
|
import axiosClient from '../utils/axios-client';
|
||||||
|
|
||||||
|
export async function arxivSearch(
|
||||||
|
query: SERPQuery,
|
||||||
|
tracker?: TokenTracker
|
||||||
|
): Promise<{ response: ArxivSearchResponse }> {
|
||||||
|
try {
|
||||||
|
const { data } = await axiosClient.post<ArxivSearchResponse>(
|
||||||
|
`https://svip.jina.ai/`,
|
||||||
|
{
|
||||||
|
q: query.q,
|
||||||
|
domain: 'arxiv',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
'Accept': 'application/json',
|
||||||
|
'Authorization': `Bearer ${JINA_API_KEY}`,
|
||||||
|
},
|
||||||
|
timeout: 10000,
|
||||||
|
responseType: 'json'
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!data.results || !Array.isArray(data.results)) {
|
||||||
|
throw new Error('Invalid response format');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
console.log('Total URLs:', data.meta.num_results);
|
||||||
|
|
||||||
|
const tokenTracker = tracker || new TokenTracker();
|
||||||
|
tokenTracker.trackUsage('search', {
|
||||||
|
totalTokens: data.meta.credits,
|
||||||
|
promptTokens: query.q.length,
|
||||||
|
completionTokens: 0
|
||||||
|
});
|
||||||
|
|
||||||
|
return { response: data };
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error in arxiv search:', error instanceof Error ? error.message : 'Unknown error occurred');
|
||||||
|
throw new Error(error instanceof Error ? error.message : 'Unknown error occurred');
|
||||||
|
}
|
||||||
|
}
|
||||||
14
src/types.ts
14
src/types.ts
@ -75,6 +75,20 @@ export interface TokenUsage {
|
|||||||
usage: LanguageModelUsage;
|
usage: LanguageModelUsage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ArxivSearchResponse {
|
||||||
|
results: Array<{
|
||||||
|
title: string;
|
||||||
|
snippet: string;
|
||||||
|
url: string;
|
||||||
|
}>;
|
||||||
|
meta: {
|
||||||
|
query: string;
|
||||||
|
num_results: number;
|
||||||
|
latency: number;
|
||||||
|
credits: number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export interface SearchResponse {
|
export interface SearchResponse {
|
||||||
code: number;
|
code: number;
|
||||||
status: number;
|
status: number;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user