diff --git a/package-lock.json b/package-lock.json index 505fa0c..8ccfffc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "suno-api", - "version": "1.0.0", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "suno-api", - "version": "1.0.0", + "version": "1.1.0", "license": "LGPL-3.0-or-later", "dependencies": { "@vercel/analytics": "^1.2.2", diff --git a/src/app/v1/chat/completions/route.ts b/src/app/v1/chat/completions/route.ts new file mode 100644 index 0000000..616cb7c --- /dev/null +++ b/src/app/v1/chat/completions/route.ts @@ -0,0 +1,72 @@ +import { NextResponse, NextRequest } from "next/server"; +import { sunoApi } from "@/lib/SunoApi"; + +export const dynamic = "force-dynamic"; + +/** + * desc + * + */ +export async function POST(req: NextRequest) { + try { + + const body = await req.json(); + + let userMessage = null; + const { messages } = body; + for (let message of messages) { + if (message.role == 'user') { + userMessage = message; + } + } + + if (!userMessage) { + return new NextResponse(JSON.stringify({ error: 'Prompt message is required' }), { + status: 400, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + } + }); + } + + + const audioInfo = await (await sunoApi).generate(userMessage.content, true, true); + + const audio = audioInfo[0] + const data = `## 歌曲名称:${audio.title}\n![歌曲封面](${audio.image_url})\n### 歌词:\n${audio.lyric}\n### 听歌链接: ${audio.audio_url}` + + return new NextResponse(data, { + status: 200, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + } + }); + } catch (error: any) { + console.error('Error generating custom audio:', JSON.stringify(error.response.data)); + return new NextResponse(JSON.stringify({ error: 'Internal server error: ' + JSON.stringify(error.response.data.detail) }), { + status: 500, + headers: { + 'Content-Type': 'application/json', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + } + }); + } +} + +export async function OPTIONS(request: Request) { + return new Response(null, { + status: 200, + headers: { + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers': 'Content-Type, Authorization', + } + }); +} \ No newline at end of file