浏览器运行环境异常,请检查是否开启本站的JavaScript权限或下载最新版浏览器
Logo
综合
文章
漫画
圈子
帮助
签到
创作
极速下载
资源区
学习区
专栏区
无标题文章
按赞
反对
评论
收藏
分享

轻量的AI对话Python脚本

当前脚本的特点:
- 简洁界面,单文件脚本。
- 配置两种不同的模型(视觉/纯文本)。
- 支持附件生成任务(可附加截图)。
- 对图像进行尺寸调整和压缩。
- 支持自定义命令和参数。
- 可调整取景框(拖动、修改尺寸、右键隐藏)。
- 支持自定义插件命令。
需要安装的依赖:pillow requests python-dotenv

需要API配置,可以创建.env文件:
VISION_API_KEY=""
TEXT_API_KEY=""
API_KEY=""

接下来创建配置文件 `screen_ai_config.json` :
{
  "settings": {
    "frame_width": 256,
    "frame_height": 256,
    "main_width": 350,
    "main_height": 450,
    "border_size": 3,
    "corner_size": 10,
    "border_color": "#FF0000",
    "max_tokens": 4096,
    "output_dir": "./outputs",
    "request_timeout": 120
  },

  "apis": { 请查看示例... }
}

创建插件目录plugins,

图片翻译插件 `tr.py` :
"""翻译图片文本"""


def execute(args):
    if not args:
        return "用法: /tr <目标语言>"

    from __main__ import app, get_nested, to_data_url

    image = app.capture()
    if not image:
        return "截图失败"

    try:
        # 构建用户消息内容
        user_content = [
            {"type": "image_url", "image_url": {"url": to_data_url(image)}},
            {"type": "text", "text": f"翻译为{args}"},
        ]

        resp = app.call_api(
            "vision",
            {
                "model": "gpt-4o",
                "messages": [{"role": "user", "content": user_content}],
                "max_tokens": 4096,
                "temperature": 0.3,
                "top_p": 0.9,
            },
        )

        # 先提取响应内容
        response = get_nested(resp, "choices.0.message.content", "翻译失败")

        # 再保存到对话历史
        app.add_message("user", user_content)
        app.add_message("assistant", response)

        return response
    except Exception as e:
        return f"出错了: {e}"

---

随机角色辩论(异步) `debate.py`:
"""随机角色辩论"""

import random
from datetime import datetime

random.seed(datetime.now().timestamp())

# ==================== 角色构建元素池 ====================

MOTTOS = [
    "怀疑一切,直到证据确凿",
    "相关不等于因果",
    "如无必要,勿增实体(奥卡姆剃刀)",
    "魔鬼在细节中",
    "未经审视的观点不值得持有",
    "第一性原理(回到最基本的事实)",
    "逆向思维(想成功先研究失败)",
    "万物皆有裂痕,那是光进来的地方",
    "地图不是疆域",
    "知之为知之,不知为不知",
    "没有什么比正确回答错误问题更危险",
    "所有模型都是错的,但有些是有用的",
    "如果你不能简单解释它,你就没有真正理解它",
    "强观点,弱持有",
    "在信息不完整时也要决策",
    "真理往往在两个极端之间",
    "复杂问题很少有简单解决方案",
    "今天的解决方案是明天的问题",
    "宁可大致正确,也不要精确错误",
    "先定义问题,再解决问题",
    "把结论变成预测,用结果校验",
    "数据胜于直觉(但故事有助于传播)",
    "可逆决策快做,不可逆决策慢做",
    "先验证可行性,再讨论优劣",
    "小步实验,快速反馈",
    "完成胜过完美",
    "测量你想改进的东西",
    "用实验定输赢,不用争论定输赢",
    "把不可控变可控(重构问题)",
    "不确定性是需要管理的变量",
]

WORK_MODES = [
    "将主张分解为可独立验证的命题,逐一检验",
    "假设当前结论为假,系统构造能推翻它的情景",
    "从表面不相关的系统中提取结构相似性",
    "将抽象方案转化为可执行的行动序列",
    "从现象反推最佳解释(溯因推理)",
    "测试极端和边界条件下的行为",
    "识别所有利益相关方及其激励结构",
    "分析短期、中期、长期的不同影响",
    "进行反事实推理(如果X没有发生会怎样)",
    "识别系统中的反馈循环和延迟效应",
    "寻找历史先例和类比案例",
    "量化不确定性,区分已知与未知",
    "构建论证的最强版本后再批判(钢人论证)",
    "评估信息来源的可靠性和潜在偏见",
    "从多个抽象层级审视问题",
    "追踪因果链条的每一环",
    "把问题转化为可测指标与判定阈值",
    "识别关键假设并按可证伪性与影响力排序",
    "设计最小成本实验验证最大不确定性",
    "区分可逆与不可逆决策,分别采用快与慢的流程",
    "建立对照组与基准线",
    "对关键变量做敏感性分析",
    "明确约束条件(时间、预算、资源、合规)并推导可行空间",
    "评估进一步调研的信息价值",
    "将复杂任务拆为探索阶段与利用阶段",
    "设置监控指标与触发条件(升级、止损)",
]

GOALS = [
    "发现隐藏假设和未言明的前提",
    "识别逻辑漏洞和推理错误",
    "提供可行的替代方案",
    "确保方案的可执行性",
    "揭示问题的深层模式和结构",
    "量化风险和不确定性",
    "找出潜在的机会和威胁",
    "促进共识或明确分歧点",
    "挑战既有框架和惯性思维",
    "整合多元视角形成综合理解",
    "预测可能的后果和副作用",
    "识别关键变量和杠杆点",
    "区分核心问题和表象问题",
    "建立可证伪的预测标准",
    "找到最小可行的解决路径",
    "暴露概念混淆和定义模糊",
    "澄清目标函数与约束条件",
    "定义成功标准与验收指标",
    "识别最先应验证的假设",
    "降低沟通成本与误解概率",
    "提升决策速度与决策质量",
    "形成可复用的知识资产(决策依据与复盘结论)",
    "建立预警与纠偏机制",
    "在多目标冲突下提供透明的权衡方案",
    "识别不可接受的风险(红线与底线)",
    "提升系统韧性(面对冲击仍能运行)",
]

THINKING_MODES = [
    "批判性思维(质疑假设,检验证据)",
    "系统性思维(关注整体与联系)",
    "创造性思维(打破常规,寻找新可能)",
    "战略性思维(考虑全局与长远)",
    "分析性思维(拆解问题,深入细节)",
    "整合性思维(综合矛盾,超越二元对立)",
    "反思性思维(审视自身思维过程)",
    "辩证思维(在对立中寻找统一)",
    "设计思维(以用户为中心,快速迭代)",
    "概率思维(用概率而非确定性思考)",
    "博弈思维(考虑他人的策略与反应)",
    "演化思维(关注适应、选择与变化)",
    "网络思维(关注节点与连接的影响)",
    "层次思维(区分不同抽象层级)",
    "时序思维(追踪先后顺序与路径依赖)",
    "逆向思维(从结果倒推条件)",
    "实验思维(假设、实验、迭代、复现)",
    "统计思维(分布、方差、噪声与置信度)",
    "工程思维(可靠性、可维护性与边界条件)",
    "计算思维(抽象、分解、自动化与复用)",
    "经济思维(稀缺性、激励、边际与机会成本)",
    "伦理思维(价值冲突、利益相关方与可解释性)",
    "叙事思维(用结构化故事提升理解与行动)",
    "元认知(监控自身思维过程与偏见)",
]

TOOLS = [
    "MECE原则(相互独立、完全穷尽)",
    "5Why分析法(追问根本原因)",
    "费米估算(快速量级估计)",
    "贝叶斯更新(根据新证据调整信念强度)",
    "博弈论分析(策略互动建模)",
    "机会成本分析(选择的隐性代价)",
    "归谬法(假设为真推出矛盾)",
    "思想实验(理想化情景推演)",
    "情景规划(多未来分支分析)",
    "预验尸(假设已失败,回溯原因)",
    "红队推演(对抗视角压力测试)",
    "决策树(条件分支与期望值计算)",
    "敏感性分析(关键变量波动测试)",
    "类比推理(跨领域结构映射)",
    "二阶思维(考虑后果的后果)",
    "概念澄清(定义边界与内涵)",
    "钢人论证(构建最强对立观点再批判)",
    "奥卡姆剃刀(优先选择最简假设)",
    "汉隆剃刀(能解释为愚蠢的,就不要解释为恶意)",
    "切斯特顿栅栏(先理解存在理由再改变)",
    "黑天鹅检查(低概率高影响事件扫描)",
    "林迪效应(已存续越久,预期剩余寿命越长)",
    "帕累托分析(识别关键少数)",
    "鱼骨图(因果分类梳理)",
    "因果回路图(识别正负反馈与延迟)",
    "风险矩阵(概率×影响分层)",
    "蒙特卡罗模拟(随机抽样估计分布)",
    "AARRR漏斗(获取、激活、留存、变现、推荐)",
    "Kano模型(需求分类与优先级)",
    "JTBD框架(用户任务视角)",
    "OKR(目标与关键结果对齐)",
    "SMART标准(具体、可衡量、可达成、相关、有时限)",
    "RACI矩阵(负责、批准、咨询、知会)",
    "A3报告(问题、分析、对策、验证一页纸)",
    "六顶思考帽(并行多角色思考)",
    "置信区间与显著性检验(区分信号与噪声)",
]

BIAS_AWARENESS = [
    "确认偏误(倾向于寻找支持己见的证据)",
    "可得性偏误(过度依赖容易想起的例子)",
    "锚定效应(过度受初始信息影响)",
    "后见之明偏误(事后觉得结果显而易见)",
    "幸存者偏差(只看到成功样本)",
    "群体思维(为求一致而压制异议)",
    "沉没成本谬误(因已投入而继续错误方向)",
    "框架效应(表述方式影响判断)",
    "过度自信(高估自身判断的准确性)",
    "基本归因错误(过度归因于个人而忽视情境)",
    "禀赋效应(高估自己拥有之物的价值)",
    "现状偏好(不合理地偏好当前状态)",
    "损失厌恶(对损失的敏感度高于同等收益)",
    "基本比率忽视(忽略先验概率)",
    "赌徒谬误(误认为独立事件会自我修正)",
    "结果偏误(用结果好坏评价决策质量)",
    "选择性注意(只看见想看见的信息)",
    "光环效应(以偏概全的正面推断)",
    "负面偏误(对负面信息赋予过高权重)",
    "自利偏误(成功归己,失败归外)",
    "达克效应(能力越低越倾向高估自己)",
    "计划谬误(系统性低估时间与成本)",
    "峰终定律(以峰值和结尾体验评价整体)",
    "情感启发式(用情绪感受替代理性计算)",
]

# 角色基础模板
ROLE_TEMPLATES = [
    {
        "base_name": "审视者",
        "tendency": {
            "challenge": 0.30,
            "question": 0.35,
            "contribute": 0.20,
            "agree": 0.10,
            "veto": 0.05,
        },
        "temperature": 0.1,
    },
    {
        "base_name": "挑战者",
        "tendency": {
            "challenge": 0.45,
            "question": 0.25,
            "contribute": 0.15,
            "agree": 0.10,
            "veto": 0.05,
        },
        "temperature": 0.3,
    },
    {
        "base_name": "联结者",
        "tendency": {
            "contribute": 0.45,
            "agree": 0.25,
            "question": 0.15,
            "challenge": 0.10,
            "veto": 0.05,
        },
        "temperature": 0.9,
    },
    {
        "base_name": "实践者",
        "tendency": {
            "question": 0.30,
            "challenge": 0.25,
            "contribute": 0.25,
            "agree": 0.15,
            "veto": 0.05,
        },
        "temperature": 0.2,
    },
    {
        "base_name": "整合者",
        "tendency": {
            "contribute": 0.35,
            "agree": 0.30,
            "question": 0.20,
            "challenge": 0.10,
            "veto": 0.05,
        },
        "temperature": 0.5,
    },
    {
        "base_name": "预见者",
        "tendency": {
            "contribute": 0.30,
            "question": 0.30,
            "challenge": 0.25,
            "agree": 0.10,
            "veto": 0.05,
        },
        "temperature": 0.6,
    },
    {
        "base_name": "解构者",
        "tendency": {
            "challenge": 0.40,
            "question": 0.30,
            "contribute": 0.15,
            "agree": 0.10,
            "veto": 0.05,
        },
        "temperature": 0.4,
    },
    {
        "base_name": "建构者",
        "tendency": {
            "contribute": 0.40,
            "agree": 0.20,
            "question": 0.25,
            "challenge": 0.10,
            "veto": 0.05,
        },
        "temperature": 0.7,
    },
]

TYPES = {
    "contribute": "贡献新的有价值观点",
    "agree": "同意某个观点并说明理由",
    "challenge": "挑战某个观点,给出反例或具体理由",
    "veto": "否决(仅用于严重错误)",
    "question": "追问以澄清问题",
}


class ElementPool:
    """管理元素分配,避免重复"""

    def __init__(self):
        self.used = {
            "mottos": set(),
            "work_modes": set(),
            "goals": set(),
            "thinking": set(),
            "tools": set(),
            "bias": set(),
            "templates": [],
        }

    def pick(self, pool, category, count=1):
        """从池中不重复地选取元素"""
        available = [x for x in pool if x not in self.used[category]]
        if len(available) < count:
            available = pool  # 池子耗尽时允许重复
        selected = random.sample(available, min(count, len(available)))
        self.used[category].update(selected)
        return selected[0] if count == 1 else selected

    def pick_template(self):
        """选取角色模板,优先选未使用的"""
        available = [
            t for t in ROLE_TEMPLATES if t["base_name"] not in self.used["templates"]
        ]
        if not available:
            available = ROLE_TEMPLATES
        template = random.choice(available)
        self.used["templates"].append(template["base_name"])
        return template


def generate_role(pool):
    """动态生成一个随机角色"""
    template = pool.pick_template()

    return {
        "name": template["base_name"],
        "motto": pool.pick(MOTTOS, "mottos"),
        "work_mode": pool.pick(WORK_MODES, "work_modes"),
        "goal": pool.pick(GOALS, "goals"),
        "thinking_mode": pool.pick(THINKING_MODES, "thinking"),
        "tools": pool.pick(TOOLS, "tools", count=2),
        "bias_alert": pool.pick(BIAS_AWARENESS, "bias"),
        "tendency": template["tendency"],
        "temperature": template["temperature"],
    }


def pick_type(tendency):
    """基于权重随机选择响应类型"""
    types, weights = zip(*tendency.items())
    return random.choices(types, weights=weights, k=1)[0]


def execute(args):
    if not args:
        return """用法: /debate <话题>
      /debate <N> <话题> (指定N个角色,2-4,默认2)"""

    from __main__ import app

    app.run_async(_work, args)
    return None


def _work(args):
    """后台执行主体"""
    from __main__ import app, get_nested

    # 解析参数
    parts = args.strip().split(maxsplit=1)
    num, topic = 2, args.strip()

    if len(parts) == 2 and parts[0].isdigit():
        num = min(max(int(parts[0]), 2), 4)
        topic = parts[1]

    # 动态生成随机角色
    pool = ElementPool()
    roles = [generate_role(pool) for _ in range(num)]

    # 打印角色配置
    app.print(f"话题: {topic}\n\n")
    app.print("本轮角色配置\n")

    for role in roles:
        app.print(f"【{role['name']}】\n")
        app.print(f'  座右铭: "{role["motto"]}"\n')
        app.print(f"  思考模式: {role['thinking_mode']}\n")
        app.print(f"  工具: {' | '.join(role['tools'])}\n")
        app.print(f"  目标: {role['goal']}\n")
        app.print(f"  警惕: {role['bias_alert']}\n\n")

    app.print("讨论开始\n")

    history = []

    for role in roles:
        rtype = pick_type(role["tendency"])

        prompt = f"""你正在参与一场多角色讨论。

话题: {topic}

角色: 【{role["name"]}】
座右铭: "{role["motto"]}"
工作模式: {role["work_mode"]}
思考模式: {role["thinking_mode"]}
分析工具: {", ".join(role["tools"])}
本轮目标: {role["goal"]}
认知偏见警惕: {role["bias_alert"]}

本轮请以 {rtype.upper()} 方式回应: {TYPES[rtype]}

{"之前的发言:" + chr(10) + chr(10).join(history) if history else "你是第一位发言者,请开启讨论。"}

请严格使用你的工具和思考模式,按以下格式回应:

角色: {role["name"]}
类型: {rtype.upper()}
内容: [运用你的工具和思考模式,给出2-3句精炼观点]
理由: [一句话核心论据]"""

        try:
            resp = app.call_api(
                "text",
                {
                    "model": "z-ai/glm-4.5-air:free",
                    "messages": [{"role": "user", "content": prompt}],
                    "max_tokens": 4096,
                    "temperature": role["temperature"],
                    "reasoning": {"effort": "high", "enabled": True},
                },
            )

            text = get_nested(resp, "choices.0.message.content", "获取内容失败")
            if text:
                history.append(text)
                app.print(text + "\n")

        except Exception as e:
            app.print(f"{role['name']}发言失败: {e}\n")

    if not history:
        app.print("讨论失败:所有角色发言均未成功")
        return

    full = "\n\n".join(history)
    app.add_message("user", f"多角色讨论话题: {topic}")
    app.add_message("assistant", full)
    app.print(f"讨论完成({len(history)}轮)。可用 /text 继续追问。")
    return

配置教程:网页链接(vikingfile.com)

配置示例:网页链接(vikingfile.com)

插件教程:网页链接(vikingfile.com)

脚本下载:网页链接(vikingfile.com)

评论区

这个up主感受到了孤独

logo
有维咔App就够了
随时随地发现资源,免去网页端烦恼广告
打开App