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

generate_music_agent.py
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/activate

Set your API key

export OPENAI_API_KEY=xxx
export MODELS_LAB_API_KEY=xxx

Install dependencies

uv pip install -U agno openai requests

Run Agent

python generate_music_agent.py