Skip to content

Commit 3fe0bbf

Browse files
Fixes to parent number safe access (autogenhub#66)
1 parent 71ed485 commit 3fe0bbf

File tree

5 files changed

+56
-38
lines changed

5 files changed

+56
-38
lines changed

samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/AzureGenie.cs

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
using Microsoft.AI.Agents.Abstractions;
22
using Microsoft.AI.Agents.Orleans;
33
using Microsoft.AI.DevTeam.Events;
4-
using Newtonsoft.Json.Linq;
4+
using Microsoft.AI.DevTeam.Extensions;
5+
using System.Globalization;
56

67
namespace Microsoft.AI.DevTeam;
78

@@ -11,24 +12,29 @@ public class AzureGenie : Agent
1112
protected override string Namespace => Consts.MainNamespace;
1213
private readonly IManageAzure _azureService;
1314

14-
public AzureGenie( IManageAzure azureService)
15+
public AzureGenie(IManageAzure azureService)
1516
{
1617
_azureService = azureService;
1718
}
1819

1920
public override async Task HandleEvent(Event item)
2021
{
22+
if (item?.Type is null)
23+
{
24+
throw new ArgumentNullException(nameof(item));
25+
}
26+
27+
var data = item.Data ?? throw new ArgumentNullException(nameof(item));
28+
var parentNumber = data.TryParseLong("parentNumber");
29+
var issueNumber = data.TryParseLong("issueNumber");
30+
var org = data["org"].ToString();
31+
var repo = data["repo"].ToString();
32+
var subject = $"{org}/{repo}/{issueNumber}";
33+
2134
switch (item.Type)
2235
{
2336
case nameof(GithubFlowEventType.ReadmeCreated):
24-
{
25-
var data = item.Data;
26-
var parentNumber = long.Parse(data["parentNumber"].ToString());
27-
var issueNumber = long.Parse(data["issueNumber"].ToString());
28-
var org = data["org"].ToString();
29-
var repo = data["repo"].ToString();
30-
var subject = $"{org}/{repo}/{issueNumber}";
31-
await Store(org,repo, parentNumber, issueNumber, "readme", "md", "output", data["readme"].ToString());
37+
await Store(org, repo, parentNumber, issueNumber, "readme", "md", "output", data["readme"].ToString());
3238
await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event
3339
{
3440
Type = nameof(GithubFlowEventType.ReadmeStored),
@@ -40,32 +46,21 @@ public override async Task HandleEvent(Event item)
4046
{ "parentNumber", $"{parentNumber}" }
4147
}
4248
});
43-
}
44-
4549
break;
4650
case nameof(GithubFlowEventType.CodeCreated):
47-
{
48-
var data = item.Data;
49-
var parentNumber = long.Parse(data["parentNumber"].ToString());
50-
var issueNumber = long.Parse(data["issueNumber"].ToString());
51-
var org = data["org"].ToString();
52-
var repo = data["repo"].ToString();
53-
var subject = $"{org}/{repo}/{issueNumber}";
54-
await Store(org,repo, parentNumber, issueNumber, "run", "sh", "output", data["code"].ToString());
51+
await Store(org, repo, parentNumber, issueNumber, "run", "sh", "output", data["code"].ToString());
5552
await RunInSandbox(org, repo, parentNumber, issueNumber);
5653
await PublishEvent(Consts.MainNamespace, this.GetPrimaryKeyString(), new Event
5754
{
5855
Type = nameof(GithubFlowEventType.SandboxRunCreated),
5956
Subject = subject,
6057
Data = new Dictionary<string, string> {
61-
{ "org", org },
62-
{ "repo", repo },
63-
{ "issueNumber", $"{issueNumber}" },
64-
{ "parentNumber", $"{parentNumber}" }
65-
}
58+
{ "org", org },
59+
{ "repo", repo },
60+
{ "issueNumber", $"{issueNumber}" },
61+
{ "parentNumber", $"{parentNumber}" }
62+
}
6663
});
67-
}
68-
6964
break;
7065
default:
7166
break;

samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/DeveloperLead/DeveloperLead.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Microsoft.AI.DevTeam.Events;
44
using Microsoft.SemanticKernel;
55
using Microsoft.SemanticKernel.Memory;
6-
using Newtonsoft.Json.Linq;
76
using Orleans.Runtime;
87

98
namespace Microsoft.AI.DevTeam;
@@ -37,7 +36,7 @@ public async override Task HandleEvent(Event item)
3736
});
3837
}
3938

40-
break;
39+
break;
4140
case nameof(GithubFlowEventType.DevPlanChainClosed):
4241
{
4342
var context = item.ToGithubContext();

samples/gh-flow/src/Microsoft.AI.DevTeam/Agents/Hubber.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Text.Json;
1+
using System;
2+
using System.Text.Json;
23
using Microsoft.AI.Agents.Abstractions;
34
using Microsoft.AI.Agents.Orleans;
45
using Microsoft.AI.DevTeam.Events;
@@ -18,6 +19,9 @@ public Hubber(IManageGithub ghService)
1819

1920
public override async Task HandleEvent(Event item)
2021
{
22+
ArgumentNullException.ThrowIfNull(item);
23+
ArgumentNullException.ThrowIfNull(item.Data);
24+
2125
switch (item.Type)
2226
{
2327
case nameof(GithubFlowEventType.NewAsk):

samples/gh-flow/src/Microsoft.AI.DevTeam/Events/GithubFlowEventType.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using Microsoft.AI.Agents.Abstractions;
2+
using Microsoft.AI.DevTeam.Extensions;
3+
using System.Globalization;
24

35
namespace Microsoft.AI.DevTeam.Events
46
{
@@ -26,26 +28,28 @@ public static class EventExtensions
2628
{
2729
public static GithubContext ToGithubContext(this Event evt)
2830
{
31+
ArgumentNullException.ThrowIfNull(evt);
32+
2933
return new GithubContext
3034
{
3135
Org = evt.Data["org"],
3236
Repo = evt.Data["repo"],
33-
IssueNumber = long.Parse(evt.Data["issueNumber"]),
34-
ParentNumber = string.IsNullOrEmpty(evt.Data["parentNumber"]) ? default : long.Parse(evt.Data["parentNumber"])
37+
IssueNumber = evt.Data.TryParseLong("issueNumber"),
38+
ParentNumber = evt.Data.TryParseLong("parentNumber")
3539
};
3640
}
3741

3842
public static Dictionary<string, string> ToData(this GithubContext context)
3943
{
44+
ArgumentNullException.ThrowIfNull(context);
45+
4046
return new Dictionary<string, string> {
41-
{ "org", context.Org },
42-
{ "repo", context.Repo },
43-
{ "issueNumber", $"{context.IssueNumber}" },
44-
{ "parentNumber", context.ParentNumber.HasValue? default: context.ParentNumber.ToString() }
47+
{ "org", context.Org },
48+
{ "repo", context.Repo },
49+
{ "issueNumber", $"{context.IssueNumber}" },
50+
{ "parentNumber", context.ParentNumber.HasValue ? Convert.ToString(context.ParentNumber, CultureInfo.InvariantCulture) : string.Empty }
4551
};
4652
}
47-
48-
4953
}
5054

5155
public class GithubContext
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
namespace Microsoft.AI.DevTeam.Extensions
2+
{
3+
public static class ParseExtensions
4+
{
5+
public static long TryParseLong(this Dictionary<string, string> data, string key)
6+
{
7+
ArgumentNullException.ThrowIfNull(data);
8+
9+
if (data.TryGetValue(key, out string? value) && !string.IsNullOrEmpty(value) && long.TryParse(value, out var result))
10+
{
11+
return result;
12+
}
13+
return default;
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)