@aigne/doubao 1.3.0 → 1.74.0-beta
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 +8 -8
- package/dist/doubao-chat-model.cjs +34 -0
- package/{lib/dts/doubao-chat-model.d.ts → dist/doubao-chat-model.d.cts} +9 -4
- package/dist/doubao-chat-model.d.cts.map +1 -0
- package/{lib/cjs/doubao-chat-model.d.ts → dist/doubao-chat-model.d.mts} +9 -4
- package/dist/doubao-chat-model.d.mts.map +1 -0
- package/dist/doubao-chat-model.mjs +35 -0
- package/dist/doubao-chat-model.mjs.map +1 -0
- package/dist/doubao-image-model.cjs +180 -0
- package/dist/doubao-image-model.d.cts +38 -0
- package/dist/doubao-image-model.d.cts.map +1 -0
- package/dist/doubao-image-model.d.mts +38 -0
- package/dist/doubao-image-model.d.mts.map +1 -0
- package/dist/doubao-image-model.mjs +181 -0
- package/dist/doubao-image-model.mjs.map +1 -0
- package/dist/index.cjs +5 -0
- package/dist/index.d.cts +3 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.mjs +4 -0
- package/package.json +29 -30
- package/CHANGELOG.md +0 -1967
- package/lib/cjs/doubao-chat-model.js +0 -33
- package/lib/cjs/doubao-image-model.d.ts +0 -34
- package/lib/cjs/doubao-image-model.js +0 -176
- package/lib/cjs/index.d.ts +0 -2
- package/lib/cjs/index.js +0 -18
- package/lib/cjs/package.json +0 -3
- package/lib/dts/doubao-image-model.d.ts +0 -34
- package/lib/dts/index.d.ts +0 -2
- package/lib/esm/doubao-chat-model.d.ts +0 -21
- package/lib/esm/doubao-chat-model.js +0 -29
- package/lib/esm/doubao-image-model.d.ts +0 -34
- package/lib/esm/doubao-image-model.js +0 -172
- package/lib/esm/index.d.ts +0 -2
- package/lib/esm/index.js +0 -2
- package/lib/esm/package.json +0 -3
package/README.md
CHANGED
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
4
|
<picture>
|
|
5
|
-
<source srcset="https://raw.githubusercontent.com/
|
|
6
|
-
<source srcset="https://raw.githubusercontent.com/
|
|
7
|
-
<img src="https://raw.githubusercontent.com/
|
|
5
|
+
<source srcset="https://raw.githubusercontent.com/ArcBlock/aigne-framework/main/logo-dark.svg" media="(prefers-color-scheme: dark)">
|
|
6
|
+
<source srcset="https://raw.githubusercontent.com/ArcBlock/aigne-framework/main/logo.svg" media="(prefers-color-scheme: light)">
|
|
7
|
+
<img src="https://raw.githubusercontent.com/ArcBlock/aigne-framework/main/logo.svg" alt="AIGNE Logo" width="400" />
|
|
8
8
|
</picture>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
-
[](https://star-history.com/#ArcBlock/aigne-framework)
|
|
12
|
+
[](https://github.com/ArcBlock/aigne-framework/issues)
|
|
13
|
+
[](https://codecov.io/gh/ArcBlock/aigne-framework)
|
|
14
14
|
[](https://www.npmjs.com/package/@aigne/doubao)
|
|
15
|
-
[](https://github.com/
|
|
15
|
+
[](https://github.com/ArcBlock/aigne-framework/blob/main/LICENSE.md)
|
|
16
16
|
|
|
17
|
-
AIGNE Doubao SDK for integrating with Doubao AI models within the [AIGNE Framework](https://github.com/
|
|
17
|
+
AIGNE Doubao SDK for integrating with Doubao AI models within the [AIGNE Framework](https://github.com/ArcBlock/aigne-framework).
|
|
18
18
|
|
|
19
19
|
## Introduction
|
|
20
20
|
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
let _aigne_openai = require("@aigne/openai");
|
|
2
|
+
|
|
3
|
+
//#region src/doubao-chat-model.ts
|
|
4
|
+
const DOUBAO_DEFAULT_CHAT_MODEL = "doubao-seed-1-6-250615";
|
|
5
|
+
const DOUBAO_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3";
|
|
6
|
+
/**
|
|
7
|
+
* Implementation of the ChatModel interface for Doubao's API
|
|
8
|
+
*
|
|
9
|
+
* This model uses OpenAI-compatible API format to interact with Doubao's models,
|
|
10
|
+
* but with specific configuration and capabilities for Doubao.
|
|
11
|
+
*
|
|
12
|
+
* Default model: 'doubao-seed-1-6-250615'
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* Here's how to create and use a Doubao chat model:
|
|
16
|
+
* {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model}
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* Here's an example with streaming response:
|
|
20
|
+
* {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model-streaming}
|
|
21
|
+
*/
|
|
22
|
+
var DoubaoChatModel = class extends _aigne_openai.OpenAIChatModel {
|
|
23
|
+
constructor(options) {
|
|
24
|
+
super({
|
|
25
|
+
...options,
|
|
26
|
+
model: options?.model || DOUBAO_DEFAULT_CHAT_MODEL,
|
|
27
|
+
baseURL: options?.baseURL || DOUBAO_BASE_URL
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
apiKeyEnvName = "DOUBAO_API_KEY";
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
exports.DoubaoChatModel = DoubaoChatModel;
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { OpenAIChatModel,
|
|
1
|
+
import { OpenAIChatModel, OpenAIChatModelOptions } from "@aigne/openai";
|
|
2
|
+
|
|
3
|
+
//#region src/doubao-chat-model.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* Implementation of the ChatModel interface for Doubao's API
|
|
4
6
|
*
|
|
@@ -15,7 +17,10 @@ import { OpenAIChatModel, type OpenAIChatModelOptions } from "@aigne/openai";
|
|
|
15
17
|
* Here's an example with streaming response:
|
|
16
18
|
* {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model-streaming}
|
|
17
19
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
declare class DoubaoChatModel extends OpenAIChatModel {
|
|
21
|
+
constructor(options?: OpenAIChatModelOptions);
|
|
22
|
+
protected apiKeyEnvName: string;
|
|
21
23
|
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { DoubaoChatModel };
|
|
26
|
+
//# sourceMappingURL=doubao-chat-model.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao-chat-model.d.cts","names":[],"sources":["../src/doubao-chat-model.ts"],"mappings":";;;;AAqBA;;;;;;;;;;;;;;;cAAa,eAAA,SAAwB,eAAA;EAAA,YAAA,OAAA,GACb,sBAAA;EAAA,UAAA,aAAA;AAAA"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { OpenAIChatModel,
|
|
1
|
+
import { OpenAIChatModel, OpenAIChatModelOptions } from "@aigne/openai";
|
|
2
|
+
|
|
3
|
+
//#region src/doubao-chat-model.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* Implementation of the ChatModel interface for Doubao's API
|
|
4
6
|
*
|
|
@@ -15,7 +17,10 @@ import { OpenAIChatModel, type OpenAIChatModelOptions } from "@aigne/openai";
|
|
|
15
17
|
* Here's an example with streaming response:
|
|
16
18
|
* {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model-streaming}
|
|
17
19
|
*/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
declare class DoubaoChatModel extends OpenAIChatModel {
|
|
21
|
+
constructor(options?: OpenAIChatModelOptions);
|
|
22
|
+
protected apiKeyEnvName: string;
|
|
21
23
|
}
|
|
24
|
+
//#endregion
|
|
25
|
+
export { DoubaoChatModel };
|
|
26
|
+
//# sourceMappingURL=doubao-chat-model.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao-chat-model.d.mts","names":[],"sources":["../src/doubao-chat-model.ts"],"mappings":";;;;AAqBA;;;;;;;;;;;;;;;cAAa,eAAA,SAAwB,eAAA;EAAA,YAAA,OAAA,GACb,sBAAA;EAAA,UAAA,aAAA;AAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { OpenAIChatModel } from "@aigne/openai";
|
|
2
|
+
|
|
3
|
+
//#region src/doubao-chat-model.ts
|
|
4
|
+
const DOUBAO_DEFAULT_CHAT_MODEL = "doubao-seed-1-6-250615";
|
|
5
|
+
const DOUBAO_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3";
|
|
6
|
+
/**
|
|
7
|
+
* Implementation of the ChatModel interface for Doubao's API
|
|
8
|
+
*
|
|
9
|
+
* This model uses OpenAI-compatible API format to interact with Doubao's models,
|
|
10
|
+
* but with specific configuration and capabilities for Doubao.
|
|
11
|
+
*
|
|
12
|
+
* Default model: 'doubao-seed-1-6-250615'
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* Here's how to create and use a Doubao chat model:
|
|
16
|
+
* {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model}
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* Here's an example with streaming response:
|
|
20
|
+
* {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model-streaming}
|
|
21
|
+
*/
|
|
22
|
+
var DoubaoChatModel = class extends OpenAIChatModel {
|
|
23
|
+
constructor(options) {
|
|
24
|
+
super({
|
|
25
|
+
...options,
|
|
26
|
+
model: options?.model || DOUBAO_DEFAULT_CHAT_MODEL,
|
|
27
|
+
baseURL: options?.baseURL || DOUBAO_BASE_URL
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
apiKeyEnvName = "DOUBAO_API_KEY";
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
export { DoubaoChatModel };
|
|
35
|
+
//# sourceMappingURL=doubao-chat-model.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao-chat-model.mjs","names":[],"sources":["../src/doubao-chat-model.ts"],"sourcesContent":["import { OpenAIChatModel, type OpenAIChatModelOptions } from \"@aigne/openai\";\n\nconst DOUBAO_DEFAULT_CHAT_MODEL = \"doubao-seed-1-6-250615\";\nconst DOUBAO_BASE_URL = \"https://ark.cn-beijing.volces.com/api/v3\";\n\n/**\n * Implementation of the ChatModel interface for Doubao's API\n *\n * This model uses OpenAI-compatible API format to interact with Doubao's models,\n * but with specific configuration and capabilities for Doubao.\n *\n * Default model: 'doubao-seed-1-6-250615'\n *\n * @example\n * Here's how to create and use a Doubao chat model:\n * {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model}\n *\n * @example\n * Here's an example with streaming response:\n * {@includeCode ../test/doubao-chat-model.test.ts#example-doubao-chat-model-streaming}\n */\nexport class DoubaoChatModel extends OpenAIChatModel {\n constructor(options?: OpenAIChatModelOptions) {\n super({\n ...options,\n model: options?.model || DOUBAO_DEFAULT_CHAT_MODEL,\n baseURL: options?.baseURL || DOUBAO_BASE_URL,\n });\n }\n\n protected override apiKeyEnvName = \"DOUBAO_API_KEY\";\n}\n"],"mappings":";;;AAEA,MAAM,4BAA4B;AAClC,MAAM,kBAAkB;;;;;;;;;;;;;;;;;AAkBxB,IAAa,kBAAb,cAAqC,gBAAgB;CACnD,YAAY,SAAkC;AAC5C,QAAM;GACJ,GAAG;GACH,OAAO,SAAS,SAAS;GACzB,SAAS,SAAS,WAAW;GAC9B,CAAC;;CAGJ,AAAmB,gBAAgB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
let _aigne_core = require("@aigne/core");
|
|
2
|
+
let _aigne_core_utils_camelize = require("@aigne/core/utils/camelize");
|
|
3
|
+
let _aigne_core_utils_fetch = require("@aigne/core/utils/fetch");
|
|
4
|
+
let _aigne_core_utils_type_utils = require("@aigne/core/utils/type-utils");
|
|
5
|
+
let ufo = require("ufo");
|
|
6
|
+
let zod = require("zod");
|
|
7
|
+
|
|
8
|
+
//#region src/doubao-image-model.ts
|
|
9
|
+
const DOUBAO_DEFAULT_IMAGE_MODEL = "doubao-seedream-4-0-250828";
|
|
10
|
+
const DOUBAO_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3";
|
|
11
|
+
const OUTPUT_MIME_TYPE = "image/jpeg";
|
|
12
|
+
const doubaoImageModelInputSchema = _aigne_core.imageModelInputSchema.extend({});
|
|
13
|
+
const doubaoImageModelOptionsSchema = zod.z.object({
|
|
14
|
+
apiKey: zod.z.string().optional(),
|
|
15
|
+
baseURL: zod.z.string().optional(),
|
|
16
|
+
model: zod.z.string().optional(),
|
|
17
|
+
modelOptions: zod.z.object({}).optional(),
|
|
18
|
+
clientOptions: zod.z.object({}).optional()
|
|
19
|
+
});
|
|
20
|
+
var DoubaoImageModel = class extends _aigne_core.ImageModel {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
super({
|
|
23
|
+
...options,
|
|
24
|
+
inputSchema: doubaoImageModelInputSchema,
|
|
25
|
+
description: options?.description ?? "Draw or edit image by Doubao image models"
|
|
26
|
+
});
|
|
27
|
+
this.options = options;
|
|
28
|
+
if (options) (0, _aigne_core_utils_type_utils.checkArguments)(this.name, doubaoImageModelOptionsSchema, options);
|
|
29
|
+
}
|
|
30
|
+
apiKeyEnvName = "DOUBAO_API_KEY";
|
|
31
|
+
get credential() {
|
|
32
|
+
return {
|
|
33
|
+
url: this.options?.baseURL || process.env.DOUBAO_BASE_URL || DOUBAO_BASE_URL,
|
|
34
|
+
apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],
|
|
35
|
+
model: this.options?.model || DOUBAO_DEFAULT_IMAGE_MODEL
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
get modelOptions() {
|
|
39
|
+
return this.options?.modelOptions;
|
|
40
|
+
}
|
|
41
|
+
extractDataObjects(text) {
|
|
42
|
+
const dataObjects = [];
|
|
43
|
+
const lines = text.split("\n");
|
|
44
|
+
for (const line of lines) {
|
|
45
|
+
const trimmed = line.trim();
|
|
46
|
+
if (trimmed.startsWith("data:")) {
|
|
47
|
+
const jsonPart = trimmed.slice(5).trim();
|
|
48
|
+
if (jsonPart === "[DONE]") continue;
|
|
49
|
+
try {
|
|
50
|
+
const obj = JSON.parse(jsonPart);
|
|
51
|
+
dataObjects.push(obj);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
console.warn("Failed to parse JSON data object:", jsonPart, e);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return dataObjects;
|
|
58
|
+
}
|
|
59
|
+
async process(input, _options) {
|
|
60
|
+
const model = input.modelOptions?.model || this.credential.model;
|
|
61
|
+
const { url, apiKey } = this.credential;
|
|
62
|
+
if (!apiKey) throw new Error(`${this.name} requires an API key. Please provide it via \`options.apiKey\`, or set the \`${this.apiKeyEnvName}\` environment variable`);
|
|
63
|
+
const map = {
|
|
64
|
+
"doubao-seedream-4": [
|
|
65
|
+
"model",
|
|
66
|
+
"prompt",
|
|
67
|
+
"size",
|
|
68
|
+
"sequentialImageGeneration",
|
|
69
|
+
"sequentialImageGenerationOptions",
|
|
70
|
+
"stream",
|
|
71
|
+
"responseFormat",
|
|
72
|
+
"watermark"
|
|
73
|
+
],
|
|
74
|
+
"doubao-seedream-3-0-t2i": [
|
|
75
|
+
"model",
|
|
76
|
+
"prompt",
|
|
77
|
+
"size",
|
|
78
|
+
"seed",
|
|
79
|
+
"guidanceScale",
|
|
80
|
+
"responseFormat",
|
|
81
|
+
"watermark"
|
|
82
|
+
],
|
|
83
|
+
"doubao-seededit-3-0-i2i": [
|
|
84
|
+
"model",
|
|
85
|
+
"prompt",
|
|
86
|
+
"size",
|
|
87
|
+
"seed",
|
|
88
|
+
"guidanceScale",
|
|
89
|
+
"responseFormat",
|
|
90
|
+
"watermark"
|
|
91
|
+
]
|
|
92
|
+
};
|
|
93
|
+
const key = Object.keys(map).find((key$1) => model.includes(key$1));
|
|
94
|
+
if (!key) throw new Error(`${this.name} only support ${Object.keys(map).join(", ")}`);
|
|
95
|
+
if (!map[key]) throw new Error(`${this.name} only support ${Object.keys(map).join(", ")}`);
|
|
96
|
+
const mergeInput = {
|
|
97
|
+
...this.modelOptions,
|
|
98
|
+
...input.modelOptions,
|
|
99
|
+
...input
|
|
100
|
+
};
|
|
101
|
+
const image = await Promise.all((0, _aigne_core_utils_type_utils.flat)(input.image).map((image$1) => this.transformFileType("file", image$1).then((file) => `data:${file.mimeType || "image/png"};base64,${file.data}`)));
|
|
102
|
+
const body = {
|
|
103
|
+
...(0, _aigne_core_utils_camelize.snakelize)((0, _aigne_core_utils_type_utils.pick)(mergeInput, map[key])),
|
|
104
|
+
model,
|
|
105
|
+
response_format: "b64_json",
|
|
106
|
+
watermark: mergeInput.watermark ?? false,
|
|
107
|
+
image: image.length ? image : void 0
|
|
108
|
+
};
|
|
109
|
+
const response = await (0, _aigne_core_utils_fetch.fetch)((0, ufo.joinURL)(url, `/images/generations`), {
|
|
110
|
+
method: "POST",
|
|
111
|
+
headers: {
|
|
112
|
+
Authorization: `Bearer ${apiKey}`,
|
|
113
|
+
"Content-Type": "application/json"
|
|
114
|
+
},
|
|
115
|
+
body: JSON.stringify(body),
|
|
116
|
+
timeout: this.options?.clientOptions?.timeout ?? 60 * 1e3
|
|
117
|
+
});
|
|
118
|
+
if (body.stream) {
|
|
119
|
+
if (!response.body) throw new Error("Streaming not supported in this environment");
|
|
120
|
+
const reader = response.body.getReader();
|
|
121
|
+
const decoder = new TextDecoder();
|
|
122
|
+
let done = false;
|
|
123
|
+
let buffer = "";
|
|
124
|
+
while (!done) {
|
|
125
|
+
const { value, done: doneReading } = await reader.read();
|
|
126
|
+
done = doneReading;
|
|
127
|
+
if (value) buffer += decoder.decode(value);
|
|
128
|
+
}
|
|
129
|
+
const dataObjects = this.extractDataObjects(buffer);
|
|
130
|
+
const error = dataObjects.find((i) => i.type === "image_generation.partial_failed");
|
|
131
|
+
if (error) throw new Error(`Doubao API error: ${error.error.message}`);
|
|
132
|
+
const completed = dataObjects.find((i) => i.type === "image_generation.completed");
|
|
133
|
+
return {
|
|
134
|
+
images: dataObjects.filter((i) => i.type === "image_generation.partial_succeeded").map((i) => {
|
|
135
|
+
if (typeof i.url === "string") return {
|
|
136
|
+
type: "url",
|
|
137
|
+
url: i.url,
|
|
138
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
139
|
+
};
|
|
140
|
+
if (typeof i.b64_json === "string") return {
|
|
141
|
+
type: "file",
|
|
142
|
+
data: i.b64_json,
|
|
143
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
144
|
+
};
|
|
145
|
+
throw new Error("Image response does not contain a valid URL or base64 data");
|
|
146
|
+
}),
|
|
147
|
+
usage: {
|
|
148
|
+
inputTokens: 0,
|
|
149
|
+
outputTokens: completed?.usage.output_tokens || 0
|
|
150
|
+
},
|
|
151
|
+
model
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const data = await response.json();
|
|
155
|
+
if (data.error) throw new Error(`Doubao API error: ${data.error.message}`);
|
|
156
|
+
return {
|
|
157
|
+
images: data.data.map((item) => {
|
|
158
|
+
if (item.url) return {
|
|
159
|
+
type: "url",
|
|
160
|
+
url: item.url,
|
|
161
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
162
|
+
};
|
|
163
|
+
if (item.b64_json) return {
|
|
164
|
+
type: "file",
|
|
165
|
+
data: item.b64_json,
|
|
166
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
167
|
+
};
|
|
168
|
+
throw new Error("Image response does not contain a valid URL or base64 data");
|
|
169
|
+
}),
|
|
170
|
+
usage: {
|
|
171
|
+
inputTokens: 0,
|
|
172
|
+
outputTokens: data?.usage?.output_tokens || 0
|
|
173
|
+
},
|
|
174
|
+
model: data.model
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
//#endregion
|
|
180
|
+
exports.DoubaoImageModel = DoubaoImageModel;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AgentInvokeOptions, ImageModel, ImageModelInput, ImageModelOptions, ImageModelOutput } from "@aigne/core";
|
|
2
|
+
|
|
3
|
+
//#region src/doubao-image-model.d.ts
|
|
4
|
+
interface DoubaoImageModelInput extends ImageModelInput {
|
|
5
|
+
size?: string;
|
|
6
|
+
seed?: number;
|
|
7
|
+
sequentialImageGeneration?: boolean;
|
|
8
|
+
sequentialImageGenerationOptions?: {
|
|
9
|
+
maxImages: number;
|
|
10
|
+
};
|
|
11
|
+
stream?: boolean;
|
|
12
|
+
guidanceScale?: number;
|
|
13
|
+
watermark?: boolean;
|
|
14
|
+
}
|
|
15
|
+
interface DoubaoImageModelOutput extends ImageModelOutput {}
|
|
16
|
+
interface DoubaoImageModelOptions extends ImageModelOptions<DoubaoImageModelInput, DoubaoImageModelOutput> {
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
baseURL?: string;
|
|
19
|
+
model?: string;
|
|
20
|
+
modelOptions?: Omit<Partial<DoubaoImageModelInput>, "model">;
|
|
21
|
+
clientOptions?: Record<string, any>;
|
|
22
|
+
}
|
|
23
|
+
declare class DoubaoImageModel extends ImageModel<DoubaoImageModelInput, DoubaoImageModelOutput> {
|
|
24
|
+
options?: DoubaoImageModelOptions | undefined;
|
|
25
|
+
constructor(options?: DoubaoImageModelOptions | undefined);
|
|
26
|
+
protected apiKeyEnvName: string;
|
|
27
|
+
get credential(): {
|
|
28
|
+
url: string;
|
|
29
|
+
apiKey: string | undefined;
|
|
30
|
+
model: string;
|
|
31
|
+
};
|
|
32
|
+
get modelOptions(): Omit<Partial<DoubaoImageModelInput>, "model"> | undefined;
|
|
33
|
+
private extractDataObjects;
|
|
34
|
+
process(input: DoubaoImageModelInput, _options: AgentInvokeOptions): Promise<ImageModelOutput>;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { DoubaoImageModel, DoubaoImageModelInput, DoubaoImageModelOptions, DoubaoImageModelOutput };
|
|
38
|
+
//# sourceMappingURL=doubao-image-model.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao-image-model.d.cts","names":[],"sources":["../src/doubao-image-model.ts"],"mappings":";;;UAmBiB,qBAAA,SAA8B,eAAA;EAAA,IAAA;EAAA,IAAA;EAAA,yBAAA;EAAA,gCAAA;IAAA,SAAA;EAAA;EAAA,MAAA;EAAA,aAAA;EAAA,SAAA;AAAA;AAAA,UAY9B,sBAAA,SAA+B,gBAAA;AAAA,UAE/B,uBAAA,SACP,iBAAA,CAAkB,qBAAA,EAAuB,sBAAA;EAAA,MAAA;EAAA,OAAA;EAAA,KAAA;EAAA,YAAA,GAIlC,IAAA,CAAK,OAAA,CAAQ,qBAAA;EAAA,aAAA,GACZ,MAAA;AAAA;AAAA,cAaL,gBAAA,SAAyB,UAAA,CAAW,qBAAA,EAAuB,sBAAA;EAAA,OAAA,GAChC,uBAAA;EAAA,YAAA,OAAA,GAAA,uBAAA;EAAA,UAAA,aAAA;EAAA,IAAA,WAAA;IAAA,GAAA;IAAA,MAAA;IAAA,KAAA;EAAA;EAAA,IAAA,aAAA,GAoBtB,IAAA,CAAA,OAAA,CAAA,qBAAA;EAAA,QAAA,kBAAA;EAAA,QAAA,KAAA,EA4BP,qBAAA,EAAA,QAAA,EACG,kBAAA,GACT,OAAA,CAAQ,gBAAA;AAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { AgentInvokeOptions, ImageModel, ImageModelInput, ImageModelOptions, ImageModelOutput } from "@aigne/core";
|
|
2
|
+
|
|
3
|
+
//#region src/doubao-image-model.d.ts
|
|
4
|
+
interface DoubaoImageModelInput extends ImageModelInput {
|
|
5
|
+
size?: string;
|
|
6
|
+
seed?: number;
|
|
7
|
+
sequentialImageGeneration?: boolean;
|
|
8
|
+
sequentialImageGenerationOptions?: {
|
|
9
|
+
maxImages: number;
|
|
10
|
+
};
|
|
11
|
+
stream?: boolean;
|
|
12
|
+
guidanceScale?: number;
|
|
13
|
+
watermark?: boolean;
|
|
14
|
+
}
|
|
15
|
+
interface DoubaoImageModelOutput extends ImageModelOutput {}
|
|
16
|
+
interface DoubaoImageModelOptions extends ImageModelOptions<DoubaoImageModelInput, DoubaoImageModelOutput> {
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
baseURL?: string;
|
|
19
|
+
model?: string;
|
|
20
|
+
modelOptions?: Omit<Partial<DoubaoImageModelInput>, "model">;
|
|
21
|
+
clientOptions?: Record<string, any>;
|
|
22
|
+
}
|
|
23
|
+
declare class DoubaoImageModel extends ImageModel<DoubaoImageModelInput, DoubaoImageModelOutput> {
|
|
24
|
+
options?: DoubaoImageModelOptions | undefined;
|
|
25
|
+
constructor(options?: DoubaoImageModelOptions | undefined);
|
|
26
|
+
protected apiKeyEnvName: string;
|
|
27
|
+
get credential(): {
|
|
28
|
+
url: string;
|
|
29
|
+
apiKey: string | undefined;
|
|
30
|
+
model: string;
|
|
31
|
+
};
|
|
32
|
+
get modelOptions(): Omit<Partial<DoubaoImageModelInput>, "model"> | undefined;
|
|
33
|
+
private extractDataObjects;
|
|
34
|
+
process(input: DoubaoImageModelInput, _options: AgentInvokeOptions): Promise<ImageModelOutput>;
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { DoubaoImageModel, DoubaoImageModelInput, DoubaoImageModelOptions, DoubaoImageModelOutput };
|
|
38
|
+
//# sourceMappingURL=doubao-image-model.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao-image-model.d.mts","names":[],"sources":["../src/doubao-image-model.ts"],"mappings":";;;UAmBiB,qBAAA,SAA8B,eAAA;EAAA,IAAA;EAAA,IAAA;EAAA,yBAAA;EAAA,gCAAA;IAAA,SAAA;EAAA;EAAA,MAAA;EAAA,aAAA;EAAA,SAAA;AAAA;AAAA,UAY9B,sBAAA,SAA+B,gBAAA;AAAA,UAE/B,uBAAA,SACP,iBAAA,CAAkB,qBAAA,EAAuB,sBAAA;EAAA,MAAA;EAAA,OAAA;EAAA,KAAA;EAAA,YAAA,GAIlC,IAAA,CAAK,OAAA,CAAQ,qBAAA;EAAA,aAAA,GACZ,MAAA;AAAA;AAAA,cAaL,gBAAA,SAAyB,UAAA,CAAW,qBAAA,EAAuB,sBAAA;EAAA,OAAA,GAChC,uBAAA;EAAA,YAAA,OAAA,GAAA,uBAAA;EAAA,UAAA,aAAA;EAAA,IAAA,WAAA;IAAA,GAAA;IAAA,MAAA;IAAA,KAAA;EAAA;EAAA,IAAA,aAAA,GAoBtB,IAAA,CAAA,OAAA,CAAA,qBAAA;EAAA,QAAA,kBAAA;EAAA,QAAA,KAAA,EA4BP,qBAAA,EAAA,QAAA,EACG,kBAAA,GACT,OAAA,CAAQ,gBAAA;AAAA"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { ImageModel, imageModelInputSchema } from "@aigne/core";
|
|
2
|
+
import { snakelize } from "@aigne/core/utils/camelize";
|
|
3
|
+
import { fetch } from "@aigne/core/utils/fetch";
|
|
4
|
+
import { checkArguments, flat, pick } from "@aigne/core/utils/type-utils";
|
|
5
|
+
import { joinURL } from "ufo";
|
|
6
|
+
import { z } from "zod";
|
|
7
|
+
|
|
8
|
+
//#region src/doubao-image-model.ts
|
|
9
|
+
const DOUBAO_DEFAULT_IMAGE_MODEL = "doubao-seedream-4-0-250828";
|
|
10
|
+
const DOUBAO_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3";
|
|
11
|
+
const OUTPUT_MIME_TYPE = "image/jpeg";
|
|
12
|
+
const doubaoImageModelInputSchema = imageModelInputSchema.extend({});
|
|
13
|
+
const doubaoImageModelOptionsSchema = z.object({
|
|
14
|
+
apiKey: z.string().optional(),
|
|
15
|
+
baseURL: z.string().optional(),
|
|
16
|
+
model: z.string().optional(),
|
|
17
|
+
modelOptions: z.object({}).optional(),
|
|
18
|
+
clientOptions: z.object({}).optional()
|
|
19
|
+
});
|
|
20
|
+
var DoubaoImageModel = class extends ImageModel {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
super({
|
|
23
|
+
...options,
|
|
24
|
+
inputSchema: doubaoImageModelInputSchema,
|
|
25
|
+
description: options?.description ?? "Draw or edit image by Doubao image models"
|
|
26
|
+
});
|
|
27
|
+
this.options = options;
|
|
28
|
+
if (options) checkArguments(this.name, doubaoImageModelOptionsSchema, options);
|
|
29
|
+
}
|
|
30
|
+
apiKeyEnvName = "DOUBAO_API_KEY";
|
|
31
|
+
get credential() {
|
|
32
|
+
return {
|
|
33
|
+
url: this.options?.baseURL || process.env.DOUBAO_BASE_URL || DOUBAO_BASE_URL,
|
|
34
|
+
apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],
|
|
35
|
+
model: this.options?.model || DOUBAO_DEFAULT_IMAGE_MODEL
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
get modelOptions() {
|
|
39
|
+
return this.options?.modelOptions;
|
|
40
|
+
}
|
|
41
|
+
extractDataObjects(text) {
|
|
42
|
+
const dataObjects = [];
|
|
43
|
+
const lines = text.split("\n");
|
|
44
|
+
for (const line of lines) {
|
|
45
|
+
const trimmed = line.trim();
|
|
46
|
+
if (trimmed.startsWith("data:")) {
|
|
47
|
+
const jsonPart = trimmed.slice(5).trim();
|
|
48
|
+
if (jsonPart === "[DONE]") continue;
|
|
49
|
+
try {
|
|
50
|
+
const obj = JSON.parse(jsonPart);
|
|
51
|
+
dataObjects.push(obj);
|
|
52
|
+
} catch (e) {
|
|
53
|
+
console.warn("Failed to parse JSON data object:", jsonPart, e);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return dataObjects;
|
|
58
|
+
}
|
|
59
|
+
async process(input, _options) {
|
|
60
|
+
const model = input.modelOptions?.model || this.credential.model;
|
|
61
|
+
const { url, apiKey } = this.credential;
|
|
62
|
+
if (!apiKey) throw new Error(`${this.name} requires an API key. Please provide it via \`options.apiKey\`, or set the \`${this.apiKeyEnvName}\` environment variable`);
|
|
63
|
+
const map = {
|
|
64
|
+
"doubao-seedream-4": [
|
|
65
|
+
"model",
|
|
66
|
+
"prompt",
|
|
67
|
+
"size",
|
|
68
|
+
"sequentialImageGeneration",
|
|
69
|
+
"sequentialImageGenerationOptions",
|
|
70
|
+
"stream",
|
|
71
|
+
"responseFormat",
|
|
72
|
+
"watermark"
|
|
73
|
+
],
|
|
74
|
+
"doubao-seedream-3-0-t2i": [
|
|
75
|
+
"model",
|
|
76
|
+
"prompt",
|
|
77
|
+
"size",
|
|
78
|
+
"seed",
|
|
79
|
+
"guidanceScale",
|
|
80
|
+
"responseFormat",
|
|
81
|
+
"watermark"
|
|
82
|
+
],
|
|
83
|
+
"doubao-seededit-3-0-i2i": [
|
|
84
|
+
"model",
|
|
85
|
+
"prompt",
|
|
86
|
+
"size",
|
|
87
|
+
"seed",
|
|
88
|
+
"guidanceScale",
|
|
89
|
+
"responseFormat",
|
|
90
|
+
"watermark"
|
|
91
|
+
]
|
|
92
|
+
};
|
|
93
|
+
const key = Object.keys(map).find((key$1) => model.includes(key$1));
|
|
94
|
+
if (!key) throw new Error(`${this.name} only support ${Object.keys(map).join(", ")}`);
|
|
95
|
+
if (!map[key]) throw new Error(`${this.name} only support ${Object.keys(map).join(", ")}`);
|
|
96
|
+
const mergeInput = {
|
|
97
|
+
...this.modelOptions,
|
|
98
|
+
...input.modelOptions,
|
|
99
|
+
...input
|
|
100
|
+
};
|
|
101
|
+
const image = await Promise.all(flat(input.image).map((image$1) => this.transformFileType("file", image$1).then((file) => `data:${file.mimeType || "image/png"};base64,${file.data}`)));
|
|
102
|
+
const body = {
|
|
103
|
+
...snakelize(pick(mergeInput, map[key])),
|
|
104
|
+
model,
|
|
105
|
+
response_format: "b64_json",
|
|
106
|
+
watermark: mergeInput.watermark ?? false,
|
|
107
|
+
image: image.length ? image : void 0
|
|
108
|
+
};
|
|
109
|
+
const response = await fetch(joinURL(url, `/images/generations`), {
|
|
110
|
+
method: "POST",
|
|
111
|
+
headers: {
|
|
112
|
+
Authorization: `Bearer ${apiKey}`,
|
|
113
|
+
"Content-Type": "application/json"
|
|
114
|
+
},
|
|
115
|
+
body: JSON.stringify(body),
|
|
116
|
+
timeout: this.options?.clientOptions?.timeout ?? 60 * 1e3
|
|
117
|
+
});
|
|
118
|
+
if (body.stream) {
|
|
119
|
+
if (!response.body) throw new Error("Streaming not supported in this environment");
|
|
120
|
+
const reader = response.body.getReader();
|
|
121
|
+
const decoder = new TextDecoder();
|
|
122
|
+
let done = false;
|
|
123
|
+
let buffer = "";
|
|
124
|
+
while (!done) {
|
|
125
|
+
const { value, done: doneReading } = await reader.read();
|
|
126
|
+
done = doneReading;
|
|
127
|
+
if (value) buffer += decoder.decode(value);
|
|
128
|
+
}
|
|
129
|
+
const dataObjects = this.extractDataObjects(buffer);
|
|
130
|
+
const error = dataObjects.find((i) => i.type === "image_generation.partial_failed");
|
|
131
|
+
if (error) throw new Error(`Doubao API error: ${error.error.message}`);
|
|
132
|
+
const completed = dataObjects.find((i) => i.type === "image_generation.completed");
|
|
133
|
+
return {
|
|
134
|
+
images: dataObjects.filter((i) => i.type === "image_generation.partial_succeeded").map((i) => {
|
|
135
|
+
if (typeof i.url === "string") return {
|
|
136
|
+
type: "url",
|
|
137
|
+
url: i.url,
|
|
138
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
139
|
+
};
|
|
140
|
+
if (typeof i.b64_json === "string") return {
|
|
141
|
+
type: "file",
|
|
142
|
+
data: i.b64_json,
|
|
143
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
144
|
+
};
|
|
145
|
+
throw new Error("Image response does not contain a valid URL or base64 data");
|
|
146
|
+
}),
|
|
147
|
+
usage: {
|
|
148
|
+
inputTokens: 0,
|
|
149
|
+
outputTokens: completed?.usage.output_tokens || 0
|
|
150
|
+
},
|
|
151
|
+
model
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const data = await response.json();
|
|
155
|
+
if (data.error) throw new Error(`Doubao API error: ${data.error.message}`);
|
|
156
|
+
return {
|
|
157
|
+
images: data.data.map((item) => {
|
|
158
|
+
if (item.url) return {
|
|
159
|
+
type: "url",
|
|
160
|
+
url: item.url,
|
|
161
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
162
|
+
};
|
|
163
|
+
if (item.b64_json) return {
|
|
164
|
+
type: "file",
|
|
165
|
+
data: item.b64_json,
|
|
166
|
+
mimeType: OUTPUT_MIME_TYPE
|
|
167
|
+
};
|
|
168
|
+
throw new Error("Image response does not contain a valid URL or base64 data");
|
|
169
|
+
}),
|
|
170
|
+
usage: {
|
|
171
|
+
inputTokens: 0,
|
|
172
|
+
outputTokens: data?.usage?.output_tokens || 0
|
|
173
|
+
},
|
|
174
|
+
model: data.model
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
//#endregion
|
|
180
|
+
export { DoubaoImageModel };
|
|
181
|
+
//# sourceMappingURL=doubao-image-model.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doubao-image-model.mjs","names":["key","image"],"sources":["../src/doubao-image-model.ts"],"sourcesContent":["import {\n type AgentInvokeOptions,\n type FileUnionContent,\n ImageModel,\n type ImageModelInput,\n type ImageModelOptions,\n type ImageModelOutput,\n imageModelInputSchema,\n} from \"@aigne/core\";\nimport { snakelize } from \"@aigne/core/utils/camelize\";\nimport { fetch } from \"@aigne/core/utils/fetch\";\nimport { checkArguments, flat, pick } from \"@aigne/core/utils/type-utils\";\nimport { joinURL } from \"ufo\";\nimport { z } from \"zod\";\n\nconst DOUBAO_DEFAULT_IMAGE_MODEL = \"doubao-seedream-4-0-250828\";\nconst DOUBAO_BASE_URL = \"https://ark.cn-beijing.volces.com/api/v3\";\nconst OUTPUT_MIME_TYPE = \"image/jpeg\";\n\nexport interface DoubaoImageModelInput extends ImageModelInput {\n size?: string;\n seed?: number;\n sequentialImageGeneration?: boolean;\n sequentialImageGenerationOptions?: {\n maxImages: number;\n };\n stream?: boolean;\n guidanceScale?: number;\n watermark?: boolean;\n}\n\nexport interface DoubaoImageModelOutput extends ImageModelOutput {}\n\nexport interface DoubaoImageModelOptions\n extends ImageModelOptions<DoubaoImageModelInput, DoubaoImageModelOutput> {\n apiKey?: string;\n baseURL?: string;\n model?: string;\n modelOptions?: Omit<Partial<DoubaoImageModelInput>, \"model\">;\n clientOptions?: Record<string, any>;\n}\n\nconst doubaoImageModelInputSchema = imageModelInputSchema.extend({});\n\nconst doubaoImageModelOptionsSchema = z.object({\n apiKey: z.string().optional(),\n baseURL: z.string().optional(),\n model: z.string().optional(),\n modelOptions: z.object({}).optional(),\n clientOptions: z.object({}).optional(),\n});\n\nexport class DoubaoImageModel extends ImageModel<DoubaoImageModelInput, DoubaoImageModelOutput> {\n constructor(public override options?: DoubaoImageModelOptions) {\n super({\n ...options,\n inputSchema: doubaoImageModelInputSchema,\n description: options?.description ?? \"Draw or edit image by Doubao image models\",\n });\n\n if (options) checkArguments(this.name, doubaoImageModelOptionsSchema, options);\n }\n\n protected apiKeyEnvName = \"DOUBAO_API_KEY\";\n\n override get credential() {\n return {\n url: this.options?.baseURL || process.env.DOUBAO_BASE_URL || DOUBAO_BASE_URL,\n apiKey: this.options?.apiKey || process.env[this.apiKeyEnvName],\n model: this.options?.model || DOUBAO_DEFAULT_IMAGE_MODEL,\n };\n }\n\n get modelOptions() {\n return this.options?.modelOptions;\n }\n\n private extractDataObjects(text: string) {\n const dataObjects = [];\n const lines = text.split(\"\\n\");\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith(\"data:\")) {\n const jsonPart = trimmed.slice(5).trim();\n if (jsonPart === \"[DONE]\") continue;\n\n try {\n const obj = JSON.parse(jsonPart);\n dataObjects.push(obj);\n } catch (e) {\n console.warn(\"Failed to parse JSON data object:\", jsonPart, e);\n }\n }\n }\n\n return dataObjects;\n }\n\n override async process(\n input: DoubaoImageModelInput,\n _options: AgentInvokeOptions,\n ): Promise<ImageModelOutput> {\n const model = input.modelOptions?.model || this.credential.model;\n const { url, apiKey } = this.credential;\n if (!apiKey) {\n throw new Error(\n `${this.name} requires an API key. Please provide it via \\`options.apiKey\\`, or set the \\`${this.apiKeyEnvName}\\` environment variable`,\n );\n }\n\n const map: { [key: string]: string[] } = {\n \"doubao-seedream-4\": [\n \"model\",\n \"prompt\",\n \"size\",\n \"sequentialImageGeneration\",\n \"sequentialImageGenerationOptions\",\n \"stream\",\n \"responseFormat\",\n \"watermark\",\n ],\n \"doubao-seedream-3-0-t2i\": [\n \"model\",\n \"prompt\",\n \"size\",\n \"seed\",\n \"guidanceScale\",\n \"responseFormat\",\n \"watermark\",\n ],\n \"doubao-seededit-3-0-i2i\": [\n \"model\",\n \"prompt\",\n \"size\",\n \"seed\",\n \"guidanceScale\",\n \"responseFormat\",\n \"watermark\",\n ],\n };\n\n const key = Object.keys(map).find((key) => model.includes(key));\n if (!key) {\n throw new Error(`${this.name} only support ${Object.keys(map).join(\", \")}`);\n }\n\n if (!map[key]) {\n throw new Error(`${this.name} only support ${Object.keys(map).join(\", \")}`);\n }\n\n const mergeInput = { ...this.modelOptions, ...input.modelOptions, ...input };\n\n const image = await Promise.all(\n flat(input.image).map((image) =>\n this.transformFileType(\"file\", image).then(\n (file) => `data:${file.mimeType || \"image/png\"};base64,${file.data}`,\n ),\n ),\n );\n\n const body = {\n ...snakelize(pick(mergeInput, map[key])),\n model,\n response_format: \"b64_json\",\n watermark: mergeInput.watermark ?? false,\n image: image.length ? image : undefined,\n };\n\n const response = await fetch(joinURL(url, `/images/generations`), {\n method: \"POST\",\n headers: { Authorization: `Bearer ${apiKey}`, \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n timeout: this.options?.clientOptions?.timeout ?? 60 * 1000,\n });\n\n if (body.stream) {\n if (!response.body) throw new Error(\"Streaming not supported in this environment\");\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let done = false;\n let buffer = \"\";\n\n while (!done) {\n const { value, done: doneReading } = await reader.read();\n done = doneReading;\n if (value) {\n buffer += decoder.decode(value);\n }\n }\n\n const dataObjects = this.extractDataObjects(buffer);\n const error = dataObjects.find((i) => i.type === \"image_generation.partial_failed\");\n if (error) {\n throw new Error(`Doubao API error: ${error.error.message}`);\n }\n\n const completed = dataObjects.find((i) => i.type === \"image_generation.completed\");\n\n return {\n images: dataObjects\n .filter((i) => i.type === \"image_generation.partial_succeeded\")\n .map<FileUnionContent>((i) => {\n if (typeof i.url === \"string\")\n return { type: \"url\", url: i.url, mimeType: OUTPUT_MIME_TYPE };\n if (typeof i.b64_json === \"string\")\n return { type: \"file\", data: i.b64_json, mimeType: OUTPUT_MIME_TYPE };\n throw new Error(\"Image response does not contain a valid URL or base64 data\");\n }),\n usage: { inputTokens: 0, outputTokens: completed?.usage.output_tokens || 0 },\n model: model,\n };\n }\n\n const data: {\n model: string;\n usage?: { output_tokens?: number };\n data: { url?: string; b64_json?: string }[];\n error?: { message: string };\n } = await response.json();\n\n if (data.error) {\n throw new Error(`Doubao API error: ${data.error.message}`);\n }\n\n return {\n images: data.data.map<FileUnionContent>((item) => {\n if (item.url) return { type: \"url\", url: item.url, mimeType: OUTPUT_MIME_TYPE };\n if (item.b64_json) return { type: \"file\", data: item.b64_json, mimeType: OUTPUT_MIME_TYPE };\n throw new Error(\"Image response does not contain a valid URL or base64 data\");\n }),\n usage: {\n inputTokens: 0,\n outputTokens: data?.usage?.output_tokens || 0,\n },\n model: data.model,\n };\n }\n}\n"],"mappings":"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"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
const require_doubao_chat_model = require('./doubao-chat-model.cjs');
|
|
2
|
+
const require_doubao_image_model = require('./doubao-image-model.cjs');
|
|
3
|
+
|
|
4
|
+
exports.DoubaoChatModel = require_doubao_chat_model.DoubaoChatModel;
|
|
5
|
+
exports.DoubaoImageModel = require_doubao_image_model.DoubaoImageModel;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { DoubaoChatModel } from "./doubao-chat-model.cjs";
|
|
2
|
+
import { DoubaoImageModel, DoubaoImageModelInput, DoubaoImageModelOptions, DoubaoImageModelOutput } from "./doubao-image-model.cjs";
|
|
3
|
+
export { DoubaoChatModel, DoubaoImageModel, DoubaoImageModelInput, DoubaoImageModelOptions, DoubaoImageModelOutput };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { DoubaoChatModel } from "./doubao-chat-model.mjs";
|
|
2
|
+
import { DoubaoImageModel, DoubaoImageModelInput, DoubaoImageModelOptions, DoubaoImageModelOutput } from "./doubao-image-model.mjs";
|
|
3
|
+
export { DoubaoChatModel, DoubaoImageModel, DoubaoImageModelInput, DoubaoImageModelOptions, DoubaoImageModelOutput };
|
package/dist/index.mjs
ADDED