feat: 将 47 个 Operit TypeScript 脚本全面翻译为 Python

- 新增 operit_runtime.py: 跨平台 Python 运行时
  - 实现 Tools.System/Files/Net/UI/Memory/FFmpeg/Workflow/Chat/SoftwareSettings/Tasker
  - 实现 OkHttp 链式 HTTP 客户端兼容层
  - 实现 complete()/exports/console 全局对象
  - 实现 OperitScriptLoader 脚本加载器
  - 支持 Windows/macOS/Linux 三平台

- 新增 operit_py/ 目录: 47 个 Python 翻译脚本
  - 搜索类: duckduckgo, google_search, tavily, zhipu_search, various_search, crossref
  - 绘图类: openai_draw, qwen_draw, xai_draw, minimax_draw, siliconflow_draw, zhipu_draw, nanobanana_draw
  - 媒体类: ffmpeg, file_converter, douyin_download, bilibili_tools, jmcomic
  - 文件类: extended_file_tools, hex_editor, reader, beeimg_image_uploader
  - 网络类: extended_http_tools, network_test
  - 自动化类: browser, automatic_ui_base, automatic_ui_subagent, automatic_bilibili_assistant, automatic_xiaohongshu_assistant, automatic_baidu_map_assistant
  - 系统类: system_tools, super_admin, daily_life, operit_editor
  - 对话类: ai_chat, extended_chat, qq_intelligent
  - 工作流类: workflow, vflow_trigger, tasker
  - 工具类: time, code_runner, quick_start, extended_memory_tools, baidu_map, 12306, pdf_vision_parser

- 测试结果: 47/47 语法检查通过, 38 脚本加载成功, 280 个工具注册
- Android 专属功能已降级处理(保留接口,返回不支持提示)
This commit is contained in:
shuiyu1123 committed 2026-06-23 12:27:18 +00:00
1 parent 6fa759665d
commit dc77dfd304
48 files changed
+22273

No files matched your search

+331
View File
@@ -0,0 +1,331 @@
# METADATA
# {
# "name": "extended_memory_tools",
#
# "display_name": {
# "zh": "增强记忆工具",
# "en": "Extended Memory Tools"
# },
# "description": {
# "zh": "拓展记忆工具包:提供创建/更新/删除/查询/链接记忆,以及更新用户偏好的能力(默认工具中仅保留 query/get/query_links)。",
# "en": "Extended memory tools: create/update/delete/query/link memories and update user preferences (default tools only keep query/get/query_links)."
# },
# "category": "Memory",
# "enabledByDefault": true,
# "tools": [
# {
# "name": "create_memory",
# "description": { "zh": "创建新的记忆节点。", "en": "Create a new memory node." },
# "parameters": [
# { "name": "title", "description": { "zh": "记忆标题", "en": "Memory title" }, "type": "string", "required": true },
# { "name": "content", "description": { "zh": "记忆内容", "en": "Memory content" }, "type": "string", "required": true },
# { "name": "content_type", "description": { "zh": "可选:内容类型,默认 text/plain", "en": "Optional: content type (default: text/plain)" }, "type": "string", "required": false },
# { "name": "source", "description": { "zh": "可选:来源,默认 ai_created", "en": "Optional: source (default: ai_created)" }, "type": "string", "required": false },
# { "name": "folder_path", "description": { "zh": "可选:文件夹路径,默认空", "en": "Optional: folder path (default: empty)" }, "type": "string", "required": false },
# { "name": "tags", "description": { "zh": "可选:标签(逗号分隔字符串)", "en": "Optional: tags (comma-separated string)" }, "type": "string", "required": false }
# ]
# },
# {
# "name": "update_memory",
# "description": { "zh": "按标题更新已有记忆节点。", "en": "Update an existing memory node by title." },
# "parameters": [
# { "name": "old_title", "description": { "zh": "原始标题(用于定位记忆)", "en": "Old title (to locate the memory)" }, "type": "string", "required": true },
# { "name": "new_title", "description": { "zh": "可选:新标题(重命名)", "en": "Optional: new title (rename)" }, "type": "string", "required": false },
# { "name": "content", "description": { "zh": "可选:新内容", "en": "Optional: new content" }, "type": "string", "required": false },
# { "name": "content_type", "description": { "zh": "可选:内容类型", "en": "Optional: content type" }, "type": "string", "required": false },
# { "name": "source", "description": { "zh": "可选:来源", "en": "Optional: source" }, "type": "string", "required": false },
# { "name": "credibility", "description": { "zh": "可选:可信度 0-1", "en": "Optional: credibility 0-1" }, "type": "number", "required": false },
# { "name": "importance", "description": { "zh": "可选:重要性 0-1", "en": "Optional: importance 0-1" }, "type": "number", "required": false },
# { "name": "folder_path", "description": { "zh": "可选:文件夹路径", "en": "Optional: folder path" }, "type": "string", "required": false },
# { "name": "tags", "description": { "zh": "可选:标签(逗号分隔字符串)", "en": "Optional: tags (comma-separated string)" }, "type": "string", "required": false }
# ]
# },
# {
# "name": "delete_memory",
# "description": { "zh": "按标题删除记忆节点(不可逆)。", "en": "Delete a memory node by title (irreversible)." },
# "parameters": [
# { "name": "title", "description": { "zh": "要删除的记忆标题", "en": "Memory title to delete" }, "type": "string", "required": true }
# ]
# },
# {
# "name": "move_memory",
# "description": { "zh": "批量移动记忆到新文件夹。可按标题列表和/或来源文件夹筛选。", "en": "Move memories to another folder in batch. Filter by titles and/or source folder." },
# "parameters": [
# { "name": "target_folder_path", "description": { "zh": "目标文件夹路径(空字符串表示未分类)", "en": "Target folder path (empty string means uncategorized)" }, "type": "string", "required": true },
# { "name": "titles", "description": { "zh": "可选:标题列表(逗号或换行分隔)", "en": "Optional: title list (comma/newline separated)" }, "type": "string", "required": false },
# { "name": "source_folder_path", "description": { "zh": "可选:来源文件夹路径(空字符串表示未分类)", "en": "Optional: source folder path (empty string means uncategorized)" }, "type": "string", "required": false }
# ]
# },
# {
# "name": "link_memories",
# "description": { "zh": "创建两条记忆之间的语义链接。", "en": "Create a semantic link between two memories." },
# "parameters": [
# { "name": "source_title", "description": { "zh": "源记忆标题", "en": "Source memory title" }, "type": "string", "required": true },
# { "name": "target_title", "description": { "zh": "目标记忆标题", "en": "Target memory title" }, "type": "string", "required": true },
# { "name": "link_type", "description": { "zh": "可选:关系类型,默认 related", "en": "Optional: link type (default: related)" }, "type": "string", "required": false },
# { "name": "weight", "description": { "zh": "可选:强度 0-1,默认 0.7", "en": "Optional: weight 0-1 (default: 0.7)" }, "type": "number", "required": false },
# { "name": "description", "description": { "zh": "可选:关系描述", "en": "Optional: relationship description" }, "type": "string", "required": false }
# ]
# },
# {
# "name": "query_memory_links",
# "description": { "zh": "查询记忆链接(可按 ID/源标题/目标标题/关系类型过滤)。", "en": "Query memory links (filter by id/source/target/type)." },
# "parameters": [
# { "name": "link_id", "description": { "zh": "可选:链接ID", "en": "Optional: link id" }, "type": "number", "required": false },
# { "name": "source_title", "description": { "zh": "可选:源记忆标题", "en": "Optional: source memory title" }, "type": "string", "required": false },
# { "name": "target_title", "description": { "zh": "可选:目标记忆标题", "en": "Optional: target memory title" }, "type": "string", "required": false },
# { "name": "link_type", "description": { "zh": "可选:关系类型", "en": "Optional: link type" }, "type": "string", "required": false },
# { "name": "limit", "description": { "zh": "可选:返回上限 1-200,默认20", "en": "Optional: limit 1-200, default 20" }, "type": "number", "required": false }
# ]
# },
# {
# "name": "update_memory_link",
# "description": { "zh": "更新记忆链接(按 link_id 或 source/target/link_type 定位)。", "en": "Update a memory link (by link_id or source/target/link_type)." },
# "parameters": [
# { "name": "link_id", "description": { "zh": "可选:链接ID(优先使用)", "en": "Optional: link ID (preferred)" }, "type": "number", "required": false },
# { "name": "source_title", "description": { "zh": "可选:源记忆标题(未提供 link_id 时使用)", "en": "Optional: source title (used when link_id is not provided)" }, "type": "string", "required": false },
# { "name": "target_title", "description": { "zh": "可选:目标记忆标题(未提供 link_id 时使用)", "en": "Optional: target title (used when link_id is not provided)" }, "type": "string", "required": false },
# { "name": "link_type", "description": { "zh": "可选:当前关系类型(用于唯一定位)", "en": "Optional: current relation type (for unique resolution)" }, "type": "string", "required": false },
# { "name": "new_link_type", "description": { "zh": "可选:新的关系类型", "en": "Optional: new relation type" }, "type": "string", "required": false },
# { "name": "weight", "description": { "zh": "可选:新的强度 0-1", "en": "Optional: new weight 0-1" }, "type": "number", "required": false },
# { "name": "description", "description": { "zh": "可选:新的关系描述", "en": "Optional: new relationship description" }, "type": "string", "required": false }
# ]
# },
# {
# "name": "delete_memory_link",
# "description": { "zh": "删除记忆链接(按 link_id 或 source/target/link_type 定位)。", "en": "Delete a memory link (by link_id or source/target/link_type)." },
# "parameters": [
# { "name": "link_id", "description": { "zh": "可选:链接ID(优先使用)", "en": "Optional: link ID (preferred)" }, "type": "number", "required": false },
# { "name": "source_title", "description": { "zh": "可选:源记忆标题(未提供 link_id 时使用)", "en": "Optional: source title (used when link_id is not provided)" }, "type": "string", "required": false },
# { "name": "target_title", "description": { "zh": "可选:目标记忆标题(未提供 link_id 时使用)", "en": "Optional: target title (used when link_id is not provided)" }, "type": "string", "required": false },
# { "name": "link_type", "description": { "zh": "可选:关系类型(用于唯一定位)", "en": "Optional: relation type (for unique resolution)" }, "type": "string", "required": false }
# ]
# },
# {
# "name": "update_user_preferences",
# "description": { "zh": "更新用户偏好信息(至少提供一个字段)。", "en": "Update user preferences (provide at least one field)." },
# "parameters": [
# { "name": "birth_date", "description": { "zh": "可选:出生日期(Unix 毫秒时间戳)", "en": "Optional: birth date (Unix ms timestamp)" }, "type": "number", "required": false },
# { "name": "gender", "description": { "zh": "可选:性别", "en": "Optional: gender" }, "type": "string", "required": false },
# { "name": "personality", "description": { "zh": "可选:性格特征", "en": "Optional: personality" }, "type": "string", "required": false },
# { "name": "identity", "description": { "zh": "可选:身份/角色", "en": "Optional: identity/role" }, "type": "string", "required": false },
# { "name": "occupation", "description": { "zh": "可选:职业", "en": "Optional: occupation" }, "type": "string", "required": false },
# { "name": "ai_style", "description": { "zh": "可选:偏好 AI 交互风格", "en": "Optional: preferred AI interaction style" }, "type": "string", "required": false }
# ]
# }
# ]
# }
import re
def resolveCallerCardId():
getCallerCardId_fn = globals().get("getCallerCardId")
if not callable(getCallerCardId_fn):
return None
callerCardId = str(getCallerCardId_fn() or "").strip()
return callerCardId or None
async def create_memory(params):
result = await Tools.Memory.create({
"title": params["title"],
"content": params["content"],
"contentType": params.get("content_type"),
"source": params.get("source"),
"folderPath": params.get("folder_path"),
"tags": params.get("tags"),
"callerCardId": resolveCallerCardId(),
})
return {"success": isinstance(result, str) and len(result) > 0, "message": "记忆创建完成", "data": result}
async def update_memory(params):
result = await Tools.Memory.update({
"oldTitle": params["old_title"],
"newTitle": params.get("new_title"),
"content": params.get("content"),
"contentType": params.get("content_type"),
"source": params.get("source"),
"credibility": params.get("credibility"),
"importance": params.get("importance"),
"folderPath": params.get("folder_path"),
"tags": params.get("tags"),
"callerCardId": resolveCallerCardId(),
})
return {"success": isinstance(result, str) and len(result) > 0, "message": "记忆更新完成", "data": result}
async def delete_memory(params):
result = await Tools.Memory.deleteMemory({
"title": params["title"],
"callerCardId": resolveCallerCardId(),
})
return {"success": isinstance(result, str) and len(result) > 0, "message": "记忆删除完成", "data": result}
async def move_memory(params):
titles = (
[s.strip() for s in re.split(r'[,\n|]', params["titles"]) if s.strip()]
if params.get("titles")
else None
)
result = await Tools.Memory.move({
"targetFolderPath": params["target_folder_path"],
"titles": titles,
"sourceFolderPath": params.get("source_folder_path"),
"callerCardId": resolveCallerCardId(),
})
return {"success": isinstance(result, str) and len(result) > 0, "message": "记忆移动完成", "data": result}
async def link_memories(params):
result = await Tools.Memory.link({
"sourceTitle": params["source_title"],
"targetTitle": params["target_title"],
"linkType": params.get("link_type"),
"weight": params.get("weight"),
"description": params.get("description"),
"callerCardId": resolveCallerCardId(),
})
return {"success": bool(result), "message": "记忆链接创建完成", "data": result}
async def query_memory_links(params):
result = await Tools.Memory.queryLinks({
"linkId": params.get("link_id"),
"sourceTitle": params.get("source_title"),
"targetTitle": params.get("target_title"),
"linkType": params.get("link_type"),
"limit": params.get("limit"),
"callerCardId": resolveCallerCardId(),
})
return {"success": bool(result), "message": "记忆链接查询完成", "data": result}
async def update_memory_link(params):
result = await Tools.Memory.updateLink({
"linkId": params.get("link_id"),
"sourceTitle": params.get("source_title"),
"targetTitle": params.get("target_title"),
"linkType": params.get("link_type"),
"newLinkType": params.get("new_link_type"),
"weight": params.get("weight"),
"description": params.get("description"),
"callerCardId": resolveCallerCardId(),
})
return {"success": bool(result), "message": "记忆链接更新完成", "data": result}
async def delete_memory_link(params):
result = await Tools.Memory.deleteLink({
"linkId": params.get("link_id"),
"sourceTitle": params.get("source_title"),
"targetTitle": params.get("target_title"),
"linkType": params.get("link_type"),
"callerCardId": resolveCallerCardId(),
})
success = (len(result) > 0) if isinstance(result, str) else bool(result)
return {"success": success, "message": "记忆链接删除完成", "data": result}
async def update_user_preferences(params):
toolParams = {}
if params.get("birth_date") is not None:
toolParams["birth_date"] = params["birth_date"]
if params.get("gender") is not None:
toolParams["gender"] = params["gender"]
if params.get("personality") is not None:
toolParams["personality"] = params["personality"]
if params.get("identity") is not None:
toolParams["identity"] = params["identity"]
if params.get("occupation") is not None:
toolParams["occupation"] = params["occupation"]
if params.get("ai_style") is not None:
toolParams["ai_style"] = params["ai_style"]
result = await toolCall({"name": "update_user_preferences", "params": toolParams})
success = (len(result) > 0) if isinstance(result, str) else bool(result)
return {"success": success, "message": "用户偏好更新完成", "data": result}
async def wrapToolExecution(func, params):
try:
result = await func(params)
complete(result)
except Exception as error:
console.error(f"Tool {func.__name__} failed unexpectedly", error)
msg = getattr(error, "message", str(error))
complete({
"success": False,
"message": f"工具执行时发生意外错误: {msg}",
})
async def main():
results = []
# 这些工具都可能修改记忆/偏好,默认不做自动化演示,避免污染用户数据。
results.append({"tool": "create_memory", "result": {"success": None, "message": "未测试(会写入记忆库)"}})
results.append({"tool": "update_memory", "result": {"success": None, "message": "未测试(会修改记忆库)"}})
results.append({"tool": "delete_memory", "result": {"success": None, "message": "未测试(会删除记忆库数据)"}})
results.append({"tool": "move_memory", "result": {"success": None, "message": "未测试(会批量修改记忆文件夹)"}})
results.append({"tool": "link_memories", "result": {"success": None, "message": "未测试(会修改记忆库链接)"}})
results.append({"tool": "query_memory_links", "result": {"success": None, "message": "未测试(只读查询)"}})
results.append({"tool": "update_memory_link", "result": {"success": None, "message": "未测试(会修改记忆库链接)"}})
results.append({"tool": "delete_memory_link", "result": {"success": None, "message": "未测试(会删除记忆库链接)"}})
results.append({"tool": "update_user_preferences", "result": {"success": None, "message": "未测试(会修改用户偏好)"}})
complete({
"success": True,
"message": "拓展记忆工具包加载完成(未执行破坏性测试)",
"data": {"results": results}
})
async def create_memory_wrapper(params):
await wrapToolExecution(create_memory, params)
async def update_memory_wrapper(params):
await wrapToolExecution(update_memory, params)
async def delete_memory_wrapper(params):
await wrapToolExecution(delete_memory, params)
async def move_memory_wrapper(params):
await wrapToolExecution(move_memory, params)
async def link_memories_wrapper(params):
await wrapToolExecution(link_memories, params)
async def query_memory_links_wrapper(params):
await wrapToolExecution(query_memory_links, params)
async def update_memory_link_wrapper(params):
await wrapToolExecution(update_memory_link, params)
async def delete_memory_link_wrapper(params):
await wrapToolExecution(delete_memory_link, params)
async def update_user_preferences_wrapper(params):
await wrapToolExecution(update_user_preferences, params)
exports.create_memory = create_memory_wrapper
exports.update_memory = update_memory_wrapper
exports.delete_memory = delete_memory_wrapper
exports.move_memory = move_memory_wrapper
exports.link_memories = link_memories_wrapper
exports.query_memory_links = query_memory_links_wrapper
exports.update_memory_link = update_memory_link_wrapper
exports.delete_memory_link = delete_memory_link_wrapper
exports.update_user_preferences = update_user_preferences_wrapper
exports.main = main