Aracılar için bilgisayar kullanım aracını kullanma (önizleme)

Önemli

Bu makalede işaretlenen (önizleme) öğeler şu anda genel önizleme aşamasındadır. Bu önizleme, hizmet düzeyi sözleşmesi olmadan sağlanır ve üretim iş yükleri için önerilmez. Bazı özellikler desteklenmeyebilir veya kısıtlı özelliklere sahip olabilir. Daha fazla bilgi için bkz. Microsoft Azure Önizlemeleri için Uygun Kullanım Koşulları.

Uyarı

Bilgisayar kullanım aracı, istem ekleme saldırıları da dahil olmak üzere önemli güvenlik ve gizlilik riskleriyle birlikte gelir. Kullanım örneği seçerken amaçlanan kullanımlar, özellikler, sınırlamalar, riskler ve dikkat edilmesi gerekenler hakkında daha fazla bilgi için bkz. Azure OpenAI saydamlık notu.

Ekran görüntülerini yorumlayan ve tıklama, yazma ve kaydırma gibi kullanıcı arabirimi etkileşimlerini otomatik hale getiren aracılar oluşturun. Bilgisayar kullanım aracı, aracıların computer-use-preview kullanıcı arabirimleri aracılığıyla masaüstü ve tarayıcı uygulamalarıyla etkileşim kurmasını sağlayarak görsel içeriğe dayalı eylemler önermek için Foundry modelini kullanır.

Bu kılavuzda, en son SDK'ları kullanarak bilgisayar kullanım aracını bir uygulama döngüsüyle (ekran görüntüsü → eylem → ekran görüntüsü) tümleştirme gösterilmektedir.

Önkoşullar

  • Azure aboneliği. Ücretsiz bir tane oluşturun.
  • Temel veya standart aracı ortamı.
  • En son SDK paketi:
    • Python:azure-ai-projects
    • C#/.NET:Azure.AI.Extensions.OpenAI
    • TypeScript: @azure/ai-projects
    • Java:azure-ai-agents
  • computer-use-preview modele erişim. Aşağıdaki Erişim isteme bölümüne bakın.
  • Güvenli test için sanal makine veya korumalı ortam. Hassas verilere erişimi olan makinelerde çalıştırmayın.

Kullanım desteği

Aşağıdaki tabloda SDK ve kurulum desteği gösterilmektedir.

Microsoft Foundry desteği Python SDK'sı C# SDK'sı JavaScript SDK'sı Java SDK'sı REST API Temel aracı kurulumu Standart ajan kurulumu
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Bu makaledeki kod parçacıkları etken ve Yanıtlar API tümleştirmesine merkezlenmiştir. Bunlar yardımcı koda ve örnek ekran görüntülerine bağımlı olduğundan tek başına değildir. Bu bakımlı örnekleri ve yardımcıları kullanın:

Python ve Java yardımcıları, istenen eylemler için önceden yakalanan ekran görüntülerini döndürerek bir durum makinesinin benzetimini gerçekleştirir. Korumalı alanda eylemleri doğrulayan ve yürüten, sonuçta elde edilen durumu yakalayan ve bekleyen güvenlik denetimlerini onaylamadan önce açık kullanıcı onayı gerektiren uygulamaya ait kodun yerini almaz.

Ipucu

Yardımcı dosyaların ve önceden yakalanan ekran görüntüsü varlıklarının beklenen göreli konumlarında kalması için örnek depoyu kopyalayın.

Erişim iste

Modele computer-use-preview erişmek için kaydolmanız gerekir. Microsoft, uygunluk ölçütlerine göre erişim verir. Diğer sınırlı erişim modellerine erişiminiz varsa, yine de bu model için erişim istemeniz gerekir.

Erişim istemek için uygulama formuna bakın.

Microsoft erişim verdikten sonra model için bir dağıtım oluşturmanız gerekir.

Kod örnekleri

Uyarı

Hassas verilere veya kritik kaynaklara erişimi olmayan sanal makinelerde bilgisayar kullanım aracını kullanın. Kullanım örneği seçerken amaçlanan kullanımlar, yetenekler, sınırlamalar, riskler ve dikkat edilmesi gerekenler hakkında daha fazla bilgi için bkz. Azure OpenAI saydamlık notu.

En son SDK paketine ihtiyacınız vardır. .NET SDK şu anda önizleme aşamasındadır.

Bilgisayar kullanım aracı yürütme için ekran görüntüsü başlatma

Aşağıdaki alıntılar bilgisayar kullanım aracıyla aracı sürümü oluşturmayı, ekran görüntüsüyle bir ilk istek göndermeyi ve bir görevi tamamlamak için birden çok yineleme gerçekleştirmeyi gösterir. İstem Aracıları alıntıları, daha önce bağlanan bakımlı Python örneğe ve yardımcıya bağlıdır. sunucu tarafı istem aracısı oluşturmak için Azure AI Projeleri SDK'sını kullanmak için Prompt Agents veya kısa ömürlü, işlem içi aracı oluşturmak için Agent Framework kullanmak için FoundryChatClient öğesini seçin.

Yönlendirme ajanları

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)

Araç ile ajan versiyonunu oluştur

# 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})")

Aracın ekran görüntüsünü işlemesi ve sonraki adıma geçmesi için bir yineleme

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})")

Birden çok yineleme gerçekleştirme

Her yinelemeyi ve eylemi gözden geçirmeyi unutmayın. Aşağıdaki kod örneğinde temel bir API isteği gösterilmektedir. İlk API isteğini gönderdikten sonra, uygulama kodunuzun belirtilen eylemi gerçekleştirdiği bir döngü gerçekleştirin. Modelin ortamın güncelleştirilmiş durumunu değerlendirebilmesi için her turda bir ekran görüntüsü gönderin. Örnek, sonsuz döngüleri önlemek için en yüksek yineleme sayısını içerir, ancak bunu gerektiği gibi ayarlayabilirsiniz.


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})")

Temizlemek

project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
print("Agent deleted")

Beklenen çıkış

Aşağıdaki örnekte, önceki kod örneği çalıştırılırken beklenen çıkış gösterilmektedir:

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

Barındırılan aracılar

Bu örnek, Microsoft Agent Framework'ten FoundryChatClient kullanır ve bilgisayar kullanım önizleme aracını eklemek için get_computer_use_tool() çağırır. Paketi pip install agent-framework-foundry aiohttp ile yükleyin, FOUNDRY_PROJECT_ENDPOINT öğesini ayarlayın (FOUNDRY_MODEL öğesini bir computer-use-preview dağıtımına yönlendirin) ve az login ile oturum açın. Ekran görüntüsü yakalama döngüsü uygulamaya özgüdür; Aşağıda başvuruda bulunu olan yukarı akış örnek yardımcı dosyasına bakın.

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())

Beklenen çıkış

Ajan, görev tamamlanana kadar bilgisayar kullanım eylemleri (tıklamalar, tuş vuruşları, ekran görüntüleri) gerçekleştirir; ardından ulaştığı sayfayı açıklar:

Agent: I searched for "OpenAI news" in the address bar. The top results include articles from OpenAI's blog, TechCrunch, and The Verge ...

Tam ekran görüntüsü döngüsü uygulamasının eksiksiz bir örneği için Foundry sağlayıcı örneklerine bakın.


Bilgisayar Kullanım Aracı ile Temsilci Kullanımı Örneği

Aşağıdaki C# kod örneği, bilgisayar kullanım aracısıyla aracı oluşturma, ekran görüntüsüyle ilk istek gönderme ve görevi tamamlamak için birden çok yineleme gerçekleştirme işlemlerini gösterir. sunucu tarafı istem aracısı oluşturmak için Azure AI Projeleri SDK'sını kullanmak için Prompt Agents öğesini veya kısa ömürlü, işlem içi aracı oluşturmak için Microsoft Agent Framework' kullanmak için Hosted Agents öğesini seçin.

Yönlendirme ajanları

Aracınızın bilgisayar kullanım aracını kullanmasını sağlamak için, ResponseTool.CreateComputerTool() aracının araçlarını yapılandırırken kullanın. Bu örnekte zaman uyumlu kod kullanılmaktadır. Zaman uyumsuz kullanım için, GitHub .NET deposu için Azure SDK sample code örneğine bakın.

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)
                {
                    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);
    }
}

Beklenen çıkış

Aşağıdaki örnekte, önceki kod örneği çalıştırılırken beklenen çıkış gösterilmektedir:

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

Barındırılan aracılar

Bu örnek, Microsoft Agent Framework'ü kullanır ve aracıya bilgisayar kullanımı aracını sağlamak için AsAIAgent(...) kaynağından AIProjectClient ile birlikte FoundryAITool.CreateComputerTool(...) üzerinde Microsoft.Agents.AI.Foundry çağrısı yapar. Microsoft.Agents.AI.Foundry ve Azure.AI.Projects paketlerini yükleyin, AZURE_AI_PROJECT_ENDPOINT ve AZURE_AI_COMPUTER_USE_DEPLOYMENT_NAME ortam değişkenlerini ayarlayın ve az login ile oturum açın. Bu örnek ekran görüntüsü yardımcılarını içermez; eylem döngüsü ve varlık yardımcıları için tam örneğe bakın.

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}");

Beklenen çıkış

Eylem döngüsü tamamlandıktan sonra, aracının son yanıtı hangi sayfaya ulaştığını açıklar:

Response: I searched for "OpenAI news" in the address bar. The top results include articles from OpenAI's blog, TechCrunch, and The Verge ...

Tam ekran görüntüsü yardımcı uygulaması ve uçtan uca eylem döngüsü için bkz. Agent_Step15_ComputerUse.


Bilgisayar Kullanım Aracı ile Temsilci Kullanımı Örneği

Aşağıdaki TypeScript alıntısı, bilgisayar kullanım aracıyla aracı sürümü oluşturmayı, ekran görüntüsüyle bir ilk istek göndermeyi ve birden çok yineleme gerçekleştirmeyi gösterir. Yerel computerUseUtil.js bir yardımcıyı içeri aktarır ve bu makalede yer almamış ekran görüntüsü varlıklarını bekler. Alıntıyı tümleştirme ana hattı olarak değerlendirin ve bekleyen güvenlik denetimlerini onaylamadan önce uygulamaya ait eylem yürütme, ekran görüntüsü yakalama ve açık güvenlik onayı sağlayın.

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);
});

Beklenen çıkış

Aşağıdaki örnekte, önceki kod örneği çalıştırılırken beklenen çıkış gösterilmektedir:

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!

Java ajanında bilgisayar kullanımı

bağımlılığını öğesinin pom.xmliçine ekleyin:

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

Bilgisayar kullanım aracısı oluşturma

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());
    }
}

Simülasyon döngüsünün tamamı için bakımlı ComputerUseSync.java örneğiniComputerUseUtil.java yardımcısıyla birlikte kullanın. Yardımcı, istenen eylemleri önceden yakalanan ekran görüntüleriyle eşler. Bu benzetimi uygulamanızın eylem yürütücüsü, ekran görüntüsü yakalama ve güvenlik onayı akışıyla değiştirin.

REST API ile bilgisayar kullanımını kullanma

Erişim belirteci alma:

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

Bilgisayar kullanımıyla aracı oluşturma

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
        }
      ]
    }
  }'

Yanıt oluşturma

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"
  }'

Yanıt, yürütülecek eylemleri içeren çıkış öğelerini içerir computer_call . Her eylemi işleyin, ekran görüntülerini yakalayın ve sonuçları, yanıtlar uç noktasını previous_response_id ile kullanarak geri gönderin.

Ekran görüntüsüyle eylem sonuçlarını gönderme

Bilgisayar eylemini yürüttkten sonra (örneğin, tıklayın veya yazın), bir ekran görüntüsü yakalayın ve geri gönderin:

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>",
        "output": {
          "type": "computer_screenshot",
          "image_url": "data:image/png;base64,<BASE64_SCREENSHOT>"
        }
      }
    ]
  }'

, <RESPONSE_ID>ve <CALL_ID> değerlerini önceki yanıta ait değerlerle değiştirin<BASE64_SCREENSHOT>. Model yerine computer_callmetin yanıtı döndürene kadar bu döngüyü yineleyin.

Temizlemek

curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/computer-use-agent?api-version=v1" \
  -H "Authorization: Bearer $AGENT_TOKEN"

Bilgisayar kullanım aracıyla neler yapabileceğiniz

İstek ve yanıt döngüsünü tümleştirdikten sonra (ekran görüntüsü -> eylem -> ekran görüntüsü), bilgisayar kullanım aracı aracıya yardımcı olabilir:

  • Tıklama, yazma, kaydırma ve yeni bir ekran görüntüsü isteme gibi kullanıcı arabirimi eylemleri önerin.
  • Her eylemden sonra en son ekran görüntüsünü yeniden değerlendirerek kullanıcı arabirimi değişikliklerine uyarlayın.
  • Korumalı ortamınızı nasıl barındırdığınıza bağlı olarak tarayıcı ve masaüstü kullanıcı arabiriminde çalışın.

Araç bir cihazı doğrudan denetlemez. Uygulamanız istenen her eylemi yürütür ve güncelleştirilmiş bir ekran görüntüsü döndürür.

Tarayıcı otomasyonu ve bilgisayar kullanımı arasındaki farklar

Aşağıdaki tabloda, bilgisayar kullanım aracı ile tarayıcı otomasyon aracı arasındaki farklardan bazıları listelenmiştir.

Özelliği Tarayıcı Otomasyonu Bilgisayar kullanım aracı
Model desteği Tüm GPT modelleri Computer-use-preview yalnızca model
Neler olduğunu görselleştirebilir miyim? Hayır Evet
Ekranı nasıl anlar? HTML veya XML sayfalarını DOM belgelerine ayrıştırıyor Ekran görüntülerinden ham piksel verileri
Nasıl hareket eder? Model tarafından sağlanan eylemlerin listesi Sanal klavye ve fare
Çok adımlı mı? Evet Evet
Arayüz Tarayıcı Bilgisayar ve tarayıcı
Kendi kaynağımı getirmem gerekiyor mu? Bağlantı olarak depolanan anahtarlarla kendi Playwright kaynağınız. Ek kaynak gerekmez, ancak bu aracı korumalı bir ortamda çalıştırmanızı kesinlikle öneririz.

Her araç ne zaman kullanılır?

Aşağıdaki durumlarda bilgisayar kullanımını seçin:

  • Tarayıcının ötesindeki masaüstü uygulamalarıyla etkileşim kurma
  • Ekran görüntüleri aracılığıyla ajanın gördüklerini görselleştirme
  • DOM ayrıştırma özelliği kullanılamayan ortamlarda çalışma

İhtiyacınız olduğunda tarayıcı otomasyonlarını seçin:

  • Sınırlı erişim gereksinimleri olmadan yalnızca web etkileşimleri gerçekleştirme
  • Herhangi bir GPT modelini kullanın (yalnızca computer-use-preview ile sınırlı değildir)
  • Ekran görüntüsü yakalama ve eylem yürütme döngülerini yönetmekten kaçının

Bölgesel destek

Bilgisayar kullanım aracını kullanmak için bir bilgisayar kullanım modeli dağıtımına ihtiyacınız vardır. Bilgisayar kullanım modeli aşağıdaki bölgelerde kullanılabilir:

Bölge Durum
eastus2 Kullanılabilir
swedencentral Kullanılabilir
southindia Kullanılabilir

Bilgisayar kullanımının entegrasyonunu anlama

Bilgisayar kullanım aracıyla çalışırken, aşağıdaki adımları uygulayarak bunu uygulamanızla tümleştirin:

  1. Bilgisayar kullanım aracına, görüntü boyutuna ve ortama çağrı içeren modele bir istek gönderin. İlk API isteğine ortamın ilk durumunun ekran görüntüsünü de ekleyebilirsiniz.

  2. Modelden bir yanıt alın. Yanıtta eylem öğeleri varsa, bu öğeler belirtilen hedefe doğru ilerleme sağlamak için önerilen eylemleri içerir. Örneğin, modelin geçerli durumu güncelleştirilmiş bir ekran görüntüsüyle değerlendirilebilmesi için bir eylem screenshot veya fareyi taşımak için gereken X/Y koordinatlarını belirten bir eylem click olabilir.

  3. Bilgisayarınızda veya tarayıcı ortamınızda uygulama kodunuzu kullanarak eylemi yürütür.

  4. Eylemi yürüttkten sonra, ortamın güncelleştirilmiş durumunu ekran görüntüsü olarak yakalayın.

  5. Güncelleştirilmiş duruma sahip yeni bir tool_call_outputistek olarak gönderin ve model eylem isteğini durdurana veya siz durdurmaya karar verinceye kadar bu döngünün yinelenmesini sağlayın.

    Not

    Aracıyı kullanmadan önce ekran görüntülerini yakalayabilen ve aracı tarafından önerilen eylemleri yürütebilen bir ortam ayarlayın. Güvenlik nedeniyle Playwright gibi korumalı bir ortam kullanın.

Konuşma geçmişini yönetme

previous_response_id Geçerli isteği önceki yanıta bağlamak için parametresini kullanın. Her çağrıda konuşma geçmişinin tamamını göndermek istemiyorsanız bu parametreyi kullanın.

Bu parametreyi kullanmıyorsanız, önceki isteğin yanıt çıkışında döndürülen tüm öğeleri girişler dizinize eklediğinizden emin olun. Bu gereksinim, varsa akıl yürütme öğelerini içerir.

Güvenlik denetimleri ve güvenlikle ilgili dikkat edilmesi gerekenler

Uyarı

Bilgisayar kullanımı önemli güvenlik ve gizlilik riskleri ve kullanıcı sorumluluğu taşır. Hem yapay zeka tarafından yargılanabilir hatalar hem de web sayfalarında, masaüstlerinde veya yapay zekanın karşılaştığı diğer işletim ortamlarında kötü amaçlı veya kafa karıştırıcı yönergelerin bulunması sizin veya başkalarının istemediğiniz komutları yürütmesine neden olabilir. Bu riskler, kişisel, finansal veya kurumsal sistemler dahil olmak üzere sizin veya diğer kullanıcılarınızın tarayıcılarının, bilgisayarlarının ve yapay zekanın erişimi olan tüm hesapların güvenliğini tehlikeye atabilir.

Hassas verilere veya kritik kaynaklara erişimi olmayan sanal makinelerde bilgisayar kullanım aracını kullanın. Kullanım örneği seçerken amaçlanan kullanımlar, yetenekler, sınırlamalar, riskler ve dikkat edilmesi gerekenler hakkında daha fazla bilgi için bkz. Azure OpenAI saydamlık notu.

API' nin, istem ekleme ve model hatalarına karşı korumaya yardımcı olmak için güvenlik denetimleri vardır. Bu denetimler şunlardır:

Kötü amaçlı yönerge algılama: Sistem ekran görüntüsünü değerlendirir ve modelin davranışını değiştirebilecek saldırgan içerik içerip içermediğini denetler.

İlgisiz etki alanı algılama: Sistem parametreyi current_url değerlendirir (sağlanırsa) ve konuşma geçmişine göre geçerli etki alanının uygun olup olmadığını denetler.

Hassas etki alanı algılama: Sistem parametreyi current_url denetler (sağlanırsa) ve kullanıcının hassas bir etki alanında olduğunu algıladığında bir uyarı oluşturur.

Önceki denetimlerden biri veya daha fazlası tetiklenirse, model computer_call parametresini kullanarak sonraki pending_safety_checks döndürüldüğünde bir güvenlik denetimi başlatır.

"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" 
    } 
]

Devam etmek için bir sonraki istekte olduğu gibi acknowledged_safety_checks güvenlik denetimlerini geri geçirmeniz gerekir.

"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>" 
            } 
        } 
    ]

Güvenlik denetimi işleme

Eylemleri doğru model davranışı ve doğruluğunu onaylamak için, pending_safety_checks döndürüldüğü her durumda son kullanıcıya teslim edin.

malicious_instructions ve irrelevant_domain: Son kullanıcılar model eylemlerini gözden geçirmeli ve modelin amaçlandığı gibi davrandığını onaylamalıdır.

sensitive_domain: Bir son kullanıcının bu sitelerdeki model eylemlerini etkin bir şekilde izlediğinden emin olun. Bu "izleme modunun" tam olarak uygulanması uygulamaya göre farklılık gösterebilir, ancak olası bir örnek, uygulamayla etkin son kullanıcı etkileşimi olduğundan emin olmak için sitede kullanıcı izlenimi verilerini toplamak olabilir.

Sorun giderme

Sorunu Neden Çözünürlük
Yanıtta bir computer_call görmezsiniz. Aracı bilgisayar kullanım aracıyla yapılandırılmamış, dağıtım bir bilgisayar kullanım modeli değildir veya istem kullanıcı arabirimi etkileşimi gerektirmez. Temsilcinin bir computer_use_preview araca sahip olduğunu, dağıtımınızın computer-use-preview model olduğunu ve talebinizin kullanıcı arabirimi eylemi (yazmak, tıklamak veya ekran görüntüsü alma) gerektirdiğini onaylayın.
Örnek kod eksik yardımcı dosyaları veya ekran görüntüleriyle başarısız oluyor. Alıntılar, bu belge deposunun parçası olmayan yardımcı yardımcı programlara ve örnek görüntülere başvurur. "Bakımlı SDK örneklerini çalıştırma" bölümündeki bakımlı örneklerden birini kopyalayarak yardımcısının ve varlıklarının beklenen göreli konumlarda kalmasını sağlayın. TypeScript için kendi yardımcınızı ve ekran görüntüsü varlıklarınızı sağlayın.
Döngü yineleme sınırında durur. Görevin daha fazla dönüşe ihtiyacı var veya uygulama modelin istediği eylemleri uygulamıyor. Yineleme sınırını artırın ve kodunuzun istenen eylemi yürüttüğünden ve her turdan sonra yeni bir ekran görüntüsü gönderdiğinden emin olun.
alırsınız pending_safety_checks. Hizmet olası bir güvenlik riski (örneğin, istem ekleme veya hassas bir etki alanı) algıladı. Otomasyonu duraklatın, bir son kullanıcının isteği gözden geçirmesini sağlayın ve sadece acknowledged_safety_checks öğesiyle sonraki computer_call_output gönderdikten sonra devam edin.
Model, ilerleme olmadan "ekran görüntüsü alma" işlemini yineler. Ekran görüntüsü güncelleştirilmiyor, düşük kaliteli veya ilgili kullanıcı arabirimi durumunu göstermiyor. Her eylemden sonra yeni bir ekran görüntüsü gönderin ve gerektiğinde daha ayrıntılı bir görüntü kullanın. Ekran görüntüsünde ilgili kullanıcı arabiriminin bulunduğundan emin olun.
computer-use-preview model istenirken erişim reddedildi. Erişim için kaydolmadınız veya erişim verilmedi. Başvuru formunu gönderin ve onay bekleyin. Onay için e-postanızı kontrol edin.
Şifreleme hatalarının ekran görüntüsü. Görüntü biçimi desteklenmiyor veya base64 kodlama sorunu. PNG veya JPEG biçimini kullanın. Bozulma olmadan düzgün base64 kodlaması sağlayın. Resim boyutlarının display_width ve display_height ile eşleşip eşleşmediğini denetleyin.
Eylemler yanlış koordinatlarda yürütülür. Ekran görüntüsü ile gerçek ekran arasındaki ekran çözünürlüğü uyuşmazlığı. display_width ve display_height öğelerinin ComputerUsePreviewTool içinde gerçek ekran çözünürlüğünüzle eşleştiğinden emin olun.
Model kullanıcı arabirimi öğelerini yanlış algılar. Ekran görüntüsü kalitesi çok düşük veya kullanıcı arabirimi dönüşler arasında değişti. Daha yüksek çözünürlüklü ekran görüntüleri kullanın. Her eylemden hemen sonra yeni ekran görüntüleri gönderin. Eylem ve ekran görüntüsü arasındaki gecikmeyi azaltın.