-
-
Notifications
You must be signed in to change notification settings - Fork 82
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
Changes from 4 commits
f47062d
a70b8c2
c59c158
0f9e489
aa4b592
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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! |
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); | ||
} |
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 | ||
} |
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, | ||
}; | ||
} | ||
} |
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>(); | ||
} | ||
} |
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(); | ||
} |
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" /> | ||
</ItemGroup> | ||
|
||
<ItemGroup> | ||
<ProjectReference Include="..\..\..\Utilities\Pollyfils\src\LangChain.Polyfills.csproj" /> | ||
<ProjectReference Include="..\..\Abstractions\src\LangChain.Providers.Abstractions.csproj" /> | ||
</ItemGroup> | ||
|
||
</Project> |
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"); |
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; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider changing the data type of - public object ImageUrl { get; set; } = string.Empty;
+ public string ImageUrl { get; set; } = string.Empty; Committable suggestion
Suggested change
|
||||||
|
||||||
[JsonPropertyName("image_large_url")] | ||||||
public object ImageLargeUrl { get; set; } = string.Empty; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider changing the data type of - public object ImageLargeUrl { get; set; } = string.Empty;
+ public string ImageLargeUrl { get; set; } = string.Empty; Committable suggestion
Suggested change
|
||||||
|
||||||
[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; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider changing the data type of - public object Reaction { get; set; } = string.Empty;
+ public ReactionType Reaction { get; set; } = new ReactionType(); // Assuming ReactionType is a defined class Committable suggestion
Suggested change
|
||||||
|
||||||
[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; } | ||||||
} |
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; } | ||
} |
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; } | ||
} |
There was a problem hiding this comment.
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.Committable suggestion