@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.
Files changed (76) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +164 -0
  3. package/dist/config.d.ts +19 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +129 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/fetch.d.ts +8 -0
  8. package/dist/fetch.d.ts.map +1 -0
  9. package/dist/fetch.js +67 -0
  10. package/dist/fetch.js.map +1 -0
  11. package/dist/index.d.ts +8 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +179 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/providers/anthropic.d.ts +8 -0
  16. package/dist/providers/anthropic.d.ts.map +1 -0
  17. package/dist/providers/anthropic.js +100 -0
  18. package/dist/providers/anthropic.js.map +1 -0
  19. package/dist/providers/base.d.ts +44 -0
  20. package/dist/providers/base.d.ts.map +1 -0
  21. package/dist/providers/base.js +9 -0
  22. package/dist/providers/base.js.map +1 -0
  23. package/dist/providers/gemini.d.ts +7 -0
  24. package/dist/providers/gemini.d.ts.map +1 -0
  25. package/dist/providers/gemini.js +41 -0
  26. package/dist/providers/gemini.js.map +1 -0
  27. package/dist/providers/index.d.ts +6 -0
  28. package/dist/providers/index.d.ts.map +1 -0
  29. package/dist/providers/index.js +29 -0
  30. package/dist/providers/index.js.map +1 -0
  31. package/dist/providers/kimi.d.ts +8 -0
  32. package/dist/providers/kimi.d.ts.map +1 -0
  33. package/dist/providers/kimi.js +66 -0
  34. package/dist/providers/kimi.js.map +1 -0
  35. package/dist/providers/mimo.d.ts +7 -0
  36. package/dist/providers/mimo.d.ts.map +1 -0
  37. package/dist/providers/mimo.js +45 -0
  38. package/dist/providers/mimo.js.map +1 -0
  39. package/dist/providers/openai.d.ts +7 -0
  40. package/dist/providers/openai.d.ts.map +1 -0
  41. package/dist/providers/openai.js +56 -0
  42. package/dist/providers/openai.js.map +1 -0
  43. package/dist/providers/openrouter.d.ts +8 -0
  44. package/dist/providers/openrouter.d.ts.map +1 -0
  45. package/dist/providers/openrouter.js +83 -0
  46. package/dist/providers/openrouter.js.map +1 -0
  47. package/dist/providers/perplexity.d.ts +8 -0
  48. package/dist/providers/perplexity.d.ts.map +1 -0
  49. package/dist/providers/perplexity.js +99 -0
  50. package/dist/providers/perplexity.js.map +1 -0
  51. package/dist/providers/tavily.d.ts +8 -0
  52. package/dist/providers/tavily.d.ts.map +1 -0
  53. package/dist/providers/tavily.js +79 -0
  54. package/dist/providers/tavily.js.map +1 -0
  55. package/dist/providers/xai.d.ts +16 -0
  56. package/dist/providers/xai.d.ts.map +1 -0
  57. package/dist/providers/xai.js +92 -0
  58. package/dist/providers/xai.js.map +1 -0
  59. package/dist/providers/zai.d.ts +8 -0
  60. package/dist/providers/zai.d.ts.map +1 -0
  61. package/dist/providers/zai.js +78 -0
  62. package/dist/providers/zai.js.map +1 -0
  63. package/dist/search.d.ts +4 -0
  64. package/dist/search.d.ts.map +1 -0
  65. package/dist/search.js +14 -0
  66. package/dist/search.js.map +1 -0
  67. package/dist/summary.d.ts +4 -0
  68. package/dist/summary.d.ts.map +1 -0
  69. package/dist/summary.js +44 -0
  70. package/dist/summary.js.map +1 -0
  71. package/dist/types.d.ts +28 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +2 -0
  74. package/dist/types.js.map +1 -0
  75. package/package.json +81 -0
  76. 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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"}