@qjp88995/provider-client 0.1.1 → 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.
Files changed (125) hide show
  1. package/dist/direct-resolver.d.ts.map +1 -1
  2. package/dist/direct-resolver.js +2 -0
  3. package/dist/direct-resolver.js.map +1 -1
  4. package/dist/index.d.ts +5 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +4 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/justone/client.d.ts +101 -0
  9. package/dist/justone/client.d.ts.map +1 -0
  10. package/dist/justone/client.js +272 -0
  11. package/dist/justone/client.js.map +1 -0
  12. package/dist/justone/endpoint-spec.d.ts +49 -0
  13. package/dist/justone/endpoint-spec.d.ts.map +1 -0
  14. package/dist/justone/endpoint-spec.js +2 -0
  15. package/dist/justone/endpoint-spec.js.map +1 -0
  16. package/dist/justone/endpoints.generated.d.ts +7927 -0
  17. package/dist/justone/endpoints.generated.d.ts.map +1 -0
  18. package/dist/justone/endpoints.generated.js +8508 -0
  19. package/dist/justone/endpoints.generated.js.map +1 -0
  20. package/dist/justone/errors.d.ts +52 -0
  21. package/dist/justone/errors.d.ts.map +1 -0
  22. package/dist/justone/errors.js +73 -0
  23. package/dist/justone/errors.js.map +1 -0
  24. package/dist/justone/index.d.ts +8 -0
  25. package/dist/justone/index.d.ts.map +1 -0
  26. package/dist/justone/index.js +7 -0
  27. package/dist/justone/index.js.map +1 -0
  28. package/dist/justone/params.d.ts +17 -0
  29. package/dist/justone/params.d.ts.map +1 -0
  30. package/dist/justone/params.js +72 -0
  31. package/dist/justone/params.js.map +1 -0
  32. package/dist/justone/pricing.d.ts +6 -0
  33. package/dist/justone/pricing.d.ts.map +1 -0
  34. package/dist/justone/pricing.generated.d.ts +303 -0
  35. package/dist/justone/pricing.generated.d.ts.map +1 -0
  36. package/dist/justone/pricing.generated.js +305 -0
  37. package/dist/justone/pricing.generated.js.map +1 -0
  38. package/dist/justone/pricing.js +11 -0
  39. package/dist/justone/pricing.js.map +1 -0
  40. package/dist/media/bibigpt.adapter.d.ts +43 -0
  41. package/dist/media/bibigpt.adapter.d.ts.map +1 -0
  42. package/dist/media/bibigpt.adapter.js +302 -0
  43. package/dist/media/bibigpt.adapter.js.map +1 -0
  44. package/dist/media/http.d.ts +21 -0
  45. package/dist/media/http.d.ts.map +1 -0
  46. package/dist/media/http.js +39 -0
  47. package/dist/media/http.js.map +1 -0
  48. package/dist/media/index.d.ts +44 -0
  49. package/dist/media/index.d.ts.map +1 -0
  50. package/dist/media/index.js +47 -0
  51. package/dist/media/index.js.map +1 -0
  52. package/dist/media/types.d.ts +207 -0
  53. package/dist/media/types.d.ts.map +1 -0
  54. package/dist/media/types.js +21 -0
  55. package/dist/media/types.js.map +1 -0
  56. package/dist/media/zhipu-parser-package.d.ts +37 -0
  57. package/dist/media/zhipu-parser-package.d.ts.map +1 -0
  58. package/dist/media/zhipu-parser-package.js +108 -0
  59. package/dist/media/zhipu-parser-package.js.map +1 -0
  60. package/dist/media/zhipu.adapter.d.ts +37 -0
  61. package/dist/media/zhipu.adapter.d.ts.map +1 -0
  62. package/dist/media/zhipu.adapter.js +361 -0
  63. package/dist/media/zhipu.adapter.js.map +1 -0
  64. package/dist/provider-client.d.ts +65 -0
  65. package/dist/provider-client.d.ts.map +1 -1
  66. package/dist/provider-client.js +151 -0
  67. package/dist/provider-client.js.map +1 -1
  68. package/dist/types.d.ts +15 -4
  69. package/dist/types.d.ts.map +1 -1
  70. package/dist/types.js +16 -1
  71. package/dist/types.js.map +1 -1
  72. package/dist/web-search/deepseek.adapter.d.ts +19 -0
  73. package/dist/web-search/deepseek.adapter.d.ts.map +1 -0
  74. package/dist/web-search/deepseek.adapter.js +82 -0
  75. package/dist/web-search/deepseek.adapter.js.map +1 -0
  76. package/dist/web-search/http.d.ts +28 -0
  77. package/dist/web-search/http.d.ts.map +1 -0
  78. package/dist/web-search/http.js +95 -0
  79. package/dist/web-search/http.js.map +1 -0
  80. package/dist/web-search/index.d.ts +27 -0
  81. package/dist/web-search/index.d.ts.map +1 -0
  82. package/dist/web-search/index.js +36 -0
  83. package/dist/web-search/index.js.map +1 -0
  84. package/dist/web-search/minimax.adapter.d.ts +13 -0
  85. package/dist/web-search/minimax.adapter.d.ts.map +1 -0
  86. package/dist/web-search/minimax.adapter.js +82 -0
  87. package/dist/web-search/minimax.adapter.js.map +1 -0
  88. package/dist/web-search/moonshotai.adapter.d.ts +19 -0
  89. package/dist/web-search/moonshotai.adapter.d.ts.map +1 -0
  90. package/dist/web-search/moonshotai.adapter.js +151 -0
  91. package/dist/web-search/moonshotai.adapter.js.map +1 -0
  92. package/dist/web-search/types.d.ts +120 -0
  93. package/dist/web-search/types.d.ts.map +1 -0
  94. package/dist/web-search/types.js +60 -0
  95. package/dist/web-search/types.js.map +1 -0
  96. package/dist/web-search/zhipu.adapter.d.ts +14 -0
  97. package/dist/web-search/zhipu.adapter.d.ts.map +1 -0
  98. package/dist/web-search/zhipu.adapter.js +98 -0
  99. package/dist/web-search/zhipu.adapter.js.map +1 -0
  100. package/package.json +4 -3
  101. package/src/direct-resolver.ts +2 -0
  102. package/src/index.ts +104 -0
  103. package/src/justone/client.ts +462 -0
  104. package/src/justone/endpoint-spec.ts +66 -0
  105. package/src/justone/endpoints.generated.ts +9258 -0
  106. package/src/justone/errors.ts +97 -0
  107. package/src/justone/index.ts +34 -0
  108. package/src/justone/params.ts +91 -0
  109. package/src/justone/pricing.generated.ts +308 -0
  110. package/src/justone/pricing.ts +11 -0
  111. package/src/media/bibigpt.adapter.ts +372 -0
  112. package/src/media/http.ts +43 -0
  113. package/src/media/index.ts +114 -0
  114. package/src/media/types.ts +233 -0
  115. package/src/media/zhipu-parser-package.ts +149 -0
  116. package/src/media/zhipu.adapter.ts +510 -0
  117. package/src/provider-client.ts +268 -1
  118. package/src/types.ts +23 -2
  119. package/src/web-search/deepseek.adapter.ts +149 -0
  120. package/src/web-search/http.ts +108 -0
  121. package/src/web-search/index.ts +70 -0
  122. package/src/web-search/minimax.adapter.ts +148 -0
  123. package/src/web-search/moonshotai.adapter.ts +228 -0
  124. package/src/web-search/types.ts +172 -0
  125. package/src/web-search/zhipu.adapter.ts +184 -0
@@ -0,0 +1,207 @@
1
+ import type { VendorFetch } from '../vendors/index.js';
2
+ /**
3
+ * 媒体解析的厂商适配(从 agent-base `media/adapters` 搬来)。适配器只管「这家的请求长什么样、响应怎么翻、
4
+ * 哪些失败值得重试」,外加只有它知道的两件事:哪些设置决定产出(缓存键)、这家单次收多大的文件。
5
+ * 物化图片到存储、解析缓存、审计与花费是 APP 的事。
6
+ */
7
+ /** `audio` 语音转写;`file` 文件解析;`video-link` 按链接解析在线视频。 */
8
+ export declare const MEDIA_CAPABILITIES: readonly ["audio", "file", "video-link"];
9
+ export type MediaCapability = (typeof MEDIA_CAPABILITIES)[number];
10
+ /** 要解析的东西:一个可直接下载的地址(不经中心、不带厂商鉴权),或现成的字节。 */
11
+ export type MediaInput = {
12
+ kind: 'url';
13
+ url: string;
14
+ } | {
15
+ kind: 'bytes';
16
+ bytes: Uint8Array;
17
+ mediaType: string;
18
+ };
19
+ export interface TokenUsage {
20
+ input?: number;
21
+ output?: number;
22
+ total?: number;
23
+ }
24
+ export interface AudioRequest {
25
+ input: MediaInput;
26
+ /** 语言提示;`auto` 或缺省 = 让厂商自己判断。 */
27
+ languageHint?: string;
28
+ durationHintMs?: number;
29
+ signal?: AbortSignal;
30
+ }
31
+ export interface AudioOutcome {
32
+ text: string;
33
+ rawResponse: unknown;
34
+ audioDurationMs?: number;
35
+ language?: string;
36
+ segments?: Array<{
37
+ start: number;
38
+ end: number;
39
+ text: string;
40
+ }>;
41
+ tokensUsed?: TokenUsage;
42
+ vendorExtra?: Record<string, unknown>;
43
+ }
44
+ export interface FileRequest {
45
+ input: MediaInput;
46
+ /** 异步任务的轮询预算(毫秒);缺省用设置里的值。 */
47
+ maxWaitMs?: number;
48
+ signal?: AbortSignal;
49
+ }
50
+ /**
51
+ * 厂商交回来的**一张原始图片**:字节 + 它在 `markdown` 里被引用的写法。存进哪里、把 `ref` 换成什么地址是 APP 的事
52
+ * (厂商的链接会过期,进缓存之前必须先物化)。
53
+ */
54
+ export interface ParsedImage {
55
+ /** markdown 里引用它的原始路径,逐字(智谱:`images/<md5>-image.png`)。 */
56
+ ref: string;
57
+ bytes: Uint8Array;
58
+ /** 完整子类型(`image/png`)。 */
59
+ mediaType: string;
60
+ /** 1 基页码;厂商没给就缺席。 */
61
+ page?: number;
62
+ }
63
+ export interface FileOutcome {
64
+ text: string;
65
+ markdown: string;
66
+ rawResponse: unknown;
67
+ pageCount?: number;
68
+ tokensUsed?: TokenUsage;
69
+ vendorExtra?: Record<string, unknown>;
70
+ /** 文档里的图片。缺席 = 这一档 / 这家不产出图片(智谱 lite),与「有图但一张没抠出来」(空数组)不同。 */
71
+ images?: ParsedImage[];
72
+ /**
73
+ * 非空 = **结果不完整**,一句给人看的原因:正文是好的,但本该有的图片没拿到(结果包下载失败、解不开……)。
74
+ * 调用方据此**别缓存**——缓存一份缺图的结果等于把一次瞬时故障固化成永久答案——并把这句话带给用户 / 模型。
75
+ */
76
+ degraded?: string;
77
+ }
78
+ export interface VideoLinkRequest {
79
+ /** 在线视频作品页的链接(已从分享文本里抽出来)。 */
80
+ url: string;
81
+ /** 取消信号:工具超时 / 用户停止时中断还在等的请求。 */
82
+ signal?: AbortSignal;
83
+ }
84
+ /** 一句字幕。时间单位是秒。 */
85
+ export interface VideoLinkSubtitle {
86
+ start: number;
87
+ end: number;
88
+ text: string;
89
+ /** 厂商分出来的说话人编号;没分就缺席。 */
90
+ speaker?: number;
91
+ }
92
+ export interface VideoLinkChapter {
93
+ start: number;
94
+ end: number;
95
+ title: string;
96
+ summary: string;
97
+ }
98
+ /**
99
+ * 按链接解析一条在线视频的产出。除 `subtitles` 外的内容块都可能缺席——厂商某一步失败时写进 `missing`,
100
+ * 而不是让整次调用失败:字幕和元数据是主体,总结 / 原文细读是附加的。
101
+ */
102
+ export interface VideoLinkOutcome {
103
+ title: string;
104
+ author?: string;
105
+ durationSec?: number;
106
+ /** ISO 时间;厂商没给就缺席。 */
107
+ publishedAt?: string;
108
+ /** 作品正文(小红书笔记正文、话题标签……),品牌名的准确写法常在这里。 */
109
+ description?: string;
110
+ subtitles: VideoLinkSubtitle[];
111
+ /** 全文总结(markdown,时间戳写成 `[mm:ss]`)。 */
112
+ summaryMarkdown?: string;
113
+ /** 章节总览(一段话)。 */
114
+ chapterOverview?: string;
115
+ chapters: VideoLinkChapter[];
116
+ /** 原文细读(按章节整理过的字幕,markdown)。 */
117
+ polishedMarkdown?: string;
118
+ /** 缺席内容块 → 一句给人看的原因。 */
119
+ missing: Partial<Record<'summary' | 'chapters' | 'polished', string>>;
120
+ /** 本次扣费与余额(秒);厂商没给就缺席。 */
121
+ billing?: {
122
+ chargedSeconds?: number;
123
+ remainingSeconds?: number;
124
+ };
125
+ rawResponse: unknown;
126
+ }
127
+ /** 传给 `cacheKeyParts` 的调用参数——各能力参数的并集,适配器只挑自己关心的。 */
128
+ export interface CacheKeyOpts {
129
+ languageHint?: string;
130
+ durationHintMs?: number;
131
+ maxWaitMs?: number;
132
+ }
133
+ /**
134
+ * 传给 `maxUploadBytes` 的提示:这次要送的是什么类型的文件。厂商的上限常按格式细分(智谱 prime 档 PDF 100MB、
135
+ * 表格只有 10MB)。`null` = 调用方也不知道类型,此时返回该能力的最小值。
136
+ */
137
+ export interface UploadLimitHint {
138
+ mediaType: string | null;
139
+ }
140
+ /**
141
+ * 调一次上游要的东西。
142
+ * - `baseUrl`:这家媒体端点的根(智谱是 `media` 端点,BibiGPT 是它唯一的 `http` 端点)。
143
+ * - `openTask()`:**每次调用(一个任务)取一个新的** fetch,这次调用里建任务、轮询、取结果都用它。中心模式下它记住
144
+ * 第一条请求落在哪把 key 上,之后的请求钉在那把上(任务属于那个账号,换 key 就查不到);直连模式就是同一个 fetch。
145
+ * - `download`:下载不属于厂商 API 的地址(`kind: 'url'` 的输入、智谱的结果包),不经中心、不带鉴权;缺省全局 fetch。
146
+ * - `apiKey`:只有直连模式给,适配器以 Bearer 发出;中心模式由中心注入。
147
+ */
148
+ export interface MediaConnection {
149
+ baseUrl: string;
150
+ openTask(): VendorFetch;
151
+ download?: VendorFetch;
152
+ apiKey?: string;
153
+ }
154
+ /** 智谱文件解析档位:lite 只有正文;expert 只吃 PDF、带图片;prime 全格式、带图片。 */
155
+ export declare const ZHIPU_FILE_TOOL_TYPES: readonly ["lite", "expert", "prime"];
156
+ export type ZhipuFileToolType = (typeof ZHIPU_FILE_TOOL_TYPES)[number];
157
+ /**
158
+ * 各家的设置(APP 存、调用时传;缺省值见各适配器)。**地址不是设置**:取自目录里这家的端点。
159
+ * 智谱的形状照 agent-base 的配置(去掉 `baseUrl`),存量配置可以原样传。
160
+ */
161
+ export interface MediaSettingsByKind {
162
+ zhipu: {
163
+ audio?: {
164
+ model?: string;
165
+ };
166
+ file?: {
167
+ toolType?: ZhipuFileToolType;
168
+ defaultMaxWaitMs?: number;
169
+ };
170
+ };
171
+ bibigpt: Record<string, never>;
172
+ }
173
+ export type MediaKind = keyof MediaSettingsByKind;
174
+ export declare const MEDIA_KINDS: readonly ["zhipu", "bibigpt"];
175
+ export type MediaSettings<K extends MediaKind = MediaKind> = MediaSettingsByKind[K];
176
+ /**
177
+ * 方法在不在 = 支不支持这项能力(`capabilities` 与之一致,spec 钉着)。
178
+ */
179
+ export interface MediaAdapter<K extends MediaKind> {
180
+ readonly kind: K;
181
+ /** 这家的媒体请求走哪条端点:借 LLM key 的家是 `media`,自成一家的是 `http`。 */
182
+ readonly endpointProtocol: 'media' | 'http';
183
+ readonly capabilities: readonly MediaCapability[];
184
+ transcribeAudio?(conn: MediaConnection, settings: MediaSettings<K>, req: AudioRequest): Promise<AudioOutcome>;
185
+ parseFile?(conn: MediaConnection, settings: MediaSettings<K>, req: FileRequest): Promise<FileOutcome>;
186
+ fetchVideoLink?(conn: MediaConnection, settings: MediaSettings<K>, req: VideoLinkRequest): Promise<VideoLinkOutcome>;
187
+ /**
188
+ * 「这次调用的产出由哪些东西决定」,给调用方算解析缓存的键。`null` = **不可缓存**。只有适配器知道设置里哪些字段
189
+ * 换了会换来不同的产出(智谱的文件档位会,轮询预算不会)。
190
+ * - 绝不放密钥类字段(调用方可能明文落库供排查)。
191
+ * - 不认识的能力一律 null(fail-closed);生成式产出(视频总结)不缓存。
192
+ */
193
+ cacheKeyParts(capability: MediaCapability, settings: MediaSettings<K>, opts: CacheKeyOpts): Record<string, unknown> | null;
194
+ /**
195
+ * 这家此能力单次最多收多大的文件(字节),按厂商文档抄数;`null` = 无声明,调用方只按自己的内存保护顶兜底。
196
+ * 文档只写「MB」没写清进制时按十进制取下界。
197
+ */
198
+ maxUploadBytes(capability: MediaCapability, settings: MediaSettings<K>, hint: UploadLimitHint): number | null;
199
+ }
200
+ /**
201
+ * 媒体厂商的上游失败(非 2xx、厂商说失败了、响应不成形、连不上……)。中心自己报的错(没有可用 key、
202
+ * 接入方不许用这家、钉住的 key 不可用……)不是这个,是 `ProviderClientError`。
203
+ */
204
+ export declare class MediaUpstreamError extends Error {
205
+ readonly name: string;
206
+ }
207
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * 媒体解析的厂商适配(从 agent-base `media/adapters` 搬来)。适配器只管「这家的请求长什么样、响应怎么翻、
3
+ * 哪些失败值得重试」,外加只有它知道的两件事:哪些设置决定产出(缓存键)、这家单次收多大的文件。
4
+ * 物化图片到存储、解析缓存、审计与花费是 APP 的事。
5
+ */
6
+ /** `audio` 语音转写;`file` 文件解析;`video-link` 按链接解析在线视频。 */
7
+ export const MEDIA_CAPABILITIES = ['audio', 'file', 'video-link'];
8
+ /** 智谱文件解析档位:lite 只有正文;expert 只吃 PDF、带图片;prime 全格式、带图片。 */
9
+ export const ZHIPU_FILE_TOOL_TYPES = ['lite', 'expert', 'prime'];
10
+ export const MEDIA_KINDS = [
11
+ 'zhipu',
12
+ 'bibigpt',
13
+ ];
14
+ /**
15
+ * 媒体厂商的上游失败(非 2xx、厂商说失败了、响应不成形、连不上……)。中心自己报的错(没有可用 key、
16
+ * 接入方不许用这家、钉住的 key 不可用……)不是这个,是 `ProviderClientError`。
17
+ */
18
+ export class MediaUpstreamError extends Error {
19
+ name = 'MediaUpstreamError';
20
+ }
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/media/types.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,uDAAuD;AACvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAU,CAAC;AAqJ3E,0DAA0D;AAC1D,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAU,CAAC;AAe1E,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,OAAO;IACP,SAAS;CAC8B,CAAC;AAiD1C;;;GAGG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACzB,IAAI,GAAW,oBAAoB,CAAC;CACvD"}
@@ -0,0 +1,37 @@
1
+ import type { ParsedImage } from './types.js';
2
+ /**
3
+ * 智谱文件解析 `download_link` 结果包(zip)的读法。
4
+ *
5
+ * **文档只写了「图片 + Markdown + 版面 JSON」,目录结构与引图方式全部来自
6
+ * 2026-09-07 的探针**(三档各跑一遍真文件,判据记在 agent-base 的 providers.md):
7
+ *
8
+ * - prime(异步):`<hash>/<hash>_md_full.md` + `<hash>/<hash>_ocr_page<N>.json`
9
+ * (每页一份,`PageNumber` **0 基**)+ `<hash>/images/<md5>-image.png`;
10
+ * - prime-sync:同上但**没有** `<hash>/` 这层目录;
11
+ * - expert:`result.md` + `images/<P>_<x>_<y>_<w>_<h>_0.jpg`,没有页 JSON,
12
+ * 页码只能从文件名前缀 `<P>` 取(0 基,与 prime 页 JSON 对过同一份 PDF);
13
+ * - lite:只有 `result.md`,没有图片目录。
14
+ *
15
+ * 三档的 markdown 都用 `![](images/<name>)` 引图,路径**相对 md 所在目录**。
16
+ * 所以这里不按目录名硬编码:md 是包里唯一的 `.md` 条目,图片按 md 里的引用
17
+ * 去解析,页 JSON 按后缀认。布局变了,最先坏的是「找不到 md」这条响亮的错,
18
+ * 而不是静默少图。
19
+ */
20
+ export interface ParsedPackage {
21
+ markdown: string;
22
+ images: ParsedImage[];
23
+ /** prime 有页 JSON 时给(= 页 JSON 份数);其余档缺席。 */
24
+ pageCount?: number;
25
+ /** markdown 引用了、包里却没有的图片(排查用;正常为空)。 */
26
+ missingRefs: string[];
27
+ }
28
+ export declare function parseParserPackage(zip: Uint8Array): ParsedPackage;
29
+ /**
30
+ * expert 档的图片名 `<P>_<x>_<y>_<w>_<h>_0.jpg`:`P` 是 0 基页码。**只在
31
+ * 五段数字都在时才信**——prime 的 `<md5>-image.png` 不会匹配,其它未知命名
32
+ * 也不会被误读成页码。
33
+ */
34
+ export declare function pageFromExpertName(ref: string): number | undefined;
35
+ /** markdown 里引用了哪些图片,按首次出现顺序去重。 */
36
+ export declare function collectImageRefs(markdown: string): string[];
37
+ //# sourceMappingURL=zhipu-parser-package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zhipu-parser-package.d.ts","sourceRoot":"","sources":["../../src/media/zhipu-parser-package.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAeD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,GAAG,aAAa,CA+DjE;AAgBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIlE;AAQD,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAO3D"}
@@ -0,0 +1,108 @@
1
+ import { unzipSync } from 'fflate';
2
+ const UTF8 = new TextDecoder();
3
+ const PAGE_JSON_RE = /_ocr_page(\d+)\.json$/;
4
+ const MEDIA_TYPE_BY_EXT = {
5
+ png: 'image/png',
6
+ jpg: 'image/jpeg',
7
+ jpeg: 'image/jpeg',
8
+ gif: 'image/gif',
9
+ webp: 'image/webp',
10
+ bmp: 'image/bmp',
11
+ };
12
+ export function parseParserPackage(zip) {
13
+ const entries = unzipSync(zip);
14
+ const names = Object.keys(entries).filter(n => !n.endsWith('/'));
15
+ const mdNames = names.filter(n => /\.md$/i.test(n));
16
+ if (mdNames.length !== 1) {
17
+ throw new Error(`结果包里应有且只有一个 .md 文件,实际 ${mdNames.length} 个:` +
18
+ `${mdNames.join(', ') || '(无)'};全部条目:${names.slice(0, 20).join(', ')}`);
19
+ }
20
+ const mdName = mdNames[0];
21
+ const mdDir = mdName.slice(0, mdName.lastIndexOf('/') + 1);
22
+ const markdown = UTF8.decode(entries[mdName]);
23
+ // 页码:prime 的页 JSON 里 `Elements[].ImagePath` 指向 `images/<name>`,
24
+ // `PageNumber` 0 基。递归走 `Elements`(表格里的图挂在 table 元素下)。
25
+ const pageByRef = new Map();
26
+ let pageJsonCount = 0;
27
+ for (const n of names) {
28
+ if (!PAGE_JSON_RE.test(n))
29
+ continue;
30
+ pageJsonCount += 1;
31
+ let page;
32
+ try {
33
+ page = JSON.parse(UTF8.decode(entries[n]));
34
+ }
35
+ catch {
36
+ continue; // 一页 JSON 坏了只是少了页码,不该让整包失败。
37
+ }
38
+ const pageNumber = page.PageNumber;
39
+ if (typeof pageNumber !== 'number')
40
+ continue;
41
+ walkElements(page.Elements, el => {
42
+ const ref = el.ImagePath;
43
+ if (typeof ref === 'string' && ref !== '' && !pageByRef.has(ref)) {
44
+ pageByRef.set(ref, pageNumber + 1);
45
+ }
46
+ });
47
+ }
48
+ const images = [];
49
+ const missingRefs = [];
50
+ for (const ref of collectImageRefs(markdown)) {
51
+ const entryName = mdDir + ref;
52
+ const bytes = entries[entryName];
53
+ if (!bytes) {
54
+ missingRefs.push(ref);
55
+ continue;
56
+ }
57
+ const ext = ref.slice(ref.lastIndexOf('.') + 1).toLowerCase();
58
+ const page = pageByRef.get(ref) ?? pageFromExpertName(ref);
59
+ images.push({
60
+ ref,
61
+ bytes,
62
+ mediaType: MEDIA_TYPE_BY_EXT[ext] ?? 'application/octet-stream',
63
+ ...(page !== undefined ? { page } : {}),
64
+ });
65
+ }
66
+ return {
67
+ markdown,
68
+ images,
69
+ ...(pageJsonCount > 0 ? { pageCount: pageJsonCount } : {}),
70
+ missingRefs,
71
+ };
72
+ }
73
+ function walkElements(els, visit) {
74
+ if (!Array.isArray(els))
75
+ return;
76
+ for (const el of els) {
77
+ if (!el || typeof el !== 'object')
78
+ continue;
79
+ visit(el);
80
+ walkElements(el.Elements, visit);
81
+ }
82
+ }
83
+ /**
84
+ * expert 档的图片名 `<P>_<x>_<y>_<w>_<h>_0.jpg`:`P` 是 0 基页码。**只在
85
+ * 五段数字都在时才信**——prime 的 `<md5>-image.png` 不会匹配,其它未知命名
86
+ * 也不会被误读成页码。
87
+ */
88
+ export function pageFromExpertName(ref) {
89
+ const base = ref.slice(ref.lastIndexOf('/') + 1);
90
+ const m = /^(\d+)_\d+_\d+_\d+_\d+_\d+\./.exec(base);
91
+ return m ? Number(m[1]) + 1 : undefined;
92
+ }
93
+ /**
94
+ * markdown 图片语法 `![alt](url "title")` 的 URL 段。智谱三档产物都用它引图(探针 2026-09-07)。
95
+ * 与 agent-base `parsed-images.ts` 的同名正则一致(APP 改写引用时用它自己的那份)。
96
+ */
97
+ const IMAGE_REF_RE = /(!\[[^\]]*\]\()([^)\s]+)((?:\s+"[^"]*")?\))/g;
98
+ /** markdown 里引用了哪些图片,按首次出现顺序去重。 */
99
+ export function collectImageRefs(markdown) {
100
+ const seen = new Set();
101
+ for (const m of markdown.matchAll(IMAGE_REF_RE)) {
102
+ const ref = m[2];
103
+ if (ref !== undefined && !seen.has(ref))
104
+ seen.add(ref);
105
+ }
106
+ return [...seen];
107
+ }
108
+ //# sourceMappingURL=zhipu-parser-package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zhipu-parser-package.js","sourceRoot":"","sources":["../../src/media/zhipu-parser-package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AA+BnC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/B,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C,MAAM,iBAAiB,GAA2B;IAChD,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;CACjB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,GAAe;IAChD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAEjE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,yBAAyB,OAAO,CAAC,MAAM,KAAK;YAC1C,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAE9C,gEAAgE;IAChE,sDAAsD;IACtD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,SAAS;QACpC,aAAa,IAAI,CAAC,CAAC;QACnB,IAAI,IAAa,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,CAAC,4BAA4B;QACxC,CAAC;QACD,MAAM,UAAU,GAAI,IAAiC,CAAC,UAAU,CAAC;QACjE,IAAI,OAAO,UAAU,KAAK,QAAQ;YAAE,SAAS;QAC7C,YAAY,CAAE,IAA+B,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YAC3D,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC;YACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjE,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;YACrC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,SAAS,GAAG,KAAK,GAAG,GAAG,CAAC;QAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,SAAS;QACX,CAAC;QACD,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC;YACV,GAAG;YACH,KAAK;YACL,SAAS,EAAE,iBAAiB,CAAC,GAAG,CAAC,IAAI,0BAA0B;YAC/D,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,QAAQ;QACR,MAAM;QACN,GAAG,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,WAAW;KACZ,CAAC;AACJ,CAAC;AAOD,SAAS,YAAY,CAAC,GAAY,EAAE,KAAgC;IAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO;IAChC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,SAAS;QAC5C,KAAK,CAAC,EAAiB,CAAC,CAAC;QACzB,YAAY,CAAE,EAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,CAAC,GAAG,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,MAAM,YAAY,GAAG,8CAA8C,CAAC;AAEpE,mCAAmC;AACnC,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACjB,IAAI,GAAG,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type AudioOutcome, type AudioRequest, type CacheKeyOpts, type FileOutcome, type FileRequest, type MediaAdapter, type MediaCapability, type MediaConnection, type MediaSettings, type UploadLimitHint } from './types.js';
2
+ /**
3
+ * 智谱 BigModel 的文件解析与语音转写(agent-base 里叫 `bigmodel`),借智谱 LLM 的 key。根取自这家的 `media` 端点
4
+ * (`https://open.bigmodel.cn/api/paas/v4`),下挂 `/audio/transcriptions`、`/files/parser/…`。
5
+ */
6
+ type Settings = MediaSettings<'zhipu'>;
7
+ /**
8
+ * MIME → 上传时给厂商的文件扩展名。别处若另有一张「收得下哪些格式」的表,它必须是本表的子集——两张表漂了的表现是
9
+ * 「上游收得下的格式,适配器造不出正确的文件名」,是静默的错误。
10
+ */
11
+ export declare const ZHIPU_MIME_TO_EXT: Readonly<Record<string, string>>;
12
+ /**
13
+ * 各上限**逐字来自厂商文档**,改前先核对(数字过时的表现是静默的:要么白传被拒、要么把能解析的文件挡在门外):
14
+ * - 文件解析 https://docs.bigmodel.cn/cn/guide/tools/file-parser.md :Lite ≤50M;Expert ≤100M(仅 PDF);
15
+ * Prime 按格式——PDF/DOC/DOCX/PPT ≤100MB、XLS/XLSX/CSV ≤10MB、图片 ≤20MB(图片不该送到这里:看图归 LLM)。
16
+ * txt/md 等 Prime 支持列表里有、尺寸表里没有的格式,取 Lite 同款 50MB 当下界。
17
+ * - 语音转写 https://docs.bigmodel.cn/api-reference/模型-api/语音转文本.md :单文件 ≤25MB(还有 ≤30 秒时长限制,
18
+ * 字节层看不出时长,超时长交给厂商响亮报错)。
19
+ */
20
+ export declare const ZHIPU_AUDIO_MAX_BYTES: number;
21
+ export declare class ZhipuMediaAdapter implements MediaAdapter<'zhipu'> {
22
+ readonly kind: "zhipu";
23
+ readonly endpointProtocol: "media";
24
+ readonly capabilities: readonly ["audio", "file"];
25
+ /**
26
+ * - `audio`:转写是确定性的,产出由模型与语言提示决定。
27
+ * - `file`:版面解析同样确定,产出只由档位决定;轮询预算等多久都不改变内容,不进键。
28
+ * `images: true` 是 agent-base 2026-09-07 加的**产出版本号**:expert/prime 从此带图片,与之前只取 `/text`
29
+ * 的缓存行不是同一种产出;lite 的产出没变,键也刻意不动。**照抄,别改**——改了 APP 里的存量缓存全部失效。
30
+ */
31
+ cacheKeyParts(capability: MediaCapability, settings: Settings, opts: CacheKeyOpts): Record<string, unknown> | null;
32
+ maxUploadBytes(capability: MediaCapability, settings: Settings, hint: UploadLimitHint): number | null;
33
+ transcribeAudio(conn: MediaConnection, settings: Settings, req: AudioRequest): Promise<AudioOutcome>;
34
+ parseFile(conn: MediaConnection, settings: Settings, req: FileRequest): Promise<FileOutcome>;
35
+ }
36
+ export {};
37
+ //# sourceMappingURL=zhipu.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zhipu.adapter.d.ts","sourceRoot":"","sources":["../../src/media/zhipu.adapter.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EAEpB,KAAK,aAAa,EAElB,KAAK,eAAe,EAErB,MAAM,YAAY,CAAC;AAGpB;;;GAGG;AAEH,KAAK,QAAQ,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;AAcvC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB9D,CAAC;AAYF;;;;;;;GAOG;AACH,eAAO,MAAM,qBAAqB,QAAU,CAAC;AAiD7C,qBAAa,iBAAkB,YAAW,YAAY,CAAC,OAAO,CAAC;IAC7D,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,gBAAgB,EAAG,OAAO,CAAU;IAC7C,QAAQ,CAAC,YAAY,6BAA8B;IAEnD;;;;;OAKG;IACH,aAAa,CACX,UAAU,EAAE,eAAe,EAC3B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,YAAY,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAajC,cAAc,CACZ,UAAU,EAAE,eAAe,EAC3B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,eAAe,GACpB,MAAM,GAAG,IAAI;IAoBV,eAAe,CACnB,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,YAAY,GAChB,OAAO,CAAC,YAAY,CAAC;IA+ClB,SAAS,CACb,IAAI,EAAE,eAAe,EACrB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,WAAW,CAAC;CAkHxB"}