@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
package/dist/index.js ADDED
@@ -0,0 +1,179 @@
1
+ import { Type } from 'typebox';
2
+ import { loadWebToolSettings, resolveProvider, resolveSearchProvider } from './config.js';
3
+ import { webFetch } from './fetch.js';
4
+ import { getProvider } from './providers/index.js';
5
+ import { search } from './search.js';
6
+ import { summarizeContent } from './summary.js';
7
+ export { loadWebToolSettings, resolveFetchProvider, resolveProvider, resolveSearchProvider, } from './config.js';
8
+ export { webFetch } from './fetch.js';
9
+ export { getProvider, } from './providers/index.js';
10
+ export { search } from './search.js';
11
+ export default function piWebToolExtension(pi) {
12
+ let settings = {};
13
+ pi.on('session_start', async (_event, ctx) => {
14
+ settings = loadWebToolSettings(ctx.cwd);
15
+ const searchResolved = resolveSearchProvider(settings);
16
+ const hasSearch = !('error' in searchResolved) && Boolean(searchResolved.apiKey);
17
+ const hasFetch = Boolean(settings.fetch?.provider) || Boolean(settings.fetch?.summary);
18
+ console.debug('[pi-web-access] session_start', {
19
+ cwd: ctx.cwd,
20
+ searchProvider: hasSearch ? searchResolved.id : null,
21
+ fetchProvider: settings.fetch?.provider ?? 'local',
22
+ hasSummary: Boolean(settings.fetch?.summary),
23
+ });
24
+ if (hasSearch) {
25
+ pi.registerTool({
26
+ name: 'web_search',
27
+ label: 'WebSearch',
28
+ description: [
29
+ '- Searches the web and returns results to inform responses',
30
+ '- Provides up-to-date information for current events and recent data',
31
+ '- Returns search results with titles, URLs, and content snippets, or a synthesized answer',
32
+ '- Use this tool for accessing information beyond your knowledge cutoff',
33
+ '',
34
+ 'After answering, include a "Sources:" section listing relevant URLs as markdown hyperlinks.',
35
+ ].join('\n'),
36
+ parameters: Type.Object({
37
+ query: Type.String({ description: 'The search query to execute.' }),
38
+ maxResults: Type.Optional(Type.Number({
39
+ minimum: 1,
40
+ maximum: 20,
41
+ description: 'Max results to return (default 5).',
42
+ })),
43
+ topic: Type.Optional(Type.Union([Type.Literal('general'), Type.Literal('news')], {
44
+ description: 'Topic category.',
45
+ })),
46
+ timeRange: Type.Optional(Type.Unsafe({
47
+ type: 'string',
48
+ enum: ['day', 'week', 'month', 'year'],
49
+ description: 'Filter results by recency. Must be one of: "day", "week", "month", "year".',
50
+ })),
51
+ includeDomains: Type.Optional(Type.Array(Type.String(), {
52
+ description: 'Only include results from these domains.',
53
+ })),
54
+ excludeDomains: Type.Optional(Type.Array(Type.String(), {
55
+ description: 'Exclude results from these domains.',
56
+ })),
57
+ }),
58
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
59
+ const searchParams = params;
60
+ const response = await search(searchParams, settings);
61
+ const lines = [];
62
+ lines.push(`## Web Search Results (${response.provider})`);
63
+ lines.push(`**Query:** ${response.query}`);
64
+ lines.push('');
65
+ if (response.answer) {
66
+ lines.push('### Answer');
67
+ lines.push(response.answer);
68
+ lines.push('');
69
+ }
70
+ if (response.results.length > 0) {
71
+ lines.push('### Sources');
72
+ for (const r of response.results) {
73
+ lines.push(`- [${r.title}](${r.url})`);
74
+ if (r.score !== undefined)
75
+ lines.push(` *Relevance: ${r.score.toFixed(2)}*`);
76
+ if (r.content)
77
+ lines.push(` ${r.content}`);
78
+ }
79
+ lines.push('');
80
+ }
81
+ const text = lines.join('\n');
82
+ return { content: [{ type: 'text', text }], details: undefined };
83
+ },
84
+ });
85
+ }
86
+ if (hasFetch) {
87
+ pi.registerTool({
88
+ name: 'web_fetch',
89
+ label: 'WebFetch',
90
+ description: [
91
+ '- Fetches content from a specified URL and processes it using a prompt',
92
+ '- Takes a URL and a prompt as input',
93
+ '- Fetches the URL content, converts HTML to markdown',
94
+ '- Processes the content with the prompt using a small, fast model',
95
+ "- Returns the model's response about the content",
96
+ '- Use this tool when you need to retrieve and analyze web content',
97
+ '',
98
+ 'Usage notes:',
99
+ ' - The URL must be a fully-formed valid URL',
100
+ ' - The prompt should describe what information you want to extract from the page',
101
+ ' - Results may be summarized if the content is very large',
102
+ ].join('\n'),
103
+ parameters: Type.Object({
104
+ url: Type.String({ description: 'The URL to fetch content from.' }),
105
+ prompt: Type.String({
106
+ description: 'The prompt describing what information to extract or summarize from the page.',
107
+ }),
108
+ }),
109
+ async execute(_toolCallId, params, _signal, _onUpdate, fetchCtx) {
110
+ const fetchParams = params;
111
+ const result = await webFetch({ url: fetchParams.url }, settings);
112
+ let content = result.content;
113
+ if (settings.fetch?.summary) {
114
+ content = await summarizeContent(content, fetchParams.prompt, settings.fetch.summary, fetchCtx);
115
+ }
116
+ const lines = [];
117
+ lines.push(`## ${result.title}`);
118
+ lines.push(`**Source:** ${result.url}`);
119
+ lines.push('');
120
+ lines.push(content);
121
+ const text = lines.join('\n');
122
+ return { content: [{ type: 'text', text }], details: undefined };
123
+ },
124
+ });
125
+ }
126
+ // x_search: only register when xai provider has an API key
127
+ const xaiResolved = resolveProvider('xai', settings);
128
+ const hasXai = !('error' in xaiResolved) && Boolean(xaiResolved.apiKey);
129
+ if (hasXai) {
130
+ pi.registerTool({
131
+ name: 'x_search',
132
+ label: 'XSearch',
133
+ description: [
134
+ '- Searches X (Twitter) for posts, threads, and social media content',
135
+ '- Returns real-time social media insights with citations',
136
+ '- Supports filtering by X handles and date ranges',
137
+ '- Use this tool when you need information from X/Twitter specifically',
138
+ ].join('\n'),
139
+ parameters: Type.Object({
140
+ query: Type.String({ description: 'The search query to execute on X.' }),
141
+ allowedHandles: Type.Optional(Type.Array(Type.String(), {
142
+ description: 'Only include posts from these X handles (max 20).',
143
+ })),
144
+ excludedHandles: Type.Optional(Type.Array(Type.String(), {
145
+ description: 'Exclude posts from these X handles (max 20).',
146
+ })),
147
+ fromDate: Type.Optional(Type.String({ description: 'Start date in YYYY-MM-DD format.' })),
148
+ toDate: Type.Optional(Type.String({ description: 'End date in YYYY-MM-DD format.' })),
149
+ }),
150
+ async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
151
+ const xaiProvider = getProvider('xai');
152
+ const xParams = params;
153
+ const response = await xaiProvider.xsearch(xParams, xaiResolved);
154
+ const lines = [];
155
+ lines.push(`## X Search Results`);
156
+ lines.push(`**Query:** ${response.query}`);
157
+ lines.push('');
158
+ if (response.answer) {
159
+ lines.push('### Answer');
160
+ lines.push(response.answer);
161
+ lines.push('');
162
+ }
163
+ if (response.results.length > 0) {
164
+ lines.push('### Sources');
165
+ for (const r of response.results) {
166
+ lines.push(`- [${r.title}](${r.url})`);
167
+ if (r.content)
168
+ lines.push(` ${r.content}`);
169
+ }
170
+ lines.push('');
171
+ }
172
+ const text = lines.join('\n');
173
+ return { content: [{ type: 'text', text }], details: undefined };
174
+ },
175
+ });
176
+ }
177
+ });
178
+ }
179
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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 AnthropicProvider extends BaseProvider {
4
+ readonly id: "anthropic";
5
+ search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
6
+ fetch(targetUrl: string, provider: ResolvedProvider): Promise<FetchResponse>;
7
+ }
8
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../src/providers/anthropic.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,iBAAkB,SAAQ,YAAY;IACjD,QAAQ,CAAC,EAAE,EAAG,WAAW,CAAU;IAEpB,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAqEjF,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;CA0C5F"}
@@ -0,0 +1,100 @@
1
+ import { BaseProvider } from './base.js';
2
+ const REQUEST_TIMEOUT_MS = 60_000;
3
+ export class AnthropicProvider extends BaseProvider {
4
+ id = 'anthropic';
5
+ async search(params, provider) {
6
+ if (!provider.apiKey) {
7
+ throw new Error('Anthropic API key not configured. Set ANTHROPIC_API_KEY env var or configure in settings.json.');
8
+ }
9
+ const url = `${provider.baseUrl.replace(/\/$/, '')}/messages`;
10
+ const tool = { type: 'web_search_20250305', name: 'web_search' };
11
+ if (params.includeDomains?.length)
12
+ tool.allowed_domains = params.includeDomains;
13
+ if (params.excludeDomains?.length)
14
+ tool.blocked_domains = params.excludeDomains;
15
+ if (params.maxResults)
16
+ tool.max_uses = params.maxResults;
17
+ const body = {
18
+ model: provider.model ?? 'claude-sonnet-4-6',
19
+ max_tokens: 4096,
20
+ messages: [{ role: 'user', content: params.query }],
21
+ tools: [tool],
22
+ };
23
+ const headers = {
24
+ 'Content-Type': 'application/json',
25
+ 'x-api-key': provider.apiKey,
26
+ 'anthropic-version': '2023-06-01',
27
+ ...provider.headers,
28
+ };
29
+ const response = await fetch(url, {
30
+ method: 'POST',
31
+ headers,
32
+ body: JSON.stringify(body),
33
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
34
+ });
35
+ if (!response.ok) {
36
+ const text = await response.text().catch(() => '');
37
+ throw new Error(`Anthropic API error ${response.status}: ${text}`);
38
+ }
39
+ const data = (await response.json());
40
+ let answer = '';
41
+ const results = [];
42
+ const seenUrls = new Set();
43
+ for (const block of data.content) {
44
+ if (block.type === 'text' && block.text) {
45
+ answer += block.text;
46
+ if (block.citations) {
47
+ for (const cite of block.citations) {
48
+ if (cite.url && !seenUrls.has(cite.url)) {
49
+ seenUrls.add(cite.url);
50
+ results.push({
51
+ title: cite.title ?? cite.url,
52
+ url: cite.url,
53
+ content: cite.cited_text ?? '',
54
+ });
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ return { provider: provider.id, query: params.query, answer: answer || undefined, results };
61
+ }
62
+ async fetch(targetUrl, provider) {
63
+ if (!provider.apiKey) {
64
+ throw new Error('Anthropic API key not configured. Set ANTHROPIC_API_KEY env var or configure in settings.json.');
65
+ }
66
+ const url = `${provider.baseUrl.replace(/\/$/, '')}/messages`;
67
+ const body = {
68
+ model: provider.model ?? 'claude-sonnet-4-6',
69
+ max_tokens: 4096,
70
+ messages: [
71
+ { role: 'user', content: `Please fetch and return the full content at: ${targetUrl}` },
72
+ ],
73
+ tools: [{ type: 'web_fetch_20250910', name: 'web_fetch' }],
74
+ };
75
+ const headers = {
76
+ 'Content-Type': 'application/json',
77
+ 'x-api-key': provider.apiKey,
78
+ 'anthropic-version': '2023-06-01',
79
+ ...provider.headers,
80
+ };
81
+ const response = await fetch(url, {
82
+ method: 'POST',
83
+ headers,
84
+ body: JSON.stringify(body),
85
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
86
+ });
87
+ if (!response.ok) {
88
+ const text = await response.text().catch(() => '');
89
+ throw new Error(`Anthropic API error ${response.status}: ${text}`);
90
+ }
91
+ const data = (await response.json());
92
+ let content = '';
93
+ for (const block of data.content) {
94
+ if (block.type === 'text' && block.text)
95
+ content += block.text;
96
+ }
97
+ return { url: targetUrl, title: targetUrl, content };
98
+ }
99
+ }
100
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../src/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import type { BuiltInProviderId } from '../types.js';
2
+ export interface ResolvedProvider {
3
+ id: BuiltInProviderId;
4
+ baseUrl: string;
5
+ apiKey?: string;
6
+ model?: string;
7
+ headers?: Record<string, string>;
8
+ }
9
+ export interface SearchParams {
10
+ query: string;
11
+ maxResults?: number;
12
+ topic?: 'general' | 'news';
13
+ timeRange?: 'day' | 'week' | 'month' | 'year';
14
+ includeDomains?: string[];
15
+ excludeDomains?: string[];
16
+ }
17
+ export interface SearchResult {
18
+ title: string;
19
+ url: string;
20
+ content: string;
21
+ score?: number;
22
+ }
23
+ export interface SearchResponse {
24
+ provider: string;
25
+ query: string;
26
+ answer?: string | undefined;
27
+ results: SearchResult[];
28
+ }
29
+ export interface FetchResponse {
30
+ url: string;
31
+ title: string;
32
+ content: string;
33
+ }
34
+ export interface WebProvider {
35
+ readonly id: BuiltInProviderId;
36
+ search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
37
+ fetch(url: string, provider: ResolvedProvider): Promise<FetchResponse>;
38
+ }
39
+ export declare abstract class BaseProvider implements WebProvider {
40
+ abstract readonly id: BuiltInProviderId;
41
+ search(_params: SearchParams, _provider: ResolvedProvider): Promise<SearchResponse>;
42
+ fetch(_url: string, _provider: ResolvedProvider): Promise<FetchResponse>;
43
+ }
44
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIrD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,iBAAiB,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAID,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAC/B,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAClF,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACxE;AAED,8BAAsB,YAAa,YAAW,WAAW;IACvD,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,iBAAiB,CAAC;IAElC,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;IAInF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;CAG/E"}
@@ -0,0 +1,9 @@
1
+ export class BaseProvider {
2
+ async search(_params, _provider) {
3
+ throw new Error(`${this.id} does not support web_search.`);
4
+ }
5
+ async fetch(_url, _provider) {
6
+ throw new Error(`${this.id} does not support web_fetch.`);
7
+ }
8
+ }
9
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/providers/base.ts"],"names":[],"mappings":"AAiDA,MAAM,OAAgB,YAAY;IAGhC,KAAK,CAAC,MAAM,CAAC,OAAqB,EAAE,SAA2B;QAC7D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,+BAA+B,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,SAA2B;QACnD,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC5D,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 GeminiProvider extends BaseProvider {
4
+ readonly id: "gemini";
5
+ search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
6
+ }
7
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/providers/gemini.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;CA8CjG"}
@@ -0,0 +1,41 @@
1
+ import { BaseProvider } from './base.js';
2
+ const REQUEST_TIMEOUT_MS = 60_000;
3
+ export class GeminiProvider extends BaseProvider {
4
+ id = 'gemini';
5
+ async search(params, provider) {
6
+ if (!provider.apiKey) {
7
+ throw new Error('Gemini API key not configured. Set GEMINI_API_KEY env var or configure in settings.json.');
8
+ }
9
+ const model = provider.model ?? 'gemini-2.5-flash';
10
+ const url = `${provider.baseUrl.replace(/\/$/, '')}/models/${model}:generateContent`;
11
+ const body = {
12
+ contents: [{ parts: [{ text: params.query }] }],
13
+ tools: [{ google_search: {} }],
14
+ };
15
+ const headers = {
16
+ 'Content-Type': 'application/json',
17
+ 'x-goog-api-key': provider.apiKey,
18
+ ...provider.headers,
19
+ };
20
+ const response = await fetch(url, {
21
+ method: 'POST',
22
+ headers,
23
+ body: JSON.stringify(body),
24
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
25
+ });
26
+ if (!response.ok) {
27
+ const text = await response.text().catch(() => '');
28
+ throw new Error(`Gemini API error ${response.status}: ${text}`);
29
+ }
30
+ const data = (await response.json());
31
+ const candidate = data.candidates[0];
32
+ if (!candidate)
33
+ throw new Error('Gemini API returned empty response');
34
+ const answer = candidate.content.parts.map((p) => p.text).join('');
35
+ const results = (candidate.groundingMetadata?.groundingChunks ?? [])
36
+ .filter((c) => c.web)
37
+ .map((c) => ({ title: c.web.title, url: c.web.uri, content: '' }));
38
+ return { provider: provider.id, query: params.query, answer, results };
39
+ }
40
+ }
41
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAElC,MAAM,OAAO,cAAe,SAAQ,YAAY;IACrC,EAAE,GAAG,QAAiB,CAAC;IAEvB,KAAK,CAAC,MAAM,CAAC,MAAoB,EAAE,QAA0B;QACpE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,kBAAkB,CAAC;QACnD,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,KAAK,kBAAkB,CAAC;QACrF,MAAM,IAAI,GAAG;YACX,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;YAC/C,KAAK,EAAE,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;SAC/B,CAAC;QACF,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,QAAQ,CAAC,MAAM;YACjC,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,oBAAoB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAKlC,CAAC;QACF,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,MAAM,OAAO,GAAmB,CAAC,SAAS,CAAC,iBAAiB,EAAE,eAAe,IAAI,EAAE,CAAC;aACjF,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;aACpB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,GAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QAEvE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACzE,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { BuiltInProviderId } from '../types.js';
2
+ import type { WebProvider } from './base.js';
3
+ export type { FetchResponse, ResolvedProvider, SearchParams, SearchResponse, SearchResult, WebProvider, } from './base.js';
4
+ export { BaseProvider } from './base.js';
5
+ export declare function getProvider(id: BuiltInProviderId): WebProvider | undefined;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAW7C,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,WAAW,GAAG,SAAS,CAE1E"}
@@ -0,0 +1,29 @@
1
+ import { AnthropicProvider } from './anthropic.js';
2
+ import { GeminiProvider } from './gemini.js';
3
+ import { KimiProvider } from './kimi.js';
4
+ import { MimoProvider } from './mimo.js';
5
+ import { OpenAIProvider } from './openai.js';
6
+ import { OpenRouterProvider } from './openrouter.js';
7
+ import { PerplexityProvider } from './perplexity.js';
8
+ import { TavilyProvider } from './tavily.js';
9
+ import { XaiProvider } from './xai.js';
10
+ import { ZaiProvider } from './zai.js';
11
+ export { BaseProvider } from './base.js';
12
+ // ─── Registry ────────────────────────────────────────────────────────────────
13
+ const providers = [
14
+ new TavilyProvider(),
15
+ new KimiProvider(),
16
+ new MimoProvider(),
17
+ new ZaiProvider(),
18
+ new GeminiProvider(),
19
+ new PerplexityProvider(),
20
+ new OpenRouterProvider(),
21
+ new XaiProvider(),
22
+ new OpenAIProvider(),
23
+ new AnthropicProvider(),
24
+ ];
25
+ const registry = new Map(providers.map((p) => [p.id, p]));
26
+ export function getProvider(id) {
27
+ return registry.get(id);
28
+ }
29
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAUvC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,gFAAgF;AAEhF,MAAM,SAAS,GAAkB;IAC/B,IAAI,cAAc,EAAE;IACpB,IAAI,YAAY,EAAE;IAClB,IAAI,YAAY,EAAE;IAClB,IAAI,WAAW,EAAE;IACjB,IAAI,cAAc,EAAE;IACpB,IAAI,kBAAkB,EAAE;IACxB,IAAI,kBAAkB,EAAE;IACxB,IAAI,WAAW,EAAE;IACjB,IAAI,cAAc,EAAE;IACpB,IAAI,iBAAiB,EAAE;CACxB,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAsB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/E,MAAM,UAAU,WAAW,CAAC,EAAqB;IAC/C,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { BaseProvider } from './base.js';
2
+ import type { ResolvedProvider, SearchParams, SearchResponse } from './index.js';
3
+ export declare class KimiProvider extends BaseProvider {
4
+ readonly id: "kimi";
5
+ search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
6
+ private callApi;
7
+ }
8
+ //# sourceMappingURL=kimi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi.d.ts","sourceRoot":"","sources":["../../src/providers/kimi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAoBjF,qBAAa,YAAa,SAAQ,YAAY;IAC5C,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAEf,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;YA2ClF,OAAO;CA6BtB"}
@@ -0,0 +1,66 @@
1
+ import { BaseProvider } from './base.js';
2
+ const REQUEST_TIMEOUT_MS = 60_000;
3
+ export class KimiProvider extends BaseProvider {
4
+ id = 'kimi';
5
+ async search(params, provider) {
6
+ if (!provider.apiKey) {
7
+ throw new Error('Kimi API key not configured. Set MOONSHOT_API_KEY env var or configure in settings.json.');
8
+ }
9
+ const messages = [
10
+ {
11
+ role: 'system',
12
+ content: 'You are a helpful assistant that searches the web to answer questions. Provide concise, factual answers based on web search results.',
13
+ },
14
+ { role: 'user', content: params.query },
15
+ ];
16
+ const firstResponse = await this.callApi(messages, provider);
17
+ const firstChoice = firstResponse.choices[0];
18
+ if (!firstChoice)
19
+ throw new Error('Kimi API returned empty response');
20
+ if (firstChoice.finish_reason === 'tool_calls' && firstChoice.message.tool_calls?.length) {
21
+ const toolCall = firstChoice.message.tool_calls[0];
22
+ messages.push(firstChoice.message);
23
+ messages.push({
24
+ role: 'tool',
25
+ tool_call_id: toolCall.id,
26
+ name: toolCall.function.name,
27
+ content: toolCall.function.arguments,
28
+ });
29
+ const secondResponse = await this.callApi(messages, provider);
30
+ const answer = secondResponse.choices[0]?.message.content ?? '';
31
+ return { provider: provider.id, query: params.query, answer, results: [] };
32
+ }
33
+ return {
34
+ provider: provider.id,
35
+ query: params.query,
36
+ answer: firstChoice.message.content ?? '',
37
+ results: [],
38
+ };
39
+ }
40
+ async callApi(messages, provider) {
41
+ const url = `${provider.baseUrl.replace(/\/$/, '')}/chat/completions`;
42
+ const body = {
43
+ model: provider.model ?? 'kimi-k2.6',
44
+ messages,
45
+ tools: [{ type: 'builtin_function', function: { name: '$web_search' } }],
46
+ thinking: { type: 'disabled' },
47
+ };
48
+ const headers = {
49
+ 'Content-Type': 'application/json',
50
+ Authorization: `Bearer ${provider.apiKey}`,
51
+ ...provider.headers,
52
+ };
53
+ const response = await fetch(url, {
54
+ method: 'POST',
55
+ headers,
56
+ body: JSON.stringify(body),
57
+ signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS),
58
+ });
59
+ if (!response.ok) {
60
+ const text = await response.text().catch(() => '');
61
+ throw new Error(`Kimi API error ${response.status}: ${text}`);
62
+ }
63
+ return (await response.json());
64
+ }
65
+ }
66
+ //# sourceMappingURL=kimi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kimi.js","sourceRoot":"","sources":["../../src/providers/kimi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { BaseProvider } from './base.js';
2
+ import type { ResolvedProvider, SearchParams, SearchResponse } from './index.js';
3
+ export declare class MimoProvider extends BaseProvider {
4
+ readonly id: "mimo";
5
+ search(params: SearchParams, provider: ResolvedProvider): Promise<SearchResponse>;
6
+ }
7
+ //# sourceMappingURL=mimo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mimo.d.ts","sourceRoot":"","sources":["../../src/providers/mimo.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,YAAa,SAAQ,YAAY;IAC5C,QAAQ,CAAC,EAAE,EAAG,MAAM,CAAU;IAEf,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC;CAoDjG"}
@@ -0,0 +1,45 @@
1
+ import { BaseProvider } from './base.js';
2
+ const REQUEST_TIMEOUT_MS = 60_000;
3
+ export class MimoProvider extends BaseProvider {
4
+ id = 'mimo';
5
+ async search(params, provider) {
6
+ if (!provider.apiKey) {
7
+ throw new Error('Mimo API key not configured. Set MIMO_API_KEY env var or configure in settings.json.');
8
+ }
9
+ const url = `${provider.baseUrl.replace(/\/$/, '')}/chat/completions`;
10
+ const body = {
11
+ model: provider.model ?? 'mimo-v2.5-pro',
12
+ messages: [{ role: 'user', content: params.query }],
13
+ tools: [{ type: 'web_search', max_keyword: 3, force_search: true }],
14
+ max_completion_tokens: 2048,
15
+ temperature: 1.0,
16
+ top_p: 0.95,
17
+ stream: false,
18
+ thinking: { type: 'disabled' },
19
+ };
20
+ const headers = {
21
+ 'Content-Type': 'application/json',
22
+ 'api-key': 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(`Mimo API error ${response.status}: ${text}`);
34
+ }
35
+ const data = (await response.json());
36
+ const choice = data.choices[0];
37
+ if (!choice)
38
+ throw new Error('Mimo API returned empty response');
39
+ const results = (choice.message.annotations ?? [])
40
+ .filter((a) => a.type === 'url_citation')
41
+ .map((a) => ({ title: a.title, url: a.url, content: a.summary }));
42
+ return { provider: provider.id, query: params.query, answer: choice.message.content, results };
43
+ }
44
+ }
45
+ //# sourceMappingURL=mimo.js.map