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