@qjp88995/provider-client 0.2.0 → 0.4.0
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/direct-resolver.d.ts.map +1 -1
- package/dist/direct-resolver.js +2 -0
- package/dist/direct-resolver.js.map +1 -1
- package/dist/image/http.d.ts +16 -0
- package/dist/image/http.d.ts.map +1 -0
- package/dist/image/http.js +62 -0
- package/dist/image/http.js.map +1 -0
- package/dist/image/index.d.ts +32 -0
- package/dist/image/index.d.ts.map +1 -0
- package/dist/image/index.js +39 -0
- package/dist/image/index.js.map +1 -0
- package/dist/image/types.d.ts +94 -0
- package/dist/image/types.d.ts.map +1 -0
- package/dist/image/types.js +44 -0
- package/dist/image/types.js.map +1 -0
- package/dist/image/volcengine.adapter.d.ts +8 -0
- package/dist/image/volcengine.adapter.d.ts.map +1 -0
- package/dist/image/volcengine.adapter.js +85 -0
- package/dist/image/volcengine.adapter.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/justone/client.d.ts +101 -0
- package/dist/justone/client.d.ts.map +1 -0
- package/dist/justone/client.js +272 -0
- package/dist/justone/client.js.map +1 -0
- package/dist/justone/endpoint-spec.d.ts +49 -0
- package/dist/justone/endpoint-spec.d.ts.map +1 -0
- package/dist/justone/endpoint-spec.js +2 -0
- package/dist/justone/endpoint-spec.js.map +1 -0
- package/dist/justone/endpoints.generated.d.ts +7927 -0
- package/dist/justone/endpoints.generated.d.ts.map +1 -0
- package/dist/justone/endpoints.generated.js +8508 -0
- package/dist/justone/endpoints.generated.js.map +1 -0
- package/dist/justone/errors.d.ts +52 -0
- package/dist/justone/errors.d.ts.map +1 -0
- package/dist/justone/errors.js +73 -0
- package/dist/justone/errors.js.map +1 -0
- package/dist/justone/index.d.ts +8 -0
- package/dist/justone/index.d.ts.map +1 -0
- package/dist/justone/index.js +7 -0
- package/dist/justone/index.js.map +1 -0
- package/dist/justone/params.d.ts +17 -0
- package/dist/justone/params.d.ts.map +1 -0
- package/dist/justone/params.js +72 -0
- package/dist/justone/params.js.map +1 -0
- package/dist/justone/pricing.d.ts +6 -0
- package/dist/justone/pricing.d.ts.map +1 -0
- package/dist/justone/pricing.generated.d.ts +303 -0
- package/dist/justone/pricing.generated.d.ts.map +1 -0
- package/dist/justone/pricing.generated.js +305 -0
- package/dist/justone/pricing.generated.js.map +1 -0
- package/dist/justone/pricing.js +11 -0
- package/dist/justone/pricing.js.map +1 -0
- package/dist/media/bibigpt.adapter.d.ts +43 -0
- package/dist/media/bibigpt.adapter.d.ts.map +1 -0
- package/dist/media/bibigpt.adapter.js +302 -0
- package/dist/media/bibigpt.adapter.js.map +1 -0
- package/dist/media/http.d.ts +21 -0
- package/dist/media/http.d.ts.map +1 -0
- package/dist/media/http.js +39 -0
- package/dist/media/http.js.map +1 -0
- package/dist/media/index.d.ts +44 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +47 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/types.d.ts +207 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/types.js +21 -0
- package/dist/media/types.js.map +1 -0
- package/dist/media/zhipu-parser-package.d.ts +37 -0
- package/dist/media/zhipu-parser-package.d.ts.map +1 -0
- package/dist/media/zhipu-parser-package.js +108 -0
- package/dist/media/zhipu-parser-package.js.map +1 -0
- package/dist/media/zhipu.adapter.d.ts +37 -0
- package/dist/media/zhipu.adapter.d.ts.map +1 -0
- package/dist/media/zhipu.adapter.js +361 -0
- package/dist/media/zhipu.adapter.js.map +1 -0
- package/dist/provider-client.d.ts +62 -0
- package/dist/provider-client.d.ts.map +1 -1
- package/dist/provider-client.js +176 -0
- package/dist/provider-client.js.map +1 -1
- package/dist/types.d.ts +23 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +12 -2
- package/dist/types.js.map +1 -1
- package/dist/web-search/deepseek.adapter.d.ts +19 -0
- package/dist/web-search/deepseek.adapter.d.ts.map +1 -0
- package/dist/web-search/deepseek.adapter.js +82 -0
- package/dist/web-search/deepseek.adapter.js.map +1 -0
- package/dist/web-search/http.d.ts +28 -0
- package/dist/web-search/http.d.ts.map +1 -0
- package/dist/web-search/http.js +95 -0
- package/dist/web-search/http.js.map +1 -0
- package/dist/web-search/index.d.ts +27 -0
- package/dist/web-search/index.d.ts.map +1 -0
- package/dist/web-search/index.js +36 -0
- package/dist/web-search/index.js.map +1 -0
- package/dist/web-search/minimax.adapter.d.ts +13 -0
- package/dist/web-search/minimax.adapter.d.ts.map +1 -0
- package/dist/web-search/minimax.adapter.js +82 -0
- package/dist/web-search/minimax.adapter.js.map +1 -0
- package/dist/web-search/moonshotai.adapter.d.ts +19 -0
- package/dist/web-search/moonshotai.adapter.d.ts.map +1 -0
- package/dist/web-search/moonshotai.adapter.js +151 -0
- package/dist/web-search/moonshotai.adapter.js.map +1 -0
- package/dist/web-search/types.d.ts +120 -0
- package/dist/web-search/types.d.ts.map +1 -0
- package/dist/web-search/types.js +60 -0
- package/dist/web-search/types.js.map +1 -0
- package/dist/web-search/zhipu.adapter.d.ts +14 -0
- package/dist/web-search/zhipu.adapter.d.ts.map +1 -0
- package/dist/web-search/zhipu.adapter.js +98 -0
- package/dist/web-search/zhipu.adapter.js.map +1 -0
- package/package.json +4 -3
- package/src/direct-resolver.ts +2 -0
- package/src/image/http.ts +68 -0
- package/src/image/index.ts +87 -0
- package/src/image/types.ts +134 -0
- package/src/image/volcengine.adapter.ts +133 -0
- package/src/index.ts +126 -0
- package/src/justone/client.ts +462 -0
- package/src/justone/endpoint-spec.ts +66 -0
- package/src/justone/endpoints.generated.ts +9258 -0
- package/src/justone/errors.ts +97 -0
- package/src/justone/index.ts +34 -0
- package/src/justone/params.ts +91 -0
- package/src/justone/pricing.generated.ts +308 -0
- package/src/justone/pricing.ts +11 -0
- package/src/media/bibigpt.adapter.ts +372 -0
- package/src/media/http.ts +43 -0
- package/src/media/index.ts +114 -0
- package/src/media/types.ts +233 -0
- package/src/media/zhipu-parser-package.ts +149 -0
- package/src/media/zhipu.adapter.ts +510 -0
- package/src/provider-client.ts +303 -1
- package/src/types.ts +31 -2
- package/src/web-search/deepseek.adapter.ts +149 -0
- package/src/web-search/http.ts +108 -0
- package/src/web-search/index.ts +70 -0
- package/src/web-search/minimax.adapter.ts +148 -0
- package/src/web-search/moonshotai.adapter.ts +228 -0
- package/src/web-search/types.ts +172 -0
- package/src/web-search/zhipu.adapter.ts +184 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { DeepseekWebSearchAdapter } from './deepseek.adapter.js';
|
|
2
|
+
import { MinimaxWebSearchAdapter } from './minimax.adapter.js';
|
|
3
|
+
import { MoonshotaiWebSearchAdapter } from './moonshotai.adapter.js';
|
|
4
|
+
import { ZhipuWebSearchAdapter } from './zhipu.adapter.js';
|
|
5
|
+
/** kind → 适配器。映射类型保证每个 kind 都有、且设置类型对得上;加一家漏了这里编译报错。 */
|
|
6
|
+
export const WEB_SEARCH_ADAPTERS = {
|
|
7
|
+
deepseek: new DeepseekWebSearchAdapter(),
|
|
8
|
+
moonshotai: new MoonshotaiWebSearchAdapter(),
|
|
9
|
+
minimax: new MinimaxWebSearchAdapter(),
|
|
10
|
+
zhipu: new ZhipuWebSearchAdapter(),
|
|
11
|
+
};
|
|
12
|
+
export function isWebSearchKind(kind) {
|
|
13
|
+
return Object.hasOwn(WEB_SEARCH_ADAPTERS, kind);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 绑好连接与设置的联网服务。中心模式用 `ProviderClient.webSearch`;这里是直连(本地开发、测试)与中心模式共用的底层:
|
|
17
|
+
* 直连时 `connection` 给厂商的 `web-search` 根地址 + `apiKey`。
|
|
18
|
+
*/
|
|
19
|
+
export function createWebSearch(input) {
|
|
20
|
+
// 映射类型按 K 取出来是联合,TS 收窄不了泛型索引;kind 与 settings 由签名绑在一起。
|
|
21
|
+
const adapter = WEB_SEARCH_ADAPTERS[input.kind];
|
|
22
|
+
const settings = (input.settings ?? {});
|
|
23
|
+
const conn = input.connection;
|
|
24
|
+
const traits = adapter.traits(settings);
|
|
25
|
+
const readPage = adapter.readPage?.bind(adapter);
|
|
26
|
+
return {
|
|
27
|
+
kind: input.kind,
|
|
28
|
+
traits,
|
|
29
|
+
search: (q, signal) => adapter.search(conn, settings, q, signal),
|
|
30
|
+
...(readPage
|
|
31
|
+
? { readPage: (q, signal) => readPage(conn, settings, q, signal) }
|
|
32
|
+
: {}),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export * from './types.js';
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/web-search/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAWrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,wDAAwD;AACxD,MAAM,CAAC,MAAM,mBAAmB,GAE5B;IACF,QAAQ,EAAE,IAAI,wBAAwB,EAAE;IACxC,UAAU,EAAE,IAAI,0BAA0B,EAAE;IAC5C,OAAO,EAAE,IAAI,uBAAuB,EAAE;IACtC,KAAK,EAAE,IAAI,qBAAqB,EAAE;CACnC,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC;AAmBD;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,KAA8B;IAE9B,sDAAsD;IACtD,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAwB,CAAC;IACvE,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAyB,CAAC;IAChE,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC;IAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM;QACN,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC;QAChE,GAAG,CAAC,QAAQ;YACV,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE;YAClE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type WebSearchAdapter, type WebSearchConnection, type WebSearchInput, type WebSearchOutcome, type WebSearchSettings, type WebSearchTraits } from './types.js';
|
|
2
|
+
type Settings = WebSearchSettings<'minimax'>;
|
|
3
|
+
/**
|
|
4
|
+
* 时间 / 域名过滤一律报回 `ignored`、不拼进查询:实测两种操作符都靠不住,拼进去只会
|
|
5
|
+
* 改变关键词本身。条数上游定死 10 条,`count` 在本地截。
|
|
6
|
+
*/
|
|
7
|
+
export declare class MinimaxWebSearchAdapter implements WebSearchAdapter<'minimax'> {
|
|
8
|
+
readonly kind: "minimax";
|
|
9
|
+
traits(): WebSearchTraits;
|
|
10
|
+
search(conn: WebSearchConnection, _settings: Settings, input: WebSearchInput, signal: AbortSignal): Promise<WebSearchOutcome>;
|
|
11
|
+
}
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=minimax.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimax.adapter.d.ts","sourceRoot":"","sources":["../../src/web-search/minimax.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAExB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AA2BpB,KAAK,QAAQ,GAAG,iBAAiB,CAAC,SAAS,CAAC,CAAC;AAK7C;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB,CAAC,SAAS,CAAC;IACzE,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IAEnC,MAAM,IAAI,eAAe;IAUnB,MAAM,CACV,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,QAAQ,EACnB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC;CAgC7B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { clip, codeOf, joinUrl, parseJson, postJson } from './http.js';
|
|
2
|
+
import { WebSearchUpstreamError, } from './types.js';
|
|
3
|
+
/** 上游定死的条数(实测没有条数参数)。 */
|
|
4
|
+
const UPSTREAM_COUNT = 10;
|
|
5
|
+
/**
|
|
6
|
+
* 时间 / 域名过滤一律报回 `ignored`、不拼进查询:实测两种操作符都靠不住,拼进去只会
|
|
7
|
+
* 改变关键词本身。条数上游定死 10 条,`count` 在本地截。
|
|
8
|
+
*/
|
|
9
|
+
export class MinimaxWebSearchAdapter {
|
|
10
|
+
kind = 'minimax';
|
|
11
|
+
traits() {
|
|
12
|
+
return {
|
|
13
|
+
readsPages: false,
|
|
14
|
+
maxResults: UPSTREAM_COUNT,
|
|
15
|
+
filters: [],
|
|
16
|
+
linksOftenMissing: false,
|
|
17
|
+
pageImagesArePlaceholders: false,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async search(conn, _settings, input, signal) {
|
|
21
|
+
const label = 'minimax search';
|
|
22
|
+
const res = await postJson(label, joinUrl(conn.baseUrl, 'search'), conn, { q: input.query }, signal);
|
|
23
|
+
const data = parseBody(label, res.status, res.text);
|
|
24
|
+
const code = data.base_resp?.status_code;
|
|
25
|
+
if (!res.ok || code !== 0) {
|
|
26
|
+
throw upstreamError(label, res.status, code, data.base_resp?.status_msg);
|
|
27
|
+
}
|
|
28
|
+
const items = (data.organic ?? []).map(r => ({
|
|
29
|
+
title: r.title ?? '',
|
|
30
|
+
link: r.link ?? '',
|
|
31
|
+
content: r.snippet ?? '',
|
|
32
|
+
media: null,
|
|
33
|
+
publishDate: r.date || null,
|
|
34
|
+
}));
|
|
35
|
+
const ignored = [
|
|
36
|
+
...(input.recency ? ['recency'] : []),
|
|
37
|
+
...(input.domain ? ['domain'] : []),
|
|
38
|
+
];
|
|
39
|
+
return {
|
|
40
|
+
engine: 'minimax',
|
|
41
|
+
items: input.count !== undefined ? items.slice(0, input.count) : items,
|
|
42
|
+
...(ignored.length ? { ignored } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** 4xx / 5xx 也可能带 `base_resp`(参数错是 400 + 2013);不成形的非 2xx 当没有错误体。 */
|
|
47
|
+
function parseBody(label, status, text) {
|
|
48
|
+
if (status >= 200 && status < 300)
|
|
49
|
+
return parseJson(label, text);
|
|
50
|
+
try {
|
|
51
|
+
return JSON.parse(text);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { base_resp: { status_msg: clip(text) } };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function upstreamError(label, status, code, msg) {
|
|
58
|
+
const hint = code !== undefined ? CODE_HINTS[code] : undefined;
|
|
59
|
+
const head = code !== undefined ? `${label} ${code}` : `${label} ${status}`;
|
|
60
|
+
return new WebSearchUpstreamError(`${head}${hint ? `(${hint})` : ''}${msg ? `: ${msg}` : ''}`, {
|
|
61
|
+
code: codeOf(code),
|
|
62
|
+
retryable: status >= 500 ||
|
|
63
|
+
status === 429 ||
|
|
64
|
+
(code !== undefined && RETRYABLE_CODES.has(code)),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* MiniMax 通用错误码里表示「稍后再试有用」的:未知错误、超时、限流(RPM / TPM)、
|
|
69
|
+
* 服务内部错误。鉴权、余额、参数类改了请求或账户才有用。
|
|
70
|
+
*/
|
|
71
|
+
const RETRYABLE_CODES = new Set([
|
|
72
|
+
1000, 1001, 1002, 1013, 1024, 1033, 1039,
|
|
73
|
+
]);
|
|
74
|
+
/** 实测见过、或 MiniMax 通用错误码里含义确定的,带进错误文案让模型 / 运营不必去查。 */
|
|
75
|
+
const CODE_HINTS = {
|
|
76
|
+
1002: '超过频率上限',
|
|
77
|
+
1004: 'API key 无效或没带上',
|
|
78
|
+
1008: '账户余额不足,需要充值',
|
|
79
|
+
2013: '请求参数不合法',
|
|
80
|
+
2049: 'API key 无效,或与所选站点不匹配',
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=minimax.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimax.adapter.js","sourceRoot":"","sources":["../../src/web-search/minimax.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type WebPageOutcome, type WebSearchAdapter, type WebSearchConnection, type WebSearchInput, type WebSearchOutcome, type WebSearchSettings, type WebSearchTraits } from './types.js';
|
|
2
|
+
type Settings = WebSearchSettings<'moonshotai'>;
|
|
3
|
+
/**
|
|
4
|
+
* 基础版没有时间 / 域名过滤字段,给了就报回 `ignored`——文档没说认 `site:` 之类的操作符,
|
|
5
|
+
* 拼进查询是在猜。专业版有 `sites` 与 `time_window`,两项都施加。`include_content` 不开:
|
|
6
|
+
* 会把每条结果的全文塞回来,体量没有上限。
|
|
7
|
+
*/
|
|
8
|
+
export declare class MoonshotaiWebSearchAdapter implements WebSearchAdapter<'moonshotai'> {
|
|
9
|
+
private readonly now;
|
|
10
|
+
readonly kind: "moonshotai";
|
|
11
|
+
constructor(now?: () => Date);
|
|
12
|
+
traits(settings: Settings): WebSearchTraits;
|
|
13
|
+
search(conn: WebSearchConnection, settings: Settings, input: WebSearchInput, signal: AbortSignal): Promise<WebSearchOutcome>;
|
|
14
|
+
readPage(conn: WebSearchConnection, _settings: Settings, input: {
|
|
15
|
+
url: string;
|
|
16
|
+
}, signal: AbortSignal): Promise<WebPageOutcome>;
|
|
17
|
+
}
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=moonshotai.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moonshotai.adapter.d.ts","sourceRoot":"","sources":["../../src/web-search/moonshotai.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAExB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AAiCpB,KAAK,QAAQ,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;AAEhD;;;;GAIG;AACH,qBAAa,0BAA2B,YAAW,gBAAgB,CAAC,YAAY,CAAC;IAGnE,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;gBAET,GAAG,GAAE,MAAM,IAAuB;IAE/D,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe;IAWrC,MAAM,CACV,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAgDtB,QAAQ,CACZ,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,QAAQ,EACnB,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,CAAC;CA6B3B"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { clip, codeOf, joinUrl, parseJson, postJson } from './http.js';
|
|
2
|
+
import { recencySince, utcDate, WebSearchUpstreamError, } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Kimi 工具网关(<https://platform.kimi.com/docs/api/tools-search>):搜索基础版 `/search`、
|
|
5
|
+
* 专业版 `/search_pro`、网页抓取 `/fetch`。与对话 API 同一把 Bearer key;`web-search` 端点的根是
|
|
6
|
+
* `https://api.moonshot.cn/v1/tools`(国际站 `api.moonshot.ai`,两站账号与 key 不通用,在中心是两家厂商)。
|
|
7
|
+
* 专业版与抓取的文档只列了国内站,国际站沿用同一组路径。
|
|
8
|
+
*
|
|
9
|
+
* **不是 Formula 的 `moonshot/web-search`**:那个回 `encrypted_output`,只有 Kimi 模型读得了。
|
|
10
|
+
*/
|
|
11
|
+
/** 文档:两档的 `limit` 都是 1–20。工具层允许到 50,超出的压到上限而不是让上游 400。 */
|
|
12
|
+
const MAX_LIMIT = 20;
|
|
13
|
+
/**
|
|
14
|
+
* 基础版没有时间 / 域名过滤字段,给了就报回 `ignored`——文档没说认 `site:` 之类的操作符,
|
|
15
|
+
* 拼进查询是在猜。专业版有 `sites` 与 `time_window`,两项都施加。`include_content` 不开:
|
|
16
|
+
* 会把每条结果的全文塞回来,体量没有上限。
|
|
17
|
+
*/
|
|
18
|
+
export class MoonshotaiWebSearchAdapter {
|
|
19
|
+
now;
|
|
20
|
+
kind = 'moonshotai';
|
|
21
|
+
constructor(now = () => new Date()) {
|
|
22
|
+
this.now = now;
|
|
23
|
+
}
|
|
24
|
+
traits(settings) {
|
|
25
|
+
return {
|
|
26
|
+
readsPages: true,
|
|
27
|
+
maxResults: MAX_LIMIT,
|
|
28
|
+
filters: settings.searchTier === 'pro' ? ['recency', 'domain'] : [],
|
|
29
|
+
linksOftenMissing: false,
|
|
30
|
+
// 抓取的正文里图片是占位符(``),模型得知道那不是它能看的图。
|
|
31
|
+
pageImagesArePlaceholders: true,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async search(conn, settings, input, signal) {
|
|
35
|
+
const pro = settings.searchTier === 'pro';
|
|
36
|
+
const label = pro ? 'kimi search_pro' : 'kimi search';
|
|
37
|
+
const body = {
|
|
38
|
+
text_query: input.query,
|
|
39
|
+
...(input.count !== undefined
|
|
40
|
+
? { limit: Math.min(input.count, MAX_LIMIT) }
|
|
41
|
+
: {}),
|
|
42
|
+
...(pro && input.domain ? { sites: [input.domain] } : {}),
|
|
43
|
+
...(pro && input.recency
|
|
44
|
+
? {
|
|
45
|
+
time_window: {
|
|
46
|
+
start: recencySince(input.recency, this.now()),
|
|
47
|
+
end: utcDate(this.now()),
|
|
48
|
+
},
|
|
49
|
+
}
|
|
50
|
+
: {}),
|
|
51
|
+
};
|
|
52
|
+
const res = await postJson(label, joinUrl(conn.baseUrl, pro ? 'search_pro' : 'search'), conn, body, signal);
|
|
53
|
+
if (!res.ok)
|
|
54
|
+
throw upstreamError(label, res.status, res.text);
|
|
55
|
+
const data = parseJson(label, res.text);
|
|
56
|
+
const items = (data.search_results ?? []).map(r => ({
|
|
57
|
+
title: r.title ?? '',
|
|
58
|
+
link: r.url ?? '',
|
|
59
|
+
content: r.snippet || bestChunk(r.chunks) || '',
|
|
60
|
+
media: r.site_name || null,
|
|
61
|
+
publishDate: r.date || null,
|
|
62
|
+
}));
|
|
63
|
+
const ignored = pro
|
|
64
|
+
? []
|
|
65
|
+
: [
|
|
66
|
+
...(input.recency ? ['recency'] : []),
|
|
67
|
+
...(input.domain ? ['domain'] : []),
|
|
68
|
+
];
|
|
69
|
+
return {
|
|
70
|
+
engine: pro ? 'kimi-pro' : 'kimi',
|
|
71
|
+
items,
|
|
72
|
+
...(ignored.length ? { ignored } : {}),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async readPage(conn, _settings, input, signal) {
|
|
76
|
+
const label = 'kimi fetch';
|
|
77
|
+
const res = await postJson(label, joinUrl(conn.baseUrl, 'fetch'), conn, { url: input.url }, signal);
|
|
78
|
+
if (!res.ok) {
|
|
79
|
+
const err = errorBodyOf(res.text);
|
|
80
|
+
// 「读到了但没有可提取的正文」不是故障(也不计费):交给工具层说「正文为空」,
|
|
81
|
+
// 别让模型当成链接坏了去重试。
|
|
82
|
+
if (res.status === 404 && err.type === 'markdown_not_found') {
|
|
83
|
+
return { url: input.url, title: null, description: null, content: '' };
|
|
84
|
+
}
|
|
85
|
+
throw upstreamError(label, res.status, res.text);
|
|
86
|
+
}
|
|
87
|
+
const data = parseJson(label, res.text);
|
|
88
|
+
if (typeof data.markdown !== 'string') {
|
|
89
|
+
throw new WebSearchUpstreamError('kimi fetch 响应缺少 markdown');
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
url: data.url || input.url,
|
|
93
|
+
title: data.title || null,
|
|
94
|
+
description: null,
|
|
95
|
+
content: data.markdown,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** 专业版的摘要偶尔为空,退回得分最高的正文片段。 */
|
|
100
|
+
function bestChunk(chunks) {
|
|
101
|
+
let best;
|
|
102
|
+
for (const c of chunks ?? []) {
|
|
103
|
+
if (!c.text)
|
|
104
|
+
continue;
|
|
105
|
+
if (!best || (c.score ?? 0) > (best.score ?? 0))
|
|
106
|
+
best = c;
|
|
107
|
+
}
|
|
108
|
+
return best?.text;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* 错误体是 `{error: {message, type, code?}}`,判别靠 `type`(`rate_limited` /
|
|
112
|
+
* `upstream_failed` …);401 / 403 没有错误体(抓取的 403 `security_risk` 有)。
|
|
113
|
+
*/
|
|
114
|
+
function upstreamError(label, status, text) {
|
|
115
|
+
const err = errorBodyOf(text);
|
|
116
|
+
const detail = err.message ?? clip(text);
|
|
117
|
+
const hint = (err.type ? TYPE_HINTS[err.type] : undefined) ?? STATUS_HINTS[status];
|
|
118
|
+
return new WebSearchUpstreamError(`${label} ${status}${hint ? `(${hint})` : ''}${detail ? `: ${detail}` : ''}`, {
|
|
119
|
+
code: err.type ?? err.code,
|
|
120
|
+
// 文档:429(限流 / 限流服务不可用)、500、502、504 稍后重试;400 / 403 改请求才有用。
|
|
121
|
+
retryable: status >= 500 || status === 429,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
function errorBodyOf(text) {
|
|
125
|
+
try {
|
|
126
|
+
const body = JSON.parse(text);
|
|
127
|
+
return {
|
|
128
|
+
type: codeOf(body.error?.type),
|
|
129
|
+
code: codeOf(body.error?.code),
|
|
130
|
+
message: typeof body.error?.message === 'string'
|
|
131
|
+
? body.error.message
|
|
132
|
+
: undefined,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
return { type: undefined, code: undefined, message: undefined };
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** 文档里有确定含义的状态码,带进错误文案让模型 / 运营不必去查。 */
|
|
140
|
+
const STATUS_HINTS = {
|
|
141
|
+
401: 'API key 无效,或与所选站点不匹配',
|
|
142
|
+
403: '账户未激活或已停用',
|
|
143
|
+
429: '超过频率或并发上限',
|
|
144
|
+
504: '超时,搜索就换个更短的关键词,读网页就稍后再试',
|
|
145
|
+
};
|
|
146
|
+
/** 同一个状态码含义不止一种时按 `type` 区分(抓取的 403 不是账户问题)。 */
|
|
147
|
+
const TYPE_HINTS = {
|
|
148
|
+
security_risk: '这个网址被 Kimi 的安全策略拦下,换一个网址,重试没用',
|
|
149
|
+
invalid_url: '网址不合法,只支持 http / https',
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=moonshotai.adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"moonshotai.adapter.js","sourceRoot":"","sources":["../../src/web-search/moonshotai.adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import type { VendorFetch } from '../vendors/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* 联网搜索 / 读网页的厂商适配(从 agent-base `web-search/adapters` 搬来)。适配器只管「这家的请求长什么样、
|
|
4
|
+
* 响应怎么翻、哪些失败值得重试」;给模型看的工具说明是 APP 的事,适配器只交出事实(`WebSearchTraits`)。
|
|
5
|
+
*/
|
|
6
|
+
/** 时效过滤取值(缺省 = 不限时间)。各适配器自己翻成上游的写法。 */
|
|
7
|
+
export declare const WEB_SEARCH_RECENCIES: readonly ["oneDay", "oneWeek", "oneMonth", "oneYear"];
|
|
8
|
+
export type WebSearchRecency = (typeof WEB_SEARCH_RECENCIES)[number];
|
|
9
|
+
/** 「最近一段时间」的起始日期(UTC,YYYY-MM-DD)——上游只收日期的家(DeepSeek、Kimi 专业版)共用。 */
|
|
10
|
+
export declare function recencySince(recency: WebSearchRecency, now: Date): string;
|
|
11
|
+
/** UTC 日期 YYYY-MM-DD。 */
|
|
12
|
+
export declare function utcDate(d: Date): string;
|
|
13
|
+
export interface WebSearchInput {
|
|
14
|
+
query: string;
|
|
15
|
+
count?: number;
|
|
16
|
+
recency?: WebSearchRecency;
|
|
17
|
+
domain?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface WebSearchItem {
|
|
20
|
+
title: string;
|
|
21
|
+
link: string;
|
|
22
|
+
/** 搜索引擎给的摘要,不是网页全文。 */
|
|
23
|
+
content: string;
|
|
24
|
+
/** 来源站点 / 媒体名(常为空)。 */
|
|
25
|
+
media: string | null;
|
|
26
|
+
publishDate: string | null;
|
|
27
|
+
}
|
|
28
|
+
/** 搜索的两项过滤。不是每家都支持(Kimi 基础版、MiniMax 都没有),不支持的由适配器报回 `ignored`。 */
|
|
29
|
+
export declare const WEB_SEARCH_FILTERS: readonly ["recency", "domain"];
|
|
30
|
+
export type WebSearchFilter = (typeof WEB_SEARCH_FILTERS)[number];
|
|
31
|
+
export interface WebSearchOutcome {
|
|
32
|
+
/** 「用的是哪个引擎」(智谱是档位名,其余是服务名)。 */
|
|
33
|
+
engine: string;
|
|
34
|
+
items: WebSearchItem[];
|
|
35
|
+
/**
|
|
36
|
+
* 调用方给了、这家却没法施加的过滤(缺省 = 都施加了)。调用方据此说破,别让模型以为
|
|
37
|
+
* 结果已经按时间 / 域名筛过。
|
|
38
|
+
*/
|
|
39
|
+
ignored?: readonly WebSearchFilter[];
|
|
40
|
+
}
|
|
41
|
+
export interface WebPageOutcome {
|
|
42
|
+
url: string;
|
|
43
|
+
title: string | null;
|
|
44
|
+
description: string | null;
|
|
45
|
+
/** markdown 正文。可能为空串(纯脚本渲染 / 反爬页面、Kimi 的「没有可提取的正文」),由调用方解释。 */
|
|
46
|
+
content: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 调一次上游要的东西:这家 `web-search` 端点的根地址与出站 fetch。中心模式下 fetch 是中心的透传 fetch、
|
|
50
|
+
* 不带 key(中心注入);直连模式给 `apiKey`,适配器以 Bearer 发出。
|
|
51
|
+
*/
|
|
52
|
+
export interface WebSearchConnection {
|
|
53
|
+
baseUrl: string;
|
|
54
|
+
fetch: VendorFetch;
|
|
55
|
+
apiKey?: string;
|
|
56
|
+
}
|
|
57
|
+
/** 智谱的搜索档位(`search_engine`)。 */
|
|
58
|
+
export declare const ZHIPU_SEARCH_ENGINES: readonly ["search_std", "search_pro", "search_pro_sogou", "search_pro_quark"];
|
|
59
|
+
export type ZhipuSearchEngine = (typeof ZHIPU_SEARCH_ENGINES)[number];
|
|
60
|
+
/** Kimi 搜索:基础版 `/search`、专业版 `/search_pro`。 */
|
|
61
|
+
export declare const KIMI_SEARCH_TIERS: readonly ["basic", "pro"];
|
|
62
|
+
export type KimiSearchTier = (typeof KIMI_SEARCH_TIERS)[number];
|
|
63
|
+
/**
|
|
64
|
+
* 各家的设置(APP 存、调用时传;缺省值见各适配器)。**站点(国内 / 海外)不是设置**:两站账号与 key 不通用,
|
|
65
|
+
* 在中心是两家厂商,地址取自各自的 `web-search` 端点。
|
|
66
|
+
*/
|
|
67
|
+
export interface WebSearchSettingsByKind {
|
|
68
|
+
deepseek: Record<string, never>;
|
|
69
|
+
moonshotai: {
|
|
70
|
+
searchTier?: KimiSearchTier;
|
|
71
|
+
};
|
|
72
|
+
minimax: Record<string, never>;
|
|
73
|
+
zhipu: {
|
|
74
|
+
searchEngine?: ZhipuSearchEngine;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export type WebSearchKind = keyof WebSearchSettingsByKind;
|
|
78
|
+
export declare const WEB_SEARCH_KINDS: readonly ["deepseek", "moonshotai", "minimax", "zhipu"];
|
|
79
|
+
export type WebSearchSettings<K extends WebSearchKind = WebSearchKind> = WebSearchSettingsByKind[K];
|
|
80
|
+
/**
|
|
81
|
+
* 这家(在这组设置下)的能力事实,给调用方写工具说明用。只依赖设置,不依赖「现在」——写进工具表的东西
|
|
82
|
+
* 相邻两轮必须一样。
|
|
83
|
+
*/
|
|
84
|
+
export interface WebSearchTraits {
|
|
85
|
+
/** 有读网页接口(MiniMax 没有)。 */
|
|
86
|
+
readsPages: boolean;
|
|
87
|
+
/** 一次最多返回几条;null = 没有比调用方更紧的上限。 */
|
|
88
|
+
maxResults: number | null;
|
|
89
|
+
/** 真能施加的过滤;不在里面的给了也会报回 `ignored`。 */
|
|
90
|
+
filters: readonly WebSearchFilter[];
|
|
91
|
+
/** 结果常不带链接(智谱 search_std,真机探针 2026-08-31):「把链接交给读网页」常走不通。 */
|
|
92
|
+
linksOftenMissing: boolean;
|
|
93
|
+
/** 读网页的正文里图片只以 `` 占位(Kimi),看不到图片内容。 */
|
|
94
|
+
pageImagesArePlaceholders: boolean;
|
|
95
|
+
}
|
|
96
|
+
export interface WebSearchAdapter<K extends WebSearchKind> {
|
|
97
|
+
readonly kind: K;
|
|
98
|
+
traits(settings: WebSearchSettings<K>): WebSearchTraits;
|
|
99
|
+
search(conn: WebSearchConnection, settings: WebSearchSettings<K>, input: WebSearchInput, signal: AbortSignal): Promise<WebSearchOutcome>;
|
|
100
|
+
/** 没有读网页接口的家(MiniMax)不实现,`traits().readsPages` 同步写 false(spec 钉着)。 */
|
|
101
|
+
readPage?(conn: WebSearchConnection, settings: WebSearchSettings<K>, input: {
|
|
102
|
+
url: string;
|
|
103
|
+
}, signal: AbortSignal): Promise<WebPageOutcome>;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 联网服务的上游失败(非 2xx / 网络错误 / 响应体不成形 / 2xx 里的业务错误)。中心自己报的错(没有可用 key、
|
|
107
|
+
* 接入方不许用这家……)不是这个,是 `ProviderClientError`。
|
|
108
|
+
*/
|
|
109
|
+
export declare class WebSearchUpstreamError extends Error {
|
|
110
|
+
readonly name = "WebSearchUpstreamError";
|
|
111
|
+
/** 上游业务错误码(智谱的 '1701' 并发超限、DeepSeek 的 error.code、Kimi 的 error.type),没有就是 null。 */
|
|
112
|
+
readonly code: string | null;
|
|
113
|
+
/** 这次失败值不值得重试。判据收在各适配器的抛出处,调用方只读这个标志,不解析消息文本。 */
|
|
114
|
+
readonly retryable: boolean;
|
|
115
|
+
constructor(reason: string, opts?: {
|
|
116
|
+
code?: string;
|
|
117
|
+
retryable?: boolean;
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web-search/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 联网搜索 / 读网页的厂商适配(从 agent-base `web-search/adapters` 搬来)。适配器只管「这家的请求长什么样、
|
|
3
|
+
* 响应怎么翻、哪些失败值得重试」;给模型看的工具说明是 APP 的事,适配器只交出事实(`WebSearchTraits`)。
|
|
4
|
+
*/
|
|
5
|
+
/** 时效过滤取值(缺省 = 不限时间)。各适配器自己翻成上游的写法。 */
|
|
6
|
+
export const WEB_SEARCH_RECENCIES = [
|
|
7
|
+
'oneDay',
|
|
8
|
+
'oneWeek',
|
|
9
|
+
'oneMonth',
|
|
10
|
+
'oneYear',
|
|
11
|
+
];
|
|
12
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
13
|
+
const RECENCY_DAYS = {
|
|
14
|
+
oneDay: 1,
|
|
15
|
+
oneWeek: 7,
|
|
16
|
+
oneMonth: 30,
|
|
17
|
+
oneYear: 365,
|
|
18
|
+
};
|
|
19
|
+
/** 「最近一段时间」的起始日期(UTC,YYYY-MM-DD)——上游只收日期的家(DeepSeek、Kimi 专业版)共用。 */
|
|
20
|
+
export function recencySince(recency, now) {
|
|
21
|
+
return utcDate(new Date(now.getTime() - RECENCY_DAYS[recency] * DAY_MS));
|
|
22
|
+
}
|
|
23
|
+
/** UTC 日期 YYYY-MM-DD。 */
|
|
24
|
+
export function utcDate(d) {
|
|
25
|
+
return d.toISOString().slice(0, 10);
|
|
26
|
+
}
|
|
27
|
+
/** 搜索的两项过滤。不是每家都支持(Kimi 基础版、MiniMax 都没有),不支持的由适配器报回 `ignored`。 */
|
|
28
|
+
export const WEB_SEARCH_FILTERS = ['recency', 'domain'];
|
|
29
|
+
/** 智谱的搜索档位(`search_engine`)。 */
|
|
30
|
+
export const ZHIPU_SEARCH_ENGINES = [
|
|
31
|
+
'search_std',
|
|
32
|
+
'search_pro',
|
|
33
|
+
'search_pro_sogou',
|
|
34
|
+
'search_pro_quark',
|
|
35
|
+
];
|
|
36
|
+
/** Kimi 搜索:基础版 `/search`、专业版 `/search_pro`。 */
|
|
37
|
+
export const KIMI_SEARCH_TIERS = ['basic', 'pro'];
|
|
38
|
+
export const WEB_SEARCH_KINDS = [
|
|
39
|
+
'deepseek',
|
|
40
|
+
'moonshotai',
|
|
41
|
+
'minimax',
|
|
42
|
+
'zhipu',
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* 联网服务的上游失败(非 2xx / 网络错误 / 响应体不成形 / 2xx 里的业务错误)。中心自己报的错(没有可用 key、
|
|
46
|
+
* 接入方不许用这家……)不是这个,是 `ProviderClientError`。
|
|
47
|
+
*/
|
|
48
|
+
export class WebSearchUpstreamError extends Error {
|
|
49
|
+
name = 'WebSearchUpstreamError';
|
|
50
|
+
/** 上游业务错误码(智谱的 '1701' 并发超限、DeepSeek 的 error.code、Kimi 的 error.type),没有就是 null。 */
|
|
51
|
+
code;
|
|
52
|
+
/** 这次失败值不值得重试。判据收在各适配器的抛出处,调用方只读这个标志,不解析消息文本。 */
|
|
53
|
+
retryable;
|
|
54
|
+
constructor(reason, opts = {}) {
|
|
55
|
+
super(reason);
|
|
56
|
+
this.code = opts.code ?? null;
|
|
57
|
+
this.retryable = opts.retryable ?? false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web-search/types.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,uCAAuC;AACvC,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,QAAQ;IACR,SAAS;IACT,UAAU;IACV,SAAS;CACD,CAAC;AAGX,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACnC,MAAM,YAAY,GAA+C;IAC/D,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,GAAG;CACb,CAAC;AAEF,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,OAAyB,EAAE,GAAS;IAC/D,OAAO,OAAO,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,OAAO,CAAC,CAAO;IAC7B,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAmBD,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAU,CAAC;AAgCjE,gCAAgC;AAChC,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,YAAY;IACZ,YAAY;IACZ,kBAAkB;IAClB,kBAAkB;CACV,CAAC;AAGX,+CAA+C;AAC/C,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,KAAK,CAAU,CAAC;AAc3D,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,YAAY;IACZ,SAAS;IACT,OAAO;CACoC,CAAC;AAuC9C;;;GAGG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC7B,IAAI,GAAG,wBAAwB,CAAC;IAClD,kFAAkF;IACzE,IAAI,CAAgB;IAC7B,iDAAiD;IACxC,SAAS,CAAU;IAE5B,YACE,MAAc,EACd,OAA+C,EAAE;QAEjD,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type WebPageOutcome, type WebSearchAdapter, type WebSearchConnection, type WebSearchInput, type WebSearchOutcome, type WebSearchSettings, type WebSearchTraits } from './types.js';
|
|
2
|
+
type Settings = WebSearchSettings<'zhipu'>;
|
|
3
|
+
/** 智谱「工具 API」:联网搜索(web_search)+ 网页阅读(reader)。 */
|
|
4
|
+
export declare class ZhipuWebSearchAdapter implements WebSearchAdapter<'zhipu'> {
|
|
5
|
+
readonly kind: "zhipu";
|
|
6
|
+
traits(settings: Settings): WebSearchTraits;
|
|
7
|
+
search(conn: WebSearchConnection, settings: Settings, input: WebSearchInput, signal: AbortSignal): Promise<WebSearchOutcome>;
|
|
8
|
+
readPage(conn: WebSearchConnection, _settings: Settings, input: {
|
|
9
|
+
url: string;
|
|
10
|
+
}, signal: AbortSignal): Promise<WebPageOutcome>;
|
|
11
|
+
private post;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=zhipu.adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zhipu.adapter.d.ts","sourceRoot":"","sources":["../../src/web-search/zhipu.adapter.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EAGrB,MAAM,YAAY,CAAC;AAgCpB,KAAK,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAE3C,iDAAiD;AACjD,qBAAa,qBAAsB,YAAW,gBAAgB,CAAC,OAAO,CAAC;IACrE,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAEjC,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe;IAYrC,MAAM,CACV,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,gBAAgB,CAAC;IAkCtB,QAAQ,CACZ,IAAI,EAAE,mBAAmB,EACzB,SAAS,EAAE,QAAQ,EACnB,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,EACtB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,cAAc,CAAC;YA6BZ,IAAI;CA0CnB"}
|