using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Elsa;
using Elsa.Expressions.Models;
using Elsa.Extensions;
using Elsa.Workflows.Core;
using Elsa.Workflows.Core.Contracts;
using Elsa.Workflows.Core.Models;
using Elsa.Workflows.Management.Extensions;
using Elsa.Workflows.Core.Attributes;
using Elsa.Workflows.Core.Models;
using Elsa.Expressions.Models;
using Elsa.Extensions;
using Elsa.Http;
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.Connectors.Memory.Qdrant;
using Microsoft.SemanticKernel.Connectors.AI.OpenAI.TextEmbedding;
using Microsoft.SemanticKernel.Memory;
using Microsoft.SemanticKernel.Orchestration;
using Microsoft.SemanticKernel.Reliability;
using Microsoft.SKDevTeam;
namespace Elsa.SemanticKernel;
//
// Loads the Semantic Kernel skills and then generates activites for each skill
//
public class SemanticKernelActivityProvider : IActivityProvider
{
private readonly IActivityFactory _activityFactory;
private readonly IActivityDescriber _activityDescriber;
public SemanticKernelActivityProvider(IActivityFactory activityFactory, IActivityDescriber activityDescriber)
{
_activityFactory = activityFactory;
_activityDescriber = activityDescriber;
}
public async ValueTask> GetDescriptorsAsync(CancellationToken cancellationToken = default)
{
//get a list of skills in the assembly
var skills = await LoadSkillsFromAssemblyAsync("skills");
var descriptors = new List();
foreach (var skill in skills)
{
//var descriptor = await CreateActivityDescriptors(skill, cancellationToken);
// descriptors.Add(descriptor);
}
return descriptors;
}
///
/// Gets a list of the skills in the assembly
///
private async Task> LoadSkillsFromAssemblyAsync(string assemblyName)
{
var skills = new List();
var assembly = Assembly.Load(assemblyName);
//IEnumerable skillTypes = GetTypesInNamespace(assembly, "skills");
Type[] skillTypes = assembly.GetTypes().ToArray();
foreach(Type skillType in skillTypes)
{
Console.WriteLine($"Found type: {assembly.FullName}.{skillType.Namespace}.{skillType.Name}");
if(skillType.Namespace.Equals("Microsoft.SKDevTeam"))
{
skills.Add(skillType.Name);
Console.WriteLine($"Added skill: {skillType.Name}");
}
}
return skills;
}
private IEnumerable GetTypesInNamespace(Assembly assembly, string nameSpace)
{
return
assembly.GetTypes()
.Where(t => String.Equals(t.Namespace, nameSpace, StringComparison.Ordinal));
}
}