Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

.Net: Feat: adds support for Microsoft Manifest in dotnet and other fixes. #9436

Open
wants to merge 38 commits into
base: main
Choose a base branch
from

Conversation

baywet
Copy link
Member

@baywet baywet commented Oct 25, 2024

Motivation and Context

  • Adds support for Microsoft Plugins Manifest to semantic kernel in dotnet.
  • Fixes performance bottleneck for API Manifest loading.
  • Fixes broken integration tests for API manifest loading.
  • Adds an OpenAPI operation id normalization visitor to replace . by _ so function names are valid.
  • Fixes performance bottleneck in OpenAPI operation loading.
  • Fixes experimental ID for API manifest from SKEXP0043 to SKEXP0040 after the renumbering
  • Upgrades OAI.net and ApiManifest references.

Description

Contribution Checklist

On the unit tests: I'd like guidance on where to add unit tests for:

  • API Manifest loading (wasn't done at the time)
  • Microsoft Manifest loading.
  • Operation Id Normalization Visitor

Why so many files?

  • ./kiota: all generated files, it contains kiota workspace configuration, which comes with copies of the OAS descriptions, etc… You don’t need to review it manually. It is useful because it allows us to automatically generate/refresh the integration tests plugins. If you feel like it's adding too much noise, we can remove those, we'll loose the ability to refresh the plugins definitions. https://aka.ms/kiota
  • Samples/concepts: restored the api manifest for astronomy API to fix the API manifest integration test. Added sample Microsoft Manifest for the new integration tests. Those are automatically generated via kiota and can be automatically refreshed later.
  • Src/Functions: Microsoft manifests implementation, API manifest fixes.

How to run the local tests

Create the following JSON file D:\github\semantic-kernel\dotnet\samples\Concepts\bin\Debug\net8.0\appsettings.Development.json (for some reason given how the project is setup this file is not being copied automatically. I didn't to touch any of the project setup out of fear of breaking other things)

{
  "MSGraph": {
    "ClientId": "clientId",
    "TenantId": "tenantId",
    "Scopes": [
      "Calendars.Read",
      "Contacts.Read",
      "Files.Read.All",
      "Mail.Read",
      "User.Read"
    ],
    "RedirectUri": "http://localhost"
  }
}

Replace the clientId and TenantId by your own value.
To create the application registration, go to https://aad.portal.azure.com, create a new application registration, new public client (add the redirect URI). In API access, add the listed Microsoft Graph delegated scopes. Grant consent after adding the scopes. During the first run, your browser will open to get the token.

File paths and copies

Like for the development settings, the project is NOT copying the sample plugin files for some reason. This is why the loading of the files in the integration tests looks at source files directly with ../../../ path segments. Happy to review that upon guidance.

License for Astrology plugins

The description is under the Apache license. I added the plugin (API and Microsoft) to restore the integration test for the former and mirror the setup to the latter. In the case of API plugins, we're only referring to it, so having a plugin is fine. In case of the Microsoft plugin, we have a full copy under the kiota configuration directory, and a sliced down version (derived work) in the example plugin. The value of this API is that it allows us to test scenarios outside of Microsoft Graph. But if the license is a challenge, we can remove those before merging. @RogerBarreto to provide more context on why those were deleted at the first place in #6005

Why so many commits?

Incremental work during the implementation, plus regular merges from main to make sure everything was current and we wouldn't end up with conflicts, etc... Happy to rebase and squash once the initial reviews are through.

zengin and others added 30 commits June 18, 2024 16:10
fix: loading of location OAS descriptions for Microsoft manifests

Signed-off-by: Vincent Biret <[email protected]>
Signed-off-by: Vincent Biret <[email protected]>
@baywet baywet requested a review from a team as a code owner October 25, 2024 19:40
@markwallace-microsoft markwallace-microsoft added .NET Issue or Pull requests regarding .NET code documentation labels Oct 25, 2024
@github-actions github-actions bot changed the title Feat: adds support for Microsoft Manifest in dotnet and other fixes. .Net: Feat: adds support for Microsoft Manifest in dotnet and other fixes. Oct 25, 2024
}
},
"Astronomy": {
"apiDescriptionUrl": "https://raw.githubusercontent.com/zengin/openapi-directory/zengin/nasa/APIs/nasa.gov/apod/1.0.0/openapi.yaml",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should not take a dependency on my account here. Is there any chance this file can be moved to a Microsoft owned location? I think I needed a copy for adding auth details.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, we can point it somewhere else. Do you remember where you took it from?

@@ -0,0 +1,79 @@
{
"applicationName": "application",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider moving all the documents from the .kiota folder closer to the code that uses them. If those are required for plugin generation, please move them to the plugins folder and add a README describing how to generate those plugins from the documents.

<ProjectReference Include="..\..\src\Connectors\Connectors.Memory.Sqlite\Connectors.Memory.Sqlite.csproj" />
<ProjectReference Include="..\..\src\Connectors\Connectors.Memory.Weaviate\Connectors.Memory.Weaviate.csproj" />
<ProjectReference
Include="..\..\src\Connectors\Connectors.HuggingFace\Connectors.HuggingFace.csproj" />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please review the changes in this file and others, and roll back any unnecessary ones, such as those related to formatting that move the Include attribute to a new line.

Comment on lines +55 to +56
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables"
Version="8.0.0" />
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revert unnecessary changes.

#endregion
];
[Theory, MemberData(nameof(s_parameters))]
public async Task RunSampleWithPlannerAsync(string pluginToTest, string functionToTest, KernelArguments? arguments, params string[] pluginsToLoad)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This sample, like the ApiManifest one, doesn’t use Planner as far as I can tell. I suggest renaming them to avoid the Planner keyword, like RunMicrosoftManifestPlugin and RunApiManifestPlugin.

["ContactsPlugin", "me_ListContacts", new KernelArguments() { { "_count", "true" } }, "ContactsPlugin", "MessagesPlugin"],
["CalendarPlugin", "me_calendar_ListEvents", new KernelArguments() { { "_top", "1" } }, "CalendarPlugin", "MessagesPlugin"],

#region Multiple API dependencies (multiple auth requirements) scenario within the same plugin
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is the region really needed here? Won't an XML comment suffice?

Comment on lines +37 to +38
var response = await LoadDocumentResponseFromUriAsync(uri, logger, httpClient, authCallback, userAgent, cancellationToken).ConfigureAwait(false);
return await response.Content.ReadAsStreamAndTranslateExceptionAsync().ConfigureAwait(false);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The response is not disposed here; consider wrapping the response and the stream into HttpResponseStream the same way it's done in the RestApiOperationRunner.

@@ -58,10 +77,34 @@ internal static async Task<string> LoadDocumentFromFilePathAsync(
#endif
).ConfigureAwait(false);
}
private static void CheckIfFileExists(string filePath)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please add new line between the methods and move the private to the bottom to keep internal methods as a group above.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would also consider moving these kernel extensions and the MicrosoftManifestKernelExtensions ones to the Microsoft.SemanticKernel namespace so that they can be easily discovered by consumers on kernel when the extension package is installed.

/// <summary>
/// API manifest plugin parameters.
/// </summary>
public class MicrosoftManifestPluginParameters
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The XML comment is not relevant to the class + consider sealing class.

/// <param name="httpClient">Http client to be used in plugin initialization phase.</param>
/// <param name="userAgent">User agent to be used in plugin initialization phase.</param>
/// <param name="functionExecutionParameters">A map of function execution parameters.</param>
public MicrosoftManifestPluginParameters(
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Working on SK for a long period of time, we've noticed that the number of constructor parameters for the parameter/metadata/options classes tends to grow over time, and it is quite difficult to add new ones and keep existing in logical order without introducing breaking changes. So, my advice would be to remove the constructor and use props only. Adding a new property would be just one line without the necessity of changing the constructor and worrying about potential breaking changes.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does MicrosoftManifest supersede the ApiManifest? If that is the case, should the ApiManifest functionality be obsoleted or removed?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation .NET Issue or Pull requests regarding .NET code
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants