Skip to content
Open
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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -403,3 +403,7 @@ FodyWeavers.xsd

# JetBrains Rider
*.sln.iml
# Local environment files
.env
.env.local
appsettings.local.json
202 changes: 105 additions & 97 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
@@ -1,99 +1,107 @@
<Project>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>false</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<PropertyGroup>
<ElsaVersion>3.5.2</ElsaVersion>
<ElsaStudioVersion>3.5.2</ElsaStudioVersion>
<MicrosoftVersion>9.0.9</MicrosoftVersion>
</PropertyGroup>
<ItemGroup Label="Elsa">
<PackageVersion Include="Elsa" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Alterations" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Api.Common" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Common" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.EntityFrameworkCore" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.EntityFrameworkCore.Common" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.EntityFrameworkCore.MySql" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.EntityFrameworkCore.Sqlite" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.EntityFrameworkCore.SqlServer" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.EntityFrameworkCore.PostgreSql" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Features" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.JavaScript" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Liquid" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Workflows.Core" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Workflows.Api" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Http" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Identity" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.MassTransit" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.MassTransit.RabbitMq" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Webhooks" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Workflows.Management" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Workflows.Runtime" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Workflows.Runtime.ProtoActor" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Tenants" Version="$(ElsaVersion)"/>
<PackageVersion Include="Elsa.Testing.Shared.Component" Version="$(ElsaVersion)"/>
</ItemGroup>
<ItemGroup Label="Elsa Studio">
<PackageVersion Include="Elsa.Studio.Shared" Version="$(ElsaStudioVersion)"/>
<PackageVersion Include="Elsa.Studio.Workflows.Core" Version="$(ElsaStudioVersion)"/>
<PackageVersion Include="Elsa.Studio.Workflows" Version="$(ElsaStudioVersion)"/>
</ItemGroup>
<ItemGroup>
<PackageVersion Include="Azure.Identity" Version="1.14.0"/>
<PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.20.1"/>
<PackageVersion Include="Azure.ResourceManager" Version="1.13.1"/>
<PackageVersion Include="Azure.ResourceManager.AppContainers" Version="1.4.0"/>
<PackageVersion Include="Azure.ResourceManager.Resources" Version="1.10.0"/>
<PackageVersion Include="Azure.ResourceManager.ServiceBus" Version="1.1.0"/>
<PackageVersion Include="Azure.Storage.Blobs" Version="12.24.1"/>
<PackageVersion Include="BenchmarkDotNet" Version="0.15.2"/>
<PackageVersion Include="Bogus" Version="35.6.3"/>
<PackageVersion Include="ConfigureAwait.Fody" Version="3.3.2"/>
<PackageVersion Include="coverlet.collector" Version="6.0.4"/>
<PackageVersion Include="FastEndpoints" Version="6.2.0"/>
<PackageVersion Include="FastEndpoints.Security" Version="6.2.0"/>
<PackageVersion Include="FastEndpoints.Swagger" Version="6.2.0"/>
<PackageVersion Include="Fody" Version="6.9.2"/>
<PackageVersion Include="GitHubActionsTestLogger" Version="2.4.1"/>
<PackageVersion Include="Humanizer.Core" Version="2.14.1"/>
<PackageVersion Include="JetBrains.Annotations" Version="2024.3.0"/>
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.14.0"/>
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6"/>
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1"/>
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0"/>
<PackageVersion Include="NSubstitute" Version="5.3.0"/>
<PackageVersion Include="Refit" Version="8.0.0"/>
<PackageVersion Include="Refit.HttpClientFactory" Version="8.0.0"/>
<PackageVersion Include="SlackNet" Version="0.16.1"/>
<PackageVersion Include="Testcontainers" Version="4.6.0"/>
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.6.0"/>
<PackageVersion Include="Testcontainers.RabbitMq" Version="4.6.0"/>
<PackageVersion Include="WebhooksCore" Version="0.0.1"/>
<PackageVersion Include="xunit" Version="2.9.3"/>
<PackageVersion Include="xunit.abstractions" Version="2.0.3"/>
<PackageVersion Include="xunit.categories" Version="3.0.1"/>
<PackageVersion Include="xunit.extensibility.core" Version="2.9.3"/>
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.1"/>
<PackageVersion Include="System.Linq.Async" Version="6.0.3"/>
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Data.Sqlite" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.Extensions.AI" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.57.0"/>
<PackageVersion Include="Microsoft.SemanticKernel.Core" Version="1.57.0"/>
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4"/>
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0-preview.3.efcore.9.0.0"/>
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="$(MicrosoftVersion)"/>
<PackageVersion Include="System.Text.Json" Version="$(MicrosoftVersion)"/>
</ItemGroup>
<PropertyGroup>
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
<CentralPackageTransitivePinningEnabled>false</CentralPackageTransitivePinningEnabled>
</PropertyGroup>
<PropertyGroup>
<ElsaVersion>3.5.2</ElsaVersion>
<ElsaStudioVersion>3.5.2</ElsaStudioVersion>
<MicrosoftVersion>9.0.9</MicrosoftVersion>
</PropertyGroup>
<ItemGroup Label="Elsa">
<PackageVersion Include="coverlet.msbuild" Version="6.0.4">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageVersion>
Comment on lines +12 to +15
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

[nitpick] The coverlet.msbuild package is placed in the "Elsa" ItemGroup label, but it's a testing/code coverage tool rather than an Elsa package. Consider moving it to the main ItemGroup section with other testing packages for better organization.

Copilot uses AI. Check for mistakes.
<PackageVersion Include="Elsa" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Alterations" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Api.Common" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Common" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.EntityFrameworkCore" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.EntityFrameworkCore.Common" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.EntityFrameworkCore.MySql" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.EntityFrameworkCore.Sqlite" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.EntityFrameworkCore.SqlServer" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.EntityFrameworkCore.PostgreSql" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Features" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.JavaScript" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Liquid" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Workflows.Core" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Workflows.Api" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Http" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Identity" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.MassTransit" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.MassTransit.RabbitMq" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Webhooks" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Workflows.Management" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Workflows.Runtime" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Workflows.Runtime.ProtoActor" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Tenants" Version="$(ElsaVersion)" />
<PackageVersion Include="Elsa.Testing.Shared.Component" Version="$(ElsaVersion)" />
</ItemGroup>
<ItemGroup Label="Elsa Studio">
<PackageVersion Include="Elsa.Studio.Shared" Version="$(ElsaStudioVersion)" />
<PackageVersion Include="Elsa.Studio.Workflows.Core" Version="$(ElsaStudioVersion)" />
<PackageVersion Include="Elsa.Studio.Workflows" Version="$(ElsaStudioVersion)" />
</ItemGroup>
<ItemGroup>
<PackageVersion Include="Azure.Identity" Version="1.14.0" />
<PackageVersion Include="Azure.Messaging.ServiceBus" Version="7.20.1" />
<PackageVersion Include="Azure.ResourceManager" Version="1.13.1" />
<PackageVersion Include="Azure.ResourceManager.AppContainers" Version="1.4.0" />
<PackageVersion Include="Azure.ResourceManager.Resources" Version="1.10.0" />
<PackageVersion Include="Azure.ResourceManager.ServiceBus" Version="1.1.0" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.24.1" />
<PackageVersion Include="BenchmarkDotNet" Version="0.15.2" />
<PackageVersion Include="Bogus" Version="35.6.3" />
<PackageVersion Include="ConfigureAwait.Fody" Version="3.3.2" />
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="FastEndpoints" Version="6.2.0" />
<PackageVersion Include="FastEndpoints.Security" Version="6.2.0" />
<PackageVersion Include="FastEndpoints.Swagger" Version="6.2.0" />
<PackageVersion Include="Fody" Version="6.9.2" />
<PackageVersion Include="GitHubActionsTestLogger" Version="2.4.1" />
<PackageVersion Include="Humanizer.Core" Version="2.14.1" />
<PackageVersion Include="JetBrains.Annotations" Version="2024.3.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Scripting" Version="4.14.0" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite.Design" Version="1.1.6" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageVersion Include="Microsoft.SourceLink.GitHub" Version="8.0.0" />
<PackageVersion Include="Moq" Version="4.20.72" />
<PackageVersion Include="NSubstitute" Version="5.3.0" />
<PackageVersion Include="Refit" Version="8.0.0" />
<PackageVersion Include="Refit.HttpClientFactory" Version="8.0.0" />
<PackageVersion Include="SlackNet" Version="0.16.1" />
<PackageVersion Include="Testcontainers" Version="4.6.0" />
<PackageVersion Include="Testcontainers.PostgreSql" Version="4.6.0" />
<PackageVersion Include="Testcontainers.RabbitMq" Version="4.6.0" />
<PackageVersion Include="WebhooksCore" Version="0.0.1" />
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.abstractions" Version="2.0.3" />
<PackageVersion Include="xunit.categories" Version="3.0.1" />
<PackageVersion Include="xunit.extensibility.core" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.1" />
<PackageVersion Include="System.Linq.Async" Version="6.0.3" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.AI" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.SemanticKernel" Version="1.57.0" />
<PackageVersion Include="Microsoft.SemanticKernel.Core" Version="1.57.0" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageVersion Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0-preview.3.efcore.9.0.0" />
<PackageVersion Include="System.Diagnostics.DiagnosticSource" Version="$(MicrosoftVersion)" />
<PackageVersion Include="System.Text.Json" Version="$(MicrosoftVersion)" />
<PackageVersion Include="OpenAI" Version="2.7.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration" Version="$(MicrosoftVersion)" />
<PackageVersion Include="Microsoft.Extensions.Configuration.UserSecrets" Version="$(MicrosoftVersion)" />
</ItemGroup>
</Project>
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ Below is the current status of each integration. Checkboxes indicate implementat
### 🤖 AI & Automation
| Status | Integration | Description | Module Name | Issue |
|--------|------------|-------------|-------------|-------|
| [ ] | **OpenAI** | GPT-based text generation, chatbots | `Elsa.OpenAI` | |
| [x] | **OpenAI** | GPT-based text generation, chatbots | `Elsa.OpenAI` | |
| [ ] | **Google AI** | AI-enhanced search, translation | `Elsa.GoogleAI` | |
| [ ] | **AWS Comprehend** | NLP services for text analysis | `Elsa.AWSComprehend` | |
| [ ] | **Azure AI** | Vision, speech, language processing | `Elsa.AzureAI` | |
Expand Down
93 changes: 93 additions & 0 deletions src/Elsa.OpenAI/Activities/Chat/CompleteChat.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
using Elsa.Workflows;
using Elsa.Workflows.Attributes;
using Elsa.Workflows.Models;
using JetBrains.Annotations;
using OpenAI.Chat;

namespace Elsa.OpenAI.Activities.Chat;

/// <summary>
/// Completes a chat conversation using OpenAI's Chat API.
/// </summary>
[Activity(
"Elsa.OpenAI.Chat",
"OpenAI Chat",
"Completes a chat conversation using OpenAI's Chat API.",
DisplayName = "Complete Chat")]
[UsedImplicitly]
public class CompleteChat : OpenAIActivity
{
/// <summary>
/// The user message or prompt to complete.
/// </summary>
[Input(Description = "The user message or prompt to complete.")]
public Input<string> Prompt { get; set; } = null!;

/// <summary>
/// Optional system message to provide context or instructions.
/// </summary>
[Input(Description = "Optional system message to provide context or instructions.")]
public Input<string?> SystemMessage { get; set; } = null!;

/// <summary>
/// The maximum number of tokens to generate.
/// </summary>
[Input(Description = "The maximum number of tokens to generate.")]
public Input<int?> MaxTokens { get; set; } = null!;

/// <summary>
/// Controls randomness: 0.0 is deterministic, 1.0 is maximum randomness.
/// </summary>
[Input(Description = "Controls randomness: 0.0 is deterministic, 1.0 is maximum randomness.")]
public Input<float?> Temperature { get; set; } = null!;

/// <summary>
/// The completion result from the chat model.
/// </summary>
[Output(Description = "The completion result from the chat model.")]
public Output<string> Result { get; set; } = null!;

/// <summary>
/// The total tokens used in the request.
/// </summary>
[Output(Description = "The total tokens used in the request.")]
public Output<int?> TotalTokens { get; set; } = null!;

/// <summary>
/// The finish reason for the completion.
/// </summary>
[Output(Description = "The finish reason for the completion.")]
public Output<string?> FinishReason { get; set; } = null!;

/// <summary>
/// Executes the activity.
/// </summary>
protected override async ValueTask ExecuteAsync(ActivityExecutionContext context)
{
string prompt = context.Get(Prompt)!;
string? systemMessage = context.Get(SystemMessage);
int? maxTokens = context.Get(MaxTokens);
float? temperature = context.Get(Temperature);
Comment on lines +69 to +70
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

The maxTokens and temperature variables are retrieved but never used in the API call. Either these should be passed to the CompleteChatAsync method using ChatCompletionOptions, or they should be removed from this implementation.

Copilot uses AI. Check for mistakes.

ChatClient client = GetChatClient(context);

try
{
// Build a simple prompt string for now
string fullPrompt = systemMessage != null ? $"{systemMessage}\n\n{prompt}" : prompt;
Comment on lines +76 to +77
Copy link

Copilot AI Dec 9, 2025

Choose a reason for hiding this comment

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

The current implementation concatenates the system message and prompt into a single string, which is not the correct way to use the OpenAI Chat API. The API expects separate system and user messages. This should use a proper message collection with distinct message roles instead of string concatenation.

Copilot uses AI. Check for mistakes.

ChatCompletion completion = await client.CompleteChatAsync(fullPrompt);

context.Set(Result, completion.Content?[0]?.Text ?? string.Empty);
context.Set(TotalTokens, completion.Usage?.TotalTokenCount);
context.Set(FinishReason, completion.FinishReason.ToString());
}
catch (Exception ex)
{
context.Set(Result, $"Error: {ex.Message}");
context.Set(TotalTokens, null);
context.Set(FinishReason, "error");
throw;
}
}
}
Loading