Agenten

In UFO gibt es vier Arten von Agenten: HostAgent, AppAgent, FollowerAgent und EvaluationAgent. Jeder Agent hat eine spezifische Rolle im UFO-System und ist für verschiedene Aspekte des Benutzerinteraktionsprozesses verantwortlich.

Agent Beschreibung
HostAgent Zerlegt die Benutzeranfrage in Teilaufgaben und wählt die geeignete Anwendung aus, um die Anfrage zu erfüllen.
AppAgent Führt Aktionen auf der ausgewählten Anwendung aus.
FollowerAgent Folgt den Anweisungen des Benutzers, um die Aufgabe abzuschließen.
EvaluationAgent Bewertet die Vollständigkeit einer Sitzung oder einer Runde.

Im normalen Workflow sind nur der HostAgent und der AppAgent an dem Benutzerinteraktionsprozess beteiligt. Der FollowerAgent und der EvaluationAgent werden für spezifische Aufgaben verwendet.

Siehe unten die Orchestrierung der Agenten in UFO

Hauptkomponenten

Ein Agent in UFO besteht aus den folgenden Hauptkomponenten, um seine Rolle im UFO-System zu erfüllen.

Komponente Beschreibung
Status Stellt den aktuellen Zustand des Agenten dar und bestimmt die nächste Aktion und den nächsten Agenten zur Bearbeitung der Anfrage.
Speicher Speichert Informationen über die Benutzeranfrage, den Anwendungszustand und andere relevante Daten.
Blackboard Speichert Informationen, die zwischen Agenten ausgetauscht werden.
Prompter Generiert Prompts für das Sprachmodell basierend auf der Benutzeranfrage und dem Anwendungszustand.
Prozessor Verarbeitet den Workflow des Agenten, einschließlich der Bearbeitung von Benutzeranfragen, der Ausführung von Aktionen und der Speicherverwaltung.

Referenz

Unten finden Sie die Referenz für die Agent-Klasse in UFO. Alle Agenten in UFO erben von der Agent-Klasse und implementieren die notwendigen Methoden, um ihre Rollen im UFO-System zu erfüllen.

Basen: ABC

Die BasicAgent-Klasse ist die abstrakte Klasse für den Agenten.

Initialisiert den BasicAgent.

Parameter
  • name (str) –

    Der Name des Agenten.

Quellcode in agents/agent/basic.py
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
def __init__(self, name: str) -> None:
    """
    Initialize the BasicAgent.
    :param name: The name of the agent.
    """
    self._step = 0
    self._complete = False
    self._name = name
    self._status = self.status_manager.CONTINUE.value
    self._register_self()
    self.retriever_factory = retriever.RetrieverFactory()
    self._memory = Memory()
    self._host = None
    self._processor: Optional[BaseProcessor] = None
    self._state = None
    self.Puppeteer: puppeteer.AppPuppeteer = None

blackboard property

Ruft das Blackboard ab.

Rückgabe
  • Blackboard

    Das Blackboard.

default_state property

Ruft den Standardzustand des Agenten ab.

Rückgabe
  • AgentState

    Der Standardzustand des Agenten.

host property writable

Ruft den Host des Agenten ab.

Rückgabe
  • HostAgent

    Der Host des Agenten.

memory property writable

Ruft den Speicher des Agenten ab.

Rückgabe
  • Memory

    Der Speicher des Agenten.

name property

Ruft den Namen des Agenten ab.

Rückgabe
  • str

    Der Name des Agenten.

processor property writable

Ruft den Prozessor ab.

Rückgabe
  • BaseProcessor

    Der Prozessor.

state property

Ruft den Zustand des Agenten ab.

Rückgabe
  • AgentState

    Der Zustand des Agenten.

status property writable

Ruft den Status des Agenten ab.

Rückgabe
  • str

    Der Status des Agenten.

status_manager Eigenschaft

Ruft den Statusmanager ab.

Rückgabe
  • AgentStatus

    Der Statusmanager.

step property writable

Ruft den Schritt des Agenten ab.

Rückgabe
  • int

    Der Schritt des Agenten.

add_memory(memory_item)

Aktualisiert den Speicher des Agenten.

Parameter
  • memory_item (MemoryItem) –

    Das hinzuzufügende Speicherelement.

Quellcode in agents/agent/basic.py
204
205
206
207
208
209
def add_memory(self, memory_item: MemoryItem) -> None:
    """
    Update the memory of the agent.
    :param memory_item: The memory item to add.
    """
    self._memory.add_memory_item(memory_item)

build_experience_retriever()

Erstellt den Experience Retriever.

Quellcode in agents/agent/basic.py
349
350
351
352
353
def build_experience_retriever(self) -> None:
    """
    Build the experience retriever.
    """
    pass

build_human_demonstration_retriever()

Erstellt den Human Demonstration Retriever.

Quellcode in agents/agent/basic.py
355
356
357
358
359
def build_human_demonstration_retriever(self) -> None:
    """
    Build the human demonstration retriever.
    """
    pass

build_offline_docs_retriever()

Erstellt den Offline Docs Retriever.

Quellcode in agents/agent/basic.py
337
338
339
340
341
def build_offline_docs_retriever(self) -> None:
    """
    Build the offline docs retriever.
    """
    pass

build_online_search_retriever()

Erstellt den Online Search Retriever.

Quellcode in agents/agent/basic.py
343
344
345
346
347
def build_online_search_retriever(self) -> None:
    """
    Build the online search retriever.
    """
    pass

clear_memory()

Löscht den Speicher des Agenten.

Quellcode in agents/agent/basic.py
218
219
220
221
222
def clear_memory(self) -> None:
    """
    Clear the memory of the agent.
    """
    self._memory.clear()

create_puppeteer_interface()

Erstellt die Puppeteer-Schnittstelle.

Quellcode in agents/agent/basic.py
256
257
258
259
260
def create_puppeteer_interface(self) -> puppeteer.AppPuppeteer:
    """
    Create the puppeteer interface.
    """
    pass

delete_memory(step)

Löscht den Speicher des Agenten.

Parameter
  • step (int) –

    Der Schritt des zu löschenden Speicherelements.

Quellcode in agents/agent/basic.py
211
212
213
214
215
216
def delete_memory(self, step: int) -> None:
    """
    Delete the memory of the agent.
    :param step: The step of the memory item to delete.
    """
    self._memory.delete_memory_item(step)

get_cls(name) classmethod

Ruft eine Agentenklasse aus dem Registry ab.

Parameter
  • name (str) –

    Der Name der Agentenklasse.

Rückgabe
  • Type['BasicAgent']

    Die Agentenklasse.

Quellcode in agents/agent/basic.py
376
377
378
379
380
381
382
383
@classmethod
def get_cls(cls, name: str) -> Type["BasicAgent"]:
    """
    Retrieves an agent class from the registry.
    :param name: The name of the agent class.
    :return: The agent class.
    """
    return AgentRegistry().get_cls(name)

get_prompter() abstractmethod

Ruft den Prompt für den Agenten ab.

Rückgabe
  • str

    Der Prompt.

Quellcode in agents/agent/basic.py
132
133
134
135
136
137
138
@abstractmethod
def get_prompter(self) -> str:
    """
    Get the prompt for the agent.
    :return: The prompt.
    """
    pass

get_response(message, namescope, use_backup_engine, configs=configs) classmethod

Ruft die Antwort für den Prompt ab.

Parameter
  • message (List[dict]) –

    Die Nachricht für LLMs.

  • namescope (str) –

    Der Namescope für LLMs.

  • use_backup_engine (bool) –

    Ob die Backup-Engine verwendet werden soll.

  • configs

    Die Konfigurationen.

Rückgabe
  • str

    Die Antwort.

Quellcode in agents/agent/basic.py
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
@classmethod
def get_response(
    cls,
    message: List[dict],
    namescope: str,
    use_backup_engine: bool,
    configs=configs,
) -> str:
    """
    Get the response for the prompt.
    :param message: The message for LLMs.
    :param namescope: The namescope for the LLMs.
    :param use_backup_engine: Whether to use the backup engine.
    :param configs: The configurations.
    :return: The response.
    """
    response_string, cost = llm_call.get_completion(
        message, namescope, use_backup_engine=use_backup_engine, configs=configs
    )
    return response_string, cost

handle(context)

Behandelt den Agenten.

Parameter
  • context (Context) –

    Der Kontext für den Agenten.

Quellcode in agents/agent/basic.py
243
244
245
246
247
248
def handle(self, context: Context) -> None:
    """
    Handle the agent.
    :param context: The context for the agent.
    """
    self.state.handle(self, context)

message_constructor() abstractmethod

Konstruiert die Nachricht.

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

    Die Nachricht.

Quellcode in agents/agent/basic.py
140
141
142
143
144
145
146
@abstractmethod
def message_constructor(self) -> List[Dict[str, Union[str, List[Dict[str, str]]]]]:
    """
    Construct the message.
    :return: The message.
    """
    pass

print_response()

Gibt die Antwort aus.

Quellcode in agents/agent/basic.py
361
362
363
364
365
def print_response(self) -> None:
    """
    Print the response.
    """
    pass

process(context)

Verarbeitet den Agenten.

Quellcode in agents/agent/basic.py
250
251
252
253
254
def process(self, context: Context) -> None:
    """
    Process the agent.
    """
    pass

process_asker(ask_user=True)

Fragt nach dem Prozess.

Parameter
  • ask_user (bool, default: True ) –

    Ob der Benutzer nach den Fragen gefragt werden soll.

Quellcode in agents/agent/basic.py
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
def process_asker(self, ask_user: bool = True) -> None:
    """
    Ask for the process.
    :param ask_user: Whether to ask the user for the questions.
    """

    _ask_message = "Could you please answer the following questions to help me understand your needs and complete the task?"
    _none_answer_message = "The answer for the question is not available, please proceed with your own knowledge or experience, or leave it as a placeholder. Do not ask the same question again."

    if self.processor:
        question_list = self.processor.question_list

        if ask_user:
            utils.print_with_color(
                _ask_message,
                "yellow",
            )

        for index, question in enumerate(question_list):
            if ask_user:
                answer = question_asker(question, index + 1)
                if not answer.strip():
                    continue
                qa_pair = {"question": question, "answer": answer}

                utils.append_string_to_file(
                    configs["QA_PAIR_FILE"], json.dumps(qa_pair)
                )

            else:
                qa_pair = {
                    "question": question,
                    "answer": _none_answer_message,
                }

            self.blackboard.add_questions(qa_pair)

process_comfirmation() abstractmethod

Bestätigt den Prozess.

Quellcode in agents/agent/basic.py
306
307
308
309
310
311
@abstractmethod
def process_comfirmation(self) -> None:
    """
    Confirm the process.
    """
    pass

process_resume()

Setzt den Prozess fort.

Quellcode in agents/agent/basic.py
262
263
264
265
266
267
def process_resume(self) -> None:
    """
    Resume the process.
    """
    if self.processor:
        self.processor.resume()

reflection()

TODO: Über die Aktion reflektieren.

Quellcode in agents/agent/basic.py
224
225
226
227
228
229
def reflection(self) -> None:
    """
    TODO:
    Reflect on the action.
    """
    pass

response_to_dict(response) staticmethod

Konvertiert die Antwort in ein Wörterbuch.

Parameter
  • response (str) –

    Die Antwort.

Rückgabe
  • Dict[str, str]

    Das Wörterbuch.

Quellcode in agents/agent/basic.py
169
170
171
172
173
174
175
176
@staticmethod
def response_to_dict(response: str) -> Dict[str, str]:
    """
    Convert the response to a dictionary.
    :param response: The response.
    :return: The dictionary.
    """
    return utils.json_parser(response)

set_memory_from_list_of_dicts(data)

Setzt den Speicher aus der Liste von Wörterbüchern.

Parameter
  • data (List[Dict[str, str]]) –

    Die Liste der Wörterbücher.

Quellcode in agents/agent/basic.py
194
195
196
197
198
199
200
201
202
def set_memory_from_list_of_dicts(self, data: List[Dict[str, str]]) -> None:
    """
    Set the memory from the list of dictionaries.
    :param data: The list of dictionaries.
    """

    assert isinstance(data, list), "The data should be a list of dictionaries."

    self._memory.from_list_of_dicts(data)

set_state(state)

Setzt den Zustand des Agenten.

Parameter
  • state (AgentState) –

    Der Zustand des Agenten.

Quellcode in agents/agent/basic.py
231
232
233
234
235
236
237
238
239
240
241
def set_state(self, state: AgentState) -> None:
    """
    Set the state of the agent.
    :param state: The state of the agent.
    """

    assert issubclass(
        type(self), state.agent_class()
    ), f"The state is only for agent type of {state.agent_class()}, but the current agent is {type(self)}."

    self._state = state