@volcengine/ark-runtime 1.0.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/LICENSE.txt +202 -0
- package/README.md +104 -0
- package/dist/cjs/index.js +1717 -0
- package/dist/esm/client.d.ts +97 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/config.d.ts +46 -0
- package/dist/esm/config.d.ts.map +1 -0
- package/dist/esm/encryption/encrypt-chat.d.ts +24 -0
- package/dist/esm/encryption/encrypt-chat.d.ts.map +1 -0
- package/dist/esm/encryption/index.d.ts +4 -0
- package/dist/esm/encryption/index.d.ts.map +1 -0
- package/dist/esm/encryption/key-agreement.d.ts +73 -0
- package/dist/esm/encryption/key-agreement.d.ts.map +1 -0
- package/dist/esm/index.d.ts +11 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.mjs +1476 -0
- package/dist/esm/rslib-runtime.mjs +37 -0
- package/dist/esm/types/bot.d.ts +109 -0
- package/dist/esm/types/bot.d.ts.map +1 -0
- package/dist/esm/types/chat-completion.d.ts +167 -0
- package/dist/esm/types/chat-completion.d.ts.map +1 -0
- package/dist/esm/types/common.d.ts +29 -0
- package/dist/esm/types/common.d.ts.map +1 -0
- package/dist/esm/types/content-generation.d.ts +118 -0
- package/dist/esm/types/content-generation.d.ts.map +1 -0
- package/dist/esm/types/context.d.ts +49 -0
- package/dist/esm/types/context.d.ts.map +1 -0
- package/dist/esm/types/embeddings.d.ts +44 -0
- package/dist/esm/types/embeddings.d.ts.map +1 -0
- package/dist/esm/types/error.d.ts +45 -0
- package/dist/esm/types/error.d.ts.map +1 -0
- package/dist/esm/types/file.d.ts +66 -0
- package/dist/esm/types/file.d.ts.map +1 -0
- package/dist/esm/types/http-request-error.d.ts +13 -0
- package/dist/esm/types/http-request-error.d.ts.map +1 -0
- package/dist/esm/types/images.d.ts +78 -0
- package/dist/esm/types/images.d.ts.map +1 -0
- package/dist/esm/types/index.d.ts +13 -0
- package/dist/esm/types/index.d.ts.map +1 -0
- package/dist/esm/types/multimodal-embedding.d.ts +56 -0
- package/dist/esm/types/multimodal-embedding.d.ts.map +1 -0
- package/dist/esm/types/responses/enums.d.ts +38 -0
- package/dist/esm/types/responses/enums.d.ts.map +1 -0
- package/dist/esm/types/responses/helpers.d.ts +22 -0
- package/dist/esm/types/responses/helpers.d.ts.map +1 -0
- package/dist/esm/types/responses/index.d.ts +4 -0
- package/dist/esm/types/responses/index.d.ts.map +1 -0
- package/dist/esm/types/responses/types.d.ts +906 -0
- package/dist/esm/types/responses/types.d.ts.map +1 -0
- package/dist/esm/types/tokenization.d.ts +22 -0
- package/dist/esm/types/tokenization.d.ts.map +1 -0
- package/dist/esm/utils/breaker-provider.d.ts +9 -0
- package/dist/esm/utils/breaker-provider.d.ts.map +1 -0
- package/dist/esm/utils/breaker.d.ts +28 -0
- package/dist/esm/utils/breaker.d.ts.map +1 -0
- package/dist/esm/utils/normalize.d.ts +51 -0
- package/dist/esm/utils/normalize.d.ts.map +1 -0
- package/dist/esm/utils/request-builder.d.ts +15 -0
- package/dist/esm/utils/request-builder.d.ts.map +1 -0
- package/dist/esm/utils/request-id.d.ts +5 -0
- package/dist/esm/utils/request-id.d.ts.map +1 -0
- package/dist/esm/utils/retry.d.ts +11 -0
- package/dist/esm/utils/retry.d.ts.map +1 -0
- package/dist/esm/utils/sse-decoder.d.ts +23 -0
- package/dist/esm/utils/sse-decoder.d.ts.map +1 -0
- package/dist/esm/utils/stream-reader.d.ts +67 -0
- package/dist/esm/utils/stream-reader.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/example/README.md +118 -0
- package/example/batch-chat.ts +64 -0
- package/example/bot-chat.ts +66 -0
- package/example/chat-completion-function-call.ts +141 -0
- package/example/chat-completion-reasoning.ts +64 -0
- package/example/chat-completion-vision.ts +70 -0
- package/example/chat-completion.ts +62 -0
- package/example/content-generation.ts +70 -0
- package/example/context.ts +69 -0
- package/example/embeddings.ts +31 -0
- package/example/file-upload.ts +53 -0
- package/example/images.ts +74 -0
- package/example/list-input-items.ts +34 -0
- package/example/multimodal-embeddings.ts +36 -0
- package/example/responses/basic.ts +75 -0
- package/example/responses/doubao-app.ts +53 -0
- package/example/responses/mcp.ts +66 -0
- package/example/responses/streaming.ts +45 -0
- package/example/responses/video.ts +74 -0
- package/example/responses/web-search.ts +52 -0
- package/example/structured-outputs.ts +71 -0
- package/example/tokenization.ts +30 -0
- package/package.json +47 -0
- package/src/client.ts +1199 -0
- package/src/config.ts +68 -0
- package/src/encryption/encrypt-chat.ts +146 -0
- package/src/encryption/index.ts +21 -0
- package/src/encryption/key-agreement.ts +270 -0
- package/src/index.ts +10 -0
- package/src/types/ark.d.ts +9 -0
- package/src/types/bot.ts +127 -0
- package/src/types/chat-completion.ts +228 -0
- package/src/types/common.ts +37 -0
- package/src/types/content-generation.ts +135 -0
- package/src/types/context.ts +59 -0
- package/src/types/embeddings.ts +74 -0
- package/src/types/error.ts +93 -0
- package/src/types/file.ts +76 -0
- package/src/types/http-request-error.ts +34 -0
- package/src/types/images.ts +102 -0
- package/src/types/index.ts +12 -0
- package/src/types/multimodal-embedding.ts +67 -0
- package/src/types/responses/enums.ts +163 -0
- package/src/types/responses/helpers.ts +67 -0
- package/src/types/responses/index.ts +3 -0
- package/src/types/responses/types.ts +1335 -0
- package/src/types/tokenization.ts +24 -0
- package/src/utils/breaker-provider.ts +17 -0
- package/src/utils/breaker.ts +56 -0
- package/src/utils/normalize.ts +154 -0
- package/src/utils/request-builder.ts +51 -0
- package/src/utils/request-id.ts +17 -0
- package/src/utils/retry.ts +76 -0
- package/src/utils/sse-decoder.ts +140 -0
- package/src/utils/stream-reader.ts +270 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bot 对话示例 (Doubao Bot)
|
|
3
|
+
* 对齐 Go SDK: example/bot/main.go
|
|
4
|
+
*/
|
|
5
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
6
|
+
|
|
7
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
8
|
+
const BOT_ID = process.env.ARK_BOT_ID ?? "bot-xxxxx"; // 替换为实际 Bot ID
|
|
9
|
+
|
|
10
|
+
async function botChatNonStream() {
|
|
11
|
+
console.log("----- Bot 非流式对话 -----");
|
|
12
|
+
|
|
13
|
+
const response = await client.createBotChatCompletion({
|
|
14
|
+
model: BOT_ID,
|
|
15
|
+
bot_id: BOT_ID,
|
|
16
|
+
messages: [{ role: "user", content: "介绍一下火山引擎" }],
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
console.log("Response:", response.choices[0].message.content);
|
|
20
|
+
|
|
21
|
+
// Bot 可能返回引用信息
|
|
22
|
+
if (response.references && response.references.length > 0) {
|
|
23
|
+
console.log("\nReferences:");
|
|
24
|
+
for (const ref of response.references) {
|
|
25
|
+
console.log(` - ${ref.title}: ${ref.url}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Bot 使用统计
|
|
30
|
+
if (response.bot_usage) {
|
|
31
|
+
console.log("\nBot Usage:", JSON.stringify(response.bot_usage, null, 2));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function botChatStream() {
|
|
36
|
+
console.log("\n----- Bot 流式对话 -----");
|
|
37
|
+
|
|
38
|
+
const stream = await client.createBotChatCompletionStream({
|
|
39
|
+
model: BOT_ID,
|
|
40
|
+
bot_id: BOT_ID,
|
|
41
|
+
messages: [{ role: "user", content: "介绍一下火山引擎" }],
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
process.stdout.write("Streaming: ");
|
|
45
|
+
for await (const chunk of stream) {
|
|
46
|
+
if (chunk.choices?.[0]?.delta?.content) {
|
|
47
|
+
process.stdout.write(chunk.choices[0].delta.content);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 流式中也可能包含引用
|
|
51
|
+
if (chunk.references && chunk.references.length > 0) {
|
|
52
|
+
console.log("\nReferences:");
|
|
53
|
+
for (const ref of chunk.references) {
|
|
54
|
+
console.log(` - ${ref.title}: ${ref.url}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
console.log();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
async function main() {
|
|
62
|
+
await botChatNonStream();
|
|
63
|
+
await botChatStream();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 函数调用 (Function Calling / Tool Use) 示例
|
|
3
|
+
* 对齐 Go SDK: example/completion_function_call/main.go
|
|
4
|
+
*/
|
|
5
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
6
|
+
import type {
|
|
7
|
+
ChatCompletionMessage,
|
|
8
|
+
Tool,
|
|
9
|
+
ToolCall,
|
|
10
|
+
} from "@volcengine/ark-runtime";
|
|
11
|
+
|
|
12
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
13
|
+
const MODEL = "doubao-seed-2-0-pro-260215";
|
|
14
|
+
|
|
15
|
+
// 定义工具
|
|
16
|
+
const tools: Tool[] = [
|
|
17
|
+
{
|
|
18
|
+
type: "function",
|
|
19
|
+
function: {
|
|
20
|
+
name: "get_current_weather",
|
|
21
|
+
description: "获取指定城市的当前天气",
|
|
22
|
+
parameters: {
|
|
23
|
+
type: "object",
|
|
24
|
+
properties: {
|
|
25
|
+
location: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "城市名称,比如 北京",
|
|
28
|
+
},
|
|
29
|
+
unit: {
|
|
30
|
+
type: "string",
|
|
31
|
+
enum: ["celsius", "fahrenheit"],
|
|
32
|
+
description: "温度单位",
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
required: ["location"],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
];
|
|
40
|
+
|
|
41
|
+
// 模拟的天气查询函数
|
|
42
|
+
function getWeather(location: string, unit = "celsius"): string {
|
|
43
|
+
return JSON.stringify({
|
|
44
|
+
location,
|
|
45
|
+
temperature: unit === "celsius" ? "25" : "77",
|
|
46
|
+
unit,
|
|
47
|
+
description: "晴天",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function functionCallNonStream() {
|
|
52
|
+
console.log("----- 非流式函数调用 -----");
|
|
53
|
+
|
|
54
|
+
const messages: ChatCompletionMessage[] = [
|
|
55
|
+
{ role: "user", content: "北京今天天气怎么样?" },
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
// 第一次调用:模型返回 tool_calls
|
|
59
|
+
const response = await client.createChatCompletion({
|
|
60
|
+
model: MODEL,
|
|
61
|
+
messages,
|
|
62
|
+
tools,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const assistantMsg = response.choices[0].message;
|
|
66
|
+
console.log("Tool calls:", JSON.stringify(assistantMsg.tool_calls, null, 2));
|
|
67
|
+
|
|
68
|
+
if (assistantMsg.tool_calls) {
|
|
69
|
+
// 追加 assistant 消息
|
|
70
|
+
messages.push(assistantMsg);
|
|
71
|
+
|
|
72
|
+
// 执行每个 tool call 并追加结果
|
|
73
|
+
for (const toolCall of assistantMsg.tool_calls) {
|
|
74
|
+
const args = JSON.parse(toolCall.function.arguments ?? "{}");
|
|
75
|
+
const result = getWeather(args.location, args.unit);
|
|
76
|
+
messages.push({
|
|
77
|
+
role: "tool",
|
|
78
|
+
tool_call_id: toolCall.id,
|
|
79
|
+
content: result,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// 第二次调用:模型基于工具结果生成最终回复
|
|
84
|
+
const finalResponse = await client.createChatCompletion({
|
|
85
|
+
model: MODEL,
|
|
86
|
+
messages,
|
|
87
|
+
tools,
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
console.log("Final:", finalResponse.choices[0].message.content);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function functionCallStream() {
|
|
95
|
+
console.log("\n----- 流式函数调用 -----");
|
|
96
|
+
|
|
97
|
+
const stream = await client.createChatCompletionStream({
|
|
98
|
+
model: MODEL,
|
|
99
|
+
messages: [{ role: "user", content: "北京今天天气怎么样?" }],
|
|
100
|
+
tools,
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// 聚合 tool call 参数(流式时 arguments 是分片的)
|
|
104
|
+
const toolCalls = new Map<number, { id: string; name: string; args: string }>();
|
|
105
|
+
|
|
106
|
+
for await (const chunk of stream) {
|
|
107
|
+
const delta = chunk.choices?.[0]?.delta;
|
|
108
|
+
if (!delta) continue;
|
|
109
|
+
|
|
110
|
+
if (delta.content) {
|
|
111
|
+
process.stdout.write(delta.content);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
if (delta.tool_calls) {
|
|
115
|
+
for (const tc of delta.tool_calls) {
|
|
116
|
+
const idx = tc.index ?? 0;
|
|
117
|
+
if (!toolCalls.has(idx)) {
|
|
118
|
+
toolCalls.set(idx, { id: tc.id, name: tc.function?.name ?? "", args: "" });
|
|
119
|
+
}
|
|
120
|
+
const existing = toolCalls.get(idx)!;
|
|
121
|
+
if (tc.function?.arguments) {
|
|
122
|
+
existing.args += tc.function.arguments;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (toolCalls.size > 0) {
|
|
129
|
+
console.log("\nStreamed tool calls:");
|
|
130
|
+
for (const [idx, tc] of toolCalls) {
|
|
131
|
+
console.log(` [${idx}] ${tc.name}(${tc.args})`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
async function main() {
|
|
137
|
+
await functionCallNonStream();
|
|
138
|
+
await functionCallStream();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 推理 (Reasoning / Thinking) 模式示例
|
|
3
|
+
* 对齐 Go SDK: example/completion_reasoning/main.go
|
|
4
|
+
*/
|
|
5
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
6
|
+
|
|
7
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
8
|
+
const MODEL = "doubao-seed-2-0-pro-260215";
|
|
9
|
+
|
|
10
|
+
async function reasoningStream() {
|
|
11
|
+
console.log("----- 流式推理模式 -----");
|
|
12
|
+
|
|
13
|
+
const stream = await client.createChatCompletionStream({
|
|
14
|
+
model: MODEL,
|
|
15
|
+
messages: [{ role: "user", content: "请解释为什么 0.1 + 0.2 !== 0.3 in JavaScript" }],
|
|
16
|
+
thinking: { type: "enabled" },
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
let inReasoning = false;
|
|
20
|
+
for await (const chunk of stream) {
|
|
21
|
+
const delta = chunk.choices?.[0]?.delta;
|
|
22
|
+
if (!delta) continue;
|
|
23
|
+
|
|
24
|
+
if (delta.reasoning_content) {
|
|
25
|
+
if (!inReasoning) {
|
|
26
|
+
console.log("[Reasoning]");
|
|
27
|
+
inReasoning = true;
|
|
28
|
+
}
|
|
29
|
+
process.stdout.write(delta.reasoning_content);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (delta.content) {
|
|
33
|
+
if (inReasoning) {
|
|
34
|
+
console.log("\n[Output]");
|
|
35
|
+
inReasoning = false;
|
|
36
|
+
}
|
|
37
|
+
process.stdout.write(delta.content);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
console.log();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function reasoningNonStream() {
|
|
44
|
+
console.log("\n----- 非流式推理模式 -----");
|
|
45
|
+
|
|
46
|
+
const response = await client.createChatCompletion({
|
|
47
|
+
model: MODEL,
|
|
48
|
+
messages: [{ role: "user", content: "计算 123 * 456 的结果" }],
|
|
49
|
+
thinking: { type: "enabled" },
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
const msg = response.choices[0].message;
|
|
53
|
+
if (msg.reasoning_content) {
|
|
54
|
+
console.log("[Reasoning]:", msg.reasoning_content);
|
|
55
|
+
}
|
|
56
|
+
console.log("[Output]:", msg.content);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function main() {
|
|
60
|
+
await reasoningStream();
|
|
61
|
+
await reasoningNonStream();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 多模态/视觉对话示例
|
|
3
|
+
* 对齐 Go SDK: example/completion_vision/main.go
|
|
4
|
+
*/
|
|
5
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
6
|
+
|
|
7
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
8
|
+
const MODEL = "doubao-seed-2-0-pro-260215";
|
|
9
|
+
|
|
10
|
+
async function visionChat() {
|
|
11
|
+
console.log("----- 视觉对话 -----");
|
|
12
|
+
|
|
13
|
+
const response = await client.createChatCompletion({
|
|
14
|
+
model: MODEL,
|
|
15
|
+
messages: [
|
|
16
|
+
{
|
|
17
|
+
role: "user",
|
|
18
|
+
content: [
|
|
19
|
+
{ type: "text", text: "这张图片里有什么?" },
|
|
20
|
+
{
|
|
21
|
+
type: "image_url",
|
|
22
|
+
image_url: {
|
|
23
|
+
url: "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png",
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
console.log("Response:", response.choices[0].message.content);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function visionChatStream() {
|
|
35
|
+
console.log("\n----- 视觉流式对话 -----");
|
|
36
|
+
|
|
37
|
+
const stream = await client.createChatCompletionStream({
|
|
38
|
+
model: MODEL,
|
|
39
|
+
messages: [
|
|
40
|
+
{
|
|
41
|
+
role: "user",
|
|
42
|
+
content: [
|
|
43
|
+
{ type: "text", text: "详细描述这张图片" },
|
|
44
|
+
{
|
|
45
|
+
type: "image_url",
|
|
46
|
+
image_url: {
|
|
47
|
+
url: "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png",
|
|
48
|
+
detail: "high",
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
process.stdout.write("Streaming: ");
|
|
57
|
+
for await (const chunk of stream) {
|
|
58
|
+
if (chunk.choices?.[0]?.delta?.content) {
|
|
59
|
+
process.stdout.write(chunk.choices[0].delta.content);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
console.log();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function main() {
|
|
66
|
+
await visionChat();
|
|
67
|
+
await visionChatStream();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 基础对话补全示例
|
|
3
|
+
* Basic chat completion example (non-streaming + streaming)
|
|
4
|
+
*
|
|
5
|
+
* 对齐 Go SDK: example/completion/main.go
|
|
6
|
+
*/
|
|
7
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
8
|
+
|
|
9
|
+
// 使用 API Key 鉴权
|
|
10
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
11
|
+
|
|
12
|
+
// 也可以使用 AK/SK 鉴权(会自动获取 STS token)
|
|
13
|
+
// const client = ArkRuntimeClient.withAkSk(
|
|
14
|
+
// process.env.VOLC_ACCESSKEY!,
|
|
15
|
+
// process.env.VOLC_SECRETKEY!,
|
|
16
|
+
// );
|
|
17
|
+
|
|
18
|
+
const MODEL = "doubao-seed-2-0-pro-260215";
|
|
19
|
+
|
|
20
|
+
async function chatCompletion() {
|
|
21
|
+
console.log("----- 非流式对话 -----");
|
|
22
|
+
|
|
23
|
+
const response = await client.createChatCompletion({
|
|
24
|
+
model: MODEL,
|
|
25
|
+
messages: [
|
|
26
|
+
{ role: "system", content: "你是一个有帮助的AI助手。" },
|
|
27
|
+
{ role: "user", content: "请介绍一下北京的天气特点" },
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
console.log("Response ID:", response.id);
|
|
32
|
+
console.log("Model:", response.model);
|
|
33
|
+
console.log("Content:", response.choices[0].message.content);
|
|
34
|
+
console.log("Usage:", JSON.stringify(response.usage));
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async function chatCompletionStream() {
|
|
38
|
+
console.log("\n----- 流式对话 -----");
|
|
39
|
+
|
|
40
|
+
const stream = await client.createChatCompletionStream({
|
|
41
|
+
model: MODEL,
|
|
42
|
+
messages: [
|
|
43
|
+
{ role: "system", content: "你是一个有帮助的AI助手。" },
|
|
44
|
+
{ role: "user", content: "请介绍一下北京的天气特点" },
|
|
45
|
+
],
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
process.stdout.write("Streaming: ");
|
|
49
|
+
for await (const chunk of stream) {
|
|
50
|
+
if (chunk.choices?.[0]?.delta?.content) {
|
|
51
|
+
process.stdout.write(chunk.choices[0].delta.content);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
console.log();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function main() {
|
|
58
|
+
await chatCompletion();
|
|
59
|
+
await chatCompletionStream();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 内容/视频生成(异步任务)示例
|
|
3
|
+
* 对齐 Go SDK: example/content_generation/main.go
|
|
4
|
+
*
|
|
5
|
+
* 注意:仅支持 API Key 鉴权
|
|
6
|
+
*/
|
|
7
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
8
|
+
|
|
9
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
10
|
+
const MODEL = process.env.ARK_VIDEO_MODEL ?? "seedance-1-0-lite";
|
|
11
|
+
|
|
12
|
+
async function createTask() {
|
|
13
|
+
console.log("----- 创建内容生成任务 -----");
|
|
14
|
+
|
|
15
|
+
const task = await client.createContentGenerationTask({
|
|
16
|
+
model: MODEL,
|
|
17
|
+
content: [
|
|
18
|
+
{ type: "text", text: "一只猫在草地上奔跑" },
|
|
19
|
+
],
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
console.log("Task ID:", task.id);
|
|
23
|
+
return task.id;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function pollTask(taskId: string) {
|
|
27
|
+
console.log("\n----- 轮询任务状态 -----");
|
|
28
|
+
|
|
29
|
+
let status = "running";
|
|
30
|
+
while (status === "running" || status === "queued") {
|
|
31
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
32
|
+
|
|
33
|
+
const result = await client.getContentGenerationTask(taskId);
|
|
34
|
+
status = result.status;
|
|
35
|
+
console.log(` Status: ${status}`);
|
|
36
|
+
|
|
37
|
+
if (status === "succeeded") {
|
|
38
|
+
console.log(" Video URL:", result.content.video_url);
|
|
39
|
+
console.log(" Usage:", JSON.stringify(result.usage));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (status === "failed") {
|
|
44
|
+
console.log(" Error:", result.error?.message);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async function listTasks() {
|
|
51
|
+
console.log("\n----- 列出任务 -----");
|
|
52
|
+
|
|
53
|
+
const response = await client.listContentGenerationTasks({
|
|
54
|
+
page_num: 1,
|
|
55
|
+
page_size: 5,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
console.log(`Total: ${response.total}`);
|
|
59
|
+
for (const item of response.items) {
|
|
60
|
+
console.log(` [${item.id}] status=${item.status}, model=${item.model}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
async function main() {
|
|
65
|
+
const taskId = await createTask();
|
|
66
|
+
await pollTask(taskId);
|
|
67
|
+
await listTasks();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context(上下文/会话管理)示例
|
|
3
|
+
* 对齐 Go SDK: example/context/main.go
|
|
4
|
+
*/
|
|
5
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
6
|
+
|
|
7
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
8
|
+
const MODEL = "doubao-seed-2-0-pro-260215";
|
|
9
|
+
|
|
10
|
+
async function contextChat() {
|
|
11
|
+
console.log("----- 创建 Context -----");
|
|
12
|
+
|
|
13
|
+
// 创建一个持久化的上下文(session 模式),TTL=3600 秒
|
|
14
|
+
const ctx = await client.createContext({
|
|
15
|
+
model: MODEL,
|
|
16
|
+
mode: "session",
|
|
17
|
+
messages: [
|
|
18
|
+
{ role: "system", content: "你是一个数学助手,用简洁的方式回答问题。" },
|
|
19
|
+
],
|
|
20
|
+
ttl: 3600,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
console.log("Context ID:", ctx.id);
|
|
24
|
+
console.log("Mode:", ctx.mode);
|
|
25
|
+
console.log("Usage:", JSON.stringify(ctx.usage));
|
|
26
|
+
|
|
27
|
+
// 第一轮对话
|
|
28
|
+
console.log("\n----- 第一轮对话 -----");
|
|
29
|
+
const resp1 = await client.createContextChatCompletion({
|
|
30
|
+
model: MODEL,
|
|
31
|
+
context_id: ctx.id,
|
|
32
|
+
mode: "session",
|
|
33
|
+
messages: [{ role: "user", content: "1+1等于几?" }],
|
|
34
|
+
});
|
|
35
|
+
console.log("Answer:", resp1.choices[0].message.content);
|
|
36
|
+
|
|
37
|
+
// 第二轮对话(上下文自动保持)
|
|
38
|
+
console.log("\n----- 第二轮对话 -----");
|
|
39
|
+
const resp2 = await client.createContextChatCompletion({
|
|
40
|
+
model: MODEL,
|
|
41
|
+
context_id: ctx.id,
|
|
42
|
+
mode: "session",
|
|
43
|
+
messages: [{ role: "user", content: "再加3呢?" }],
|
|
44
|
+
});
|
|
45
|
+
console.log("Answer:", resp2.choices[0].message.content);
|
|
46
|
+
|
|
47
|
+
// 流式上下文对话
|
|
48
|
+
console.log("\n----- 流式上下文对话 -----");
|
|
49
|
+
const stream = await client.createContextChatCompletionStream({
|
|
50
|
+
model: MODEL,
|
|
51
|
+
context_id: ctx.id,
|
|
52
|
+
mode: "session",
|
|
53
|
+
messages: [{ role: "user", content: "再乘以2呢?" }],
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
process.stdout.write("Streaming: ");
|
|
57
|
+
for await (const chunk of stream) {
|
|
58
|
+
if (chunk.choices?.[0]?.delta?.content) {
|
|
59
|
+
process.stdout.write(chunk.choices[0].delta.content);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
console.log();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function main() {
|
|
66
|
+
await contextChat();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文本 Embedding 示例
|
|
3
|
+
* 对齐 Go SDK: example/embeddings/main.go
|
|
4
|
+
*/
|
|
5
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
6
|
+
|
|
7
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
8
|
+
const MODEL = "doubao-embedding-large";
|
|
9
|
+
|
|
10
|
+
async function createEmbedding() {
|
|
11
|
+
console.log("----- 文本 Embedding -----");
|
|
12
|
+
|
|
13
|
+
const response = await client.createEmbeddings({
|
|
14
|
+
model: MODEL,
|
|
15
|
+
input: ["天空是蓝色的", "草地是绿色的"],
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
console.log("Model:", response.model);
|
|
19
|
+
console.log("Object:", response.object);
|
|
20
|
+
console.log("Usage:", JSON.stringify(response.usage));
|
|
21
|
+
|
|
22
|
+
for (const item of response.data) {
|
|
23
|
+
console.log(` [${item.index}] dimension=${item.embedding.length}, first 5:`, item.embedding.slice(0, 5));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function main() {
|
|
28
|
+
await createEmbedding();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 文件上传与管理示例
|
|
3
|
+
* 对齐 Go SDK: example/file.go (内嵌在 responses/video 示例中)
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from "fs";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
8
|
+
|
|
9
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
10
|
+
|
|
11
|
+
async function fileOperations() {
|
|
12
|
+
console.log("----- 文件上传 -----");
|
|
13
|
+
|
|
14
|
+
// 上传文件(这里创建一个临时文件作为示例)
|
|
15
|
+
const tmpFile = path.join("/tmp", "ark-test-upload.txt");
|
|
16
|
+
fs.writeFileSync(tmpFile, "Hello, this is a test file for upload.");
|
|
17
|
+
|
|
18
|
+
const fileMeta = await client.uploadFile({
|
|
19
|
+
file: fs.createReadStream(tmpFile) as any,
|
|
20
|
+
purpose: "user_data",
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
console.log("File ID:", fileMeta.id);
|
|
24
|
+
console.log("Filename:", fileMeta.filename);
|
|
25
|
+
console.log("Status:", fileMeta.status);
|
|
26
|
+
|
|
27
|
+
// 查询文件
|
|
28
|
+
console.log("\n----- 查询文件 -----");
|
|
29
|
+
const retrieved = await client.retrieveFile(fileMeta.id);
|
|
30
|
+
console.log("Retrieved:", retrieved.id, retrieved.status);
|
|
31
|
+
|
|
32
|
+
// 列出文件
|
|
33
|
+
console.log("\n----- 列出文件 -----");
|
|
34
|
+
const list = await client.listFiles({ limit: 5 });
|
|
35
|
+
console.log(`Total files listed: ${list.data?.length ?? 0}`);
|
|
36
|
+
for (const f of list.data ?? []) {
|
|
37
|
+
console.log(` [${f.id}] ${f.filename} (${f.status})`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// 删除文件
|
|
41
|
+
console.log("\n----- 删除文件 -----");
|
|
42
|
+
const deleteResult = await client.deleteFile(fileMeta.id);
|
|
43
|
+
console.log("Deleted:", deleteResult.deleted);
|
|
44
|
+
|
|
45
|
+
// 清理临时文件
|
|
46
|
+
fs.unlinkSync(tmpFile);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async function main() {
|
|
50
|
+
await fileOperations();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 图片生成示例 (Seedream / Seededit)
|
|
3
|
+
* 对齐 Go SDK: example/images/main.go
|
|
4
|
+
*
|
|
5
|
+
* 注意:图片生成仅支持 API Key 鉴权
|
|
6
|
+
*/
|
|
7
|
+
import { ArkRuntimeClient } from "@volcengine/ark-runtime";
|
|
8
|
+
|
|
9
|
+
const client = ArkRuntimeClient.withApiKey(process.env.ARK_API_KEY!);
|
|
10
|
+
const MODEL = process.env.ARK_IMAGE_MODEL ?? "seedream-3-0";
|
|
11
|
+
|
|
12
|
+
async function generateImageURL() {
|
|
13
|
+
console.log("----- 生成图片 (URL 格式) -----");
|
|
14
|
+
|
|
15
|
+
const response = await client.generateImages({
|
|
16
|
+
model: MODEL,
|
|
17
|
+
prompt: "一只可爱的橘猫在花园里玩耍",
|
|
18
|
+
response_format: "url",
|
|
19
|
+
size: "1024x1024",
|
|
20
|
+
watermark: false,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
console.log("Created:", response.created);
|
|
24
|
+
for (const img of response.data) {
|
|
25
|
+
console.log(" URL:", img.url);
|
|
26
|
+
console.log(" Size:", img.size);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async function generateImageBase64() {
|
|
31
|
+
console.log("\n----- 生成图片 (Base64 格式) -----");
|
|
32
|
+
|
|
33
|
+
const response = await client.generateImages({
|
|
34
|
+
model: MODEL,
|
|
35
|
+
prompt: "一座雪山的油画风景",
|
|
36
|
+
response_format: "b64_json",
|
|
37
|
+
size: "512x512",
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
for (const img of response.data) {
|
|
41
|
+
console.log(" Base64 length:", img.b64_json?.length);
|
|
42
|
+
console.log(" Size:", img.size);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function generateImageStream() {
|
|
47
|
+
console.log("\n----- 流式图片生成 -----");
|
|
48
|
+
|
|
49
|
+
const stream = await client.generateImagesStream({
|
|
50
|
+
model: MODEL,
|
|
51
|
+
prompt: "赛博朋克风格的城市夜景",
|
|
52
|
+
response_format: "url",
|
|
53
|
+
sequential_image_generation: "auto",
|
|
54
|
+
sequential_image_generation_options: { max_images: 3 },
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
for await (const event of stream) {
|
|
58
|
+
console.log(` [${event.type}] index=${event.image_index}`);
|
|
59
|
+
if (event.url) {
|
|
60
|
+
console.log(` URL: ${event.url}`);
|
|
61
|
+
}
|
|
62
|
+
if (event.error) {
|
|
63
|
+
console.log(` Error: ${event.error.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async function main() {
|
|
69
|
+
await generateImageURL();
|
|
70
|
+
await generateImageBase64();
|
|
71
|
+
await generateImageStream();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
main().catch(console.error);
|