@shennian/usechat-model-provider 0.1.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/README.md +13 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +317 -0
- package/dist/index.js.map +1 -0
- package/package.json +24 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export type UseChatMessageKind = 'text' | 'image' | 'file' | 'video-file' | 'video-card' | 'link-card' | 'official-account-card' | 'mini-program-card' | 'system' | 'recall' | 'unknown';
|
|
2
|
+
export type UseChatStructuredMessage = {
|
|
3
|
+
stableMessageKey?: string;
|
|
4
|
+
senderRole: 'self' | 'contact' | 'system' | 'unknown';
|
|
5
|
+
senderName?: string | null;
|
|
6
|
+
kind: UseChatMessageKind;
|
|
7
|
+
normalizedText?: string | null;
|
|
8
|
+
anchorText?: string | null;
|
|
9
|
+
textExcerpt?: string | null;
|
|
10
|
+
bbox?: unknown;
|
|
11
|
+
mediaMetadata?: unknown;
|
|
12
|
+
observedAt?: string;
|
|
13
|
+
};
|
|
14
|
+
export type UseChatClassifyWindowInput = {
|
|
15
|
+
screenshot: UseChatScreenshot;
|
|
16
|
+
chatName?: string;
|
|
17
|
+
traceId?: string;
|
|
18
|
+
};
|
|
19
|
+
export type UseChatClassifyWindowResult = {
|
|
20
|
+
ok: true;
|
|
21
|
+
windowKind?: 'chat_main' | 'article' | 'settings' | 'login' | 'other';
|
|
22
|
+
conversationTitle?: string | null;
|
|
23
|
+
isTargetConversation?: boolean;
|
|
24
|
+
confidence?: number;
|
|
25
|
+
layout?: {
|
|
26
|
+
messageInputRect?: UseChatRect | null;
|
|
27
|
+
searchInputRect?: UseChatRect | null;
|
|
28
|
+
} | null;
|
|
29
|
+
warnings?: string[];
|
|
30
|
+
};
|
|
31
|
+
export type UseChatStructureVisibleWindowInput = {
|
|
32
|
+
screenshots: UseChatScreenshot[];
|
|
33
|
+
edgeOcrBlocks?: unknown[];
|
|
34
|
+
visibleConversationFingerprints?: unknown[];
|
|
35
|
+
chatName?: string;
|
|
36
|
+
traceId?: string;
|
|
37
|
+
};
|
|
38
|
+
export type UseChatStructureVisibleWindowResult = {
|
|
39
|
+
ok: true;
|
|
40
|
+
structuredMessages: UseChatStructuredMessage[];
|
|
41
|
+
schemaVersion?: number;
|
|
42
|
+
usage?: unknown;
|
|
43
|
+
modelVersion?: string | null;
|
|
44
|
+
};
|
|
45
|
+
export type UseChatScreenshot = {
|
|
46
|
+
mimeType: string;
|
|
47
|
+
dataBase64: string;
|
|
48
|
+
width: number;
|
|
49
|
+
height: number;
|
|
50
|
+
windowId?: string | null;
|
|
51
|
+
};
|
|
52
|
+
export type UseChatRect = {
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
width: number;
|
|
56
|
+
height: number;
|
|
57
|
+
coordinateSpace?: string;
|
|
58
|
+
};
|
|
59
|
+
export type VisionModelProvider = {
|
|
60
|
+
structureVisibleWindow(input: UseChatStructureVisibleWindowInput): Promise<UseChatStructureVisibleWindowResult>;
|
|
61
|
+
classifyWindow?(input: UseChatClassifyWindowInput): Promise<UseChatClassifyWindowResult>;
|
|
62
|
+
};
|
|
63
|
+
export type OpenAICompatibleProviderConfig = {
|
|
64
|
+
baseUrl: string;
|
|
65
|
+
model: string;
|
|
66
|
+
apiKeyEnv: string;
|
|
67
|
+
timeoutMs?: number;
|
|
68
|
+
fetchImpl?: typeof fetch;
|
|
69
|
+
env?: NodeJS.ProcessEnv;
|
|
70
|
+
};
|
|
71
|
+
export declare class ModelProviderError extends Error {
|
|
72
|
+
readonly reasonCode: 'model_not_configured' | 'model_request_failed' | 'model_invalid_json' | 'model_no_messages' | 'model_timeout';
|
|
73
|
+
readonly details?: unknown | undefined;
|
|
74
|
+
constructor(reasonCode: 'model_not_configured' | 'model_request_failed' | 'model_invalid_json' | 'model_no_messages' | 'model_timeout', message: string, details?: unknown | undefined);
|
|
75
|
+
}
|
|
76
|
+
export declare function createOpenAICompatibleVisionProvider(config: OpenAICompatibleProviderConfig): VisionModelProvider;
|
|
77
|
+
export declare function createOcrOnlyVisionProvider(): VisionModelProvider;
|
|
78
|
+
export declare function stripJsonMarkdownFence(text: string): string;
|
|
79
|
+
export declare function normalizeStructuredMessages(value: unknown): UseChatStructuredMessage[];
|
|
80
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
// @arch ../../docs/ARCHITECTURE.md
|
|
2
|
+
// @test src/__tests__/model-provider.test.ts
|
|
3
|
+
export class ModelProviderError extends Error {
|
|
4
|
+
reasonCode;
|
|
5
|
+
details;
|
|
6
|
+
constructor(reasonCode, message, details) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.reasonCode = reasonCode;
|
|
9
|
+
this.details = details;
|
|
10
|
+
this.name = 'ModelProviderError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const DEFAULT_TIMEOUT_MS = 60_000;
|
|
14
|
+
export function createOpenAICompatibleVisionProvider(config) {
|
|
15
|
+
const normalized = normalizeOpenAICompatibleConfig(config);
|
|
16
|
+
return {
|
|
17
|
+
async structureVisibleWindow(input) {
|
|
18
|
+
const parsed = await callOpenAICompatibleJson({
|
|
19
|
+
config: normalized,
|
|
20
|
+
systemPrompt: STRUCTURE_WINDOW_SYSTEM_PROMPT,
|
|
21
|
+
userText: buildStructureWindowUserPrompt(input),
|
|
22
|
+
screenshot: input.screenshots[0],
|
|
23
|
+
traceId: input.traceId,
|
|
24
|
+
});
|
|
25
|
+
const messages = normalizeStructuredMessages(parsed.structuredMessages ?? parsed.observedMessages ?? parsed.messages);
|
|
26
|
+
if (!messages.length)
|
|
27
|
+
throw new ModelProviderError('model_no_messages', '模型没有返回可用消息。');
|
|
28
|
+
return {
|
|
29
|
+
ok: true,
|
|
30
|
+
structuredMessages: messages,
|
|
31
|
+
schemaVersion: typeof parsed.schemaVersion === 'number' ? parsed.schemaVersion : 1,
|
|
32
|
+
usage: parsed.usage,
|
|
33
|
+
modelVersion: typeof parsed.modelVersion === 'string' ? parsed.modelVersion : normalized.model,
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
async classifyWindow(input) {
|
|
37
|
+
const parsed = await callOpenAICompatibleJson({
|
|
38
|
+
config: normalized,
|
|
39
|
+
systemPrompt: CLASSIFY_WINDOW_SYSTEM_PROMPT,
|
|
40
|
+
userText: buildClassifyWindowUserPrompt(input),
|
|
41
|
+
screenshot: input.screenshot,
|
|
42
|
+
traceId: input.traceId,
|
|
43
|
+
});
|
|
44
|
+
return {
|
|
45
|
+
ok: true,
|
|
46
|
+
windowKind: normalizeWindowKind(parsed.windowKind),
|
|
47
|
+
conversationTitle: nullableString(parsed.conversationTitle),
|
|
48
|
+
isTargetConversation: typeof parsed.isTargetConversation === 'boolean' ? parsed.isTargetConversation : undefined,
|
|
49
|
+
confidence: numberOrUndefined(parsed.confidence),
|
|
50
|
+
layout: normalizeLayout(parsed.layout),
|
|
51
|
+
warnings: Array.isArray(parsed.warnings) ? parsed.warnings.map(String) : undefined,
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function createOcrOnlyVisionProvider() {
|
|
57
|
+
return {
|
|
58
|
+
async structureVisibleWindow(input) {
|
|
59
|
+
const messages = normalizeOcrBlocksAsMessages(input.edgeOcrBlocks ?? []);
|
|
60
|
+
return {
|
|
61
|
+
ok: true,
|
|
62
|
+
structuredMessages: messages,
|
|
63
|
+
schemaVersion: 1,
|
|
64
|
+
modelVersion: 'ocr-only',
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
async classifyWindow() {
|
|
68
|
+
return {
|
|
69
|
+
ok: true,
|
|
70
|
+
windowKind: 'chat_main',
|
|
71
|
+
confidence: 0.2,
|
|
72
|
+
warnings: ['ocr_only_layout_fallback'],
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export function stripJsonMarkdownFence(text) {
|
|
78
|
+
const trimmed = text.trim();
|
|
79
|
+
const match = /^```(?:json)?\s*([\s\S]*?)\s*```$/i.exec(trimmed);
|
|
80
|
+
return match ? match[1].trim() : trimmed;
|
|
81
|
+
}
|
|
82
|
+
export function normalizeStructuredMessages(value) {
|
|
83
|
+
if (!Array.isArray(value))
|
|
84
|
+
return [];
|
|
85
|
+
return value
|
|
86
|
+
.map((item, index) => normalizeStructuredMessage(item, index))
|
|
87
|
+
.filter((item) => item !== null);
|
|
88
|
+
}
|
|
89
|
+
const STRUCTURE_WINDOW_SYSTEM_PROMPT = [
|
|
90
|
+
'你是 UseChat 的可见聊天窗口结构化模块。',
|
|
91
|
+
'只根据截图和 OCR hints 输出当前可见消息,不要编造不可见消息。',
|
|
92
|
+
'返回严格 JSON,不要 markdown fence。',
|
|
93
|
+
'JSON schema: {"schemaVersion":1,"structuredMessages":[{"senderRole":"self|contact|system|unknown","senderName":string|null,"kind":"text|image|file|video-file|video-card|link-card|official-account-card|mini-program-card|system|recall|unknown","normalizedText":string|null,"anchorText":string|null,"textExcerpt":string|null,"bbox":object|null}]}。',
|
|
94
|
+
].join('\n');
|
|
95
|
+
const CLASSIFY_WINDOW_SYSTEM_PROMPT = [
|
|
96
|
+
'你是 UseChat 的微信窗口布局识别模块。',
|
|
97
|
+
'识别截图是否是聊天主窗口,并返回搜索框和消息输入框的大致矩形。',
|
|
98
|
+
'坐标使用 0-999 的归一化截图坐标。只返回 JSON,不要 markdown fence。',
|
|
99
|
+
'JSON schema: {"windowKind":"chat_main|article|settings|login|other","conversationTitle":string|null,"isTargetConversation":boolean,"confidence":number,"layout":{"searchInputRect":{"x":number,"y":number,"width":number,"height":number,"coordinateSpace":"normalized-0-999"},"messageInputRect":{"x":number,"y":number,"width":number,"height":number,"coordinateSpace":"normalized-0-999"}}}。',
|
|
100
|
+
].join('\n');
|
|
101
|
+
async function callOpenAICompatibleJson(input) {
|
|
102
|
+
const fetchImpl = input.config.fetchImpl ?? globalThis.fetch;
|
|
103
|
+
if (!fetchImpl)
|
|
104
|
+
throw new ModelProviderError('model_not_configured', '当前 Node.js 运行时没有 fetch。');
|
|
105
|
+
const apiKey = input.config.env[input.config.apiKeyEnv];
|
|
106
|
+
if (!apiKey)
|
|
107
|
+
throw new ModelProviderError('model_not_configured', `环境变量 ${input.config.apiKeyEnv} 未设置。`);
|
|
108
|
+
const controller = new AbortController();
|
|
109
|
+
const timeout = setTimeout(() => controller.abort(), input.config.timeoutMs);
|
|
110
|
+
try {
|
|
111
|
+
const response = await fetchImpl(`${input.config.baseUrl}/chat/completions`, {
|
|
112
|
+
method: 'POST',
|
|
113
|
+
headers: {
|
|
114
|
+
'content-type': 'application/json',
|
|
115
|
+
authorization: `Bearer ${apiKey}`,
|
|
116
|
+
},
|
|
117
|
+
body: JSON.stringify({
|
|
118
|
+
model: input.config.model,
|
|
119
|
+
temperature: 0,
|
|
120
|
+
response_format: { type: 'json_object' },
|
|
121
|
+
messages: [
|
|
122
|
+
{ role: 'system', content: input.systemPrompt },
|
|
123
|
+
{
|
|
124
|
+
role: 'user',
|
|
125
|
+
content: [
|
|
126
|
+
{ type: 'text', text: input.userText },
|
|
127
|
+
...(input.screenshot ? [{
|
|
128
|
+
type: 'image_url',
|
|
129
|
+
image_url: { url: `data:${input.screenshot.mimeType};base64,${input.screenshot.dataBase64}` },
|
|
130
|
+
}] : []),
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
}),
|
|
135
|
+
signal: controller.signal,
|
|
136
|
+
});
|
|
137
|
+
if (!response.ok) {
|
|
138
|
+
throw new ModelProviderError('model_request_failed', `模型请求失败:HTTP ${response.status}`, { status: response.status });
|
|
139
|
+
}
|
|
140
|
+
const raw = await response.json();
|
|
141
|
+
const content = extractChatCompletionContent(raw);
|
|
142
|
+
if (!content)
|
|
143
|
+
throw new ModelProviderError('model_invalid_json', '模型响应缺少 message.content。');
|
|
144
|
+
try {
|
|
145
|
+
const parsed = JSON.parse(stripJsonMarkdownFence(content));
|
|
146
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
147
|
+
throw new Error('not object');
|
|
148
|
+
return parsed;
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
throw new ModelProviderError('model_invalid_json', '模型返回的 JSON 无法解析。', { cause: error instanceof Error ? error.message : String(error) });
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error instanceof ModelProviderError)
|
|
156
|
+
throw error;
|
|
157
|
+
if (error instanceof Error && error.name === 'AbortError')
|
|
158
|
+
throw new ModelProviderError('model_timeout', '模型请求超时。');
|
|
159
|
+
throw new ModelProviderError('model_request_failed', error instanceof Error ? error.message : String(error));
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
clearTimeout(timeout);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function normalizeOpenAICompatibleConfig(config) {
|
|
166
|
+
if (!config.baseUrl?.trim())
|
|
167
|
+
throw new ModelProviderError('model_not_configured', 'model.baseUrl 未配置。');
|
|
168
|
+
if (!config.model?.trim())
|
|
169
|
+
throw new ModelProviderError('model_not_configured', 'model.name 未配置。');
|
|
170
|
+
if (!config.apiKeyEnv?.trim())
|
|
171
|
+
throw new ModelProviderError('model_not_configured', 'model.apiKeyEnv 未配置。');
|
|
172
|
+
return {
|
|
173
|
+
baseUrl: config.baseUrl.replace(/\/+$/, ''),
|
|
174
|
+
model: config.model,
|
|
175
|
+
apiKeyEnv: config.apiKeyEnv,
|
|
176
|
+
timeoutMs: config.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
177
|
+
fetchImpl: config.fetchImpl,
|
|
178
|
+
env: config.env ?? process.env,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
function buildStructureWindowUserPrompt(input) {
|
|
182
|
+
return JSON.stringify({
|
|
183
|
+
task: 'structure-visible-chat-window',
|
|
184
|
+
chatName: input.chatName,
|
|
185
|
+
edgeOcrBlocks: input.edgeOcrBlocks ?? [],
|
|
186
|
+
visibleConversationFingerprints: input.visibleConversationFingerprints ?? [],
|
|
187
|
+
screenshotCount: input.screenshots.length,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
function buildClassifyWindowUserPrompt(input) {
|
|
191
|
+
return JSON.stringify({
|
|
192
|
+
task: 'classify-wechat-window-layout',
|
|
193
|
+
chatName: input.chatName,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
function extractChatCompletionContent(raw) {
|
|
197
|
+
const choices = raw.choices;
|
|
198
|
+
if (!Array.isArray(choices))
|
|
199
|
+
return null;
|
|
200
|
+
const first = choices[0];
|
|
201
|
+
if (!first || typeof first !== 'object')
|
|
202
|
+
return null;
|
|
203
|
+
const message = first.message;
|
|
204
|
+
if (!message || typeof message !== 'object')
|
|
205
|
+
return null;
|
|
206
|
+
const content = message.content;
|
|
207
|
+
if (typeof content === 'string')
|
|
208
|
+
return content;
|
|
209
|
+
if (Array.isArray(content)) {
|
|
210
|
+
return content.map((part) => {
|
|
211
|
+
if (typeof part === 'string')
|
|
212
|
+
return part;
|
|
213
|
+
if (part && typeof part === 'object' && typeof part.text === 'string')
|
|
214
|
+
return part.text;
|
|
215
|
+
return '';
|
|
216
|
+
}).join('');
|
|
217
|
+
}
|
|
218
|
+
return null;
|
|
219
|
+
}
|
|
220
|
+
function normalizeStructuredMessage(value, index) {
|
|
221
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
222
|
+
return null;
|
|
223
|
+
const record = value;
|
|
224
|
+
const senderRole = normalizeSenderRole(record.senderRole);
|
|
225
|
+
const kind = normalizeMessageKind(record.kind);
|
|
226
|
+
const normalizedText = nullableString(record.normalizedText ?? record.text);
|
|
227
|
+
const anchorText = nullableString(record.anchorText) ?? normalizedText ?? nullableString(record.textExcerpt);
|
|
228
|
+
const stableMessageKey = nullableString(record.stableMessageKey) ?? `visible:${index}:${senderRole}:${kind}:${(anchorText ?? '').slice(0, 80)}`;
|
|
229
|
+
return {
|
|
230
|
+
stableMessageKey,
|
|
231
|
+
senderRole,
|
|
232
|
+
senderName: nullableString(record.senderName),
|
|
233
|
+
kind,
|
|
234
|
+
normalizedText,
|
|
235
|
+
anchorText,
|
|
236
|
+
textExcerpt: nullableString(record.textExcerpt) ?? normalizedText,
|
|
237
|
+
bbox: record.bbox,
|
|
238
|
+
mediaMetadata: record.mediaMetadata,
|
|
239
|
+
observedAt: nullableString(record.observedAt) ?? new Date().toISOString(),
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
function normalizeOcrBlocksAsMessages(blocks) {
|
|
243
|
+
const messages = [];
|
|
244
|
+
blocks.forEach((block, index) => {
|
|
245
|
+
if (!block || typeof block !== 'object' || Array.isArray(block))
|
|
246
|
+
return;
|
|
247
|
+
const record = block;
|
|
248
|
+
const text = nullableString(record.text);
|
|
249
|
+
if (!text)
|
|
250
|
+
return;
|
|
251
|
+
messages.push({
|
|
252
|
+
stableMessageKey: `ocr:${index}:${text.slice(0, 80)}`,
|
|
253
|
+
senderRole: 'unknown',
|
|
254
|
+
kind: 'text',
|
|
255
|
+
normalizedText: text,
|
|
256
|
+
anchorText: text,
|
|
257
|
+
textExcerpt: text,
|
|
258
|
+
bbox: record.bbox,
|
|
259
|
+
observedAt: new Date().toISOString(),
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
return messages;
|
|
263
|
+
}
|
|
264
|
+
function normalizeSenderRole(value) {
|
|
265
|
+
return value === 'self' || value === 'contact' || value === 'system' || value === 'unknown' ? value : 'unknown';
|
|
266
|
+
}
|
|
267
|
+
function normalizeMessageKind(value) {
|
|
268
|
+
const normalized = String(value ?? '').trim().toLowerCase().replace(/\s+/g, '-').replace(/_/g, '-');
|
|
269
|
+
const known = ['text', 'image', 'file', 'video-file', 'video-card', 'link-card', 'official-account-card', 'mini-program-card', 'system', 'recall', 'unknown'];
|
|
270
|
+
if (known.includes(normalized))
|
|
271
|
+
return normalized;
|
|
272
|
+
if (normalized === 'video')
|
|
273
|
+
return 'video-file';
|
|
274
|
+
if (normalized === 'link')
|
|
275
|
+
return 'link-card';
|
|
276
|
+
if (normalized === 'document')
|
|
277
|
+
return 'file';
|
|
278
|
+
if (normalized === 'photo' || normalized === 'picture' || normalized === 'img')
|
|
279
|
+
return 'image';
|
|
280
|
+
return 'unknown';
|
|
281
|
+
}
|
|
282
|
+
function normalizeWindowKind(value) {
|
|
283
|
+
if (value === 'chat_main' || value === 'article' || value === 'settings' || value === 'login' || value === 'other')
|
|
284
|
+
return value;
|
|
285
|
+
return 'other';
|
|
286
|
+
}
|
|
287
|
+
function normalizeLayout(value) {
|
|
288
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
289
|
+
return undefined;
|
|
290
|
+
const record = value;
|
|
291
|
+
return {
|
|
292
|
+
messageInputRect: normalizeRect(record.messageInputRect),
|
|
293
|
+
searchInputRect: normalizeRect(record.searchInputRect),
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function normalizeRect(value) {
|
|
297
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
298
|
+
return null;
|
|
299
|
+
const record = value;
|
|
300
|
+
const x = Number(record.x);
|
|
301
|
+
const y = Number(record.y);
|
|
302
|
+
const width = Number(record.width);
|
|
303
|
+
const height = Number(record.height);
|
|
304
|
+
if (![x, y, width, height].every(Number.isFinite) || width <= 0 || height <= 0)
|
|
305
|
+
return null;
|
|
306
|
+
return { x, y, width, height, coordinateSpace: typeof record.coordinateSpace === 'string' ? record.coordinateSpace : undefined };
|
|
307
|
+
}
|
|
308
|
+
function nullableString(value) {
|
|
309
|
+
if (typeof value !== 'string')
|
|
310
|
+
return null;
|
|
311
|
+
const trimmed = value.trim();
|
|
312
|
+
return trimmed ? trimmed : null;
|
|
313
|
+
}
|
|
314
|
+
function numberOrUndefined(value) {
|
|
315
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@shennian/usechat-model-provider",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "OpenAI-compatible vision model provider for UseChat.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public",
|
|
17
|
+
"registry": "https://registry.npmjs.org/"
|
|
18
|
+
},
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "tsc -p tsconfig.json",
|
|
21
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
22
|
+
"test": "vitest run --passWithNoTests"
|
|
23
|
+
}
|
|
24
|
+
}
|