Snowykami 52046ba032
Some checks failed
Deploy VitePress site to Pages / build (push) Failing after 38s
Pre-commit checks / pre-commit (3.11) (push) Successful in 2m40s
Pre-commit checks / pre-commit (3.10) (push) Successful in 3m19s
Pre-commit checks / pre-commit (3.12) (push) Successful in 3m19s
Pre-commit checks / pre-commit (3.13) (push) Successful in 3m23s
Pytest API Testing / Pytest (3.11) (push) Failing after 2m10s
Pytest API Testing / Pytest (3.10) (push) Failing after 2m51s
Pytest API Testing / Pytest (3.12) (push) Failing after 2m46s
Pytest API Testing / Pytest (3.13) (push) Failing after 2m39s
更新函数调用模型,添加同步函数类型支持;重构函数信息获取逻辑;新增示例测试用例
2024-12-14 19:56:42 +08:00

144 lines
3.1 KiB
Python
Executable File

from types import ModuleType
from typing import Any
from pydantic import BaseModel
from .typing import ASYNC_FUNCTION_CALL_FUNC, FUNCTION_CALL_FUNC
class PluginMetadata(BaseModel):
"""
Marsho 插件 对象元数据
Attributes:
----------
name: str
友好名称: 例如Marsho Test
description: str
插件描述
usage: str
插件使用方法
type: str
插件类型
author: str
插件作者
homepage: str
插件主页
extra: dict[str, Any]
额外信息,自定义键值对
"""
name: str
description: str = ""
usage: str = ""
author: str = ""
homepage: str = ""
extra: dict[str, Any] = {}
class Plugin(BaseModel):
"""
存储插件信息
Attributes:
----------
name: str
包名称 例如marsho_test
module: ModuleType
插件模块对象
module_name: str
点分割模块路径 例如a.b.c
metadata: "PluginMeta" | None
"""
name: str
"""包名称 例如marsho_test"""
module: ModuleType
"""插件模块对象"""
module_name: str
"""点分割模块路径 例如a.b.c"""
metadata: PluginMetadata | None = None
""""""
class Config:
arbitrary_types_allowed = True
def __hash__(self) -> int:
return hash(self.name)
def __eq__(self, other: Any) -> bool:
return self.name == other.name
class FunctionCallArgument(BaseModel):
"""
插件函数参数对象
Attributes:
----------
name: str
参数名称
type: str
参数类型 string integer等
description: str
参数描述
"""
type_: str
"""参数类型描述 string integer等"""
description: str
"""参数描述"""
default: Any = None
"""默认值"""
def data(self) -> dict[str, Any]:
return {"type": self.type_, "description": self.description}
class FunctionCall(BaseModel):
"""
插件函数对象
Attributes:
----------
name: str
函数名称
func: "FUNCTION_CALL"
函数对象
"""
name: str
"""函数名称 module.func"""
description: str
"""函数描述 这个函数用于获取天气信息"""
arguments: dict[str, FunctionCallArgument]
"""函数参数信息"""
function: FUNCTION_CALL_FUNC
"""函数对象"""
class Config:
arbitrary_types_allowed = True
def __hash__(self) -> int:
return hash(self.name)
def data(self) -> dict[str, Any]:
"""生成函数描述信息
Returns:
dict[str, Any]: 函数描述信息 字典
"""
return {
"type": "function",
"function": {
"name": self.name,
"description": self.description,
"parameters": {
"type": "object",
"properties": {k: v.data() for k, v in self.arguments.items()},
},
"required": [k for k, v in self.arguments.items() if v.default is None],
},
}