Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Implemented Suno provider. #169

Merged
merged 5 commits into from
Apr 15, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion LangChain.Providers.slnf
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,13 @@
"src\\Providers\\Ollama\\test\\LangChain.Providers.Ollama.Tests.csproj",
"src\\Providers\\OpenAI\\src\\LangChain.Providers.OpenAI.csproj",
"src\\Providers\\OpenAI\\test\\LangChain.Providers.OpenAI.Tests.csproj",
"src\\Providers\\WhisperNet\\test\\LangChain.Providers.WhisperNet.Tests.csproj",
"src\\Providers\\Suno\\src\\LangChain.Providers.Suno.csproj",
"src\\Providers\\Suno\\test\\LangChain.Providers.Suno.Tests.csproj",
"src\\Providers\\WhisperNet\\src\\LangChain.Providers.WhisperNet.csproj",
"src\\Providers\\WhisperNet\\test\\LangChain.Providers.WhisperNet.Tests.csproj",
"src\\Sources\\Abstractions\\src\\LangChain.Sources.Abstractions.csproj",
"src\\Sources\\Pdf\\src\\LangChain.Sources.Pdf.csproj",
"src\\Splitters\\Abstractions\\src\\LangChain.Splitters.Abstractions.csproj",
"src\\Utilities\\Pollyfils\\src\\LangChain.Polyfills.csproj"
]
}
Expand Down
3 changes: 2 additions & 1 deletion LangChain.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=Initializable/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=llava/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Modelfile/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ollama/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ollama/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Suno/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
1 change: 1 addition & 0 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@
<PackageVersion Include="System.CommandLine.NamingConventionBinder" Version="2.0.0-beta4.22272.1" />
<PackageVersion Include="System.Memory.Data" Version="8.0.0" />
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
<PackageVersion Include="System.Net.Http.Json" Version="8.0.0" />
<PackageVersion Include="System.Text.Json" Version="8.0.0" />
<PackageVersion Include="System.ValueTuple" Version="4.5.0" />
<PackageVersion Include="Tiktoken" Version="1.1.3" />
Expand Down
28 changes: 28 additions & 0 deletions src/Providers/Abstractions/src/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
LangChain.Providers.ITextToMusicModel
LangChain.Providers.ITextToMusicModel.GenerateMusicAsync(LangChain.Providers.TextToMusicRequest! request, LangChain.Providers.TextToMusicSettings? settings = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<LangChain.Providers.TextToMusicResponse!>!
LangChain.Providers.ITextToMusicModel.PromptSent -> System.EventHandler<string!>?
LangChain.Providers.TextToMusicModel
LangChain.Providers.TextToMusicModel.OnPromptSent(string! prompt) -> void
LangChain.Providers.TextToMusicModel.PromptSent -> System.EventHandler<string!>?
LangChain.Providers.TextToMusicModel.TextToMusicModel(string! id) -> void
LangChain.Providers.TextToMusicRequest
LangChain.Providers.TextToMusicRequest.Prompt.get -> string!
LangChain.Providers.TextToMusicRequest.Prompt.init -> void
LangChain.Providers.TextToMusicRequest.TextToMusicRequest() -> void
LangChain.Providers.TextToMusicResponse
LangChain.Providers.TextToMusicResponse.Deconstruct(out byte[]! values, out LangChain.Providers.Usage usage) -> void
LangChain.Providers.TextToMusicResponse.Deconstruct(out byte[]! values, out LangChain.Providers.Usage usage, out LangChain.Providers.TextToMusicSettings! usedSettings) -> void
LangChain.Providers.TextToMusicResponse.Images.get -> System.Collections.Generic.IReadOnlyList<LangChain.Providers.Data!>!
LangChain.Providers.TextToMusicResponse.Images.init -> void
LangChain.Providers.TextToMusicResponse.TextToMusicResponse() -> void
LangChain.Providers.TextToMusicResponse.ToByteArray() -> byte[]!
LangChain.Providers.TextToMusicResponse.Usage.get -> LangChain.Providers.Usage
LangChain.Providers.TextToMusicResponse.Usage.init -> void
LangChain.Providers.TextToMusicResponse.UsedSettings.get -> LangChain.Providers.TextToMusicSettings!
LangChain.Providers.TextToMusicResponse.UsedSettings.init -> void
LangChain.Providers.TextToMusicSettings
LangChain.Providers.TextToMusicSettings.TextToMusicSettings() -> void
static LangChain.Providers.TextToMusicRequest.implicit operator LangChain.Providers.TextToMusicRequest!(string! message) -> LangChain.Providers.TextToMusicRequest!
static LangChain.Providers.TextToMusicRequest.ToTextToMusicRequest(string! message) -> LangChain.Providers.TextToMusicRequest!
static LangChain.Providers.TextToMusicResponse.implicit operator byte[]!(LangChain.Providers.TextToMusicResponse! response) -> byte[]!
static LangChain.Providers.TextToMusicSettings.Default.get -> LangChain.Providers.TextToMusicSettings!
25 changes: 25 additions & 0 deletions src/Providers/Abstractions/src/TextToMusic/ITextToMusicModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

/// <summary>
///
/// </summary>
public interface ITextToMusicModel : IModel<TextToMusicSettings>
{
/// <summary>
/// Occurs before prompt is sent to the model.
/// </summary>
event EventHandler<string>? PromptSent;

/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="settings"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public Task<TextToMusicResponse> GenerateMusicAsync(
TextToMusicRequest request,
TextToMusicSettings? settings = default,
CancellationToken cancellationToken = default);
}
16 changes: 16 additions & 0 deletions src/Providers/Abstractions/src/TextToMusic/TextToMusicModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace LangChain.Providers;

public abstract class TextToMusicModel(string id) : Model<TextToMusicSettings>(id)
{
#region Events

/// <inheritdoc cref="IChatModel.PromptSent"/>
public event EventHandler<string>? PromptSent;

protected void OnPromptSent(string prompt)
{
PromptSent?.Invoke(this, prompt);
}

#endregion
}
31 changes: 31 additions & 0 deletions src/Providers/Abstractions/src/TextToMusic/TextToMusicRequest.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

/// <summary>
/// Base class for image generation requests.
/// </summary>
public class TextToMusicRequest
{
public required string Prompt { get; init; }

/// <inheritdoc cref="ToTextToMusicRequest(string)"/>
public static implicit operator TextToMusicRequest(string message)
{
return ToTextToMusicRequest(message);
}

/// <summary>
/// Explicitly converts a string to a <see cref="TextToImageRequest"/>. <br/>
/// Will be converted to a <see cref="TextToImageRequest"/>
/// with a prompt and default settings.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public static TextToMusicRequest ToTextToMusicRequest(string message)
{
return new TextToMusicRequest
{
Prompt = message,
};
}
}
45 changes: 45 additions & 0 deletions src/Providers/Abstractions/src/TextToMusic/TextToMusicResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

/// <summary>
///
/// </summary>
public class TextToMusicResponse
{
public IReadOnlyList<Data> Images { get; init; } = new List<Data>();

public Usage Usage { get; init; } = Usage.Empty;

/// <summary>
///
/// </summary>
public required TextToMusicSettings UsedSettings { get; init; }

public void Deconstruct(
out byte[] values,
out Usage usage)
{
values = ToByteArray();
usage = Usage;
}

public void Deconstruct(
out byte[] values,
out Usage usage,
out TextToMusicSettings usedSettings)
{
values = ToByteArray();
usage = Usage;
usedSettings = UsedSettings;
}

public static implicit operator byte[](TextToMusicResponse response)
{
return response?.ToByteArray() ?? [];
}

public byte[] ToByteArray()
{
return Images.ElementAtOrDefault(0)?.ToByteArray() ?? Array.Empty<byte>();
}
}
12 changes: 12 additions & 0 deletions src/Providers/Abstractions/src/TextToMusic/TextToMusicSettings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// ReSharper disable once CheckNamespace
namespace LangChain.Providers;

#pragma warning disable CA1052 // Static holder types should be Static or NotInheritable

/// <summary>
/// Base class for image generation request settings.
/// </summary>
public class TextToMusicSettings
{
public static TextToMusicSettings Default { get; } = new();
}
26 changes: 26 additions & 0 deletions src/Providers/Suno/src/LangChain.Providers.Suno.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net4.6.2;netstandard2.0;net6.0;net7.0;net8.0</TargetFrameworks>
<NoWarn>$(NoWarn);CA1056;CA1724</NoWarn>
</PropertyGroup>

<ItemGroup Label="Usings">
<Using Include="System.Net.Http" />
</ItemGroup>

<PropertyGroup Label="NuGet">
<Description>Suno AI API model provider.</Description>
<PackageTags>$(PackageTags);leonardoai;leonardo;api;music;text;music2text</PackageTags>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="System.Net.Http.Json" />
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specify the version for System.Net.Http.Json to avoid potential conflicts with different versions.

- <PackageReference Include="System.Net.Http.Json" />
+ <PackageReference Include="System.Net.Http.Json" Version="8.0.0" />

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
<PackageReference Include="System.Net.Http.Json" />
<PackageReference Include="System.Net.Http.Json" Version="8.0.0" />

</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\..\..\Utilities\Pollyfils\src\LangChain.Polyfills.csproj" />
<ProjectReference Include="..\..\Abstractions\src\LangChain.Providers.Abstractions.csproj" />
</ItemGroup>

</Project>
15 changes: 15 additions & 0 deletions src/Providers/Suno/src/Predefined/TextToMusicModels.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
namespace LangChain.Providers.Suno.Predefined;

/// <summary>
///
/// </summary>
/// <param name="provider"></param>
public class ChirpV3Model(SunoProvider provider)
: SunoModel(provider, id: "chirp-v3-0");

/// <summary>
///
/// </summary>
/// <param name="provider"></param>
public class ChirpV2Model(SunoProvider provider)
: SunoModel(provider, id: "chirp-v2-xxl-alpha");
60 changes: 60 additions & 0 deletions src/Providers/Suno/src/Sdk/Clip.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
using System.Text.Json.Serialization;

namespace LangChain.Providers.Suno.Sdk;

public class Clip
{
[JsonPropertyName("id")]
public string Id { get; set; } = string.Empty;

[JsonPropertyName("video_url")]
public string VideoUrl { get; set; } = string.Empty;

[JsonPropertyName("audio_url")]
public string AudioUrl { get; set; } = string.Empty;

[JsonPropertyName("image_url")]
public object ImageUrl { get; set; } = string.Empty;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider changing the data type of ImageUrl from object to string.

- public object ImageUrl { get; set; } = string.Empty;
+ public string ImageUrl { get; set; } = string.Empty;

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
public object ImageUrl { get; set; } = string.Empty;
public string ImageUrl { get; set; } = string.Empty;


[JsonPropertyName("image_large_url")]
public object ImageLargeUrl { get; set; } = string.Empty;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider changing the data type of ImageLargeUrl from object to string.

- public object ImageLargeUrl { get; set; } = string.Empty;
+ public string ImageLargeUrl { get; set; } = string.Empty;

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
public object ImageLargeUrl { get; set; } = string.Empty;
public string ImageLargeUrl { get; set; } = string.Empty;


[JsonPropertyName("major_model_version")]
public string MajorModelVersion { get; set; } = string.Empty;

[JsonPropertyName("model_name")]
public string ModelName { get; set; } = string.Empty;

[JsonPropertyName("metadata")]
public Metadata Metadata { get; set; } = new Metadata();

[JsonPropertyName("is_liked")]
public bool IsLiked { get; set; }

[JsonPropertyName("user_id")]
public string UserId { get; set; } = string.Empty;

[JsonPropertyName("is_trashed")]
public bool IsTrashed { get; set; }

[JsonPropertyName("reaction")]
public object Reaction { get; set; } = string.Empty;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider changing the data type of Reaction from object to a more specific type or a custom class if multiple fields are expected.

- public object Reaction { get; set; } = string.Empty;
+ public ReactionType Reaction { get; set; } = new ReactionType(); // Assuming ReactionType is a defined class

Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation.

Suggested change
public object Reaction { get; set; } = string.Empty;
public ReactionType Reaction { get; set; } = new ReactionType(); // Assuming ReactionType is a defined class


[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; }

[JsonPropertyName("status")]
public string Status { get; set; } = string.Empty;

[JsonPropertyName("title")]
public string Title { get; set; } = string.Empty;

[JsonPropertyName("play_count")]
public int PlayCount { get; set; }

[JsonPropertyName("upvote_count")]
public int UpvoteCount { get; set; }

[JsonPropertyName("is_public")]
public bool IsPublic { get; set; }
}
30 changes: 30 additions & 0 deletions src/Providers/Suno/src/Sdk/GenerateV2Request.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using System.Text.Json.Serialization;

namespace LangChain.Providers.Suno.Sdk;

public class GenerateV2Request
HavenDV marked this conversation as resolved.
Show resolved Hide resolved
{
[JsonPropertyName("gpt_description_prompt")]
public string GptDescriptionPrompt { get; set; } = string.Empty;

[JsonPropertyName("mv")]
public string Mv { get; set; } = string.Empty;

[JsonPropertyName("prompt")]
public string Prompt { get; set; } = string.Empty;

[JsonPropertyName("make_instrumental")]
public bool MakeInstrumental { get; set; }

[JsonPropertyName("tags")]
public string Tags { get; set; } = string.Empty;

[JsonPropertyName("title")]
public string Title { get; set; } = string.Empty;

[JsonPropertyName("continue_clip_id")]
public string ContinueClipId { get; set; } = string.Empty;

[JsonPropertyName("continue_at")]
public int ContinueAt { get; set; }
}
27 changes: 27 additions & 0 deletions src/Providers/Suno/src/Sdk/GenerateV2Response.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.Text.Json.Serialization;

namespace LangChain.Providers.Suno.Sdk;

public class GenerateV2Response
{
[JsonPropertyName("id")]
public string Id { get; set; } = string.Empty;

[JsonPropertyName("clips")]
public IReadOnlyList<Clip> Clips { get; set; } = [];

[JsonPropertyName("metadata")]
public Metadata Metadata { get; set; } = new();

[JsonPropertyName("major_model_version")]
public string MajorModelVersion { get; set; } = string.Empty;

[JsonPropertyName("status")]
public string Status { get; set; } = string.Empty;

[JsonPropertyName("created_at")]
public DateTime CreatedAt { get; set; }

[JsonPropertyName("batch_size")]
public int BatchSize { get; set; }
}
Loading
Loading