adk_audio/tools/
generate_music.rs1use std::sync::Arc;
4
5use async_trait::async_trait;
6use serde_json::Value;
7
8use crate::traits::{MusicProvider, MusicRequest};
9
10pub struct GenerateMusicTool {
14 music: Arc<dyn MusicProvider>,
15}
16
17impl GenerateMusicTool {
18 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}