@amaster.ai/pi-web-access 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +164 -0
- package/dist/config.d.ts +19 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +129 -0
- package/dist/config.js.map +1 -0
- package/dist/fetch.d.ts +8 -0
- package/dist/fetch.d.ts.map +1 -0
- package/dist/fetch.js +67 -0
- package/dist/fetch.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +179 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/anthropic.d.ts +8 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +100 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/base.d.ts +44 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +9 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/gemini.d.ts +7 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +41 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/index.d.ts +6 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +29 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/kimi.d.ts +8 -0
- package/dist/providers/kimi.d.ts.map +1 -0
- package/dist/providers/kimi.js +66 -0
- package/dist/providers/kimi.js.map +1 -0
- package/dist/providers/mimo.d.ts +7 -0
- package/dist/providers/mimo.d.ts.map +1 -0
- package/dist/providers/mimo.js +45 -0
- package/dist/providers/mimo.js.map +1 -0
- package/dist/providers/openai.d.ts +7 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +56 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/providers/openrouter.d.ts +8 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +83 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/perplexity.d.ts +8 -0
- package/dist/providers/perplexity.d.ts.map +1 -0
- package/dist/providers/perplexity.js +99 -0
- package/dist/providers/perplexity.js.map +1 -0
- package/dist/providers/tavily.d.ts +8 -0
- package/dist/providers/tavily.d.ts.map +1 -0
- package/dist/providers/tavily.js +79 -0
- package/dist/providers/tavily.js.map +1 -0
- package/dist/providers/xai.d.ts +16 -0
- package/dist/providers/xai.d.ts.map +1 -0
- package/dist/providers/xai.js +92 -0
- package/dist/providers/xai.js.map +1 -0
- package/dist/providers/zai.d.ts +8 -0
- package/dist/providers/zai.d.ts.map +1 -0
- package/dist/providers/zai.js +78 -0
- package/dist/providers/zai.js.map +1 -0
- package/dist/search.d.ts +4 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +14 -0
- package/dist/search.js.map +1 -0
- package/dist/summary.d.ts +4 -0
- package/dist/summary.d.ts.map +1 -0
- package/dist/summary.js +44 -0
- package/dist/summary.js.map +1 -0
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +81 -0
- package/preview.png +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mimo.js","sourceRoot":"","sources":["../../src/providers/mimo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,OAAO,YAAa,SAAQ,YAAY;IACnC,EAAE,GAAG,MAAe,CAAC;IAErB,KAAK,CAAC,MAAM,CAAC,MAAoB,EAAE,QAA0B;QACpE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,sFAAsF,CACvF,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC;QACtE,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,QAAQ,CAAC,KAAK,IAAI,eAAe;YACxC,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YACnD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;YACnE,qBAAqB,EAAE,IAAI;YAC3B,WAAW,EAAE,GAAG;YAChB,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;SAC/B,CAAC;QACF,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,SAAS,EAAE,QAAQ,CAAC,MAAM;YAC1B,GAAG,QAAQ,CAAC,OAAO;SACpB,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,kBAAkB,CAAC;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAOlC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;aAC/D,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;aACxC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAEpE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IACjG,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { BaseProvider } from './base.js';
|
|
2
|
+
import type { ResolvedProvider, SearchParams, SearchResponse } from './index.js';
|
|
3
|
+
export declare class OpenAIProvider extends BaseProvider {
|
|
4
|
+
readonly id: "openai";
|
|
5
|
+
search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAgB,MAAM,YAAY,CAAC;AAI/F,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAEjB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;CAiEjG"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { BaseProvider } from './base.js';
|
|
2
|
+
const REQUEST_TIMEOUT_MS = 60_000;
|
|
3
|
+
export class OpenAIProvider extends BaseProvider {
|
|
4
|
+
id = 'openai';
|
|
5
|
+
async search(params, provider) {
|
|
6
|
+
if (!provider.apiKey) {
|
|
7
|
+
throw new Error('OpenAI API key not configured. Set OPENAI_API_KEY env var or configure in settings.json.');
|
|
8
|
+
}
|
|
9
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/responses`;
|
|
10
|
+
const tool = { type: 'web_search' };
|
|
11
|
+
if (params.includeDomains?.length || params.excludeDomains?.length) {
|
|
12
|
+
const filters = {};
|
|
13
|
+
if (params.includeDomains?.length)
|
|
14
|
+
filters.allowed_domains = params.includeDomains;
|
|
15
|
+
if (params.excludeDomains?.length)
|
|
16
|
+
filters.blocked_domains = params.excludeDomains;
|
|
17
|
+
tool.filters = filters;
|
|
18
|
+
}
|
|
19
|
+
const body = { model: provider.model ?? 'gpt-5.5', input: params.query, tools: [tool] };
|
|
20
|
+
const headers = {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
23
|
+
...provider.headers,
|
|
24
|
+
};
|
|
25
|
+
const response = await fetch(url, {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
headers,
|
|
28
|
+
body: JSON.stringify(body),
|
|
29
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const text = await response.text().catch(() => '');
|
|
33
|
+
throw new Error(`OpenAI API error ${response.status}: ${text}`);
|
|
34
|
+
}
|
|
35
|
+
const data = (await response.json());
|
|
36
|
+
let answer = '';
|
|
37
|
+
const results = [];
|
|
38
|
+
for (const item of data.output) {
|
|
39
|
+
if (item.type === 'message' && item.content) {
|
|
40
|
+
for (const block of item.content) {
|
|
41
|
+
if (block.type === 'output_text') {
|
|
42
|
+
answer += block.text;
|
|
43
|
+
if (block.annotations) {
|
|
44
|
+
for (const ann of block.annotations) {
|
|
45
|
+
if (ann.type === 'url_citation' && ann.url)
|
|
46
|
+
results.push({ title: ann.title ?? ann.url, url: ann.url, content: '' });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { provider: provider.id, query: params.query, answer: answer || undefined, results };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FetchResponse, ResolvedProvider, SearchParams, SearchResponse } from './base.js';
|
|
2
|
+
import { BaseProvider } from './base.js';
|
|
3
|
+
export declare class OpenRouterProvider extends BaseProvider {
|
|
4
|
+
readonly id: "openrouter";
|
|
5
|
+
search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
|
|
6
|
+
fetch(targetUrl: string, provider: ResolvedProvider): Promise<FetchResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=openrouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EAEf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,EAAE,EAAG,YAAY,CAAU;IAErB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAuDjF,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;CAsC5F"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { BaseProvider } from './base.js';
|
|
2
|
+
const REQUEST_TIMEOUT_MS = 60_000;
|
|
3
|
+
export class OpenRouterProvider extends BaseProvider {
|
|
4
|
+
id = 'openrouter';
|
|
5
|
+
async search(params, provider) {
|
|
6
|
+
if (!provider.apiKey) {
|
|
7
|
+
throw new Error('OpenRouter API key not configured. Set OPENROUTER_API_KEY env var or configure in settings.json.');
|
|
8
|
+
}
|
|
9
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/chat/completions`;
|
|
10
|
+
const tool = { type: 'openrouter:web_search' };
|
|
11
|
+
const toolParams = {};
|
|
12
|
+
if (params.maxResults)
|
|
13
|
+
toolParams.max_results = params.maxResults;
|
|
14
|
+
if (params.includeDomains?.length)
|
|
15
|
+
toolParams.allowed_domains = params.includeDomains;
|
|
16
|
+
if (params.excludeDomains?.length)
|
|
17
|
+
toolParams.excluded_domains = params.excludeDomains;
|
|
18
|
+
if (Object.keys(toolParams).length > 0)
|
|
19
|
+
tool.parameters = toolParams;
|
|
20
|
+
const body = {
|
|
21
|
+
model: provider.model ?? 'openai/gpt-4.1-mini',
|
|
22
|
+
messages: [{ role: 'user', content: params.query }],
|
|
23
|
+
tools: [tool],
|
|
24
|
+
};
|
|
25
|
+
const headers = {
|
|
26
|
+
'Content-Type': 'application/json',
|
|
27
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
28
|
+
...provider.headers,
|
|
29
|
+
};
|
|
30
|
+
const response = await fetch(url, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers,
|
|
33
|
+
body: JSON.stringify(body),
|
|
34
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
35
|
+
});
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
const text = await response.text().catch(() => '');
|
|
38
|
+
throw new Error(`OpenRouter API error ${response.status}: ${text}`);
|
|
39
|
+
}
|
|
40
|
+
const data = (await response.json());
|
|
41
|
+
const choice = data.choices[0];
|
|
42
|
+
if (!choice)
|
|
43
|
+
throw new Error('OpenRouter API returned empty response');
|
|
44
|
+
const results = (choice.message.annotations ?? [])
|
|
45
|
+
.filter((a) => a.type === 'url_citation' && a.url)
|
|
46
|
+
.map((a) => ({ title: a.title ?? a.url, url: a.url, content: a.content ?? '' }));
|
|
47
|
+
return { provider: provider.id, query: params.query, answer: choice.message.content, results };
|
|
48
|
+
}
|
|
49
|
+
async fetch(targetUrl, provider) {
|
|
50
|
+
if (!provider.apiKey) {
|
|
51
|
+
throw new Error('OpenRouter API key not configured. Set OPENROUTER_API_KEY env var or configure in settings.json.');
|
|
52
|
+
}
|
|
53
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/chat/completions`;
|
|
54
|
+
const body = {
|
|
55
|
+
model: provider.model ?? 'openai/gpt-4.1-mini',
|
|
56
|
+
messages: [
|
|
57
|
+
{ role: 'user', content: `Fetch and return the full content of this URL: ${targetUrl}` },
|
|
58
|
+
],
|
|
59
|
+
tools: [{ type: 'openrouter:web_fetch' }],
|
|
60
|
+
};
|
|
61
|
+
const headers = {
|
|
62
|
+
'Content-Type': 'application/json',
|
|
63
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
64
|
+
...provider.headers,
|
|
65
|
+
};
|
|
66
|
+
const response = await fetch(url, {
|
|
67
|
+
method: 'POST',
|
|
68
|
+
headers,
|
|
69
|
+
body: JSON.stringify(body),
|
|
70
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
71
|
+
});
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
const text = await response.text().catch(() => '');
|
|
74
|
+
throw new Error(`OpenRouter API error ${response.status}: ${text}`);
|
|
75
|
+
}
|
|
76
|
+
const data = (await response.json());
|
|
77
|
+
const choice = data.choices[0];
|
|
78
|
+
if (!choice)
|
|
79
|
+
throw new Error('OpenRouter API returned empty response');
|
|
80
|
+
return { url: targetUrl, title: targetUrl, content: choice.message.content };
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=openrouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FetchResponse, ResolvedProvider, SearchParams, SearchResponse } from './base.js';
|
|
2
|
+
import { BaseProvider } from './base.js';
|
|
3
|
+
export declare class PerplexityProvider extends BaseProvider {
|
|
4
|
+
readonly id: "perplexity";
|
|
5
|
+
search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
|
|
6
|
+
fetch(targetUrl: string, provider: ResolvedProvider): Promise<FetchResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=perplexity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity.d.ts","sourceRoot":"","sources":["../../src/providers/perplexity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EAEf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,QAAQ,CAAC,EAAE,EAAG,YAAY,CAAU;IAErB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IA4DjF,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;CAyD5F"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { BaseProvider } from './base.js';
|
|
2
|
+
const REQUEST_TIMEOUT_MS = 60_000;
|
|
3
|
+
export class PerplexityProvider extends BaseProvider {
|
|
4
|
+
id = 'perplexity';
|
|
5
|
+
async search(params, provider) {
|
|
6
|
+
if (!provider.apiKey) {
|
|
7
|
+
throw new Error('Perplexity API key not configured. Set PERPLEXITY_API_KEY env var or configure in settings.json.');
|
|
8
|
+
}
|
|
9
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/v1/agent`;
|
|
10
|
+
const tool = { type: 'web_search', search_context_size: 'high' };
|
|
11
|
+
const filters = {};
|
|
12
|
+
if (params.includeDomains?.length)
|
|
13
|
+
filters.search_domain_filter = params.includeDomains;
|
|
14
|
+
if (params.excludeDomains?.length)
|
|
15
|
+
filters.search_domain_filter = params.excludeDomains.map((d) => `-${d}`);
|
|
16
|
+
if (params.timeRange)
|
|
17
|
+
filters.search_recency_filter = params.timeRange;
|
|
18
|
+
if (Object.keys(filters).length > 0)
|
|
19
|
+
tool.filters = filters;
|
|
20
|
+
const body = { model: provider.model ?? 'openai/gpt-5.5', input: params.query, tools: [tool] };
|
|
21
|
+
const headers = {
|
|
22
|
+
'Content-Type': 'application/json',
|
|
23
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
24
|
+
...provider.headers,
|
|
25
|
+
};
|
|
26
|
+
const response = await fetch(url, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers,
|
|
29
|
+
body: JSON.stringify(body),
|
|
30
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok) {
|
|
33
|
+
const text = await response.text().catch(() => '');
|
|
34
|
+
throw new Error(`Perplexity API error ${response.status}: ${text}`);
|
|
35
|
+
}
|
|
36
|
+
const data = (await response.json());
|
|
37
|
+
let answer;
|
|
38
|
+
const results = [];
|
|
39
|
+
for (const item of data.output) {
|
|
40
|
+
if (item.type === 'search_results' && item.results) {
|
|
41
|
+
for (const r of item.results)
|
|
42
|
+
results.push({ title: r.title, url: r.url, content: r.snippet });
|
|
43
|
+
}
|
|
44
|
+
if (item.type === 'message' && item.content) {
|
|
45
|
+
answer = item.content
|
|
46
|
+
.filter((c) => c.type === 'output_text')
|
|
47
|
+
.map((c) => c.text)
|
|
48
|
+
.join('');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return { provider: provider.id, query: params.query, answer, results };
|
|
52
|
+
}
|
|
53
|
+
async fetch(targetUrl, provider) {
|
|
54
|
+
if (!provider.apiKey) {
|
|
55
|
+
throw new Error('Perplexity API key not configured. Set PERPLEXITY_API_KEY env var or configure in settings.json.');
|
|
56
|
+
}
|
|
57
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/v1/agent`;
|
|
58
|
+
const body = {
|
|
59
|
+
model: provider.model ?? 'openai/gpt-5.5',
|
|
60
|
+
input: `Fetch and summarize the content of this URL: ${targetUrl}`,
|
|
61
|
+
tools: [{ type: 'fetch_url' }],
|
|
62
|
+
instructions: 'Fetch the URL and return its full content.',
|
|
63
|
+
};
|
|
64
|
+
const headers = {
|
|
65
|
+
'Content-Type': 'application/json',
|
|
66
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
67
|
+
...provider.headers,
|
|
68
|
+
};
|
|
69
|
+
const response = await fetch(url, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
headers,
|
|
72
|
+
body: JSON.stringify(body),
|
|
73
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
74
|
+
});
|
|
75
|
+
if (!response.ok) {
|
|
76
|
+
const text = await response.text().catch(() => '');
|
|
77
|
+
throw new Error(`Perplexity API error ${response.status}: ${text}`);
|
|
78
|
+
}
|
|
79
|
+
const data = (await response.json());
|
|
80
|
+
let content = '';
|
|
81
|
+
let title = targetUrl;
|
|
82
|
+
for (const item of data.output) {
|
|
83
|
+
if (item.type === 'fetch_url_results' && item.contents?.length) {
|
|
84
|
+
title = item.contents[0].title || targetUrl;
|
|
85
|
+
content = item.contents[0].snippet;
|
|
86
|
+
}
|
|
87
|
+
if (item.type === 'message' && item.content) {
|
|
88
|
+
const text = item.content
|
|
89
|
+
.filter((c) => c.type === 'output_text')
|
|
90
|
+
.map((c) => c.text)
|
|
91
|
+
.join('');
|
|
92
|
+
if (text)
|
|
93
|
+
content = text;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return { url: targetUrl, title, content };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=perplexity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perplexity.js","sourceRoot":"","sources":["../../src/providers/perplexity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FetchResponse, ResolvedProvider, SearchParams, SearchResponse } from './base.js';
|
|
2
|
+
import { BaseProvider } from './base.js';
|
|
3
|
+
export declare class TavilyProvider extends BaseProvider {
|
|
4
|
+
readonly id: "tavily";
|
|
5
|
+
search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
|
|
6
|
+
fetch(url: string, provider: ResolvedProvider): Promise<FetchResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=tavily.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tavily.d.ts","sourceRoot":"","sources":["../../src/providers/tavily.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EAEf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,qBAAa,cAAe,SAAQ,YAAY;IAC9C,QAAQ,CAAC,EAAE,EAAG,QAAQ,CAAU;IAEjB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAoDjF,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;CA0CtF"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { BaseProvider } from './base.js';
|
|
2
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
3
|
+
export class TavilyProvider extends BaseProvider {
|
|
4
|
+
id = 'tavily';
|
|
5
|
+
async search(params, provider) {
|
|
6
|
+
if (!provider.apiKey) {
|
|
7
|
+
throw new Error('Tavily API key not configured. Set TAVILY_API_KEY env var or configure in settings.json.');
|
|
8
|
+
}
|
|
9
|
+
const body = {
|
|
10
|
+
query: params.query,
|
|
11
|
+
max_results: params.maxResults ?? 5,
|
|
12
|
+
include_answer: true,
|
|
13
|
+
};
|
|
14
|
+
if (params.topic)
|
|
15
|
+
body.topic = params.topic;
|
|
16
|
+
if (params.timeRange)
|
|
17
|
+
body.time_range = params.timeRange;
|
|
18
|
+
if (params.includeDomains?.length)
|
|
19
|
+
body.include_domains = params.includeDomains;
|
|
20
|
+
if (params.excludeDomains?.length)
|
|
21
|
+
body.exclude_domains = params.excludeDomains;
|
|
22
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/search`;
|
|
23
|
+
const headers = {
|
|
24
|
+
'Content-Type': 'application/json',
|
|
25
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
26
|
+
...provider.headers,
|
|
27
|
+
};
|
|
28
|
+
const response = await fetch(url, {
|
|
29
|
+
method: 'POST',
|
|
30
|
+
headers,
|
|
31
|
+
body: JSON.stringify(body),
|
|
32
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
33
|
+
});
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
const text = await response.text().catch(() => '');
|
|
36
|
+
throw new Error(`Tavily API error ${response.status}: ${text}`);
|
|
37
|
+
}
|
|
38
|
+
const data = (await response.json());
|
|
39
|
+
const results = data.results.map((r) => ({
|
|
40
|
+
title: r.title,
|
|
41
|
+
url: r.url,
|
|
42
|
+
content: r.content,
|
|
43
|
+
score: r.score,
|
|
44
|
+
}));
|
|
45
|
+
return { provider: provider.id, query: data.query, answer: data.answer, results };
|
|
46
|
+
}
|
|
47
|
+
async fetch(url, provider) {
|
|
48
|
+
if (!provider.apiKey) {
|
|
49
|
+
throw new Error('Tavily API key not configured. Set TAVILY_API_KEY env var or configure in settings.json.');
|
|
50
|
+
}
|
|
51
|
+
const endpoint = `${provider.baseUrl.replace(/\/$/, '')}/extract`;
|
|
52
|
+
const body = { urls: [url], format: 'markdown' };
|
|
53
|
+
const headers = {
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
56
|
+
...provider.headers,
|
|
57
|
+
};
|
|
58
|
+
const response = await fetch(endpoint, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers,
|
|
61
|
+
body: JSON.stringify(body),
|
|
62
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const text = await response.text().catch(() => '');
|
|
66
|
+
throw new Error(`Tavily Extract API error ${response.status}: ${text}`);
|
|
67
|
+
}
|
|
68
|
+
const data = (await response.json());
|
|
69
|
+
if (data.failed_results.length > 0) {
|
|
70
|
+
const err = data.failed_results[0];
|
|
71
|
+
throw new Error(`Tavily failed to extract ${err.url}: ${err.error}`);
|
|
72
|
+
}
|
|
73
|
+
const result = data.results[0];
|
|
74
|
+
if (!result)
|
|
75
|
+
throw new Error('Tavily Extract returned no results');
|
|
76
|
+
return { url: result.url, title: url, content: result.raw_content };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=tavily.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tavily.js","sourceRoot":"","sources":["../../src/providers/tavily.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ResolvedProvider, SearchParams, SearchResponse } from './base.js';
|
|
2
|
+
import { BaseProvider } from './base.js';
|
|
3
|
+
export interface XSearchParams {
|
|
4
|
+
query: string;
|
|
5
|
+
allowedHandles?: string[];
|
|
6
|
+
excludedHandles?: string[];
|
|
7
|
+
fromDate?: string;
|
|
8
|
+
toDate?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class XaiProvider extends BaseProvider {
|
|
11
|
+
readonly id: "xai";
|
|
12
|
+
search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
|
|
13
|
+
xsearch(params: XSearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
|
|
14
|
+
private parseResponse;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=xai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai.d.ts","sourceRoot":"","sources":["../../src/providers/xai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAgB,MAAM,WAAW,CAAC;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAY,SAAQ,YAAY;IAC3C,QAAQ,CAAC,EAAE,EAAG,KAAK,CAAU;IAEd,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAsC1F,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;YAuC3E,aAAa;CA2B5B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { BaseProvider } from './base.js';
|
|
2
|
+
const REQUEST_TIMEOUT_MS = 60_000;
|
|
3
|
+
export class XaiProvider extends BaseProvider {
|
|
4
|
+
id = 'xai';
|
|
5
|
+
async search(params, provider) {
|
|
6
|
+
if (!provider.apiKey) {
|
|
7
|
+
throw new Error('xAI API key not configured. Set XAI_API_KEY env var or configure in settings.json.');
|
|
8
|
+
}
|
|
9
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/responses`;
|
|
10
|
+
const tool = { type: 'web_search' };
|
|
11
|
+
if (params.includeDomains?.length)
|
|
12
|
+
tool.filters = { allowed_domains: params.includeDomains };
|
|
13
|
+
else if (params.excludeDomains?.length)
|
|
14
|
+
tool.filters = { excluded_domains: params.excludeDomains };
|
|
15
|
+
const body = {
|
|
16
|
+
model: provider.model ?? 'grok-4.3',
|
|
17
|
+
input: [{ role: 'user', content: params.query }],
|
|
18
|
+
tools: [tool],
|
|
19
|
+
};
|
|
20
|
+
const headers = {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
23
|
+
...provider.headers,
|
|
24
|
+
};
|
|
25
|
+
const response = await fetch(url, {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
headers,
|
|
28
|
+
body: JSON.stringify(body),
|
|
29
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
const text = await response.text().catch(() => '');
|
|
33
|
+
throw new Error(`xAI API error ${response.status}: ${text}`);
|
|
34
|
+
}
|
|
35
|
+
return this.parseResponse(params.query, provider, response);
|
|
36
|
+
}
|
|
37
|
+
async xsearch(params, provider) {
|
|
38
|
+
if (!provider.apiKey) {
|
|
39
|
+
throw new Error('xAI API key not configured. Set XAI_API_KEY env var or configure in settings.json.');
|
|
40
|
+
}
|
|
41
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/responses`;
|
|
42
|
+
const tool = { type: 'x_search' };
|
|
43
|
+
if (params.allowedHandles?.length)
|
|
44
|
+
tool.allowed_x_handles = params.allowedHandles;
|
|
45
|
+
else if (params.excludedHandles?.length)
|
|
46
|
+
tool.excluded_x_handles = params.excludedHandles;
|
|
47
|
+
if (params.fromDate)
|
|
48
|
+
tool.from_date = params.fromDate;
|
|
49
|
+
if (params.toDate)
|
|
50
|
+
tool.to_date = params.toDate;
|
|
51
|
+
const body = {
|
|
52
|
+
model: provider.model ?? 'grok-4.3',
|
|
53
|
+
input: [{ role: 'user', content: params.query }],
|
|
54
|
+
tools: [tool],
|
|
55
|
+
};
|
|
56
|
+
const headers = {
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
59
|
+
...provider.headers,
|
|
60
|
+
};
|
|
61
|
+
const response = await fetch(url, {
|
|
62
|
+
method: 'POST',
|
|
63
|
+
headers,
|
|
64
|
+
body: JSON.stringify(body),
|
|
65
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
66
|
+
});
|
|
67
|
+
if (!response.ok) {
|
|
68
|
+
const text = await response.text().catch(() => '');
|
|
69
|
+
throw new Error(`xAI API error ${response.status}: ${text}`);
|
|
70
|
+
}
|
|
71
|
+
return this.parseResponse(params.query, provider, response);
|
|
72
|
+
}
|
|
73
|
+
async parseResponse(query, provider, response) {
|
|
74
|
+
const data = (await response.json());
|
|
75
|
+
let answer = '';
|
|
76
|
+
for (const item of data.output) {
|
|
77
|
+
if (item.type === 'message' && item.content) {
|
|
78
|
+
answer = item.content
|
|
79
|
+
.filter((c) => c.type === 'output_text')
|
|
80
|
+
.map((c) => c.text)
|
|
81
|
+
.join('');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const results = (data.citations ?? []).map((c) => ({
|
|
85
|
+
title: c.title ?? c.url,
|
|
86
|
+
url: c.url,
|
|
87
|
+
content: '',
|
|
88
|
+
}));
|
|
89
|
+
return { provider: provider.id, query, answer: answer || undefined, results };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=xai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../src/providers/xai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { FetchResponse, ResolvedProvider, SearchParams, SearchResponse } from './base.js';
|
|
2
|
+
import { BaseProvider } from './base.js';
|
|
3
|
+
export declare class ZaiProvider extends BaseProvider {
|
|
4
|
+
readonly id: "zai";
|
|
5
|
+
search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
|
|
6
|
+
fetch(targetUrl: string, provider: ResolvedProvider): Promise<FetchResponse>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=zai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zai.d.ts","sourceRoot":"","sources":["../../src/providers/zai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EAEf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAWzC,qBAAa,WAAY,SAAQ,YAAY;IAC3C,QAAQ,CAAC,EAAE,EAAG,KAAK,CAAU;IAEd,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IA+CjF,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;CAoC5F"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { BaseProvider } from './base.js';
|
|
2
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
3
|
+
const TIME_RANGE_MAP = {
|
|
4
|
+
day: 'oneDay',
|
|
5
|
+
week: 'oneWeek',
|
|
6
|
+
month: 'oneMonth',
|
|
7
|
+
year: 'oneYear',
|
|
8
|
+
};
|
|
9
|
+
export class ZaiProvider extends BaseProvider {
|
|
10
|
+
id = 'zai';
|
|
11
|
+
async search(params, provider) {
|
|
12
|
+
if (!provider.apiKey) {
|
|
13
|
+
throw new Error('Z.AI API key not configured. Set ZAI_API_KEY env var or configure in settings.json.');
|
|
14
|
+
}
|
|
15
|
+
const url = `${provider.baseUrl.replace(/\/$/, '')}/api/paas/v4/web_search`;
|
|
16
|
+
const body = {
|
|
17
|
+
search_engine: 'search-prime',
|
|
18
|
+
search_query: params.query,
|
|
19
|
+
};
|
|
20
|
+
if (params.maxResults)
|
|
21
|
+
body.count = params.maxResults;
|
|
22
|
+
if (params.timeRange)
|
|
23
|
+
body.search_recency_filter = TIME_RANGE_MAP[params.timeRange] ?? 'noLimit';
|
|
24
|
+
if (params.includeDomains?.length)
|
|
25
|
+
body.search_domain_filter = params.includeDomains[0];
|
|
26
|
+
const headers = {
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
29
|
+
...provider.headers,
|
|
30
|
+
};
|
|
31
|
+
const response = await fetch(url, {
|
|
32
|
+
method: 'POST',
|
|
33
|
+
headers,
|
|
34
|
+
body: JSON.stringify(body),
|
|
35
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const text = await response.text().catch(() => '');
|
|
39
|
+
throw new Error(`Z.AI API error ${response.status}: ${text}`);
|
|
40
|
+
}
|
|
41
|
+
const data = (await response.json());
|
|
42
|
+
const results = (data.search_result ?? []).map((r) => ({
|
|
43
|
+
title: r.title,
|
|
44
|
+
url: r.link,
|
|
45
|
+
content: r.content,
|
|
46
|
+
}));
|
|
47
|
+
return { provider: provider.id, query: params.query, results };
|
|
48
|
+
}
|
|
49
|
+
async fetch(targetUrl, provider) {
|
|
50
|
+
if (!provider.apiKey) {
|
|
51
|
+
throw new Error('Z.AI API key not configured. Set ZAI_API_KEY env var or configure in settings.json.');
|
|
52
|
+
}
|
|
53
|
+
const endpoint = `${provider.baseUrl.replace(/\/$/, '')}/api/paas/v4/reader`;
|
|
54
|
+
const body = { url: targetUrl, return_format: 'markdown', retain_images: false };
|
|
55
|
+
const headers = {
|
|
56
|
+
'Content-Type': 'application/json',
|
|
57
|
+
Authorization: `Bearer ${provider.apiKey}`,
|
|
58
|
+
...provider.headers,
|
|
59
|
+
};
|
|
60
|
+
const response = await fetch(endpoint, {
|
|
61
|
+
method: 'POST',
|
|
62
|
+
headers,
|
|
63
|
+
body: JSON.stringify(body),
|
|
64
|
+
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
|
|
65
|
+
});
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const text = await response.text().catch(() => '');
|
|
68
|
+
throw new Error(`Z.AI Reader API error ${response.status}: ${text}`);
|
|
69
|
+
}
|
|
70
|
+
const data = (await response.json());
|
|
71
|
+
return {
|
|
72
|
+
url: data.reader_result.url,
|
|
73
|
+
title: data.reader_result.title,
|
|
74
|
+
content: data.reader_result.content,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=zai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zai.js","sourceRoot":"","sources":["../../src/providers/zai.ts"],"names":[],"mappings":"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"}
|