|
|
本地运行、能搜技能、能数字快捷执行电脑操作的私人AI助手 使用了python界面库 聊天框输入指定词触发 技能 回复数字 执行技能理论上python能实现的可以 例如利用技能执行开源的CLI-Anything 远程操作GIMP实现图像的批处理 裁剪等功能 技能可以无限扩展 若有人需要可把全部源码打包放到网盘下载 没人就算了 参考后面的pyuhon 可能代码有些会被吃掉
以下是最简单的聊天样板 与模型聊天输入你有什么技能或你有什么技能 打开关键词触发技能
你:你有什么技能
AI:✅ 找到 6 个技能(直接回复数字/名称即可执行):
1、创建 E:\ok 文件夹
2、删除 E:\ok.txt 文件
3、查看 E:\ok.txt 内容
4、打开记事本
5、打开计算器
6、查看E盘文件列表
你:5
AI:✅ 已打开计算器
你:4
AI:✅ 已打开记事本
你:3
AI:✅ 文件内容:
4544554erwerr二人让他人它
你:2
AI:✅ 已删除 E:\ok.txt
你:1
AI:✅ 成功创建 E:\ok 文件夹
你:你有什么技能 打开
AI:✅ 找到 2 个技能(直接回复数字/名称即可执行):
4、打开记事本
5、打开计算器
你:5
AI:✅ 已打开计算器
你:4
AI:✅ 已打开记事本
以下是AI帮总结的 懒得打字
# ???? 本地AI技能助手
## 一、已实现的全部功能
### 1. 聊天交互
- 带**深色护眼图形界面**,美观不刺眼
- 支持**LM Studio + Qwen 3.5 等任意本地模型**
- 切换模型**自动清空对话**,不冲突、不卡顿
- 普通聊天与技能执行**无缝切换**
### 2. 智能技能系统(核心)
- 查看全部技能:
输入「你有什么技能」→ 列出所有技能+编号
- **模糊搜索技能**:
输入「你有什么技能 打开」→ 只显示含“打开”的技能
- **数字快捷执行**:
直接发 1/2/3… → 立刻执行对应技能
- **关键词执行**:
直接说“打开记事本”“创建文件夹”→ 自动执行
### 3. 已内置实用技能
1. 创建 E:\ok 文件夹
2. 删除 E:\ok.txt 文件
3. 查看 E:\ok.txt 内容
4. 打开记事本
5. 打开计算器
6. 查看 E 盘文件列表
---
## 二、用途与价值
- **本地私有化**:所有对话、操作都在本机,不上传云端
- **电脑控制简化**:不用记路径、命令,聊天式操控文件
- **效率工具**:一键创建/删除/查看文件、打开常用软件
- **低配置友好**:低配置电脑也可流畅运行,轻量无延迟
- **可无限扩展**:后续能继续加技能(重命名、复制、执行脚本、打开软件等)
---
简单说:
**这就是你自己的、本地运行、带深色界面、能搜技能、能数字快捷执行电脑操作的私人AI助手。**
一份**清晰、可落地、一步到位的后续进阶路线图**,完全贴合你现在这套「本地AI技能助手」,直接告诉你**能玩什么、怎么玩、代码怎么升级**。
# ???? 本地AI助手 · 后续进阶玩法总规划(超实用)
## 一、**自动化远程控制:手机 ↔ 电脑 全自动办事**
### 玩法:
- 用 **网易UU远程 / 向日葵 / ToDesk** 把手机连上电脑
- 手机打开你的AI聊天界面 → **发指令 = 控制电脑**
- 例:
- 手机发:**打开电脑记事本**
- 手机发:**创建 E:\工作文件夹**
- 手机发:**查看电脑E盘文件**
→ 电脑**自动执行**,手机实时看结果
### 进阶到:
- **AI + 远程桌面 = 你的私人远程机器人**
- 不在家也能:
- 启动软件
- 整理文件
- 运行脚本
- 关机/重启
---
## 二、**本地数据库技能系统:技能可增、删、改、查**
你现在技能是写死在代码里,下一步升级成:
### 1. 使用轻量本地数据库
- **SQLite**(不用安装,自带Python)
- 把所有技能存在 `skills.db` 里
### 2. 实现功能:
- **新增技能**:不用改代码,直接聊天教AI新技能
- 你:新增技能 打开微信 → 执行 start WeChat.exe
- **删除技能**
- **修改技能**
- **查看所有技能**
- **搜索技能**
### 3. 最终效果:
你的AI变成**可自定义、可成长、会学习的私人助手**,技能永久保存。
---
## 三、**AI技能 + 本地文件管理系统**
### 可扩展:
- 批量创建文件夹
- 复制/移动文件
- 重命名文件
- 按日期自动分类文件
- 读取任意文本文件、配置文件
- 写入文件(自动生成笔记、日志)
### 用途:
- 自动整理下载文件夹
- 自动备份文件
- 自动创建每日工作目录
---
## 四、**AI + 系统自动化**
### 可做:
- 定时任务(每天9点打开软件)
- 监控磁盘空间
- 自动清理垃圾文件
- 启动/关闭进程
- 执行自定义CMD/PowerShell脚本
---
## 五、**手机 + 电脑 + 云端 = 超级私人自动化平台**
### 终极形态:
1. 手机发指令 → 传到电脑
2. 电脑AI解析指令
3. 执行技能(操作文件/软件)
4. 结果返回手机
5. 所有技能存在本地数据库,可随时编辑
你就拥有了:
**私人本地AI + 远程控制 + 自动化 + 自定义技能**
---
# ???? 最适合三步进阶路线(按顺序做)
### 第1步:给AI加 **SQLite数据库**,实现技能可增删改查
### 第2步:加 **更多系统技能**(文件、目录、启动软件、脚本)
### 第3步:加 **远程控制联动**,手机远程指挥电脑
以下是python 源码 带界面 使用方法 需安装了python 及需要的包 创建个1.txt文件把下面代码粘贴进去修改名称1.py 运行cmd 输入python 1.py
import os
import json
import requests
import subprocess
import tkinter as tk
from tkinter import scrolledtext, ttk
import threading
# ========== 基础配置 ==========
API
MODEL_LIST = [
"y@q5_k_m",
"y@q2_k",
"y/y/qwen3.5-0.8b-q4_k_m.gguf",
"y/y/qwen3.5-4b-q4_k_m.gguf",
"qwen2.5-coder-7b-instruct",
"text-embedding-nomic-embed-text-v1.5"
]
# ========== 深色主题配色 ==========
DARK_BG = "#1e1e1e"
DARKER_BG = "#121212"
TEXT_FG = "#d4d4d4"
ACCENT_FG = "#569cd6"
SUCCESS_FG = "#4ec9b0"
ERROR_FG = "#f44747"
INPUT_BG = "#2d2d30"
CHAT_BG = "#252526"
BORDER_COLOR = "#3e3e42"
# ========== 【修复】技能库:1、2 号技能返回值正常 ==========
SKILLS = [
{
"name": "创建 E:\\ok 文件夹",
"keywords": ["创建", "文件夹", "ok"],
"action": lambda: (os.makedirs("E:\\ok", exist_ok=True), "✅ 成功创建 E:\\ok 文件夹")[1]
},
{
"name": "删除 E:\\ok.txt 文件",
"keywords": ["删除", "文件", "ok.txt"],
"action": lambda: (os.remove("E:\\ok.txt"), "✅ 已删除 E:\\ok.txt")[1] if os.path.exists("E:\\ok.txt") else "❌ 文件不存在"
},
{
"name": "查看 E:\\ok.txt 内容",
"keywords": ["查看", "文件", "内容", "ok.txt"],
"action": lambda: f"✅ 文件内容:\n{open('E:\\ok.txt','r',encoding='utf-8').read()}" if os.path.exists("E:\\ok.txt") else "❌ 文件不存在"
},
{
"name": "打开记事本",
"keywords": ["打开", "记事本", "notepad"],
"action": lambda: (subprocess.Popen("notepad.exe"), "✅ 已打开记事本")[1]
},
{
"name": "打开计算器",
"keywords": ["打开", "计算器", "calc"],
"action": lambda: (subprocess.Popen("calc.exe"), "✅ 已打开计算器")[1]
},
{
"name": "查看E盘文件列表",
"keywords": ["查看", "E盘", "列表", "目录"],
"action": lambda: f"✅ E盘文件:\n{os.listdir('E:\\')}"
}
]
# ========== AI 对话 ==========
def ai_reply(messages, model):
data = {"model": model, "messages": messages}
try:
resp = requests.post(f"{API_URL}/chat/completions", json=data, timeout=20)
return resp.json()["choices"][0]["message"]["content"]
except Exception as e:
return f"❌ 调用失败:{str(e)}"
# ========== GUI 界面(深色版) ==========
class ChatGUI:
def __init__(self, root):
self.root = root
self.root.title("本地AI技能助手(深色版)")
self.root.geometry("820x680")
self.root.configure(bg=DARK_BG)
self.messages = []
self.style = ttk.Style()
self.style.theme_use("clam")
self.style.configure(".",
background=DARK_BG,
foreground=TEXT_FG,
bordercolor=BORDER_COLOR,
lightcolor=BORDER_COLOR,
darkcolor=BORDER_COLOR)
self.style.configure("TCombobox",
fieldbackground=INPUT_BG,
background=INPUT_BG,
foreground=TEXT_FG)
self.style.configure("TButton",
background=DARKER_BG,
foreground=TEXT_FG,
borderwidth=1,
relief="solid")
self.style.map("TButton",
background=[("active", "#3a3a3d")],
foreground=[("active", ACCENT_FG)])
self.style.configure("TEntry",
fieldbackground=INPUT_BG,
foreground=TEXT_FG,
bordercolor=BORDER_COLOR)
top_frame = ttk.Frame(root, style="TFrame")
top_frame.pack(fill=tk.X, padx=10, pady=5)
ttk.Label(top_frame, text="选择模型:", foreground=TEXT_FG).pack(side=tk.LEFT, padx=5)
self.model_var = tk.StringVar(value=MODEL_LIST[2])
self.model_cb = ttk.Combobox(top_frame, textvariable=self.model_var, values=MODEL_LIST, width=60, style="TCombobox")
self.model_cb.pack(side=tk.LEFT, padx=5)
self.model_cb.bind("<<ComboboxSelected>>", self.on_model_change)
self.chat_area = scrolledtext.ScrolledText(root,
font=("微软雅黑", 11),
bg=CHAT_BG,
fg=TEXT_FG,
insertbackground=TEXT_FG,
relief="solid",
bd=1,
highlightbackground=BORDER_COLOR)
self.chat_area.pack(fill=tk.BOTH, expand=True, padx=10, pady=8)
self.chat_area.config(state=tk.DISABLED)
self.input_text = tk.StringVar()
self.input_entry = ttk.Entry(root, textvariable=self.input_text, font=("微软雅黑", 12), style="TEntry")
self.input_entry.pack(fill=tk.X, padx=10, pady=5)
self.input_entry.bind("<Return>", self.send_msg)
self.send_btn = ttk.Button(root, text="发送", command=self.send_msg, style="TButton")
self.send_btn.pack(pady=5)
def on_model_change(self, event):
self.messages = []
self.chat_area.config(state=tk.NORMAL)
self.chat_area.delete(1.0, tk.END)
self.chat_area.insert(tk.END, "✅ 已切换模型,对话已重置\n\n")
self.chat_area.config(state=tk.DISABLED)
def append_msg(self, sender, text):
self.chat_area.config(state=tk.NORMAL)
if sender == "你":
tag = "user"
self.chat_area.tag_configure(tag, foreground=ACCENT_FG)
else:
tag = "ai"
self.chat_area.tag_configure(tag, foreground=SUCCESS_FG)
self.chat_area.insert(tk.END, f"{sender}:", tag)
self.chat_area.insert(tk.END, f"{text}\n\n")
self.chat_area.see(tk.END)
self.chat_area.config(state=tk.DISABLED)
def send_msg(self, event=None):
msg = self.input_text.get().strip()
if not msg:
return
self.input_text.set("")
self.append_msg("你", msg)
self.messages.append({"role": "user", "content": msg})
threading.Thread(target=self.do_ai, args=(msg,), daemon=True).start()
def do_ai(self, msg):
msg = msg.strip()
if "你有什么技能" in msg or "你会什么" in msg or "技能" in msg:
keyword = ""
if " " in msg:
keyword = msg.split(" ", 1)[-1].strip()
match_skills = []
for idx, skill in enumerate(SKILLS):
if not keyword or any(keyword in kw for kw in skill["keywords"]) or keyword in skill["name"]:
match_skills.append((idx + 1, skill["name"]))
if not match_skills:
self.append_msg("AI", f"❌ 没有找到包含【{keyword}】的技能")
return
res = f"✅ 找到 {len(match_skills)} 个技能(直接回复数字/名称即可执行):\n"
for num, name in match_skills:
res += f"{num}、{name}\n"
self.append_msg("AI", res)
return
if msg.isdigit():
num = int(msg)
if 1 <= num <= len(SKILLS):
try:
result = SKILLS[num-1]["action"]()
self.append_msg("AI", result)
except Exception as e:
self.append_msg("AI", f"❌ 执行失败:{str(e)}")
return
for idx, skill in enumerate(SKILLS):
if msg in skill["name"] or any(kw in msg for kw in skill["keywords"]):
try:
result = skill["action"]()
self.append_msg("AI", result)
except Exception as e:
self.append_msg("AI", f"❌ 执行失败:{str(e)}")
return
reply = ai_reply(self.messages, self.model_var.get())
self.append_msg("AI", reply)
# ========== 启动 ==========
if __name__ == "__main__":
root = tk.Tk()
gui = ChatGUI(root)
root.mainloop()
|
|