跳到内容

⚙️ 协议

协议是由组件实现的接口,用于对相关功能进行分组。每个协议都需要在执行过程中的某个时刻由 Agent 显式处理。我们提供了内置协议的完整列表,这些协议已经在内置的 Agent 中处理好了,因此当您从基础 Agent 继承时,所有内置协议都将起作用!

协议按默认执行顺序排列。

顺序无关的协议

仅实现顺序无关协议的组件可以按任何顺序添加,包括在顺序相关的协议之间。

DirectiveProvider

为 Agent 提供约束、资源和最佳实践。这不会直接影响其他协议;它纯粹是信息性的,并在构建提示时传递给 LLM。

class DirectiveProvider(AgentComponent):
    def get_constraints(self) -> Iterator[str]:
        return iter([])

    def get_resources(self) -> Iterator[str]:
        return iter([])

    def get_best_practices(self) -> Iterator[str]:
        return iter([])

示例 Web 搜索组件可以提供资源信息。请记住,这实际上并不允许 Agent 访问互联网。要实现这一点,需要提供一个相关的 Command

class WebSearchComponent(DirectiveProvider):
    def get_resources(self) -> Iterator[str]:
        yield "Internet access for searches and information gathering."
    # We can skip "get_constraints" and "get_best_practices" if they aren't needed

CommandProvider

提供 Agent 可以执行的命令。

class CommandProvider(AgentComponent):
    def get_commands(self) -> Iterator[Command]:
        ...

提供命令的最简单方法是在组件方法上使用 command 装饰器,然后 yield 该方法。每个命令都需要一个名称、描述以及使用 JSONSchema 的参数模式。默认情况下,方法名称用作命令名称,文档字符串的第一部分(在 Args:Returns: 之前)用作描述,模式可以在装饰器中提供。

示例 可以执行乘法运算的计算器组件。如果此命令与当前任务相关,Agent 能够调用此命令并会看到返回的结果。

from forge.agent import CommandProvider, Component
from forge.command import command
from forge.models.json_schema import JSONSchema


class CalculatorComponent(CommandProvider):
    get_commands(self) -> Iterator[Command]:
        yield self.multiply

    @command(parameters={
            "a": JSONSchema(
                type=JSONSchema.Type.INTEGER,
                description="The first number",
                required=True,
            ),
            "b": JSONSchema(
                type=JSONSchema.Type.INTEGER,
                description="The second number",
                required=True,
            )})
    def multiply(self, a: int, b: int) -> str:
        """
        Multiplies two numbers.

        Args:
            a: First number
            b: Second number

        Returns:
            Result of multiplication
        """
        return str(a * b)

Agent 将能够调用此命令,该命令名为 multiply,带两个参数,并会收到结果。命令描述将是:将两个数字相乘。

要了解有关命令的更多信息,请参阅🛠️ 命令

顺序相关的协议

实现顺序相关协议的组件顺序很重要。有些组件可能依赖于它们之前的组件的结果。

MessageProvider

提供将添加到 Agent 提示中的消息。您可以使用 ChatMessage.user():这将被解释为用户发送的消息,或者 ChatMessage.system():这会更重要。

class MessageProvider(AgentComponent):
    def get_messages(self) -> Iterator[ChatMessage]:
        ...

示例 提供消息给 Agent 提示的组件。

class HelloComponent(MessageProvider):
    def get_messages(self) -> Iterator[ChatMessage]:
        yield ChatMessage.user("Hello World!")

AfterParse

在解析响应后调用的协议。

class AfterParse(AgentComponent):
    def after_parse(self, response: ThoughtProcessOutput) -> None:
        ...

示例 在响应解析后记录响应的组件。

class LoggerComponent(AfterParse):
    def after_parse(self, response: ThoughtProcessOutput) -> None:
        logger.info(f"Response: {response}")

ExecutionFailure

当命令执行失败时调用的协议。

class ExecutionFailure(AgentComponent):
    @abstractmethod
    def execution_failure(self, error: Exception) -> None:
        ...

示例 当命令失败时记录错误的组件。

class LoggerComponent(ExecutionFailure):
    def execution_failure(self, error: Exception) -> None:
        logger.error(f"Command execution failed: {error}")

AfterExecute

Agent 成功执行命令后调用的协议。

class AfterExecute(AgentComponent):
    def after_execute(self, result: ActionResult) -> None:
        ...

示例 命令执行后记录结果的组件。

class LoggerComponent(AfterExecute):
    def after_execute(self, result: ActionResult) -> None:
        logger.info(f"Result: {result}")