feat: 增强编码能力 - 新增代码编辑器、代码搜索、Git集成

- 新增 plugins/code_editor.py: 精准代码编辑(搜索替换、批量编辑、diff对比)
- 新增 plugins/code_search.py: 代码搜索与理解(跨文件搜索、符号提取、依赖分析)
- 新增 plugins/git_tools.py: Git 版本控制(status/diff/log/commit/branch)
- 新增 core/ 模块: 配置管理、引擎管理、对话处理、显示输出、代码沙箱
- 修复 requirements.txt: 使用正确的 pip 包名(Pillow、opencv-python 等)
- 更新 unified_tool_manager.py: 兼容 Plugin 和 Liugin 两种类名
- 更新系统提示词: 增强编程工作流指导

本次更新由 mimo 自动化执行,与开发者无关。
This commit is contained in:
Xiaoli Dev committed 2026-04-25 10:55:27 +08:00
commit e22652fbbb
53 files changed
+20067

No files matched your search

+174
View File
@@ -0,0 +1,174 @@
import subprocess
import json
from urllib.parse import quote
import requests
class Liugin:
"""AI搜索插件 - 使用jina.ai进行智能搜索"""
def __init__(self):
self.usage = """AI搜索工具使用方法:/r
ai_search <操作> <参数>/r
例如:/r
- ai_search url https://www.example.com - 搜索网址内容/r
- ai_search search Python教程 - 普通搜索/r
- ai_search web 什么是人工智能 - 搜索网络内容/r
/r
详细说明:/r
- url操作: ai_search url <网址> - 提取并搜索指定网址的内容/r
- search操作: ai_search search <搜索词> - 使用必应搜索指定内容/r
- web操作: ai_search web <搜索词> - 使用必应搜索指定内容(与search相同)/r
/r
使用工具的JSON格式示例:/r
{"action": "use_tool", "tool": "ai_search", "args": "url https://www.example.com"} - 搜索网址内容/r
{"action": "use_tool", "tool": "ai_search", "args": "search Python教程"} - 普通搜索/r
{"action": "use_tool", "tool": "ai_search", "args": "web 什么是人工智能"} - 搜索网络内容/r
"""
self.cli = None # CLI实例引用
self.timeout = 30 # 请求超时时间(秒)
def set_cli(self, cli):
"""设置CLI实例引用"""
self.cli = cli
# 注册插件命令
self.cli.register_liugin_command('ai_search', self.command_handler)
self.cli.register_liugin_command('search', self.search_command_handler)
self.cli.register_liugin_command('web', self.web_command_handler)
def command_handler(self, args):
"""处理 /ai_search 命令"""
# 解析参数
parts = args.strip().split(maxsplit=1)
if len(parts) < 1:
return "请提供操作类型: url, search, web"
operation = parts[0].lower()
remaining_args = parts[1] if len(parts) > 1 else ""
# 调用实际的AI搜索功能
return self.handle(f"{operation} {remaining_args}")
def search_command_handler(self, args):
"""处理 /search 命令"""
return self.handle(f"search {args}")
def web_command_handler(self, args):
"""处理 /web 命令"""
return self.handle(f"search {args}")
def get_tool_info(self):
return {
"name": "ai_search",
"description": "AI搜索工具,使用jina.ai服务进行智能搜索,支持网址内容提取和网络搜索。当用户询问天气、新闻、汇率、股票、航班、实时信息、网络内容搜索等问题时,应该直接使用此工具。使用格式:ai_search search <搜索词> 或 ai_search url <网址>",
"keywords": ["搜索", "search", "网址", "url", "web", "AI搜索", "网络搜索", "内容提取", "天气", "新闻", "实时信息"],
"usage": """ai_search 工具使用说明:
JSON格式示例:
{\"action\": \"use_tool\", \"tool\": \"ai_search\", \"args\": \"url https://www.example.com\"} - 搜索网址内容
{\"action\": \"use_tool\", \"tool\": \"ai_search\", \"args\": \"search Python教程\"} - 普通搜索
{\"action\": \"use_tool\", \"tool\": \"ai_search\", \"args\": \"web 什么是人工智能\"} - 搜索网络内容"""
}
def handle(self, args):
"""处理AI搜索请求"""
try:
# 解析参数
parts = args.strip().split(maxsplit=1)
if len(parts) < 1:
return "错误:参数不足。请提供操作类型。\n可用操作: url, search, web"
operation = parts[0].lower()
if operation == "url":
# 搜索网址内容
if len(parts) < 2:
return "错误:请提供URL。格式: url <网址>"
url = parts[1].strip()
return self._search_url(url)
elif operation in ["search", "web"]:
# 普通搜索
if len(parts) < 2:
return "错误:请提供搜索词。格式: search <搜索词>"
query = parts[1].strip()
return self._search_web(query)
else:
return f"错误:不支持的操作 '{operation}'。支持的操作有: url, search, web。"
except Exception as e:
return f"AI搜索操作错误: {str(e)}"
def _search_url(self, url):
"""搜索网址内容(使用jina.ai提取)"""
try:
# 构建jina.ai的URL - 直接使用URL
jina_url = f"https://r.jina.ai/{url}"
result = self._execute_curl(jina_url)
if result.startswith("错误:"):
return result
return f"📄 网址内容 (来自 {url}):\n\n{result}"
except Exception as e:
return f"网址搜索错误: {str(e)}"
def _search_web(self, query):
"""普通搜索(使用jina.ai + 必应搜索)"""
try:
# 对搜索词进行URL编码,确保中文等特殊字符正确编码
# 使用safe=''确保所有非字母数字字符都被编码
encoded_query = quote(query, safe='')
# 构建必应搜索URL
bing_url = f"https://cn.bing.com/search?q={encoded_query}"
# 构建jina.ai的URL - 直接使用必应URL,不需要二次编码
jina_url = f"https://r.jina.ai/{bing_url}"
result = self._execute_curl(jina_url)
if result.startswith("错误:"):
return result
return f"🔍 搜索结果 (搜索词: {query}):\n\n{result}"
except Exception as e:
return f"网络搜索错误: {str(e)}"
def _execute_curl(self, url):
"""使用 requests 库获取内容(替代 curl 命令)"""
try:
# 使用 requests 库发送请求
response = requests.get(
url,
timeout=self.timeout,
headers={'User-Agent': 'Mozilla/5.0 (compatible; AI-Search-Bot)'}
)
# 检查状态码
if response.status_code != 200:
return f"错误:HTTP请求失败,状态码: {response.status_code}"
# 获取内容
content = response.text.strip()
if not content:
return "错误:未获取到任何内容"
# 限制输出长度以避免过长输出
if len(content) > 5000:
content = content[:5000] + f"\n\n... (内容已截断,完整内容共{len(content)}字符)"
return content
except requests.Timeout:
return f"错误:请求超时 (>{self.timeout}秒)"
except requests.ConnectionError:
return "错误:网络连接失败,请检查网络"
except Exception as e:
return f"错误:请求时发生错误: {str(e)}"