125 lines
4.4 KiB
C#
Raw Normal View History

using Microsoft.AI.DevTeam.Skills;
2023-11-09 16:03:38 +00:00
using Microsoft.Extensions.Logging;
using Microsoft.SemanticKernel;
2023-11-09 11:23:58 +00:00
using Microsoft.SemanticKernel.Connectors.AI.OpenAI;
2023-11-10 15:30:24 +00:00
using Microsoft.SemanticKernel.Memory;
using Microsoft.SemanticKernel.Orchestration;
using Orleans.Runtime;
2024-01-12 20:06:35 +00:00
using Orleans.Streams;
namespace Microsoft.AI.DevTeam;
2024-02-18 20:21:44 +00:00
[ImplicitStreamSubscription("DevPersonas")]
2024-02-22 16:30:56 +01:00
public class ProductManager : Agent
{
private readonly IKernel _kernel;
2023-11-10 15:30:24 +00:00
private readonly ISemanticTextMemory _memory;
2023-11-09 16:03:38 +00:00
private readonly ILogger<ProductManager> _logger;
2024-02-01 21:03:33 +00:00
private readonly IManageGithub _ghService;
protected override string MemorySegment => "pm-memory";
2024-02-01 21:03:33 +00:00
public ProductManager([PersistentState("state", "messages")] IPersistentState<SemanticPersonaState> state, IKernel kernel, ISemanticTextMemory memory, ILogger<ProductManager> logger, IManageGithub ghService) : base(state)
{
_kernel = kernel;
2023-11-10 15:30:24 +00:00
_memory = memory;
2023-11-09 16:03:38 +00:00
_logger = logger;
2024-02-01 21:03:33 +00:00
_ghService = ghService;
}
2024-02-18 20:21:44 +00:00
public async override Task OnActivateAsync(CancellationToken cancellationToken)
{
var streamProvider = this.GetStreamProvider("StreamProvider");
2024-02-19 14:48:17 +00:00
var streamId = StreamId.Create("DevPersonas", this.GetPrimaryKeyString());
2024-02-18 20:21:44 +00:00
var stream = streamProvider.GetStream<Event>(streamId);
await stream.SubscribeAsync(HandleEvent);
}
2024-02-01 21:03:33 +00:00
public async override Task HandleEvent(Event item, StreamSequenceToken? token)
{
switch (item.Type)
{
2024-02-22 13:09:48 +01:00
case EventType.ReadmeRequested:
2024-02-20 21:29:13 +01:00
var readme = await CreateReadme(item.Message);
await _ghService.PostComment(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]), readme);
2024-02-22 13:09:48 +01:00
// postEvent ReadmeGenerated
2024-02-18 20:21:44 +00:00
break;
case EventType.ChainClosed:
await CloseReadme();
2024-02-22 13:09:48 +01:00
// postEvent ReadmeFinished
2024-02-18 20:21:44 +00:00
break;
2024-02-01 21:03:33 +00:00
default:
break;
}
}
public async Task<string> CreateReadme(string ask)
{
2023-11-09 16:03:38 +00:00
try
{
2023-11-09 16:03:38 +00:00
var function = _kernel.CreateSemanticFunction(PM.Readme, new OpenAIRequestSettings { MaxTokens = 10000, Temperature = 0.6, TopP = 1 });
var context = new ContextVariables();
context.Set("input", ask);
if (_state.State.History == null) _state.State.History = new List<ChatHistoryItem>();
_state.State.History.Add(new ChatHistoryItem
{
Message = ask,
Order = _state.State.History.Count + 1,
UserType = ChatUserType.User
});
2023-11-10 15:30:24 +00:00
await AddWafContext(_memory, ask, context);
2023-11-09 16:03:38 +00:00
context.Set("input", ask);
2023-11-09 16:03:38 +00:00
var result = await _kernel.RunAsync(context, function);
var resultMessage = result.ToString();
_state.State.History.Add(new ChatHistoryItem
{
Message = resultMessage,
Order = _state.State.History.Count + 1,
UserType = ChatUserType.Agent
});
await _state.WriteStateAsync();
return resultMessage;
}
catch (Exception ex)
{
2023-11-09 16:03:38 +00:00
_logger.LogError(ex, "Error creating readme");
return default;
}
}
2024-01-12 20:06:35 +00:00
2024-02-01 21:03:33 +00:00
public async Task CloseReadme()
2024-01-12 20:06:35 +00:00
{
2024-02-01 21:03:33 +00:00
// var pm = _grains.GetGrain<IManageProduct>(issueNumber, suffix);
// var readme = await pm.GetLastMessage();
// var lookup = _grains.GetGrain<ILookupMetadata>(suffix);
// var parentIssue = await lookup.GetMetadata((int)issueNumber);
// await _azService.Store(new SaveOutputRequest
// {
// ParentIssueNumber = parentIssue.IssueNumber,
// IssueNumber = (int)issueNumber,
// Output = readme,
// Extension = "md",
// Directory = "output",
// FileName = "readme",
// Org = org,
// Repo = repo
// });
// await _ghService.CommitToBranch(new CommitRequest
// {
// Dir = "output",
// Org = org,
// Repo = repo,
// ParentNumber = parentIssue.IssueNumber,
// Number = (int)issueNumber,
// Branch = $"sk-{parentIssue.IssueNumber}"
// });
// await _ghService.MarkTaskComplete(new MarkTaskCompleteRequest
// {
// Org = org,
// Repo = repo,
// CommentId = parentIssue.CommentId
// });
2024-01-12 20:06:35 +00:00
}
}