- Wan2.2-TI2V-5B GPU 视频推理 - ahserver + longtasks 异步任务队列 - OpenAI 兼容 API: POST /api/submit, GET /api/task, GET /api/status - 模型常驻内存,惰性加载 - 全局串行推理锁(GPU 安全) - 支持 t2v/i2v/ti2v/s2v 四种任务类型
72 lines
2.5 KiB
Plaintext
72 lines
2.5 KiB
Plaintext
# -*- coding:utf-8 -*-
|
|
# POST /api/submit - 提交视频生成任务
|
|
|
|
import json
|
|
import uuid
|
|
from ahserver.serverenv import ServerEnv
|
|
|
|
method = request.method
|
|
|
|
if method == 'POST':
|
|
prompt = params_kw.get('prompt', '')
|
|
if not prompt:
|
|
return json.dumps({'error': 'prompt is required'}, ensure_ascii=False)
|
|
|
|
task_id = params_kw.get('task_id', str(uuid.uuid4()).replace("-", "")[:12])
|
|
image = params_kw.get('image', None)
|
|
size = params_kw.get('size', '1280*720')
|
|
frame_num = params_kw.get('frame_num', 81)
|
|
sample_steps = params_kw.get('sample_steps', None)
|
|
sample_guide_scale = params_kw.get('sample_guide_scale', None)
|
|
base_seed = params_kw.get('base_seed', None)
|
|
|
|
valid_sizes = ['704*1280', '1280*704']
|
|
if size not in valid_sizes:
|
|
return json.dumps({'error': f'invalid size, must be one of: {valid_sizes}'}, ensure_ascii=False)
|
|
|
|
payload = {
|
|
'task_type': 'generate_video',
|
|
'task_id': task_id,
|
|
'prompt': prompt,
|
|
'image': image,
|
|
'size': size,
|
|
'frame_num': int(frame_num),
|
|
'sample_steps': int(sample_steps) if sample_steps else None,
|
|
'sample_guide_scale': float(sample_guide_scale) if sample_guide_scale else None,
|
|
'base_seed': int(base_seed) if base_seed else None,
|
|
}
|
|
|
|
env = ServerEnv()
|
|
longtasks = env.longtasks
|
|
if longtasks is None:
|
|
return json.dumps({'error': 'service not ready'}, ensure_ascii=False)
|
|
|
|
result = await longtasks.submit_task(payload)
|
|
real_task_id = result.get('task_id', str(result)) if isinstance(result, dict) else str(result)
|
|
|
|
return json.dumps({
|
|
'task_id': real_task_id,
|
|
'status': 'queued',
|
|
'prompt': prompt[:100],
|
|
'size': size,
|
|
'frame_num': payload['frame_num'],
|
|
'message': 'task submitted',
|
|
'check_url': f'/api/task?task_id={real_task_id}'
|
|
}, ensure_ascii=False)
|
|
|
|
else:
|
|
return json.dumps({
|
|
'usage': 'POST with JSON body',
|
|
'params': {
|
|
'prompt': 'string (required)',
|
|
'image': 'string (optional, server path for I2V)',
|
|
'size': 'string (default 1280*720)',
|
|
'frame_num': 'int (default 81, 4n+1, range 17-129)',
|
|
'sample_steps': 'int (optional)',
|
|
'sample_guide_scale': 'float (optional)',
|
|
'base_seed': 'int (optional)',
|
|
'task_id': 'string (optional, auto-generated)',
|
|
},
|
|
'valid_sizes': ['704*1280', '1280*704']
|
|
}, ensure_ascii=False)
|