diff --git a/dotnet/BaseballService/Abstractions/Baseball.Abstractions.csproj b/dotnet/BaseballService/Abstractions/Baseball.Abstractions.csproj
new file mode 100644
index 0000000..61718a1
--- /dev/null
+++ b/dotnet/BaseballService/Abstractions/Baseball.Abstractions.csproj
@@ -0,0 +1,3 @@
+
+
+
diff --git a/dotnet/BaseballService/Abstractions/Types.cs b/dotnet/BaseballService/Abstractions/Types.cs
new file mode 100644
index 0000000..c1e3b86
--- /dev/null
+++ b/dotnet/BaseballService/Abstractions/Types.cs
@@ -0,0 +1,55 @@
+namespace Baseball.Abstractions;
+ public record MlbTeams(Team[] Teams);
+
+ public record Team(
+ int Id,
+ string Name,
+ string TeamCode,
+ string Abbreviation,
+ string TeamName
+ );
+ public record PlayByPlay(Play[] AllPlays);
+
+ public record Play(PlayResult Result);
+
+ public record PlayResult(
+ string Description
+ );
+public record ScheduleRequest(
+ int[] SportId,
+ DateTime StartDate,
+ DateTime EndDate,
+ int TeamId,
+ string TimeZone,
+ string[] GameType,
+ string Language,
+ int[] LeagueId,
+ string[] Hydrate,
+ string[] SortBy
+);
+
+public record Schedule(GameDate[] Dates);
+
+public record GameDate(Game[] Games);
+
+public record Game(
+ int GamePk,
+ Guid GameGuid,
+ DateTime GameDate,
+ Teams Teams
+);
+
+public record Teams(
+ GameTeam Away,
+ GameTeam Home
+);
+
+public record GameTeam(
+ TeamInformation Team
+);
+
+public record TeamInformation(
+ int Id,
+ string Name,
+ string TeamName
+);
diff --git a/dotnet/BaseballService/Api.Client/Baseball.Api.Client.csproj b/dotnet/BaseballService/Api.Client/Baseball.Api.Client.csproj
new file mode 100644
index 0000000..c1f8dd2
--- /dev/null
+++ b/dotnet/BaseballService/Api.Client/Baseball.Api.Client.csproj
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/dotnet/BaseballService/Api.Client/MlbService.cs b/dotnet/BaseballService/Api.Client/MlbService.cs
new file mode 100644
index 0000000..ea4b554
--- /dev/null
+++ b/dotnet/BaseballService/Api.Client/MlbService.cs
@@ -0,0 +1,64 @@
+// using Ardalis.GuardClauses;
+// using Core.Utilities.Models;
+// using System.Net.Http.Json;
+
+// namespace Core.Utilities.Services;
+
+// public class MlbService
+// {
+// private readonly HttpClient _httpClient;
+
+// public MlbService(HttpClient httpClient)
+// {
+// httpClient.BaseAddress = new("http://statsapi.mlb.com/api/v1/");
+// _httpClient = httpClient;
+// }
+// public Task GetTeamSchedule(int teamId, DateTime startDate, DateTime endDate)
+// {
+// string startDateFormatted = startDate.ToString("yyy-MM-dd");
+// string endDateFormatted = endDate.ToString("yyy-MM-dd");
+// var requestUri = $"schedule?"
+// +"sportId=1"+"&sportId=51"+"&sportId=21"
+// +$"&startDate={startDateFormatted}"
+// +$"&endDate={endDateFormatted}"
+// +$"&teamId={teamId}"
+// +"&timeZone=America/New_York"
+// +"&gameType=E"+"&&gameType=S"+"&&gameType=R"+"&&gameType=F"+"&&gameType=D"
+// +"&&gameType=L"+"&&gameType=W"+"&&gameType=A"+"&&gameType=C"
+// +"&language=en"
+// +"&leagueId=104"+"&&leagueId=103"+"&&leagueId=160"+"&&leagueId=590"
+// +"&hydrate=team,linescore(matchup,runners),xrefId,story,flags,statusFlags,broadcasts(all),venue(location),decisions,person,probablePitcher,stats,game(content(media(epg),summary),tickets),seriesStatus(useOverride=true)"
+// +"&sortBy=gameDate,gameStatus,gameType";
+// return GetHttpResponse(requestUri);
+// }
+
+// public Task GetTeams()
+// {
+// var requestUri = $"teams?sportId=1";
+// return GetHttpResponse(requestUri);
+// }
+
+// public async Task> GamePlayByPlay(int gameId, int maxPlayByPlay)
+// {
+// var requestUri = $"game/{gameId}/playByPlay";
+// var playByPlay = await GetHttpResponse(requestUri);
+
+// return playByPlay.AllPlays.Take(maxPlayByPlay).ToList();
+// }
+
+// private async Task GetHttpResponse(string requestUri)
+// {
+// var response = await _httpClient.GetAsync(requestUri);
+
+// if (!response.IsSuccessStatusCode)
+// {
+// string errorMessage = await response.Content.ReadAsStringAsync();
+// throw new HttpRequestException($"Request failed with status code: {response.StatusCode}, message: {errorMessage}");
+// }
+
+// var data = await response.Content.ReadFromJsonAsync();
+// Guard.Against.Null(data);
+
+// return data;
+// }
+// }
diff --git a/dotnet/BaseballService/Api/Baseball.Api.csproj b/dotnet/BaseballService/Api/Baseball.Api.csproj
new file mode 100644
index 0000000..6603ce7
--- /dev/null
+++ b/dotnet/BaseballService/Api/Baseball.Api.csproj
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/dotnet/BaseballService/Api/Program.cs b/dotnet/BaseballService/Api/Program.cs
new file mode 100644
index 0000000..dc82039
--- /dev/null
+++ b/dotnet/BaseballService/Api/Program.cs
@@ -0,0 +1,36 @@
+using Baseball.Abstractions;
+
+var builder = WebApplication.CreateBuilder(args);
+var app = builder.Build();
+
+Team[] teams = [
+ new(1, "Name", "Team Code", "Abbr", "Team Name"),
+ new(2, "Name", "Team Code", "Abbr", "Team Name")
+];
+
+app.MapGet("/game/{gameId}/playByPlay", (int gameId) => new MlbTeams(teams));
+app.MapGet("/teams", (int sportId) => new MlbTeams(teams));
+app.MapGet("/schedule", (ScheduleRequest request) => new Schedule([
+ new([
+ new(1,
+ Guid.NewGuid(),
+ DateTime.Now,
+ new(
+ new(
+ new(1,
+ "Name",
+ "Team Name"
+ )
+ ),
+ new(
+ new(2,
+ "Name",
+ "Team Name"
+ )
+ )
+ )
+ )
+ ])
+]));
+
+app.Run();
diff --git a/dotnet/DemoApp/DemoApp.sln b/dotnet/DemoApp/DemoApp.sln
deleted file mode 100644
index 3b942af..0000000
--- a/dotnet/DemoApp/DemoApp.sln
+++ /dev/null
@@ -1,72 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.11.35208.52
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{EF9AF3BD-53DD-4710-968F-0ADE9E0F4536}"
- ProjectSection(SolutionItems) = preProject
- README.md = README.md
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Utilities", "Core.Utilities\Core.Utilities.csproj", "{C075F808-10DE-4709-B6D3-89A009591421}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution1", "Solutions\Solution1\Solution1.csproj", "{FDF6974E-318A-4F78-B44A-66CA39E985EB}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution2", "Solutions\Solution2\Solution2.csproj", "{A6C17403-E61A-4563-9135-B4E29B7E6F98}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution3", "Solutions\Solution3\Solution3.csproj", "{6B8375E7-21A0-4DEC-A65F-255D92044967}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution4", "Solutions\Solution4\Solution4.csproj", "{E1CB1B8E-8027-4344-88E5-FFDDEDBE829C}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution5", "Solutions\Solution5\Solution5.csproj", "{F38F13E3-5E80-4BE6-8F3F-66C78F53BB13}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution6", "Solutions\Solution6\Solution6.csproj", "{FBDFC27C-0604-4F9C-BC31-335577B50998}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution7", "Solutions\Solution7\Solution7.csproj", "{D8879C82-ED2A-40C3-97FE-7AB736814DFF}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {C075F808-10DE-4709-B6D3-89A009591421}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C075F808-10DE-4709-B6D3-89A009591421}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C075F808-10DE-4709-B6D3-89A009591421}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C075F808-10DE-4709-B6D3-89A009591421}.Release|Any CPU.Build.0 = Release|Any CPU
- {FDF6974E-318A-4F78-B44A-66CA39E985EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FDF6974E-318A-4F78-B44A-66CA39E985EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FDF6974E-318A-4F78-B44A-66CA39E985EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FDF6974E-318A-4F78-B44A-66CA39E985EB}.Release|Any CPU.Build.0 = Release|Any CPU
- {A6C17403-E61A-4563-9135-B4E29B7E6F98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {A6C17403-E61A-4563-9135-B4E29B7E6F98}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {A6C17403-E61A-4563-9135-B4E29B7E6F98}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {A6C17403-E61A-4563-9135-B4E29B7E6F98}.Release|Any CPU.Build.0 = Release|Any CPU
- {6B8375E7-21A0-4DEC-A65F-255D92044967}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6B8375E7-21A0-4DEC-A65F-255D92044967}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6B8375E7-21A0-4DEC-A65F-255D92044967}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6B8375E7-21A0-4DEC-A65F-255D92044967}.Release|Any CPU.Build.0 = Release|Any CPU
- {E1CB1B8E-8027-4344-88E5-FFDDEDBE829C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E1CB1B8E-8027-4344-88E5-FFDDEDBE829C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E1CB1B8E-8027-4344-88E5-FFDDEDBE829C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E1CB1B8E-8027-4344-88E5-FFDDEDBE829C}.Release|Any CPU.Build.0 = Release|Any CPU
- {F38F13E3-5E80-4BE6-8F3F-66C78F53BB13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {F38F13E3-5E80-4BE6-8F3F-66C78F53BB13}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {F38F13E3-5E80-4BE6-8F3F-66C78F53BB13}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {F38F13E3-5E80-4BE6-8F3F-66C78F53BB13}.Release|Any CPU.Build.0 = Release|Any CPU
- {FBDFC27C-0604-4F9C-BC31-335577B50998}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FBDFC27C-0604-4F9C-BC31-335577B50998}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FBDFC27C-0604-4F9C-BC31-335577B50998}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FBDFC27C-0604-4F9C-BC31-335577B50998}.Release|Any CPU.Build.0 = Release|Any CPU
- {D8879C82-ED2A-40C3-97FE-7AB736814DFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {D8879C82-ED2A-40C3-97FE-7AB736814DFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {D8879C82-ED2A-40C3-97FE-7AB736814DFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {D8879C82-ED2A-40C3-97FE-7AB736814DFF}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {268DC1F2-7C96-48B0-BE0C-ECF185C68B76}
- EndGlobalSection
-EndGlobal
diff --git a/dotnet/Workshops/CustomConnector/CustomConnector.sln b/dotnet/Workshops/CustomConnector/CustomConnector.sln
deleted file mode 100644
index bc14701..0000000
--- a/dotnet/Workshops/CustomConnector/CustomConnector.sln
+++ /dev/null
@@ -1,28 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.0.31903.59
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomConnector", "src\CustomConnector.csproj", "{1ACF13EB-F29A-45AE-9E52-AF20826487D5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CustomConnector.tests", "tests\CustomConnector.tests.csproj", "{29F4DDEA-09DB-4A5C-9A78-6EEC2C99851B}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {1ACF13EB-F29A-45AE-9E52-AF20826487D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1ACF13EB-F29A-45AE-9E52-AF20826487D5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1ACF13EB-F29A-45AE-9E52-AF20826487D5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1ACF13EB-F29A-45AE-9E52-AF20826487D5}.Release|Any CPU.Build.0 = Release|Any CPU
- {29F4DDEA-09DB-4A5C-9A78-6EEC2C99851B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {29F4DDEA-09DB-4A5C-9A78-6EEC2C99851B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {29F4DDEA-09DB-4A5C-9A78-6EEC2C99851B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {29F4DDEA-09DB-4A5C-9A78-6EEC2C99851B}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
-EndGlobal
diff --git a/dotnet/Workshops/CustomConnector/sample/CustomConnector.Sample.csproj b/dotnet/Workshops/CustomConnector/sample/CustomConnector.Sample.csproj
new file mode 100644
index 0000000..8f16f16
--- /dev/null
+++ b/dotnet/Workshops/CustomConnector/sample/CustomConnector.Sample.csproj
@@ -0,0 +1,8 @@
+
+
+ Exe
+
+
+
+
+
diff --git a/dotnet/Workshops/CustomConnector/sample/Program.cs b/dotnet/Workshops/CustomConnector/sample/Program.cs
new file mode 100644
index 0000000..81675d7
--- /dev/null
+++ b/dotnet/Workshops/CustomConnector/sample/Program.cs
@@ -0,0 +1,130 @@
+using Core.Utilities.Config;
+using Core.Utilities.Services;
+using Core.Utilities.Agents;
+using Core.Utilities.Plugins;
+using Core.Utilities.Filters;
+using Microsoft.SemanticKernel;
+using Microsoft.SemanticKernel.Agents;
+using Microsoft.SemanticKernel.Connectors.OpenAI;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Solution7;
+
+// Create separate kernels for each agent.
+var ticketAgentKernel = KernelBuilderProvider.CreateKernelWithChatCompletion().Build();
+var validationAgentKernel = KernelBuilderProvider.CreateKernelWithChatCompletion().Build();
+
+// Load configuration.
+var builder = KernelBuilderProvider.CreateKernelWithChatCompletion();
+// Add the filters to the kernel.
+builder.Services
+ .AddSingleton()
+ .AddSingleton(_ => new("Bartman", "Billy Goat Tavern", "William Sianis", "Sox"))
+ .AddSingleton()
+ .AddSingleton(_ =>
+ {
+ // Add a logger to the Kernel's dependency injection provider, so the function filters can use it.
+ using var loggerFactory = LoggerFactory.Create(builder =>
+ builder
+ .AddFilter("FunctionInvocationLoggingFilter", LogLevel.Trace)
+ .AddConsole()
+ );
+ return loggerFactory.CreateLogger("FunctionInvocationLoggingFilter");
+ });
+var kernel = builder.Build();
+
+// build the mlb service and plugin
+HttpClient httpClient = new();
+MlbService mlbService = new(httpClient);
+MlbBaseballDataPlugin mlbBaseballPlugin = new(mlbService);
+
+//Register the plugin
+kernel.Plugins.AddFromObject(mlbBaseballPlugin);
+// The execution settings are moved from the chat service, to the agent.
+OpenAIPromptExecutionSettings settings = new()
+{
+ ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
+};
+// Create the agent.
+
+TicketAgent ticketAgent = new(mlbService)
+{
+ Name = "TicketPurchasing",
+ Instructions =
+ """
+ You are a ticket agent focused on buying baseball tickets for a customer.
+ You can get the teams schedule from the scheduling tool.
+ Your goal is to review the schedule and select a single game only from the list.
+ If asked to pick a new game select the next game available.
+ """,
+ Description = "Ticket purchasing agent",
+ Kernel = ticketAgentKernel,
+ Arguments = new(settings)
+};
+// Create a separate agent to communicate with.
+ValidationAgent validationAgent = new()
+{
+ Name = "ScheduleValidation",
+ Instructions =
+ """
+ You are an assistant for an executive.
+ You are responsible for approving the ticket purchase.
+ Check the executive's schedule to ensure they can attend the baseball game on that date.
+ You can get the schedule's schedule from the schedule tool.
+ If the executive can attend the game, respond back with you approve the purchase.
+ If the executive can not attend, respond back with the executive is busy select a new game.
+ """,
+ Description = "Validate the executive's schedule is open for that game.",
+ Kernel = validationAgentKernel,
+ Arguments = new(settings)
+};
+// Create a group chat with the agents - instead of a chat completion service.
+AgentGroupChat chat = new(ticketAgent, validationAgent)
+{
+ ExecutionSettings = new()
+ {
+ // Use a custom termination strategy for exit criteria instead of termination phrases for the agents.
+ TerminationStrategy = new ApprovalTerminationStrategy
+ {
+ Agents = [validationAgent],
+ MaximumIterations = 10,
+ }
+ }
+};
+
+// Execute program.
+string[] terminationPhrases = ["quit", "exit"];
+string? userInput;
+do
+{
+ // Get user input.
+ Console.WriteLine("Type 'quit' or 'exit' to terminate the program.");
+ Console.Write("User > ");
+ userInput = Console.ReadLine()
+ ?.Trim().ToLowerInvariant();
+
+ // Validate user input.
+ while(string.IsNullOrWhiteSpace(userInput))
+ {
+ Console.WriteLine("Please type in something for the llm to respond to.");
+ Console.Write("User > ");
+ userInput = Console.ReadLine()
+ ?.Trim().ToLowerInvariant();
+ }
+
+ // Process assist responses.
+ if (!terminationPhrases.Contains(userInput))
+ {
+ Console.Write("Assistant > ");
+
+ string fullMessage = "";
+ // Invoke the agent instead of the chat completion service.
+ await foreach (var response in chat.InvokeStreamingAsync())
+ {
+ fullMessage += response.Content ?? "";
+ Console.Write(response.Content);
+ }
+ Console.WriteLine();
+ }
+}
+while (!terminationPhrases.Contains(userInput));
diff --git a/dotnet/Workshops/CustomConnector/tests/VectorStoreImplementationTests.cs b/dotnet/Workshops/CustomConnector/tests/VectorStoreImplementationTests.cs
index 605de2c..a3dffe0 100644
--- a/dotnet/Workshops/CustomConnector/tests/VectorStoreImplementationTests.cs
+++ b/dotnet/Workshops/CustomConnector/tests/VectorStoreImplementationTests.cs
@@ -28,12 +28,19 @@ public async Task VectorStoreRetrievesCollection(string collectionName)
public void VectorStoreRetrievesCollectionNames()
{
// Arrange
+ Dictionary collection = new()
+ {
+ { "testCollection1", new("testKey1", "testValue1", new float[1536]) },
+ { "testCollection2", new("testKey2", "testValue2", new float[1536]) },
+ { "testCollection3", new("testKey3", "testValue3", new float[1536]) }
+ };
+ Configure(_ => collection);
var vectorStore = VectorStore;
// Act
- var collection = vectorStore.ListCollectionNamesAsync();
+ var names = vectorStore.ListCollectionNamesAsync();
// Assert
- Assert.IsNotNull(collection);
+ Assert.IsNotNull(names);
}
}
diff --git a/learn-sk.sln b/learn-sk.sln
new file mode 100644
index 0000000..eb93f5b
--- /dev/null
+++ b/learn-sk.sln
@@ -0,0 +1,136 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.5.002.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dotnet", "dotnet", "{5DFE1E78-0B28-4846-B3C2-B104ADC8B6D4}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DemoApp", "DemoApp", "{24B0B289-24E3-489F-B4CA-34B63E3D6B52}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.Utilities", "dotnet\DemoApp\Core.Utilities\Core.Utilities.csproj", "{CA6FB297-DF00-47EC-8290-5F3FA5D6A7F2}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BaseballService", "BaseballService", "{8B7116CE-FC8A-47F0-AB34-8BD66DE06F57}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Baseball.Api", "dotnet\BaseballService\Api\Baseball.Api.csproj", "{24A4407C-224C-4AE7-A325-5D0B99256398}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Baseball.Api.Client", "dotnet\BaseballService\Api.Client\Baseball.Api.Client.csproj", "{D2F58B25-6DB4-4F16-B669-5878E65A25AB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Baseball.Abstractions", "dotnet\BaseballService\Abstractions\Baseball.Abstractions.csproj", "{0D759E35-7DC1-4C8A-8E95-22D2042FDB6F}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solutions", "Solutions", "{A61C1917-E725-4D08-8615-46D12D49C7AE}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution6", "dotnet\DemoApp\Solutions\Solution6\Solution6.csproj", "{47502863-9201-4969-8127-C03A6F27A662}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution5", "dotnet\DemoApp\Solutions\Solution5\Solution5.csproj", "{1EEC6A2E-E053-49DF-A4E2-7553EB1ABD88}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution4", "dotnet\DemoApp\Solutions\Solution4\Solution4.csproj", "{37A1DBEE-E627-4123-8F83-AE5947764C6C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution2", "dotnet\DemoApp\Solutions\Solution2\Solution2.csproj", "{5134C159-FC82-47EC-899E-B41FBFCBBF6D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution1", "dotnet\DemoApp\Solutions\Solution1\Solution1.csproj", "{F40D392E-E8C2-41BE-B827-CDB2DFC671F3}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution7", "dotnet\DemoApp\Solutions\Solution7\Solution7.csproj", "{996B19F7-501A-4206-85B3-ECB487D6B1BC}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Solution3", "dotnet\DemoApp\Solutions\Solution3\Solution3.csproj", "{1A1C5E2C-5834-4826-82EE-73A0874E3C74}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Workshops", "Workshops", "{D71FB226-128D-4655-AFCC-D80E51489D4A}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CustomConnector", "CustomConnector", "{335038A0-D46D-49AD-A315-6DA78B03205B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomConnector.tests", "dotnet\Workshops\CustomConnector\tests\CustomConnector.tests.csproj", "{FB1C4323-2A61-4D20-AAE7-045009E135C9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomConnector.Sample", "dotnet\Workshops\CustomConnector\sample\CustomConnector.Sample.csproj", "{BB1CA918-B56C-43F3-8A98-6FC1B014344F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CustomConnector", "dotnet\Workshops\CustomConnector\src\CustomConnector.csproj", "{96799469-6526-44B2-8311-04EAE89E3081}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {CA6FB297-DF00-47EC-8290-5F3FA5D6A7F2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {CA6FB297-DF00-47EC-8290-5F3FA5D6A7F2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CA6FB297-DF00-47EC-8290-5F3FA5D6A7F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {CA6FB297-DF00-47EC-8290-5F3FA5D6A7F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {24A4407C-224C-4AE7-A325-5D0B99256398}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {24A4407C-224C-4AE7-A325-5D0B99256398}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {24A4407C-224C-4AE7-A325-5D0B99256398}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {24A4407C-224C-4AE7-A325-5D0B99256398}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D2F58B25-6DB4-4F16-B669-5878E65A25AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D2F58B25-6DB4-4F16-B669-5878E65A25AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D2F58B25-6DB4-4F16-B669-5878E65A25AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D2F58B25-6DB4-4F16-B669-5878E65A25AB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0D759E35-7DC1-4C8A-8E95-22D2042FDB6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0D759E35-7DC1-4C8A-8E95-22D2042FDB6F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0D759E35-7DC1-4C8A-8E95-22D2042FDB6F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0D759E35-7DC1-4C8A-8E95-22D2042FDB6F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {47502863-9201-4969-8127-C03A6F27A662}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {47502863-9201-4969-8127-C03A6F27A662}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {47502863-9201-4969-8127-C03A6F27A662}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {47502863-9201-4969-8127-C03A6F27A662}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1EEC6A2E-E053-49DF-A4E2-7553EB1ABD88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1EEC6A2E-E053-49DF-A4E2-7553EB1ABD88}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1EEC6A2E-E053-49DF-A4E2-7553EB1ABD88}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1EEC6A2E-E053-49DF-A4E2-7553EB1ABD88}.Release|Any CPU.Build.0 = Release|Any CPU
+ {37A1DBEE-E627-4123-8F83-AE5947764C6C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {37A1DBEE-E627-4123-8F83-AE5947764C6C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {37A1DBEE-E627-4123-8F83-AE5947764C6C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {37A1DBEE-E627-4123-8F83-AE5947764C6C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5134C159-FC82-47EC-899E-B41FBFCBBF6D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5134C159-FC82-47EC-899E-B41FBFCBBF6D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5134C159-FC82-47EC-899E-B41FBFCBBF6D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5134C159-FC82-47EC-899E-B41FBFCBBF6D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F40D392E-E8C2-41BE-B827-CDB2DFC671F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F40D392E-E8C2-41BE-B827-CDB2DFC671F3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F40D392E-E8C2-41BE-B827-CDB2DFC671F3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F40D392E-E8C2-41BE-B827-CDB2DFC671F3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {996B19F7-501A-4206-85B3-ECB487D6B1BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {996B19F7-501A-4206-85B3-ECB487D6B1BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {996B19F7-501A-4206-85B3-ECB487D6B1BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {996B19F7-501A-4206-85B3-ECB487D6B1BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A1C5E2C-5834-4826-82EE-73A0874E3C74}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1A1C5E2C-5834-4826-82EE-73A0874E3C74}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A1C5E2C-5834-4826-82EE-73A0874E3C74}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1A1C5E2C-5834-4826-82EE-73A0874E3C74}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FB1C4323-2A61-4D20-AAE7-045009E135C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FB1C4323-2A61-4D20-AAE7-045009E135C9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FB1C4323-2A61-4D20-AAE7-045009E135C9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FB1C4323-2A61-4D20-AAE7-045009E135C9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BB1CA918-B56C-43F3-8A98-6FC1B014344F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BB1CA918-B56C-43F3-8A98-6FC1B014344F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BB1CA918-B56C-43F3-8A98-6FC1B014344F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BB1CA918-B56C-43F3-8A98-6FC1B014344F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {96799469-6526-44B2-8311-04EAE89E3081}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {96799469-6526-44B2-8311-04EAE89E3081}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {96799469-6526-44B2-8311-04EAE89E3081}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {96799469-6526-44B2-8311-04EAE89E3081}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {24B0B289-24E3-489F-B4CA-34B63E3D6B52} = {5DFE1E78-0B28-4846-B3C2-B104ADC8B6D4}
+ {CA6FB297-DF00-47EC-8290-5F3FA5D6A7F2} = {24B0B289-24E3-489F-B4CA-34B63E3D6B52}
+ {8B7116CE-FC8A-47F0-AB34-8BD66DE06F57} = {5DFE1E78-0B28-4846-B3C2-B104ADC8B6D4}
+ {24A4407C-224C-4AE7-A325-5D0B99256398} = {8B7116CE-FC8A-47F0-AB34-8BD66DE06F57}
+ {D2F58B25-6DB4-4F16-B669-5878E65A25AB} = {8B7116CE-FC8A-47F0-AB34-8BD66DE06F57}
+ {0D759E35-7DC1-4C8A-8E95-22D2042FDB6F} = {8B7116CE-FC8A-47F0-AB34-8BD66DE06F57}
+ {A61C1917-E725-4D08-8615-46D12D49C7AE} = {24B0B289-24E3-489F-B4CA-34B63E3D6B52}
+ {47502863-9201-4969-8127-C03A6F27A662} = {A61C1917-E725-4D08-8615-46D12D49C7AE}
+ {1EEC6A2E-E053-49DF-A4E2-7553EB1ABD88} = {A61C1917-E725-4D08-8615-46D12D49C7AE}
+ {37A1DBEE-E627-4123-8F83-AE5947764C6C} = {A61C1917-E725-4D08-8615-46D12D49C7AE}
+ {5134C159-FC82-47EC-899E-B41FBFCBBF6D} = {A61C1917-E725-4D08-8615-46D12D49C7AE}
+ {F40D392E-E8C2-41BE-B827-CDB2DFC671F3} = {A61C1917-E725-4D08-8615-46D12D49C7AE}
+ {996B19F7-501A-4206-85B3-ECB487D6B1BC} = {A61C1917-E725-4D08-8615-46D12D49C7AE}
+ {1A1C5E2C-5834-4826-82EE-73A0874E3C74} = {A61C1917-E725-4D08-8615-46D12D49C7AE}
+ {D71FB226-128D-4655-AFCC-D80E51489D4A} = {5DFE1E78-0B28-4846-B3C2-B104ADC8B6D4}
+ {335038A0-D46D-49AD-A315-6DA78B03205B} = {D71FB226-128D-4655-AFCC-D80E51489D4A}
+ {FB1C4323-2A61-4D20-AAE7-045009E135C9} = {335038A0-D46D-49AD-A315-6DA78B03205B}
+ {BB1CA918-B56C-43F3-8A98-6FC1B014344F} = {335038A0-D46D-49AD-A315-6DA78B03205B}
+ {96799469-6526-44B2-8311-04EAE89E3081} = {335038A0-D46D-49AD-A315-6DA78B03205B}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {20D216FB-332F-45F1-9D09-10C4EE42E5E5}
+ EndGlobalSection
+EndGlobal