Guide to Asynchronous Task API
Overview
For tasks with long generation times (such as 3D modeling, video generation, long audio synthesis, etc.), the platform provides a dedicated asynchronous task API, enabling you to efficiently handle time-consuming operations without waiting for a response for an extended period.
API Architecture
The asynchronous task API adopts a submit-query model:
- Submission API: Used to create asynchronous tasks. For example, the submission API for text-to-music generation is
/async/music/generations - Query API: Unified task status query API
https://ai.gitee.com/api/v1/task/<task_id> - Task Cancellation API:
https://ai.gitee.com/api/v1/task/<task_id>/cancel - Quota Query API:
https://ai.gitee.com/v1/tasks/available-quota - Task Status API:
https://ai.gitee.com/v1/task/<task_id>/status - Task Record API:
https://ai.gitee.com/v1/task/<task_id>
Workflow
- Submit Task → Get
task_idand query URL - Poll Query → Check task status
- Get Results → Download generated files
Complete Example: Music Generation
The following example demonstrates how to generate music using the ACE-Step music large model:
Python Implementation
import os
import requests
import base64
from PIL import Image
from io import BytesIO
from requests_toolbelt.multipart.encoder import MultipartEncoder
API_URL = "https://ai.gitee.com/v1/async/music/generations"
headers = {
"Authorization": "Bearer <your token>",
}
def query(payload):
data = {}
for key, value in payload.items():
if value is None:
data[key] = ""
elif isinstance(value, list):
data[key] = ",".join(map(str, value))
elif isinstance(value, bool):
data[key] = str(value).lower()
else:
data[key] = str(value)
multipart_data = MultipartEncoder(fields=data)
headers["Content-Type"] = multipart_data.content_type
response = requests.post(API_URL, headers=headers, data=multipart_data)
return response.json()
output = query({
"model": "ACE-Step-v1-3.5B",
"task": "text2music",
"duration": 60,
"prompt": "pop, synth, drums, guitar, 120 bpm, upbeat, catchy, vibrant, female vocals, polished vocals",
"lyrics": """[Verse]
Neon lights across the sky
Every moment passing by
Your smile catches in my mind
Like a snapshot frozen time
[Chorus]
We're dancing through the night
Under these electric lights
Don't need to think about tomorrow
Just feel this moment right
[Verse]
City pulse beneath our feet
Hearts aligned to steady beat
Take my hand and follow me
Into who we're meant to be
[Bridge]
One life, one chance
One perfect night romance
Our story's just beginning
In this magical dance""",
"infer_steps": 60,
"lora_name": 'None',
"guidance_scale": 15,
"guidance_scale_text": 0,
"guidance_scale_lyric": 0,
"scheduler_type": "euler",
"cfg_type": "apg",
"omega_scale": 10,
"guidance_interval": 0.5,
"guidance_interval_decay": 0,
"min_guidance_scale": 3,
"use_erg_tag": True,
"use_erg_lyric": True,
"use_erg_diffusion": True,
})
query_url = output["urls"]["get"]
while True:
resp = requests.get(query_url, headers=headers).json()
print("task status: ", resp["status"])
if resp["status"] == "failure":
print(resp)
print("task failed")
os._exit(1)
if resp["status"] == "success":
break
file_url = resp["output"]["file_url"]
print('final url ', file_url)
resp = requests.get(file_url)
with open("output.mp3", "wb") as f:
f.write(resp.content)
Key Parameter Explanations
General Parameters
model: Name of the model used (e.g., "ACE-Step-v1-3.5B")
Music Generation Parameters
task: Task type (e.g., "text2music")duration: Generation duration (seconds)prompt: Music style descriptionlyrics: Lyrics contentinfer_steps: Inference steps (affects quality and speed)guidance_scale: Guidance strengthscheduler_type: Scheduler type
Error Handling
Common Error Types
-
Authentication Error (401)
- Check if the API token is correct
- Confirm that the token is valid and not expired
-
Parameter Error (400)
- Verify that all required parameters are complete
- Check if the parameter format is correct
-
Task Failure
- Check the error message returned
- Adjust parameters and try again
Best Practices
- Reasonable Polling Interval: Suggested 5-10 seconds, avoid too frequent requests
- Implement Timeout Mechanism: Set a reasonable maximum waiting time
- Error Retry: Implement exponential backoff retry for temporary errors
- Resource Cleanup: Handle downloaded files promptly to avoid disk space exhaustion
- Concurrent Quota Management: Check available quota before submitting tasks to avoid exceeding limits
- Task Status Monitoring: Regularly check task status, handle failed tasks promptly
- Reasonable Use of Cancellation: Cancel tasks that are no longer needed to release resources
Quota Management Example
# Query available quota
curl -H "Authorization: Bearer <your_token>" \
https://ai.gitee.com/v1/tasks/available-quota
# Cancel unnecessary tasks
curl -X POST \
-H "Authorization: Bearer <your_token>" \
https://ai.gitee.com/api/v1/task/<task_id>/cancel
# Query task status
curl -H "Authorization: Bearer <your_token>" \
https://ai.gitee.com/v1/task/<task_id>/status
Frequently Asked Questions
Q: How long does it take for a task to complete after submission? A: Depending on the task complexity, it usually completes within 1-10 minutes.
Q: Can I cancel a task that is currently running?
A: Task cancellation is supported. You can cancel tasks in waiting or in_progress status using the cancellation API https://ai.gitee.com/api/v1/task/<task_id>/cancel.
Q: What is the concurrent quota limit? A: Each account has a concurrent quota limit for asynchronous tasks, including the total number of tasks in waiting and in_progress states. Exceeding the quota will prevent new tasks from being submitted.
Q: How can I query my available quota?
A: You can query your available quota using the quota query API https://ai.gitee.com/v1/tasks/available-quota.
Q: How long is the download link valid for? A: Download links are typically valid for 24 hours. Please download and save them promptly.
Q: How do I get detailed information about a task?
A: You can get detailed information about a task using the task record API https://ai.gitee.com/v1/task/<task_id>.
Q: How to handle insufficient quota? A: You can handle quota insufficient situations in the following ways: 1) Wait for existing tasks to complete; 2) Cancel unnecessary tasks; 3) Implement task queue management mechanisms.