Использование средства SharePoint с API агента (предварительная версия)

Важно

Элементы, помеченные (предварительная версия) в этой статье, в настоящее время находятся в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения об уровне обслуживания, и мы не рекомендуем ее для рабочих нагрузок. Некоторые функции могут не поддерживаться или могут иметь ограниченные возможности. Дополнительные сведения см. в разделе Supplemental Terms of Use for Microsoft Azure Previews.

Примечание

  • В этой статье описывается средство Microsoft SharePoint для службы агента Foundry. Сведения об использовании и развертывании сайтов SharePoint см. в документации SharePoint.
  • Ознакомьтесь с рекомендациями по оптимизации использования инструментов.

Используйте средство SharePoint (предварительная версия) для интеграции SharePoint в службе агентства Microsoft Foundry, получая содержимое из сайта или папки SharePoint (например, contoso.sharepoint.com/sites/policies). Когда пользователь задает вопрос, агент может вызвать средство SharePoint, чтобы получить соответствующий текст из документов, к которые пользователь может получить доступ. Затем агент создает ответ на основе полученного содержимого.

Эта интеграция использует сквозную передачу удостоверений (от имени), чтобы разрешения SharePoint продолжали применяться к каждому запросу. Дополнительные сведения об интеграции API извлечения Microsoft 365 Copilot смотрите в разделе Как это работает.

Важно

Перед началом работы: для средства SharePoint требуется проверка подлинности пользователя (без использования только приложения/служебного принципала), сайт SharePoint и агент Foundry должны находиться в одном клиенте, и каждый агент поддерживает только одно средство SharePoint. Средство не работает, когда агент публикуется в Microsoft Teams. См. ограничения для полного списка.

Поддержка использования

В следующей таблице показана поддержка пакета SDK и настройки.

поддержка Microsoft Foundry пакет SDK Python C# SDK JavaScript SDK пакет SDK Java REST API Базовая настройка агента Настройка стандартного агента
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Необходимые условия

  • Допустимая лицензия или модель оплаты по мере использования:
    • Разработчики и конечные пользователи имеют лицензию Microsoft 365 Copilot, как это требуется API извлечения Microsoft 365 Copilot.
    • Если у разработчиков и конечных пользователей нет лицензии Microsoft 365 Copilot, можно включить модель pay-as-you-go.
  • Разработчики и конечные пользователи имеют по крайней мере Azure AI User роль RBAC, назначенную проекту Foundry. Дополнительные сведения о Azure управлении доступом на основе ролей см. в статье Azure управление доступом на основе ролей в Foundry.
  • Разработчики и конечные пользователи имеют по меньшей мере READ доступ к сайту SharePoint.
  • Убедитесь, что ваш SharePoint клиент и проект Foundry находятся в одном Microsoft Entra клиенте. Обмен маркерами между клиентами не поддерживается.
  • Необходимый установленный пакет SDK:
    • Python: pip install "azure-ai-projects>=2.0.0"
    • C#: установите пакет NuGet Azure.AI.Projects
    • TypeScript/JavaScript: npm install @azure/ai-projects
    • Java: добавьте com.azure:azure-ai-agents:2.0.0 в pom.xml
  • Настроенные переменные среды:
    • FOUNDRY_PROJECT_ENDPOINT: URL-адрес конечной точки проекта Foundry
    • FOUNDRY_MODEL_DEPLOYMENT_NAME: имя развертывания модели (например, gpt-4)
    • SHAREPOINT_PROJECT_CONNECTION_ID: идентификатор подключения SharePoint в формате /subscriptions/{{subscriptionID}}/resourceGroups/{{resourceGroupName}}/providers/Microsoft.CognitiveServices/accounts/{{foundryAccountName}}/projects/{{foundryProjectName}}/connections/{{foundryConnectionName}}
    • Для примеров REST: AGENT_TOKEN
  • Дополнительные сведения о настройке проверки подлинности см. в кратком руководстве .

Параметры

Средство SharePoint использует подключение проекта для определения того, с какого сайта или в какой папке SharePoint оно может получить данные.

Параметр Обязательно Заметки
type Да Используйте sharepoint_grounding_preview.
sharepoint_grounding_preview.project_connections[].project_connection_id Да Используйте значение SHAREPOINT_PROJECT_CONNECTION_ID.

Если необходимо создать подключение SharePoint для проекта, см. раздел Добавление нового подключения к проекту.

Пример кода

В следующем примере показано, как создать агент, использующий инструмент SharePoint для формирования ответов на основе содержимого сайта SharePoint.

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import (
    PromptAgentDefinition,
    SharepointPreviewTool,
    SharepointGroundingToolParameters,
    ToolProjectConnection,
)

# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
SHAREPOINT_CONNECTION_NAME = "my-sharepoint-connection"

# Create clients to call Foundry API
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

# Get connection ID from connection name
sharepoint_connection = project.connections.get(
    SHAREPOINT_CONNECTION_NAME,
)

# Configure SharePoint tool with the project connection
sharepoint_tool= SharepointPreviewTool(
    sharepoint_grounding_preview=SharepointGroundingToolParameters(
        project_connections=[
            ToolProjectConnection(project_connection_id=sharepoint_connection.id)
        ]
    )
)

agent = project.agents.create_version(
    agent_name="MyAgent",
    definition=PromptAgentDefinition(
        model="gpt-4.1-mini",
        instructions="""You are a helpful agent that can use SharePoint tools to assist users. 
        Use the available SharePoint tools to answer questions and perform tasks.""",
        tools=[sharepoint_tool],
    ),
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")

# Send initial request that will trigger the SharePoint tool
stream_response = openai.responses.create(
    stream=True,
    tool_choice="required",
    input="Please summarize the last meeting notes stored in SharePoint.",
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)

for event in stream_response:
    if event.type == "response.created":
        print(f"Follow-up response created with ID: {event.response.id}")
    elif event.type == "response.output_text.delta":
        print(f"Delta: {event.delta}")
    elif event.type == "response.text.done":
        print(f"\nFollow-up response done!")
    elif event.type == "response.output_item.done":
        if event.item.type == "message":
            item = event.item
            if item.content[-1].type == "output_text":
                text_content = item.content[-1]
                for annotation in text_content.annotations:
                    if annotation.type == "url_citation":
                        print(
                            f"URL Citation: {annotation.url}, "
                            f"Start index: {annotation.start_index}, "
                            f"End index: {annotation.end_index}"
                        )
    elif event.type == "response.completed":
        print(f"\nFollow-up completed!")
        print(f"Full response: {event.response.output_text}")

Ожидаемые выходные данные

При запуске этого кода вы увидите следующие выходные данные:

Agent created (id: asst_abc123, name: MyAgent, version: 1)

Sending request to SharePoint agent with streaming...
Follow-up response created with ID: resp_xyz789
Delta: Based
Delta:  on
Delta:  the
Delta:  meeting
Delta:  notes
...
URL Citation: https://contoso.sharepoint.com/sites/policies/Documents/meeting-notes.docx, Start index: 0, End index: 245

Follow-up response done!

Follow-up completed!
Full response: Based on the meeting notes from your SharePoint site, the last meeting covered the following topics: project timeline updates, budget review, and next quarter planning.

В следующем примере показано, как создать агент, использующий инструмент SharePoint для формирования ответов на основе содержимого сайта SharePoint. В этом примере используются синхронные методы для простоты. Для получения сведений об асинхронной версии обратитесь к образцу документации агента SharePoint в репозитории Azure SDK для .NET на GitHub.

Чтобы разрешить агенту доступ к SharePoint, используйте SharepointPreviewTool.

using System;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
var sharepointConnectionName = "my-sharepoint-connection";

// Create project client to call Foundry API
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: new DefaultAzureCredential());

// Get connection ID from connection name
AIProjectConnection sharepointConnection = projectClient.Connections.GetConnection(connectionName: sharepointConnectionName);

// Use the SharePoint connection ID to initialize the SharePointGroundingToolOptions,
// which will be used to create SharepointPreviewTool. Use this tool to create an Agent.
SharePointGroundingToolOptions sharepointToolOption = new()
{
    ProjectConnections = { new ToolProjectConnection(projectConnectionId: sharepointConnection.Id) }
};
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-4.1-mini")
{
    Instructions = "You are a helpful assistant.",
    Tools = { new SharepointPreviewTool(sharepointToolOption), }
};
AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
    agentName: "myAgent",
    options: new(agentDefinition));

// Create the response and make sure we are always using tool.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
CreateResponseOptions responseOptions = new()
{
    ToolChoice = ResponseToolChoice.CreateRequiredChoice(),
    InputItems = { ResponseItem.CreateUserMessageItem("What is Contoso whistleblower policy") }
};
ResponseResult response = responseClient.CreateResponse(options: responseOptions);

// SharePoint tool can create the reference to the page, grounding the data.
// Create the GetFormattedAnnotation method to get the URI annotation.
string annotation = "";
foreach (ResponseItem item in response.OutputItems)
{
    if (item is MessageResponseItem messageItem)
    {
        foreach (ResponseContentPart content in messageItem.Content)
        {
            foreach (ResponseMessageAnnotation messageAnnotation in content.OutputTextAnnotations)
            {
                if (messageAnnotation is UriCitationMessageAnnotation uriAnnotation)
                {
                    annotation = $" [{uriAnnotation.Title}]({uriAnnotation.Uri})";
                }
            }
        }
    }
}

// Print the Agent output and add the annotation at the end.
Console.WriteLine($"Response status: {response.Status}");
Console.WriteLine($"{response.GetOutputText()}{annotation}");

// After the sample is completed, delete the Agent we have created.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);

Ожидаемые выходные данные

При запуске этого кода вы увидите следующие выходные данные:

The Contoso whistleblower policy outlines procedures for reporting unethical behavior confidentially. Employees can submit concerns through the ethics hotline or online portal. [Whistleblower Policy](https://contoso.sharepoint.com/sites/policies/Documents/whistleblower-policy.pdf)

Выходные данные включают ответ агента на основе содержимого SharePoint, с сноской на исходный документ.

Пример использования агента с SharePoint

Получение токена доступа:

export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)

В следующем примере показано, как создать агент, который использует инструмент SharePoint для обоснования ответов с использованием содержимого из сайта SharePoint.

curl --request POST \
  --url "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
  "input": "Please summarize the last meeting notes stored in SharePoint.",
  "tool_choice": "required",
  "tools": [
    {
      "type": "sharepoint_grounding_preview",
      "sharepoint_grounding_preview": {
        "project_connections": [
          {
            "project_connection_id": "'$SHAREPOINT_PROJECT_CONNECTION_ID'"
          }
        ]
      }
    }
  ]
}'

Ожидаемые выходные данные

API возвращает ответ JSON с информацией об ответе агента и ссылке:

{
  "id": "resp_abc123xyz",
  "object": "response",
  "created_at": 1702345678,
  "status": "completed",
  "output_text": "Based on the meeting notes from your SharePoint site, the last meeting covered project timeline updates, budget review, and next quarter planning.",
  "output_items": [
    {
      "type": "message",
      "content": [
        {
          "type": "output_text",
          "text": "Based on the meeting notes...",
          "annotations": [
            {
              "type": "url_citation",
              "url": "https://contoso.sharepoint.com/sites/policies/Documents/meeting-notes.docx",
              "start_index": 0,
              "end_index": 245
            }
          ]
        }
      ]
    }
  ]
}

В этом примере показано, как создать ИИ агента с возможностями SharePoint. Агент может выполнять поиск SharePoint содержимого и предоставлять ответы с соответствующими сведениями на сайтах SharePoint. Для версии JavaScript см. пример документации по агенту SharePoint в репозитории Azure SDK для JavaScript GitHub.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const SHAREPOINT_CONNECTION_NAME = "my-sharepoint-connection";

export async function main(): Promise<void> {
  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  // Get connection ID from connection name
  const sharepointConnection = await project.connections.get(SHAREPOINT_CONNECTION_NAME);

  // Create agent with SharePoint tool
  const agent = await project.agents.createVersion("MyAgent", {
    kind: "prompt",
    model: "gpt-4.1-mini",
    instructions:
      "You are a helpful agent that can use SharePoint tools to assist users. Use the available SharePoint tools to answer questions and perform tasks.",
    // Define SharePoint tool that searches SharePoint content
    tools: [
      {
        type: "sharepoint_grounding_preview",
        sharepoint_grounding_preview: {
          project_connections: [
            {
              project_connection_id: sharepointConnection.id,
            },
          ],
        },
      },
    ],
  });
  console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);

  // Send initial request that will trigger the SharePoint tool
  const streamResponse = await openai.responses.create(
    {
      input: "Please summarize the last meeting notes stored in SharePoint.",
      stream: true,
    },
    {
      body: {
        agent: { name: agent.name, type: "agent_reference" },
        tool_choice: "required",
      },
    },
  );

  // Process the streaming response
  for await (const event of streamResponse) {
    if (event.type === "response.created") {
      console.log(`Follow-up response created with ID: ${event.response.id}`);
    } else if (event.type === "response.output_text.delta") {
      process.stdout.write(event.delta);
    } else if (event.type === "response.output_text.done") {
      console.log("\n\nFollow-up response done!");
    } else if (event.type === "response.output_item.done") {
      if (event.item.type === "message") {
        const item = event.item;
        if (item.content && item.content.length > 0) {
          const lastContent = item.content[item.content.length - 1];
          if (lastContent.type === "output_text" && lastContent.annotations) {
            for (const annotation of lastContent.annotations) {
              if (annotation.type === "url_citation") {
                console.log(
                  `URL Citation: ${annotation.url}, Start index: ${annotation.start_index}, End index: ${annotation.end_index}`,
                );
              }
            }
          }
        }
      }
    } else if (event.type === "response.completed") {
      console.log("\nFollow-up completed!");
    }
  }

  // Clean up resources
  await project.agents.deleteVersion(agent.name, agent.version);
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Ожидаемые выходные данные

При запуске этого кода вы увидите следующие выходные данные:

Creating agent with SharePoint tool...
Agent created (id: asst_abc123, name: MyAgent, version: 1)

Sending request to SharePoint agent with streaming...
Follow-up response created with ID: resp_xyz789
Based on the meeting notes from your SharePoint site, the last meeting covered the following topics: project timeline updates, budget review, and next quarter planning.

Follow-up response done!
URL Citation: https://contoso.sharepoint.com/sites/policies/Documents/meeting-notes.docx, Start index: 0, End index: 245

Follow-up completed!

Cleaning up resources...
Agent deleted

SharePoint agent sample completed!

Использование интеграции SharePoint в агенте Java

Добавьте зависимость в вашу pom.xml:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-ai-agents</artifactId>
    <version>2.0.0</version>
</dependency>

Создание агента с базированием на SharePoint

import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.*;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

import java.util.Arrays;
import java.util.Collections;

public class SharePointGroundingExample {
    public static void main(String[] args) {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        String projectEndpoint = "your_project_endpoint";
        String sharepointConnectionId = "your_sharepoint_connection_id";

        AgentsClientBuilder builder = new AgentsClientBuilder()
            .credential(new DefaultAzureCredentialBuilder().build())
            .endpoint(projectEndpoint);

        AgentsClient agentsClient = builder.buildAgentsClient();
        ResponsesClient responsesClient = builder.buildResponsesClient();

        // Create SharePoint grounding tool with connection configuration
        SharepointPreviewTool sharepointTool = new SharepointPreviewTool(
            new SharepointGroundingToolParameters()
                .setProjectConnections(Arrays.asList(
                    new ToolProjectConnection(sharepointConnectionId)
                ))
        );

        // Create agent with SharePoint tool
        PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-4.1-mini")
            .setInstructions("You are a helpful assistant that can search through SharePoint documents.")
            .setTools(Collections.singletonList(sharepointTool));

        AgentVersionDetails agent = agentsClient.createAgentVersion("sharepoint-agent", agentDefinition);
        System.out.printf("Agent created: %s (version %s)%n", agent.getName(), agent.getVersion());

        // Create a response
        AgentReference agentReference = new AgentReference(agent.getName())
            .setVersion(agent.getVersion());

        Response response = responsesClient.createAzureResponse(
            new AzureCreateResponseOptions().setAgentReference(agentReference),
            ResponseCreateParams.builder()
                .input("Find the latest project documentation in SharePoint"));

        System.out.println("Response: " + response.output());

        // Clean up
        agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
    }
}

Ограничения

  • Средство SharePoint поддерживает проверку подлинности только пользователей. Проверка подлинности только для приложений (субъекта-службы) не поддерживается.
  • Ваш сайт SharePoint и агент Microsoft Foundry должны находиться в одном клиенте.
  • Для каждого агента можно добавить только одно средство SharePoint.
  • Основополагающий API извлечения Microsoft 365 Copilot возвращает текстовые извлечения. Извлечение из нетекстового содержимого, включая изображения и диаграммы, не поддерживается.
  • Для семантического и гибридного извлечения API Microsoft 365 Copilot Retrieval поддерживает типы файлов .doc, .docx, .pptx, .pdf, .aspx и .one. Дополнительные сведения см. в api Microsoft 365 Copilot.

Установка

Примечание

Начните с SharePoint сайтов с простой структурой папок и небольшим количеством коротких документов.

  1. Выберите SharePoint и следуйте инструкциям, чтобы добавить это средство. Можно добавить только один объект на каждого агента.

  2. Добавьте подключение SharePoint.

    Пошаговые инструкции см. в разделе "Добавление нового подключения к проекту".

  3. В конфигурации подключения SharePoint введите URL-адрес сайта или URL-адрес папки.

    • Пример URL-адреса сайта: https://<company>.sharepoint.com/sites/<site_name>
    • Пример URL-адреса папки: https://<company>.sharepoint.com/sites/<site_name>/Shared%20documents/<folder_name>

    Примечание

    Ваш site_url должен соответствовать приведенному выше формату. При копировании всего содержимого адресной строки SharePoint это не работает.

  4. Сохраните подключение и скопируйте его идентификатор подключения.

  5. Задайте идентификатор подключения как SHAREPOINT_PROJECT_CONNECTION_ID.

Принцип работы

Средство SharePoint позволяет обеспечить удобную интеграцию между агентами ИИ и бизнес-документами, хранящимися в SharePoint. Эта возможность предоставляется API Microsoft 365 Copilot. Чтобы заземлить документы SharePoint, введите сайты или папки для подключения. Средство SharePoint использует встроенные возможности индексирования для улучшения процесса поиска и извлечения, включая интеллектуальную индексацию, обработку запросов и разбиение содержимого на сегменты.

Дополнительные сведения о делегированном доступе и сквозной аутентификации в Foundry см. в разделе Концепции управления удостоверениями агента в Microsoft Foundry.

Вместо того, чтобы разработчики требовали экспортировать содержимое SharePoint, создавать настраиваемый семантический индекс, управлять элементами управления и настраивать логику обновления, эта возможность автоматизирует весь конвейер извлечения. Он динамически индексирует документы, разбивает содержимое на значимые блоки и применяет расширенную обработку запросов для получения наиболее важных сведений. Используя тот же стек извлечения корпоративного уровня, который обеспечивает Microsoft 365 Copilot, эта функция гарантирует, что ответы ИИ-агента основаны на наиболее актуальном и контекстно релевантном содержимом.

Клиенты полагаются на безопасность данных в SharePoint для доступа, создания и совместного использования документов с гибким контролем доступа на уровне документов. Корпоративные функции, такие как передача удостоверений (On-Behalf-Of) и аутентификация, обеспечивают надлежащий контроль доступа. Конечные пользователи получают ответы, созданные из документов SharePoint, к которым у них есть разрешение на доступ. С помощью проверки подлинности OBO служба агента Foundry использует удостоверение конечного пользователя для авторизации и получения соответствующих SharePoint документов, создавая ответы, адаптированные для конкретных конечных пользователей.

Устранение неполадок

Проблема Причина Разрешение
AuthenticationError: AppOnly OBO tokens not supported by target service Использование удостоверения приложения вместо удостоверения пользователя Средство SharePoint требует идентификации пользователя (сквозная аутентификация). Не используйте проверку подлинности только для приложений.
Forbidden: Authorization Failed - User does not have valid license Отсутствует Microsoft 365 Copilot лицензия или модель оплаты по мере использования Назначьте пользователю лицензию Microsoft 365 Copilot или включите оплату по мере использования. См. предварительные требования.
401 или сбои проверки подлинности Попытка кросс-клиентского доступа Убедитесь, что пользователь в Foundry и Microsoft 365 находится в одном клиенте.
Средство не возвращает результаты Пользователь не имеет доступа к содержимому SharePoint Убедитесь, что пользователь имеет доступ на чтение к запрашиваемым сайтам и документам SharePoint.
Время медленного отклика Область поиска по большим документам Сузите область поиска, указав определенные сайты или библиотеки. Рекомендуется использовать более конкретные поисковые запросы.
Неполное извлечение документа Содержимое не индексировано Убедитесь, что содержимое SharePoint индексируется Поиск (Майкрософт). Недавно добавленному содержимому может потребоваться время для индексирования.
Resource not found Ошибки Недопустимый путь к сайту или библиотеке Убедитесь, что URL-адрес сайта и пути библиотеки SharePoint правильны и доступны пользователю.
Несогласованные результаты поиска Задержка синхронизации семантического индекса Дождитесь синхронизации семантического индекса. Для распространения больших изменений содержимого может потребоваться время. См. Семантическая индексация для Microsoft 365 Copilot.

Дальнейшие действия