Dela via


Lägga till Logic Apps som plugin-program

Ofta i ett företag har du redan en uppsättning arbetsflöden som utför verkligt arbete i Logic Apps. Dessa kan användas av andra automationstjänster eller power frontend-program som människor interagerar med. I Semantic Kernel kan du lägga till exakt samma arbetsflöden som plugin-program så att dina agenter också kan använda dem.

Ta till exempel logic apps-arbetsflöden som används av Semantic Kernel-teamet för att svara på frågor om nya prs. Med följande arbetsflöden har en agent allt den behöver för att hämta kodändringar, söka efter relaterade filer och kontrollera felloggar.

Logic Apps

  • Sök efter filer – för att hitta kodfragment som är relevanta för ett visst problem
  • Hämta fil – för att hämta innehållet i en fil på GitHub-lagringsplatsen
  • Hämta PR-information – för att hämta information om en PR (t.ex. PR-titeln, beskrivningen och författaren)
  • Hämta PR-filer – för att hämta filerna som har ändrats i en PR
  • Hämta bygg- och testfel – för att hämta bygg- och testfelen för en viss GitHub-åtgärdskörning
  • Hämta loggfil – för att hämta loggfilen för en viss GitHub-åtgärdskörning

Att använda Logic Apps för semantiska kernel-plugin-program är också ett bra sätt att dra nytta av de över 1 400 anslutningsappar som finns i Logic Apps. Det innebär att du enkelt kan ansluta till en mängd olika tjänster och system utan att skriva någon kod.

Viktigt!

I dag kan du bara lägga till standardlogikappar (kallas även logicappar för en klientorganisation) som plugin-program. Förbrukningslogikappar kommer snart.

Importera Logic Apps som plugin-program

Om du vill lägga till Logic Apps-arbetsflöden i semantisk kernel använder du samma metoder som att läsa in i en OpenAPI-specifikationer. Nedan visas exempelkod.

await kernel.ImportPluginFromOpenApiAsync(
    pluginName: "openapi_plugin",
    uri: new Uri("https://example.azurewebsites.net/swagger.json"),
    executionParameters: new OpenApiFunctionExecutionParameters()
    {
        // Determines whether payload parameter names are augmented with namespaces.
        // Namespaces prevent naming conflicts by adding the parent parameter name
        // as a prefix, separated by dots
        EnablePayloadNamespacing = true
    }
);

Konfigurera Logic Apps för semantisk kernel

Innan du kan importera en logikapp som ett plugin-program måste du först konfigurera logikappen så att den kan nås av semantisk kernel. Det innebär att aktivera metadataslutpunkter och konfigurera ditt program för Easy Auth innan du slutligen importerar logikappen som ett plugin-program med autentisering.

Aktivera metadataslutpunkter

För den enklaste konfigurationen kan du aktivera oautentiserad åtkomst till metadataslutpunkterna för logikappen. På så sätt kan du importera logikappen som ett plugin-program till Semantic Kernel utan att behöva skapa en anpassad HTTP-klient för att hantera autentisering för den första importen.

Nedanstående host.json-filen skapar två oautentiserade slutpunkter. Du kan göra detta i Azure-portalen genom att gå till kudu-konsolen och redigera den host.json filen som finns på C:\home\site\wwwroot\host.json.

{ 
  "version": "2.0", 
  "extensionBundle": { 
    "id": "Microsoft.Azure.Functions.ExtensionBundle.Workflows", 
    "version": "[1.*, 2.0.0)" 
  }, 
  "extensions": { 
    "http": { 
      "routePrefix": "" 
    }, 
    "workflow": { 
      "MetadataEndpoints": { 
        "plugin": { 
          "enable": true, 
          "Authentication":{ 
              "Type":"Anonymous" 
          } 
        }, 
        "openapi": { 
          "enable": true, 
          "Authentication":{ 
              "Type":"Anonymous" 
          } 
        } 
      }, 
      "Settings": { 
        "Runtime.Triggers.RequestTriggerDefaultApiVersion": "2020-05-01-preview" 
      } 
    } 
  } 
} 

Konfigurera ditt program för Enkel autentisering

Nu vill du skydda dina Logic App-arbetsflöden så att endast behöriga användare kan komma åt dem. Du kan göra detta genom att aktivera Enkel autentisering i logikappen. På så sätt kan du använda samma autentiseringsmekanism som dina andra Azure-tjänster, vilket gör det enklare att hantera dina säkerhetsprinciper.

En djupgående genomgång av hur du konfigurerar Easy Auth finns i den här självstudien om utlösararbetsflöden i standardlogikappar med Easy Auth.

För dem som redan är bekanta med Easy Auth (och redan har en Entra-klientapp som du vill använda) är detta den konfiguration som du vill publicera i Azure-hantering.

#!/bin/bash

# Variables
subscription_id="[SUBSCRIPTION_ID]"
resource_group="[RESOURCE_GROUP]"
app_name="[APP_NAME]"
api_version="2022-03-01"
arm_token="[ARM_TOKEN]"
tenant_id="[TENANT_ID]"
aad_client_id="[AAD_CLIENT_ID]"
object_ids=("[OBJECT_ID_FOR_USER1]" "[OBJECT_ID_FOR_USER2]" "[OBJECT_ID_FOR_APP1]")

# Convert the object_ids array to a JSON array
object_ids_json=$(printf '%s\n' "${object_ids[@]}" | jq -R . | jq -s .)

# Request URL
url="https://management.azure.com/subscriptions/$subscription_id/resourceGroups/$resource_group/providers/Microsoft.Web/sites/$app_name/config/authsettingsV2?api-version=$api_version"

# JSON payload
json_payload=$(cat <<EOF
{
    "properties": {
        "platform": {
            "enabled": true,
            "runtimeVersion": "~1"
        },
        "globalValidation": {
            "requireAuthentication": true,
            "unauthenticatedClientAction": "AllowAnonymous"
        },
        "identityProviders": {
            "azureActiveDirectory": {
                "enabled": true,
                "registration": {
                    "openIdIssuer": "https://sts.windows.net/$tenant_id/",
                    "clientId": "$aad_client_id"
                },
                "validation": {
                    "jwtClaimChecks": {},
                    "allowedAudiences": [
                        "api://$aad_client_id"
                    ],
                    "defaultAuthorizationPolicy": {
                        "allowedPrincipals": {
                            "identities": $object_ids_json
                        }
                    }
                }
            },
            "facebook": {
                "enabled": false,
                "registration": {},
                "login": {}
            },
            "gitHub": {
                "enabled": false,
                "registration": {},
                "login": {}
            },
            "google": {
                "enabled": false,
                "registration": {},
                "login": {},
                "validation": {}
            },
            "twitter": {
                "enabled": false,
                "registration": {}
            },
            "legacyMicrosoftAccount": {
                "enabled": false,
                "registration": {},
                "login": {},
                "validation": {}
            },
            "apple": {
                "enabled": false,
                "registration": {},
                "login": {}
            }
        }
    }
}
EOF
)

# HTTP PUT request
curl -X PUT "$url" \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $arm_token" \
    -d "$json_payload"

Använda Logic Apps med semantisk kernel som plugin-program

Nu när du har skyddat logikappen och metadataslutpunkterna är aktiverade har du slutfört alla hårda delar. Nu kan du importera logikappen som ett plugin-program till Semantic Kernel med hjälp av importmetoden OpenAPI.

När du skapar plugin-programmet ska du ange en anpassad HTTP-klient som kan hantera autentiseringen för logikappen. På så sätt kan du använda plugin-programmet i dina AI-agenter utan att behöva oroa dig för autentiseringen.

Nedan visas ett exempel i C# som använder interaktiv autentisering för att hämta en token och autentisera användaren för logikappen.

string ClientId = "[AAD_CLIENT_ID]";
string TenantId = "[TENANT_ID]";
string Authority = $"https://login.microsoftonline.com/{TenantId}";
string[] Scopes = new string[] { "api://[AAD_CIENT_ID]/SKLogicApp" };

var app = PublicClientApplicationBuilder.Create(ClientId)
            .WithAuthority(Authority)
            .WithDefaultRedirectUri() // Uses http://localhost for a console app
            .Build();

AuthenticationResult authResult = null;
try
{
    authResult = await app.AcquireTokenInteractive(Scopes).ExecuteAsync();
}
catch (MsalException ex)
{
    Console.WriteLine("An error occurred acquiring the token: " + ex.Message);
}

// Add the plugin to the kernel with a custom HTTP client for authentication
kernel.Plugins.Add(await kernel.ImportPluginFromOpenApiAsync(
    pluginName: "[NAME_OF_PLUGIN]",
    uri: new Uri("https://[LOGIC_APP_NAME].azurewebsites.net/swagger.json"),
    executionParameters: new OpenApiFunctionExecutionParameters()
    {
        HttpClient = new HttpClient()
        {
            DefaultRequestHeaders =
            {
                Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken)
            }
        },
    }
));

Nästa steg

Nu när du vet hur du skapar ett plugin-program kan du nu lära dig hur du använder dem med din AI-agent. Beroende på vilken typ av funktioner du har lagt till i dina plugin-program finns det olika mönster som du bör följa. Information om hämtningsfunktioner finns i artikeln använda hämtningsfunktioner . Information om funktioner för uppgiftsautomatisering finns i artikeln använda funktioner för uppgiftsautomatisering .