@elizaos/plugin-suno 1.0.6-alpha.3 → 2.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/providers/suno.ts","../src/actions/generate.ts","../src/actions/customGenerate.ts","../src/actions/extend.ts","../src/index.ts"],"sourcesContent":["import type { IAgentRuntime, Memory, State } from \"@elizaos/core\"; // Added type keyword\r\nimport type { Provider } from \"@elizaos/core\"; // Added type keyword\r\n\r\nexport interface SunoConfig {\r\n apiKey: string;\r\n baseUrl?: string;\r\n}\r\n\r\nexport class SunoProvider implements Provider {\r\n private apiKey: string;\r\n private baseUrl: string;\r\n\r\n static async get(runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<SunoProvider> {\r\n const apiKey = runtime.getSetting(\"SUNO_API_KEY\");\r\n if (!apiKey) {\r\n throw new Error(\"SUNO_API_KEY is required\");\r\n }\r\n return new SunoProvider({ apiKey });\r\n }\r\n\r\n constructor(config: SunoConfig) {\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = config.baseUrl || 'https://api.suno.ai/v1';\r\n }\r\n\r\n async get(_runtime: IAgentRuntime, _message: Memory, _state?: State): Promise<{ status: string }> {\r\n return { status: 'ready' };\r\n }\r\n\r\n async request(endpoint: string, options: RequestInit = {}) {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n const headers = {\r\n 'Authorization': `Bearer ${this.apiKey}`,\r\n 'Content-Type': 'application/json',\r\n ...options.headers,\r\n };\r\n\r\n const response = await fetch(url, {\r\n ...options,\r\n headers,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Suno API error: ${response.statusText}`);\r\n }\r\n\r\n return response.json();\r\n }\r\n}\r\n\r\nexport interface GenerateParams {\r\n prompt: string;\r\n duration?: number;\r\n temperature?: number;\r\n topK?: number;\r\n topP?: number;\r\n classifier_free_guidance?: number;\r\n}\r\n\r\nexport interface CustomGenerateParams extends GenerateParams {\r\n reference_audio?: string;\r\n style?: string;\r\n bpm?: number;\r\n key?: string;\r\n mode?: string;\r\n}\r\n\r\nexport interface ExtendParams {\r\n audio_id: string;\r\n duration: number;\r\n}\r\n\r\nexport interface GenerationResponse {\r\n id: string;\r\n status: 'pending' | 'processing' | 'completed' | 'failed';\r\n audio_url?: string;\r\n error?: string;\r\n}","import type { Action, IAgentRuntime, Memory, State, HandlerCallback } from \"@elizaos/core\";\r\nimport { SunoProvider } from \"../providers/suno\";\r\nimport type { GenerateParams } from \"../types\";\r\n\r\nconst generateMusic: Action = {\r\n name: \"generate-music\",\r\n description: \"Generate music using Suno AI\",\r\n similes: [\r\n \"CREATE_MUSIC\",\r\n \"MAKE_MUSIC\",\r\n \"COMPOSE_MUSIC\",\r\n \"GENERATE_AUDIO\",\r\n \"CREATE_SONG\",\r\n \"MAKE_SONG\"\r\n ],\r\n\r\n validate: async (runtime: IAgentRuntime, _message: Memory) => {\r\n return !!runtime.getSetting(\"SUNO_API_KEY\");\r\n },\r\n\r\n handler: async (\r\n runtime: IAgentRuntime,\r\n message: Memory,\r\n state: State,\r\n _options: { [key: string]: unknown },\r\n callback?: HandlerCallback\r\n ): Promise<boolean> => {\r\n try {\r\n const provider = await SunoProvider.get(runtime, message, state);\r\n const content = message.content as unknown as GenerateParams;\r\n\r\n if (!content.prompt) {\r\n throw new Error(\"Missing required parameter: prompt\");\r\n }\r\n\r\n const response = await provider.request('/generate', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n prompt: content.prompt,\r\n duration: content.duration || 30,\r\n temperature: content.temperature || 1.0,\r\n top_k: content.topK || 250,\r\n top_p: content.topP || 0.95,\r\n classifier_free_guidance: content.classifier_free_guidance || 3.0\r\n })\r\n });\r\n\r\n if (callback) {\r\n callback({\r\n text: 'Successfully generated music based on your prompt',\r\n content: response\r\n });\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n if (callback) {\r\n callback({\r\n text: `Failed to extend audio: ${(error as Error).message}`,\r\n error: error\r\n });\r\n }\r\n return false;\r\n }\r\n },\r\n\r\n examples: [\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Create a happy and energetic song\",\r\n prompt: \"A cheerful and energetic melody with upbeat rhythm\",\r\n duration: 30,\r\n temperature: 1.0\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll generate a happy and energetic song for you.\",\r\n action: \"generate-music\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully generated your upbeat and energetic song.\"\r\n }\r\n }\r\n ],\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Generate a relaxing ambient track\",\r\n prompt: \"A peaceful ambient soundscape with gentle waves and soft pads\",\r\n duration: 45,\r\n temperature: 0.8,\r\n classifier_free_guidance: 4.0\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll create a calming ambient piece for you.\",\r\n action: \"generate-music\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully generated your relaxing ambient soundscape.\"\r\n }\r\n }\r\n ],\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Make a short jingle for my podcast\",\r\n prompt: \"A catchy and professional podcast intro jingle\",\r\n duration: 15,\r\n temperature: 1.2,\r\n top_k: 300\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll generate a podcast jingle for you.\",\r\n action: \"generate-music\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully generated your podcast jingle.\"\r\n }\r\n }\r\n ]\r\n ]\r\n};\r\n\r\nexport default generateMusic;","import type { Action, IAgentRuntime, Memory, State, HandlerCallback } from \"@elizaos/core\";\r\nimport { SunoProvider } from \"../providers/suno\";\r\nimport type { CustomGenerateParams } from \"../types\";\r\n\r\nconst customGenerateMusic: Action = {\r\n name: \"custom-generate-music\",\r\n description: \"Generate music with custom parameters using Suno AI\",\r\n similes: [\r\n \"CREATE_CUSTOM_MUSIC\",\r\n \"GENERATE_CUSTOM_AUDIO\",\r\n \"MAKE_CUSTOM_MUSIC\",\r\n \"COMPOSE_CUSTOM_MUSIC\",\r\n \"COMPOSE_MUSIC\",\r\n \"CREATE_MUSIC\",\r\n \"GENERATE_MUSIC\"\r\n\r\n ],\r\n\r\n validate: async (runtime: IAgentRuntime, _message: Memory) => {\r\n return !!runtime.getSetting(\"SUNO_API_KEY\");\r\n },\r\n\r\n handler: async (\r\n runtime: IAgentRuntime,\r\n message: Memory,\r\n state: State,\r\n _options: { [key: string]: unknown },\r\n callback?: HandlerCallback\r\n ): Promise<boolean> => {\r\n try {\r\n const provider = await SunoProvider.get(runtime, message, state);\r\n const content = message.content as unknown as CustomGenerateParams;\r\n\r\n if (!content.prompt) {\r\n throw new Error(\"Missing required parameter: prompt\");\r\n }\r\n\r\n const response = await provider.request('/custom-generate', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n prompt: content.prompt,\r\n duration: content.duration || 30,\r\n temperature: content.temperature || 1.0,\r\n top_k: content.topK || 250,\r\n top_p: content.topP || 0.95,\r\n classifier_free_guidance: content.classifier_free_guidance || 3.0,\r\n reference_audio: content.reference_audio,\r\n style: content.style,\r\n bpm: content.bpm,\r\n key: content.key,\r\n mode: content.mode\r\n })\r\n });\r\n\r\n if (callback) {\r\n callback({\r\n text: 'Successfully generated custom music',\r\n content: response\r\n });\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n if (callback) {\r\n callback({\r\n text: `Failed to generate custom music: ${(error as Error).message}`,\r\n error: error\r\n });\r\n }\r\n return false;\r\n }\r\n },\r\n\r\n examples: [\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Create an upbeat electronic dance track with heavy bass\",\r\n prompt: \"An upbeat electronic dance track with heavy bass and energetic synths\",\r\n duration: 60,\r\n style: \"electronic\",\r\n bpm: 128\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll generate an energetic EDM track for you.\",\r\n action: \"custom-generate-music\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully generated your EDM track with heavy bass and synths.\"\r\n }\r\n }\r\n ],\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Generate a calm piano melody in C major\",\r\n prompt: \"A gentle, flowing piano melody with soft dynamics\",\r\n duration: 45,\r\n style: \"classical\",\r\n key: \"C\",\r\n mode: \"major\",\r\n temperature: 0.8\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll create a calming piano piece in C major for you.\",\r\n action: \"custom-generate-music\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully generated your peaceful piano melody in C major.\"\r\n }\r\n }\r\n ],\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Make a rock song with guitar solos\",\r\n prompt: \"A rock song with powerful electric guitar solos and driving drums\",\r\n duration: 90,\r\n style: \"rock\",\r\n bpm: 120,\r\n classifier_free_guidance: 4.0\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll generate a rock track with guitar solos for you.\",\r\n action: \"custom-generate-music\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully generated your rock song with guitar solos.\"\r\n }\r\n }\r\n ]\r\n ]\r\n};\r\n\r\nexport default customGenerateMusic;","import type { Action, IAgentRuntime, Memory, State, HandlerCallback } from \"@elizaos/core\";\r\nimport { SunoProvider } from \"../providers/suno\";\r\nimport type { ExtendParams } from \"../types\";\r\n\r\nconst extendAudio: Action = {\r\n name: \"extend-audio\",\r\n description: \"Extend the duration of an existing audio generation\",\r\n similes: [\r\n \"LENGTHEN_AUDIO\",\r\n \"PROLONG_AUDIO\",\r\n \"INCREASE_DURATION\",\r\n \"MAKE_AUDIO_LONGER\"\r\n ],\r\n\r\n validate: async (runtime: IAgentRuntime, _message: Memory) => {\r\n return !!runtime.getSetting(\"SUNO_API_KEY\");\r\n },\r\n\r\n handler: async (\r\n runtime: IAgentRuntime,\r\n message: Memory,\r\n state: State,\r\n _options: { [key: string]: unknown },\r\n callback?: HandlerCallback\r\n ): Promise<boolean> => {\r\n try {\r\n const provider = await SunoProvider.get(runtime, message, state);\r\n const content = message.content as unknown as ExtendParams;\r\n\r\n if (!content.audio_id || !content.duration) {\r\n throw new Error(\"Missing required parameters: audio_id and duration\");\r\n }\r\n\r\n const response = await provider.request('/extend', {\r\n method: 'POST',\r\n body: JSON.stringify({\r\n audio_id: content.audio_id,\r\n duration: content.duration\r\n })\r\n });\r\n\r\n if (callback) {\r\n callback({\r\n text: `Successfully extended audio ${content.audio_id}`,\r\n content: response\r\n });\r\n }\r\n\r\n return true;\r\n } catch (error) {\r\n if (callback) {\r\n callback({\r\n text: `Failed to extend audio: ${(error as Error).message}`,\r\n error: error\r\n });\r\n }\r\n return false;\r\n }\r\n },\r\n\r\n examples: [\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Make this song longer by 30 seconds\",\r\n audio_id: \"abc123\",\r\n duration: 30\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll extend your song by 30 seconds.\",\r\n action: \"extend-audio\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully extended your song by 30 seconds.\"\r\n }\r\n }\r\n ],\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Double the length of this track\",\r\n audio_id: \"xyz789\",\r\n duration: 60\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll double the duration of your track.\",\r\n action: \"extend-audio\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully doubled the length of your track to 60 seconds.\"\r\n }\r\n }\r\n ],\r\n [\r\n {\r\n user: \"{{user1}}\",\r\n content: {\r\n text: \"Add 15 more seconds to this melody\",\r\n audio_id: \"def456\",\r\n duration: 15\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"I'll add 15 seconds to your melody.\",\r\n action: \"extend-audio\"\r\n }\r\n },\r\n {\r\n user: \"{{agent}}\",\r\n content: {\r\n text: \"Successfully added 15 seconds to your melody.\"\r\n }\r\n }\r\n ]\r\n ]\r\n};\r\n\r\nexport default extendAudio;","import type { Plugin } from \"@elizaos/core\";\r\nimport generateMusic from \"./actions/generate\";\r\nimport customGenerateMusic from \"./actions/customGenerate\";\r\nimport extendAudio from \"./actions/extend\";\r\nimport { SunoProvider } from \"./providers/suno\";\r\n\r\nexport {\r\n SunoProvider,\r\n generateMusic as GenerateMusic,\r\n customGenerateMusic as CustomGenerateMusic,\r\n extendAudio as ExtendAudio\r\n};\r\n\r\nexport const sunoPlugin: Plugin = {\r\n name: \"suno\",\r\n description: \"Suno AI Music Generation Plugin for Eliza\",\r\n actions: [generateMusic, customGenerateMusic, extendAudio],\r\n evaluators: [],\r\n providers: [SunoProvider],\r\n};\r\n\r\nexport default sunoPlugin;"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/providers/suno.ts","../src/actions/musicGeneration.ts","../src/index.ts"],"sourcesContent":["import {\n type IAgentRuntime,\n type Memory,\n type Provider,\n type RecordLlmCallDetails,\n recordLlmCall,\n type State,\n} from '@elizaos/core';\n\nexport interface SunoConfig {\n apiKey: string;\n baseUrl?: string;\n}\n\nexport class SunoProvider {\n private apiKey: string;\n private baseUrl: string;\n\n static async get(\n runtime: IAgentRuntime,\n _message: Memory,\n _state?: State\n ): Promise<SunoProvider> {\n const apiKey = runtime.getSetting('SUNO_API_KEY');\n if (typeof apiKey !== 'string' || !apiKey) {\n throw new Error('SUNO_API_KEY is required');\n }\n return new SunoProvider({ apiKey });\n }\n\n constructor(config: SunoConfig) {\n this.apiKey = config.apiKey;\n this.baseUrl = config.baseUrl || 'https://api.suno.ai/v1';\n }\n\n async get(\n _runtime: IAgentRuntime,\n _message: Memory,\n _state?: State\n ): Promise<{ status: string }> {\n return { status: 'ready' };\n }\n\n async request(runtime: IAgentRuntime, endpoint: string, options: RequestInit = {}) {\n const url = `${this.baseUrl}${endpoint}`;\n const headers = {\n Authorization: `Bearer ${this.apiKey}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n };\n\n const body = typeof options.body === 'string' ? options.body : '';\n const details: RecordLlmCallDetails = {\n model: 'suno',\n modelVersion: 'api-v1',\n systemPrompt: 'Suno music generation API request',\n userPrompt: body,\n temperature: readTemperature(body),\n maxTokens: 0,\n purpose: 'action',\n actionType: `suno.fetch${endpoint}`,\n };\n\n return recordLlmCall(runtime, details, async () => {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n if (!response.ok) {\n throw new Error(`Suno API error: ${response.statusText}`);\n }\n\n const data = await response.json();\n details.response = JSON.stringify({ suno_response: data });\n return data;\n });\n }\n}\n\nfunction readTemperature(body: string): number {\n if (!body) return 0;\n try {\n const parsed = JSON.parse(body) as { temperature?: unknown };\n return typeof parsed.temperature === 'number' ? parsed.temperature : 0;\n } catch {\n return 0;\n }\n}\n\nexport const sunoStatusProvider: Provider = {\n name: 'SUNO_STATUS',\n description: 'Suno music generation status',\n descriptionCompressed: 'Suno generation availability.',\n contexts: ['media'],\n contextGate: { anyOf: ['media'] },\n cacheStable: false,\n cacheScope: 'turn',\n get: async (runtime: IAgentRuntime) => {\n const configured = Boolean(runtime.getSetting('SUNO_API_KEY'));\n return {\n text: JSON.stringify(\n {\n suno: {\n configured,\n status: configured ? 'ready' : 'missing_api_key',\n action: 'MUSIC_GENERATION',\n subactions: ['generate', 'custom', 'extend'],\n },\n },\n null,\n 2\n ),\n data: { configured },\n values: { sunoConfigured: configured },\n };\n },\n};\n\nexport interface GenerateParams {\n prompt: string;\n duration?: number;\n temperature?: number;\n topK?: number;\n topP?: number;\n classifier_free_guidance?: number;\n}\n\nexport interface CustomGenerateParams extends GenerateParams {\n reference_audio?: string;\n style?: string;\n bpm?: number;\n key?: string;\n mode?: string;\n}\n\nexport interface ExtendParams {\n audio_id: string;\n duration: number;\n}\n\nexport interface GenerationResponse {\n id: string;\n status: 'pending' | 'processing' | 'completed' | 'failed';\n audio_url?: string;\n error?: string;\n}\n","import type {\n Action,\n ActionResult,\n HandlerCallback,\n IAgentRuntime,\n Memory,\n State,\n} from '@elizaos/core';\nimport { SunoProvider } from '../providers/suno';\n\ntype MusicGenerationSubaction = 'generate' | 'custom' | 'extend';\n\ntype MusicGenerationParams = {\n action?: MusicGenerationSubaction | string;\n subaction?: MusicGenerationSubaction | string;\n operation?: MusicGenerationSubaction | string;\n prompt?: string;\n duration?: number;\n temperature?: number;\n topK?: number;\n topP?: number;\n classifier_free_guidance?: number;\n reference_audio?: string;\n style?: string;\n bpm?: number;\n key?: string;\n mode?: string;\n audio_id?: string;\n};\n\nconst SUNO_ACTION_TIMEOUT_MS = 30_000;\nconst MAX_SUNO_RESPONSE_BYTES = 4000;\n\nfunction paramsFromMessageAndOptions(\n message: Memory,\n options?: Record<string, unknown>\n): MusicGenerationParams {\n const content =\n message.content && typeof message.content === 'object'\n ? (message.content as Record<string, unknown>)\n : {};\n const parameters =\n options?.parameters && typeof options.parameters === 'object'\n ? (options.parameters as Record<string, unknown>)\n : {};\n return { ...content, ...options, ...parameters } as MusicGenerationParams;\n}\n\nfunction normalizeSubaction(value: unknown): MusicGenerationSubaction | null {\n const normalized = typeof value === 'string' ? value.trim().toLowerCase() : '';\n if (normalized === 'generate' || normalized === 'custom' || normalized === 'extend') {\n return normalized;\n }\n if (normalized === 'custom_generate' || normalized === 'custom-generate') return 'custom';\n if (normalized === 'extend_audio' || normalized === 'extend-audio') return 'extend';\n return null;\n}\n\nfunction inferSubaction(message: Memory, params: MusicGenerationParams): MusicGenerationSubaction {\n const explicit = normalizeSubaction(params.action ?? params.subaction ?? params.operation);\n if (explicit) return explicit;\n const text = (message.content?.text ?? '').toLowerCase();\n if (params.audio_id || /\\b(extend|lengthen|longer|add \\d+.*seconds?)\\b/.test(text)) {\n return 'extend';\n }\n if (\n params.reference_audio ||\n params.style ||\n params.bpm ||\n params.key ||\n params.mode ||\n /\\b(custom|style|bpm|key|mode|reference)\\b/.test(text)\n ) {\n return 'custom';\n }\n return 'generate';\n}\n\nfunction promptFromParams(message: Memory, params: MusicGenerationParams): string {\n const prompt = typeof params.prompt === 'string' ? params.prompt.trim() : '';\n if (prompt) return prompt;\n return (message.content?.text ?? '').trim();\n}\n\nfunction numberOrDefault(value: unknown, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : fallback;\n}\n\nfunction generationBody(params: MusicGenerationParams, prompt: string): Record<string, unknown> {\n return {\n prompt,\n duration: numberOrDefault(params.duration, 30),\n temperature: numberOrDefault(params.temperature, 1.0),\n top_k: numberOrDefault(params.topK, 250),\n top_p: numberOrDefault(params.topP, 0.95),\n classifier_free_guidance: numberOrDefault(params.classifier_free_guidance, 3.0),\n };\n}\n\nexport const musicGeneration: Action = {\n name: 'MUSIC_GENERATION',\n contexts: ['media'],\n contextGate: { anyOf: ['media'] },\n roleGate: { minRole: 'USER' },\n description:\n 'Generate music through Suno. Use action generate for a simple prompt, custom for style/BPM/key/reference parameters, or extend for an existing audio_id and duration.',\n descriptionCompressed: 'Suno music generation router action: generate, custom, extend.',\n similes: [\n 'GENERATE_MUSIC',\n 'CREATE_MUSIC',\n 'MAKE_MUSIC',\n 'COMPOSE_MUSIC',\n 'CUSTOM_GENERATE_MUSIC',\n 'EXTEND_AUDIO',\n ],\n parameters: [\n {\n name: 'action',\n description: 'Suno operation: generate, custom, or extend.',\n required: false,\n schema: { type: 'string', enum: ['generate', 'custom', 'extend'] },\n },\n {\n name: 'subaction',\n description: 'Legacy alias for action.',\n required: false,\n schema: { type: 'string' },\n },\n {\n name: 'prompt',\n description: 'Music prompt for generate/custom.',\n required: false,\n schema: { type: 'string' },\n },\n {\n name: 'audio_id',\n description: 'Existing Suno audio id for extend.',\n required: false,\n schema: { type: 'string' },\n },\n {\n name: 'duration',\n description: 'Generation duration or extension seconds.',\n required: false,\n schema: { type: 'number', default: 30 },\n },\n ],\n validate: async (runtime: IAgentRuntime, message: Memory): Promise<boolean> => {\n if (!runtime.getSetting('SUNO_API_KEY')) return false;\n const text = (message.content?.text ?? '').toLowerCase();\n return /\\b(generate|create|make|compose|extend|music|song|audio|track)\\b/.test(text);\n },\n handler: async (\n runtime: IAgentRuntime,\n message: Memory,\n state: State,\n options: Record<string, unknown> | undefined,\n callback?: HandlerCallback\n ): Promise<ActionResult> => {\n try {\n const params = paramsFromMessageAndOptions(message, options);\n const subaction = inferSubaction(message, params);\n const provider = await SunoProvider.get(runtime, message, state);\n\n let endpoint = '/generate';\n let body: Record<string, unknown>;\n\n if (subaction === 'extend') {\n if (!params.audio_id || !params.duration) {\n throw new Error('Missing required parameters: audio_id and duration');\n }\n endpoint = '/extend';\n body = {\n audio_id: params.audio_id,\n duration: params.duration,\n };\n } else {\n const prompt = promptFromParams(message, params);\n if (!prompt) {\n throw new Error('Missing required parameter: prompt');\n }\n body = generationBody(params, prompt);\n if (subaction === 'custom') {\n endpoint = '/custom-generate';\n body = {\n ...body,\n reference_audio: params.reference_audio,\n style: params.style,\n bpm: params.bpm,\n key: params.key,\n mode: params.mode,\n };\n }\n }\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), SUNO_ACTION_TIMEOUT_MS);\n const response = await provider\n .request(runtime, endpoint, {\n method: 'POST',\n body: JSON.stringify(body),\n signal: controller.signal,\n })\n .finally(() => clearTimeout(timeout));\n const cappedResponse =\n JSON.stringify(response).length > MAX_SUNO_RESPONSE_BYTES\n ? {\n truncated: true,\n preview: JSON.stringify(response).slice(0, MAX_SUNO_RESPONSE_BYTES),\n }\n : response;\n\n await callback?.({\n text:\n subaction === 'extend'\n ? `Successfully extended audio ${params.audio_id}`\n : `Successfully submitted ${subaction} music generation`,\n content: cappedResponse,\n });\n\n return {\n success: true,\n text:\n subaction === 'extend'\n ? `Successfully extended audio ${params.audio_id}`\n : `Successfully submitted ${subaction} music generation`,\n data: { subaction, response: cappedResponse },\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n const text = `Music generation failed: ${errorMessage}`;\n await callback?.({\n text,\n error,\n });\n return { success: false, text, error: errorMessage };\n }\n },\n examples: [\n [\n {\n name: '{{user1}}',\n content: {\n text: 'Generate a relaxing ambient track',\n prompt: 'A peaceful ambient soundscape with gentle waves and soft pads',\n duration: 45,\n },\n },\n {\n name: '{{agent}}',\n content: {\n text: \"I'll generate a calming ambient piece.\",\n action: 'MUSIC_GENERATION',\n },\n },\n ],\n ],\n};\n\nexport default musicGeneration;\n","import type { Plugin } from '@elizaos/core';\nimport musicGeneration from './actions/musicGeneration';\nimport { SunoProvider, sunoStatusProvider } from './providers/suno';\n\nexport {\n SunoProvider,\n musicGeneration as MusicGeneration,\n musicGeneration as GenerateMusic,\n musicGeneration as CustomGenerateMusic,\n musicGeneration as ExtendAudio,\n sunoStatusProvider,\n};\n\nexport const sunoPlugin: Plugin = {\n name: 'suno',\n description: 'Suno AI Music Generation Plugin for Eliza',\n actions: [musicGeneration],\n providers: [sunoStatusProvider],\n // Self-declared auto-enable: activate when SUNO_API_KEY is set OR when\n // media.audio is configured to use the suno provider with own-key mode.\n autoEnable: {\n shouldEnable: (env, config) => {\n const key = env.SUNO_API_KEY;\n if (typeof key === 'string' && key.trim() !== '') return true;\n const media = config?.media as Record<string, unknown> | undefined;\n const audio = media?.audio as\n | { enabled?: unknown; mode?: unknown; provider?: unknown }\n | undefined;\n return Boolean(\n audio &&\n audio.enabled !== false &&\n audio.mode === 'own-key' &&\n audio.provider === 'suno'\n );\n },\n },\n};\n\nexport default sunoPlugin;\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,38 +1,65 @@
1
1
  {
2
- "name": "@elizaos/plugin-suno",
3
- "version": "1.0.6-alpha.3",
4
- "description": "Suno AI Music Generation Plugin for Eliza",
5
- "main": "dist/index.js",
6
- "type": "module",
7
- "types": "dist/index.d.ts",
8
- "scripts": {
9
- "build": "tsup --format esm",
10
- "dev": "tsup --format esm --watch",
11
- "lint": "echo \"Lint skipped for release\"",
12
- "lint:check": "bun run lint",
13
- "lint:fix": "biome check --apply src/",
14
- "format": "biome format src/",
15
- "format:fix": "biome format --write src/",
16
- "test": "echo \"Tests skipped for release\"",
17
- "typecheck": "echo \"Typecheck skipped for release\""
18
- },
19
- "devDependencies": {
20
- "@biomejs/biome": "1.5.3",
21
- "@types/jest": "^27.0.0",
22
- "@types/node": "^16.0.0",
23
- "jest": "^27.0.0",
24
- "tsup": "^8.3.5",
25
- "typescript": "^5.0.0"
26
- },
27
- "agentConfig": {
28
- "pluginType": "elizaos:client:1.0.0",
29
- "pluginParameters": {
30
- "apiKey": {
31
- "type": "string",
32
- "minLength": 1,
33
- "description": "Your Suno API key for authentication.",
34
- "optional": false
35
- }
36
- }
2
+ "name": "@elizaos/plugin-suno",
3
+ "version": "2.0.0-beta.1",
4
+ "description": "Suno AI Music Generation Plugin for Eliza",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ "./package.json": "./package.json",
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
37
14
  }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "auto-enable.ts"
19
+ ],
20
+ "elizaos": {
21
+ "plugin": {
22
+ "autoEnableModule": "./auto-enable.ts",
23
+ "capabilities": [
24
+ "audio-generation"
25
+ ]
26
+ }
27
+ },
28
+ "scripts": {
29
+ "build": "tsup --format esm",
30
+ "dev": "tsup --format esm --watch",
31
+ "lint": "echo \"Lint skipped for release\"",
32
+ "lint:check": "bun run lint",
33
+ "lint:fix": "bunx @biomejs/biome check --write ./src",
34
+ "format": "bunx @biomejs/biome format --write ./src",
35
+ "format:check": "bunx @biomejs/biome format ./src",
36
+ "test": "vitest run --config vitest.config.ts --passWithNoTests",
37
+ "typecheck": "echo \"Typecheck skipped for release\""
38
+ },
39
+ "devDependencies": {
40
+ "@biomejs/biome": "^2.4.14",
41
+ "@types/jest": "^30.0.0",
42
+ "@types/node": "^22.19.17",
43
+ "jest": "^30.0.0",
44
+ "tsup": "^8.5.1",
45
+ "typescript": "^6.0.3",
46
+ "vitest": "^4.0.0"
47
+ },
48
+ "agentConfig": {
49
+ "pluginType": "elizaos:client:1.0.0",
50
+ "pluginParameters": {
51
+ "apiKey": {
52
+ "type": "string",
53
+ "minLength": 1,
54
+ "description": "Your Suno API key for authentication.",
55
+ "optional": false
56
+ }
57
+ }
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "dependencies": {
63
+ "@elizaos/core": "2.0.0-beta.1"
64
+ }
38
65
  }
package/biome.json DELETED
@@ -1,41 +0,0 @@
1
- {
2
- "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
3
- "organizeImports": {
4
- "enabled": false
5
- },
6
- "linter": {
7
- "enabled": true,
8
- "rules": {
9
- "recommended": true,
10
- "correctness": {
11
- "noUnusedVariables": "error"
12
- },
13
- "suspicious": {
14
- "noExplicitAny": "error"
15
- },
16
- "style": {
17
- "useConst": "error",
18
- "useImportType": "off"
19
- }
20
- }
21
- },
22
- "formatter": {
23
- "enabled": true,
24
- "indentStyle": "space",
25
- "indentWidth": 4,
26
- "lineWidth": 100
27
- },
28
- "javascript": {
29
- "formatter": {
30
- "quoteStyle": "single",
31
- "trailingCommas": "es5"
32
- }
33
- },
34
- "files": {
35
- "ignore": [
36
- "dist/**/*",
37
- "extra/**/*",
38
- "node_modules/**/*"
39
- ]
40
- }
41
- }
@@ -1,156 +0,0 @@
1
- import type { Action, IAgentRuntime, Memory, State, HandlerCallback } from "@elizaos/core";
2
- import { SunoProvider } from "../providers/suno";
3
- import type { CustomGenerateParams } from "../types";
4
-
5
- const customGenerateMusic: Action = {
6
- name: "custom-generate-music",
7
- description: "Generate music with custom parameters using Suno AI",
8
- similes: [
9
- "CREATE_CUSTOM_MUSIC",
10
- "GENERATE_CUSTOM_AUDIO",
11
- "MAKE_CUSTOM_MUSIC",
12
- "COMPOSE_CUSTOM_MUSIC",
13
- "COMPOSE_MUSIC",
14
- "CREATE_MUSIC",
15
- "GENERATE_MUSIC"
16
-
17
- ],
18
-
19
- validate: async (runtime: IAgentRuntime, _message: Memory) => {
20
- return !!runtime.getSetting("SUNO_API_KEY");
21
- },
22
-
23
- handler: async (
24
- runtime: IAgentRuntime,
25
- message: Memory,
26
- state: State,
27
- _options: { [key: string]: unknown },
28
- callback?: HandlerCallback
29
- ): Promise<boolean> => {
30
- try {
31
- const provider = await SunoProvider.get(runtime, message, state);
32
- const content = message.content as unknown as CustomGenerateParams;
33
-
34
- if (!content.prompt) {
35
- throw new Error("Missing required parameter: prompt");
36
- }
37
-
38
- const response = await provider.request('/custom-generate', {
39
- method: 'POST',
40
- body: JSON.stringify({
41
- prompt: content.prompt,
42
- duration: content.duration || 30,
43
- temperature: content.temperature || 1.0,
44
- top_k: content.topK || 250,
45
- top_p: content.topP || 0.95,
46
- classifier_free_guidance: content.classifier_free_guidance || 3.0,
47
- reference_audio: content.reference_audio,
48
- style: content.style,
49
- bpm: content.bpm,
50
- key: content.key,
51
- mode: content.mode
52
- })
53
- });
54
-
55
- if (callback) {
56
- callback({
57
- text: 'Successfully generated custom music',
58
- content: response
59
- });
60
- }
61
-
62
- return true;
63
- } catch (error) {
64
- if (callback) {
65
- callback({
66
- text: `Failed to generate custom music: ${(error as Error).message}`,
67
- error: error
68
- });
69
- }
70
- return false;
71
- }
72
- },
73
-
74
- examples: [
75
- [
76
- {
77
- user: "{{user1}}",
78
- content: {
79
- text: "Create an upbeat electronic dance track with heavy bass",
80
- prompt: "An upbeat electronic dance track with heavy bass and energetic synths",
81
- duration: 60,
82
- style: "electronic",
83
- bpm: 128
84
- }
85
- },
86
- {
87
- user: "{{agent}}",
88
- content: {
89
- text: "I'll generate an energetic EDM track for you.",
90
- action: "custom-generate-music"
91
- }
92
- },
93
- {
94
- user: "{{agent}}",
95
- content: {
96
- text: "Successfully generated your EDM track with heavy bass and synths."
97
- }
98
- }
99
- ],
100
- [
101
- {
102
- user: "{{user1}}",
103
- content: {
104
- text: "Generate a calm piano melody in C major",
105
- prompt: "A gentle, flowing piano melody with soft dynamics",
106
- duration: 45,
107
- style: "classical",
108
- key: "C",
109
- mode: "major",
110
- temperature: 0.8
111
- }
112
- },
113
- {
114
- user: "{{agent}}",
115
- content: {
116
- text: "I'll create a calming piano piece in C major for you.",
117
- action: "custom-generate-music"
118
- }
119
- },
120
- {
121
- user: "{{agent}}",
122
- content: {
123
- text: "Successfully generated your peaceful piano melody in C major."
124
- }
125
- }
126
- ],
127
- [
128
- {
129
- user: "{{user1}}",
130
- content: {
131
- text: "Make a rock song with guitar solos",
132
- prompt: "A rock song with powerful electric guitar solos and driving drums",
133
- duration: 90,
134
- style: "rock",
135
- bpm: 120,
136
- classifier_free_guidance: 4.0
137
- }
138
- },
139
- {
140
- user: "{{agent}}",
141
- content: {
142
- text: "I'll generate a rock track with guitar solos for you.",
143
- action: "custom-generate-music"
144
- }
145
- },
146
- {
147
- user: "{{agent}}",
148
- content: {
149
- text: "Successfully generated your rock song with guitar solos."
150
- }
151
- }
152
- ]
153
- ]
154
- };
155
-
156
- export default customGenerateMusic;
@@ -1,134 +0,0 @@
1
- import type { Action, IAgentRuntime, Memory, State, HandlerCallback } from "@elizaos/core";
2
- import { SunoProvider } from "../providers/suno";
3
- import type { ExtendParams } from "../types";
4
-
5
- const extendAudio: Action = {
6
- name: "extend-audio",
7
- description: "Extend the duration of an existing audio generation",
8
- similes: [
9
- "LENGTHEN_AUDIO",
10
- "PROLONG_AUDIO",
11
- "INCREASE_DURATION",
12
- "MAKE_AUDIO_LONGER"
13
- ],
14
-
15
- validate: async (runtime: IAgentRuntime, _message: Memory) => {
16
- return !!runtime.getSetting("SUNO_API_KEY");
17
- },
18
-
19
- handler: async (
20
- runtime: IAgentRuntime,
21
- message: Memory,
22
- state: State,
23
- _options: { [key: string]: unknown },
24
- callback?: HandlerCallback
25
- ): Promise<boolean> => {
26
- try {
27
- const provider = await SunoProvider.get(runtime, message, state);
28
- const content = message.content as unknown as ExtendParams;
29
-
30
- if (!content.audio_id || !content.duration) {
31
- throw new Error("Missing required parameters: audio_id and duration");
32
- }
33
-
34
- const response = await provider.request('/extend', {
35
- method: 'POST',
36
- body: JSON.stringify({
37
- audio_id: content.audio_id,
38
- duration: content.duration
39
- })
40
- });
41
-
42
- if (callback) {
43
- callback({
44
- text: `Successfully extended audio ${content.audio_id}`,
45
- content: response
46
- });
47
- }
48
-
49
- return true;
50
- } catch (error) {
51
- if (callback) {
52
- callback({
53
- text: `Failed to extend audio: ${(error as Error).message}`,
54
- error: error
55
- });
56
- }
57
- return false;
58
- }
59
- },
60
-
61
- examples: [
62
- [
63
- {
64
- user: "{{user1}}",
65
- content: {
66
- text: "Make this song longer by 30 seconds",
67
- audio_id: "abc123",
68
- duration: 30
69
- }
70
- },
71
- {
72
- user: "{{agent}}",
73
- content: {
74
- text: "I'll extend your song by 30 seconds.",
75
- action: "extend-audio"
76
- }
77
- },
78
- {
79
- user: "{{agent}}",
80
- content: {
81
- text: "Successfully extended your song by 30 seconds."
82
- }
83
- }
84
- ],
85
- [
86
- {
87
- user: "{{user1}}",
88
- content: {
89
- text: "Double the length of this track",
90
- audio_id: "xyz789",
91
- duration: 60
92
- }
93
- },
94
- {
95
- user: "{{agent}}",
96
- content: {
97
- text: "I'll double the duration of your track.",
98
- action: "extend-audio"
99
- }
100
- },
101
- {
102
- user: "{{agent}}",
103
- content: {
104
- text: "Successfully doubled the length of your track to 60 seconds."
105
- }
106
- }
107
- ],
108
- [
109
- {
110
- user: "{{user1}}",
111
- content: {
112
- text: "Add 15 more seconds to this melody",
113
- audio_id: "def456",
114
- duration: 15
115
- }
116
- },
117
- {
118
- user: "{{agent}}",
119
- content: {
120
- text: "I'll add 15 seconds to your melody.",
121
- action: "extend-audio"
122
- }
123
- },
124
- {
125
- user: "{{agent}}",
126
- content: {
127
- text: "Successfully added 15 seconds to your melody."
128
- }
129
- }
130
- ]
131
- ]
132
- };
133
-
134
- export default extendAudio;