mirror of https://github.com/Mai-with-u/MaiBot.git
55 lines
2.1 KiB
Python
55 lines
2.1 KiB
Python
import re
|
|
from src.tools.tool_can_use.base_tool import BaseTool, run_lua_code
|
|
from src.common.logger import get_module_logger
|
|
from typing import Dict, Any
|
|
|
|
logger = get_module_logger("letter_count_tool")
|
|
|
|
|
|
class LetterCountTool(BaseTool):
|
|
"""数单词内某字母个数的工具"""
|
|
|
|
name = "word_letter_count"
|
|
description = "当有人询问你或者提到某个英文单词内有多少个某字母时,可以使用这个工具来数字母(如果传入的是中文,传入之前要将中文转为英文)"
|
|
parameters = {
|
|
"type": "object",
|
|
"properties": {
|
|
"word": {"type": "string", "description": "英文单词"},
|
|
"letter": {"type": "string", "description": "英文字母"},
|
|
},
|
|
"required": ["word", "letter"],
|
|
}
|
|
|
|
async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
|
|
"""
|
|
执行数数该单词的某字母个数的函数
|
|
|
|
Args:
|
|
function_args: 工具参数
|
|
message_txt: 原始消息文本
|
|
|
|
Returns:
|
|
Dict: 工具执行结果
|
|
"""
|
|
try:
|
|
word = function_args.get("word")
|
|
letter = function_args.get("letter")
|
|
if re.match(r"^[a-zA-Z]$", letter) is None:
|
|
raise ValueError("请输入单个英文字母")
|
|
lua_code = """
|
|
function LetterCount(inputStr, targetLetter)
|
|
local lower = (inputStr:gsub("[^"..targetLetter:lower().."]", "")):len()
|
|
local upper = (inputStr:gsub("[^"..targetLetter:upper().."]", "")):len()
|
|
return string.format("字母 %s 在字符串 %s 中出现的次数:%d个(小写), %d个(大写)", targetLetter, inputStr, lower, upper)
|
|
end
|
|
"""
|
|
LetterCount = run_lua_code(lua_code).LetterCount
|
|
return {"name": self.name, "content": LetterCount(word, letter)}
|
|
except Exception as e:
|
|
logger.error(f"数字母失败: {str(e)}")
|
|
return {"name": self.name, "content": f"数字母失败: {str(e)}"}
|
|
|
|
|
|
# 注册工具
|
|
# register_tool(LetterCountTool)
|