@bowenqt/qiniu-ai-sdk 0.4.0 → 0.8.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 (73) hide show
  1. package/README.md +96 -0
  2. package/dist/adapter/convert-prompt.d.ts +7 -0
  3. package/dist/adapter/convert-prompt.d.ts.map +1 -0
  4. package/dist/adapter/convert-prompt.js +207 -0
  5. package/dist/adapter/convert-prompt.js.map +1 -0
  6. package/dist/adapter/convert-prompt.mjs +201 -0
  7. package/dist/adapter/index.d.ts +4 -0
  8. package/dist/adapter/index.d.ts.map +1 -0
  9. package/dist/adapter/index.js +9 -0
  10. package/dist/adapter/index.js.map +1 -0
  11. package/dist/adapter/index.mjs +3 -0
  12. package/dist/adapter/provider.d.ts +14 -0
  13. package/dist/adapter/provider.d.ts.map +1 -0
  14. package/dist/adapter/provider.js +36 -0
  15. package/dist/adapter/provider.js.map +1 -0
  16. package/dist/adapter/provider.mjs +32 -0
  17. package/dist/adapter/qiniu-chat-model.d.ts +27 -0
  18. package/dist/adapter/qiniu-chat-model.d.ts.map +1 -0
  19. package/dist/adapter/qiniu-chat-model.js +207 -0
  20. package/dist/adapter/qiniu-chat-model.js.map +1 -0
  21. package/dist/adapter/qiniu-chat-model.mjs +203 -0
  22. package/dist/adapter/types.d.ts +2 -0
  23. package/dist/adapter/types.d.ts.map +1 -0
  24. package/dist/adapter/types.js +3 -0
  25. package/dist/adapter/types.js.map +1 -0
  26. package/dist/adapter/types.mjs +2 -0
  27. package/dist/adapter/utils.d.ts +2 -0
  28. package/dist/adapter/utils.d.ts.map +1 -0
  29. package/dist/adapter/utils.js +26 -0
  30. package/dist/adapter/utils.js.map +1 -0
  31. package/dist/adapter/utils.mjs +23 -0
  32. package/dist/ai/generate-text.d.ts +48 -0
  33. package/dist/ai/generate-text.d.ts.map +1 -0
  34. package/dist/ai/generate-text.js +169 -0
  35. package/dist/ai/generate-text.js.map +1 -0
  36. package/dist/ai/generate-text.mjs +165 -0
  37. package/dist/ai-tools/index.d.ts +17 -0
  38. package/dist/ai-tools/index.d.ts.map +1 -0
  39. package/dist/ai-tools/index.js +77 -0
  40. package/dist/ai-tools/index.js.map +1 -0
  41. package/dist/ai-tools/index.mjs +73 -0
  42. package/dist/client.d.ts +9 -9
  43. package/dist/client.d.ts.map +1 -1
  44. package/dist/client.js +18 -18
  45. package/dist/client.js.map +1 -1
  46. package/dist/client.mjs +9 -9
  47. package/dist/index.d.ts +7 -0
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +19 -1
  50. package/dist/index.js.map +1 -1
  51. package/dist/index.mjs +7 -0
  52. package/dist/lib/errors.d.ts +12 -0
  53. package/dist/lib/errors.d.ts.map +1 -0
  54. package/dist/lib/errors.js +27 -0
  55. package/dist/lib/errors.js.map +1 -0
  56. package/dist/lib/errors.mjs +21 -0
  57. package/dist/lib/messages.d.ts +18 -0
  58. package/dist/lib/messages.d.ts.map +1 -0
  59. package/dist/lib/messages.js +66 -0
  60. package/dist/lib/messages.js.map +1 -0
  61. package/dist/lib/messages.mjs +62 -0
  62. package/dist/models.d.ts +115 -0
  63. package/dist/models.d.ts.map +1 -0
  64. package/dist/models.js +150 -0
  65. package/dist/models.js.map +1 -0
  66. package/dist/models.mjs +147 -0
  67. package/dist/modules/image/index.d.ts +2 -1
  68. package/dist/modules/image/index.d.ts.map +1 -1
  69. package/dist/modules/image/index.js.map +1 -1
  70. package/dist/modules/video/index.d.ts +2 -1
  71. package/dist/modules/video/index.d.ts.map +1 -1
  72. package/dist/modules/video/index.js.map +1 -1
  73. package/package.json +37 -2
package/README.md CHANGED
@@ -21,6 +21,14 @@ TypeScript SDK for Qiniu Cloud AI Token API.
21
21
  npm install @bowenqt/qiniu-ai-sdk
22
22
  ```
23
23
 
24
+ ### Installation for Adapter Users
25
+
26
+ The Vercel AI SDK adapter is optional. Install the peer dependencies when you use it:
27
+
28
+ ```bash
29
+ npm install @bowenqt/qiniu-ai-sdk @ai-sdk/provider ai
30
+ ```
31
+
24
32
  ## Quick Start
25
33
 
26
34
  ```typescript
@@ -72,6 +80,94 @@ for await (const chunk of stream) {
72
80
  }
73
81
  ```
74
82
 
83
+ ## Advanced Usage
84
+
85
+ ### StreamAccumulator (Manual Streaming)
86
+
87
+ ```typescript
88
+ import { QiniuAI, createStreamAccumulator, accumulateDelta } from '@bowenqt/qiniu-ai-sdk';
89
+
90
+ const client = new QiniuAI({ apiKey: 'Sk-xxx' });
91
+ const stream = client.chat.createStream({
92
+ model: 'gemini-2.5-flash',
93
+ messages: [{ role: 'user', content: 'Explain streaming in one sentence.' }],
94
+ });
95
+
96
+ const acc = createStreamAccumulator();
97
+ for await (const chunk of stream) {
98
+ const delta = chunk.choices[0]?.delta;
99
+ if (delta) {
100
+ accumulateDelta(acc, delta);
101
+ }
102
+ }
103
+ console.log(acc.content);
104
+ ```
105
+
106
+ ### parseSSEStream (Custom SSE Parsing)
107
+
108
+ ```typescript
109
+ import { parseSSEStream } from '@bowenqt/qiniu-ai-sdk';
110
+
111
+ const response = await fetch('https://api.qnaigc.com/v1/chat/completions', {
112
+ method: 'POST',
113
+ headers: {
114
+ 'Content-Type': 'application/json',
115
+ 'Authorization': `Bearer ${process.env.QINIU_API_KEY}`,
116
+ },
117
+ body: JSON.stringify({
118
+ model: 'gemini-2.5-flash',
119
+ messages: [{ role: 'user', content: 'Hello!' }],
120
+ stream: true,
121
+ }),
122
+ });
123
+
124
+ for await (const chunk of parseSSEStream(response)) {
125
+ console.log(chunk);
126
+ }
127
+ ```
128
+
129
+ ### createPoller (Custom Async Polling)
130
+
131
+ ```typescript
132
+ import { createPoller } from '@bowenqt/qiniu-ai-sdk';
133
+
134
+ const poller = createPoller({
135
+ intervalMs: 2000,
136
+ timeoutMs: 60000,
137
+ isTerminal: (result) => result.status === 'succeed' || result.status === 'failed',
138
+ getStatus: (id) => client.video.get(id),
139
+ });
140
+
141
+ const result = await poller.poll('task-id');
142
+ console.log(result.result);
143
+ ```
144
+
145
+ ## Vercel AI SDK Adapter
146
+
147
+ Use the adapter to integrate with the Vercel AI SDK (`streamText`, `generateText`).
148
+
149
+ ```typescript
150
+ import { createQiniu } from '@bowenqt/qiniu-ai-sdk/adapter';
151
+ import { streamText } from 'ai';
152
+
153
+ const qiniu = createQiniu({
154
+ apiKey: process.env.QINIU_API_KEY || process.env.OPENAI_API_KEY,
155
+ });
156
+
157
+ const { textStream } = await streamText({
158
+ model: qiniu.languageModel('gemini-2.5-flash'),
159
+ prompt: 'Introduce Qiniu Cloud in one sentence.',
160
+ });
161
+
162
+ for await (const text of textStream) {
163
+ process.stdout.write(text);
164
+ }
165
+ ```
166
+
167
+ Notes:
168
+ - If you already have a `QiniuAI` client, pass it via `createQiniu({ client })`.
169
+ - You can override `baseUrl` using `createQiniu({ baseUrl })` or `QINIU_BASE_URL`.
170
+
75
171
  ## API Reference
76
172
 
77
173
  ### Client Initialization
@@ -0,0 +1,7 @@
1
+ import type { ChatCompletionRequest, ChatMessage } from '../lib/types';
2
+ import type { LanguageModelV2FinishReason, LanguageModelV2FunctionTool, LanguageModelV2Prompt, LanguageModelV2ProviderDefinedTool, LanguageModelV2ToolChoice } from './types';
3
+ export declare function convertPromptToMessages(prompt: LanguageModelV2Prompt): ChatMessage[];
4
+ export declare function mapFinishReason(reason?: string | null): LanguageModelV2FinishReason;
5
+ export declare function convertTools(tools?: Array<LanguageModelV2FunctionTool | LanguageModelV2ProviderDefinedTool>): ChatCompletionRequest['tools'] | undefined;
6
+ export declare function convertToolChoice(choice?: LanguageModelV2ToolChoice): ChatCompletionRequest['tool_choice'] | undefined;
7
+ //# sourceMappingURL=convert-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-prompt.d.ts","sourceRoot":"","sources":["../../src/adapter/convert-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAyB,MAAM,cAAc,CAAC;AAC9F,OAAO,KAAK,EAER,2BAA2B,EAC3B,2BAA2B,EAE3B,qBAAqB,EACrB,kCAAkC,EAGlC,yBAAyB,EAG5B,MAAM,SAAS,CAAC;AAEjB,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,qBAAqB,GAAG,WAAW,EAAE,CA4BpF;AAED,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,2BAA2B,CAanF;AAED,wBAAgB,YAAY,CACxB,KAAK,CAAC,EAAE,KAAK,CAAC,2BAA2B,GAAG,kCAAkC,CAAC,GAChF,qBAAqB,CAAC,OAAO,CAAC,GAAG,SAAS,CAmB5C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,yBAAyB,GAAG,qBAAqB,CAAC,aAAa,CAAC,GAAG,SAAS,CAsBtH"}
@@ -0,0 +1,207 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertPromptToMessages = convertPromptToMessages;
4
+ exports.mapFinishReason = mapFinishReason;
5
+ exports.convertTools = convertTools;
6
+ exports.convertToolChoice = convertToolChoice;
7
+ function convertPromptToMessages(prompt) {
8
+ const messages = [];
9
+ for (const message of prompt) {
10
+ if (message.role === 'system') {
11
+ messages.push({ role: 'system', content: message.content });
12
+ continue;
13
+ }
14
+ if (message.role === 'tool') {
15
+ messages.push(...convertToolResultMessages(message));
16
+ continue;
17
+ }
18
+ const { content, toolCalls } = convertAssistantOrUserMessage(message);
19
+ const normalized = {
20
+ role: message.role,
21
+ content,
22
+ };
23
+ if (toolCalls.length > 0) {
24
+ normalized.tool_calls = toolCalls;
25
+ }
26
+ messages.push(normalized);
27
+ }
28
+ return messages;
29
+ }
30
+ function mapFinishReason(reason) {
31
+ switch (reason) {
32
+ case 'stop':
33
+ return 'stop';
34
+ case 'length':
35
+ return 'length';
36
+ case 'tool_calls':
37
+ return 'tool-calls';
38
+ case 'content_filter':
39
+ return 'content-filter';
40
+ default:
41
+ return 'unknown';
42
+ }
43
+ }
44
+ function convertTools(tools) {
45
+ if (!tools || tools.length === 0) {
46
+ return undefined;
47
+ }
48
+ const functionTools = tools.filter((tool) => tool.type === 'function');
49
+ if (functionTools.length === 0) {
50
+ return undefined;
51
+ }
52
+ return functionTools.map((tool) => ({
53
+ type: 'function',
54
+ function: {
55
+ name: tool.name,
56
+ description: tool.description,
57
+ parameters: tool.parameters,
58
+ },
59
+ }));
60
+ }
61
+ function convertToolChoice(choice) {
62
+ if (!choice) {
63
+ return undefined;
64
+ }
65
+ if (choice.type === 'auto') {
66
+ return 'auto';
67
+ }
68
+ if (choice.type === 'none') {
69
+ return 'none';
70
+ }
71
+ if (choice.type === 'required') {
72
+ return 'auto';
73
+ }
74
+ if (choice.type === 'tool') {
75
+ return { type: 'function', function: { name: choice.toolName } };
76
+ }
77
+ return undefined;
78
+ }
79
+ function convertAssistantOrUserMessage(message) {
80
+ const parts = [];
81
+ const toolCalls = [];
82
+ for (const part of message.content) {
83
+ if (part.type === 'text') {
84
+ parts.push({ type: 'text', text: part.text });
85
+ continue;
86
+ }
87
+ if (part.type === 'reasoning') {
88
+ parts.push({ type: 'text', text: part.text });
89
+ continue;
90
+ }
91
+ if (part.type === 'file') {
92
+ const converted = convertFilePart(part);
93
+ if (converted) {
94
+ parts.push(converted);
95
+ }
96
+ continue;
97
+ }
98
+ if (part.type === 'tool-call') {
99
+ toolCalls.push(convertToolCall(part));
100
+ }
101
+ }
102
+ const content = mergeTextParts(parts);
103
+ return { content, toolCalls };
104
+ }
105
+ function convertToolResultMessages(message) {
106
+ const toolMessages = [];
107
+ for (const part of message.content) {
108
+ if (part.type !== 'tool-result') {
109
+ continue;
110
+ }
111
+ const content = stringifyToolResult(part);
112
+ toolMessages.push({
113
+ role: 'tool',
114
+ content,
115
+ name: part.toolName,
116
+ });
117
+ }
118
+ return toolMessages;
119
+ }
120
+ function convertFilePart(part) {
121
+ const mediaType = part.mediaType.toLowerCase();
122
+ if (!mediaType.startsWith('image/')) {
123
+ return null;
124
+ }
125
+ const url = resolveFileDataUrl(part);
126
+ if (!url) {
127
+ return null;
128
+ }
129
+ return {
130
+ type: 'image_url',
131
+ image_url: {
132
+ url,
133
+ },
134
+ };
135
+ }
136
+ function resolveFileDataUrl(part) {
137
+ const data = part.data;
138
+ if (data instanceof URL) {
139
+ return data.toString();
140
+ }
141
+ if (typeof data === 'string') {
142
+ if (/^https?:/i.test(data) || /^data:/i.test(data)) {
143
+ return data;
144
+ }
145
+ return `data:${part.mediaType};base64,${data}`;
146
+ }
147
+ if (data instanceof Uint8Array) {
148
+ const base64 = encodeBase64(data);
149
+ return `data:${part.mediaType};base64,${base64}`;
150
+ }
151
+ return null;
152
+ }
153
+ function encodeBase64(data) {
154
+ if (typeof Buffer !== 'undefined') {
155
+ return Buffer.from(data).toString('base64');
156
+ }
157
+ let binary = '';
158
+ for (const byte of data) {
159
+ binary += String.fromCharCode(byte);
160
+ }
161
+ const btoaFn = globalThis.btoa;
162
+ if (btoaFn) {
163
+ return btoaFn(binary);
164
+ }
165
+ throw new Error('Base64 encoding is not available in this environment.');
166
+ }
167
+ function convertToolCall(part) {
168
+ return {
169
+ id: part.toolCallId,
170
+ type: 'function',
171
+ function: {
172
+ name: part.toolName,
173
+ arguments: JSON.stringify(part.args ?? {}),
174
+ },
175
+ };
176
+ }
177
+ function stringifyToolResult(part) {
178
+ if (Array.isArray(part.content) && part.content.length > 0) {
179
+ return part.content
180
+ .map((contentPart) => {
181
+ if (contentPart.type === 'text') {
182
+ return contentPart.text;
183
+ }
184
+ if (contentPart.type === 'image') {
185
+ const mediaType = contentPart.mediaType || 'image/png';
186
+ return `data:${mediaType};base64,${contentPart.data}`;
187
+ }
188
+ return '';
189
+ })
190
+ .join('');
191
+ }
192
+ if (part.result !== undefined) {
193
+ return JSON.stringify(part.result);
194
+ }
195
+ return '';
196
+ }
197
+ function mergeTextParts(parts) {
198
+ if (parts.length === 0) {
199
+ return '';
200
+ }
201
+ const hasNonText = parts.some((part) => part.type !== 'text');
202
+ if (hasNonText) {
203
+ return parts;
204
+ }
205
+ return parts.map((part) => (part.type === 'text' ? part.text ?? '' : '')).join('');
206
+ }
207
+ //# sourceMappingURL=convert-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert-prompt.js","sourceRoot":"","sources":["../../src/adapter/convert-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,201 @@
1
+ export function convertPromptToMessages(prompt) {
2
+ const messages = [];
3
+ for (const message of prompt) {
4
+ if (message.role === 'system') {
5
+ messages.push({ role: 'system', content: message.content });
6
+ continue;
7
+ }
8
+ if (message.role === 'tool') {
9
+ messages.push(...convertToolResultMessages(message));
10
+ continue;
11
+ }
12
+ const { content, toolCalls } = convertAssistantOrUserMessage(message);
13
+ const normalized = {
14
+ role: message.role,
15
+ content,
16
+ };
17
+ if (toolCalls.length > 0) {
18
+ normalized.tool_calls = toolCalls;
19
+ }
20
+ messages.push(normalized);
21
+ }
22
+ return messages;
23
+ }
24
+ export function mapFinishReason(reason) {
25
+ switch (reason) {
26
+ case 'stop':
27
+ return 'stop';
28
+ case 'length':
29
+ return 'length';
30
+ case 'tool_calls':
31
+ return 'tool-calls';
32
+ case 'content_filter':
33
+ return 'content-filter';
34
+ default:
35
+ return 'unknown';
36
+ }
37
+ }
38
+ export function convertTools(tools) {
39
+ if (!tools || tools.length === 0) {
40
+ return undefined;
41
+ }
42
+ const functionTools = tools.filter((tool) => tool.type === 'function');
43
+ if (functionTools.length === 0) {
44
+ return undefined;
45
+ }
46
+ return functionTools.map((tool) => ({
47
+ type: 'function',
48
+ function: {
49
+ name: tool.name,
50
+ description: tool.description,
51
+ parameters: tool.parameters,
52
+ },
53
+ }));
54
+ }
55
+ export function convertToolChoice(choice) {
56
+ if (!choice) {
57
+ return undefined;
58
+ }
59
+ if (choice.type === 'auto') {
60
+ return 'auto';
61
+ }
62
+ if (choice.type === 'none') {
63
+ return 'none';
64
+ }
65
+ if (choice.type === 'required') {
66
+ return 'auto';
67
+ }
68
+ if (choice.type === 'tool') {
69
+ return { type: 'function', function: { name: choice.toolName } };
70
+ }
71
+ return undefined;
72
+ }
73
+ function convertAssistantOrUserMessage(message) {
74
+ const parts = [];
75
+ const toolCalls = [];
76
+ for (const part of message.content) {
77
+ if (part.type === 'text') {
78
+ parts.push({ type: 'text', text: part.text });
79
+ continue;
80
+ }
81
+ if (part.type === 'reasoning') {
82
+ parts.push({ type: 'text', text: part.text });
83
+ continue;
84
+ }
85
+ if (part.type === 'file') {
86
+ const converted = convertFilePart(part);
87
+ if (converted) {
88
+ parts.push(converted);
89
+ }
90
+ continue;
91
+ }
92
+ if (part.type === 'tool-call') {
93
+ toolCalls.push(convertToolCall(part));
94
+ }
95
+ }
96
+ const content = mergeTextParts(parts);
97
+ return { content, toolCalls };
98
+ }
99
+ function convertToolResultMessages(message) {
100
+ const toolMessages = [];
101
+ for (const part of message.content) {
102
+ if (part.type !== 'tool-result') {
103
+ continue;
104
+ }
105
+ const content = stringifyToolResult(part);
106
+ toolMessages.push({
107
+ role: 'tool',
108
+ content,
109
+ name: part.toolName,
110
+ });
111
+ }
112
+ return toolMessages;
113
+ }
114
+ function convertFilePart(part) {
115
+ const mediaType = part.mediaType.toLowerCase();
116
+ if (!mediaType.startsWith('image/')) {
117
+ return null;
118
+ }
119
+ const url = resolveFileDataUrl(part);
120
+ if (!url) {
121
+ return null;
122
+ }
123
+ return {
124
+ type: 'image_url',
125
+ image_url: {
126
+ url,
127
+ },
128
+ };
129
+ }
130
+ function resolveFileDataUrl(part) {
131
+ const data = part.data;
132
+ if (data instanceof URL) {
133
+ return data.toString();
134
+ }
135
+ if (typeof data === 'string') {
136
+ if (/^https?:/i.test(data) || /^data:/i.test(data)) {
137
+ return data;
138
+ }
139
+ return `data:${part.mediaType};base64,${data}`;
140
+ }
141
+ if (data instanceof Uint8Array) {
142
+ const base64 = encodeBase64(data);
143
+ return `data:${part.mediaType};base64,${base64}`;
144
+ }
145
+ return null;
146
+ }
147
+ function encodeBase64(data) {
148
+ if (typeof Buffer !== 'undefined') {
149
+ return Buffer.from(data).toString('base64');
150
+ }
151
+ let binary = '';
152
+ for (const byte of data) {
153
+ binary += String.fromCharCode(byte);
154
+ }
155
+ const btoaFn = globalThis.btoa;
156
+ if (btoaFn) {
157
+ return btoaFn(binary);
158
+ }
159
+ throw new Error('Base64 encoding is not available in this environment.');
160
+ }
161
+ function convertToolCall(part) {
162
+ return {
163
+ id: part.toolCallId,
164
+ type: 'function',
165
+ function: {
166
+ name: part.toolName,
167
+ arguments: JSON.stringify(part.args ?? {}),
168
+ },
169
+ };
170
+ }
171
+ function stringifyToolResult(part) {
172
+ if (Array.isArray(part.content) && part.content.length > 0) {
173
+ return part.content
174
+ .map((contentPart) => {
175
+ if (contentPart.type === 'text') {
176
+ return contentPart.text;
177
+ }
178
+ if (contentPart.type === 'image') {
179
+ const mediaType = contentPart.mediaType || 'image/png';
180
+ return `data:${mediaType};base64,${contentPart.data}`;
181
+ }
182
+ return '';
183
+ })
184
+ .join('');
185
+ }
186
+ if (part.result !== undefined) {
187
+ return JSON.stringify(part.result);
188
+ }
189
+ return '';
190
+ }
191
+ function mergeTextParts(parts) {
192
+ if (parts.length === 0) {
193
+ return '';
194
+ }
195
+ const hasNonText = parts.some((part) => part.type !== 'text');
196
+ if (hasNonText) {
197
+ return parts;
198
+ }
199
+ return parts.map((part) => (part.type === 'text' ? part.text ?? '' : '')).join('');
200
+ }
201
+ //# sourceMappingURL=convert-prompt.js.map
@@ -0,0 +1,4 @@
1
+ export { createQiniu, qiniu } from './provider';
2
+ export { QiniuChatModel } from './qiniu-chat-model';
3
+ export type { LanguageModelV2, LanguageModelV2CallOptions, LanguageModelV2CallWarning, LanguageModelV2Content, LanguageModelV2File, LanguageModelV2FilePart, LanguageModelV2FinishReason, LanguageModelV2FunctionTool, LanguageModelV2Message, LanguageModelV2Prompt, LanguageModelV2ProviderDefinedTool, LanguageModelV2Reasoning, LanguageModelV2ReasoningPart, LanguageModelV2ResponseMetadata, LanguageModelV2StreamPart, LanguageModelV2Text, LanguageModelV2TextPart, LanguageModelV2ToolCall, LanguageModelV2ToolCallDelta, LanguageModelV2ToolCallPart, LanguageModelV2ToolChoice, LanguageModelV2ToolResultPart, LanguageModelV2Usage, } from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,YAAY,EACR,eAAe,EACf,0BAA0B,EAC1B,0BAA0B,EAC1B,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,2BAA2B,EAC3B,2BAA2B,EAC3B,sBAAsB,EACtB,qBAAqB,EACrB,kCAAkC,EAClC,wBAAwB,EACxB,4BAA4B,EAC5B,+BAA+B,EAC/B,yBAAyB,EACzB,mBAAmB,EACnB,uBAAuB,EACvB,uBAAuB,EACvB,4BAA4B,EAC5B,2BAA2B,EAC3B,yBAAyB,EACzB,6BAA6B,EAC7B,oBAAoB,GACvB,MAAM,SAAS,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QiniuChatModel = exports.qiniu = exports.createQiniu = void 0;
4
+ var provider_1 = require("./provider");
5
+ Object.defineProperty(exports, "createQiniu", { enumerable: true, get: function () { return provider_1.createQiniu; } });
6
+ Object.defineProperty(exports, "qiniu", { enumerable: true, get: function () { return provider_1.qiniu; } });
7
+ var qiniu_chat_model_1 = require("./qiniu-chat-model");
8
+ Object.defineProperty(exports, "QiniuChatModel", { enumerable: true, get: function () { return qiniu_chat_model_1.QiniuChatModel; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapter/index.ts"],"names":[],"mappings":";;;AAAA,uCAAgD;AAAvC,uGAAA,WAAW,OAAA;AAAE,iGAAA,KAAK,OAAA;AAC3B,uDAAoD;AAA3C,kHAAA,cAAc,OAAA"}
@@ -0,0 +1,3 @@
1
+ export { createQiniu, qiniu } from './provider.mjs';
2
+ export { QiniuChatModel } from './qiniu-chat-model.mjs';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,14 @@
1
+ import { QiniuAI } from '../client';
2
+ import { QiniuChatModel } from './qiniu-chat-model';
3
+ export interface QiniuProviderSettings {
4
+ apiKey?: string;
5
+ baseUrl?: string;
6
+ client?: QiniuAI;
7
+ }
8
+ export declare function createQiniu(settings?: QiniuProviderSettings): {
9
+ languageModel: (modelId: string) => QiniuChatModel;
10
+ };
11
+ export declare const qiniu: {
12
+ languageModel: (modelId: string) => QiniuChatModel;
13
+ };
14
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/adapter/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,QAAQ,GAAE,qBAA0B;6BAiC/B,MAAM;EAEtC;AAED,eAAO,MAAM,KAAK;6BAJe,MAAM;CAIL,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.qiniu = void 0;
4
+ exports.createQiniu = createQiniu;
5
+ const client_1 = require("../client");
6
+ const qiniu_chat_model_1 = require("./qiniu-chat-model");
7
+ function createQiniu(settings = {}) {
8
+ let cachedClient;
9
+ const getClient = () => {
10
+ if (settings.client) {
11
+ return settings.client;
12
+ }
13
+ if (!cachedClient) {
14
+ const apiKey = settings.apiKey ||
15
+ process.env.QINIU_API_KEY ||
16
+ process.env.OPENAI_API_KEY ||
17
+ '';
18
+ if (!apiKey) {
19
+ throw new Error('Qiniu API key is required. Set apiKey or QINIU_API_KEY.');
20
+ }
21
+ const baseUrl = settings.baseUrl ||
22
+ process.env.QINIU_BASE_URL ||
23
+ process.env.OPENAI_BASE_URL;
24
+ cachedClient = new client_1.QiniuAI({
25
+ apiKey,
26
+ baseUrl,
27
+ });
28
+ }
29
+ return cachedClient;
30
+ };
31
+ return {
32
+ languageModel: (modelId) => new qiniu_chat_model_1.QiniuChatModel(getClient(), modelId),
33
+ };
34
+ }
35
+ exports.qiniu = createQiniu();
36
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/adapter/provider.ts"],"names":[],"mappings":";;;AASA,kCAmCC;AA5CD,sCAAoC;AACpC,yDAAoD;AAQpD,SAAgB,WAAW,CAAC,WAAkC,EAAE;IAC5D,IAAI,YAAiC,CAAC;IAEtC,MAAM,SAAS,GAAG,GAAG,EAAE;QACnB,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YAClB,OAAO,QAAQ,CAAC,MAAM,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,MAAM,GACR,QAAQ,CAAC,MAAM;gBACf,OAAO,CAAC,GAAG,CAAC,aAAa;gBACzB,OAAO,CAAC,GAAG,CAAC,cAAc;gBAC1B,EAAE,CAAC;YACP,IAAI,CAAC,MAAM,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC/E,CAAC;YAED,MAAM,OAAO,GACT,QAAQ,CAAC,OAAO;gBAChB,OAAO,CAAC,GAAG,CAAC,cAAc;gBAC1B,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YAEhC,YAAY,GAAG,IAAI,gBAAO,CAAC;gBACvB,MAAM;gBACN,OAAO;aACV,CAAC,CAAC;QACP,CAAC;QAED,OAAO,YAAY,CAAC;IACxB,CAAC,CAAC;IAEF,OAAO;QACH,aAAa,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,iCAAc,CAAC,SAAS,EAAE,EAAE,OAAO,CAAC;KAC/E,CAAC;AACN,CAAC;AAEY,QAAA,KAAK,GAAG,WAAW,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { QiniuAI } from '../client.mjs';
2
+ import { QiniuChatModel } from './qiniu-chat-model.mjs';
3
+ export function createQiniu(settings = {}) {
4
+ let cachedClient;
5
+ const getClient = () => {
6
+ if (settings.client) {
7
+ return settings.client;
8
+ }
9
+ if (!cachedClient) {
10
+ const apiKey = settings.apiKey ||
11
+ process.env.QINIU_API_KEY ||
12
+ process.env.OPENAI_API_KEY ||
13
+ '';
14
+ if (!apiKey) {
15
+ throw new Error('Qiniu API key is required. Set apiKey or QINIU_API_KEY.');
16
+ }
17
+ const baseUrl = settings.baseUrl ||
18
+ process.env.QINIU_BASE_URL ||
19
+ process.env.OPENAI_BASE_URL;
20
+ cachedClient = new QiniuAI({
21
+ apiKey,
22
+ baseUrl,
23
+ });
24
+ }
25
+ return cachedClient;
26
+ };
27
+ return {
28
+ languageModel: (modelId) => new QiniuChatModel(getClient(), modelId),
29
+ };
30
+ }
31
+ export const qiniu = createQiniu();
32
+ //# sourceMappingURL=provider.js.map