@qjp88995/provider-client 0.2.0 → 0.3.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/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- 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 +49 -0
- package/dist/provider-client.d.ts.map +1 -1
- package/dist/provider-client.js +129 -0
- package/dist/provider-client.js.map +1 -1
- package/dist/types.d.ts +5 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -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/index.ts +99 -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 +228 -1
- package/src/types.ts +10 -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,184 @@
|
|
|
1
|
+
import {
|
|
2
|
+
clip,
|
|
3
|
+
codeOf,
|
|
4
|
+
joinUrl,
|
|
5
|
+
parseErrorBody,
|
|
6
|
+
parseJson,
|
|
7
|
+
postJson,
|
|
8
|
+
} from './http.js';
|
|
9
|
+
import {
|
|
10
|
+
type WebPageOutcome,
|
|
11
|
+
type WebSearchAdapter,
|
|
12
|
+
type WebSearchConnection,
|
|
13
|
+
type WebSearchInput,
|
|
14
|
+
type WebSearchOutcome,
|
|
15
|
+
type WebSearchSettings,
|
|
16
|
+
type WebSearchTraits,
|
|
17
|
+
WebSearchUpstreamError,
|
|
18
|
+
type ZhipuSearchEngine,
|
|
19
|
+
} from './types.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 智谱工具 API 的根取自这家的 `web-search` 端点(`https://open.bigmodel.cn/api/paas/v4`),下挂 `/web_search`、`/reader`。
|
|
23
|
+
* 不从对话端点推:chat 根是 `/api/paas/v4`、responses 根是 `/api/v1`,从哪条推都是猜。
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** 不设档位时用高阶版(agent-base 的缺省)。 */
|
|
27
|
+
const DEFAULT_ENGINE: ZhipuSearchEngine = 'search_pro';
|
|
28
|
+
|
|
29
|
+
/** reader 让智谱侧抓取页面的预算(秒)——上游参数,不是本地超时。 */
|
|
30
|
+
const READER_FETCH_TIMEOUT_SECONDS = 20;
|
|
31
|
+
|
|
32
|
+
interface ZhipuSearchBody {
|
|
33
|
+
search_result?: {
|
|
34
|
+
title?: string;
|
|
35
|
+
link?: string;
|
|
36
|
+
content?: string;
|
|
37
|
+
media?: string;
|
|
38
|
+
publish_date?: string;
|
|
39
|
+
}[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface ZhipuReaderBody {
|
|
43
|
+
reader_result?: {
|
|
44
|
+
content?: string;
|
|
45
|
+
title?: string;
|
|
46
|
+
description?: string;
|
|
47
|
+
url?: string;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
type Settings = WebSearchSettings<'zhipu'>;
|
|
52
|
+
|
|
53
|
+
/** 智谱「工具 API」:联网搜索(web_search)+ 网页阅读(reader)。 */
|
|
54
|
+
export class ZhipuWebSearchAdapter implements WebSearchAdapter<'zhipu'> {
|
|
55
|
+
readonly kind = 'zhipu' as const;
|
|
56
|
+
|
|
57
|
+
traits(settings: Settings): WebSearchTraits {
|
|
58
|
+
return {
|
|
59
|
+
readsPages: true,
|
|
60
|
+
maxResults: null,
|
|
61
|
+
filters: ['recency', 'domain'],
|
|
62
|
+
// 真机探针(2026-08-31):search_std 常返回空 link,「把链接交给读网页」就走不通。
|
|
63
|
+
linksOftenMissing:
|
|
64
|
+
(settings.searchEngine ?? DEFAULT_ENGINE) === 'search_std',
|
|
65
|
+
pageImagesArePlaceholders: false,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async search(
|
|
70
|
+
conn: WebSearchConnection,
|
|
71
|
+
settings: Settings,
|
|
72
|
+
input: WebSearchInput,
|
|
73
|
+
signal: AbortSignal
|
|
74
|
+
): Promise<WebSearchOutcome> {
|
|
75
|
+
const engine = settings.searchEngine ?? DEFAULT_ENGINE;
|
|
76
|
+
const body: Record<string, unknown> = {
|
|
77
|
+
search_query: input.query,
|
|
78
|
+
search_engine: engine,
|
|
79
|
+
// 意图识别用不上:调用方(模型)自己就是意图层,开了只多花一份钱。
|
|
80
|
+
search_intent: false,
|
|
81
|
+
...(input.count !== undefined ? { count: input.count } : {}),
|
|
82
|
+
...(input.recency ? { search_recency_filter: input.recency } : {}),
|
|
83
|
+
...(input.domain ? { search_domain_filter: input.domain } : {}),
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
let data: ZhipuSearchBody;
|
|
87
|
+
try {
|
|
88
|
+
data = await this.post<ZhipuSearchBody>('web_search', conn, body, signal);
|
|
89
|
+
} catch (err) {
|
|
90
|
+
// 1703 = 搜索引擎没返回有效数据。这是「零结果」不是「上游坏了」——报成
|
|
91
|
+
// 错误会让模型把一次正常的空搜索当成故障去重试,而它该做的是换关键词。
|
|
92
|
+
if (err instanceof WebSearchUpstreamError && err.code === '1703') {
|
|
93
|
+
return { engine, items: [] };
|
|
94
|
+
}
|
|
95
|
+
throw err;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const items = (data.search_result ?? []).map(r => ({
|
|
99
|
+
title: r.title ?? '',
|
|
100
|
+
link: r.link ?? '',
|
|
101
|
+
content: r.content ?? '',
|
|
102
|
+
media: r.media || null,
|
|
103
|
+
publishDate: r.publish_date || null,
|
|
104
|
+
}));
|
|
105
|
+
return { engine, items };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async readPage(
|
|
109
|
+
conn: WebSearchConnection,
|
|
110
|
+
_settings: Settings,
|
|
111
|
+
input: { url: string },
|
|
112
|
+
signal: AbortSignal
|
|
113
|
+
): Promise<WebPageOutcome> {
|
|
114
|
+
const data = await this.post<ZhipuReaderBody>(
|
|
115
|
+
'reader',
|
|
116
|
+
conn,
|
|
117
|
+
{
|
|
118
|
+
url: input.url,
|
|
119
|
+
return_format: 'markdown',
|
|
120
|
+
// 剥掉图片:远程图片链接模型看不了(ViewImage 只读工作空间),留着
|
|
121
|
+
// 只是往上下文里灌一堆没用的长 URL。
|
|
122
|
+
retain_images: false,
|
|
123
|
+
timeout: READER_FETCH_TIMEOUT_SECONDS,
|
|
124
|
+
},
|
|
125
|
+
signal
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
const r = data.reader_result;
|
|
129
|
+
if (!r || typeof r.content !== 'string') {
|
|
130
|
+
throw new WebSearchUpstreamError(
|
|
131
|
+
'zhipu reader 响应缺少 reader_result.content'
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
return {
|
|
135
|
+
url: r.url || input.url,
|
|
136
|
+
title: r.title || null,
|
|
137
|
+
description: r.description || null,
|
|
138
|
+
content: r.content,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
private async post<T>(
|
|
143
|
+
path: 'web_search' | 'reader',
|
|
144
|
+
conn: WebSearchConnection,
|
|
145
|
+
body: Record<string, unknown>,
|
|
146
|
+
signal: AbortSignal
|
|
147
|
+
): Promise<T> {
|
|
148
|
+
const label = `zhipu ${path}`;
|
|
149
|
+
const res = await postJson(
|
|
150
|
+
label,
|
|
151
|
+
joinUrl(conn.baseUrl, path),
|
|
152
|
+
conn,
|
|
153
|
+
body,
|
|
154
|
+
signal
|
|
155
|
+
);
|
|
156
|
+
if (!res.ok) {
|
|
157
|
+
const parsed = parseErrorBody(res.text);
|
|
158
|
+
const detail = parsed.message ?? clip(res.text);
|
|
159
|
+
throw new WebSearchUpstreamError(
|
|
160
|
+
`${label} ${res.status}${detail ? `: ${detail}` : ''}`,
|
|
161
|
+
{
|
|
162
|
+
code: parsed.code,
|
|
163
|
+
retryable:
|
|
164
|
+
res.status >= 500 || res.status === 429 || parsed.code === '1701',
|
|
165
|
+
}
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const json = parseJson<unknown>(label, res.text);
|
|
170
|
+
// 智谱部分接口会用 200 + error 体报业务错误,别把它当成功往下传。
|
|
171
|
+
const errBody = (json as { error?: { code?: unknown; message?: unknown } })
|
|
172
|
+
.error;
|
|
173
|
+
if (errBody) {
|
|
174
|
+
const code = codeOf(errBody.code);
|
|
175
|
+
throw new WebSearchUpstreamError(
|
|
176
|
+
`${label} 业务错误${code ? ` ${code}` : ''}:${
|
|
177
|
+
typeof errBody.message === 'string' ? errBody.message : clip(res.text)
|
|
178
|
+
}`,
|
|
179
|
+
{ code, retryable: code === '1701' }
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
return json as T;
|
|
183
|
+
}
|
|
184
|
+
}
|