Skip to content

🛠️ 命令

命令是代理执行任何操作的方式;例如,与用户或API交互以及使用工具。它们由实现CommandProvider⚙️ 协议的组件提供。命令是可以被代理调用的函数,它们可以有参数和返回值,这些参数和返回值将被代理看到。

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

command 装饰器

提供命令的最简单且推荐的方式是使用command装饰器在组件方法上,然后在get_commands中将其作为提供者的一部分生成。每个命令都需要一个名称、描述和一个参数模式 - JSONSchema。默认情况下,方法名称用作命令名称,描述使用文档字符串的第一部分(在第一个双换行符之前),模式可以在装饰器中提供。

command 装饰器的示例用法

# 假设这是在某个组件类内部
@command(
    parameters={
        "a": JSONSchema(
            type=JSONSchema.Type.INTEGER,
            description="第一个数字",
            required=True,
        ),
        "b": JSONSchema(
            type=JSONSchema.Type.INTEGER,
            description="第二个数字",
            required=True,
        )})
def multiply(self, a: int, b: int) -> str:
    """
    将两个数字相乘。

    参数:
        a: 第一个数字
        b: 第二个数字

    返回:
        乘法结果
    """
    return str(a * b)

代理将能够调用这个名为multiply的命令,并传递两个参数,并接收结果。命令的描述将是:将两个数字相乘。

我们可以在装饰器中提供namesdescription,上面的命令等同于:

@command(
    names=["multiply"],
    description="将两个数字相乘。",
    parameters={
        "a": JSONSchema(
            type=JSONSchema.Type.INTEGER,
            description="第一个数字",
            required=True,
        ),
        "b": JSONSchema(
            type=JSONSchema.Type.INTEGER,
            description="第二个数字",
            required=True,
        )})
    def multiply_command(self, a: int, b: int) -> str:
        return str(a * b)

要将multiply命令提供给代理,我们需要在get_commands中生成它:

def get_commands(self) -> Iterator[Command]:
    yield self.multiply

直接创建 Command

如果你不想使用装饰器,可以直接创建一个Command对象。

def multiply(self, a: int, b: int) -> str:
        return str(a * b)

def get_commands(self) -> Iterator[Command]:
    yield Command(
        names=["multiply"],
        description="将两个数字相乘。",
        method=self.multiply,
        parameters=[
            CommandParameter(name="a", spec=JSONSchema(
                type=JSONSchema.Type.INTEGER,
                description="第一个数字",
                required=True,
            )),
            CommandParameter(name="b", spec=JSONSchema(
                type=JSONSchema.Type.INTEGER,
                description="第二个数字",
                required=True,
            )),
        ],
    )