Добавьте приложение App Service в качестве инструмента в службу агента Foundry (.NET)

В этом руководстве вы узнаете, как открыть функциональность приложения ASP.NET Core через OpenAPI, добавить его в Foundry Agent Service и взаимодействовать с приложением на естественном языке на игровой площадке агентов.

Если веб-приложение уже имеет полезные функции, такие как покупки, бронирование отелей или управление данными, это легко сделать эти возможности доступными агенту ИИ в Службе агента Foundry. Просто добавив в приложение схему OpenAPI, агент может понять и использовать возможности приложения при реагировании на запросы пользователей. Это означает, что ваше приложение может сделать все, что может сделать агент ИИ, с минимальными усилиями, помимо создания конечной точки OpenAPI для вашего приложения. В этом руководстве вы начнёте с простого приложения для списков to-do. К концу вы сможете создавать, обновлять и управлять задачами с агентом с помощью общения ИИ.

Снимок экрана: игровая площадка агентов в середине беседы, которая выполняет действия с помощью средства OpenAPI.

  • Добавьте функции OpenAPI в веб-приложение.
  • Убедитесь, что схема OpenAPI совместима со службой агента Foundry.
  • Зарегистрируйте приложение в качестве средства OpenAPI в службе агента Foundry.
  • Проверьте агент на игровой площадке агентов.

Предпосылки

В этом руководстве предполагается, что вы работаете с примером, используемым в руководстве. Развертывание приложения ASP.NET Core и Базы данных SQL Azure в Службе приложений Azure.

По крайней мере, откройте образец приложения в GitHub Codespaces и разверните приложение, запустив команду azd up.

Добавление функций OpenAPI в веб-приложение

Подсказка

Чтобы внести все следующие изменения, дайте указания GitHub Copilot в агентском режиме:

I'd like to add OpenAPI functionality to all the methods in Controllers/TodosController.cs, but I don't want to change the existing functionality with MVC. Please also generate the server URL and operation ID in the schema.

  1. В терминале пространства кода добавьте пакеты NuGet Swashbuckle в проект:

    dotnet add package Swashbuckle.AspNetCore --version 6.5.0
    dotnet add package Swashbuckle.AspNetCore.Annotations --version 6.5.0
    
  2. В controllers/TodosController.cs добавьте следующие методы API. Чтобы обеспечить их совместимость со службой агента Foundry, необходимо указать OperationId свойство в атрибуте SwaggerOperation (см. инструкции по использованию службы агента Foundry с указанными средствами OpenAPI: предварительные требования).

        // GET: api/todos
        [HttpGet("api/todos")]
        [SwaggerOperation(Summary = "Gets all Todo items", OperationId = "GetTodos")]
        [ProducesResponseType(typeof(IEnumerable<Todo>), 200)]
        public async Task<ActionResult<IEnumerable<Todo>>> GetTodos()
        {
            return await _context.Todo.ToListAsync();
        }
    
        // GET: api/todos/5
        [HttpGet("api/todos/{id}")]
        [SwaggerOperation(Summary = "Gets a Todo item by ID", OperationId = "GetTodoById")]
        [ProducesResponseType(typeof(Todo), 200)]
        [ProducesResponseType(404)]
        public async Task<ActionResult<Todo>> GetTodo(int id)
        {
            var todo = await _context.Todo.FindAsync(id);
    
            if (todo == null)
            {
                return NotFound();
            }
    
            return todo;
        }
    
    
    // POST: api/todos
    [HttpPost("api/todos")]
    [ProducesResponseType(StatusCodes.Status201Created)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [SwaggerOperation(Summary = "Creates a new todo item.", Description = "Creates a new todo item and returns it.", OperationId = "CreateTodo")]
    public async Task<IActionResult> CreateTodo([FromBody] Todo todo)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        _context.Add(todo);
        await _context.SaveChangesAsync();
        return CreatedAtAction(nameof(GetTodo), new { id = todo.ID }, todo);
    }
    
    // PUT: api/todos/{id}
    [HttpPut("api/todos/{id}")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status400BadRequest)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    [SwaggerOperation(Summary = "Updates a todo item.", Description = "Updates an existing todo item by ID.", OperationId = "UpdateTodo")]
    public async Task<IActionResult> UpdateTodo(int id, [FromBody] Todo todo)
    {
        // Use the id from the URL fragment only, ignore mismatching check
        if (!TodoExists(id))
        {
            return NotFound();
        }
        todo.ID = id;
        _context.Entry(todo).State = EntityState.Modified;
        await _context.SaveChangesAsync();
        return NoContent();
    }
    
    // DELETE: api/todos/{id}
    [HttpDelete("api/todos/{id}")]
    [ProducesResponseType(StatusCodes.Status204NoContent)]
    [ProducesResponseType(StatusCodes.Status404NotFound)]
    [SwaggerOperation(Summary = "Deletes a todo item.", Description = "Deletes a todo item by ID.", OperationId = "DeleteTodo")]
    public async Task<IActionResult> DeleteTodo(int id)
    {
        var todo = await _context.Todo.FindAsync(id);
        if (todo == null)
        {
            return NotFound();
        }
        _context.Todo.Remove(todo);
        await _context.SaveChangesAsync();
        return NoContent();
    }
    
  3. В верхней части контроллеров или TodosController.cs добавьте следующее:

    using Swashbuckle.AspNetCore.Annotations;
    

    Этот код дублирует функциональные возможности существующего контроллера, который является ненужным, но вы будете хранить его для простоты. Рекомендуется переместить логику приложения в класс службы, а затем вызвать методы службы как из действий MVC, так и из методов API.

  4. В Program.cs зарегистрируйте службу генератора Swagger. Это включает документацию по OpenAPI для API, которая позволяет Службе агентов Foundry понять API. Обязательно укажите URL-адрес сервера. Службе агента Foundry требуется схема, содержащая URL-адрес сервера.

    builder.Services.AddSwaggerGen(c =>
    {
        c.EnableAnnotations();
        var websiteHostname = Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME");
        if (!string.IsNullOrEmpty(websiteHostname))
        {
            c.AddServer(new Microsoft.OpenApi.Models.OpenApiServer { Url = $"https://{websiteHostname}" });
        }
    });
    
  5. В Program.cs включите ПО промежуточного слоя Swagger. Это промежуточное программное обеспечение предоставляет созданную документацию OpenAPI во время выполнения, что делает её доступной через браузер.

    app.UseSwagger();
    app.UseSwaggerUI();
    
  6. В терминале пространства кода запустите приложение, используя dotnet run.

  7. Выберите Открыть в браузере.

  8. Перейдите на Swagger UI, добавив /swagger/index.html к URL.

  9. Убедитесь, что операции API работают, пробуя их в пользовательском интерфейсе Swagger.

  10. Вернитесь в терминал codespace, зафиксируйте изменения (метод GitHub Actions) или запустите azd up (метод Azure Developer CLI).

  11. После развертывания изменений перейдите к https://<your-app's-url>/swagger/v1/swagger.json схеме и скопируйте ее позже.

Создание агента в Microsoft Foundry

Замечание

В этих шагах используется новый портал Foundry.

  1. На портале Foundry в правом верхнем меню выберите New Foundry.

  2. Если это первый раз на новом портале Foundry, выберите имя проекта и нажмите кнопку "Создать проект".

  3. Присвойте проекту имя и нажмите кнопку "Создать".

  4. Нажмите кнопку "Начать сборку", а затем создайте агент.

  5. Присвойте агенту имя и нажмите кнопку "Создать". Когда агент будет готов, вы увидите песочницу агента.

    Обратите внимание на модели, которые можно использовать и доступные регионы.

  6. В песочнице агента разверните Инструменты и выберите Добавить>настраиваемый>инструмент OpenAPI>Создать.

  7. Присвойте инструменту имя и описание. В поле схемы OpenAPI 3.0+ вставьте скопированную ранее схему.

  8. Нажмите "Создать инструмент".

  9. Нажмите кнопку "Сохранить".

Подсказка

В этом руководстве средство OpenAPI настроено для анонимного вызова приложения без проверки подлинности. Для рабочих сценариев необходимо защитить инструмент с помощью идентификации управляемой учетной записи. Пошаговые инструкции см. в разделе "Безопасные конечные точки OpenAPI" для службы агента Foundry.

Тестирование агента

  1. В инструкциях приведены некоторые простые инструкции, например "Используйте средство todosApp для управления задачами".

  2. Свяжитесь с агентом с учетом следующих вариантов запроса:

    • Показать мне все задачи.
    • Создайте задачу под названием "Придумать три шутки салата".
    • Измените это на "Придумать с тремя шутками стука-стука".

    Снимок экрана: игровая площадка агентов в середине беседы, которая выполняет действия с помощью средства OpenAPI.

Рекомендации по обеспечению безопасности

При предоставлении API-интерфейсов с помощью OpenAPI в Службе приложений Azure следуйте приведенным ниже рекомендациям по обеспечению безопасности.

  • Проверка подлинности и авторизация. Защита конечных точек OpenAPI с помощью проверки подлинности Microsoft Entra. Пошаговые инструкции см. в разделе "Безопасные конечные точки OpenAPI" для службы агента Foundry. Кроме того, вы можете защитить свои конечные точки с помощью Azure API Management и идентификатора Microsoft Entra ID, обеспечив доступ только для авторизованных пользователей или агентов.
  • Проверьте входные данные: Пример кода проверяется ModelState.IsValid в методе CreateTodo , что гарантирует, что входящие данные соответствуют атрибутам проверки модели. Дополнительные сведения см. в разделе "Проверка модели" в ASP.NET Core.
  • Используйте ПРОТОКОЛ HTTPS: В примере используется служба приложений Azure, которая по умолчанию применяет ПРОТОКОЛ HTTPS и предоставляет бесплатные СЕРТИФИКАТЫ TLS/SSL для шифрования данных во время передачи.
  • Ограничение CORS: Ограничить общий доступ к ресурсам между источниками (CORS) только доверенным доменам. Дополнительные сведения см. в разделе "Включение CORS".
  • Применение ограничения скорости:Используйте службу управления API или службу пользовательского промежуточного слоя, чтобы предотвратить злоупотребления и атаки типа "отказ в обслуживании".
  • Скрытие конфиденциальных конечных точек: Избегайте предоставления внутренних или административных API в схеме OpenAPI.
  • Просмотрите схему OpenAPI: Убедитесь, что схема OpenAPI не раскрывает конфиденциальную информацию (например, внутренние ссылки, секреты или детали реализации).
  • Обновление зависимостей: Регулярно обновляйте пакеты NuGet и отслеживайте рекомендации по безопасности.
  • Ведение журнала и мониторинг активности: Включите ведение журнала и мониторинг доступа для обнаружения подозрительной активности.
  • Используйте управляемые удостоверения: При вызове других служб Azure используйте управляемые удостоверения вместо жестко закодированных учетных данных.

Дополнительные сведения см. в статье "Защита приложения службы приложений " и рекомендации по обеспечению безопасности REST API.

Следующий шаг

Теперь вы настроили приложение App Service для использования в качестве инструмента для службы агента Foundry. Взаимодействуйте с API вашего приложения через естественный язык на платформе для агентов. Здесь вы можете продолжать добавлять функции в агент на портале Foundry, интегрировать его в собственные приложения с помощью пакета SDK Microsoft Foundry или REST API или развернуть его в составе более крупного решения. Агенты, созданные в Microsoft Foundry, можно запускать в облаке, интегрировать в чат-боты или внедрять в веб-приложения и мобильные приложения.

Чтобы выполнить следующий шаг и узнать, как запустить агент непосредственно в Службе приложений Azure, ознакомьтесь со следующим руководством.

Дополнительные ресурсы