| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- """工具基类"""
- from abc import ABC, abstractmethod
- from typing import Dict, Any, List
- from pydantic import BaseModel
- class ToolParameter(BaseModel):
- """工具参数定义"""
- name: str
- type: str
- description: str
- required: bool = True
- default: Any = None
- class Tool(ABC):
- """工具基类"""
- def __init__(self, name: str, description: str):
- self.name = name
- self.description = description
- @abstractmethod
- def run(self, parameters: Dict[str, Any]) -> str:
- """执行工具"""
- pass
- @abstractmethod
- def get_parameters(self) -> List[ToolParameter]:
- """获取工具参数定义"""
- pass
- def validate_parameters(self, parameters: Dict[str, Any]) -> bool:
- """验证参数"""
- required_params = [p.name for p in self.get_parameters() if p.required]
- return all(param in parameters for param in required_params)
- def to_openai_schema(self) -> Dict[str, Any]:
- """转换为 OpenAI function calling schema 格式"""
- parameters = self.get_parameters()
- properties = {}
- required = []
- for param in parameters:
- prop = {"type": param.type, "description": param.description}
- if param.default is not None:
- prop["description"] = f"{param.description} (默认: {param.default})"
- if param.type == "array":
- prop["items"] = {"type": "string"}
- properties[param.name] = prop
- if param.required:
- required.append(param.name)
- return {
- "type": "function",
- "function": {
- "name": self.name,
- "description": self.description,
- "parameters": {
- "type": "object",
- "properties": properties,
- "required": required,
- },
- },
- }
- def __str__(self) -> str:
- return f"Tool(name={self.name})"
- def __repr__(self) -> str:
- return self.__str__()
|