@acedatacloud/n8n-nodes-suno 0.0.0-stage → 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ace Data Cloud
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,78 @@
1
- # Temporary Holding Version
1
+ # Suno by AceDataCloud — n8n community node
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Use [Suno through AceDataCloud](https://platform.acedata.cloud/documents/suno-audios) in your n8n workflows.
4
+
5
+ This package is maintained by **Ace Data Cloud** and connects to **AceDataCloud's API**. It is an AceDataCloud integration, not an official node from Suno, Inc.. You need an AceDataCloud account and a token for the corresponding service; a direct Suno subscription is not an AceDataCloud API credential.
6
+
7
+ Package: `@acedatacloud/n8n-nodes-suno` · License: MIT.
8
+
9
+ ## Installation
10
+
11
+ On self-hosted n8n, open **Settings → Community Nodes → Install**, enter `@acedatacloud/n8n-nodes-suno`, and install. See [n8n's installation guide](https://docs.n8n.io/integrations/community-nodes/installation-and-management/).
12
+
13
+ n8n Cloud requires verified community nodes. Publishing this package to npm does not grant verification. Check the n8n node panel for current availability; this repository does not claim verified status.
14
+
15
+ ## Credentials
16
+
17
+ 1. Sign in to [AceDataCloud](https://platform.acedata.cloud).
18
+ 2. Open the [Suno service documentation](https://platform.acedata.cloud/documents/suno-audios) and acquire service access.
19
+ 3. Create a **Suno by AceDataCloud API** credential in n8n and enter that service's API token.
20
+
21
+ The token is stored in n8n's credential store and sent as a Bearer token only to `https://api.acedata.cloud`. The credential test queries an empty batch of tasks; it does not create media. Use a service API token, not a platform management token. Different services may require different credentials.
22
+
23
+ ## Operations
24
+
25
+ | Resource | Operation | Result |
26
+ | --- | --- | --- |
27
+ | Audio | Create | Submits a generation task and returns its task ID |
28
+ | Lyrics | Create | Generates lyrics from a prompt |
29
+ | Task | Get | Returns a task's state and final result |
30
+ | Task | Get Many | Queries up to 50 comma-separated task IDs |
31
+
32
+ Audio creation supports a description or custom lyrics with a title and musical style, instrumental music, model selection, and optional vocal preferences.
33
+
34
+ ## Generate and wait for a result
35
+
36
+ Import [`examples/generate-and-wait.json`](examples/generate-and-wait.json), assign your credential to both Suno nodes, and edit the prompt and model in **Create**.
37
+
38
+ The template submits once, then queries the returned task every 15 seconds. A separate 30-minute deadline bounds the loop. A failed task or deadline ends with an explicit failure; a completed task exposes the final media in `data`. The deadline does not cancel an already submitted service task; its ID remains available in the execution history.
39
+
40
+ With **Simplify** enabled:
41
+
42
+ - Create returns `taskId`, `status: "submitted"`, `finished: false`, `successful: null`, and `traceId`.
43
+ - Task Get returns `taskId`, `status` (`processing`, `succeeded`, or `failed`), `finished`, `successful`, `data`, `error`, and `traceId`.
44
+ - Audio URLs are typically in `data[].audio_url`.
45
+
46
+ Disable **Simplify** to receive the raw API response. A submission acknowledgment is not a completed generation.
47
+
48
+ ## Billing, retries, and limits
49
+
50
+ Generation uses your AceDataCloud balance. Check current pricing and supported model options on the service page before running a workflow. The node keeps the selected model; it never substitutes another model.
51
+
52
+ Creation requests are not automatically retried. Re-running **Create**, enabling n8n's retry-on-fail setting on it, or restarting the workflow can create another paid task. After a timeout, inspect your existing task and use **Task → Get** where possible. Query operations can be retried without resubmitting generation.
53
+
54
+ Each incoming n8n item creates or queries one request; a batch of input items can create multiple paid tasks. A failed task is returned as `finished: true` and `successful: false` so your workflow can handle it. Authentication, request validation, and HTTP errors fail the node unless you configure n8n to continue on error.
55
+
56
+ ## Data handling
57
+
58
+ The node sends only the configured generation/query parameters to AceDataCloud. Prompts and media URLs are processed by the service. Public input media URLs must be accessible to the API. This package has no runtime dependencies beyond n8n's own workflow API, no telemetry, and no filesystem or environment-variable access in its node implementation.
59
+
60
+ ## Development
61
+
62
+ The package follows the official [n8n node starter](https://github.com/n8n-io/n8n-nodes-starter) structure and uses `@n8n/node-cli` for building and linting. The programmatic style keeps conditional media payloads, asynchronous task-state interpretation, and per-item output mapping explicit; all HTTP calls still use n8n’s authenticated request helper.
63
+
64
+ ```sh
65
+ pnpm install --frozen-lockfile
66
+ pnpm run build
67
+ pnpm run lint
68
+ pnpm test
69
+ pnpm run dev
70
+ ```
71
+
72
+ Node.js 24 is used in CI. Tests exercise request payloads, task state handling, result mapping, credential configuration, item linking, and failures with a mocked HTTP boundary; they do not incur generation charges. CI also loads the compiled package in the official n8n 2.42.3 image and verifies that workflow execution reaches credential validation without sending a generation request.
73
+
74
+ Releases run from merged code through [GitHub Actions](.github/workflows/publish.yml) using `npm publish --provenance`. Open a pull request, pass CI, merge, and push a matching version tag, or run the Publish workflow on `main`. Keep the npm version immutable after publication.
75
+
76
+ ## Support
77
+
78
+ Report integration issues at [AceDataCloud/SunoN8N](https://github.com/AceDataCloud/SunoN8N/issues). Include the package version, n8n version, operation, and a redacted error. Never include API tokens or private generation content.
@@ -0,0 +1,10 @@
1
+ import type { IAuthenticateGeneric, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class AceDataSunoApi implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ icon: "file:../nodes/Suno/acedatacloud.svg";
7
+ properties: INodeProperties[];
8
+ authenticate: IAuthenticateGeneric;
9
+ test: ICredentialTestRequest;
10
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AceDataSunoApi = void 0;
4
+ class AceDataSunoApi {
5
+ constructor() {
6
+ this.name = 'aceDataSunoApi';
7
+ this.displayName = 'Suno by AceDataCloud API';
8
+ this.documentationUrl = 'https://github.com/AceDataCloud/SunoN8N#credentials';
9
+ this.icon = 'file:../nodes/Suno/acedatacloud.svg';
10
+ this.properties = [
11
+ {
12
+ displayName: 'API Token',
13
+ name: 'apiToken',
14
+ type: 'string',
15
+ typeOptions: { password: true },
16
+ default: '',
17
+ required: true,
18
+ description: 'The API token for your Suno service on AceDataCloud',
19
+ },
20
+ ];
21
+ this.authenticate = {
22
+ type: 'generic',
23
+ properties: { headers: { Authorization: '=Bearer {{$credentials.apiToken}}' } },
24
+ };
25
+ this.test = {
26
+ request: {
27
+ baseURL: 'https://api.acedata.cloud',
28
+ url: '/suno/tasks',
29
+ method: 'POST',
30
+ body: { action: 'retrieve_batch', ids: [] },
31
+ },
32
+ };
33
+ }
34
+ }
35
+ exports.AceDataSunoApi = AceDataSunoApi;
36
+ //# sourceMappingURL=AceDataSunoApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AceDataSunoApi.credentials.js","sourceRoot":"","sources":["../../credentials/AceDataSunoApi.credentials.ts"],"names":[],"mappings":";;;AAOA,MAAa,cAAc;IAA3B;QACC,SAAI,GAAG,gBAAgB,CAAC;QACxB,gBAAW,GAAG,0BAA0B,CAAC;QACzC,qBAAgB,GAAG,qDAAqD,CAAC;QACzE,SAAI,GAAG,qCAA8C,CAAC;QACtD,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,WAAW;gBACxB,IAAI,EAAE,UAAU;gBAChB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;gBACd,WAAW,EAAE,qDAAqD;aAClE;SACD,CAAC;QACF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,mCAAmC,EAAE,EAAE;SAC/E,CAAC;QACF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,2BAA2B;gBACpC,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,EAAE,EAAE;aAC3C;SACD,CAAC;IACH,CAAC;CAAA;AA5BD,wCA4BC"}
@@ -0,0 +1,5 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ export declare class Suno implements INodeType {
3
+ description: INodeTypeDescription;
4
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
5
+ }
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Suno = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const helpers_1 = require("./helpers");
6
+ const properties_1 = require("./properties");
7
+ class Suno {
8
+ constructor() {
9
+ this.description = {
10
+ displayName: 'Suno by AceDataCloud',
11
+ name: 'suno',
12
+ icon: { light: 'file:acedatacloud.svg', dark: 'file:acedatacloud.dark.svg' },
13
+ group: ['transform'],
14
+ version: 1,
15
+ subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
16
+ description: 'Create music and retrieve generation tasks through AceDataCloud',
17
+ defaults: { name: 'Suno by AceDataCloud' },
18
+ inputs: [n8n_workflow_1.NodeConnectionTypes.Main],
19
+ outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
20
+ usableAsTool: true,
21
+ credentials: [{ name: 'aceDataSunoApi', required: true }],
22
+ properties: properties_1.properties,
23
+ };
24
+ }
25
+ async execute() {
26
+ var _a, _b;
27
+ const items = this.getInputData();
28
+ const result = [];
29
+ for (let index = 0; index < items.length; index++) {
30
+ try {
31
+ const resource = this.getNodeParameter('resource', index);
32
+ const operation = this.getNodeParameter('operation', index);
33
+ const simplify = this.getNodeParameter('simplify', index, true);
34
+ if (resource === 'task') {
35
+ let body;
36
+ if (operation === 'get') {
37
+ body = {
38
+ action: 'retrieve',
39
+ id: (0, helpers_1.requiredText)(this.getNodeParameter('taskId', index), 'Task ID'),
40
+ };
41
+ }
42
+ else if (operation === 'getMany') {
43
+ const ids = (0, helpers_1.requiredText)(this.getNodeParameter('taskIds', index), 'Task IDs')
44
+ .split(',')
45
+ .map((id) => id.trim())
46
+ .filter(Boolean);
47
+ if (!ids.length || ids.length > 50)
48
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Provide between 1 and 50 task IDs');
49
+ body = { action: 'retrieve_batch', ids };
50
+ }
51
+ else {
52
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Select a supported task operation');
53
+ }
54
+ const response = await (0, helpers_1.request)(this, 'aceDataSunoApi', '/suno/tasks', body);
55
+ const records = operation === 'getMany' ? response.items : [response];
56
+ if (!Array.isArray(records))
57
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The service returned an unexpected task list');
58
+ const valid = records.map((record) => (0, helpers_1.object)(record));
59
+ if (valid.some((record) => !record.id && !record.task_id))
60
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'The task was not found. Check the task ID and service credential');
61
+ result.push(...(0, helpers_1.output)(this, valid.map((record) => (simplify ? (0, helpers_1.taskResult)(record) : record)), index));
62
+ }
63
+ else {
64
+ if (operation !== 'create')
65
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Select a supported operation');
66
+ const prompt = (0, helpers_1.requiredText)(this.getNodeParameter('prompt', index), 'Prompt');
67
+ const options = (0, helpers_1.object)(this.getNodeParameter('options', index, {}));
68
+ if (resource === 'lyrics') {
69
+ const response = await (0, helpers_1.request)(this, 'aceDataSunoApi', '/suno/lyrics', {
70
+ prompt,
71
+ model: this.getNodeParameter('lyricsModel', index),
72
+ });
73
+ result.push(...(0, helpers_1.output)(this, [
74
+ simplify
75
+ ? { taskId: (_a = response.task_id) !== null && _a !== void 0 ? _a : null, data: (_b = response.data) !== null && _b !== void 0 ? _b : null }
76
+ : response,
77
+ ], index));
78
+ }
79
+ else if (resource === 'audio') {
80
+ const custom = this.getNodeParameter('custom', index, false);
81
+ const body = {
82
+ action: 'generate',
83
+ model: this.getNodeParameter('model', index),
84
+ async: true,
85
+ custom,
86
+ instrumental: this.getNodeParameter('instrumental', index, false),
87
+ };
88
+ if (custom) {
89
+ body.lyric = prompt;
90
+ body.title = (0, helpers_1.requiredText)(this.getNodeParameter('title', index), 'Title');
91
+ body.style = (0, helpers_1.requiredText)(this.getNodeParameter('style', index), 'Style');
92
+ }
93
+ else {
94
+ body.prompt = prompt;
95
+ }
96
+ if (typeof options.negativeTags === 'string' && options.negativeTags.trim())
97
+ body.negative_tags = options.negativeTags.trim();
98
+ if (options.vocalGender)
99
+ body.vocal_gender = options.vocalGender;
100
+ const response = await (0, helpers_1.request)(this, 'aceDataSunoApi', '/suno/audios', body);
101
+ const normalized = (0, helpers_1.submissionResult)(response);
102
+ result.push(...(0, helpers_1.output)(this, [simplify ? normalized : response], index));
103
+ }
104
+ else {
105
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Select a supported resource');
106
+ }
107
+ }
108
+ }
109
+ catch (error) {
110
+ result.push((0, helpers_1.failure)(this, error, index));
111
+ }
112
+ }
113
+ return [result];
114
+ }
115
+ }
116
+ exports.Suno = Suno;
117
+ //# sourceMappingURL=Suno.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Suno.node.js","sourceRoot":"","sources":["../../../nodes/Suno/Suno.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ {
2
+ "node": "@acedatacloud/n8n-nodes-suno.suno",
3
+ "nodeVersion": "1.0",
4
+ "codexVersion": "1.0",
5
+ "categories": ["Marketing & Content"],
6
+ "resources": {
7
+ "primaryDocumentation": [
8
+ {
9
+ "url": "https://github.com/AceDataCloud/SunoN8N#readme"
10
+ }
11
+ ]
12
+ }
13
+ }
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#76A5FF"/><path d="M14 47 28 17h8l14 30h-9l-3-7H26l-3 7zm15-15h6l-3-8z" fill="#0B1530"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64"><rect width="64" height="64" rx="14" fill="#246BFD"/><path d="M14 47 28 17h8l14 30h-9l-3-7H26l-3 7zm15-15h6l-3-8z" fill="white"/></svg>
@@ -0,0 +1,8 @@
1
+ import type { IDataObject, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';
2
+ export declare function requiredText(value: unknown, name: string): string;
3
+ export declare function object(value: unknown): IDataObject;
4
+ export declare function taskResult(record: IDataObject): IDataObject;
5
+ export declare function submissionResult(response: IDataObject): IDataObject;
6
+ export declare function request(context: IExecuteFunctions, credential: string, endpoint: string, body: IDataObject): Promise<IDataObject>;
7
+ export declare function output(context: IExecuteFunctions, data: IDataObject[], index: number): INodeExecutionData[];
8
+ export declare function failure(context: IExecuteFunctions, error: unknown, index: number): INodeExecutionData;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requiredText = requiredText;
4
+ exports.object = object;
5
+ exports.taskResult = taskResult;
6
+ exports.submissionResult = submissionResult;
7
+ exports.request = request;
8
+ exports.output = output;
9
+ exports.failure = failure;
10
+ const n8n_workflow_1 = require("n8n-workflow");
11
+ function requiredText(value, name) {
12
+ if (typeof value !== 'string' || !value.trim())
13
+ throw new Error(`${name} is required`);
14
+ return value.trim();
15
+ }
16
+ function object(value) {
17
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
18
+ ? value
19
+ : {};
20
+ }
21
+ function taskResult(record) {
22
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
23
+ const response = object(record.response);
24
+ const state = String((_b = (_a = record.state) !== null && _a !== void 0 ? _a : record.status) !== null && _b !== void 0 ? _b : '').toLowerCase();
25
+ const failed = response.success === false ||
26
+ record.success === false ||
27
+ ['failed', 'error', 'cancelled', 'canceled'].includes(state);
28
+ const complete = !failed &&
29
+ (response.success === true ||
30
+ ['succeeded', 'success', 'completed', 'complete'].includes(state));
31
+ return {
32
+ taskId: (_d = (_c = record.id) !== null && _c !== void 0 ? _c : record.task_id) !== null && _d !== void 0 ? _d : '',
33
+ status: failed ? 'failed' : complete ? 'succeeded' : 'processing',
34
+ finished: failed || complete,
35
+ successful: failed ? false : complete ? true : null,
36
+ data: (_e = response.data) !== null && _e !== void 0 ? _e : null,
37
+ error: (_g = (_f = response.error) !== null && _f !== void 0 ? _f : record.error) !== null && _g !== void 0 ? _g : null,
38
+ traceId: (_j = (_h = record.trace_id) !== null && _h !== void 0 ? _h : response.trace_id) !== null && _j !== void 0 ? _j : null,
39
+ };
40
+ }
41
+ function submissionResult(response) {
42
+ var _a;
43
+ if (typeof response.task_id !== 'string' || !response.task_id)
44
+ throw new Error('The service did not return a task ID');
45
+ return {
46
+ taskId: response.task_id,
47
+ status: 'submitted',
48
+ finished: false,
49
+ successful: null,
50
+ traceId: (_a = response.trace_id) !== null && _a !== void 0 ? _a : null,
51
+ };
52
+ }
53
+ async function request(context, credential, endpoint, body) {
54
+ var _a;
55
+ let result;
56
+ try {
57
+ result = await context.helpers.httpRequestWithAuthentication.call(context, credential, {
58
+ method: 'POST',
59
+ url: `https://api.acedata.cloud${endpoint}`,
60
+ body,
61
+ json: true,
62
+ timeout: 60000,
63
+ });
64
+ }
65
+ catch (error) {
66
+ throw new n8n_workflow_1.NodeApiError(context.getNode(), error);
67
+ }
68
+ const data = object(result);
69
+ if (data.success === false || data.error) {
70
+ const error = object(data.error);
71
+ throw new n8n_workflow_1.NodeApiError(context.getNode(), {
72
+ message: String((_a = error.message) !== null && _a !== void 0 ? _a : 'The service rejected this request'),
73
+ code: error.code,
74
+ });
75
+ }
76
+ return data;
77
+ }
78
+ function output(context, data, index) {
79
+ return context.helpers.constructExecutionMetaData(context.helpers.returnJsonArray(data), {
80
+ itemData: { item: index },
81
+ });
82
+ }
83
+ function failure(context, error, index) {
84
+ const message = error instanceof Error ? error.message : String(error);
85
+ if (context.continueOnFail())
86
+ return { json: { error: message }, pairedItem: { item: index } };
87
+ if (error instanceof n8n_workflow_1.NodeApiError || error instanceof n8n_workflow_1.NodeOperationError)
88
+ throw error;
89
+ throw new n8n_workflow_1.NodeOperationError(context.getNode(), message, { itemIndex: index });
90
+ }
91
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../nodes/Suno/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { INodeProperties } from 'n8n-workflow';
2
+ export declare const properties: INodeProperties[];
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.properties = void 0;
4
+ exports.properties = [
5
+ {
6
+ displayName: 'Resource',
7
+ name: 'resource',
8
+ type: 'options',
9
+ default: 'audio',
10
+ noDataExpression: true,
11
+ options: [
12
+ {
13
+ name: 'Audio',
14
+ value: 'audio',
15
+ },
16
+ {
17
+ name: 'Lyric',
18
+ value: 'lyrics',
19
+ },
20
+ {
21
+ name: 'Task',
22
+ value: 'task',
23
+ },
24
+ ],
25
+ },
26
+ {
27
+ displayName: 'Operation',
28
+ name: 'operation',
29
+ type: 'options',
30
+ default: 'create',
31
+ noDataExpression: true,
32
+ displayOptions: {
33
+ show: {
34
+ resource: ['audio'],
35
+ },
36
+ },
37
+ options: [
38
+ {
39
+ name: 'Create',
40
+ value: 'create',
41
+ description: 'Create audio through AceDataCloud',
42
+ action: 'Create audio',
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ displayName: 'Operation',
48
+ name: 'operation',
49
+ type: 'options',
50
+ default: 'create',
51
+ noDataExpression: true,
52
+ displayOptions: {
53
+ show: {
54
+ resource: ['lyrics'],
55
+ },
56
+ },
57
+ options: [
58
+ {
59
+ name: 'Create',
60
+ value: 'create',
61
+ description: 'Create lyrics through AceDataCloud',
62
+ action: 'Create lyrics',
63
+ },
64
+ ],
65
+ },
66
+ {
67
+ displayName: 'Operation',
68
+ name: 'operation',
69
+ type: 'options',
70
+ default: 'get',
71
+ noDataExpression: true,
72
+ displayOptions: {
73
+ show: {
74
+ resource: ['task'],
75
+ },
76
+ },
77
+ options: [
78
+ {
79
+ name: 'Get',
80
+ value: 'get',
81
+ description: 'Retrieve the status and result of a task',
82
+ action: 'Get a task',
83
+ },
84
+ {
85
+ name: 'Get Many',
86
+ value: 'getMany',
87
+ description: 'Retrieve up to 50 tasks by ID',
88
+ action: 'Get many tasks',
89
+ },
90
+ ],
91
+ },
92
+ {
93
+ displayName: 'Task ID',
94
+ name: 'taskId',
95
+ type: 'string',
96
+ default: '',
97
+ required: true,
98
+ displayOptions: {
99
+ show: {
100
+ resource: ['task'],
101
+ operation: ['get'],
102
+ },
103
+ },
104
+ description: 'The task ID returned by the Create operation',
105
+ },
106
+ {
107
+ displayName: 'Task IDs',
108
+ name: 'taskIds',
109
+ type: 'string',
110
+ default: '',
111
+ required: true,
112
+ displayOptions: {
113
+ show: {
114
+ resource: ['task'],
115
+ operation: ['getMany'],
116
+ },
117
+ },
118
+ description: 'Comma-separated task IDs, up to 50',
119
+ },
120
+ {
121
+ displayName: 'Prompt',
122
+ name: 'prompt',
123
+ type: 'string',
124
+ default: '',
125
+ required: true,
126
+ typeOptions: {
127
+ rows: 4,
128
+ },
129
+ displayOptions: {
130
+ show: {
131
+ resource: ['audio', 'lyrics'],
132
+ },
133
+ },
134
+ description: 'Describe what to generate. In custom music mode, enter the lyrics.',
135
+ },
136
+ {
137
+ displayName: 'Model',
138
+ name: 'model',
139
+ type: 'options',
140
+ default: 'chirp-v5-5',
141
+ options: [
142
+ {
143
+ name: 'chirp-v3-0',
144
+ value: 'chirp-v3-0',
145
+ },
146
+ {
147
+ name: 'chirp-v3-5',
148
+ value: 'chirp-v3-5',
149
+ },
150
+ {
151
+ name: 'chirp-v4',
152
+ value: 'chirp-v4',
153
+ },
154
+ {
155
+ name: 'chirp-v4-5',
156
+ value: 'chirp-v4-5',
157
+ },
158
+ {
159
+ name: 'chirp-v4-5-plus',
160
+ value: 'chirp-v4-5-plus',
161
+ },
162
+ {
163
+ name: 'chirp-v5',
164
+ value: 'chirp-v5',
165
+ },
166
+ {
167
+ name: 'chirp-v5-5',
168
+ value: 'chirp-v5-5',
169
+ },
170
+ {
171
+ name: 'chirp-v6',
172
+ value: 'chirp-v6',
173
+ },
174
+ {
175
+ name: 'chirp-v6-mini',
176
+ value: 'chirp-v6-mini',
177
+ },
178
+ {
179
+ name: 'chirp-v6-wild',
180
+ value: 'chirp-v6-wild',
181
+ },
182
+ ],
183
+ displayOptions: {
184
+ show: {
185
+ resource: ['audio'],
186
+ },
187
+ },
188
+ description: 'The model to use. Availability and pricing depend on the selected model.',
189
+ },
190
+ {
191
+ displayName: 'Custom Lyrics',
192
+ name: 'custom',
193
+ type: 'boolean',
194
+ default: false,
195
+ displayOptions: {
196
+ show: {
197
+ resource: ['audio'],
198
+ },
199
+ },
200
+ description: 'Whether to use the prompt as exact lyrics and specify a title and style',
201
+ },
202
+ {
203
+ displayName: 'Instrumental',
204
+ name: 'instrumental',
205
+ type: 'boolean',
206
+ default: false,
207
+ displayOptions: {
208
+ show: {
209
+ resource: ['audio'],
210
+ },
211
+ },
212
+ description: 'Whether to generate music without vocals',
213
+ },
214
+ {
215
+ displayName: 'Title',
216
+ name: 'title',
217
+ type: 'string',
218
+ default: '',
219
+ required: true,
220
+ displayOptions: {
221
+ show: {
222
+ resource: ['audio'],
223
+ custom: [true],
224
+ },
225
+ },
226
+ },
227
+ {
228
+ displayName: 'Style',
229
+ name: 'style',
230
+ type: 'string',
231
+ default: '',
232
+ required: true,
233
+ displayOptions: {
234
+ show: {
235
+ resource: ['audio'],
236
+ custom: [true],
237
+ },
238
+ },
239
+ description: 'Musical genre, mood, and instruments',
240
+ },
241
+ {
242
+ displayName: 'Lyrics Model',
243
+ name: 'lyricsModel',
244
+ type: 'options',
245
+ default: 'default',
246
+ options: [
247
+ {
248
+ name: 'Default',
249
+ value: 'default',
250
+ },
251
+ {
252
+ name: 'Remi V1',
253
+ value: 'remi-v1',
254
+ },
255
+ ],
256
+ displayOptions: {
257
+ show: {
258
+ resource: ['lyrics'],
259
+ },
260
+ },
261
+ },
262
+ {
263
+ displayName: 'Options',
264
+ name: 'options',
265
+ type: 'collection',
266
+ default: {},
267
+ placeholder: 'Add Option',
268
+ displayOptions: {
269
+ show: {
270
+ resource: ['audio'],
271
+ },
272
+ },
273
+ options: [
274
+ {
275
+ displayName: 'Negative Tags',
276
+ name: 'negativeTags',
277
+ type: 'string',
278
+ default: '',
279
+ description: 'Styles or elements to avoid',
280
+ },
281
+ {
282
+ displayName: 'Vocal Gender',
283
+ name: 'vocalGender',
284
+ type: 'options',
285
+ default: '',
286
+ options: [
287
+ {
288
+ name: 'Automatic',
289
+ value: '',
290
+ },
291
+ {
292
+ name: 'Female',
293
+ value: 'f',
294
+ },
295
+ {
296
+ name: 'Male',
297
+ value: 'm',
298
+ },
299
+ ],
300
+ },
301
+ ],
302
+ },
303
+ {
304
+ displayName: 'Simplify',
305
+ name: 'simplify',
306
+ type: 'boolean',
307
+ default: true,
308
+ description: 'Whether to return a simplified version of the response instead of the raw data',
309
+ },
310
+ ];
311
+ //# sourceMappingURL=properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"properties.js","sourceRoot":"","sources":["../../../nodes/Suno/properties.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,334 @@
1
+ {
2
+ "name": "Generate Suno music with AceDataCloud and wait for completion",
3
+ "nodes": [
4
+ {
5
+ "id": "start",
6
+ "name": "Start",
7
+ "type": "n8n-nodes-base.manualTrigger",
8
+ "typeVersion": 1,
9
+ "position": [0, 0],
10
+ "parameters": {}
11
+ },
12
+ {
13
+ "id": "setup-notes",
14
+ "name": "Setup Notes",
15
+ "type": "n8n-nodes-base.stickyNote",
16
+ "typeVersion": 1,
17
+ "position": [0, -300],
18
+ "parameters": {
19
+ "content": "## Suno through AceDataCloud\nInstall @acedatacloud/n8n-nodes-suno, then select your service credential on Create and Get Task. Edit the prompt and model before running. One execution creates one paid generation task. Querying does not resubmit it. The 30-minute deadline stops waiting; it does not cancel a service task.",
20
+ "height": 230,
21
+ "width": 540
22
+ }
23
+ },
24
+ {
25
+ "id": "create",
26
+ "name": "Create",
27
+ "type": "@acedatacloud/n8n-nodes-suno.suno",
28
+ "typeVersion": 1,
29
+ "position": [220, 0],
30
+ "parameters": {
31
+ "resource": "audio",
32
+ "operation": "create",
33
+ "prompt": "A calm instrumental piece with piano and gentle strings",
34
+ "model": "chirp-v5-5",
35
+ "simplify": true,
36
+ "instrumental": true
37
+ },
38
+ "retryOnFail": false
39
+ },
40
+ {
41
+ "id": "initialize",
42
+ "name": "Initialize",
43
+ "type": "n8n-nodes-base.set",
44
+ "typeVersion": 3.4,
45
+ "position": [440, 0],
46
+ "parameters": {
47
+ "assignments": {
48
+ "assignments": [
49
+ {
50
+ "id": "taskId",
51
+ "name": "taskId",
52
+ "value": "={{ $json.taskId }}",
53
+ "type": "string"
54
+ },
55
+ {
56
+ "id": "deadline",
57
+ "name": "deadline",
58
+ "value": "={{ $now.plus({ minutes: 30 }).toISO() }}",
59
+ "type": "string"
60
+ }
61
+ ]
62
+ },
63
+ "options": {}
64
+ }
65
+ },
66
+ {
67
+ "id": "wait-15-seconds",
68
+ "name": "Wait 15 Seconds",
69
+ "type": "n8n-nodes-base.wait",
70
+ "typeVersion": 1.1,
71
+ "position": [660, 0],
72
+ "parameters": {
73
+ "resume": "timeInterval",
74
+ "amount": 15,
75
+ "unit": "seconds"
76
+ },
77
+ "webhookId": "suno-generation-wait"
78
+ },
79
+ {
80
+ "id": "get-task",
81
+ "name": "Get Task",
82
+ "type": "@acedatacloud/n8n-nodes-suno.suno",
83
+ "typeVersion": 1,
84
+ "position": [880, 0],
85
+ "parameters": {
86
+ "resource": "task",
87
+ "operation": "get",
88
+ "taskId": "={{ $('Initialize').first().json.taskId }}",
89
+ "simplify": true
90
+ }
91
+ },
92
+ {
93
+ "id": "finished",
94
+ "name": "Finished",
95
+ "type": "n8n-nodes-base.if",
96
+ "typeVersion": 2.2,
97
+ "position": [1100, 0],
98
+ "parameters": {
99
+ "conditions": {
100
+ "options": {
101
+ "caseSensitive": true,
102
+ "leftValue": "",
103
+ "typeValidation": "strict",
104
+ "version": 2
105
+ },
106
+ "conditions": [
107
+ {
108
+ "id": "check",
109
+ "leftValue": "={{ $json.finished }}",
110
+ "rightValue": true,
111
+ "operator": {
112
+ "type": "boolean",
113
+ "operation": "true",
114
+ "singleValue": true
115
+ }
116
+ }
117
+ ],
118
+ "combinator": "and"
119
+ },
120
+ "options": {}
121
+ }
122
+ },
123
+ {
124
+ "id": "succeeded",
125
+ "name": "Succeeded",
126
+ "type": "n8n-nodes-base.if",
127
+ "typeVersion": 2.2,
128
+ "position": [1320, -100],
129
+ "parameters": {
130
+ "conditions": {
131
+ "options": {
132
+ "caseSensitive": true,
133
+ "leftValue": "",
134
+ "typeValidation": "strict",
135
+ "version": 2
136
+ },
137
+ "conditions": [
138
+ {
139
+ "id": "check",
140
+ "leftValue": "={{ $json.successful === true }}",
141
+ "rightValue": true,
142
+ "operator": {
143
+ "type": "boolean",
144
+ "operation": "true",
145
+ "singleValue": true
146
+ }
147
+ }
148
+ ],
149
+ "combinator": "and"
150
+ },
151
+ "options": {}
152
+ }
153
+ },
154
+ {
155
+ "id": "deadline-reached",
156
+ "name": "Deadline Reached",
157
+ "type": "n8n-nodes-base.if",
158
+ "typeVersion": 2.2,
159
+ "position": [1320, 180],
160
+ "parameters": {
161
+ "conditions": {
162
+ "options": {
163
+ "caseSensitive": true,
164
+ "leftValue": "",
165
+ "typeValidation": "strict",
166
+ "version": 2
167
+ },
168
+ "conditions": [
169
+ {
170
+ "id": "check",
171
+ "leftValue": "={{ $now.toMillis() >= Date.parse($('Initialize').first().json.deadline) }}",
172
+ "rightValue": true,
173
+ "operator": {
174
+ "type": "boolean",
175
+ "operation": "true",
176
+ "singleValue": true
177
+ }
178
+ }
179
+ ],
180
+ "combinator": "and"
181
+ },
182
+ "options": {}
183
+ }
184
+ },
185
+ {
186
+ "id": "result",
187
+ "name": "Result",
188
+ "type": "n8n-nodes-base.noOp",
189
+ "typeVersion": 1,
190
+ "position": [1540, -180],
191
+ "parameters": {}
192
+ },
193
+ {
194
+ "id": "generation-failed",
195
+ "name": "Generation Failed",
196
+ "type": "n8n-nodes-base.stopAndError",
197
+ "typeVersion": 1,
198
+ "position": [1540, -20],
199
+ "parameters": {
200
+ "errorType": "errorMessage",
201
+ "errorMessage": "={{ \"Generation failed for task \" + $json.taskId + \": \" + JSON.stringify($json.error) }}"
202
+ }
203
+ },
204
+ {
205
+ "id": "stop-waiting",
206
+ "name": "Stop Waiting",
207
+ "type": "n8n-nodes-base.stopAndError",
208
+ "typeVersion": 1,
209
+ "position": [1540, 180],
210
+ "parameters": {
211
+ "errorType": "errorMessage",
212
+ "errorMessage": "={{ 'Stopped waiting after 30 minutes. Query task ' + $('Initialize').first().json.taskId + ' again later; do not resubmit Create.' }}"
213
+ }
214
+ }
215
+ ],
216
+ "connections": {
217
+ "Start": {
218
+ "main": [
219
+ [
220
+ {
221
+ "node": "Create",
222
+ "type": "main",
223
+ "index": 0
224
+ }
225
+ ]
226
+ ]
227
+ },
228
+ "Create": {
229
+ "main": [
230
+ [
231
+ {
232
+ "node": "Initialize",
233
+ "type": "main",
234
+ "index": 0
235
+ }
236
+ ]
237
+ ]
238
+ },
239
+ "Initialize": {
240
+ "main": [
241
+ [
242
+ {
243
+ "node": "Wait 15 Seconds",
244
+ "type": "main",
245
+ "index": 0
246
+ }
247
+ ]
248
+ ]
249
+ },
250
+ "Wait 15 Seconds": {
251
+ "main": [
252
+ [
253
+ {
254
+ "node": "Get Task",
255
+ "type": "main",
256
+ "index": 0
257
+ }
258
+ ]
259
+ ]
260
+ },
261
+ "Get Task": {
262
+ "main": [
263
+ [
264
+ {
265
+ "node": "Finished",
266
+ "type": "main",
267
+ "index": 0
268
+ }
269
+ ]
270
+ ]
271
+ },
272
+ "Finished": {
273
+ "main": [
274
+ [
275
+ {
276
+ "node": "Succeeded",
277
+ "type": "main",
278
+ "index": 0
279
+ }
280
+ ],
281
+ [
282
+ {
283
+ "node": "Deadline Reached",
284
+ "type": "main",
285
+ "index": 0
286
+ }
287
+ ]
288
+ ]
289
+ },
290
+ "Succeeded": {
291
+ "main": [
292
+ [
293
+ {
294
+ "node": "Result",
295
+ "type": "main",
296
+ "index": 0
297
+ }
298
+ ],
299
+ [
300
+ {
301
+ "node": "Generation Failed",
302
+ "type": "main",
303
+ "index": 0
304
+ }
305
+ ]
306
+ ]
307
+ },
308
+ "Deadline Reached": {
309
+ "main": [
310
+ [
311
+ {
312
+ "node": "Stop Waiting",
313
+ "type": "main",
314
+ "index": 0
315
+ }
316
+ ],
317
+ [
318
+ {
319
+ "node": "Wait 15 Seconds",
320
+ "type": "main",
321
+ "index": 0
322
+ }
323
+ ]
324
+ ]
325
+ }
326
+ },
327
+ "pinData": {},
328
+ "settings": {
329
+ "executionOrder": "v1",
330
+ "executionTimeout": 1900
331
+ },
332
+ "active": false,
333
+ "tags": []
334
+ }
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@acedatacloud/n8n-nodes-suno",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "n8n community node for Suno music generation through AceDataCloud.",
5
+ "license": "MIT",
6
+ "homepage": "https://github.com/AceDataCloud/SunoN8N",
7
+ "keywords": [
8
+ "n8n-community-node-package",
9
+ "acedatacloud",
10
+ "suno"
11
+ ],
12
+ "author": {
13
+ "name": "Ace Data Cloud",
14
+ "email": "dev@acedata.cloud",
15
+ "url": "https://platform.acedata.cloud"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/AceDataCloud/SunoN8N.git"
20
+ },
21
+ "bugs": {
22
+ "url": "https://github.com/AceDataCloud/SunoN8N/issues"
23
+ },
24
+ "scripts": {
25
+ "build": "n8n-node build",
26
+ "dev": "n8n-node dev",
27
+ "lint": "n8n-node lint",
28
+ "lint:fix": "n8n-node lint --fix",
29
+ "test": "node --test tests/*.test.cjs",
30
+ "prepublishOnly": "npm run build && npm run lint && npm test"
31
+ },
32
+ "files": [
33
+ "dist/credentials",
34
+ "dist/nodes",
35
+ "examples"
36
+ ],
37
+ "n8n": {
38
+ "n8nNodesApiVersion": 1,
39
+ "strict": true,
40
+ "credentials": [
41
+ "dist/credentials/AceDataSunoApi.credentials.js"
42
+ ],
43
+ "nodes": [
44
+ "dist/nodes/Suno/Suno.node.js"
45
+ ]
46
+ },
47
+ "devDependencies": {
48
+ "@n8n/node-cli": "0.51.3",
49
+ "typescript": "5.9.3",
50
+ "prettier": "3.6.2",
51
+ "eslint": "9.29.0"
52
+ },
53
+ "peerDependencies": {
54
+ "n8n-workflow": "*"
55
+ },
56
+ "publishConfig": {
57
+ "access": "public",
58
+ "provenance": true
59
+ }
60
+ }