递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 52|回复: 0
打印 上一主题 下一主题

[视窗] 开启LM Studio服务实现0成本本地 AI 办事自动化助手 支持Qw..

[复制链接]

3

主题

8

帖子

33

积分

新手上路

Rank: 1

积分
33
跳转到指定楼层
楼主
发表于 昨天 20:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本地运行、能搜技能、能数字快捷执行电脑操作的私人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()


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2026-3-28 01:47 , Processed in 0.094091 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表