Azure AI Projects-Clientbibliothek für JavaScript – Version 1.0.0-beta.2
Verwenden Sie die AI Projects-Clientbibliothek (in der Vorschau) für:
- Verbindungen in Ihrem Azure AI Foundry-Projekt aufzählen und Verbindungseigenschaften abrufen. Rufen Sie beispielsweise die Ableitungsenendpunkt-URL und Anmeldeinformationen ab, die Ihrer Azure OpenAI-Verbindung zugeordnet sind.
- Entwickeln von Agents mit dem Azure AI Agent Service, wobei ein umfangreiches Ökosystem von Modellen, Tools und Funktionen von OpenAI, Microsoft und anderen LLM-Anbietern genutzt wird. Der Azure AI-Agent-Dienst ermöglicht das Erstellen von Agents für eine breite Palette von generativen KI-Anwendungsfällen. Das Paket befindet sich derzeit in der privaten Vorschau.
- OpenTelemetry-Ablaufverfolgungaktivieren.
Inhaltsverzeichnis
- Erste Schritte
- Schlüsselkonzepte
-
Beispiele
- Auflisten von Verbindungen
-
Agents (Vorschau)
- Erstellen eines Agent- mit:
- Erstellen von Thread- mit
- Nachricht erstellen mit:
- ausführen Ausführen, Erstellen von Thread und Ausführen oder Stream-
- Nachricht abrufen
- Datei abrufen
- Zerreißen durch Löschen von Ressourcen-
- Ablaufverfolgungs-
- Ablaufverfolgungs-
- Problembehandlung für
- Beitragender
Erste Schritte
Voraussetzung
- LTS-Versionen von Node.js
- Ein Azure-Abonnement.
- Ein Projekt in Azure AI Foundry.
- Die Projektverbindungszeichenfolge. Sie finden Sie auf der Übersichtsseite ihres Azure AI Foundry-Projekts unter "Projektdetails". Im Folgenden wird davon ausgegangen, dass die Umgebungsvariable
AZURE_AI_PROJECTS_CONNECTION_STRING
für diesen Wert definiert wurde. - Entra-ID ist erforderlich, um den Client zu authentifizieren. Ihre Anwendung benötigt ein Objekt, das die TokenCredential Schnittstelle implementiert. Codebeispiele verwenden hier DefaultAzureCredential. Um dies zu erreichen, benötigen Sie Folgendes:
- Die rolle
Contributor
. Die zugewiesene Rolle kann über die Registerkarte "Access Control (IAM)" Ihrer Azure AI-Projektressource im Azure-Portal erfolgen. - Azure CLI installiert.
- Sie sind bei Ihrem Azure-Konto angemeldet, indem Sie
az login
ausführen. - Beachten Sie, dass das Abonnement, das Ihre Azure AI Project-Ressource enthält, Ihr Standardabonnement sein muss, wenn Sie über mehrere Azure-Abonnements verfügen. Führen Sie
az account list --output table
aus, um ihr gesamtes Abonnement auflisten und zu sehen, welche Standardeinstellung ist. Führen Sieaz account set --subscription "Your Subscription ID or Name"
aus, um Ihr Standardabonnement zu ändern.
- Die rolle
Installieren des Pakets
npm install @azure/ai-projects
Schlüsselkonzepte
Erstellen und Authentifizieren des Clients
Die Klassenfactorymethode fromConnectionString
wird verwendet, um den Client zu erstellen. So erstellen Sie einen Client:
import { AIProjectsClient } from "@azure/ai-projects";
import { DefaultAzureCredential } from "@azure/identity";
import "dotenv/config";
const connectionString = process.env["AZURE_AI_PROJECTS_CONNECTION_STRING"] || "<connectionString>";
const client = AIProjectsClient.fromConnectionString(
connectionString,
new DefaultAzureCredential(),
);
Beispiele
Aufzählen von Verbindungen
Ihr Azure AI Foundry-Projekt verfügt über ein "Management Center". Wenn Sie ihn eingeben, wird unter Ihrem Projekt eine Registerkarte mit dem Namen "Verbundene Ressourcen" angezeigt. Mit den .connections
Vorgängen auf dem Client können Sie die Verbindungen auflisten und Verbindungseigenschaften abrufen. Zu den Verbindungseigenschaften gehören u. a. die Ressourcen-URL und die Authentifizierungsanmeldeinformationen.
Nachfolgend finden Sie Codebeispiele für die Verbindungsvorgänge. Vollständige Beispiele finden Sie im Ordner "Connections" in den [Paketbeispielen][Beispiele].
Abrufen von Eigenschaften aller Verbindungen
So listen Sie die Eigenschaften aller Verbindungen im Azure AI Foundry-Projekt auf:
const connections = await client.connections.listConnections();
for (const connection of connections) {
console.log(connection);
}
Abrufen von Eigenschaften aller Verbindungen eines bestimmten Typs
So listen Sie die Eigenschaften von Verbindungen eines bestimmten Typs auf (hier Azure OpenAI):
const connections = await client.connections.listConnections({ category: "AzureOpenAI" });
for (const connection of connections) {
console.log(connection);
}
Abrufen von Eigenschaften einer Verbindung anhand des Verbindungsnamens
So rufen Sie die Verbindungseigenschaften einer Verbindung mit dem Namen connectionName
ab:
const connection = await client.connections.getConnection("connectionName");
console.log(connection);
So rufen Sie die Verbindungseigenschaften mit ihren Authentifizierungsanmeldeinformationen ab:
const connection = await client.connections.getConnectionWithSecrets("connectionName");
console.log(connection);
Agents (Vorschau)
Agents in der Azure AI Projects-Clientbibliothek wurden entwickelt, um verschiedene Interaktionen und Vorgänge in Ihren KI-Projekten zu erleichtern. Sie dienen als die Kernkomponenten, die Aufgaben verwalten und ausführen, und nutzen verschiedene Tools und Ressourcen, um bestimmte Ziele zu erreichen. In den folgenden Schritten wird die typische Sequenz für die Interaktion mit Agents beschrieben. Weitere Agent-Beispiele finden Sie im Ordner "Agents" in den [Paketbeispielen][Beispiele]
Agenten werden aktiv entwickelt. Ein Registrierungsformular für private Vorschau wird in Kürze verfügbar sein.
Agent erstellen
Hier ist ein Beispiel für das Erstellen eines Agents:
const agent = await client.agents.createAgent("gpt-4o", {
name: "my-agent",
instructions: "You are a helpful assistant",
});
Damit Agents auf Ihre Ressourcen oder benutzerdefinierten Funktionen zugreifen können, benötigen Sie Tools. Sie können Tools an createAgent
über die Argumente tools
und toolResources
übergeben.
Dazu können Sie ToolSet
verwenden:
const toolSet = new ToolSet();
toolSet.addFileSearchTool([vectorStore.id]);
toolSet.addCodeInterpreterTool([codeInterpreterFile.id]);
// Create agent with tool set
const agent = await client.agents.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}`);
Agent mit Dateisuche erstellen
Zum Ausführen der Dateisuche durch einen Agent müssen wir zuerst eine Datei hochladen, einen Vektorspeicher erstellen und die Datei dem Vektorspeicher zuordnen. Hier ist ein Beispiel:
const localFileStream = fs.createReadStream("sample_file_for_upload.txt");
const file = await client.agents.uploadFile(localFileStream, "assistants", {
fileName: "sample_file_for_upload.txt",
});
console.log(`Uploaded file, ID: ${file.id}`);
const vectorStore = await client.agents.createVectorStore({
fileIds: [file.id],
name: "my_vector_store",
});
console.log(`Created vector store, ID: ${vectorStore.id}`);
const fileSearchTool = ToolUtility.createFileSearchTool([vectorStore.id]);
const agent = await client.agents.createAgent("gpt-4o", {
name: "SDK Test Agent - Retrieval",
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}`);
Agent mit Codedolmetscher erstellen
Nachfolgend sehen Sie ein Beispiel zum Hochladen einer Datei und verwenden sie für Codedolmetscher von einem Agent:
const fileStream = fs.createReadStream("nifty_500_quarterly_results.csv");
const fFile = await client.agents.uploadFile(fileStream, "assistants", {
fileName: "nifty_500_quarterly_results.csv",
});
console.log(`Uploaded local file, file ID : ${file.id}`);
const codeInterpreterTool = ToolUtility.createCodeInterpreterTool([file.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.agents.createAgent("gpt-4o-mini", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: [codeInterpreterTool.definition],
toolResources: codeInterpreterTool.resources,
});
console.log(`Created agent, agent ID: ${agent.id}`);
Agent mit Bing Grounding erstellen
Damit Ihr Agent die Suche über die Bing-Such-API durchführen kann, verwenden Sie ToolUtility.createConnectionTool()
zusammen mit einer Verbindung.
Hier ist ein Beispiel:
const bingGroundingConnectionId = "<bingGroundingConnectionId>";
const bingTool = ToolUtility.createConnectionTool(connectionToolType.BingGrounding, [
bingGroundingConnectionId,
]);
const agent = await client.agents.createAgent("gpt-4-0125-preview", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: [bingTool.definition],
});
console.log(`Created agent, agent ID : ${agent.id}`);
Agent mit Azure AI Search erstellen
Azure AI Search ist ein Unternehmenssuchsystem für leistungsstarke Anwendungen. Es ist in Azure OpenAI Service und Azure Machine Learning integriert und bietet erweiterte Suchtechnologien wie Vektorsuche und Volltextsuche. Ideal für Wissensbasiseinblicke, Informationsermittlung und Automatisierung
Hier ist ein Beispiel für die Integration von Azure AI Search:
const cognitiveServicesConnectionName = "<cognitiveServicesConnectionName>";
const cognitiveServicesConnection = await client.connections.getConnection(
cognitiveServicesConnectionName,
);
const azureAISearchTool = ToolUtility.createAzureAISearchTool(
cognitiveServicesConnection.id,
cognitiveServicesConnection.name,
);
// Create agent with the Azure AI search tool
const agent = await client.agents.createAgent("gpt-4-0125-preview", {
name: "my-agent",
instructions: "You are a helpful agent",
tools: [azureAISearchTool.definition],
toolResources: azureAISearchTool.resources,
});
console.log(`Created agent, agent ID : ${agent.id}`);
Agent mit Funktionsaufruf erstellen
Sie können Ihre Agents verbessern, indem Sie Rückruffunktionen als Funktionstools definieren. Diese können createAgent
über die Kombination aus tools
und toolResources
bereitgestellt werden. Nur die Funktionsdefinitionen und Beschreibungen werden ohne die Implementierungen für createAgent
bereitgestellt. Das Run
oder event handler of stream
löst basierend auf den Funktionsdefinitionen einen requires_action
Status aus. Ihr Code muss diesen Status behandeln und die entsprechenden Funktionen aufrufen.
Hier ist ein Beispiel:
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: RequiredToolCallOutput & FunctionToolDefinitionOutput): ToolOutput | undefined {
console.log(`Function tool call - ${toolCall.function.name}`);
const args = [];
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;
}
}
const result = this.functionTools.find((tool) => tool.definition.function.name === toolCall.function.name)?.func(...args);
return result ? {
toolCallId: toolCall.id,
output: JSON.stringify(result)
} : undefined;
}
public getFunctionDefinitions(): FunctionToolDefinition[] {
return this.functionTools.map(tool => {return tool.definition});
}
}
const functionToolExecutor = new FunctionToolExecutor();
const functionTools = functionToolExecutor.getFunctionDefinitions();
const agent = await client.agents.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}`);
Thread erstellen
Für jede Sitzung oder Unterhaltung ist ein Thread erforderlich. Hier ist ein Beispiel:
const thread = await client.agents.createThread();
Thread mit Toolressource erstellen
In einigen Szenarien müssen Sie möglicherweise einzelnen Threads bestimmte Ressourcen zuweisen. Um dies zu erreichen, stellen Sie das toolResources
Argument für createThread
bereit. Im folgenden Beispiel erstellen Sie einen Vektorspeicher und laden eine Datei hoch, aktivieren einen Agent für die Dateisuche mithilfe des arguments tools
, und ordnen Sie die Datei dann dem Thread mithilfe des Arguments toolResources
zu.
const localFileStream = fs.createReadStream("sample_file_for_upload.txt");
const file = await client.agents.uploadFile(localFileStream, "assistants", {
fileName: "sample_file_for_upload.txt",
});
console.log(`Uploaded file, ID: ${file.id}`);
const vectorStore = await client.agents.createVectorStore({
fileIds: [file.id],
name: "my_vector_store",
});
console.log(`Created vector store, ID: ${vectorStore.id}`);
const fileSearchTool = ToolUtility.createFileSearchTool([vectorStore.id]);
const agent = await client.agents.createAgent("gpt-4o", {
name: "SDK Test Agent - Retrieval",
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.agents.createThread({ toolResources: fileSearchTool.resources });
Nachricht erstellen
Um eine Nachricht zu erstellen, die der Assistent verarbeiten soll, übergeben Sie user
als role
und eine Frage als content
:
const message = await client.agents.createMessage(thread.id, {
role: "user",
content: "hello, world!",
});
Nachricht mit Dateisuchanlage erstellen
Wenn Sie eine Datei an eine Nachricht für die Inhaltssuche anfügen möchten, verwenden Sie ToolUtility.createFileSearchTool()
und das argument attachments
:
const fileSearchTool = ToolUtility.createFileSearchTool();
const message = await client.agents.createMessage(thread.id, {
role: "user",
content: "What feature does Smart Eyewear offer?",
attachments: {
fileId: file.id,
tools: [fileSearchTool.definition],
},
});
Nachricht mit Codedolmetscheranlage erstellen
Wenn Sie eine Datei an eine Nachricht für die Datenanalyse anfügen möchten, verwenden Sie ToolUtility.createCodeInterpreterTool()
und das argument attachment
.
Hier ist ein Beispiel:
// 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-4-1106-preview", {
name: "my-assistant",
instructions: "You are helpful assistant",
tools: [codeInterpreterTool.definition],
});
console.log(`Created agent, agent ID: ${agent.id}`);
const thread = client.agents.createThread();
console.log(`Created thread, thread ID: ${thread.id}`);
const message = await client.agents.createMessage(thread.id, {
role: "user",
content:
"Could you please create bar chart in TRANSPORTATION sector for the operating profit from the uploaded csv file and provide file to me?",
attachments: {
fileId: file.id,
tools: [codeInterpreterTool.definition],
},
});
console.log(`Created message, message ID: ${message.id}`);
Erstellen von "Ausführen", "Run_and_Process" oder "Stream"
Nachfolgend sehen Sie ein Beispiel für createRun
und Abfragen, bis die Ausführung abgeschlossen ist:
let run = await client.agents.createRun(thread.id, agent.id);
// Poll the run as long as run status is queued or in progress
while (
run.status === "queued" ||
run.status === "in_progress" ||
run.status === "requires_action"
) {
// Wait for a second
await new Promise((resolve) => setTimeout(resolve, 1000));
run = await client.agents.getRun(thread.id, run.id);
}
Verwenden Sie die createThreadAndRun
-Methode, um die SDK-Umfrage in Ihrem Auftrag zu erhalten.
Hier ist ein Beispiel:
const run = await client.agents.createThreadAndRun(thread.id, agent.id);
Bei Streaming müssen Umfragen auch nicht berücksichtigt werden.
Hier ist ein Beispiel:
const streamEventMessages = await client.agents.createRun(thread.id, agent.id).stream();
Die Ereignisbehandlung kann wie folgt erfolgen:
for await (const eventMessage of streamEventMessages) {
switch (eventMessage.event) {
case RunStreamEvent.ThreadRunCreated:
console.log(`ThreadRun status: ${(eventMessage.data as ThreadRunOutput).status}`)
break;
case MessageStreamEvent.ThreadMessageDelta:
{
const messageDelta = eventMessage.data as MessageDeltaChunk;
messageDelta.delta.content.forEach((contentPart) => {
if (contentPart.type === "text") {
const textContent = contentPart as MessageDeltaTextContent
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;
}
}
Nachricht abrufen
Verwenden Sie das folgende Beispiel, um Nachrichten von Agents abzurufen:
const messages = await client.agents.listMessages(thread.id);
// The messages are following in the reverse order,
// we will iterate them and output only text contents.
for (const dataPoint of messages.data.reverse()) {
const lastMessageContent: MessageContentOutput = dataPoint.content[dataPoint.content.length - 1];
console.log( lastMessageContent);
if (isOutputOfType<MessageTextContentOutput>(lastMessageContent, "text")) {
console.log(`${dataPoint.role}: ${(lastMessageContent as MessageTextContentOutput).text.value}`);
}
}
Datei abrufen
Von Agents hochgeladene Dateien können nicht zurückgefragt werden. Wenn Ihr Anwendungsfall auf den von den Agents hochgeladenen Dateiinhalt zugreifen muss, wird empfohlen, eine zusätzliche Kopie von Ihrer Anwendung zugänglich zu halten. Von Agents generierte Dateien können jedoch von getFileContent
abgerufen werden.
Hier ist ein Beispiel zum Abrufen von Datei-IDs aus Nachrichten:
const messages = await client.agents.listMessages(thread.id);
const imageFile = (messages.data[0].content[0] as MessageImageFileContentOutput).imageFile;
const imageFileName = (await client.agents.getFile(imageFile.fileId)).filename;
const fileContent = await (await client.agents.getFileContent(imageFile.fileId).asNodeStream()).body;
if (fileContent) {
const chunks: Buffer[] = [];
for await (const chunk of fileContent) {
chunks.push(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}`);
Teardown
Verwenden Sie die folgenden Funktionen, um Ressourcen nach Abschluss von Vorgängen zu entfernen:
await client.agents.deleteVectorStore(vectorStore.id);
console.log(`Deleted vector store, vector store ID: ${vectorStore.id}`);
await client.agents.deleteFile(file.id);
console.log(`Deleted file, file ID: ${file.id}`);
client.agents.deleteAgent(agent.id);
console.log(`Deleted agent, agent ID: ${agent.id}`);
Pause
Sie können ihrem Azure AI Foundry-Projekt eine Azure-Ressource "Application Insights" hinzufügen. Sehen Sie sich die Registerkarte "Ablaufverfolgung" in Ihrem Studio an. Wenn eine aktiviert wurde, können Sie die Verbindungszeichenfolge für Application Insights abrufen, Ihre Agents konfigurieren und den vollständigen Ausführungspfad über Azure Monitor beobachten. In der Regel sollten Sie die Ablaufverfolgung starten, bevor Sie einen Agent erstellen.
Installation
Stellen Sie sicher, dass Sie OpenTelemetry und das Azure SDK-Ablaufverfolgungs-Plug-In über
npm install @opentelemetry/api \
@opentelemetry/instrumentation \
@opentelemetry/sdk-trace-node \
@azure/opentelemetry-instrumentation-azure-sdk \
@azure/monitor-opentelemetry-exporter
Außerdem benötigen Sie einen Exporter, um Telemetrie an Ihr Observability-Back-End zu senden. Sie können Ablaufverfolgungen in der Konsole drucken oder einen lokalen Viewer wie Aspire Dashboardverwenden.
Um eine Verbindung mit dem Aspire Dashboard oder einem anderen mit OpenTelemetry kompatiblen Back-End herzustellen, installieren Sie OTLP-Exporter:
npm install @opentelemetry/exporter-trace-otlp-proto \
@opentelemetry/exporter-metrics-otlp-proto
Ablaufverfolgungsbeispiel
Hier ist ein Codebeispiel, das oben createAgent
eingeschlossen werden soll:
import { trace } from "@opentelemetry/api";
import { AzureMonitorTraceExporter } from "@azure/monitor-opentelemetry-exporter"
import {
ConsoleSpanExporter,
NodeTracerProvider,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-node";
const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
provider.register();
const tracer = trace.getTracer("Agents Sample", "1.0.0");
const client = AIProjectsClient.fromConnectionString(
connectionString || "", new DefaultAzureCredential()
);
if (!appInsightsConnectionString) {
appInsightsConnectionString = await client.telemetry.getConnectionString();
}
if (appInsightsConnectionString) {
const exporter = new AzureMonitorTraceExporter({
connectionString: appInsightsConnectionString
});
provider.addSpanProcessor(new SimpleSpanProcessor(exporter));
}
await tracer.startActiveSpan("main", async (span) => {
client.telemetry.updateSettings({enableContentRecording: true})
// ...
Fehlerbehebung
Ausnahmen
Clientmethoden, die Dienstaufrufe ausführen, lösen eine RestError- für eine nicht erfolgreiche HTTP-Statuscodeantwort des Diensts aus. Die code
der Ausnahme enthält den HTTP-Antwortstatuscode. Die error.message
der Ausnahme enthält eine detaillierte Meldung, die bei der Diagnose des Problems hilfreich sein kann:
import { RestError } from "@azure/core-rest-pipeline"
// ...
try {
const result = await client.connections.listConnections();
} catch (e as RestError) {
console.log(`Status code: ${e.code}`);
console.log(e.message);
}
Wenn Sie beispielsweise falsche Anmeldeinformationen angeben:
Status code: 401 (Unauthorized)
Operation returned an invalid status 'Unauthorized'
Melden von Problemen
Um Probleme mit der Clientbibliothek zu melden oder zusätzliche Features anzufordern, öffnen Sie bitte ein GitHub-Problem hier
Beitragend
Dieses Projekt begrüßt Beiträge und Vorschläge. Die meisten Beiträge erfordern, dass Sie einem Mitwirkenden-Lizenzvertrag (CLA) zustimmen, der erklärt, dass Sie das Recht haben, uns tatsächlich die Rechte zur Nutzung Ihres Beitrags zu gewähren. Weitere Informationen finden Sie unter https://cla.microsoft.com.
Wenn Sie eine Pullanfrage einreichen, bestimmt ein CLA-Bot automatisch, ob Sie eine CLA bereitstellen und die PR entsprechend dekorieren müssen (z. B. Bezeichnung, Kommentar). Folgen Sie einfach den Anweisungen des Bots. Sie müssen dies nur einmal über alle Reposs hinweg tun, indem Sie unsereN CLA verwenden.
Dieses Projekt hat den Microsoft Open Source Code of Conductübernommen. Weitere Informationen finden Sie im Code of Conduct FAQ oder wenden Sie sich an opencode@microsoft.com mit weiteren Fragen oder Kommentaren.
Azure SDK for JavaScript