Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Important
Les éléments indiqués comme (aperçu) dans cet article sont en aperçu public. Cette préversion est fournie sans contrat de niveau de service. Nous vous déconseillons donc de l’utiliser dans des charges de travail de production. Certaines fonctionnalités peuvent ne pas être prises en charge ou avoir des fonctionnalités contraintes. Pour plus d’informations, consultez Conditions d'utilisation supplémentaires pour les versions préliminaires de Microsoft Azure.
Avertissement
L’outil d’utilisation de l’ordinateur présente des risques importants en matière de sécurité et de confidentialité, y compris les attaques à injection rapide. Pour plus d’informations sur les utilisations prévues, les fonctionnalités, les limitations, les risques et les considérations relatives au choix d’un cas d’usage, consultez la Azure note de transparence OpenAI.
Créez des agents qui interprètent des captures d’écran et automatisent les interactions de l’interface utilisateur, telles que le clic, la saisie et le défilement. L’outil d’utilisation de l’ordinateur utilise le computer-use-preview modèle Foundry pour proposer des actions basées sur du contenu visuel, ce qui permet aux agents d’interagir avec les applications de bureau et de navigateur via leurs interfaces utilisateur.
Ce guide montre comment intégrer l’outil d’utilisation de l’ordinateur dans une boucle d’application (capture d’écran → action → capture d’écran) à l’aide des kits SDK les plus récents.
Conditions préalables
- Un abonnement Azure. Créez-en un gratuitement.
- Environnement d’agent de base ou standard.
- Le dernier package du Kit de développement logiciel (SDK) :
-
Python :
azure-ai-projects -
C#/.NET :
Azure.AI.Extensions.OpenAI -
TypeScript :
@azure/ai-projects -
Java :
azure-ai-agents
-
Python :
- Accès au modèle
computer-use-preview. Voir Demander l’accès ci-dessous. - Un
computer-use-previewdéploiement dans une région prise en charge. Vérifiez à la fois le modèle et la région dans la prise en charge de l’outil par région et par modèle. - Un environnement de machine virtuelle ou de bac à sable (sandbox) pour des tests sécurisés. N'exécutez pas sur des machines ayant accès aux données sensibles.
Support d'utilisation
Le tableau suivant présente la prise en charge du KIT de développement logiciel (SDK) et de la configuration.
| Prise en charge de Microsoft Foundry | SDK Python | Kit de développement logiciel (SDK) C# | Kit de développement logiciel (SDK) JavaScript | Kit de développement logiciel (SDK) Java | REST API | Configuration de l’agent de base | Configuration de l’agent standard |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Exécuter les exemples de SDK gérés (recommandé)
Les extraits de code de cet article se concentrent sur l’intégration de l’API Agent et Réponses. Ils dépendent du code d’assistance et des exemples de captures d’écran, de sorte qu’ils ne sont pas autonomes. Utilisez ces exemples et utilitaires maintenus :
- Python : l’exemple d’utilisation de l’ordinateur et l’assistance sur l’ordinateur.
- .NET : exemple d’utilisation de l’ordinateur Agent Framework.
- Java : exemple d’utilisation de l’ordinateur et assistant d’utilisation de l’ordinateur.
Les Python et Java helpers simulent une machine d’état en retournant des captures d’écran pré-capturées pour les actions demandées. Ils ne remplacent pas le code appartenant à l’application qui valide et exécute des actions dans un bac à sable, capturent l’état résultant et nécessitent une approbation explicite de l’utilisateur avant d’accepter les vérifications de sécurité en attente.
Conseil
Clonez l’exemple de référentiel afin que les fichiers d’assistance et les ressources de capture d’écran pré-capturées restent dans leurs emplacements relatifs attendus.
Demander l’accès
Pour accéder au computer-use-preview modèle, vous devez vous inscrire. Microsoft accorde l’accès en fonction des critères d’éligibilité. Si vous avez accès à d’autres modèles d’accès limités, vous devez toujours demander l’accès pour ce modèle.
Pour demander l’accès, consultez le formulaire d’application.
Après que Microsoft a accordé l'accès, vous devez créer un déploiement pour le modèle.
Exemples de code
Avertissement
Utilisez l’outil d’utilisation de l’ordinateur sur des machines virtuelles sans accès aux données sensibles ou aux ressources critiques. Pour plus d’informations sur les utilisations prévues, les fonctionnalités, les limitations, les risques et les considérations relatives au choix d’un cas d’usage, consultez la Azure note de transparence OpenAI.
Vous avez besoin du dernier package sdk. Le sdk .NET est actuellement en préversion.
Initialisation de la capture d'écran pour l'exécution de l'outil d'utilisation de l'ordinateur
Les extraits suivants montrent comment créer une version d’agent avec l’outil d’utilisation de l’ordinateur, envoyer une demande initiale avec une capture d’écran et effectuer plusieurs itérations pour effectuer une tâche. Les extraits de Prompt Agents dépendent de l’exemple Python maintenu et de l’utilitaire mentionnés plus haut. Sélectionnez Prompt Agents pour utiliser le SDK Azure AI Projects afin de créer un agent de prompt côté serveur, ou Hosted Agents pour utiliser le framework Agent FoundryChatClient afin de créer un agent éphémère dans le processus.
Agents déclencheurs
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, ComputerUsePreviewTool
# Import shared helper functions
from computer_use_util import (
SearchState,
load_screenshot_assets,
handle_computer_action_and_take_screenshot,
print_final_output,
)
"""Main function to demonstrate Computer Use Agent functionality."""
# Initialize state machine
current_state = SearchState.INITIAL
# Load screenshot assets
try:
screenshots = load_screenshot_assets()
print("Successfully loaded screenshot assets")
except FileNotFoundError:
print("Failed to load required screenshot assets. Use the maintained SDK sample on GitHub to get the helper file and images.")
exit(1)
Créer une version d’agent avec l’outil
# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
project = AIProjectClient(
endpoint=PROJECT_ENDPOINT,
credential=DefaultAzureCredential(),
)
computer_use_tool = ComputerUsePreviewTool(display_width=1026, display_height=769, environment="windows")
agent = project.agents.create_version(
agent_name="ComputerUseAgent",
definition=PromptAgentDefinition(
model="computer-use-preview",
instructions="""
You are a computer automation assistant.
Be direct and efficient. When you reach the search results page, read and describe the actual search result titles and descriptions you can see.
""",
tools=[computer_use_tool],
),
description="Computer automation agent with screen interaction capabilities.",
)
print(f"Agent created (id: {agent.id}, name: {agent.name})")
Une itération pour que l’outil traite la capture d’écran et effectue l’étape suivante
openai = project.get_openai_client()
# Initial request with screenshot - start with Bing search page
response = openai.responses.create(
input=[
{
"role": "user",
"content": [
{
"type": "input_text",
"text": "I need you to help me search for 'OpenAI news'. Please type 'OpenAI news' and submit the search. Once you see search results, the task is complete.",
},
{
"type": "input_image",
"image_url": screenshots["browser_search"]["url"],
"detail": "high",
}, # Start with Bing search page
],
}
],
extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
truncation="auto",
)
print(f"Initial response received (ID: {response.id})")
Effectuer plusieurs itérations
Veillez à passer en revue chaque itération et chaque action. L’exemple de code suivant montre une requête d’API de base. Après avoir envoyé la requête d’API initiale, effectuez une boucle dans laquelle le code de votre application exécute l’action spécifiée. Envoyez une capture d’écran à chaque tour afin que le modèle puisse évaluer l’état mis à jour de l’environnement. L’exemple inclut un nombre maximal d’itérations pour empêcher les boucles infinies, mais vous pouvez ajuster cela si nécessaire.
max_iterations = 10 # Allow enough iterations for completion
iteration = 0
while True:
if iteration >= max_iterations:
print(f"\nReached maximum iterations ({max_iterations}). Stopping.")
break
iteration += 1
print(f"\n--- Iteration {iteration} ---")
# Check for computer calls in the response
computer_calls = [item for item in response.output if item.type == "computer_call"]
if not computer_calls:
print_final_output(response)
break
# Process the first computer call
computer_call = computer_calls[0]
action = computer_call.action
call_id = computer_call.call_id
# Never execute an action with pending safety checks without user approval.
safety_checks = computer_call.pending_safety_checks or []
if safety_checks:
for check in safety_checks:
print(f"Safety check: {check.code}: {check.message}")
if input("Approve this action? Type yes to continue: ").lower() != "yes":
print("Action rejected by the user.")
break
# Handle the action and get the screenshot info
screenshot_info, current_state = handle_computer_action_and_take_screenshot(action, current_state, screenshots)
# Regular response with just the screenshot
response = openai.responses.create(
previous_response_id=response.id,
input=[
{
"call_id": call_id,
"type": "computer_call_output",
"acknowledged_safety_checks": safety_checks,
"output": {
"type": "computer_screenshot",
"image_url": screenshot_info["url"],
},
}
],
extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
truncation="auto",
)
print(f"Iteration {iteration}: response received (ID: {response.id})")
Nettoyer
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
print("Agent deleted")
Sortie attendue
L’exemple suivant montre la sortie attendue lors de l’exécution de l’exemple de code précédent :
Successfully loaded screenshot assets
Agent created (id: ..., name: ComputerUseAgent, version: 1)
Starting computer automation session (initial screenshot: cua_browser_search.png)...
Initial response received (ID: ...)
--- Iteration 1 ---
Processing computer call (ID: ...)
Typing text "OpenAI news" - Simulating keyboard input
-> Action processed: type
Sending action result back to agent (using cua_search_typed.png)...
Follow-up response received (ID: ...)
--- Iteration 2 ---
Processing computer call (ID: ...)
Click at (512, 384) - Simulating click on UI element
-> Assuming click on Search button when search field was populated, displaying results.
-> Action processed: click
Sending action result back to agent (using cua_search_results.png)...
Follow-up response received (ID: ...)
OpenAI news - Latest Updates
Agent deleted
Agents hébergés
Cet exemple utilise FoundryChatClient du Microsoft Agent Framework et appelle get_computer_use_tool() pour joindre l’outil de prévisualisation d’utilisation d’ordinateur. Installez le paquet avec pip install agent-framework-foundry aiohttp, définissez le FOUNDRY_PROJECT_ENDPOINT (configurez FOUNDRY_MODEL pour cibler un déploiement computer-use-preview) et connectez-vous avec az login. La boucle de capture d’écran est spécifique à l’application ; consultez le fichier utilitaire d’exemple source mentionné ci-dessous.
import asyncio
from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient
from azure.identity import AzureCliCredential
async def main() -> None:
agent = Agent(
client=FoundryChatClient(credential=AzureCliCredential()),
instructions=(
"You are a computer automation assistant. Be direct and efficient. "
"When you reach the search results page, describe the actual result titles you can see."
),
tools=[
FoundryChatClient.get_computer_use_tool(
environment="windows",
display_width=1026,
display_height=769,
)
],
)
# Replace this with your screenshot capture + action handler loop.
# See the upstream samples folder for a reference implementation.
result = await agent.run(
"Help me search for 'OpenAI news'. Type the query and submit the search."
)
print(f"Agent: {result.text}")
if __name__ == "__main__":
asyncio.run(main())
Sortie attendue
L’agent émet des actions d’utilisation par ordinateur (clics, séquences de touches, captures d’écran) jusqu’à la fin de la tâche, puis décrit la page qu’elle a atteinte :
Agent: I searched for "OpenAI news" in the address bar. The top results include articles from OpenAI's blog, TechCrunch, and The Verge ...
Pour obtenir une implémentation complète d’une boucle de capture d’écran, consultez les exemples de fournisseurs Foundry.
Exemple d’utilisation d’un agent avec l’outil d'usage de l’ordinateur
L’exemple de code C# suivant montre comment créer un agent avec l’outil d’utilisation de l’ordinateur, envoyer une demande initiale avec une capture d’écran et effectuer plusieurs itérations pour effectuer une tâche. Sélectionnez Prompt Agents pour utiliser le SDK Azure AI Projects afin de créer un agent de prompt côté serveur, ou Agents hébergés pour utiliser le framework Microsoft Agent afin de créer un agent éphémère dans le processus.
Agents déclencheurs
Pour permettre à votre agent d’utiliser l’outil d’utilisation de l’ordinateur, utilisez-le ResponseTool.CreateComputerTool() lors de la configuration des outils de l’agent. Cet exemple utilise du code synchrone. Pour une utilisation asynchrone, consultez l’exemple de code sample dans le Kit de développement logiciel (SDK) Azure pour .NET référentiel sur GitHub.
using System;
using System.Runtime.CompilerServices;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
class ComputerUseDemo
{
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
private const string ProjectEndpoint = "your_project_endpoint";
// Read image files using `ReadImageFile` method.
private static BinaryData ReadImageFile(string name, [CallerFilePath] string pth = "")
{
var dirName = Path.GetDirectoryName(pth) ?? "";
return new BinaryData(File.ReadAllBytes(Path.Combine(dirName, name)));
}
// Create a helper method to parse the ComputerTool outputs and to respond
// to Agents queries with new screenshots. Note that throughout
// this sample the media type for image is set. Agents support `image/jpeg`,
// `image/png`, `image/gif` and `image/webp` media types.
private static string ProcessComputerUseCall(ComputerCallResponseItem item, string oldScreenshot)
{
string currentScreenshot = "browser_search";
switch (item.Action.Kind)
{
case ComputerCallActionKind.Type:
Console.WriteLine($" Typing text \"{item.Action.TypeText}\" - Simulating keyboard input");
currentScreenshot = "search_typed";
break;
case ComputerCallActionKind.KeyPress:
HashSet<string> codes = new(item.Action.KeyPressKeyCodes);
if (codes.Contains("Return") || codes.Contains("ENTER"))
{
// If we have typed the value to the search field, go to search results.
if (string.Equals(oldScreenshot, "search_typed"))
{
Console.WriteLine(" -> Detected ENTER key press, when search field was populated, displaying results.");
currentScreenshot = "search_results";
}
else
{
Console.WriteLine(" -> Detected ENTER key press, on results or unpopulated search, do nothing.");
currentScreenshot = oldScreenshot;
}
}
else
{
Console.WriteLine($" Key press: {item.Action.KeyPressKeyCodes.Aggregate("", (agg, next) => agg + "+" + next)} - Simulating key combination");
}
break;
case ComputerCallActionKind.Click:
Console.WriteLine($" Click at ({item.Action.ClickCoordinates.Value.X}, {item.Action.ClickCoordinates.Value.Y}) - Simulating click on UI element");
if (string.Equals(oldScreenshot, "search_typed"))
{
Console.WriteLine(" -> Assuming click on Search button when search field was populated, displaying results.");
currentScreenshot = "search_results";
}
else
{
Console.WriteLine(" -> Assuming click on Search on results or when search was not populated, do nothing.");
currentScreenshot = oldScreenshot;
}
break;
case ComputerCallActionKind.Drag:
string pathStr = item.Action.DragPath.ToArray().Select(p => $"{p.X}, {p.Y}").Aggregate("", (agg, next) => $"{agg} -> {next}");
Console.WriteLine($" Drag path: {pathStr} - Simulating drag operation");
break;
case ComputerCallActionKind.Scroll:
Console.WriteLine($" Scroll at ({item.Action.ScrollCoordinates.Value.X}, {item.Action.ScrollCoordinates.Value.Y}) - Simulating scroll action");
break;
case ComputerCallActionKind.Screenshot:
Console.WriteLine(" Taking screenshot - Capturing current screen state");
break;
default:
break;
}
Console.WriteLine($" -> Action processed: {item.Action.Kind}");
return currentScreenshot;
}
public static void Main()
{
// Create project client
AIProjectClient projectClient = new(endpoint: new Uri(ProjectEndpoint), tokenProvider: new DefaultAzureCredential());
// Read in three example screenshots and place them into a dictionary.
Dictionary<string, BinaryData> screenshots = new() {
{ "browser_search", ReadImageFile("Assets/cua_browser_search.png")},
{ "search_typed", ReadImageFile("Assets/cua_search_typed.png")},
{ "search_results", ReadImageFile("Assets/cua_search_results.png")},
};
// Create a PromptAgentDefinition with ComputerTool.
DeclarativeAgentDefinition agentDefinition = new(model: "computer-use-preview")
{
Instructions = "You are a computer automation assistant.\n\n" +
"Be direct and efficient. When you reach the search results page, read and describe the actual search result titles and descriptions you can see.",
Tools = {
ResponseTool.CreateComputerTool(
environment: new ComputerToolEnvironment("windows"),
displayWidth: 1026,
displayHeight: 769
),
}
};
AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
agentName: "myAgent",
options: new(agentDefinition)
);
// Create an `ResponseResult` using `ResponseItem`, containing two `ResponseContentPart`:
// one with the image and another with the text. In the loop, request Agent
// while it is continuing to browse web. Finally, print the tool output message.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);
CreateResponseOptions responseOptions = new()
{
TruncationMode = ResponseTruncationMode.Auto,
InputItems =
{
ResponseItem.CreateUserMessageItem(
[
ResponseContentPart.CreateInputTextPart("I need you to help me search for 'OpenAI news'. Please type 'OpenAI news' and submit the search. Once you see search results, the task is complete."),
ResponseContentPart.CreateInputImagePart(imageBytes: screenshots["browser_search"], imageBytesMediaType: "image/png", imageDetailLevel: ResponseImageDetailLevel.High)
]),
},
};
bool computerUseCalled = false;
string currentScreenshot = "browser_search";
int limitIteration = 10;
ResponseResult response;
do
{
response = responseClient.CreateResponse(responseOptions);
computerUseCalled = false;
responseOptions.InputItems.Clear();
responseOptions.PreviousResponseId = response.Id;
foreach (ResponseItem responseItem in response.OutputItems)
{
responseOptions.InputItems.Add(responseItem);
if (responseItem is ComputerCallResponseItem computerCall)
{
if (computerCall.PendingSafetyChecks.Count > 0)
{
throw new InvalidOperationException(
"Pause execution and obtain end-user approval before acknowledging safety checks."
);
}
currentScreenshot = ProcessComputerUseCall(computerCall, currentScreenshot);
responseOptions.InputItems.Add(ResponseItem.CreateComputerCallOutputItem(callId: computerCall.CallId, output: ComputerCallOutput.CreateScreenshotOutput(screenshotImageBytes: screenshots[currentScreenshot], screenshotImageBytesMediaType: "image/png")));
computerUseCalled = true;
}
}
limitIteration--;
} while (computerUseCalled && limitIteration > 0);
Console.WriteLine(response.GetOutputText());
// Clean up resources by deleting Agent.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
}
}
Sortie attendue
L’exemple suivant montre la sortie attendue lors de l’exécution de l’exemple de code précédent :
Agent created (id: ..., name: myAgent, version: 1)
Starting computer automation session (initial screenshot: cua_browser_search.png)...
Initial response received (ID: ...)
--- Iteration 1 ---
Processing computer call (ID: ...)
Typing text "OpenAI news" - Simulating keyboard input
-> Action processed: Type
Sending action result back to agent (using cua_search_typed.png)...
Follow-up response received (ID: ...)
--- Iteration 2 ---
Processing computer call (ID: ...)
Click at (512, 384) - Simulating click on UI element
-> Assuming click on Search button when search field was populated, displaying results.
-> Action processed: Click
Sending action result back to agent (using cua_search_results.png)...
Follow-up response received (ID: ...)
OpenAI news - Latest Updates
Agent deleted
Agents hébergés
Cet exemple utilise Microsoft Agent Framework et appelle AsAIAgent(...) sur AIProjectClient avec FoundryAITool.CreateComputerTool(...) de Microsoft.Agents.AI.Foundry pour donner à l’agent l’outil d’utilisation de l’ordinateur. Installez les packages Microsoft.Agents.AI.Foundry et Azure.AI.Projects, définissez les variables d’environnement AZURE_AI_PROJECT_ENDPOINT et AZURE_AI_COMPUTER_USE_DEPLOYMENT_NAME et connectez-vous avec az login. Cet exemple omet les helpers de capture d’écran : consultez l’exemple complet de la boucle d’action et des utilitaires de ressources.
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry;
using Microsoft.Extensions.AI;
using OpenAI.Responses;
string endpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set.");
string deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_COMPUTER_USE_DEPLOYMENT_NAME") ?? "computer-use-preview";
AIProjectClient projectClient = new(new Uri(endpoint), new DefaultAzureCredential());
using IHostedFileClient fileClient = projectClient.GetProjectOpenAIClient().AsIHostedFileClient();
AIAgent agent = projectClient.AsAIAgent(
model: deploymentName,
name: "ComputerAgent",
instructions: "You are a computer automation assistant.",
tools: [FoundryAITool.CreateComputerTool(ComputerToolEnvironment.Browser, 1026, 769)]);
// Upload pre-captured screenshots that simulate browser state transitions.
// (See the full sample for ComputerUseUtil implementation.)
Dictionary<string, string> screenshots = await ComputerUseUtil.UploadScreenshotAssetsAsync(fileClient);
ChatClientAgentRunOptions runOptions = new()
{
ChatOptions = new ChatOptions
{
RawRepresentationFactory = (_) => new CreateResponseOptions { TruncationMode = ResponseTruncationMode.Auto },
}
};
ChatMessage message = new(ChatRole.User,
[
new TextContent("Search for 'OpenAI news'. Type it and submit. Once you see results, the task is complete."),
new AIContent { RawRepresentation = ResponseContentPart.CreateInputImagePart(imageFileId: screenshots["browser_search"], imageDetailLevel: ResponseImageDetailLevel.High) }
]);
AgentSession session = await agent.CreateSessionAsync();
AgentResponse response = await agent.RunAsync(message, session: session, options: runOptions);
// Loop: parse computer call actions from response, simulate them, return new screenshots.
for (int i = 0; i < 10; i++)
{
ComputerCallResponseItem? computerCall = response.Messages
.SelectMany(m => m.Contents)
.Select(c => c.RawRepresentation as ComputerCallResponseItem)
.FirstOrDefault(item => item is not null);
if (computerCall is null) break;
(_, string fileId) = await ComputerUseUtil.GetScreenshotAsync(computerCall.Action, default, screenshots);
AIContent callOutput = new()
{
RawRepresentation = new ComputerCallOutputResponseItem(
computerCall.CallId,
output: ComputerCallOutput.CreateScreenshotOutput(screenshotImageFileId: fileId))
};
response = await agent.RunAsync([new ChatMessage(ChatRole.User, [callOutput])], session: session, options: runOptions);
}
await ComputerUseUtil.EnsureDeleteScreenshotAssetsAsync(fileClient, screenshots);
Console.WriteLine($"Response: {response.Text}");
Sortie attendue
Une fois la boucle d’action terminée, la réponse de l’agent final décrit la page atteinte :
Response: I searched for "OpenAI news" in the address bar. The top results include articles from OpenAI's blog, TechCrunch, and The Verge ...
Pour obtenir l’implémentation complète de l’assistance de capture d’écran et la boucle d’action de bout en bout, consultez Agent_Step15_ComputerUse.
Exemple d’utilisation d’un agent avec l’outil d'usage de l’ordinateur
L’extrait TypeScript suivant montre comment créer une version de l’agent avec l’outil d’utilisation de l’ordinateur, envoyer une demande initiale avec une capture d’écran et effectuer plusieurs itérations. Il importe une fonction utilitaire locale computerUseUtil.js et suppose la présence de fichiers de capture d’écran qui ne sont pas inclus dans cet article. Traitez l’extrait comme une trame d’intégration, et fournissez l’exécution d’actions prises en charge par l’application, la capture d’écran et une validation de sécurité explicite avant de prendre acte des contrôles de sécurité en attente.
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
import { createInterface } from "node:readline/promises";
import { stdin, stdout } from "node:process";
import {
SearchState,
loadScreenshotAssets,
handleComputerActionAndTakeScreenshot,
printFinalOutput,
type ComputerAction,
} from "./computerUseUtil.js";
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
export async function main(): Promise<void> {
// Initialize state machine
let currentState = SearchState.INITIAL;
// Load screenshot assets
const screenshots = loadScreenshotAssets();
console.log("Successfully loaded screenshot assets");
// Create AI Project client
const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();
console.log("Creating Computer Use Agent...");
const agent = await project.agents.createVersion("ComputerUseAgent", {
kind: "prompt" as const,
model: "computer-use-preview",
instructions: `
You are a computer automation assistant.
Be direct and efficient. When you reach the search results page, read and describe the actual search result titles and descriptions you can see.
`.trim(),
tools: [
{
type: "computer_use_preview",
display_width: 1026,
display_height: 769,
environment: "windows" as const,
},
],
});
console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);
// Initial request with screenshot - start with Bing search page
console.log(
"Starting computer automation session (initial screenshot: cua_browser_search.png)...",
);
let response = await openai.responses.create(
{
input: [
{
role: "user" as const,
content: [
{
type: "input_text",
text: "I need you to help me search for 'OpenAI news'. Please type 'OpenAI news' and submit the search. Once you see search results, the task is complete.",
},
{
type: "input_image",
image_url: screenshots.browser_search.url,
detail: "high",
},
],
},
],
truncation: "auto",
},
{
body: { agent_reference: { name: agent.name, type: "agent_reference" } },
},
);
console.log(`Initial response received (ID: ${response.id})`);
// Main interaction loop with deterministic completion
const maxIterations = 10; // Allow enough iterations for completion
let iteration = 0;
while (iteration < maxIterations) {
iteration++;
console.log(`\n--- Iteration ${iteration} ---`);
// Check for computer calls in the response
const computerCalls = response.output.filter((item) => item.type === "computer_call");
if (computerCalls.length === 0) {
printFinalOutput({
output: response.output,
status: response.status ?? "",
});
break;
}
// Process the first computer call
const computerCall = computerCalls[0];
const action: ComputerAction = computerCall.action;
const callId: string = computerCall.call_id;
// Never execute an action with pending safety checks without user approval.
const safetyChecks = computerCall.pending_safety_checks ?? [];
if (safetyChecks.length > 0) {
for (const check of safetyChecks) {
console.warn(`Safety check: ${check.code}: ${check.message}`);
}
const prompt = createInterface({ input: stdin, output: stdout });
const answer = await prompt.question("Approve this action? Type yes to continue: ");
prompt.close();
if (answer.toLowerCase() !== "yes") {
throw new Error("Action rejected by the user.");
}
}
console.log(`Processing computer call (ID: ${callId})`);
// Handle the action and get the screenshot info
const [screenshotInfo, updatedState] = handleComputerActionAndTakeScreenshot(
action,
currentState,
screenshots,
);
currentState = updatedState;
console.log(`Sending action result back to agent (using ${screenshotInfo.filename})...`);
// Regular response with just the screenshot
response = await openai.responses.create(
{
previous_response_id: response.id,
input: [
{
call_id: callId,
type: "computer_call_output",
acknowledged_safety_checks: safetyChecks,
output: {
type: "computer_screenshot",
image_url: screenshotInfo.url,
},
},
],
truncation: "auto",
},
{
body: { agent_reference: { name: agent.name, type: "agent_reference" } },
},
);
console.log(`Follow-up response received (ID: ${response.id})`);
}
if (iteration >= maxIterations) {
console.log(`\nReached maximum iterations (${maxIterations}). Stopping.`);
}
// Clean up resources
console.log("\nCleaning up...");
await project.agents.deleteVersion(agent.name, agent.version);
console.log("Agent deleted");
console.log("\nComputer Use Agent sample completed!");
}
main().catch((err) => {
console.error("The sample encountered an error:", err);
});
Sortie attendue
L’exemple suivant montre la sortie attendue lors de l’exécution de l’exemple de code précédent :
Successfully loaded screenshot assets
Creating Computer Use Agent...
Agent created (id: ..., name: ComputerUseAgent, version: 1)
Starting computer automation session (initial screenshot: cua_browser_search.png)...
Initial response received (ID: ...)
--- Iteration 1 ---
Processing computer call (ID: ...)
Typing text "OpenAI news" - Simulating keyboard input
-> Action processed: type
Sending action result back to agent (using cua_search_typed.png)...
Follow-up response received (ID: ...)
--- Iteration 2 ---
Processing computer call (ID: ...)
Click at (512, 384) - Simulating click on UI element
-> Assuming click on Search button when search field was populated, displaying results.
-> Action processed: click
Sending action result back to agent (using cua_search_results.png)...
Follow-up response received (ID: ...)
OpenAI news - Latest Updates
Cleaning up...
Agent deleted
Computer Use Agent sample completed!
Utiliser un ordinateur avec un agent Java
Ajoutez la dépendance à votre pom.xml:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.4.0</version>
</dependency>
Créer un agent d’utilisation d’ordinateur
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.Collections;
public class ComputerUseExample {
// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
private static final String PROJECT_ENDPOINT = "your_project_endpoint";
public static void main(String[] args) {
AgentsClientBuilder builder = new AgentsClientBuilder()
.credential(new DefaultAzureCredentialBuilder().build())
.endpoint(PROJECT_ENDPOINT);
AgentsClient agentsClient = builder.buildAgentsClient();
ResponsesClient responsesClient = builder.buildResponsesClient();
// Create computer use tool
ComputerUsePreviewTool tool = new ComputerUsePreviewTool(
ComputerEnvironment.WINDOWS,
1024,
768
);
// Create agent with computer use tool
PromptAgentDefinition agentDefinition = new PromptAgentDefinition("computer-use-preview")
.setInstructions("You are a computer automation assistant.")
.setTools(Collections.singletonList(tool));
AgentVersionDetails agent = agentsClient.createAgentVersion("computer-use-agent", agentDefinition);
System.out.printf("Agent created: %s (version %s)%n", agent.getName(), agent.getVersion());
// Create a response with initial screenshot
AgentReference agentReference = new AgentReference(agent.getName())
.setVersion(agent.getVersion());
Response response = responsesClient.createAzureResponse(
new AzureCreateResponseOptions().setAgentReference(agentReference),
ResponseCreateParams.builder()
.input("Open the browser and navigate to microsoft.com"));
System.out.println("Response: " + response.output());
// The response will contain computer_call items with actions
// to execute. Process each action, take screenshots, and
// send results back using responsesClient.createAzureResponse()
// with the previousResponseId and computer call output.
// Clean up
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
}
}
Pour la boucle simulée complète, utilisez l’exemple de ComputerUseSync.java géré avec son assistance ComputerUseUtil.java. L’assistant associe les actions demandées aux captures d’écran capturées au préalable. Remplacez cette simulation par l’exécuteur d’action de votre application, la capture d’écran et le flux d’approbation de sécurité.
Utilisation de l’ordinateur avec l’API REST
Obtenez un jeton d’accès :
export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)
Créer un agent avec l’utilisation de l’ordinateur
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"name": "computer-use-agent",
"definition": {
"kind": "prompt",
"model": "computer-use-preview",
"instructions": "You are a computer automation assistant.",
"tools": [
{
"type": "computer_use_preview",
"environment": "windows",
"display_width": 1024,
"display_height": 768
}
]
}
}'
Générer une réponse
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"agent_reference": {"type": "agent_reference", "name": "computer-use-agent"},
"input": "Open the browser and navigate to microsoft.com"
}'
La réponse inclut des computer_call éléments de sortie avec des actions à exécuter. Avant d’exécuter une action, inspectez pending_safety_checks. Si le tableau n’est pas vide, suspendez et affichez les contrôles d’action et de sécurité à l’utilisateur final. Continuez uniquement après que l’utilisateur approuve explicitement l’action.
Envoyer des résultats d’action avec capture d’écran
Une fois que l’utilisateur approuve toutes les vérifications de sécurité en attente et que votre application exécute l’action de l’ordinateur, capturez une capture d’écran et renvoyez-la. Incluez chaque vérification approuvée dans acknowledged_safety_checks. Si aucune vérification n’a été retournée, utilisez un tableau vide.
curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $AGENT_TOKEN" \
-d '{
"agent_reference": {"type": "agent_reference", "name": "computer-use-agent"},
"previous_response_id": "<RESPONSE_ID>",
"input": [
{
"type": "computer_call_output",
"call_id": "<CALL_ID>",
"acknowledged_safety_checks": [],
"output": {
"type": "computer_screenshot",
"image_url": "data:image/png;base64,<BASE64_SCREENSHOT>"
}
}
]
}'
Remplacez <RESPONSE_ID>, <CALL_ID>et <BASE64_SCREENSHOT> par des valeurs de la réponse précédente. Répétez ce cycle jusqu’à ce que le modèle retourne une réponse de texte au lieu d’un computer_call.
Nettoyer
curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/computer-use-agent?api-version=v1" \
-H "Authorization: Bearer $AGENT_TOKEN"
Ce que vous pouvez faire avec l’outil d’utilisation de l’ordinateur
Après avoir intégré la boucle request-and-response (capture d’écran -> action -> capture d’écran), l’outil d’utilisation de l’ordinateur peut aider un agent :
- Proposez des actions d’interface utilisateur telles que le clic, la saisie, le défilement et la demande d’une nouvelle capture d’écran.
- Adaptez les modifications apportées à l’interface utilisateur en réévaluant la dernière capture d’écran après chaque action.
- Travaillez sur l’interface utilisateur du navigateur et du bureau, en fonction de la façon dont vous hébergez votre environnement bac à sable (sandbox).
L’outil ne contrôle pas directement un appareil. Votre application exécute chaque action demandée et retourne une capture d’écran mise à jour.
Différences entre l’automatisation du navigateur et l’utilisation de l’ordinateur
Le tableau suivant répertorie certaines des différences entre l’outil d’utilisation de l’ordinateur et l’outil d’automatisation du navigateur .
| Fonction | Automatisation du navigateur | Outil d’utilisation de l’ordinateur |
|---|---|---|
| Prise en charge des modèles | Tous les modèles GPT |
computer-use-preview modèle uniquement |
| Puis-je visualiser ce qui se passe ? | Non | Oui |
| Comment il comprend l’écran | Analyse les pages HTML ou XML dans des documents DOM | Données de pixel brutes à partir de captures d’écran |
| Comment il agit | Liste des actions fournies par le modèle | Clavier virtuel et souris |
| Est-ce un processus à plusieurs étapes ? | Oui | Oui |
| Interfaces | Navigateur | Ordinateur et navigateur |
| Dois-je apporter ma propre ressource ? | Votre propre ressource Playwright avec les clés stockées en tant que connexion. | Aucune ressource supplémentaire n’est requise, mais exécutez cet outil dans un environnement bac à sable (sandbox). |
Quand utiliser chaque outil
Choisissez l’utilisation de l’ordinateur lorsque vous devez :
- Interagir avec les applications de bureau au-delà du navigateur
- Visualiser ce que l’agent voit via des captures d’écran
- Travailler dans des environnements où l’analyse DOM n’est pas disponible
Choisissez l’automatisation du navigateur lorsque vous devez :
- Effectuer des interactions web uniquement sans exigences d’accès limitées
- Utiliser n’importe quel modèle GPT (non limité à
computer-use-preview) - Éviter de gérer les boucles de capture d’écran et d’exécution d’action
Support régional
Pour utiliser l'outil pour utiliser l'ordinateur, vous avez besoin d’un déploiement de modèle d'utilisation de l'ordinateur. Le modèle d’utilisation de l’ordinateur est disponible dans les régions suivantes :
| Région | Statut |
|---|---|
eastus2 |
Disponible |
swedencentral |
Disponible |
southindia |
Disponible |
Présentation de l’intégration de l’utilisation de l’ordinateur
Lorsque vous utilisez l’outil d’utilisation de l’ordinateur, intégrez-le à votre application en effectuant les étapes suivantes :
Envoyez une demande au modèle qui inclut un appel à l’outil d’utilisation de l’ordinateur, la taille d’affichage et l’environnement. Vous pouvez également inclure une capture d’écran de l’état initial de l’environnement dans la première requête d’API.
Recevez une réponse du modèle. Si la réponse comporte des éléments d’action, ces éléments contiennent des actions suggérées pour progresser vers l’objectif spécifié. Par exemple, une action peut être
screenshotde sorte que le modèle puisse évaluer l’état actuel avec une capture d’écran mise à jour ouclickavec des coordonnées X/Y indiquant où la souris doit être déplacée.Exécutez l’action à l’aide du code de votre application sur votre ordinateur ou environnement de navigateur.
Après l’exécution de l’action, capturez l’état mis à jour de l’environnement sous forme de capture d’écran.
Envoyez une nouvelle requête avec l’état mis à jour sous la forme de
tool_call_output, et répétez ce processus jusqu’à ce que le modèle cesse de demander des actions ou que vous décidiez d’arrêter.Note
Avant d’utiliser l’outil, configurez un environnement capable de capturer des captures d’écran et d’exécuter les actions recommandées par l’agent. Pour des raisons de sécurité, utilisez un environnement bac à sable (sandbox), tel que Playwright.
Gérer l’historique des conversations
Utilisez le previous_response_id paramètre pour lier la requête actuelle à la réponse précédente. Utilisez ce paramètre lorsque vous ne souhaitez pas envoyer l’historique complet des conversations avec chaque appel.
Si vous n’utilisez pas ce paramètre, veillez à inclure tous les éléments retournés dans la sortie de réponse de la demande précédente dans votre tableau d’entrées. Cette exigence inclut des éléments de raisonnement s’ils sont présents.
Vérifications de sécurité et considérations relatives à la sécurité
Avertissement
L’utilisation de l’ordinateur comporte des risques importants en matière de sécurité et de confidentialité et la responsabilité de l’utilisateur. Les erreurs de jugement par l’IA et la présence d’instructions malveillantes ou confuses sur les pages web, les bureaux ou d’autres environnements d’exploitation que l’IA rencontre peuvent entraîner l’exécution de commandes que vous ou d’autres ne souhaitez pas exécuter. Ces risques peuvent compromettre la sécurité de vos navigateurs, ordinateurs et tous les comptes auxquels l’IA a accès, y compris les systèmes personnels, financiers ou d’entreprise.
Utilisez l’outil d’utilisation de l’ordinateur sur des machines virtuelles sans accès aux données sensibles ou aux ressources critiques. Pour plus d’informations sur les utilisations prévues, les fonctionnalités, les limitations, les risques et les considérations relatives au choix d’un cas d’usage, consultez la Azure note de transparence OpenAI.
L’API dispose de contrôles de sécurité pour vous protéger contre les erreurs d’injection rapide et de modèle. Ces vérifications sont les suivantes :
Détection d’instructions malveillantes : le système évalue l’image de capture d’écran et vérifie s’il contient du contenu contradictoire susceptible de modifier le comportement du modèle.
Détection de domaine non pertinente : le système évalue le current_url paramètre (le cas échéant) et vérifie si le domaine actuel est pertinent en fonction de l’historique des conversations.
Détection de domaine sensible : le système vérifie le current_url paramètre (le cas échéant) et déclenche un avertissement lorsqu’il détecte que l’utilisateur se trouve sur un domaine sensible.
Si une ou plusieurs des vérifications précédentes sont déclenchées, le modèle déclenche un contrôle de sécurité lorsqu’il retourne le suivant computer_call à l’aide du pending_safety_checks paramètre.
"output": [
{
"type": "reasoning",
"id": "rs_67cb...",
"summary": [
{
"type": "summary_text",
"text": "Exploring 'File' menu option."
}
]
},
{
"type": "computer_call",
"id": "cu_67cb...",
"call_id": "call_nEJ...",
"action": {
"type": "click",
"button": "left",
"x": 135,
"y": 193
},
"pending_safety_checks": [
{
"id": "cu_sc_67cb...",
"code": "malicious_instructions",
"message": "We've detected instructions that may cause your application to perform malicious or unauthorized actions. Please acknowledge this warning if you'd like to proceed."
}
],
"status": "completed"
}
]
Vous devez renvoyer les contrôles de sécurité comme acknowledged_safety_checks dans la demande suivante pour continuer.
"input":[
{
"type": "computer_call_output",
"call_id": "<call_id>",
"acknowledged_safety_checks": [
{
"id": "<safety_check_id>",
"code": "malicious_instructions",
"message": "We've detected instructions that may cause your application to perform malicious or unauthorized actions. Please acknowledge this warning if you'd like to proceed."
}
],
"output": {
"type": "computer_screenshot",
"image_url": "<image_url>"
}
}
]
Gestion des contrôles de sécurité
Dans tous les cas où pending_safety_checks sont retournés, confiez les actions à l'utilisateur final pour confirmer le comportement correct et l'exactitude du modèle.
malicious_instructions et irrelevant_domain: les utilisateurs finaux doivent passer en revue les actions du modèle et confirmer que le modèle se comporte comme prévu.
sensitive_domain: assurez-vous qu’un utilisateur final surveille activement les actions de modèle sur ces sites. L’implémentation exacte de ce « mode espion » peut varier selon l’application, mais un exemple potentiel peut être de collecter des données d’impression utilisateur sur le site pour vous assurer qu’il existe un engagement actif de l’utilisateur final avec l’application.
Dépannage
| Problème | Cause | Résolution |
|---|---|---|
Vous ne voyez pas de computer_call dans la réponse. |
L’agent n’est pas configuré avec l’outil d’utilisation de l’ordinateur, le déploiement n’est pas un modèle d’utilisation d’ordinateur ou l’invite ne nécessite pas d’interaction de l’interface utilisateur. | Vérifiez que l’agent dispose d’un computer_use_preview outil, que votre déploiement est le computer-use-preview modèle et que votre invite nécessite une action d’interface utilisateur (type, clic ou capture d’écran). |
| L’exemple de code échoue avec des fichiers d’assistance ou des captures d’écran manquants. | Les extraits référencent les utilitaires d’assistance et les exemples d’images qui ne font pas partie de ce référentiel de documentation. | Clonez l’un des exemples gérés dans la section « Exécuter les exemples du Kit de développement logiciel (SDK) gérés » afin que son assistance et ses ressources restent dans leurs emplacements relatifs attendus. Pour TypeScript, fournissez vos propres ressources d’assistance et de capture d’écran. |
| La boucle s’arrête à la limite d’itération. | La tâche a besoin de plus de tours, ou l’application n’applique pas les actions que le modèle demande. | Augmentez la limite d’itération et vérifiez que votre code exécute l’action demandée et envoie une nouvelle capture d’écran après chaque tour. |
Vous recevez pending_safety_checks. |
Le service a détecté un risque de sécurité potentiel, comme une injection d’invite ou un domaine sensible. | Suspendre l’automatisation, exiger qu’un utilisateur final passe en revue la demande et continue uniquement après l’envoi acknowledged_safety_checks avec la suivante computer_call_output. |
| Le modèle répète « prendre une capture d’écran » sans progresser. | La capture d’écran n’est pas mise à jour, est de faible qualité ou n’affiche pas l’état d’interface utilisateur approprié. | Envoyez une nouvelle capture d’écran après chaque action et utilisez une image plus détaillée si nécessaire. Vérifiez que la capture d’écran inclut l’interface utilisateur appropriée. |
Accès refusé lors de la demande du modèle computer-use-preview. |
Vous ne vous êtes pas inscrit pour l'accès ou l'accès ne vous a pas été accordé. | Envoyez le formulaire d’application et attendez l’approbation. Vérifiez votre e-mail pour obtenir la confirmation. |
| Erreurs d’encodage de capture d’écran. | Format d’image non pris en charge ou problème d’encodage base64. | Utilisez le format PNG ou JPEG. Vérifiez l’encodage base64 approprié sans corruption. Vérifiez que les dimensions de l'image correspondent à display_width et display_height. |
| Les actions s’exécutent sur des coordonnées incorrectes. | Incompatibilité de résolution d’écran entre la capture d’écran et l’affichage réel. | Vérifiez que display_width et display_height dans ComputerUsePreviewTool correspondent à la résolution réelle de votre écran. |
| Le modèle imagine des éléments de l'interface utilisateur. | Qualité de la capture d'écran trop faible ou modification de l’interface utilisateur entre les étapes. | Utilisez des captures d’écran de résolution supérieure. Envoyez des captures d’écran fraîches immédiatement après chaque action. Réduisez le délai entre l’action et la capture d’écran. |