Skip to main content

adk_audio/tools/
generate_music.rs

1//! GenerateMusicTool — generate music via a configured MusicProvider.
2
3use std::sync::Arc;
4
5use async_trait::async_trait;
6use serde_json::Value;
7
8use crate::traits::{MusicProvider, MusicRequest};
9
10/// Tool that generates music from a text prompt.
11///
12/// Accepts JSON `{prompt, duration_secs, genre?}` and returns `{duration_ms}`.
13pub struct GenerateMusicTool {
14    music: Arc<dyn MusicProvider>,
15}
16
17impl GenerateMusicTool {
18    /// Create a new `GenerateMusicTool` with the given music provider.
19    pub fn new(music: Arc<dyn MusicProvider>) -> Self {
20        Self { music }
21    }
22}
23
24#[async_trait]
25impl adk_core::Tool for GenerateMusicTool {
26    fn name(&self) -> &str {
27        "generate_music"
28    }
29
30    fn description(&self) -> &str {
31        "Generate music or ambient audio from a text prompt"
32    }
33
34    fn parameters_schema(&self) -> Option<Value> {
35        Some(serde_json::json!({
36            "type": "object",
37            "properties": {
38                "prompt": { "type": "string", "description": "Text description of desired music" },
39                "duration_secs": { "type": "integer", "description": "Duration in seconds" },
40                "genre": { "type": "string", "description": "Genre hint (optional)" }
41            },
42            "required": ["prompt", "duration_secs"]
43        }))
44    }
45
46    async fn execute(
47        &self,
48        _ctx: Arc<dyn adk_core::ToolContext>,
49        args: Value,
50    ) -> adk_core::Result<Value> {
51        let prompt = args["prompt"].as_str().unwrap_or_default().to_string();
52        let duration_secs = args["duration_secs"].as_u64().unwrap_or(10) as u32;
53        let genre = args["genre"].as_str().map(String::from);
54
55        let request = MusicRequest { prompt, duration_secs, genre, ..Default::default() };
56        let frame = self
57            .music
58            .generate(&request)
59            .await
60            .map_err(|e| adk_core::AdkError::tool(format!("generate_music: {e}")))?;
61
62        Ok(serde_json::json!({
63            "duration_ms": frame.duration_ms
64        }))
65    }
66}