xx-ai-cli 0.1.4 → 0.1.6
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/dist/core/config.d.ts +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/search.d.ts.map +1 -1
- package/dist/core/search.js +100 -60
- package/dist/core/search.js.map +1 -1
- package/package.json +1 -1
package/dist/core/config.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface ModelConfig {
|
|
|
7
7
|
maxTokens?: number;
|
|
8
8
|
temperature?: number;
|
|
9
9
|
}
|
|
10
|
-
export type SearchProvider = 'serper' | 'tavily' | 'duckduckgo';
|
|
10
|
+
export type SearchProvider = 'serper' | 'tavily' | 'duckduckgo' | 'bocha';
|
|
11
11
|
export interface SearchConfig {
|
|
12
12
|
provider: SearchProvider;
|
|
13
13
|
apiKey?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,MAAM,GACN,KAAK,GACL,QAAQ,GACR,UAAU,GACV,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,MAAM,GACN,KAAK,GACL,QAAQ,GACR,UAAU,GACV,SAAS,GACT,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,aAAa,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,CAAC;AAE1E,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,aAAa,CAAC;IAC/B,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC;IACvD,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAGD,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAyD7E,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CASzD,CAAC;AAKF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAS3D,CAAC;AAEF,oDAAoD;AACpD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAExE;AAoBD,eAAO,MAAM,MAAM;QACb,CAAC,SAAS,MAAM,SAAS,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;QAIhD,CAAC,SAAS,MAAM,SAAS,OAAO,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;cAIvD,SAAS;2BAII,aAAa,GAAG,WAAW,GAAG,IAAI;0BAUnC,aAAa,UAAU,MAAM,UAAU,MAAM,YAAY,MAAM,GAAG,IAAI;yBAavE,aAAa,GAAG,IAAI;wBAIrB,cAAc,WAAW,MAAM,GAAG,IAAI;aAQjD,IAAI;mBAID,MAAM;CAGnB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA8MD,wBAAsB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC3F;AAED,0BAA0B;AAC1B,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAMhE"}
|
package/dist/core/search.js
CHANGED
|
@@ -1,67 +1,73 @@
|
|
|
1
1
|
import { config } from './config.js';
|
|
2
|
-
// ───
|
|
3
|
-
async function
|
|
2
|
+
// ─── 必应搜索(国内可访问,无需 API Key)─────────────────────
|
|
3
|
+
async function searchBing(query, maxResults) {
|
|
4
4
|
const controller = new AbortController();
|
|
5
|
-
const
|
|
5
|
+
const timer = setTimeout(() => controller.abort(), 10000);
|
|
6
6
|
try {
|
|
7
|
-
|
|
8
|
-
const
|
|
9
|
-
const iaRes = await fetch(iaUrl, {
|
|
7
|
+
const url = `https://cn.bing.com/search?q=${encodeURIComponent(query)}&count=${maxResults}&setlang=zh-CN&cc=CN`;
|
|
8
|
+
const res = await fetch(url, {
|
|
10
9
|
signal: controller.signal,
|
|
11
|
-
headers: {
|
|
10
|
+
headers: {
|
|
11
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
12
|
+
'Accept': 'text/html,application/xhtml+xml',
|
|
13
|
+
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
14
|
+
'Accept-Encoding': 'gzip, deflate',
|
|
15
|
+
},
|
|
12
16
|
});
|
|
13
|
-
clearTimeout(
|
|
14
|
-
if (
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
17
|
+
clearTimeout(timer);
|
|
18
|
+
if (!res.ok)
|
|
19
|
+
throw new Error(`必应搜索返回 HTTP ${res.status}`);
|
|
20
|
+
const html = await res.text();
|
|
21
|
+
const results = [];
|
|
22
|
+
// 匹配 Bing 搜索结果块 <li class="b_algo">
|
|
23
|
+
const blocks = html.match(/<li class="b_algo"[\s\S]*?<\/li>/g) ?? [];
|
|
24
|
+
for (const block of blocks) {
|
|
25
|
+
if (results.length >= maxResults)
|
|
26
|
+
break;
|
|
27
|
+
// 提取标题和 URL
|
|
28
|
+
const linkMatch = block.match(/<h2[^>]*>\s*<a[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/);
|
|
29
|
+
// 提取摘要
|
|
30
|
+
const snippetMatch = block.match(/<p[^>]*>([\s\S]*?)<\/p>/);
|
|
31
|
+
if (linkMatch) {
|
|
32
|
+
const url = linkMatch[1];
|
|
33
|
+
const title = linkMatch[2].replace(/<[^>]+>/g, '').trim();
|
|
34
|
+
const snippet = snippetMatch
|
|
35
|
+
? snippetMatch[1].replace(/<[^>]+>/g, '').replace(/\s+/g, ' ').trim().slice(0, 300)
|
|
36
|
+
: '';
|
|
37
|
+
if (title && url && !url.startsWith('javascript')) {
|
|
38
|
+
results.push({ title, url, snippet });
|
|
28
39
|
}
|
|
29
40
|
}
|
|
30
|
-
if (results.length > 0)
|
|
31
|
-
return results.slice(0, maxResults);
|
|
32
41
|
}
|
|
42
|
+
if (results.length > 0)
|
|
43
|
+
return results;
|
|
33
44
|
}
|
|
34
|
-
catch {
|
|
35
|
-
clearTimeout(
|
|
36
|
-
|
|
37
|
-
return [{
|
|
38
|
-
title: '搜索不可用',
|
|
39
|
-
url: '',
|
|
40
|
-
snippet: `[搜索不可用] DuckDuckGo 无法访问(网络受限或未配置代理)。` +
|
|
41
|
-
`请改用 xxcli search-config set serper --key <API_KEY> 配置搜索引擎,` +
|
|
42
|
-
`或直接使用 xxcli install ${query.split(' ')[0]} 命令尝试安装。`,
|
|
43
|
-
}];
|
|
45
|
+
catch (err) {
|
|
46
|
+
clearTimeout(timer);
|
|
47
|
+
throw err;
|
|
44
48
|
}
|
|
45
|
-
|
|
49
|
+
throw new Error('必应搜索未返回结果');
|
|
50
|
+
}
|
|
51
|
+
// ─── DuckDuckGo(国外网络备用)───────────────────────────────
|
|
52
|
+
async function searchDuckDuckGo(query, maxResults) {
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
const timeout = setTimeout(() => controller.abort(), 8000);
|
|
46
55
|
try {
|
|
47
|
-
const htmlController = new AbortController();
|
|
48
|
-
const htmlTimeout = setTimeout(() => htmlController.abort(), 8000);
|
|
49
56
|
const htmlUrl = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(query)}`;
|
|
50
57
|
const htmlRes = await fetch(htmlUrl, {
|
|
51
|
-
signal:
|
|
58
|
+
signal: controller.signal,
|
|
52
59
|
headers: {
|
|
53
|
-
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36
|
|
60
|
+
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
|
|
54
61
|
'Accept': 'text/html',
|
|
55
|
-
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
56
62
|
},
|
|
57
63
|
});
|
|
58
|
-
clearTimeout(
|
|
64
|
+
clearTimeout(timeout);
|
|
59
65
|
if (!htmlRes.ok)
|
|
60
66
|
throw new Error(`HTTP ${htmlRes.status}`);
|
|
61
67
|
const html = await htmlRes.text();
|
|
62
68
|
const results = [];
|
|
63
|
-
const
|
|
64
|
-
for (const block of
|
|
69
|
+
const blocks = html.match(/<a class="result__a"[^>]+href="([^"]+)"[^>]*>([^<]+)<\/a>[\s\S]*?<a class="result__snippet"[^>]*>([\s\S]*?)<\/a>/g) ?? [];
|
|
70
|
+
for (const block of blocks) {
|
|
65
71
|
if (results.length >= maxResults)
|
|
66
72
|
break;
|
|
67
73
|
const urlMatch = block.match(/href="([^"]+)"/);
|
|
@@ -74,15 +80,12 @@ async function searchDuckDuckGo(query, maxResults) {
|
|
|
74
80
|
}
|
|
75
81
|
}
|
|
76
82
|
if (results.length > 0)
|
|
77
|
-
return results
|
|
83
|
+
return results;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
clearTimeout(timeout);
|
|
78
87
|
}
|
|
79
|
-
|
|
80
|
-
// 最终兜底
|
|
81
|
-
return [{
|
|
82
|
-
title: '搜索无结果',
|
|
83
|
-
url: `https://duckduckgo.com/?q=${encodeURIComponent(query)}`,
|
|
84
|
-
snippet: `搜索 "${query}" 无结果。建议配置 Serper 或 Tavily 获得更好的搜索效果:xxcli search-config set serper --key <API_KEY>`,
|
|
85
|
-
}];
|
|
88
|
+
throw new Error('DuckDuckGo 搜索失败');
|
|
86
89
|
}
|
|
87
90
|
// ─── Serper(Google Search API,需要 API Key)────────────────
|
|
88
91
|
async function searchSerper(query, apiKey, maxResults) {
|
|
@@ -112,6 +115,31 @@ async function searchSerper(query, apiKey, maxResults) {
|
|
|
112
115
|
}
|
|
113
116
|
return results;
|
|
114
117
|
}
|
|
118
|
+
// ─── 博查 Bocha(国内 AI 搜索,需要 API Key)────────────────
|
|
119
|
+
async function searchBocha(query, apiKey, maxResults) {
|
|
120
|
+
const res = await fetch('https://api.bochaai.com/v1/web-search', {
|
|
121
|
+
method: 'POST',
|
|
122
|
+
headers: {
|
|
123
|
+
'Content-Type': 'application/json',
|
|
124
|
+
'Authorization': `Bearer ${apiKey}`,
|
|
125
|
+
},
|
|
126
|
+
body: JSON.stringify({
|
|
127
|
+
query,
|
|
128
|
+
summary: true,
|
|
129
|
+
count: maxResults,
|
|
130
|
+
freshness: 'noLimit',
|
|
131
|
+
}),
|
|
132
|
+
});
|
|
133
|
+
if (!res.ok)
|
|
134
|
+
throw new Error(`博查搜索请求失败 [${res.status}]`);
|
|
135
|
+
const data = (await res.json());
|
|
136
|
+
const items = data?.data?.webPages?.value ?? [];
|
|
137
|
+
return items.slice(0, maxResults).map((item) => ({
|
|
138
|
+
title: item.name,
|
|
139
|
+
url: item.url,
|
|
140
|
+
snippet: item.snippet?.slice(0, 300) ?? '',
|
|
141
|
+
}));
|
|
142
|
+
}
|
|
115
143
|
// ─── Tavily(AI-optimized search,需要 API Key)───────────────
|
|
116
144
|
async function searchTavily(query, apiKey, maxResults) {
|
|
117
145
|
const res = await fetch('https://api.tavily.com/search', {
|
|
@@ -146,24 +174,36 @@ export async function webSearch(query, maxResults) {
|
|
|
146
174
|
const provider = searchCfg.provider;
|
|
147
175
|
let results = [];
|
|
148
176
|
try {
|
|
149
|
-
if (provider === '
|
|
177
|
+
if (provider === 'bocha' && searchCfg.apiKey) {
|
|
178
|
+
results = await searchBocha(query, searchCfg.apiKey, limit);
|
|
179
|
+
}
|
|
180
|
+
else if (provider === 'serper' && searchCfg.apiKey) {
|
|
150
181
|
results = await searchSerper(query, searchCfg.apiKey, limit);
|
|
151
182
|
}
|
|
152
183
|
else if (provider === 'tavily' && searchCfg.apiKey) {
|
|
153
184
|
results = await searchTavily(query, searchCfg.apiKey, limit);
|
|
154
185
|
}
|
|
155
186
|
else {
|
|
156
|
-
//
|
|
157
|
-
|
|
187
|
+
// 无 Key 时:先尝试必应(国内可用),失败再降级 DuckDuckGo
|
|
188
|
+
try {
|
|
189
|
+
results = await searchBing(query, limit);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
results = await searchDuckDuckGo(query, limit);
|
|
193
|
+
}
|
|
158
194
|
}
|
|
159
195
|
}
|
|
160
|
-
catch
|
|
161
|
-
//
|
|
162
|
-
|
|
163
|
-
results = await
|
|
196
|
+
catch {
|
|
197
|
+
// 全部失败时降级必应兜底
|
|
198
|
+
try {
|
|
199
|
+
results = await searchBing(query, limit);
|
|
164
200
|
}
|
|
165
|
-
|
|
166
|
-
|
|
201
|
+
catch {
|
|
202
|
+
results = [{
|
|
203
|
+
title: '搜索不可用',
|
|
204
|
+
url: '',
|
|
205
|
+
snippet: `搜索服务暂不可用。\n· 免费方案:无需配置,默认已使用必应搜索(如仍失败请检查网络)\n· 推荐方案:配置博查搜索(稳定可用):xxcli search-config set bocha --key <KEY>\n 获取 Key(有免费额度):https://open.bochaai.com`,
|
|
206
|
+
}];
|
|
167
207
|
}
|
|
168
208
|
}
|
|
169
209
|
return { query, results, provider };
|
package/dist/core/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAcrC,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/core/search.ts"],"names":[],"mappings":"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"}
|