AppAgent 👾

Ein AppAgent ist dafür verantwortlich, Aktionen auf den ausgewählten Anwendungen iterativ auszuführen, bis die Aufgabe erfolgreich innerhalb einer bestimmten Anwendung abgeschlossen ist. Der AppAgent wird vom HostAgent erstellt, um eine Teilaufgabe innerhalb einer Round zu erfüllen. Der AppAgent ist für die Ausführung der notwendigen Aktionen innerhalb der Anwendung verantwortlich, um die Anfrage des Benutzers zu erfüllen. Der AppAgent verfügt über die folgenden Funktionen

  1. ReAct mit der Anwendung - Der AppAgent interagiert rekursiv mit der Anwendung in einem Workflow aus Beobachtung->Gedanke->Aktion und nutzt die multimodalen Fähigkeiten von visuellen Sprachmodellen (VLMs), um die Anwendungs-UI zu verstehen und die Anfrage des Benutzers zu erfüllen.
  2. Verbesserung des Verständnisses - Der AppAgent wird durch Retrieval Augmented Generation (RAG) aus heterogenen Quellen, einschließlich externer Wissensdatenbanken und Demonstrationsbibliotheken, erweitert, was den Agenten zu einem Anwendungs-"Experten" macht.
  3. Vielseitiges Fähigkeitenset - Der AppAgent ist mit einer Vielzahl von Fähigkeiten ausgestattet, um eine umfassende Automatisierung zu unterstützen, wie z. B. Maus, Tastatur, native APIs und "Copilot".

Tipp

Wie Sie den AppAgent mit externen Wissensdatenbanken und Demonstrationsbibliotheken erweitern können, finden Sie in der Dokumentation Reinforcing AppAgent.

Wir zeigen das Framework des AppAgent im folgenden Diagramm

AppAgent Image

AppAgent Eingabe

Um mit der Anwendung zu interagieren, erhält der AppAgent die folgenden Eingaben

Input Beschreibung Typ
Benutzeranfrage Die Anfrage des Benutzers in natürlicher Sprache. String
Teilaufgabe Die Beschreibung der Teilaufgabe, die vom AppAgent ausgeführt werden soll und die vom HostAgent zugewiesen wurde. String
Aktuelle Anwendung Der Name der Anwendung, mit der interagiert werden soll. String
Steuerinformationen Index, Name und Steuerungsart der verfügbaren Steuerelemente in der Anwendung. Liste von Wörterbüchern
Screenshots der Anwendung Screenshots der Anwendung, einschließlich eines sauberen Screenshots, eines annotierten Screenshots mit beschrifteten Steuerelementen und eines Screenshots mit einem Rechteck um das ausgewählte Steuerelement im vorherigen Schritt (optional). Liste von Zeichenketten
Vorherige Teilaufgaben Die vorherigen Teilaufgaben und ihr Abschlussstatus. Liste von Zeichenketten
Vorheriger Plan Der vorherige Plan für die folgenden Schritte. Liste von Zeichenketten
HostAgent-Nachricht Die Nachricht vom HostAgent zur Erledigung der Teilaufgabe. String
Abgerufene Informationen Die abgerufenen Informationen aus externen Wissensdatenbanken oder Demonstrationsbibliotheken. String
Blackboard Der gemeinsame Speicherbereich zum Speichern und Teilen von Informationen zwischen den Agenten. Dictionary

Unten sehen Sie ein Beispiel für den annotierten Anwendungsscreenshot mit beschrifteten Steuerelementen. Dies folgt dem Set-of-Mark-Paradigma.

AppAgent Image

Durch die Verarbeitung dieser Eingaben bestimmt der AppAgent die notwendigen Aktionen, um die Anfrage des Benutzers innerhalb der Anwendung zu erfüllen.

Tipp

Ob der saubere Screenshot und der annotierte Screenshot verkettet werden sollen, kann im Feld CONCAT_SCREENSHOT in der Datei config_dev.yaml konfiguriert werden.

Tipp

Ob der Screenshot mit einem Rechteck um das ausgewählte Steuerelement im vorherigen Schritt enthalten sein soll, kann im Feld INCLUDE_LAST_SCREENSHOT in der Datei config_dev.yaml konfiguriert werden.

AppAgent Ausgabe

Mit den bereitgestellten Eingaben generiert der AppAgent die folgenden Ausgaben

Ausgabe Beschreibung Typ
Beobachtung Die Beobachtung der aktuellen Anwendungsscreenshots. String
Gedanke Der logische Denkprozess des AppAgent. String
ControlLabel Der Index des ausgewählten Steuerelements zur Interaktion. String
ControlText Der Name des ausgewählten Steuerelements zur Interaktion. String
Funktion Die Funktion, die auf dem ausgewählten Steuerelement ausgeführt werden soll. String
Args Die für die Funktionsausführung erforderlichen Argumente. Liste von Zeichenketten
Status Der Status des Agenten, zugeordnet dem AgentState. String
Plan Der Plan für die folgenden Schritte nach der aktuellen Aktion. Liste von Zeichenketten
Kommentar Zusätzliche Kommentare oder Informationen für den Benutzer. String
Screenshot speichern Das Flag zum Speichern des Screenshots der Anwendung im blackboard für zukünftige Referenz. Boolean

Unten sehen Sie ein Beispiel für die Ausgabe des AppAgent

{
    "Observation": "Application screenshot",
    "Thought": "Logical reasoning process",
    "ControlLabel": "Control index",
    "ControlText": "Control name",
    "Function": "Function name",
    "Args": ["arg1", "arg2"],
    "Status": "AgentState",
    "Plan": ["Step 1", "Step 2"],
    "Comment": "Additional comments",
    "SaveScreenshot": true
}

Info

Die Ausgabe des AppAgent wird von LLMs als JSON-Objekt formatiert und kann mit der Methode json.loads in Python geparst werden.

AppAgent Zustand

Der Zustand des AppAgent wird von einer Zustandsmaschine verwaltet, die die nächste auszuführende Aktion basierend auf dem aktuellen Zustand bestimmt, wie im Modul ufo/agents/states/app_agent_states.py definiert. Die Zustände umfassen

Status Beschreibung
WEITER Hauptausführungsschleife; wertet aus, welche Teilaufgaben bereit zum Starten oder Fortsetzen sind.
ZUWEISEN Wählt einen verfügbaren Anwendungsprozess aus und startet den entsprechenden AppAgent.
AUSSTEHEND Wartet auf Benutzereingaben zur Auflösung von Mehrdeutigkeiten oder zur Sammlung zusätzlicher Aufgabenparameter.
BEENDEN Alle Teilaufgaben abgeschlossen; bereinigt Agenteninstanzen und schließt den Sitzungsstatus ab.
FEHLER Tritt in den Wiederherstellungs- oder Abbruchmodus bei nicht behebbarem Fehler.

Das Zustandsmaschinendiagramm für den AppAgent ist unten dargestellt

Der AppAgent durchläuft diese Zustände, um die notwendigen Aktionen innerhalb der Anwendung auszuführen und die vom HostAgent zugewiesene Teilaufgabe zu erfüllen.

Wissenserweiterung

Der AppAgent wird durch Retrieval Augmented Generation (RAG) aus heterogenen Quellen, einschließlich externer Wissensdatenbanken und Demonstrationsbibliotheken, erweitert. Der AppAgent nutzt dieses Wissen, um sein Verständnis der Anwendung zu verbessern und aus Demonstrationen zu lernen, um seine Leistung zu steigern.

Lernen aus Hilfedokumenten

Der Benutzer kann dem AppAgent in der Datei config.yaml Hilfedokumente zur Verfügung stellen, um dessen Verständnis der Anwendung zu verbessern und dessen Leistung zu steigern.

Tipp

Details zur Konfiguration finden Sie in der Dokumentation.

Tipp

Sie können sich auch hier darauf beziehen, wie Sie dem AppAgent Hilfedokumente zur Verfügung stellen.

Im AppAgent ruft er build_offline_docs_retriever auf, um einen Retriever für Hilfedokumente zu erstellen, und verwendet retrived_documents_prompt_helper, um den Prompt für den AppAgent zu erstellen.

Da Hilfedokumente möglicherweise nicht alle Informationen abdecken oder die Informationen veraltet sein können, kann der AppAgent auch die Bing-Suche nutzen, um die neuesten Informationen abzurufen. Sie können die Bing-Suche aktivieren und die Suchmaschine in der Datei config.yaml konfigurieren.

Tipp

Details zur Konfiguration finden Sie in der Dokumentation.

Tipp

Sie können sich auch hier auf die Implementierung der Bing-Suche im AppAgent beziehen.

Im AppAgent ruft er build_online_search_retriever auf, um einen Bing-Such-Retriever zu erstellen, und verwendet retrived_documents_prompt_helper, um den Prompt für den AppAgent zu erstellen.

Lernen aus Selbstdemonstrationen

Sie können erfolgreiche Aktionsbahnen im AppAgent speichern, um aus Selbstdemonstrationen zu lernen und seine Leistung zu verbessern. Nach Abschluss einer session wird der AppAgent den Benutzer fragen, ob die Aktionsbahnen für zukünftige Referenzen gespeichert werden sollen. Sie können die Nutzung von Selbstdemonstrationen in der Datei config.yaml konfigurieren.

Tipp

Details zur Konfiguration finden Sie in der Dokumentation.

Tipp

Sie können sich auch hier auf die Implementierung von Selbstdemonstrationen im AppAgent beziehen.

Im AppAgent ruft er build_experience_retriever auf, um einen Retriever für Selbstdemonstrationen zu erstellen, und verwendet rag_experience_retrieve, um die Demonstration für den AppAgent abzurufen.

Lernen aus menschlichen Demonstrationen

Zusätzlich zu Selbstdemonstrationen können Sie dem AppAgent auch menschliche Demonstrationen zur Verfügung stellen, um seine Leistung zu verbessern, indem Sie das in das Windows-Betriebssystem integrierte Tool Schritt-Aufzeichner verwenden. Der AppAgent lernt aus den menschlichen Demonstrationen, um seine Leistung zu verbessern und eine bessere Personalisierung zu erzielen. Die Nutzung menschlicher Demonstrationen kann in der Datei config.yaml konfiguriert werden.

Tipp

Details zur Konfiguration finden Sie in der Dokumentation.

Tipp

Sie können sich auch hier auf die Implementierung menschlicher Demonstrationen im AppAgent beziehen.

Im AppAgent ruft er build_human_demonstration_retriever auf, um einen Retriever für menschliche Demonstrationen zu erstellen, und verwendet rag_experience_retrieve, um die Demonstration für den AppAgent abzurufen.

Fähigkeiten zur Automatisierung

Der AppAgent ist mit einem vielseitigen Fähigkeitenset ausgestattet, um eine umfassende Automatisierung innerhalb der Anwendung durch den Aufruf der Methode create_puppeteer_interface zu unterstützen. Die Fähigkeiten umfassen

Fähigkeit Beschreibung
UI-Automatisierung Nachahmung von Benutzerinteraktionen mit den UI-Steuerelementen der Anwendung mithilfe der UI Automation und der Win32 API.
Native API Zugriff auf die native API der Anwendung, um spezifische Funktionen und Aktionen auszuführen.
In-App-Agent Nutzung des In-App-Agenten zur Interaktion mit den internen Funktionen und Features der Anwendung.

Durch die Nutzung dieser Fähigkeiten kann der AppAgent effizient mit der Anwendung interagieren und die Anfrage des Benutzers erfüllen. Weitere Details finden Sie in der Automator-Dokumentation und im Code im Modul ufo/automator.

Referenz

Basiert auf: BasicAgent

Die AppAgent-Klasse, die die Interaktion mit der Anwendung verwaltet.

Initialisiert den AppAgent. :name: Der Name des Agenten.

Parameter
  • process_name (str) –

    Der Prozessname der App.

  • app_root_name (str) –

    Der Root-Name der App.

  • is_visual (bool) –

    Das Flag, das angibt, ob der Agent visuell ist oder nicht.

  • main_prompt (str) –

    Der Pfad zur Haupt-Prompt-Datei.

  • example_prompt (str) –

    Der Pfad zur Beispiel-Prompt-Datei.

  • api_prompt (str) –

    Der Pfad zur API-Prompt-Datei.

  • skip_prompter (bool, Standard: False ) –

    Das Flag, das angibt, ob die Prompter-Initialisierung übersprungen werden soll.

  • mode (str, Standard: 'normal' ) –

    Der Modus des Agenten.

Quellcode in agents/agent/app_agent.py
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
def __init__(
    self,
    name: str,
    process_name: str,
    app_root_name: str,
    is_visual: bool,
    main_prompt: str,
    example_prompt: str,
    api_prompt: str,
    skip_prompter: bool = False,
    mode: str = "normal",
) -> None:
    """
    Initialize the AppAgent.
    :name: The name of the agent.
    :param process_name: The process name of the app.
    :param app_root_name: The root name of the app.
    :param is_visual: The flag indicating whether the agent is visual or not.
    :param main_prompt: The main prompt file path.
    :param example_prompt: The example prompt file path.
    :param api_prompt: The API prompt file path.
    :param skip_prompter: The flag indicating whether to skip the prompter initialization.
    :param mode: The mode of the agent.
    """
    super().__init__(name=name)
    if not skip_prompter:
        self.prompter = self.get_prompter(
            is_visual, main_prompt, example_prompt, api_prompt, app_root_name
        )
    self._process_name = process_name
    self._app_root_name = app_root_name
    self.offline_doc_retriever = None
    self.online_doc_retriever = None
    self.experience_retriever = None
    self.human_demonstration_retriever = None

    self.Puppeteer = self.create_puppeteer_interface()
    self._mode = mode

    control_detection_backend = configs.get("CONTROL_BACKEND", ["uia"])

    if "omniparser" in control_detection_backend:
        omniparser_endpoint = configs.get("OMNIPARSER", {}).get("ENDPOINT", "")
        omniparser_service = OmniParser(endpoint=omniparser_endpoint)
        self.grounding_service: Optional[BasicGrounding] = OmniparserGrounding(
            service=omniparser_service
        )
    else:
        self.grounding_service: Optional[BasicGrounding] = None

    self.set_state(self.default_state)

default_state property

Ruft den Standardzustand ab.

mode property

Ruft den Modus der Sitzung ab.

status_manager property

Ruft den Statusmanager ab.

build_experience_retriever(db_path)

Erstellt den Erfahrung-Retriever.

Parameter
  • db_path (str) –

    Der Pfad zur Erfahrungsdatenbank.

Rückgabe
  • None

    Der Erfahrung-Retriever.

Quellcode in agents/agent/app_agent.py
448
449
450
451
452
453
454
455
456
def build_experience_retriever(self, db_path: str) -> None:
    """
    Build the experience retriever.
    :param db_path: The path to the experience database.
    :return: The experience retriever.
    """
    self.experience_retriever = self.retriever_factory.create_retriever(
        "experience", db_path
    )

build_human_demonstration_retriever(db_path)

Erstellt den Retriever für menschliche Demonstrationen.

Parameter
  • db_path (str) –

    Der Pfad zur Datenbank für menschliche Demonstrationen.

Rückgabe
  • None

    Der Retriever für menschliche Demonstrationen.

Quellcode in agents/agent/app_agent.py
458
459
460
461
462
463
464
465
466
def build_human_demonstration_retriever(self, db_path: str) -> None:
    """
    Build the human demonstration retriever.
    :param db_path: The path to the human demonstration database.
    :return: The human demonstration retriever.
    """
    self.human_demonstration_retriever = self.retriever_factory.create_retriever(
        "demonstration", db_path
    )

build_offline_docs_retriever()

Erstellt den Retriever für Offline-Dokumente.

Quellcode in agents/agent/app_agent.py
430
431
432
433
434
435
436
def build_offline_docs_retriever(self) -> None:
    """
    Build the offline docs retriever.
    """
    self.offline_doc_retriever = self.retriever_factory.create_retriever(
        "offline", self._app_root_name
    )

build_online_search_retriever(request, top_k)

Erstellt den Retriever für Online-Suche.

Parameter
  • request (str) –

    Die Anfrage für die Online-Bing-Suche.

  • top_k (int) –

    Die Anzahl der abzurufenden Dokumente.

Quellcode in agents/agent/app_agent.py
438
439
440
441
442
443
444
445
446
def build_online_search_retriever(self, request: str, top_k: int) -> None:
    """
    Build the online search retriever.
    :param request: The request for online Bing search.
    :param top_k: The number of documents to retrieve.
    """
    self.online_doc_retriever = self.retriever_factory.create_retriever(
        "online", request, top_k
    )

context_provision(request='')

Stellt den Kontext für den App-Agenten bereit.

Parameter
  • request (str, Standard: '' ) –

    Die an den Bing-Such-Retriever gesendete Anfrage.

Quellcode in agents/agent/app_agent.py
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
def context_provision(self, request: str = "") -> None:
    """
    Provision the context for the app agent.
    :param request: The request sent to the Bing search retriever.
    """

    # Load the offline document indexer for the app agent if available.
    if configs["RAG_OFFLINE_DOCS"]:
        utils.print_with_color(
            "Loading offline help document indexer for {app}...".format(
                app=self._process_name
            ),
            "magenta",
        )
        self.build_offline_docs_retriever()

    # Load the online search indexer for the app agent if available.

    if configs["RAG_ONLINE_SEARCH"] and request:
        utils.print_with_color("Creating a Bing search indexer...", "magenta")
        self.build_online_search_retriever(
            request, configs["RAG_ONLINE_SEARCH_TOPK"]
        )

    # Load the experience indexer for the app agent if available.
    if configs["RAG_EXPERIENCE"]:
        utils.print_with_color("Creating an experience indexer...", "magenta")
        experience_path = configs["EXPERIENCE_SAVED_PATH"]
        db_path = os.path.join(experience_path, "experience_db")
        self.build_experience_retriever(db_path)

    # Load the demonstration indexer for the app agent if available.
    if configs["RAG_DEMONSTRATION"]:
        utils.print_with_color("Creating an demonstration indexer...", "magenta")
        demonstration_path = configs["DEMONSTRATION_SAVED_PATH"]
        db_path = os.path.join(demonstration_path, "demonstration_db")
        self.build_human_demonstration_retriever(db_path)

create_puppeteer_interface()

Erstellt die Puppeteer-Schnittstelle zur Automatisierung der App.

Rückgabe
  • AppPuppeteer

    Die Puppeteer-Schnittstelle.

Quellcode in agents/agent/app_agent.py
394
395
396
397
398
399
def create_puppeteer_interface(self) -> puppeteer.AppPuppeteer:
    """
    Create the Puppeteer interface to automate the app.
    :return: The Puppeteer interface.
    """
    return puppeteer.AppPuppeteer(self._process_name, self._app_root_name)

demonstration_prompt_helper(request)

Ruft die Beispiele und Tipps für den AppAgent mithilfe des Demonstrations-Retrievers ab.

Parameter
  • request

    Die Anfrage für den AppAgent.

Rückgabe
  • Tuple[List[Dict[str, Any]]]

    Die Beispiele und Tipps für den AppAgent.

Quellcode in agents/agent/app_agent.py
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
def demonstration_prompt_helper(self, request) -> Tuple[List[Dict[str, Any]]]:
    """
    Get the examples and tips for the AppAgent using the demonstration retriever.
    :param request: The request for the AppAgent.
    :return: The examples and tips for the AppAgent.
    """

    # Get the examples and tips for the AppAgent using the experience and demonstration retrievers.
    if configs["RAG_EXPERIENCE"]:
        experience_results = self.rag_experience_retrieve(
            request, configs["RAG_EXPERIENCE_RETRIEVED_TOPK"]
        )
    else:
        experience_results = []

    if configs["RAG_DEMONSTRATION"]:
        demonstration_results = self.rag_demonstration_retrieve(
            request, configs["RAG_DEMONSTRATION_RETRIEVED_TOPK"]
        )
    else:
        demonstration_results = []

    return experience_results, demonstration_results

external_knowledge_prompt_helper(request, offline_top_k, online_top_k)

Ruft externes Wissen ab und erstellt den Prompt.

Parameter
  • request (str) –

    Die Anfrage.

  • offline_top_k (int) –

    Die Anzahl der abzurufenden Offline-Dokumente.

  • online_top_k (int) –

    Die Anzahl der abzurufenden Online-Dokumente.

Rückgabe
  • Tuple[str, str]

    Die Prompt-Nachricht für das externe Wissen.

Quellcode in agents/agent/app_agent.py
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
def external_knowledge_prompt_helper(
    self, request: str, offline_top_k: int, online_top_k: int
) -> Tuple[str, str]:
    """
    Retrieve the external knowledge and construct the prompt.
    :param request: The request.
    :param offline_top_k: The number of offline documents to retrieve.
    :param online_top_k: The number of online documents to retrieve.
    :return: The prompt message for the external_knowledge.
    """

    # Retrieve offline documents and construct the prompt
    if self.offline_doc_retriever:

        offline_docs = self.offline_doc_retriever.retrieve(
            request,
            offline_top_k,
            filter=None,
        )

        format_string = "[Similar Requests]: {question}\nStep: {answer}\n"

        offline_docs_prompt = self.prompter.retrived_documents_prompt_helper(
            "[Help Documents]",
            "",
            [
                format_string.format(
                    question=doc.metadata.get("title", ""),
                    answer=doc.metadata.get("text", ""),
                )
                for doc in offline_docs
            ],
        )
    else:
        offline_docs_prompt = ""

    # Retrieve online documents and construct the prompt
    if self.online_doc_retriever:
        online_search_docs = self.online_doc_retriever.retrieve(
            request, online_top_k, filter=None
        )
        online_docs_prompt = self.prompter.retrived_documents_prompt_helper(
            "Online Search Results",
            "Search Result",
            [doc.page_content for doc in online_search_docs],
        )
    else:
        online_docs_prompt = ""

    return offline_docs_prompt, online_docs_prompt

get_prompter(is_visual, main_prompt, example_prompt, api_prompt, app_root_name)

Ruft den Prompt für den Agenten ab.

Parameter
  • is_visual (bool) –

    Das Flag, das angibt, ob der Agent visuell ist oder nicht.

  • main_prompt (str) –

    Der Pfad zur Haupt-Prompt-Datei.

  • example_prompt (str) –

    Der Pfad zur Beispiel-Prompt-Datei.

  • api_prompt (str) –

    Der Pfad zur API-Prompt-Datei.

  • app_root_name (str) –

    Der Root-Name der App.

Rückgabe
  • AppAgentPrompter

    Die Prompter-Instanz.

Quellcode in agents/agent/app_agent.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
def get_prompter(
    self,
    is_visual: bool,
    main_prompt: str,
    example_prompt: str,
    api_prompt: str,
    app_root_name: str,
) -> AppAgentPrompter:
    """
    Get the prompt for the agent.
    :param is_visual: The flag indicating whether the agent is visual or not.
    :param main_prompt: The main prompt file path.
    :param example_prompt: The example prompt file path.
    :param api_prompt: The API prompt file path.
    :param app_root_name: The root name of the app.
    :return: The prompter instance.
    """
    return AppAgentPrompter(
        is_visual, main_prompt, example_prompt, api_prompt, app_root_name
    )

message_constructor(dynamic_examples, dynamic_knowledge, image_list, control_info, prev_subtask, plan, request, subtask, current_application, host_message, blackboard_prompt, last_success_actions, include_last_screenshot)

Konstruiert die Prompt-Nachricht für den AppAgent.

Parameter
  • dynamic_examples (str) –

    Die dynamischen Beispiele, die aus der Selbstdemonstration und menschlichen Demonstration abgerufen wurden.

  • dynamic_knowledge (str) –

    Das dynamische Wissen, das aus der externen Wissensdatenbank abgerufen wurde.

  • image_list (List) –

    Die Liste der Screenshot-Bilder.

  • control_info (str) –

    Die Steuerinformationen.

  • plan (List[str]) –

    Die Planliste.

  • request (str) –

    Die gesamte Benutzeranfrage.

  • subtask (str) –

    Die Teilaufgabe, die der aktuelle AppAgent verarbeiten soll.

  • current_application (str) –

    Der Name der aktuellen Anwendung.

  • host_message (List[str]) –

    Die Nachricht vom HostAgent.

  • blackboard_prompt (List[Dict[str, str]]) –

    Die Prompt-Nachricht vom Blackboard.

  • last_success_actions (List[Dict[str, Any]]) –

    Die Liste der erfolgreichen Aktionen im letzten Schritt.

  • include_last_screenshot (bool) –

    Das Flag, das angibt, ob der letzte Screenshot enthalten sein soll.

Rückgabe
  • List[Dict[str, Union[str, List[Dict[str, str]]]]]

    Die Prompt-Nachricht.

Quellcode in agents/agent/app_agent.py
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
def message_constructor(
    self,
    dynamic_examples: str,
    dynamic_knowledge: str,
    image_list: List,
    control_info: str,
    prev_subtask: List[Dict[str, str]],
    plan: List[str],
    request: str,
    subtask: str,
    current_application: str,
    host_message: List[str],
    blackboard_prompt: List[Dict[str, str]],
    last_success_actions: List[Dict[str, Any]],
    include_last_screenshot: bool,
) -> List[Dict[str, Union[str, List[Dict[str, str]]]]]:
    """
    Construct the prompt message for the AppAgent.
    :param dynamic_examples: The dynamic examples retrieved from the self-demonstration and human demonstration.
    :param dynamic_knowledge: The dynamic knowledge retrieved from the external knowledge base.
    :param image_list: The list of screenshot images.
    :param control_info: The control information.
    :param plan: The plan list.
    :param request: The overall user request.
    :param subtask: The subtask for the current AppAgent to process.
    :param current_application: The current application name.
    :param host_message: The message from the HostAgent.
    :param blackboard_prompt: The prompt message from the blackboard.
    :param last_success_actions: The list of successful actions in the last step.
    :param include_last_screenshot: The flag indicating whether to include the last screenshot.
    :return: The prompt message.
    """
    appagent_prompt_system_message = self.prompter.system_prompt_construction(
        dynamic_examples
    )

    appagent_prompt_user_message = self.prompter.user_content_construction(
        image_list=image_list,
        control_item=control_info,
        prev_subtask=prev_subtask,
        prev_plan=plan,
        user_request=request,
        subtask=subtask,
        current_application=current_application,
        host_message=host_message,
        retrieved_docs=dynamic_knowledge,
        last_success_actions=last_success_actions,
        include_last_screenshot=include_last_screenshot,
    )

    if blackboard_prompt:
        appagent_prompt_user_message = (
            blackboard_prompt + appagent_prompt_user_message
        )

    appagent_prompt_message = self.prompter.prompt_construction(
        appagent_prompt_system_message, appagent_prompt_user_message
    )

    return appagent_prompt_message

print_response(response_dict, print_action=True)

Gibt die Antwort aus.

Parameter
  • response_dict (Dict[str, Any]) –

    Das auszugebende Antwort-Wörterbuch.

  • print_action (bool, Standard: True ) –

    Das Flag, das angibt, ob die Aktion ausgegeben werden soll.

Quellcode in agents/agent/app_agent.py
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
def print_response(
    self, response_dict: Dict[str, Any], print_action: bool = True
) -> None:
    """
    Print the response.
    :param response_dict: The response dictionary to print.
    :param print_action: The flag indicating whether to print the action.
    """

    control_text = response_dict.get("ControlText")
    control_label = response_dict.get("ControlLabel")
    if not control_text and not control_label:
        control_text = "[No control selected.]"
        control_label = "[No control label selected.]"
    observation = response_dict.get("Observation")
    thought = response_dict.get("Thought")
    plan = response_dict.get("Plan")
    status = response_dict.get("Status")
    comment = response_dict.get("Comment")
    function_call = response_dict.get("Function")
    args = utils.revise_line_breaks(response_dict.get("Args"))

    # Generate the function call string
    action = self.Puppeteer.get_command_string(function_call, args)

    utils.print_with_color(
        "Observations👀: {observation}".format(observation=observation), "cyan"
    )
    utils.print_with_color("Thoughts💡: {thought}".format(thought=thought), "green")
    if print_action:
        utils.print_with_color(
            "Selected item🕹️: {control_text}, Label: {label}".format(
                control_text=control_text, label=control_label
            ),
            "yellow",
        )
        utils.print_with_color(
            "Action applied⚒️: {action}".format(action=action), "blue"
        )
        utils.print_with_color("Status📊: {status}".format(status=status), "blue")
    utils.print_with_color(
        "Next Plan📚: {plan}".format(plan="\n".join(plan)), "cyan"
    )
    utils.print_with_color("Comment💬: {comment}".format(comment=comment), "green")

    screenshot_saving = response_dict.get("SaveScreenshot", {})

    if screenshot_saving.get("save", False):
        utils.print_with_color(
            "Notice: The current screenshot📸 is saved to the blackboard.",
            "yellow",
        )
        utils.print_with_color(
            "Saving reason: {reason}".format(
                reason=screenshot_saving.get("reason")
            ),
            "yellow",
        )

process(context)

Verarbeitet den Agenten.

Parameter
  • context (Context) –

    Der Kontext.

Quellcode in agents/agent/app_agent.py
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
def process(self, context: Context) -> None:
    """
    Process the agent.
    :param context: The context.
    """
    if configs.get("ACTION_SEQUENCE", False):
        self.processor = AppAgentActionSequenceProcessor(
            agent=self, context=context, ground_service=self.grounding_service
        )
    else:
        self.processor = AppAgentProcessor(
            agent=self, context=context, ground_service=self.grounding_service
        )
    self.processor.process()
    self.status = self.processor.status

process_comfirmation()

Verarbeitet die Benutzerbestätigung.

Rückgabe
  • bool

    Die Entscheidung.

Quellcode in agents/agent/app_agent.py
401
402
403
404
405
406
407
408
409
410
411
412
413
414
def process_comfirmation(self) -> bool:
    """
    Process the user confirmation.
    :return: The decision.
    """
    action = self.processor.actions
    control_text = self.processor.control_text

    decision = interactor.sensitive_step_asker(action, control_text)

    if not decision:
        utils.print_with_color("The user has canceled the action.", "red")

    return decision

rag_demonstration_retrieve(request, demonstration_top_k)

Ruft Demonstrationsbeispiele für die Benutzeranfrage ab.

Parameter
  • request (str) –

    Die Anfrage des Benutzers.

  • demonstration_top_k (int) –

    Die Anzahl der abzurufenden Dokumente.

Rückgabe
  • str

    Der abgerufene String mit Beispielen und Tipps.

Quellcode in agents/agent/app_agent.py
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
def rag_demonstration_retrieve(self, request: str, demonstration_top_k: int) -> str:
    """
    Retrieving demonstration examples for the user request.
    :param request: The user request.
    :param demonstration_top_k: The number of documents to retrieve.
    :return: The retrieved examples and tips string.
    """

    retrieved_docs = []

    # Retrieve demonstration examples.
    demonstration_docs = self.human_demonstration_retriever.retrieve(
        request, demonstration_top_k
    )

    if demonstration_docs:
        for doc in demonstration_docs:
            example_request = doc.metadata.get("request", "")
            response = doc.metadata.get("example", {})
            subtask = doc.metadata.get("Sub-task", "")
            tips = doc.metadata.get("Tips", "")
            retrieved_docs.append(
                {
                    "Request": example_request,
                    "Response": response,
                    "Sub-task": subtask,
                    "Tips": tips,
                }
            )

        return retrieved_docs
    else:
        return []

rag_experience_retrieve(request, experience_top_k)

Ruft Erfahrungsbeispiele für die Benutzeranfrage ab.

Parameter
  • request (str) –

    Die Anfrage des Benutzers.

  • experience_top_k (int) –

    Die Anzahl der abzurufenden Dokumente.

Rückgabe
  • List[Dict[str, Any]]

    Das abgerufene Wörterbuch mit Beispielen und Tipps.

Quellcode in agents/agent/app_agent.py
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
def rag_experience_retrieve(
    self, request: str, experience_top_k: int
) -> List[Dict[str, Any]]:
    """
    Retrieving experience examples for the user request.
    :param request: The user request.
    :param experience_top_k: The number of documents to retrieve.
    :return: The retrieved examples and tips dictionary.
    """

    retrieved_docs = []

    # Retrieve experience examples. Only retrieve the examples that are related to the current application.
    experience_docs = self.experience_retriever.retrieve(
        request,
        experience_top_k,
        filter=lambda x: self._app_root_name.lower()
        in [app.lower() for app in x["app_list"]],
    )

    if experience_docs:
        for doc in experience_docs:
            example_request = doc.metadata.get("request", "")
            response = doc.metadata.get("example", {})
            tips = doc.metadata.get("Tips", "")
            subtask = doc.metadata.get("Sub-task", "")
            retrieved_docs.append(
                {
                    "Request": example_request,
                    "Response": response,
                    "Sub-task": subtask,
                    "Tips": tips,
                }
            )

    return retrieved_docs