streaming rewrite WIP

This commit is contained in:
Kosta Petan
2024-02-20 21:29:13 +01:00
parent 5cb2e3d51b
commit 0a67732e56
6 changed files with 44 additions and 30 deletions

View File

@@ -64,13 +64,6 @@ public sealed class GithubWebHookProcessor : WebhookEventProcessor
// org+repo+3
// PM
// Connect the parent issue with child via label
// Parent:3
// Parent:4
var suffix = $"{org}-{repo}";
if (issuesEvent.Action == IssuesAction.Opened)
{

View File

@@ -48,6 +48,7 @@ public class DeveloperLead : SemanticPersona
});
_state.State.ParentIssueNumber = parentNumber;
_state.State.CommentId = devLeadIssue.CommentId;
await _state.WriteStateAsync();
}
public async Task<string> CreatePlan(string ask)
@@ -86,21 +87,34 @@ public class DeveloperLead : SemanticPersona
}
}
public async Task ClosePlan()
public async Task ClosePlan(string org, string repo, long issueNumber, long parentNumber)
{
// var devLead = _grains.GetGrain<ILeadDevelopment>(issueNumber, suffix);
// var lookup = _grains.GetGrain<ILookupMetadata>(suffix);
// var parentIssue = await lookup.GetMetadata((int)issueNumber);
// var conductor = _grains.GetGrain<IOrchestrateWorkflows>(parentIssue.IssueNumber, suffix);
// var plan = await devLead.GetLatestPlan();
// await conductor.ImplementationFlow(plan, org, repo, parentIssue.IssueNumber);
var plan = await GetLatestPlan();
var suffix = $"{org}-{repo}";
var streamProvider = this.GetStreamProvider("StreamProvider");
var streamId = StreamId.Create("developers", suffix+parentNumber.ToString());
var stream = streamProvider.GetStream<Event>(streamId);
// await _ghService.MarkTaskComplete(new MarkTaskCompleteRequest
// {
// Org = org,
// Repo = repo,
// CommentId = parentIssue.CommentId
// });
var eventTasks = plan.steps.SelectMany(s => s.subtasks.Select(st => stream.OnNextAsync(new Event {
Type = EventType.NewAsk,
Data = new Dictionary<string, string>
{
{ "org", org },
{ "repo", repo },
{ "parentNumber", parentNumber.ToString()}
},
Message = st.prompt
})));
Task.WaitAll(eventTasks.ToArray());
//await conductor.ImplementationFlow(plan, org, repo, parentIssue.IssueNumber);
await _ghService.MarkTaskComplete(new MarkTaskCompleteRequest
{
Org = org,
Repo = repo,
CommentId = _state.State.CommentId
});
}
public Task<DevLeadPlanResponse> GetLatestPlan()
@@ -118,10 +132,11 @@ public class DeveloperLead : SemanticPersona
await CreateIssue(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]) , item.Message);
break;
case EventType.NewAskPlan:
await CreatePlan(item.Message);
var plan = await CreatePlan(item.Message);
await _ghService.PostComment(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]), plan);
break;
case EventType.ChainClosed:
await ClosePlan();
await ClosePlan(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]), long.Parse(item.Data["parentNumber"]));
break;
default:
break;

View File

@@ -9,6 +9,8 @@ using Orleans.Streams;
namespace Microsoft.AI.DevTeam;
//[RegexImplicitStreamSubscription("")]
[ImplicitStreamSubscription("developers")]
public class Dev : SemanticPersona
{
private readonly IKernel _kernel;
@@ -28,7 +30,7 @@ public class Dev : SemanticPersona
public async Task CreateIssue(string org, string repo, long parentNumber, string input)
{
var devLeadIssue = await _ghService.CreateIssue(new CreateIssueRequest
var devIssue = await _ghService.CreateIssue(new CreateIssueRequest
{
Label = $"{nameof(Developer)}.{nameof(Developer.Implement)}",
Org = org,
@@ -38,6 +40,7 @@ public class Dev : SemanticPersona
});
_state.State.ParentIssueNumber = parentNumber;
_state.State.CommentId = devIssue.CommentId;
await _state.WriteStateAsync();
}
public async Task<string> GenerateCode(string ask)
@@ -80,10 +83,11 @@ public class Dev : SemanticPersona
switch (item.Type)
{
case EventType.NewAsk:
await CreateIssue(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]) , item.Message);
await CreateIssue(item.Data["org"], item.Data["repo"], long.Parse(item.Data["parentNumber"]) , item.Message);
break;
case EventType.NewAskImplement:
await GenerateCode(item.Message);
var code = await GenerateCode(item.Message);
await _ghService.PostComment(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]), code);
break;
case EventType.ChainClosed:
await CloseImplementation();

View File

@@ -45,7 +45,8 @@ public class ProductManager : SemanticPersona
await CreateIssue(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]) , item.Message);
break;
case EventType.NewAskReadme:
await CreateReadme(item.Message);
var readme = await CreateReadme(item.Message);
await _ghService.PostComment(item.Data["org"], item.Data["repo"], long.Parse(item.Data["issueNumber"]), readme);
break;
case EventType.ChainClosed:
await CloseReadme();
@@ -68,6 +69,7 @@ public class ProductManager : SemanticPersona
});
_state.State.ParentIssueNumber = parentNumber;
_state.State.CommentId = pmIssue.CommentId;
await _state.WriteStateAsync();
}

View File

@@ -79,6 +79,7 @@ public class SemanticPersonaState
public List<ChatHistoryItem> History { get; set; }
public string Understanding { get; set; }
public long ParentIssueNumber { get; set; }
public int CommentId { get; set; }
}
public enum ChatUserType

View File

@@ -158,17 +158,16 @@ public class GithubService : IManageGithub
}
public async Task PostComment(PostCommentRequest request)
public async Task PostComment(string org, string repo, long issueNumber, string comment)
{
try
{
await _ghClient.Issue.Comment.Create(request.Org, request.Repo, request.Number, request.Content);
await _ghClient.Issue.Comment.Create(org, repo, (int)issueNumber, comment);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error posting comment");
}
}
public async Task<IEnumerable<FileResponse>> GetFiles(string org, string repo, string branch, Func<RepositoryContent, bool> filter)
@@ -232,7 +231,7 @@ public interface IManageGithub
Task CreateBranch(CreateBranchRequest request);
Task CommitToBranch(CommitRequest request);
Task PostComment(PostCommentRequest request);
Task PostComment(string org, string repo, long issueNumber, string comment);
Task<IEnumerable<FileResponse>> GetFiles(string org, string repo, string branch, Func<RepositoryContent, bool> filter);
Task<string> GetMainLanguage(string org, string repo);
}