Skip to content

Commit

Permalink
feat: Stable diffusion support (#96)
Browse files Browse the repository at this point in the history
* Ollama provider

* - namespace fix
- stable difussion with automatic1111
  • Loading branch information
TesAnti authored Jan 6, 2024
1 parent 9cf6b37 commit 9236fda
Show file tree
Hide file tree
Showing 19 changed files with 13,181 additions and 20 deletions.
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 @@ public static GroupChat GroupChat(
{
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, test and publish / 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, test and publish / 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, test and publish / 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, test and publish / 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, test and publish / 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, test and publish / 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, test and publish / 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, test and publish / 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, test and publish / 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, test and publish / 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

0 comments on commit 9236fda

Please sign in to comment.