This commit is contained in:
2025-09-15 20:03:58 +08:00
parent eccea10782
commit 291ef047ae
5 changed files with 145 additions and 15 deletions

View File

@@ -37,4 +37,4 @@ const loopGetStatus = async (taskId: string) => {
};
// main()
loopGetStatus(id);
// loopGetStatus(id);

41
mock/qwen/01.ts Normal file
View File

@@ -0,0 +1,41 @@
import dotenv from 'dotenv';
import util from 'node:util';
dotenv.config({ path: '.env' });
import { QwenText2Image } from '../../src/dashscope/dashscope.ts';
const main = async () => {
// 1. create image
const qwen = new QwenText2Image(process.env.BAILIAN_API_KEY || '');
const res = await qwen.queryImage({
model: 'wan2.2-t2i-flash',
input: {
prompt: '一个可爱的小的熊猫,卡通风格,抱着竹子。周边有很多彩色的气球。',
},
});
console.log('create image response:', util.inspect(res, { depth: null, colors: true }));
}
main()
// create image response: {
// request_id: '6b8d3e4d-0b1a-4a01-bcc9-826336e4267a',
// output: {
// task_id: '3318eb1d-cd5d-4408-a9bb-6cddd7967a43',
// task_status: 'SUCCEEDED',
// submit_time: '2025-09-15 19:37:22.177',
// scheduled_time: '2025-09-15 19:37:22.228',
// end_time: '2025-09-15 19:37:28.802',
// results: [
// {
// orig_prompt: '一个可爱的小的熊猫,卡通风格,抱着竹子。周边有很多彩色的气球。',
// actual_prompt: '卡通风格的可爱小熊猫,圆润造型,毛茸茸的白色身体与黑色斑纹分明,抱着翠绿竹子,周围漂浮着五彩缤纷的圆形气球,背景为浅蓝色天空与几缕白云,画面明亮温馨,适合儿童插画,采用柔和线条与饱满色彩,仰视视角增强萌态。',
// url: 'https://dashscope-result-wlcb-acdr-1.oss-cn-wulanchabu-acdr-1.aliyuncs.com/1d/2d/20250915/5020e443/3318eb1d-cd5d-4408-a9bb-6cddd7967a432353322002.png?Expires=1758022648&OSSAccessKeyId=LTAI5tKPD3TMqf2Lna1fASuh&Signature=8EkJ7ccUsKlZHfU6y3Iiog3fjSQ%3D'
// }
// ],
// task_metrics: { TOTAL: 1, SUCCEEDED: 1, FAILED: 0 }
// },
// usage: { image_count: 1 }
// }

24
mock/volces.ts Normal file
View File

@@ -0,0 +1,24 @@
import dotenv from 'dotenv';
import util from 'node:util';
dotenv.config({ path: '.env' });
import { VolcesImage } from '../src/volces/image.ts';
const main = async () => {
const volces = new VolcesImage(process.env.VOLECS_API_KEY || '');
const resp = await volces.generateImage({
model: 'doubao-seedream-4-0-250828',
prompt: '一个可爱的小的熊猫,卡通风格,抱着竹子。旁边有一个卡通的奶牛的毛绒玩具。',
sequential_image_generation: 'auto',
sequential_image_generation_options: { max_images: 3 },
response_format: 'url',
size: '2K',
stream: false,
watermark: false
});
console.log('response:', resp);
// console.log(util.inspect(resp, { depth: null, colors: true }));
};
main()

View File

@@ -1,3 +1,17 @@
export const models = ['wan2.2-t2i-flash', 'wan2.2-t2i-plus', 'wanx2.1-t2i-turbo', 'wanx2.1-t2i-plus', 'wanx2.0-t2i-turbo'] as const;
export type ImageModel = (typeof models)[number];
export const sizes = [
'1664x928', // 16:9
'1472x1140', // 4:3
'1328x1328', // 1:1
'1140x1472', // 3:4
'928x1664', // 9:16
] as const;
export type ImageSize = (typeof sizes)[number];
export class QwenText2Image {
text2imageApi = 'https://dashscope.aliyuncs.com/api/v1/services/aigc/text2image/image-synthesis';
tasksApi = 'https://dashscope.aliyuncs.com/api/v1/tasks/{task_id}';
@@ -7,6 +21,10 @@ export class QwenText2Image {
this.apiKey = apiKey;
}
async createImage(data: CreateImageRequest): Promise<CreateImageResponse> {
const parameters = data.parameters || {} as CreateImageRequest['parameters'];
if (parameters!.n === undefined) {
parameters!.n = 1; // 默认生成1张图片
}
const res = await fetch(this.text2imageApi, {
method: 'POST',
headers: {
@@ -14,7 +32,7 @@ export class QwenText2Image {
'X-DashScope-Async': 'enable',
Authorization: `Bearer ${this.apiKey}`,
},
body: JSON.stringify(data),
body: JSON.stringify({ ...data, parameters }),
});
return await res.json();
}
@@ -40,6 +58,21 @@ export class QwenText2Image {
this.taskResponse = await res.json();
return this.taskResponse;
}
async queryImage(data: CreateImageRequest): Promise<TaskResponse> {
const image = await this.createImage(data);
const taskId = image.output.task_id;
let status: string;
do {
await this.getTaskStatus(taskId);
status = this.taskResponse?.output?.task_status;
if (status === 'SUCCEEDED') {
break;
}
await new Promise((resolve) => setTimeout(resolve, 1000));
} while (status !== 'SUCCEEDED' && status !== 'FAILED');
return this.taskResponse;
}
}
type TaskStatus = 'PENDING' | 'SUCCESS' | 'FAILURE' | 'CANCELED' | 'UNKNOWN';
@@ -99,16 +132,3 @@ type TaskResponse = {
message?: string;
};
export const models = ['wan2.2-t2i-flash', 'wan2.2-t2i-plus', 'wanx2.1-t2i-turbo', 'wanx2.1-t2i-plus', 'wanx2.0-t2i-turbo'] as const;
export type ImageModel = (typeof models)[number];
export const sizes = [
'1664x928', // 16:9
'1472x1140', // 4:3
'1328x1328', // 1:1
'1140x1472', // 3:4
'928x1664', // 9:16
] as const;
export type ImageSize = (typeof sizes)[number];

45
src/volces/image.ts Normal file
View File

@@ -0,0 +1,45 @@
export class VolcesImage {
apiUrl = 'https://ark.cn-beijing.volces.com/api/v3/images/generations';
apiKey: string;
constructor(apiKey: string) {
this.apiKey = apiKey;
}
async generateImage(data: VolcesImageRequest): Promise<VolcesImageResponse> {
const res = await fetch(this.apiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${this.apiKey}`,
},
body: JSON.stringify(data),
});
return await res.json();
}
}
export type VolcesImageRequest = {
model: string;
prompt: string;
image?: string[]; // 输入图片数组
sequential_image_generation?: 'auto' | 'manual';
sequential_image_generation_options?: {
max_images?: number;
};
response_format?: 'url' | 'base64';
size?: string; // 如 "2K"
stream?: boolean;
watermark?: boolean;
};
export type VolcesImageResponse = {
id: string;
object: string;
created: number;
urls?: string[]; // 当 response_format 为 url
images?: string[]; // 当 response_format 为 base64
status: string;
message?: string;
[key: string]: any;
};