From 03fb690b8f1aeb3e511484c96f2cee8855a70421 Mon Sep 17 00:00:00 2001 From: Darren Reid Date: Thu, 3 Oct 2024 12:03:09 +1000 Subject: [PATCH] More AI Server docs. --- .../ai-server/cs/ai-server-compatible-1.cs.md | 18 ++++++ .../ai-server/cs/ai-server-raw-1.cs.md | 22 +++++++ .../ai-server/cs/image-to-image-1.cs.md | 14 +++++ .../ai-server/cs/image-upscale-1.cs.md | 12 ++++ .../ai-server/cs/image-with-mask-1.cs.md | 15 +++++ .../ai-server/cs/open-ai-requests-1.cs.md | 10 +++- .../ai-server/cs/speech-to-text-1.cs.md | 14 +++++ .../ai-server/cs/text-to-image-1.cs.md | 14 +++++ .../ai-server/cs/video-convert-1.cs.md | 15 +++++ .../_includes/ai-server/cs/video-crop-1.cs.md | 18 ++++++ MyApp/_pages/ai-server/usage/video.md | 57 +++++++++++++++++++ 11 files changed, 206 insertions(+), 3 deletions(-) create mode 100644 MyApp/_includes/ai-server/cs/ai-server-compatible-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/ai-server-raw-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/image-to-image-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/image-upscale-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/image-with-mask-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/speech-to-text-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/text-to-image-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/video-convert-1.cs.md create mode 100644 MyApp/_includes/ai-server/cs/video-crop-1.cs.md create mode 100644 MyApp/_pages/ai-server/usage/video.md diff --git a/MyApp/_includes/ai-server/cs/ai-server-compatible-1.cs.md b/MyApp/_includes/ai-server/cs/ai-server-compatible-1.cs.md new file mode 100644 index 000000000..cfb0dc5c1 --- /dev/null +++ b/MyApp/_includes/ai-server/cs/ai-server-compatible-1.cs.md @@ -0,0 +1,18 @@ +```csharp +var apiClient = GetLocalApiClient("https://localhost:5005"); +apiClient.BearerToken = Environment.GetEnvironmentVariable("AI_SERVER_API_KEY"); + +var request = new CreateOpenAiChatCompletion { + Model = "llama3:8b", + Messages = new List + { + new OpenAiMessage { Role = "system", Content = "You are a helpful AI assistant." }, + new OpenAiMessage { Role = "user", Content = "How do LLMs work?" } + }, + MaxTokens = 50 +}; + +var response = await apiClient.PostAsync(request); +var openAiResponse = response; // The same +Console.WriteLine(openAiResponse.Choices[0].Message.Content); +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/ai-server-raw-1.cs.md b/MyApp/_includes/ai-server/cs/ai-server-raw-1.cs.md new file mode 100644 index 000000000..396b8dc1d --- /dev/null +++ b/MyApp/_includes/ai-server/cs/ai-server-raw-1.cs.md @@ -0,0 +1,22 @@ +```csharp +var apiClient = GetLocalApiClient("https://localhost:5005"); +apiClient.BearerToken = Environment.GetEnvironmentVariable("AI_SERVER_API_KEY"); + +var request = new CreateOpenAiChat() { + Request = new () + { + Model = "llama3:8b", + Messages = new List + { + new OpenAiMessage { Role = "system", Content = "You are a helpful AI assistant." }, + new OpenAiMessage { Role = "user", Content = "How do LLMs work?" } + }, + MaxTokens = 50 + }, + Sync = true +}; + +var response = await apiClient.PostAsync(request); +var openAiResponse = response.Result.ResponseBody.FromJson(); +Console.WriteLine(openAiResponse.Choices[0].Message.Content); +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/image-to-image-1.cs.md b/MyApp/_includes/ai-server/cs/image-to-image-1.cs.md new file mode 100644 index 000000000..de8c2d9f0 --- /dev/null +++ b/MyApp/_includes/ai-server/cs/image-to-image-1.cs.md @@ -0,0 +1,14 @@ +```csharp +var request = new ImageToImage() +{ + PositivePrompt = "A beautiful sunset over the ocean", + NegativePrompt = "A pixelated, low-quality image", + Sync = true +}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("image", File.OpenRead("ocean-sunset.jpg"), "ocean-sunset.jpg")] +); +response.Outputs[0].Url.DownloadFileTo("ocean-sunset.webp"); +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/image-upscale-1.cs.md b/MyApp/_includes/ai-server/cs/image-upscale-1.cs.md new file mode 100644 index 000000000..053b3f911 --- /dev/null +++ b/MyApp/_includes/ai-server/cs/image-upscale-1.cs.md @@ -0,0 +1,12 @@ +```csharp +var request = new ImageUpscale() +{ + Sync = true +}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("image", File.OpenRead("low-res.jpg"), "low-res.jpg")] +); +response.Outputs[0].Url.DownloadFileTo("high-res.webp"); +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/image-with-mask-1.cs.md b/MyApp/_includes/ai-server/cs/image-with-mask-1.cs.md new file mode 100644 index 000000000..cee10edac --- /dev/null +++ b/MyApp/_includes/ai-server/cs/image-with-mask-1.cs.md @@ -0,0 +1,15 @@ +```csharp +var request = new ImageWithMask() +{ + PositivePrompt = "A beautiful sunset over the ocean", + NegativePrompt = "A pixelated, low-quality image", + Sync = true +}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("image", File.OpenRead("sunset.jpg"), "sunset.jpg"), + new UploadFile("mask", File.OpenRead("mask.jpg"), "mask.jpg")] +); +response.Outputs[0].Url.DownloadFileTo("ocean-sunset.webp"); +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/open-ai-requests-1.cs.md b/MyApp/_includes/ai-server/cs/open-ai-requests-1.cs.md index 955e6458d..bd614ed12 100644 --- a/MyApp/_includes/ai-server/cs/open-ai-requests-1.cs.md +++ b/MyApp/_includes/ai-server/cs/open-ai-requests-1.cs.md @@ -1,4 +1,7 @@ ```csharp +var client = new JsonApiClient("https://api.openai.com/v1"); +client.AddHeader("Authorization", "Bearer " + Environment.GetEnvironmentVariable("OPENAI_API_KEY")); + // Using AI Server DTOs with OpenAI API var request = new OpenAiChat { Model = "gpt-4-turbo", @@ -9,7 +12,8 @@ var request = new OpenAiChat { MaxTokens = 50 }; -var json = JsonSerializer.SerializeToString(request); -var response = await client.PostAsync("https://api.openai.com/v1/chat/completions", - new StringContent(json, Encoding.UTF8, "application/json")); +var response = await client.PostAsync( + "/chat/completions", + request +); ``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/speech-to-text-1.cs.md b/MyApp/_includes/ai-server/cs/speech-to-text-1.cs.md new file mode 100644 index 000000000..efd83b4f4 --- /dev/null +++ b/MyApp/_includes/ai-server/cs/speech-to-text-1.cs.md @@ -0,0 +1,14 @@ +```csharp +var request = new SpeechToText{}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("audio", File.OpenRead("audio.wav"), "audio.wav")] +); + +// Two texts are returned +// The first is the timestamped text json with `start` and `end` timestamps +var textWithTimestamps = response.TextOutputs[0].Text; +// The second is the plain text +var textOnly = response.TextOutputs[1].Text; +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/text-to-image-1.cs.md b/MyApp/_includes/ai-server/cs/text-to-image-1.cs.md new file mode 100644 index 000000000..e6daa7227 --- /dev/null +++ b/MyApp/_includes/ai-server/cs/text-to-image-1.cs.md @@ -0,0 +1,14 @@ +```csharp +var request = new TextToImage() +{ + Height = 768, + Width = 768, + Model = "flux-schnell", + PositivePrompt = "A happy llama", + NegativePrompt = "bad quality, blurry image", + Sync = true +}; + +var response = await client.PostAsync(request); +response.Outputs[0].Url.DownloadFileTo("llama.jpg"); +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/video-convert-1.cs.md b/MyApp/_includes/ai-server/cs/video-convert-1.cs.md new file mode 100644 index 000000000..34ecf511b --- /dev/null +++ b/MyApp/_includes/ai-server/cs/video-convert-1.cs.md @@ -0,0 +1,15 @@ +```csharp +var request = new ConvertVideo() +{ + OutputFormat = ConvertVideoOutputFormat.WebM, + Sync = true +}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("video", File.OpenRead("video.mp4"), "video.mp4")] +); + +var videoUrl = response.Outputs[0].Url; +videoUrl.DownloadFileTo("converted-video.webm"); +``` \ No newline at end of file diff --git a/MyApp/_includes/ai-server/cs/video-crop-1.cs.md b/MyApp/_includes/ai-server/cs/video-crop-1.cs.md new file mode 100644 index 000000000..cfa8f2e0c --- /dev/null +++ b/MyApp/_includes/ai-server/cs/video-crop-1.cs.md @@ -0,0 +1,18 @@ +```csharp +var request = new CropVideo() +{ + X = 120, + Y = 120, + Width = 720, + Height = 720, + Sync = true +}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("video", File.OpenRead("video.mp4"), "video.mp4")] +); + +var videoUrl = response.Outputs[0].Url; +videoUrl.DownloadFileTo("cropped-video.mp4"); +``` \ No newline at end of file diff --git a/MyApp/_pages/ai-server/usage/video.md b/MyApp/_pages/ai-server/usage/video.md new file mode 100644 index 000000000..b75a97f67 --- /dev/null +++ b/MyApp/_pages/ai-server/usage/video.md @@ -0,0 +1,57 @@ +--- +title: "Video Endpoints" +description: "Processing videos with AI Server" +--- + +# Processing Videos with AI Server + +Also incorporated into the ComfyUI Agent is FFmpeg, which can be used to process videos. AI Server wraps some common operations into easier-to-use endpoints, such as: + +- **Crop Video**: Crop a video to a specific size. +- **Convert Video**: Convert a video to a different format. +- **Scale Video**: Scale a video to a different resolution. +- **Watermark Video**: Add a watermark to a video. + +## Using Video Endpoints + +These endpoints are used in a similar way to the other AI Server endpoints, eg you can provide a RefId, Tag, ReplyTo, and Sync properties to enhance the usage of AI Server. + +### Crop Video + +```csharp +var request = new CropVideo() +{ + X = 120, + Y = 120, + Width = 720, + Height = 720, + Sync = true +}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("video", File.OpenRead("video.mp4"), "video.mp4")] +); + +var videoUrl = response.Outputs[0].Url; +videoUrl.DownloadFileTo("cropped-video.mp4"); +``` + +### Convert Video + +```csharp +var request = new ConvertVideo() +{ + OutputFormat = ConvertVideoOutputFormat.WebM, + Sync = true +}; + +var response = client.PostFilesWithRequest( + request, + [new UploadFile("video", File.OpenRead("video.mp4"), "video.mp4")] +); + +var videoUrl = response.Outputs[0].Url; +videoUrl.DownloadFileTo("converted-video.webm"); +``` +