Generate Music using Models Lab
Request music through a custom ModelsLab tool and save completed MP3 output.
The current ModelsLabTools music path omits output_format, and its completion check polls a local UUID instead of the provider job ID. This example uses a custom Agno tool for the MusicGen API, explicitly requests MP3, and returns an audio artifact only for a completed response. A queued request returns its job ID and status instead.
Code
import json
from os import environ
from pathlib import Path
from uuid import uuid4
import requests
from agno.agent import Agent
from agno.media import Audio
from agno.models.openai import OpenAIResponses
from agno.tools.function import ToolResult
def request_music(prompt: str) -> ToolResult:
"""Request a 30-second MP3. Report queued jobs without treating them as ready."""
response = requests.post(
"https://modelslab.com/api/v6/voice/music_gen",
json={
"key": environ["MODELS_LAB_API_KEY"],
"prompt": prompt,
"duration": 30,
"output_format": "mp3",
"base64": False,
"temp": False,
},
timeout=120,
)
response.raise_for_status()
result = response.json()
status = result.get("status")
urls = result.get("output") or []
if status == "success" and urls:
return ToolResult(
content="Music generation completed.",
audios=[Audio(url=urls[0], mime_type="audio/mpeg")],
)
return ToolResult(content=json.dumps({
"status": status,
"job_id": result.get("id"),
"eta": result.get("eta"),
"message": result.get("message"),
}))
agent = Agent(
model=OpenAIResponses(id="gpt-5.2"),
tools=[request_music],
instructions=[
"Call request_music once for the requested music.",
"If queued, report the job ID and wait estimate; do not claim completion.",
],
)
result = agent.run("Generate a 30 second classical music piece.")
print(result.content)
for audio in result.audio or []:
if audio.url:
download = requests.get(audio.url, timeout=120)
download.raise_for_status()
output = Path("audio_generations") / f"music_{uuid4()}.mp3"
output.parent.mkdir(parents=True, exist_ok=True)
output.write_bytes(download.content)
print(f"Music saved to {output}")For a processing response, this script reports the provider job ID and exits without downloading a future URL. Complete that queued job through the provider's result API or a webhook before saving its output. An HTTP or provider error is not a completed audio artifact.
Usage
Set up your virtual environment
uv venv --python 3.12
source .venv/bin/activateSet your API key
export OPENAI_API_KEY=xxx
export MODELS_LAB_API_KEY=xxxInstall dependencies
uv pip install -U agno openai requestsRun Agent
python generate_music_agent.py