Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Используйте клиентскую библиотеку AI Agents для выполнения следующих задач:
- Разработка агентов с помощью службы агента ИИ Azure, используя обширную экосистему моделей, инструментов и возможностей openAI, Майкрософт и других поставщиков LLM. Служба агента ИИ Azure позволяет создавать агенты для широкого спектра вариантов использования сгенерируемым ИИ.
- Заметка: Хотя этот пакет можно использовать независимо, мы рекомендуем использовать клиентскую библиотеку Azure AI Projects для расширения возможностей. Библиотека "Проекты" предоставляет упрощенный доступ к расширенным функциям, таким как создание агентов и управление ими, перечисление моделей ИИ, работа с наборами данных и управление индексами поиска, оценка производительности генеративного ИИ и включение трассировки OpenTelemetry.
Документация по продукту | Образцы | Упаковка (npm) | Справочная документация по API
Оглавление
- Начало работы
- Ключевые понятия
-
Примеры
-
Агенты
-
создание агента с помощью:
- Поиск файлов
- Интерпретатор кода
- заземления Bing
- Поиск по искусственному интеллекту Azure
- вызов функции
-
создание потока с помощью
- ресурса средства
- ресурса средства
-
Создание сообщения с помощью:
- вложения поиска файлов
- вложение интерпретатора кода
- Ввод изображения
- выполнение, создание потока и запуска или потоковая
- получение сообщения
- получение файла
- Удаление ресурса
-
создание агента с помощью:
-
Агенты
- Устранение неполадок
- участие
Начало работы
Предпосылка
Авторизация
-
Entra ID необходим для аутентификации клиента. Приложению требуется объект, реализующий интерфейс TokenCredential. Примеры кода здесь используют DefaultAzureCredential. Чтобы получить эту работу, вам потребуется:
- Роль
Contributor
. На портале Azure можно назначить роль с помощью вкладки "Управление доступом (IAM)" ресурса проекта Azure AI. Подробнее о назначении ролей можно узнать здесь. - установленной Azure CLI.
- Вы вошли в учетную запись Azure, выполнив
az login
. - Обратите внимание, что если у вас несколько подписок Azure, подписка, содержащая ресурс Проекта Azure AI, должна быть вашей подпиской по умолчанию. Запустите
az account list --output table
, чтобы вывести список всех подписок и увидеть, какой из них используется по умолчанию. Запуститеaz account set --subscription "Your Subscription ID or Name"
, чтобы изменить подписку по умолчанию.
- Роль
Установите пакет
npm install @azure/ai-agents @azure/identity
Основные понятия
Создание и проверка подлинности клиента
Он AgentsClient
используется для создания клиента. В настоящее время рекомендуется использовать AgentsClient через клиентскую библиотеку Azure AI Projects с помощью client.agents
.
Чтобы получить конечную точку вашего проекта, вы можете обратиться к документации. Ниже мы предположим, что переменная PROJECT_ENDPOINT
окружения содержит это значение.
import { AgentsClient } from "@azure/ai-agents";
import { DefaultAzureCredential } from "@azure/identity";
const projectEndpoint = process.env["PROJECT_ENDPOINT"] || "<project endpoint>";
const modelDeploymentName = process.env["MODEL_DEPLOYMENT_NAME"] || "gpt-4o";
const client = new AgentsClient(projectEndpoint, new DefaultAzureCredential());
Примеры
Агенты
Агенты в клиентской библиотеке проектов ИИ Azure предназначены для упрощения различных взаимодействий и операций в проектах ИИ. Они служат основными компонентами, которые управляют и выполняют задачи, используя различные средства и ресурсы для достижения конкретных целей. Ниже описана типичная последовательность взаимодействия с агентами. Дополнительные примеры агентов см. в примерах пакетов .
Создание агента
Ниже приведен пример создания агента:
const agent = await client.createAgent("gpt-4o", {
name: "my-agent",
instructions: "You are a helpful assistant",
});
Чтобы разрешить агентам доступ к ресурсам или пользовательским функциям, вам потребуются средства. Средства можно передать в createAgent
через аргументы tools
и toolResources
.
Для этого можно использовать ToolSet
:
import { ToolSet } from "@azure/ai-agents";
// Upload file for code interpreter tool
const filePath1 = "./data/syntheticCompanyQuarterlyResults.csv";
const fileStream1 = fs.createReadStream(filePath1);
const codeInterpreterFile = await client.files.upload(fileStream1, "assistants", {
fileName: "myLocalFile",
});
console.log(`Uploaded local file, file ID : ${codeInterpreterFile.id}`);
// Upload file for file search tool
const filePath2 = "./data/sampleFileForUpload.txt";
const fileStream2 = fs.createReadStream(filePath2);
const fileSearchFile = await client.files.upload(fileStream2, "assistants", {
fileName: "sampleFileForUpload.txt",
});
console.log(`Uploaded file, file ID: ${fileSearchFile.id}`);
// Create vector store for file search tool
const vectorStore = await client.vectorStores
.createAndPoll({
fileIds: [fileSearchFile.id],
})
.pollUntilDone();
// Create tool set
const toolSet = new ToolSet();
toolSet.addFileSearchTool([vectorStore.id]);
toolSet.addCodeInterpreterTool([codeInterpreterFile.id]);
// Create agent with tool set
const agent = await client.createAgent("gpt-4o", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: toolSet.toolDefinitions,
toolResources: toolSet.toolResources,
});
console.log(`Created agent, agent ID: ${agent.id}`);
Создание агента с помощью поиска файлов
Чтобы выполнить поиск по файлам агентом, сначала необходимо отправить файл, создать векторное хранилище и связать файл с векторным хранилищем. Ниже приведен пример:
import { ToolUtility } from "@azure/ai-agents";
const filePath = "./data/sampleFileForUpload.txt";
const localFileStream = fs.createReadStream(filePath);
const file = await client.files.upload(localFileStream, "assistants", {
fileName: "sampleFileForUpload.txt",
});
console.log(`Uploaded file, file ID: ${file.id}`);
const vectorStore = await client.vectorStores.create({
fileIds: [file.id],
name: "myVectorStore",
});
console.log(`Created vector store, vector store ID: ${vectorStore.id}`);
const fileSearchTool = ToolUtility.createFileSearchTool([vectorStore.id]);
const agent = await client.createAgent("gpt-4o", {
name: "File Search Agent",
instructions: "You are helpful agent that can help fetch data from files you know about.",
tools: [fileSearchTool.definition],
toolResources: fileSearchTool.resources,
});
console.log(`Created agent, agent ID : ${agent.id}`);
Создание агента с интерпретатором кода
Ниже приведен пример отправки файла и его использования для интерпретатора кода агентом:
import { ToolUtility } from "@azure/ai-agents";
const filePath = "./data/syntheticCompanyQuarterlyResults.csv";
const localFileStream = fs.createReadStream(filePath);
const localFile = await client.files.upload(localFileStream, "assistants", {
fileName: "localFile",
});
console.log(`Uploaded local file, file ID : ${localFile.id}`);
const codeInterpreterTool = ToolUtility.createCodeInterpreterTool([localFile.id]);
// Notice that CodeInterpreter must be enabled in the agent creation, otherwise the agent will not be able to see the file attachment
const agent = await client.createAgent("gpt-4o", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: [codeInterpreterTool.definition],
toolResources: codeInterpreterTool.resources,
});
console.log(`Created agent, agent ID: ${agent.id}`);
Создание агента с помощью Bing Grounding
Чтобы разрешить агенту выполнять поиск через API поиска Bing, вы используете ToolUtility.createBingGroundingTool()
вместе с подключением. Дополнительные сведения о заземлении с помощью поиска Bing см. здесь .
Ниже приведен пример:
import { ToolUtility } from "@azure/ai-agents";
const connectionId = process.env["AZURE_BING_CONNECTION_ID"] || "<connection-name>";
// Initialize agent bing tool with the connection id
const bingTool = ToolUtility.createBingGroundingTool([{ connectionId: connectionId }]);
// Create agent with the bing tool and process assistant run
const agent = await client.createAgent("gpt-4o", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: [bingTool.definition],
});
console.log(`Created agent, agent ID : ${agent.id}`);
Создание агента с помощью поиска ИИ Azure
Поиск ИИ Azure — это корпоративная система поиска для высокопроизводительных приложений. Он интегрируется со службой Azure OpenAI и Машинным обучением Azure, предлагая расширенные технологии поиска, такие как векторный поиск и полнотекстовый поиск. Идеально подходит для аналитики базы знаний, обнаружения информации и автоматизации
Ниже приведен пример интеграции службы "Поиск ИИ Azure":
import { ToolUtility } from "@azure/ai-agents";
const connectionName = process.env["AZURE_AI_SEARCH_CONNECTION_NAME"] || "<connection-name>";
// Initialize Azure AI Search tool
const azureAISearchTool = ToolUtility.createAzureAISearchTool(connectionName, "search-index", {
queryType: "simple",
topK: 3,
filter: "", // Add string here to filter results
indexConnectionId: connectionName,
indexName: "search-index",
});
// Create agent with the Azure AI search tool
const agent = await client.createAgent("gpt-4o", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: [azureAISearchTool.definition],
toolResources: azureAISearchTool.resources,
});
console.log(`Created agent, agent ID : ${agent.id}`);
Создание агента с вызовом функции
Вы можете улучшить агенты, определив функции обратного вызова в качестве инструментов функции. Их можно предоставить для createAgent
с помощью сочетания tools
и toolResources
. Только определения и описания функций предоставляются для createAgent
без реализации.
Run
или event handler of stream
вызовет состояние requires_action
на основе определений функций. Код должен обрабатывать это состояние и вызывать соответствующие функции.
Ниже приведен пример:
import {
FunctionToolDefinition,
ToolUtility,
RequiredToolCall,
ToolOutput,
} from "@azure/ai-agents";
class FunctionToolExecutor {
private functionTools: {
func: Function;
definition: FunctionToolDefinition;
}[];
constructor() {
this.functionTools = [
{
func: this.getUserFavoriteCity,
...ToolUtility.createFunctionTool({
name: "getUserFavoriteCity",
description: "Gets the user's favorite city.",
parameters: {},
}),
},
{
func: this.getCityNickname,
...ToolUtility.createFunctionTool({
name: "getCityNickname",
description: "Gets the nickname of a city, e.g. 'LA' for 'Los Angeles, CA'.",
parameters: {
type: "object",
properties: {
location: { type: "string", description: "The city and state, e.g. Seattle, Wa" },
},
},
}),
},
{
func: this.getWeather,
...ToolUtility.createFunctionTool({
name: "getWeather",
description: "Gets the weather for a location.",
parameters: {
type: "object",
properties: {
location: { type: "string", description: "The city and state, e.g. Seattle, Wa" },
unit: { type: "string", enum: ["c", "f"] },
},
},
}),
},
];
}
private getUserFavoriteCity(): {} {
return { location: "Seattle, WA" };
}
private getCityNickname(_location: string): {} {
return { nickname: "The Emerald City" };
}
private getWeather(_location: string, unit: string): {} {
return { weather: unit === "f" ? "72f" : "22c" };
}
public invokeTool(toolCall: RequiredToolCall & FunctionToolDefinition): ToolOutput | undefined {
console.log(`Function tool call - ${toolCall.function.name}`);
const args: any[] = [];
if (toolCall.function.parameters) {
try {
const params = JSON.parse(toolCall.function.parameters);
for (const key in params) {
if (Object.prototype.hasOwnProperty.call(params, key)) {
args.push(params[key]);
}
}
} catch (error) {
console.error(`Failed to parse parameters: ${toolCall.function.parameters}`, error);
return undefined;
}
}
// Create a mapping of function names to their implementations
const functionMap = new Map(
this.functionTools.map((tool) => [tool.definition.function.name, tool.func]),
);
const result = functionMap.get(toolCall.function.name)?.(...args);
return result
? {
toolCallId: toolCall.id,
output: JSON.stringify(result),
}
: {
toolCallId: toolCall.id,
output: JSON.stringify({
error: `No matching tool found for function: ${toolCall.function.name}`,
}),
};
}
public getFunctionDefinitions(): FunctionToolDefinition[] {
return this.functionTools.map((tool) => {
return tool.definition;
});
}
}
const functionToolExecutor = new FunctionToolExecutor();
const functionTools = functionToolExecutor.getFunctionDefinitions();
const agent = await client.createAgent("gpt-4o", {
name: "my-agent",
instructions:
"You are a weather bot. Use the provided functions to help answer questions. Customize your responses to the user's preferences as much as possible and use friendly nicknames for cities whenever possible.",
tools: functionTools,
});
console.log(`Created agent, agent ID: ${agent.id}`);
Создание агента с помощью OpenAPI
Спецификации OpenAPI описывают операции REST с определенной конечной точкой. Пакет SDK агентов может считывать спецификацию OpenAPI, создавать функцию из нее и вызывать эту функцию в конечную точку REST без дополнительного выполнения на стороне клиента. Ниже приведен пример создания средства OpenAPI (с помощью анонимной проверки подлинности):
import { ToolUtility } from "@azure/ai-agents";
// Read in OpenApi spec
const filePath = "./data/weatherOpenApi.json";
const openApiSpec = JSON.parse(fs.readFileSync(filePath, "utf-8"));
// Define OpenApi function
const openApiFunction = {
name: "getWeather",
spec: openApiSpec,
description: "Retrieve weather information for a location",
auth: {
type: "anonymous",
},
default_params: ["format"], // optional
};
// Create OpenApi tool
const openApiTool = ToolUtility.createOpenApiTool(openApiFunction);
// Create agent with OpenApi tool
const agent = await client.createAgent("gpt-4o", {
name: "myAgent",
instructions: "You are a helpful agent",
tools: [openApiTool.definition],
});
console.log(`Created agent, agent ID: ${agent.id}`);
Создание потока
Для каждого сеанса или беседы требуется поток. Ниже приведен пример:
const thread = await client.threads.create();
console.log(`Created thread, thread ID: ${thread.id}`);
Создание потока с помощью ресурса средства
В некоторых сценариях может потребоваться назначить определенные ресурсы отдельным потокам. Для этого укажите аргумент toolResources
для threads.create
. В следующем примере вы создадите векторное хранилище и отправьте файл, включите агент для поиска файлов с помощью аргумента tools
, а затем свяжите файл с потоком с помощью аргумента toolResources
.
import { ToolUtility } from "@azure/ai-agents";
const filePath = "./data/syntheticCompanyQuarterlyResults.csv";
const localFileStream = fs.createReadStream(filePath);
const file = await client.files.upload(localFileStream, "assistants", {
fileName: "sample_file_for_upload.csv",
});
console.log(`Uploaded file, ID: ${file.id}`);
const vectorStore = await client.agents.vectorStores.create()({
fileIds: [file.id],
});
console.log(`Created vector store, ID: ${vectorStore.id}`);
const fileSearchTool = ToolUtility.createFileSearchTool([vectorStore.id]);
const agent = await client.agents.createAgent("gpt-4o", {
name: "myAgent",
instructions: "You are helpful agent that can help fetch data from files you know about.",
tools: [fileSearchTool.definition],
});
console.log(`Created agent, agent ID : ${agent.id}`);
// Create thread with file resources.
// If the agent has multiple threads, only this thread can search this file.
const thread = await client.threads.create({ toolResources: fileSearchTool.resources });
Вывод списка потоков
Чтобы получить список всех потоков, подключенных к данному агенту, используйте threads.list
:
const threads = client.threads.list();
console.log(`Threads for agent ${agent.id}:`);
for await (const t of threads) {
console.log(`Thread ID: ${t.id}`);
console.log(`Created at: ${t.createdAt}`);
console.log(`Metadata: ${t.metadata}`);
console.log(`---- `);
}
Создание сообщения
Чтобы создать сообщение для помощника по обработке, передайте user
как role
и вопрос в виде content
:
const message = await client.messages.create(thread.id, "user", "hello, world!");
console.log(`Created message, message ID: ${message.id}`);
Создание сообщения с вложением поиска файлов
Чтобы вложить файл в сообщение для поиска содержимого, используйте ToolUtility.createFileSearchTool()
и аргумент attachments
:
import { ToolUtility } from "@azure/ai-agents";
const fileSearchTool = ToolUtility.createFileSearchTool();
const message = await client.messages.create(
thread.id,
"user",
"What feature does Smart Eyewear offer?",
{
attachments: [
{
fileId: file.id,
tools: [fileSearchTool.definition],
},
],
},
);
Создание сообщения с вложением интерпретатора кода
Чтобы подключить файл к сообщению для анализа данных, используйте ToolUtility.createCodeInterpreterTool()
и аргумент attachment
.
Ниже приведен пример:
import { ToolUtility } from "@azure/ai-agents";
// notice that CodeInterpreter must be enabled in the agent creation,
// otherwise the agent will not be able to see the file attachment for code interpretation
const codeInterpreterTool = ToolUtility.createCodeInterpreterTool();
const agent = await client.agents.createAgent("gpt-4o", {
name: "my-assistant",
instructions: "You are helpful assistant",
tools: [codeInterpreterTool.definition],
});
console.log(`Created agent, agent ID: ${agent.id}`);
const thread = await client.threads.create();
console.log(`Created thread, thread ID: ${thread.id}`);
const message = await client.messages.create(
thread.id,
"user",
"Could you please create a bar chart in the TRANSPORTATION sector for the operating profit from the uploaded CSV file and provide the file to me?",
{
attachments: [
{
fileId: file.id,
tools: [codeInterpreterTool.definition],
},
],
},
);
console.log(`Created message, message ID: ${message.id}`);
Создание сообщения с помощью входных данных изображения
Вы можете отправлять сообщения агентам Azure с входными данными изображений следующими способами:
- Использование изображения, хранящегося в качестве отправленного файла
- Использование общедоступного образа, доступного по URL-адресу
- Использование строки изображения в кодировке Base64
В следующем примере показан метод base64:
Создание сообщения с вводом изображения в кодировке Base64
function imageToBase64DataUrl(imagePath: string, mimeType: string): string {
try {
// Read the image file as binary
const imageBuffer = fs.readFileSync(imagePath);
// Convert to base64
const base64Data = imageBuffer.toString("base64");
// Format as a data URL
return `data:${mimeType};base64,${base64Data}`;
} catch (error) {
console.error(`Error reading image file at ${imagePath}:`, error);
throw error;
}
}
// Convert your image file to base64 format
const filePath = "./data/image_file.png";
const imageDataUrl = imageToBase64DataUrl(filePath, "image/png");
// Create a message with both text and image content
console.log("Creating message with image content...");
const inputMessage = "Hello, what is in the image?";
const content = [
{
type: "text",
text: inputMessage,
},
{
type: "image_url",
image_url: {
url: imageDataUrl,
detail: "high",
},
},
];
const message = await client.messages.create(thread.id, "user", content);
console.log(`Created message, message ID: ${message.id}`);
Создание запуска, Run_and_Process или stream
Ниже приведен пример runs.create
и опроса до завершения выполнения:
// Create and poll a run
console.log("Creating run...");
const run = await client.runs.createAndPoll(thread.id, agent.id, {
pollingOptions: {
intervalInMs: 2000,
},
onResponse: (response): void => {
console.log(`Received response with status: ${response.parsedBody.status}`);
},
});
console.log(`Run finished with status: ${run.status}`);
Чтобы провести опрос пакета SDK от вашего имени, используйте метод createThreadAndRun
.
Ниже приведен пример:
const run = await client.runs.createThreadAndRun(agent.id, {
thread: {
messages: [
{
role: "user",
content: "hello, world!",
},
],
},
});
При потоковой передаче опросы также не должны рассматриваться.
Ниже приведен пример:
const streamEventMessages = await client.runs.create(thread.id, agent.id).stream();
Обработку событий можно выполнить следующим образом:
import { RunStreamEvent, MessageStreamEvent, ErrorEvent, DoneEvent } from "@azure/ai-agents";
const streamEventMessages = await client.runs.create(thread.id, agent.id).stream();
for await (const eventMessage of streamEventMessages) {
switch (eventMessage.event) {
case RunStreamEvent.ThreadRunCreated:
console.log(`ThreadRun status: ${eventMessage.data.status}`);
break;
case MessageStreamEvent.ThreadMessageDelta:
{
const messageDelta = eventMessage.data;
messageDelta.delta.content.forEach((contentPart) => {
if (contentPart.type === "text") {
const textContent = contentPart;
const textValue = textContent.text?.value || "No text";
console.log(`Text delta received:: ${textValue}`);
}
});
}
break;
case RunStreamEvent.ThreadRunCompleted:
console.log("Thread Run Completed");
break;
case ErrorEvent.Error:
console.log(`An error occurred. Data ${eventMessage.data}`);
break;
case DoneEvent.Done:
console.log("Stream completed.");
break;
}
}
Получение сообщения
Чтобы получить сообщения от агентов, используйте следующий пример:
const messagesIterator = client.messages.list(thread.id);
const allMessages = [];
for await (const m of messagesIterator) {
allMessages.push(m);
}
console.log("Messages:", allMessages);
// The messages are following in the reverse order,
// we will iterate them and output only text contents.
const messages = await client.messages.list(thread.id, {
order: "asc",
});
for await (const dataPoint of messages) {
const textContent = dataPoint.content.find((item) => item.type === "text");
if (textContent && "text" in textContent) {
console.log(`${dataPoint.role}: ${textContent.text.value}`);
}
}
Получение файла
Файлы, отправленные агентами, не могут быть извлечены обратно. Если ваш вариант использования должен получить доступ к содержимому файла, отправленного агентами, рекомендуется сохранить дополнительную копию, доступную приложению. Однако файлы, созданные агентами, извлекаются files.getContent
.
Ниже приведен пример получения идентификаторов файлов из сообщений:
import { isOutputOfType, MessageTextContent, MessageImageFileContent } from "@azure/ai-agents";
const messagesIterator = client.messages.list(thread.id);
const allMessages = [];
for await (const m of messagesIterator) {
allMessages.push(m);
}
console.log("Messages:", allMessages);
// Get most recent message from the assistant
const assistantMessage = allMessages.find((msg) => msg.role === "assistant");
if (assistantMessage) {
const textContent = assistantMessage.content.find((content) =>
isOutputOfType<MessageTextContent>(content, "text"),
) as MessageTextContent;
if (textContent) {
console.log(`Last message: ${textContent.text.value}`);
}
}
const imageFile = (allMessages[0].content[0] as MessageImageFileContent).imageFile;
const imageFileName = (await client.agents.files.get(imageFile.fileId)).filename;
const fileContent = await (await client.files.getContent(imageFile.fileId).asNodeStream()).body;
if (fileContent) {
const chunks: Buffer[] = [];
for await (const chunk of fileContent) {
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
}
const buffer = Buffer.concat(chunks);
fs.writeFileSync(imageFileName, buffer);
} else {
console.error("Failed to retrieve file content: fileContent is undefined");
}
console.log(`Saved image file to: ${imageFileName}`);
Слеза
Чтобы удалить ресурсы после выполнения задач, используйте следующие функции:
await client.vectorStores.delete(vectorStore.id);
console.log(`Deleted vector store, vector store ID: ${vectorStore.id}`);
await client.files.delete(file.id);
console.log(`Deleted file, file ID : ${file.id}`);
await client.deleteAgent(agent.id);
console.log(`Deleted agent, agent ID: ${agent.id}`);
Устранение неполадок
Исключения
Клиентские методы, которые вызывают службы, вызывают RestError для ответа кода состояния HTTP без успешного выполнения из службы.
code
исключения будет содержать код состояния HTTP-ответа.
error.message
исключения содержит подробное сообщение, которое может оказаться полезным при диагностике проблемы:
import { RestError } from "@azure/core-rest-pipeline";
try {
const thread = await client.threads.create();
} catch (e) {
if (e instanceof RestError) {
console.log(`Status code: ${e.code}`);
console.log(e.message);
} else {
console.error(e);
}
}
Например, если указать неправильные учетные данные:
Status code: 401 (Unauthorized)
Operation returned an invalid status 'Unauthorized'
Создание отчетов о проблемах
Чтобы сообщить о проблемах с клиентской библиотекой или запросить дополнительные функции, откройте проблему GitHub здесь
Дальнейшие шаги
Просмотрите папку примеров пакетов , содержащую полностью запущенный код.
Вклад
Этот проект приветствует взносы и предложения. Большинство вкладов требуют, чтобы вы согласились с соглашением о лицензии участника (CLA), заявив, что у вас есть право, и на самом деле, предоставьте нам права на использование вашего вклада. Для получения подробных сведений посетите веб-страницу https://cla.microsoft.com.
При отправке запроса на вытягивание бот CLA автоматически определяет, нужно ли предоставить соглашение об уровне обслуживания и украсить pr соответствующим образом (например, метка, комментарий). Просто следуйте инструкциям, предоставленным ботом. Это необходимо сделать только один раз во всех репозиториях с помощью нашего CLA.
В рамках этого проекта действуют правила поведения в отношении продуктов с открытым исходным кодом Майкрософт. Дополнительные сведения см. в разделе "Часто задаваемые вопросы о поведении" или [email protected] с дополнительными вопросами или комментариями.
Azure SDK for JavaScript