2023-10-26 22:09:18 +02:00
|
|
|
using Microsoft.AI.DevTeam.Skills;
|
2023-11-09 16:03:38 +00:00
|
|
|
using Microsoft.Extensions.Logging;
|
2023-10-11 21:40:35 +02:00
|
|
|
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;
|
2023-10-11 21:40:35 +02:00
|
|
|
using Microsoft.SemanticKernel.Orchestration;
|
|
|
|
using Orleans.Runtime;
|
2024-01-12 20:06:35 +00:00
|
|
|
using Orleans.Streams;
|
2023-10-11 21:40:35 +02:00
|
|
|
|
2023-10-26 22:09:18 +02:00
|
|
|
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
|
2023-10-11 21:40:35 +02:00
|
|
|
{
|
|
|
|
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;
|
|
|
|
|
2023-10-11 21:40:35 +02:00
|
|
|
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)
|
2023-10-11 21:40:35 +02:00
|
|
|
{
|
|
|
|
_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;
|
|
|
|
}
|
|
|
|
}
|
2023-10-11 21:40:35 +02:00
|
|
|
public async Task<string> CreateReadme(string ask)
|
|
|
|
{
|
2023-11-09 16:03:38 +00:00
|
|
|
try
|
2023-10-11 21:40:35 +02:00
|
|
|
{
|
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-10-11 21:40:35 +02:00
|
|
|
|
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-10-11 21:40:35 +02:00
|
|
|
{
|
2023-11-09 16:03:38 +00:00
|
|
|
_logger.LogError(ex, "Error creating readme");
|
|
|
|
return default;
|
|
|
|
}
|
2023-10-11 21:40:35 +02:00
|
|
|
}
|
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
|
|
|
}
|
2023-10-11 21:40:35 +02:00
|
|
|
}
|