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

Stable diffusion support #96

Merged
merged 3 commits into from
Jan 6, 2024
Merged
Show file tree
Hide file tree
Changes from all 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
14 changes: 14 additions & 0 deletions LangChain.sln
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Providers.Ollama.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LangChain.Providers.Ollama", "src\libs\Providers\LangChain.Providers.Ollama\LangChain.Providers.Ollama.csproj", "{4913844F-74EC-4E74-AE8A-EA825569E6BA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Providers.Automatic1111", "src\libs\Providers\LangChain.Providers.Automatic1111\LangChain.Providers.Automatic1111.csproj", "{BF4C7B87-0997-4208-84EF-D368DF7B9861}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LangChain.Providers.Automatic1111.IntegrationTests", "src\tests\LangChain.Providers.Automatic1111.IntegrationTests\LangChain.Providers.Automatic1111.IntegrationTests.csproj", "{A6CF79BC-8365-46E8-9230-1A4AD615D40B}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -390,6 +394,14 @@ Global
{4913844F-74EC-4E74-AE8A-EA825569E6BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{4913844F-74EC-4E74-AE8A-EA825569E6BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4913844F-74EC-4E74-AE8A-EA825569E6BA}.Release|Any CPU.Build.0 = Release|Any CPU
{BF4C7B87-0997-4208-84EF-D368DF7B9861}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BF4C7B87-0997-4208-84EF-D368DF7B9861}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF4C7B87-0997-4208-84EF-D368DF7B9861}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF4C7B87-0997-4208-84EF-D368DF7B9861}.Release|Any CPU.Build.0 = Release|Any CPU
{A6CF79BC-8365-46E8-9230-1A4AD615D40B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A6CF79BC-8365-46E8-9230-1A4AD615D40B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A6CF79BC-8365-46E8-9230-1A4AD615D40B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A6CF79BC-8365-46E8-9230-1A4AD615D40B}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -455,6 +467,8 @@ Global
{DEAFA0CB-462D-4D74-B16F-68FD83FE3858} = {FDEE2E22-C239-4921-83B2-9797F765FD6A}
{72B1E2CC-1A34-470E-A579-034CB0972BB7} = {FDEE2E22-C239-4921-83B2-9797F765FD6A}
{4913844F-74EC-4E74-AE8A-EA825569E6BA} = {E55391DE-F8F3-4CC2-A0E3-2406C76E9C68}
{BF4C7B87-0997-4208-84EF-D368DF7B9861} = {E55391DE-F8F3-4CC2-A0E3-2406C76E9C68}
{A6CF79BC-8365-46E8-9230-1A4AD615D40B} = {FDEE2E22-C239-4921-83B2-9797F765FD6A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5C00D0F1-6138-4ED9-846B-97E43D6DFF1C}
Expand Down
1 change: 1 addition & 0 deletions src/Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
<PackageVersion Include="Moq" Version="4.20.69" />
<PackageVersion Include="MSTest.TestAdapter" Version="3.1.1" />
<PackageVersion Include="MSTest.TestFramework" Version="3.1.1" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="Npgsql" Version="8.0.0" />
<PackageVersion Include="Pgvector" Version="0.2.0" />
<PackageVersion Include="NUnit" Version="3.14.0" />
Expand Down
13 changes: 13 additions & 0 deletions src/libs/LangChain.Core/Chains/Chain.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using LangChain.Chains.HelperChains;
using LangChain.Chains.StackableChains;
using LangChain.Chains.StackableChains.Agents;
using LangChain.Chains.StackableChains.Files;
using LangChain.Chains.StackableChains.ImageGeneration;
using LangChain.Chains.StackableChains.ReAct;
using LangChain.Indexes;
using LangChain.Memory;
Expand Down Expand Up @@ -178,4 +180,15 @@
{
return new GroupChat(agents, stopPhrase, messagesLimit, inputKey, outputKey);
}

public static ImageGenerationChain GenerateImage(IGenerateImageModel model,

Check warning on line 184 in src/libs/LangChain.Core/Chains/Chain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'Chain.GenerateImage(IGenerateImageModel, string, string)'
string inputKey = "prompt", string outputKey = "image")
{
return new ImageGenerationChain(model, inputKey, outputKey);
}

public static SaveIntoFileChain SaveIntoFile(string path, string inputKey = "data")

Check warning on line 190 in src/libs/LangChain.Core/Chains/Chain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'Chain.SaveIntoFile(string, string)'
{
return new SaveIntoFileChain(path, inputKey);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
using LangChain.Abstractions.Schema;
using LangChain.Chains.HelperChains;

namespace LangChain.Chains.StackableChains.Files;

public class SaveIntoFileChain:BaseStackableChain

Check warning on line 6 in src/libs/LangChain.Core/Chains/StackableChains/Files/SaveIntoFileChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'SaveIntoFileChain'
{
private readonly string _filename;

public SaveIntoFileChain(string filename, string inputKey="data")

Check warning on line 10 in src/libs/LangChain.Core/Chains/StackableChains/Files/SaveIntoFileChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'SaveIntoFileChain.SaveIntoFileChain(string, string)'
{
_filename = filename;
InputKeys = new[] { inputKey };
OutputKeys = Array.Empty<string>();
}

protected override Task<IChainValues> InternalCall(IChainValues values)

Check warning on line 17 in src/libs/LangChain.Core/Chains/StackableChains/Files/SaveIntoFileChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'SaveIntoFileChain.InternalCall(IChainValues)'
{
if (values.Value[InputKeys[0]] is byte[] data)
{
File.WriteAllBytes(_filename, data);
}
else if (values.Value[InputKeys[0]] is string text)
{
File.WriteAllText(_filename, text);
}
else
{
throw new InvalidOperationException($"Input key {InputKeys[0]} must be byte[] or string");
}

return Task.FromResult(values);

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using LangChain.Abstractions.Schema;
using LangChain.Chains.HelperChains;
using LangChain.Providers;

namespace LangChain.Chains.StackableChains.ImageGeneration;

public class ImageGenerationChain : BaseStackableChain

Check warning on line 7 in src/libs/LangChain.Core/Chains/StackableChains/ImageGeneration/ImageGenerationChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'ImageGenerationChain'
{
private readonly IGenerateImageModel _model;

public ImageGenerationChain(IGenerateImageModel model, string inputKey = "prompt", string outputKey = "image")

Check warning on line 11 in src/libs/LangChain.Core/Chains/StackableChains/ImageGeneration/ImageGenerationChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'ImageGenerationChain.ImageGenerationChain(IGenerateImageModel, string, string)'
{
_model = model;
InputKeys = new[] { inputKey };
OutputKeys = new[] { outputKey };

}

protected override async Task<IChainValues> InternalCall(IChainValues values)

Check warning on line 19 in src/libs/LangChain.Core/Chains/StackableChains/ImageGeneration/ImageGenerationChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Missing XML comment for publicly visible type or member 'ImageGenerationChain.InternalCall(IChainValues)'
{
var prompt = values.Value[InputKeys[0]].ToString();

Check warning on line 21 in src/libs/LangChain.Core/Chains/StackableChains/ImageGeneration/ImageGenerationChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

In externally visible method 'Task<IChainValues> ImageGenerationChain.InternalCall(IChainValues values)', validate parameter 'values' is non-null before using it. If appropriate, throw an 'ArgumentNullException' when the argument is 'null'. (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1062)
var image = await _model.GenerateImageAsBytesAsync(prompt);

Check warning on line 22 in src/libs/LangChain.Core/Chains/StackableChains/ImageGeneration/ImageGenerationChain.cs

View workflow job for this annotation

GitHub Actions / Build and test / Build, test and publish

Consider calling ConfigureAwait on the awaited task (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca2007)
values.Value[OutputKeys[0]] = image;
return values;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using LangChain.Providers;

namespace StableDiffusion;

public class Automatic1111Model: IGenerateImageModel
{
public Automatic1111ModelOptions Options { get; }
private readonly StableDiffusionClient _client;

public Automatic1111Model(string url= "http://localhost:7860/", Automatic1111ModelOptions options=null )
{
Options = options?? new Automatic1111ModelOptions();
HttpClient httpClient = new HttpClient();
_client = new StableDiffusionClient(url, httpClient);
}


public async Task<Uri> GenerateImageAsUrlAsync(string prompt, CancellationToken cancellationToken = default)
{
throw new NotSupportedException();
}

public async Task<Stream> GenerateImageAsStreamAsync(string prompt, CancellationToken cancellationToken = default)
{
var bytes = await GenerateImageAsBytesAsync(prompt, cancellationToken);
return new MemoryStream(bytes);
}

public async Task<byte[]> GenerateImageAsBytesAsync(string prompt, CancellationToken cancellationToken = default)
{
var response = await _client.Text2imgapi_sdapi_v1_txt2img_postAsync(new StableDiffusionProcessingTxt2Img()
{
Prompt = prompt,
Negative_prompt = Options.NegativePrompt,
Height = Options.Height,
Width = Options.Width,
Steps = Options.Steps,
Seed = Options.Seed,
Cfg_scale = Options.CFGScale

});

var encoded = response.Images.First();
// base64 to png

var bytes = Convert.FromBase64String(encoded);
return bytes;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace StableDiffusion;

public class Automatic1111ModelOptions
{
public string NegativePrompt { get; set; }="";
public int Seed { get; set; } = -1;
public int Steps { get; set; } = 20;
public double CFGScale { get; set; } = 7;
public int Width { get; set; }= 512;
public int Height { get; set; }= 512;


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>net4.6.2;netstandard2.0;net6.0;net7.0;net8.0</TargetFrameworks>
<SignAssembly>false</SignAssembly>
<NoWarn>$(NoWarn);CA1003;CA1307</NoWarn>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="LLamaSharp" />
<PackageReference Include="Newtonsoft.Json" />
<PackageReference Include="System.Net.Http" />
</ItemGroup>

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

<PropertyGroup Label="NuGet">
<Description>Automatic1111 Stable DIffusion model provider.</Description>
<PackageTags>$(PackageTags);Auto1111;Automatic1111;Stable Diffusion;Stable Diffusion;api</PackageTags>
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\..\LangChain.Core\LangChain.Core.csproj" />
</ItemGroup>

</Project>
Loading