🛠️ 命令¶
命令是代理执行任何操作的方式;例如,与用户或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
的命令,并传递两个参数,并接收结果。命令的描述将是:将两个数字相乘。
我们可以在装饰器中提供names
和description
,上面的命令等同于:
@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,
)),
],
)