2025年11月

开源了一个基于 Docker 的星露谷物语服务器一键部署解决方案。

项目地址:
[bsgit user="truman-world"]puppy-stardew-server[/bsgit]
Stardew Server - Docker 一键部署星露谷物语开联机服务器

核心特性

这个项目最大的亮点是整合了几个自定义模组,带来了更好的多人游戏体验:

即时睡眠功能:任何一个玩家在床上选择睡觉,游戏会立刻为所有在线玩家存档并结束当天。再也不用互相等待离线或 AFK 的玩家。

24/7 专用服务器:基于 Docker 容器化,服务器可以 7x24 小时独立运行,房主无需在线。适合部署在 VPS 、云服务器或家用 NAS 上。

一键脚本部署:一条命令,3 分钟即可完成所有环境配置和启动。无需手动安装 SMAPI 、配置模组或设置环境。

跨平台联机:支持 PC 、Mac 、Linux ,以及 iOS 和 Android 玩家在同一个服务器中游戏。所有平台互通,无需复杂配置。

房主自动隐藏:主机玩家作为服务器运行,在游戏中自动隐身,不占用玩家名额,也不会干扰正常游戏。

存档自动加载:服务器重启后会自动加载最新的存档,无需手动操作。首次部署通过 VNC 创建存档后,之后完全自动化。

内置 VNC:首次创建世界时,可以通过浏览器或 VNC 客户端远程访问图形界面,操作简单。

自然技能升级( v1.0.58 新增):防止服务器强制房主升到 10 级,保持基于真实经验值的技能等级。玩家可以手动选择技能专精路线,保留游戏原有的成长乐趣。

一键启动

在任何一台安装了 Docker 的服务器上运行:

curl -sSL https://raw.githubusercontent.com/truman-world/puppy-stardew-server/main/quick-start.sh | bash

脚本会自动完成环境检查、配置文件生成、目录创建、权限设置和容器启动。

手动部署

如果你更喜欢手动控制:

1. 创建 docker-compose.yml

version: '3.8'
services:
  stardew-server:
    image: truemanlive/puppy-stardew-server:latest
    container_name: puppy-stardew
    restart: unless-stopped
    stdin_open: true
    tty: true
    environment:
      - STEAM_USERNAME=your_steam_username
      - STEAM_PASSWORD=your_steam_password
      - ENABLE_VNC=true
      - VNC_PASSWORD=stardew123
    ports:
      - "24642:24642/udp"
      - "5900:5900/tcp"
    volumes:
      - ./data/saves:/home/steam/.config/StardewValley:rw
      - ./data/game:/home/steam/stardewvalley:rw
      - ./data/steam:/home/steam/Steam:rw
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2G

2. 设置权限并启动

mkdir -p data/{saves,game,steam}
chown -R 1000:1000 data/
docker compose up -d

3. 首次设置

使用 VNC 连接到 your-server-ip:5900(密码:stardew123),创建或导入存档。

4. 玩家连接

游戏中:Co-op → Join LAN Game → 输入 your-server-ip:24642

预装模组

  • SMAPI 4.3.2 - 官方模组加载器
  • Always On Server v1.20.3 - 无头服务器运行
  • Skill Level Guard v1.4.0 - 防止强制升级,保持自然技能进度
  • ServerAutoLoad v1.2.1 - 自动加载存档
  • AutoHideHost v1.2.2 - 隐藏房主,即时睡眠

系统要求

服务器端:

  • Docker 和 Docker Compose
  • 2GB 内存( 4+ 玩家推荐 4GB )
  • 2GB 磁盘空间
  • Steam 账号(拥有星露谷物语)

客户端:

  • 星露谷物语(任何平台)
  • 与服务器相同的游戏版本

v1.0.58 更新

修复:

  • Always On Server 自动启用问题(服务器现在可以自动暂停/恢复)
  • 玩家技能专精选择问题(可以手动选择路线)

改进:

  • 自然技能升级(基于真实经验值,不再强制 10 级)
  • 服务器空闲时自动暂停(节省资源)

已解决的问题:

  • 长时间空闲后无法连接
  • 地震等特殊事件冻结游戏
  • 无限等待其他玩家
  • 无需邀请码(直接用 IP 连接)

文档与支持

许可证

  • 项目: MIT License
  • 游戏: 需合法拥有星露谷物语( Steam )
  • SMAPI & Always On Server: GPL-3.0
  • 自定义模组: MIT License

有些时候我们需要开发调试修改 HTTP 的 Header (例如 User-Agent),UA3F 可以做到对客户端无感的透明重写。

UA3F 作为一个 HTTP 、SOCKS5 、TPROXY 、REDIRECT 、NFQUEUE 代理服务对 HTTP/1.1 请求 Header 进行透明重写。

UA3F 还可以自定义重写规则,根据匹配条件的不同进行不同行为的重写:
匹配规则类型支持:KEYWORD 、REGEX 、DEST-PORT 、SRC-IP 、IP-CIDR
重写策略支持:DELETE 、REPLACE 、REPLACE-PART 、DROP
后续会有更多规则加入。

UA3F: 透明重写 HTTP Header

[bsgit user="SunBK201"]UA3F[/bsgit]

v1 版本收到许多反馈,主要还是集中在男女的任务不能分开,导致许多任务不好执行,于是新做一个版本。新版本实现如下特性:

  • 双人实时对战:房间创建 / 加入、掷骰、回合推进、胜负判定
  • 主题题库:每位玩家选择各自主题,星 / 陷阱 / 撞机触发任务
  • AI 生成任务:基于个人偏好与主题调用生成批量任务
  • 偏好设置:性别与兴趣标签,影响 AI 生成的任务风格
  • 隐私注册:支持随机账户注册,提供一键复制账号与密码
  • 历史归档:对局结束自动入库摘要,任务完成情况可追溯
最初打算基于 go 开发,但是考虑到部署需要服务器,换成了 next+supabase 这种纯白嫖方案,这样也方便大家私有化的部署,缺点就是卡卡的,也没法支撑太多人游戏。目前我只是简单的测试就上线了,可能还有些 bug 需要等待反馈后修复,当然我觉得能凑合着玩就行,有点 bug 是正常的。v2 版本更适合私有化部署,本身 nextjs+supabase 这套方案不太适合多人使用。

[bsgit user="woniu9524"]love-ludo[/bsgit]

试用地址:https://v2.cpfly.top/

情侣飞行棋 v2, 支持 AI 生成任务,自有主题题库,双人实时对战,私有化部署

Prizrak-Box 是一个跨平台的轻量桌面客户端(Pandora-Box 的分支项目),适配 Mihomo 内核,支持多种代理协议、规则自动分组与 TUN 模式。

Prizrak-Box 在原 Pandora-Box 的基础上做了以下扩展:

1、改进了订阅页面的流量使用和订阅信息显示方式。原版是显示在顶部,只能显示当前使用订阅的信息。俄版将信息显示在每个卡片上,更直观和整体掌握订阅的流量使用情况。

流量使用和订阅信息显示方式

2、在设置页面添加了自定义控制面板。

自定义控制面板

3、软件背景可以自定义上传设置
自定义背景设置

4、针对macOS系统的软件安装包添加了签名,防止在软件安装时系统提示“软件已损坏”

5、软件详细使用如下,需要自行网页翻译
使用介绍

题外话:
这两个软件的作者有意思,软件名字起的都这么诡异。

“Pandora-Box”,是一个来自希腊神话的文化隐喻,意指一个看似无害但一旦开启就会释放出灾难和混乱的事物。

而 “Prizrak”(Призрак) 在俄语中通常翻译为“幽灵”、“鬼魂”或“幻影”。

他们似乎在说:富强需谨慎,自由非无界,探索亦有度

您好,这是过去24小时内最重要的人工智能与科技动态报告。

摘要

过去24小时,AI领域最引人注目的进展是中国发布了全球首个深海生境多模态大模型“DePTH-GPT”。同时,正在举行的2025世界互联网大会乌镇峰会成为科技公告的焦点,蚂蚁集团万卡国产算力集群的部署尤为突出。学术界和开源社区则持续关注AI Agent、RAG技术和模型可靠性。

模型发布 (Model Releases)

  • DePTH-GPT:全球首个深海生境多模态大模型

    • 发布机构: 由中国大洋事务管理局指导,自然资源部第二海洋研究所、之江实验室联合国内外多家科研机构共同研发。
    • 核心能力: 这是全球首个面向深海典型生境的多模态大模型,能够融合处理视频、地形、水动力、生物声学等多源异构数据,进行生境动态推演与智能决策支持。
    • 意义: 标志着深海研究从传统定性分析向可解释、可预测的智能认知新阶段迈进。该模型将面向全球科研机构与国际组织开放使用。
    • 来源: 来自gmw.cn网站。

最新论文 (New Papers)

  • 研究焦点:AI Agent、可靠性与可持续性

    • VeriCoT (arXiv:2511.04662): 提出一种神经符号方法,通过逻辑一致性检查来验证大模型的思维链(Chain-of-Thought)过程,以提升推理的可靠性。来自arxiv.org网站。
    • DR. WELL (arXiv:2511.04646): 探索基于具身大语言模型(Embodied LLM)的多智能体协作,通过动态推理和学习来完成复杂任务。来自arxiv.org网站。
    • Jr. AI Scientist (arXiv:2511.04583): 关注自主科学发现AI智能体及其风险评估,探讨AI在科研中的应用潜力与挑战。来自arxiv.org网站。

开源项目 (Open-Source Projects)

  • 趋势:AI Agent工作流与本地化部署

    • dify: 一个用于构建和部署AI Agent工作流的开源平台,持续在GitHub上保持热度,反映了市场对Agent应用的强烈需求。来自github.com网站。
    • 微舆 (Wei Yu): 一个新晋热门项目,定位为“人人可用的多Agent舆情分析助手”,旨在通过多智能体协作还原舆情原貌,辅助决策。来自github.com网站。
    • KTransformers: 近期备受关注的国产开源项目,通过与LLaMA-Factory联动,使消费级显卡也能进行超大语言模型的微调,大幅降低了AI技术的应用门槛。来自csdn.net网站。

重大公告与产品更新 (Major Announcements & Product Updates)

  • 2025世界互联网大会乌镇峰会

    • 蚂蚁集团部署万卡国产算力集群: 蚂蚁集团在会上透露,已部署万卡规模的国产算力集群,全面应用于安全风控等领域的大模型训练,训练任务稳定性超过98%。来自sina.com.cn网站。
    • GLM大模型获领先科技奖: 清华大学与智谱华章的“GLM大模型关键技术及规模化应用”项目获奖,表彰其在预训练架构和规模化应用上的成就。来自tsinghua.edu.cn网站。
    • 行业蓝皮书发布: 大会发布的报告指出,中国已成为全球人工智能专利最大拥有国,占比达60%,且“具身智能”成为全球主要经济体高度重视的方向。来自cctv.cn网站。

const API_BASE_URL = "https://movementlabs.ai";
const DEFAULT_AUTH_KEYS = ["sk-default", "sk-false"];
const DEFAULT_SESSIONS = ["session1", "session2"];

const UA_COMPONENTS = {
  windows: {
    os: [
      "Windows NT 10.0; Win64; x64",
      "Windows NT 10.0; WOW64",
      "Windows NT 6.1; Win64; x64",
      "Windows NT 6.1; WOW64"
    ],
    browsers: {
      chrome: {
        name: "Chrome",
        versions: ["120.0.0.0", "119.0.0.0", "118.0.0.0", "117.0.0.0", "116.0.0.0"],
        webkit: "537.36"
      },
      firefox: {
        name: "Firefox",
        versions: ["121.0", "120.0", "119.0", "118.0", "117.0"],
        gecko: "20100101"
      },
      edge: {
        name: "Edg",
        versions: ["120.0.0.0", "119.0.0.0", "118.0.0.0"],
        webkit: "537.36"
      }
    }
  },
  
  macos: {
    os: [
      "Macintosh; Intel Mac OS X 10_15_7",
      "Macintosh; Intel Mac OS X 10_14_6",
      "Macintosh; Intel Mac OS X 13_6",
      "Macintosh; Intel Mac OS X 14_2"
    ],
    browsers: {
      chrome: {
        name: "Chrome",
        versions: ["120.0.0.0", "119.0.0.0", "118.0.0.0", "117.0.0.0"],
        webkit: "537.36"
      },
      safari: {
        name: "Version",
        versions: ["17.1.2", "17.1", "17.0", "16.6"],
        webkit: "605.1.15",
        safari: "605.1.15"
      },
      firefox: {
        name: "Firefox",
        versions: ["121.0", "120.0", "119.0"],
        gecko: "20100101"
      }
    }
  },
  
  linux: {
    os: [
      "X11; Linux x86_64",
      "X11; Ubuntu; Linux x86_64"
    ],
    browsers: {
      chrome: {
        name: "Chrome",
        versions: ["120.0.0.0", "119.0.0.0", "118.0.0.0"],
        webkit: "537.36"
      },
      firefox: {
        name: "Firefox",
        versions: ["121.0", "120.0", "119.0"],
        gecko: "20100101"
      }
    }
  },
  
  android: {
    os: [
      "Linux; Android 13; Pixel 7",
      "Linux; Android 12; SM-G991B",
      "Linux; Android 11; SM-A525F",
      "Linux; Android 14; SM-S918B",
      "Linux; Android 13; 2201116SG"
    ],
    browsers: {
      chrome: {
        name: "Chrome",
        versions: ["116.0.0.0", "115.0.0.0", "114.0.0.0", "113.0.0.0"],
        webkit: "537.36",
        mobile: "Mobile Safari/537.36"
      },
      firefox: {
        name: "Firefox",
        versions: ["116.0", "115.0", "114.0"],
        mobile: "Mobile"
      }
    }
  },
  
  ios: {
    os: [
      "iPhone; CPU iPhone OS 17_0 like Mac OS X",
      "iPhone; CPU iPhone OS 16_6 like Mac OS X",
      "iPhone; CPU iPhone OS 15_7 like Mac OS X",
      "iPad; CPU OS 17_1 like Mac OS X"
    ],
    browsers: {
      safari: {
        name: "Version",
        versions: ["17.0", "16.6", "15.7", "17.1"],
        webkit: "605.1.15",
        mobile: "Mobile/15E148 Safari/604.1"
      },
      chrome: {
        name: "CriOS",
        versions: ["120.0.6099.119", "119.0.6045.169", "118.0.5993.88"],
        webkit: "605.1.15",
        mobile: "Mobile/15E148"
      }
    }
  }
};

const MODELS = [
  "momentum",
  "gpt-4o-mini",
  "gpt-4o",
  "gpt-4.1-nano",
  "gpt-4.1-mini",
];

function getRandomChoice(arr) {
  return arr[Math.floor(Math.random() * arr.length)];
}

function getRandomUserAgent() {
  const platforms = Object.keys(UA_COMPONENTS);
  const platform = getRandomChoice(platforms);
  const config = UA_COMPONENTS[platform];
  
  const os = getRandomChoice(config.os);
  const browserTypes = Object.keys(config.browsers);
  const browserType = getRandomChoice(browserTypes);
  const browser = config.browsers[browserType];
  const version = getRandomChoice(browser.versions);
  
  let ua = "Mozilla/5.0";
  
  if (platform === 'windows' || platform === 'linux') {
    ua += ` (${os})`;
  } else if (platform === 'macos') {
    ua += ` (${os})`;
  } else if (platform === 'android') {
    ua += ` (${os})`;
  } else if (platform === 'ios') {
    ua += ` (${os})`;
  }
  
  if (browserType === 'chrome' || browserType === 'edge') {
    ua += ` AppleWebKit/${browser.webkit} (KHTML, like Gecko) ${browser.name}/${version} Safari/${browser.webkit}`;
    if (platform === 'android' && browser.mobile) {
      ua += ` ${browser.mobile}`;
    }
  } else if (browserType === 'firefox') {
    ua += `; rv:${version}) Gecko/${browser.gecko} Firefox/${version}`;
    if (platform === 'android' && browser.mobile) {
      ua += ` ${browser.mobile}`;
    }
  } else if (browserType === 'safari') {
    ua += ` AppleWebKit/${browser.webkit} (KHTML, like Gecko) ${browser.name}/${version} Safari/${browser.safari || browser.webkit}`;
    if (platform === 'ios' && browser.mobile) {
      ua += ` ${browser.mobile}`;
    }
  } else if (browserType === 'crios') {
    ua += ` AppleWebKit/${browser.webkit} (KHTML, like Gecko) ${browser.name}/${version} Mobile/15E148 Safari/${browser.webkit}`;
  }
  
  return ua;
}

function getRandomSession(sessions) {
  return sessions[Math.floor(Math.random() * sessions.length)];
}

function generateUUID() {
  return crypto.randomUUID();
}

function parseAuthAndGetSessions(req, ENV) {
  const authHeader = req.headers.get("Authorization");
  if (!authHeader) return null;

  const token = authHeader.replace(/^Bearer\s+/i, "");
  
  if (DEFAULT_AUTH_KEYS.includes(token)) {
    return ENV.AUTH_SESSIONS?.split(",") || DEFAULT_SESSIONS;
  }
  
  const sessions = token.split(",").map(s => s.trim()).filter(s => s.length > 0);
  return sessions.length > 0 ? sessions : null;
}

function getCorsHeaders() {
  return {
    "Access-Control-Allow-Origin": "*",
    "Access-Control-Allow-Methods": "GET, POST, OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Authorization",
  };
}

function handleModelsRequest() {
  const modelsData = {
    object: "list",
    data: MODELS.map((modelId) => ({
      id: modelId,
      object: "model",
      created: Math.floor(Date.now() / 1000),
      owned_by: "movementlabs",
    })),
  };

  return new Response(JSON.stringify(modelsData), {
    status: 200,
    headers: {
      "Content-Type": "application/json",
      ...getCorsHeaders(),
    },
  });
}

function convertMessages(messages) {
  return messages.map((msg) => ({
    role: msg.role === "assistant" ? "assistant" : "user",
    content: msg.content,
  }));
}

function countUserMessages(messages) {
  return messages.filter((msg) => msg.role !== "assistant").length;
}

function parseStreamChunk(chunk) {
  if (!chunk.startsWith('0:"')) return null;
  
  try {
    const match = chunk.match(/^0:"(.*)"/);
    if (match && match[1]) {
      return match[1]
        .replace(/\\n/g, "\n")
        .replace(/\\"/g, '"')
        .replace(/\\\\/g, "\\");
    }
  } catch (e) {
    console.error("Parse chunk error:", e);
  }
  return null;
}

function createStreamChunk(id, model, content, finishReason = null) {
  const chunk = {
    id,
    object: "chat.completion.chunk",
    created: Math.floor(Date.now() / 1000),
    model,
    choices: [
      {
        index: 0,
        delta: finishReason
          ? { content: "", reasoning_content: null }
          : { content, reasoning_content: null },
        logprobs: null,
        finish_reason: finishReason,
      },
    ],
  };

  return `data: ${JSON.stringify(chunk)}\n\n`;
}

async function handleStreamResponse(targetResponse, model) {
  const reader = targetResponse.body.getReader();
  const encoder = new TextEncoder();
  const decoder = new TextDecoder();
  const id = generateUUID();

  const stream = new ReadableStream({
    async start(controller) {
      try {
        const firstChunk = {
          id,
          object: "chat.completion.chunk",
          created: Math.floor(Date.now() / 1000),
          model,
          choices: [
            {
              index: 0,
              delta: {
                role: "assistant",
                content: null,
                reasoning_content: null,
              },
              logprobs: null,
              finish_reason: null,
            },
          ],
        };
        controller.enqueue(encoder.encode(`data: ${JSON.stringify(firstChunk)}\n\n`));

        let buffer = "";

        while (true) {
          const { done, value } = await reader.read();
          if (done) break;

          buffer += decoder.decode(value, { stream: true });
          const lines = buffer.split("\n");
          buffer = lines.pop() || "";

          for (const line of lines) {
            if (!line.trim()) continue;

            const content = parseStreamChunk(line);
            if (content !== null) {
              const chunk = createStreamChunk(id, model, content);
              controller.enqueue(encoder.encode(chunk));
            }
          }
        }

        if (buffer.trim()) {
          const content = parseStreamChunk(buffer);
          if (content !== null) {
            const chunk = createStreamChunk(id, model, content);
            controller.enqueue(encoder.encode(chunk));
          }
        }

        const finishChunk = createStreamChunk(id, model, "", "stop");
        controller.enqueue(encoder.encode(finishChunk));
        controller.enqueue(encoder.encode("data: [DONE]\n\n"));

        controller.close();
      } catch (error) {
        console.error("Stream error:", error);
        controller.error(error);
      }
    },
  });

  return new Response(stream, {
    headers: {
      "Content-Type": "text/event-stream",
      "Cache-Control": "no-cache",
      "Connection": "keep-alive",
      ...getCorsHeaders(),
    },
  });
}

async function handleNonStreamResponse(targetResponse, model) {
  const reader = targetResponse.body.getReader();
  const decoder = new TextDecoder();
  let buffer = "";
  let fullContent = "";

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;

    buffer += decoder.decode(value, { stream: true });
    const lines = buffer.split("\n");
    buffer = lines.pop() || "";

    for (const line of lines) {
      if (!line.trim()) continue;

      const content = parseStreamChunk(line);
      if (content !== null) {
        fullContent += content;
      }
    }
  }

  if (buffer.trim()) {
    const content = parseStreamChunk(buffer);
    if (content !== null) {
      fullContent += content;
    }
  }

  const response = {
    id: generateUUID(),
    object: "chat.completion",
    created: Math.floor(Date.now() / 1000),
    model,
    choices: [
      {
        index: 0,
        message: {
          role: "assistant",
          content: fullContent,
          reasoning_content: null,
        },
        finish_reason: "stop",
      },
    ],
    usage: {
      prompt_tokens: 0,
      completion_tokens: 0,
      total_tokens: 0,
    },
  };

  return new Response(JSON.stringify(response), {
    headers: {
      "Content-Type": "application/json",
      ...getCorsHeaders(),
    },
  });
}

async function handleChatCompletion(req, sessions, ENV) {
  try {
    const body = await req.json();
    const { messages, stream = false, model = "momentum" } = body;

    if (!messages || !Array.isArray(messages)) {
      return new Response(
        JSON.stringify({ error: "Invalid messages format" }),
        {
          status: 400,
          headers: { "Content-Type": "application/json", ...getCorsHeaders() },
        }
      );
    }

    const convertedMessages = convertMessages(messages);
    const userMessageCount = countUserMessages(messages);

    const selectedSession = getRandomSession(sessions);

    const targetUrl = `${API_BASE_URL}/api/chat`;
    const targetBody = {
      messages: convertedMessages,
    };

    const targetResponse = await fetch(targetUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-message-count": userMessageCount.toString(),
        "User-Agent": getRandomUserAgent(),
        "Referer": `${API_BASE_URL}/`,
        "Cookie": `__session=${selectedSession}`,
      },
      body: JSON.stringify(targetBody),
    });

    if (!targetResponse.ok) {
      return new Response(
        JSON.stringify({ 
          error: "Target API request failed",
          status: targetResponse.status,
          statusText: targetResponse.statusText
        }),
        {
          status: targetResponse.status,
          headers: { "Content-Type": "application/json", ...getCorsHeaders() },
        }
      );
    }

    if (stream) {
      return await handleStreamResponse(targetResponse, model);
    } else {
      return await handleNonStreamResponse(targetResponse, model);
    }
  } catch (error) {
    console.error("Chat completion error:", error);
    return new Response(
      JSON.stringify({ 
        error: "Internal server error",
        message: error instanceof Error ? error.message : String(error)
      }),
      {
        status: 500,
        headers: { "Content-Type": "application/json", ...getCorsHeaders() },
      }
    );
  }
}

export default {
  async fetch(req, env, ctx) {
    const url = new URL(req.url);

    if (req.method === "OPTIONS") {
      return new Response(null, {
        status: 204,
        headers: getCorsHeaders(),
      });
    }

    if (url.pathname === "/") {
      return new Response(
        JSON.stringify({
          status: "ok",
          message: "API is healthy",
          timestamp: new Date().toISOString(),
        }),
        {
          status: 200,
          headers: { "Content-Type": "application/json", ...getCorsHeaders() },
        }
      );
    }

    const sessions = parseAuthAndGetSessions(req, env);
    if (!sessions) {
      return new Response(
        JSON.stringify({ 
          error: "Unauthorized",
          message: "Invalid or missing Authorization header"
        }), 
        {
          status: 401,
          headers: { "Content-Type": "application/json", ...getCorsHeaders() },
        }
      );
    }

    if (url.pathname === "/v1/models" && req.method === "GET") {
      return handleModelsRequest();
    }

    if (url.pathname === "/v1/chat/completions" && req.method === "POST") {
      return await handleChatCompletion(req, sessions, env);
    }

    return new Response(JSON.stringify({ error: "Not found" }), {
      status: 404,
      headers: { "Content-Type": "application/json", ...getCorsHeaders() },
    });
  }
};

最近 ChatGPT 在印度推出了一年的白嫖服务,主包昨晚成功上车,5 分钟不到搞定,开通流程如下

前提:一个未开通会员的 ChatGPT 账号,一个 PayPal 账号(可以是国区),一个可用的印度节点,电脑网页操作

  1. ChatGPT 切换为印度节点,刷新网页会弹窗 “免费试用 Go” 的提示,点击试用
  2. 跳转后点击右下角的 “印度”,切换为 “法国”,这么做是因为会出现 PayPal 支付选项
  3. 切换后再点击 “升级至 Go”,跳转到支付页面,此时右侧有 “PayPal” 选项,选择 PayPal 并填写账单地址(汉字大陆地址也可以),注意检查页面是否为€0.00
  4. 点击 “订阅” 跳转 PayPal 登录页面,登录账号后直接订阅成功,同时收到开通成功邮件

ChatGPT Go 套餐一年 白嫖

早上好!这是为您整理的过去24小时内最重要的人工智能与科技动态,重点聚焦于新模型、论文及开源项目。

一、 模型发布与重要更新

  1. Drax Model (语音AI模型) 开源:初创公司aiOla发布了新型语音AI模型Drax,声称在嘈杂环境中比OpenAI的Whisper快32倍,词错误率更低。该模型已在GitHub开源。(来自zhiding.cn)
  2. 瞰海 (Kanhai) AI海洋大模型发布:我国发布首个“遥感—重构—预测”全链路的AI海洋大模型,能预测未来10天的海洋环境,对海洋科学研究和防灾减灾具有重要意义。(来自chinanews.com.cn)
  3. 华电智 (Huadian Zhi) 大模型发布:中国华电发布了电力能源领域的专用大模型,旨在推动全产业链的数智化转型。(来自hrbtv.net)
  4. 谷歌下一代模型 Gemini 3 传闻:有报道称谷歌正准备推出Gemini 3,主打代码生成和通用任务,其云平台Vertex AI上已出现相关模型名称,暗示可能在11月发布。(来自stcn.com)
  5. OpenAI ChatGPT 功能更新:ChatGPT的个性化设置和自定义指令现在将应用于所有对话(包括历史对话),以确保体验的一致性。(来自openai.com)

二、 最新AI论文速览 (来自arxiv.org)

  • 过去24小时,arXiv上涌现了大量关于AI智能体、大型语言模型推理和伦理的论文。
  • 智能体与多模态:一篇名为 DR. WELL 的论文 (arXiv:2511.04646) 提出了一个用于具身多智能体协作的动态推理和学习框架。
  • LLM与推理:VeriCoT (arXiv:2511.04662) 提出了一种通过逻辑一致性检查来验证神经符号思维链的方法,以增强模型推理的可靠性。
  • 伦理与对齐:一篇论文 (arXiv:2511.00379) 探讨了如何通过伦理推理,实现大型语言模型与多样化人类价值观的对齐。

三、 热门开源项目

  1. OpenEnv (by Meta & Hugging Face):Meta与Hugging Face联手推出开源项目OpenEnv,旨在为AI代理(Agent)的开发和部署提供一个标准化的运行环境,解决环境配置碎片化的问题。(来自huggingface.co)
  2. BettaFish (微舆):GitHub上的一个热门项目,是一个人人可用的多Agent舆情分析助手,旨在打破信息茧房,辅助决策。(来自github.com)
  3. strix:一个新兴的开源AI黑客工具,用于辅助应用程序开发。(来自github.com)

四、 科技行业重大公告

  1. 特斯拉股东批准马斯克万亿美元薪酬方案:特斯拉股东以超过75%的支持率,投票通过了CEO马斯克价值近1万亿美元的巨额薪酬方案。该方案与公司市值、汽车交付量、FSD订阅数等极具挑战性的目标挂钩,被视为股东对其将公司转型为AI和机器人巨头愿景的强力支持。(来自sina.cn)
  2. Meta宣布未来五年在美投入超6000亿美元:Meta宣布计划到2028年,将在美国投入超过6000亿美元,以支持其在人工智能、基础设施和员工队伍方面的扩展。(来自managertoday.com.tw)

「可萌」基于知识库与知识图谱的专域聊天助手
开源分享: 基于 LightRAG、LangGraph、MCP、RagFlow、微调LLMs宝可梦主题的专有领域智能聊天助手

[bsgit user="skygazer42"]pokemon-chat[/bsgit]

? 项目介绍

宝可梦(Pokémon)作为全球最具影响力的 IP 之一,拥有庞大的世界观设定与海量角色数据。在游戏、动画、卡牌、电影等多领域的多年积累下,其知识体系庞杂且高度结构化,非常适合应用于知识图谱建模与智能问答场景。

随着大语言模型(LLM)与知识增强技术的发展,将宝可梦宇宙构建为一个多模态、结构化、可交互的 AI 系统成为可能。本项目以 百度贴吧 与维基百科等数据源为基础,构建出覆盖宝可梦角色、属性、技能、地区、演化路径等元素的知识图谱,并结合大模型能力,打造一个专属宝可梦世界的智能对话助手 ——「可萌」。

在此基础上,我们融合了 LangGraph 推理流程编排、 GraphRAG 检索增强技术,以及知识图谱可视化探索能力,使用户不仅可以通过自然语言提问获得精确答案,还能以图谱形式直观探索宝可梦世界。同时支持基于地理位置的地图定位功能,将宝可梦世界与真实世界坐标一一映射,实现 宝可梦地点知识的空间可视化 ? 。

本项目致力于打造一个可迁移、可扩展、面向爱好者的专域智能助手模板系统,你可以轻松将其迁移至其他角色(如「苏轼」、「金融」、「 政务服务」等)中打造专域的智能助手,仅需更换知识源与图谱结构,即可实现高质量的语义问答与可视化知识探索体验。

?系统架构

通过本项目的实施,我们不仅完成了vue3+fastapi的一个完整项目,同时构建了一个基于宝可梦知识图谱的智能问答系统。积累了语义结构建模如bert+tf-idf+规则匹配机制、以及图谱融合与生成式问答的丰富实践经验。系统支持对宝可梦的进化关系、属性克制、技能特征、地理分布等内容进行精准问答,极大提升了用户在交互式探索中的体验感。

未来,我们将持续优化系统在多轮问答、复杂图谱推理、地图导航等场景下的表现,并扩展更多支持任务类型,如:基于图谱的推理问答、Pokédex 自动补全、角色对战策略建议等。同时,知识图谱将持续更新和扩展,以确保其时效性、完整性与一致性,助力宝可梦领域的智能系统构建与 AI 应用拓展。

以下是本项目的核心技术架构图:
核心技术架构图

?项目特色

  1. 基于爬取的数据微调了基于宝可梦的专域大模型——可萌
  2. 基于爬取数据构建了宝可梦知识图谱(维基百科)。
  3. 自动化标注训练NER数据,使用roberta+TF-IDF+规则匹配来命中图谱中的实体与属性。
  4. 使用whisper来实现ASR功能。
  5. 实现MCP服务,如获取宝可梦世界地点、宝可梦在对应真实世界的经纬度坐标显示在前端上。
  6. 抽取RAGflow中的deepdoc来强化知识库的解析和抽取能力。
  7. 使用Langraph框架基于自己的数据实现graphrag+ web searcher + 知识库 智能体。
  8. 封装agent 基类实现多智能体功能。
  9. 支持知识图谱搜索、网络搜索、知识库搜索、MCP搜索、语音搜索,可以同时集成也可以任选其一。

? 快速开始

前置要求:已安装 Docker / Docker Compose、Node.js ≥ 18、Python ≥ 3.11
  1. 把数据放到resources文件夹下
  2. 克隆仓库 & 配置环境变量

    git clone 
    cd Smart-Assistant
    cp src/.env.template src/.env   # 按需填写 API-KEY,可留空
    cp Smart-Assistant/config/settings_example.py  config/settings.py  # 填写 
  3. 安装依赖

    pip install -r requirements.txt
  4. 启动核心服务

    cd docker
    docker compose up -d           
  5. 导入图谱与地图数据

    cd scripts
    python import_graph.py          # 写入 Neo4j
    python import_pokemon_map.py    # 写入 MySQL
  6. 启动后端服务

    cd server
    python main.py                  # FastAPI + LangGraph
    cd ../src/mcp
    python mcp_server.py            # SSE 模式示例
  7. 启动前端

    cd web
    npm install
    npm run dev
    # 浏览器访问 http://localhost:3100/

? 参考项目

✨ 特性

  • ? 多 AI 模型支持 - 支持 OpenAI、Google Gemini、Anthropic Claude 等主流 AI 模型
  • ? 智能向导 - 通过向导式引导快速创建小说项目,AI 自动生成大纲、角色和世界观
  • ? 角色管理 - 创建和管理小说角色,包括人物关系、组织架构等
  • ? 章节编辑 - 支持章节的创建、编辑、重新生成和润色功能
  • ? 世界观设定 - 构建完整的故事世界观和背景设定
  • ? 多种登录方式 - 支持 LinuxDO OAuth 登录和本地账户登录
  • ? Docker 部署 - 一键部署,开箱即用
  • ? 数据持久化 - 基于 SQLite 的本地数据存储,支持多用户隔离
  • ? 现代化 UI - 基于 Ant Design 的美观界面,响应式设计

 一款基于 AI 的智能小说创作助手,帮助你轻松创作精彩故事

更新记录

25.11.3更新:
1.优化AI请求替换OpenAI SDK调用,使用httpx和自定义头请求,避免触发部分公益站的cloudflare
2.修复deepseek模型调用问题,舍弃思考过程AI响应内容,只获取结果内容
3.新增会话过期机制,更新后添加到.env中
4.支持用户在生成章节内容时设置字数

25.11.4更新:
注意 本次更新已合并到main主分支
1.支持用户项目数据导入导出
2.支持向量数据库,实现RAG的记忆提取存储功能,并引用到生成上下文中,提高生成文章内容质量

25.11.5更新:
1.新增AI生成组织功能,扩展优化组织字段(所在地 代表颜色 格言/口号)
2.适配移动端项目管理-剧情分析UI页面

25.11.6更新:
1.优化大纲续写和章节内容生成上下文构建方式 实现智能构建提示词(支持超长章节内容)
2.实现章节概要提取,并保存到向量数据库,为后续大纲生成和内容提供骨架
3.新增章节内容批量生成功能

25.11.7更新:
1.更新mcp插件功能,目前只支持remote调用

? 快速开始

前置要求

  • Docker 部署:Docker 和 Docker Compose
  • 本地开发:Python 3.11+ 和 Node.js 18+
  • 必需:至少一个 AI 服务的 API Key(OpenAI/Gemini/Anthropic)
    方式一:从源码构建 Docker 镜像

    # 1. 克隆项目
    git clone https://github.com/xiamuceer-j/MuMuAINovel.git
    cd MuMuAINovel
    
    # 2. 配置环境变量
    cp backend/.env.example .env
    # 编辑 .env 文件,填入你的 API Keys
    
    # 3. 启动服务(会自动构建镜像)
    docker-compose up -d
    
    # 4. 访问应用
    # 打开浏览器访问 http://localhost:8000

方式二:本地开发
后端设置

# 进入后端目录
cd backend

# 创建虚拟环境
python -m venv .venv

# 激活虚拟环境
# Windows:
.venv\Scripts\activate
# Linux/Mac:
source .venv/bin/activate

# 安装依赖
pip install -r requirements.txt

# 配置环境变量
cp .env.example .env
# 编辑 .env 文件,填入你的配置

# 启动后端服务
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload

前端设置

# 进入前端目录
cd frontend

# 安装依赖
npm install

# 开发模式(需要后端已启动)
npm run dev

# 或构建生产版本
npm run build

? 部署方式

Docker Compose 部署
使用 Docker Hub 镜像(推荐)
项目已发布到 Docker Hub,可直接拉取使用:

# 查看可用版本
docker pull mumujie/mumuainovel:latest

# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

# 重启服务
docker-compose restart

# 更新到最新版本
docker-compose pull
docker-compose up -d

Docker Compose 配置文件示例
使用 Docker Hub 镜像的完整配置:

services:
  ai-story:
    image: mumujie/mumuainovel:latest
    container_name: mumuainovel
    ports:
      - "8800:8000"  # 宿主机端口:容器端口
    volumes:
      # 持久化数据库和日志
      - ./data:/app/data
      - ./logs:/app/logs
      # 挂载环境变量文件
      - ./.env:/app/.env:ro
    environment:
      - APP_NAME=mumuainovel
      - APP_VERSION=1.0.0
      - APP_HOST=0.0.0.0
      - APP_PORT=8000
      - DEBUG=false
      # 其他环境变量会从 .env 文件自动加载
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health')"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    networks:
      - ai-story-network

networks:
  ai-story-network:
    driver: bridge

生产环境部署建议

1. 环境变量配置
必需配置:

  • OPENAI_API_KEY 或 GEMINI_API_KEY:至少配置一个 AI 服务
  • LOCAL_AUTH_PASSWORD:修改为强密码

推荐配置:

  • OPENAI_BASE_URL:如果使用中转 API,修改为中转服务地址
  • DEFAULT_AI_PROVIDER:根据你的 API Key 选择 openai、gemini 或 anthropic
  • DEFAULT_MODEL:选择合适的模型(如 gpt-4o-mini、gemini-2.0-flash-exp)
  • 数据持久化
    数据目录已通过 volume 挂载,数据不会丢失:
  • ./data:SQLite 数据库文件
  • ./logs:应用日志文件
  • 端口配置
    默认端口映射:8800:8000
  • 宿主机端口:8800(可自定义修改)
  • 容器内端口:8000(固定,不要修改)
    访问地址:http://your-server-ip:8800

配置后记得更新 .env 中的 LINUXDO_REDIRECT_URI 和 FRONTEND_URL。

5. 资源限制(可选)
在 docker-compose.yml 中添加资源限制:

services:
  ai-story:
    # ... 其他配置
    deploy:
      resources:
        limits:
          cpus: '2.0'
          memory: 2G
        reservations:
          cpus: '0.5'
          memory: 512M

端口说明

  • 默认端口:8800(宿主机)→ 8000(容器)
  • 可自定义:修改 docker-compose.yml 中的 ports 配置
  • 健康检查:容器内部使用 8000 端口进行健康检查

⚙️ 配置说明

环境变量
创建 .env 文件并配置以下变量:

# ===== AI 服务配置(必填)=====
# OpenAI 配置(支持官方API和中转API)
OPENAI_API_KEY=your_openai_key_here
OPENAI_BASE_URL=https://api.openai.com/v1

# Anthropic 配置
# ANTHROPIC_API_KEY=your_anthropic_key_here
# ANTHROPIC_BASE_URL=https://api.anthropic.com

# 中转API配置示例(使用OpenAI格式)
# New API 中转服务
# OPENAI_API_KEY=your_newapi_key_here
# OPENAI_BASE_URL=https://api.new-api.com/v1

# 默认 AI 提供商和模型
DEFAULT_AI_PROVIDER=openai
DEFAULT_MODEL=gpt-4o-mini
DEFAULT_TEMPERATURE=0.8
DEFAULT_MAX_TOKENS=32000

# ===== 应用配置 =====
APP_NAME=MuMuAINovel
APP_VERSION=1.0.0
APP_HOST=0.0.0.0
APP_PORT=8000
DEBUG=false

# ===== LinuxDO OAuth 配置(可选)=====
LINUXDO_CLIENT_ID=your_client_id_here
LINUXDO_CLIENT_SECRET=your_client_secret_here
LINUXDO_REDIRECT_URI=http://localhost:8000/api/auth/callback
FRONTEND_URL=http://localhost:8000

# ===== 本地账户登录配置 =====
LOCAL_AUTH_ENABLED=true
LOCAL_AUTH_USERNAME=admin
LOCAL_AUTH_PASSWORD=your_secure_password_here
LOCAL_AUTH_DISPLAY_NAME=管理员

# 会话配置
# 会话过期时间(分钟),默认120分钟(2小时)
SESSION_EXPIRE_MINUTES=120
# 会话刷新阈值(分钟),剩余时间少于此值时可刷新,默认30分钟
SESSION_REFRESH_THRESHOLD_MINUTES=30

# ===== CORS 配置(生产环境)=====
# CORS_ORIGINS=https://your-domain.com,https://www.your-domain.com

AI 模型配置
项目支持多个 AI 提供商,你可以根据需要配置:

提供商推荐模型用途
OpenAIgpt-4, gpt-3.5-turbo高质量文本生成
Anthropicclaude-3-opus, claude-3-sonnet长文本创作

使用中转API服务
如果你无法直接访问 OpenAI 官方 API,或者想使用更经济实惠的中转服务,本项目完全支持各种 OpenAI 兼容格式的中转 API:

配置方法
只需修改 .env 文件中的两个参数:

# 1. 填入中转服务提供的 API Key
OPENAI_API_KEY=your_api_key_from_proxy_service

# 2. 修改 Base URL 为中转服务的地址
OPENAI_BASE_URL=https://your-proxy-service.com/v1

常见中转服务配置示例
New API

OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.new-api.com/v1

API2D

OPENAI_API_KEY=fk-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.api2d.com/v1

OpenAI-SB

OPENAI_API_KEY=sb-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.openai-sb.com/v1

自建 One API / New API

OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://your-domain.com/v1

注意事项

  • ✅ 所有支持 OpenAI 接口格式的服务都可以使用
  • ✅ 确保中转服务的 Base URL 以 /v1 结尾
  • ✅ 根据中转服务支持的模型,修改 DEFAULT_MODEL 参数
  • ⚠️ 不同中转服务的模型名称可能不同,请参考服务商文档
  • ⚠️ 部分中转服务可能对请求频率或并发有限制

推荐的中转服务
如果你需要中转服务,以下是一些常见选择:

  1. New API - 开源的 API 分发系统,支持多种模型
  2. API2D - 国内稳定的 API 中转服务
  3. OpenAI-SB - 提供多种 AI 模型的中转
  4. 自建服务 - 使用 One API 或 New API 自行搭建
? 提示:使用中转服务时,请确保服务提供商的可靠性和数据安全性

? 项目结构

MuMuAINovel/
├── backend/ # 后端服务
│ ├── app/
│ │ ├── api/ # API 路由
│ │ │ ├── auth.py # 认证接口
│ │ │ ├── projects.py # 项目管理
│ │ │ ├── chapters.py # 章节管理
│ │ │ ├── characters.py # 角色管理
│ │ │ ├── wizard_stream.py # 向导流式生成
│ │ │ └── ...
│ │ ├── models/ # 数据模型
│ │ ├── schemas/ # Pydantic 模型
│ │ ├── services/ # 业务逻辑
│ │ │ ├── ai_service.py # AI 服务封装
│ │ │ └── oauth_service.py # OAuth 服务
│ │ ├── middleware/ # 中间件
│ │ ├── utils/ # 工具函数
│ │ ├── config.py # 配置管理
│ │ ├── database.py # 数据库连接
│ │ └── main.py # 应用入口
│ ├── data/ # 数据存储目录
│ ├── static/ # 前端静态文件(构建后)
│ ├── requirements.txt # Python 依赖
│ └── .env.example # 环境变量示例
├── frontend/ # 前端应用
│ ├── src/
│ │ ├── pages/ # 页面组件
│ │ │ ├── ProjectList.tsx # 项目列表
│ │ │ ├── ProjectWizardNew.tsx # 创建向导
│ │ │ ├── Chapters.tsx # 章节管理
│ │ │ ├── Characters.tsx # 角色管理
│ │ │ └── ...
│ │ ├── components/ # 通用组件
│ │ ├── services/ # API 服务
│ │ ├── store/ # 状态管理(Zustand)
│ │ ├── types/ # TypeScript 类型
│ │ └── utils/ # 工具函数
│ ├── package.json
│ └── vite.config.ts
├── docker-compose.yml # Docker Compose 配置
├── Dockerfile # Docker 镜像构建
└── README.md # 项目说明文档

1万亿免费Gemini,GPT API来了
事情的起因是Manus做了这个活动,但是这个消耗的这么慢,所以我们来帮她加一下速吧,我发现他们这个原理是在环境里定义了API,所以我们不能直接获取到, 所以我弄了一个2API
地址是:https://3000-ihdbd6r5dut6rueqparvn-a428ee41.manus-asia.computer
或者:https://manuschat-va6rmpup.manus.space
https://3000-ihdbd6r5dut6rueqparvn-a428ee41.manus-asia.computer/v1/models
API:manus-free-api-key-no-auth-required
我测试下来能确定的是应该有gemini 2.5 flesh可以用,GPT 4.1 Mini应该也有,虽然请求的列表有这些:

  • Gemini 2.5 pro
  • GPT-5-2025-08-07
  • GPT-5-pro-2025-10-06
  • GPT-4.1-2025-04-14
  • o3-deep-research-2025-06-26
  • o4-mini-deep-research-2025-06-26
  • computer-use-preview-2025-03-11
  • Claude 4.5 sonnet

但是实际上应该只有刚刚两个,建议大家可以试用一下

项目简介

开发了一个 Apache Answer 的微信 OAuth 登录插件,让你的 Answer 社区可以支持微信扫码登录。

GitHub: https://github.com/starvpn/answer-user-wxcom

✨ 主要特性

  • ? 标准 OAuth 2.0 协议
  • ? 中英文双语支持
  • ? 微信官方 Logo 样式
  • ⚙️ 配置简单(只需 AppID + AppSecret )
  • ? 内置 CSRF 防护和安全验证
  • ? 支持扫码登录和调用 PC 微信能力

? 一条命令安装

answer build \
--with github.com/starvpn/answer-user-wxcom \
--output ./new_answer

也支持 Docker 部署,可以和其他插件一起安装。

为什么做这个?

最近在用 Answer 搭建社区,发现国内用户更习惯微信登录。虽然 Answer 有 GitHub/Google 等登录方式,但对国内用户不太友好。于是按照 Answer 的插件机制开发了这个微信登录插件。

技术细节

  • 基于 Answer 1.3.0+ 的 Connector 插件机制
  • 遵循微信开放平台的网站应用接入规范
  • 实现了完整的 OAuth 2.0 授权码流程
  • 使用 State 参数防止 CSRF 攻击
  • 支持 i18n 国际化

适用场景

  • 国内的 Answer 问答社区
  • 需要微信登录的技术论坛
  • 企业内部知识库(配合企业微信)

导言:告别流量焦虑,重塑你的SEO世界观

你是否也曾精心撰写了一篇自认为价值连城的文章,发布后却发现它静静地躺在博客的角落,无人问津?你是否也曾看着后台那条平直得令人心碎的流量曲线,陷入深深的流量焦虑和自我怀疑?如果你正面临流量停滞、优化无门的困境,那么这篇文章就是为你准备的。我们将一起拨开搜索引擎优化(SEO)的重重迷雾,让你告别焦虑,重拾信心。 在开始之前,我们必须先破除几个常见的SEO误区。SEO不是通过堆砌关键词就能取胜的数字游戏,更不是寻找搜索引擎漏洞的短期投机。它不是什么神秘的黑魔法,不需要你成为顶级的黑客或程序员。真正的SEO,是一项关于价值、体验和信任的长期投资。它的核心是理解并满足用户的真实需求,通过创造高质量的内容和提供卓越的网站体验,来赢得搜索引擎和读者的双重青睐。 这本指南将为你提供一套清晰、可行的实战框架,从关键词研究到内容创作,从站内优化到外链建设,再到数据分析与迭代。无论你是对SEO一知半解的新手,还是自己摸索过但效果不佳的博主,都能在这里找到答案。请相信,你完全有能力亲手优化自己的博客,让每一篇用心创作的内容,都能被更多需要它的人看到。

关键词挖掘秘籍:找到别人忽略的流量密码

所有成功的SEO策略都始于对关键词的深刻理解。关键词研究并非简单地寻找搜索量高的词语,其真正的核心是洞察这些词语背后的用户搜索意图。当用户在搜索框输入一个词时,他们究竟想解决什么问题?是想学习知识,是想购买产品,还是想寻找某个特定的网站?理解了意图,你的内容创作就有了明确的方向。 一个完整的关键词挖掘流程,通常是从一个宽泛的核心词开始,逐步拓展到具体的长尾关键词。核心词代表了你的博客主题,比如“个人理财”。接着,你可以拓展出相关的次级主题,如“基金投资”、“信用卡技巧”、“省钱方法”。最后,在这些次级主题下,挖掘出用户会实际搜索的具体问题,即长尾关键词,例如“新手如何选择第一支基金”、“大学生办理哪张信用卡比较好”。这个过程就像从树干到树枝再到树叶,构建起一个完整的内容生态系统。

关键词挖掘的核心工具箱

工欲善其事,必先利其器。高效的关键词挖掘离不开专业的工具。一个明智的策略是组合使用免费与付费工具,以达到成本和效益的最佳平衡。 免费工具是入门的绝佳选择。Google Keyword Planner是Google官方提供的工具,虽然数据呈现方式对非广告主不够友好,但其提供的关键词建议和搜索量估算仍然具有最高的权威性。Ubersuggest则以其友好的用户界面和相对丰富的功能受到许多初学者的喜爱,你可以用它快速获取关键词建议、内容创意和初步的竞争分析数据。 当你的博客进入成长期,需要更深度的数据洞察时,付费工具的价值便凸显出来。Ahrefs是行业内公认的强大工具,它不仅能提供精准的关键词搜索量和“关键词难度”评分,还能深入分析竞争对手的页面、外链和关键词策略。通过Ahrefs,你可以清晰地看到一个关键词的商业价值、点击率潜力以及排到首页所需的努力程度,这对于制定高效的SEO策略至关重要。一个典型的组合工作流是:使用Ubersuggest进行初步的头脑风暴,用Google Keyword Planner验证和拓展词库,最后用Ahrefs对筛选出的核心关键词进行深度分析和可行性判断。

针对垂直领域博客的深度关键词布局策略

对于专注于某个小众领域的垂直博客而言,关键词策略更应注重精准度和专业性,而非盲目追求高搜索量。深度布局的关键在于区分不同类型的关键词,并围绕它们构建内容体系。 首先,你需要区分信息类关键词和商业类关键词。信息类关键词通常以“如何”、“什么”、“为什么”等开头,对应着用户学习知识的需求,例如“如何清洁空气炸锅”。商业类关键词则包含“最佳”、“评测”、“推荐”等词语,对应着用户准备购买或决策的需求,例如“2024年最佳空气炸锅推荐”。一个健康的博客应该合理搭配这两类内容,前者用来吸引广泛的潜在读者、建立信任,后者则可以实现商业变现。 更进一步的策略是构建主题集群(Topic Clusters)。这个模型由一个核心的“支柱页面”和多个相关的“集群页面”组成。支柱页面是一篇关于某个广泛主题的综合性长文,例如“空气炸锅完全使用指南”。集群页面则是针对该主题下更具体子话题的文章,例如“空气炸锅烤鸡翅食谱”、“空气炸锅的优缺点分析”等。所有集群页面都链接到支柱页面,支柱页面也选择性地链接回重要的集群页面。这种网状结构能清晰地向搜索引擎展示你在此领域的专业深度和权威性,从而整体提升该主题下所有相关关键词的排名。

竞争分析与机会判断

在红海中厮杀,不如在蓝海中远航。SEO竞争分析的目的,不是为了模仿你的强大对手,而是为了发现他们忽略的机会。通过分析竞争对手的关键词策略,你可以找到那些排名难度相对较低,但对你的读者群体非常有价值的“蓝海”关键词。 使用Ahrefs等工具,输入竞争对手的域名,查看他们流量最高的页面。分析这些页面都在为什么样的关键词排名。在这个过程中,要特别留意那些排名靠前但内容质量并不高的页面。比如,一篇排名很好的文章可能内容已经过时,或者一篇论坛的问答帖排在了很高的位置。这些都是你的机会信号。你可以创作一篇内容更全面、信息更新、结构更清晰的文章来挑战这个位置。 此外,要善于发现搜索结果页面(SERP)中的机会。当搜索某个关键词时,如果首页出现了很多来自知乎、豆瓣、Reddit等用户生成内容网站的结果,这通常意味着专门针对该话题的高质量博客文章还很缺乏。这就是典型的“蓝海”关键词,只要你用心创作一篇权威指南,就很有可能后来居上,实现差异化竞争,轻松获取精准流量。

站内优化核心:打造搜索引擎和读者都喜爱的网站

如果说关键词研究是确定方向,那么站内优化就是为你的博客建造一栋结构坚固、路标清晰的大厦。这是所有排名提升的基础。一个对搜索引擎友好的网站,能让爬虫高效地抓取、理解并索引你的每一页内容;一个对读者友好的网站,则能提供流畅的阅读体验,让他们愿意停留、互动和分享。这两者相辅相成,缺一不可。 站内优化的范畴很广,但其核心要素始终围绕着内容结构、技术性能和用户体验。从你写下第一个字开始,到访客在页面上完成阅读,每一个环节都蕴含着优化的机会。接下来的几个部分,我们将聚焦于最关键、投入产出比最高的几个方面,让你能够系统性地提升网站的内在品质。

撰写符合SEO规范的文章结构

一篇优秀的博客文章,不仅要内容为王,其结构也必须符合SEO的基本规范。这能帮助搜索引擎更好地理解你的内容层次,同时也能提升读者的阅读体验。你可以将以下几点作为一个清晰的文章写作模板。 首先是标题(H1标签)。每篇文章应该有且仅有一个H1标题,它应当包含你的核心关键词,并且足够吸引人,促使用户点击。接下来是各级副标题(H2, H3, H4等)。使用副标题来组织文章的逻辑结构,将长文分解成易于消化的小节。在副标题中自然地融入相关的长尾关键词或同义词,能进一步强化文章的主题相关性。 元描述(Meta Description)虽然不直接影响排名,但它会显示在搜索结果页面上,是影响点击率的关键因素。把它当成你文章的广告语来写,用150个字符左右的长度,清晰地概括文章内容,并激发用户的好奇心。URL结构则应保持简短、清晰并包含核心关键词,例如 yourblog.com/how-to-write-seo-article,而不是 yourblog.com/p=123。 最后,不要忘记内部链接。在文章中自然地链接到你博客里其他相关的文章,这不仅能为读者提供更多价值,还能帮助搜索引擎发现你网站的更多页面,并在你的网站内部传递权重,提升整体权威性。

提升网站速度:非技术人员也能用的优化技巧

网站加载速度是影响用户体验和搜索引擎排名的关键因素。没有人愿意等待一个加载缓慢的页面。幸运的是,即使你不是技术专家,也有许多简单有效的方法可以显著提升网站速度。 首先,选择一个合适的主机至关重要。廉价的共享主机虽然便宜,但在高峰时段性能往往不佳。投资一个 качественный的托管WordPress主机或入门级的VPS,是提升速度最立竿见影的方法之一。 其次,善用缓存插件。对于WordPress等博客程序,安装如W3 Total Cache或WP Rocket之类的缓存插件是必不可少的。缓存的原理很简单:它会为你的页面创建一个静态的HTML副本,当用户访问时,直接提供这个副本,而无需每次都动态生成页面,从而大大加快加载速度。 另外,压缩代码也是一个有效的技巧。你的网站主题和插件包含了大量的CSS和JavaScript文件,通过压缩(Minification)可以移除这些文件中的空格、注释等不必要字符,减小文件体积。很多缓存插件都自带了这个功能,你只需在设置中开启即可。最后,推荐使用Google PageSpeed Insights或GTmetrix等免费工具定期为你的网站测速。它们不仅会给你打分,还会提供具体的优化建议,告诉你哪些地方拖慢了你的网站。

图片SEO优化:让图片为你带来额外流量

在内容中插入图片可以使文章更具可读性和吸引力,但如果优化不当,图片也可能成为拖慢网站速度的元凶。做好图片SEO,不仅能提升页面加载速度,还能让你的图片出现在Google图片搜索中,为你带来意想不到的额外流量。 图片优化的第一步是压缩。在上传图片之前,务必使用TinyPNG、Squoosh等在线工具或桌面软件对其进行压缩,可以在基本不损失肉眼可见质量的前提下,将图片文件大小减少50%以上。对于WordPress用户,也可以安装Smush或ShortPixel等插件来自动完成这个过程。 选择正确的文件格式也很重要。通常,照片使用JPEG格式,而需要透明背景的图标或插图则使用PNG格式。新兴的WebP格式提供了更好的压缩效果和质量,正被越来越多的浏览器支持。 此外,为图片编写描述性的文件名和ALT文本至关重要。将文件名从 IMG_001.jpg 改为 seo-friendly-article-structure.jpg。ALT文本(替换文本)是当图片无法加载时显示的文字,也是搜索引擎理解图片内容的关键。它应该用简洁的语言准确描述图片内容,例如,“一张展示了文章SEO优化结构的思维导图”。最后,确保你的SEO插件生成了图片站点地图(Image Sitemap)并提交给搜索引擎,这能帮助Google更全面地发现和索引你网站上的所有图片。

建立权威:安全有效获取高质量外链的方法

在SEO的世界里,外链(Backlinks)相当于来自其他网站的“推荐信”。当一个高质量网站链接到你的博客时,搜索引擎会认为你的内容具有权威性和可信度,从而提升你的排名。然而,关于外链的误解非常多。我们必须澄清一个核心原则:外链的质量远胜于数量。一条来自行业权威网站的自然链接,其价值可能超过一百条来自低质量论坛的垃圾链接。 判断外链质量的标准主要有三点:相关性、权威性和自然度。最好的链接来自与你博客主题高度相关的网站;来自知名度高、历史悠久的网站的链接权重更高;链接应该自然地出现在文章内容中,而不是堆砌在页脚或评论区。同时,必须坚决避开那些可能导致网站被惩罚的“黑帽”手法,如购买链接、使用链接农场或参与私密博客网络(PBN)。这些短期行为一旦被发现,将对你的网站造成毁灭性打击。

内容驱动的自然外链增长

获取高质量外链最安全、最有效,也是最值得追求的方法,是通过创作卓越的内容来自然吸引别人链接你。这种策略的核心是创造出所谓的“链接诱饵”(Linkable Assets),即那些本身就极具分享和引用价值的内容。当你的内容成为某个话题下的最佳资源时,其他博主、记者和行业人士在撰写相关文章时,会很自然地引用并链接到你的页面。 哪些类型的内容容易成为“链接诱饵”呢?首先是像本文这样的深度指南,它全面、系统地解决了一个复杂的问题,是新手入门和老手参考的绝佳资料。其次是原创的研究报告或数据分析,独特的数据和见解是媒体和研究者最喜欢引用的来源。如果你具备一定的技术能力,开发一个简单实用的小工具或在线计算器,也能成为一个强大的链接磁铁。最后,设计精美、信息量大的信息图(Infographics)也因其直观易懂的特性,极易在社交媒体上传播并被其他网站嵌入引用。专注于创造这类能为他人提供巨大价值的内容,外链的增长将是水到渠成的事情。

主动出击:可行的外链建设实战技巧

除了等待别人自然链接,我们也可以采取一些主动的策略来建设外链,前提是始终保持价值交换和互惠互利的原则。 访客博客(Guest Posting)是一种经典且有效的方法。你可以寻找你所在领域内接受客座文章的博客,向他们投稿一篇高质量的原创文章。作为回报,你通常可以在文章的作者简介部分,甚至在正文中,放置一个指向你自己博客的链接。关键在于,你的投稿必须对对方的读者有真正的价值,而不是一篇伪装的广告。 修复失效链接(Broken Link Building)是一种更具技巧性的方法。你可以使用Ahrefs等工具扫描行业内权威网站,寻找他们页面上的失效链接(即链接指向一个404错误页面)。找到后,通过邮件联系网站管理员,友好地提醒他们这个错误,并同时推荐你自己网站上的一篇相关内容作为替代。因为你帮助对方改善了网站,他们通常会很乐意接受你的建议。 此外,积极参与行业社群互动也是一个不错的选择。在相关的论坛、知乎、Reddit社区或专业人士的博客评论区,真诚地回答问题,提供有价值的见解。当你的回答确实需要引用更多资料时,可以适当地附上自己博客的相关文章链接。记住,目的是提供帮助,而不是推广,只有这样建立的关系和链接才是稳固和有价值的。

数据分析与迭代:让排名持续增长的秘密

SEO并非一劳永逸的工作,而是一个持续“行动-测量-优化”的动态循环。如果你不跟踪数据,就如同在黑暗中航行,无法判断方向是否正确,也无法知道距离目标还有多远。数据分析能帮助我们发现问题、验证优化效果,并将宝贵的洞察转化为下一步的具体行动计划。 在众多的数据工具中,Google Search Console(GSC)和Google Analytics(GA)是每个博主都必须掌握的两个免费神器。GSC主要用于监控你的博客在Google搜索中的表现,它会告诉你用户通过哪些关键词找到了你,你的页面获得了多少展示和点击,以及网站是否存在技术性错误。GA则侧重于分析用户在你网站上的行为,例如他们从哪里来,访问了哪些页面,停留了多长时间等。将这两个工具结合起来,你就能获得一幅关于SEO效果的全景图。

解决排名停滞:当你的关键词总在第二页时

“为什么我的文章排名总是卡在第二页上不去?”这是许多博主都会遇到的瓶颈。排名在11到20名之间,意味着Google已经认可了你页面的相关性,但认为它在权威性、内容质量或用户体验上,还不足以排进首页。要突破这个瓶颈,需要一套系统的诊断和优化方案。 首先,重新审视你的内容。这篇文章的信息是否已经过时?竞争对手的首页文章是否比你的内容更深入、更全面?尝试对文章进行一次重大更新,补充新的信息、案例或数据,增加内容的深度和新鲜度。 其次,分析用户体验信号。登录Google Search Console,查看这个页面的点击率(CTR)。如果展示量很高但点击率很低,说明你的标题和元描述不够吸引人,需要重写。再到Google Analytics查看该页面的跳出率和平均停留时长。如果用户很快就离开,可能意味着你的内容没有满足他们的搜索意图,或者页面排版、广告过多影响了阅读体验。 接着,强化内部链接。从你博客中其他权重较高的相关页面,增加几个指向这篇“停滞”文章的内部链接,这可以帮助传递更多权重给它。最后,尝试为这个页面主动建设一两个高质量的相关外链,一个来自权威网站的推荐往往是突破瓶颈的关键一推。

解读核心Web指标(Core Web Vitals)

核心Web指标(Core Web Vitals)是Google用来衡量网站用户体验的一组具体指标,它已经成为影响排名的重要因素之一。虽然听起来技术性很强,但理解其核心概念对每个博主都很有帮助。它主要包含三个指标: LCP (Largest Contentful Paint),即最大内容绘制时间。它衡量的是页面主要内容(通常是最大的图片或文本块)加载完成所需的时间。简单来说,它代表了用户感知的加载速度。 FID (First Input Delay),即首次输入延迟。它衡量的是从用户首次与页面交互(如点击链接、按钮)到浏览器实际能够响应该交互的时间。它代表了网站的交互性。 CLS (Cumulative Layout Shift),即累积布局偏移。它衡量的是页面在加载过程中视觉元素的稳定性。你一定遇到过这样的情况:正要点击一个按钮,突然一个广告加载出来,把整个页面向下推,导致你点错了地方。这就是CLS差的表现。 你可以使用Google PageSpeed Insights工具来检测你网站的核心Web指标得分。报告会清晰地告诉你哪些指标不合格,并提供具体的优化建议。通常,优化这些指标的方法与我们之前提到的网站提速技巧高度重合,例如使用更好的主机、优化图片、启用缓存以及选择一个代码质量高的主题。

结语:SEO是一场没有终点的马拉松

恭喜你,坚持读到了最后。我们一起走过了从关键词挖掘、站内优化、外链建设到数据分析的完整SEO旅程。现在,你脑海中应该已经有了一幅清晰的优化蓝图,而不再是面对SEO时的一片茫然。 让我们再次回顾全文的核心要点:SEO的成功建立在理解用户意图的关键词策略之上;通过规范的文章结构、极速的网站加载和优化的图片来打造卓越的站内体验;通过创作有价值的内容来自然吸引或主动建设高质量的外链以建立权威;最后,利用数据分析来驱动持续的迭代和改进。 SEO不是一个可以一蹴而就的项目,它更像一场没有终点的马拉松。它考验的不是短期的爆发力,而是长期的耐心和坚持。搜索引擎的算法在不断进化,用户的需求也在不断变化,这意味着我们的优化工作也需要与时俱进。不要害怕犯错,每一次调整和测试都是宝贵的学习机会。现在,是时候将所学的知识付诸实践了。为你下一篇文章认真地做一次关键词研究,检查一下你的网站速度,或者尝试为你最好的内容去建设第一个外链。开始你的优化之旅吧,时间的复利终将为你带来持续而稳定的流量回报。

Alpha Arena 加密货币交易
更新视频教程 https://www.bilibili.com/video/BV1VH1aBtER1

前两天我的社交网站全被一个叫做 Alpha Arena by Nof1 的 AI 量化交易系统刷屏,这是 Nof1 公司利用多种大语言构建的一个在加密货币市场中进行交易的竞争平台,用来测评未经训练的 AI 模型在金融市场中的真实表现。

Alpha Arena 是由 AI 研究实验室 nof1.ai 在 2025 年 10 月 17 日正式启动的项目。这是一场大胆且创新的实验,旨在测量 AI 在真实金融市场中的实际表现能力。项目的核心理念非常简洁:给予 6 个最先进的 AI 大语言模型真实资金,让它们完全自主交易,并实时公开竞争结果。

Alpha Arena 是全球首个以 AI 模型为对象,在真实市场中进行投资竞赛的基准测试。Alpha Arena 给每个 AI 模型分配相同的初始资金,在真实市场数据中进行投资交易,所有的模型接受相同的输入和数据,目前是最大化风险调整后的收益。

目前 Arena 集成了 6 家目前顶级的 AI 模型,包括了 Claude,DeepSeek,Gemini,GPT-5,Grok,Qwen。

这是截止到 2025 年 11 月 2 日的走势表现。
手把手教你部署 AI 自动化交易 nofx

Alpha Arena 的实验条件:统一每一个 AI 模型都可以获得 1 万美金的真实资金。会使用分散的去中心化永续合约交易平台 HyperLiquid,主要的加密资产包括了比特币(BTC)、以太坊(ETH)、Solana(SOL)、瑞波币(XRP)、狗狗币(DOGE)、币安币(BNB)等。

AI 允许使用适量的杠杆。所有的 AI 模型都会接受相同的提示词、相同的市场数据和统一的风险管理规则,完全由 AI 自主进行决策和执行交易。

所有交易完全由 AI 独立执行。所有的交易记录、持仓情况、盈亏数据以及 AI 独自的内心思考过程都会公开在区块链上,保证完整的透明。

公开在相同的市场条件下,展示了 AI 模型在交易策略、风险管理和决策质量上的真实差异。

RockFlow RockAlpha

受到 Alpha Arena 的启发,RockFlow 公司也发布了自己研发的 RockAlpha 针对真实的美股证券市场,交易的标的包括 NVDA,TSLA,GOOGL,MSFT,COIN,BABA,SPY,GLD,IBIT,UVIX。

RockAlpha 的灵感来自 nof1.ai 在加密货币交易领域的成功实验。RockFlow 团队决定将这一概念扩展到美国股票市场,这是一个更深层、更受监管、也更加复杂的领域。

手把手教你部署 AI 自动化交易 nofx1

RockAlpha 中,六个顶级的 AI 模型初始资金是每个账户十万美元,交易的品种为十支每股关键的股票。可以适度地使用杠杆交易,成本和利息与真实的投资者相同。

所有的 AI 决策都是由 AI 完全自主进行,没有人类的干预或事后编辑。每个模型都会收到相同的提示系统,逐行报告所有的操作情况。

每五分钟,AI 模型都会收到新的数据,包括实时的价格、投资组合更新、新闻标题,甚至是其他 AI 的交易和评论。

Nofx

受到 Nof1.ai 的启发,在 GitHub 上 Tinkle 社区迅速复刻并开源了一个叫做 Nofx 的通用 AI 交易项目。基于 DeepSeek,Qwen 大大语言模型,打造了一款通用架构 AI 交易员,完成从决策,到交易,复盘的闭环。

Nofx 是一个通用的交易 AI Agent,将 nof1.ai 加密货币交易理念扩展到了多个金融市场,包括股票、期权、期货、外汇等,致力于打造一个跨市场、跨交易所的 AI 交易生态。

和 Nof1.ai 一样,AI 会自主完成整个交易闭环。
特点:

  • 自动分析市场数据做出交易决策
  • 从历史交易中学习优化策略
  • 提供专业的监控界面,实时显示账户权益曲线,持仓详情,AI 推理过程
  • 支持 Binance,Hyperliquid,Aster DEX 三大交易所

    • Binance 中心化交易所,全球最大交易所,流动性强。
    • HyperLiquid,去中心化永续合约交易所 ,高性能 DEX,低延迟
    • Aster DEX,去中心化交易所,链上交易,完全去中心化
  • 支持 Docker 一键部署或手动安装

Nofx 提供完整的交易操作能力

  • 多头空投交易,支持双向交易。
  • 支持杠杆交易。
  • 止盈止损自动化
  • 风险管理
  • 低延迟路由

提前准备

  • 交易所 API,可以使用币安或者 HyperLiquid
  • DeepSeek API
  • 安装好 Docker 环境
  • 本地安装环境,或者 VPS

获取必要的 API 密钥
Nofx 需要配置两种类型的 API 密钥:AI 模型密钥 和 交易所密钥。

AI 模型密钥 ​
DeepSeek(推荐):

  • 成本约为 GPT-4 的 1/10
  • 响应速度快
  • 决策质量优秀

获取方式:访问 https://platform.deepseek.com ,注册账户,充值余额,生成 sk- 前缀的 API 密钥
Qwen(阿里巴巴):

  • 通过阿里云 DashScope 服务
  • 需要阿里云账户
  • 需要激活服务

交易所 API 密钥
Nofx 支持三大交易所

交易所类型API 获取方式
Binance中心化交易所访问 Binance 账户设置,创建 API 密钥,必须启用 Futures 权限,建议添加 IP 白名单
Hyperliquid去中心化交易所使用 MetaMask 私钥(移除 0x 前缀),无需传统 API 密钥
Aster DEXBinance 兼容 DEX连接钱包到 Aster API Wallet 页面,创建 API 钱包,保存 User Address、Signer Address 和 API Wallet Private Key

如果没有 Binance 账号,点击注册

  • 使用邮箱或手机号完成注册
  • 完成 KYC 认证
  • 开启 Futures 交易权限

    • 主页 → Derivatives → USD-M Futures
    • Click “Open Now” 启用
  • 创建 API Key

    • Account → API Management
    • 创建 API Key,并勾选 Futures 权限
    • 保存 API Key 和 Secret Key
    • 将 IP 地址添加到白名单

获取项目源代码

git clone https://github.com/NoFxAiOS/nofx.git
cd nofx

准备配置文件

cp config.json.example config.json

安装流程
推荐使用 Docker 安装,自动处理所有的依赖。

我们首先要编辑配置文件,可以使用自己习惯的编辑器打开 config.json 文件,填写必要的配置。

交易员配置

[
  {
    "id": "qwen_trader",
    "name": "Qwen 交易员",
    "ai_model": "qwen",
    "qwen_key": "your_qwen_api_key",
    "initial_balance": 1000,
    "scan_interval_minutes": 3,
    "exchange": "binance",
    "binance_api_key": "your_binance_api_key",
    "binance_secret_key": "your_binance_secret_key",
    "btc_eth_leverage": 5,
    "altcoin_leverage": 5,
    "use_default_coins": true
  }
]

参数说明

字段说明示例值
id交易员唯一标识qwen_trader 或 deepseek_trader
name交易员显示名称Qwen 交易员
ai_modelAI 模型选择qwen 或 deepseek
initial_balance初始账户余额(USDT)1000
scan_interval_minutes决策周期(分钟)3 到 5 推荐
exchange交易所选择binance、hyperliquid 或 aster
btc_eth_leverageBTC/ETH 最大杠杆5(Binance 子账户限制)
altcoin_leverage其他币种最大杠杆5 到 20
use_default_coins使用默认币池true 或 false

这里以 Binance 为例

{
  "exchange": "binance",
  "binance_api_key": "your_key",
  "binance_secret_key": "your_secret"
}

启动

# 给启动脚本执行权限
chmod +x start.sh

# 推荐方式:使用启动脚本
./start.sh start --build

# 或者使用 Docker Compose
docker compose up -d --build

Docker 启动之后,可以在浏览器访问 http://localhost:3000

可以看到账户的实时交易、多 AI 的对比排行、AI 的决策过程、仓位和损益表。

其他有用的命令

# 查看运行日志
./start.sh logs

# 检查服务状态
./start.sh status

# 停止服务
./start.sh stop

Nofx 工作流程
Nofx 交易周期由 7 个步骤组成,默认每三分钟执行一次。

步骤过程说明
1历史表现分析AI 分析过去 20 个周期的表现,获取反馈
2账户状态获取获取实时账户余额、已用杠杆、未实现 P&L
3持仓审查检查现有持仓与市场数据
4新机会评估筛选币池中最有前景的交易机会
5AI 综合决策AI 进行链式思维(CoT)推理,输出交易决策
6交易执行优先平仓,再开仓
7日志归档保存完整决策和执行记录

Nofx 的核心创新是 AI 的自学习机制,AI 会分析最近 20 个周期的表现,进行动态的策略调整。

日志存储在 decision_logs/ 目录中,每个 JSON 文件包含:

  • cot_trace:AI 的完整思维链(Chain of Thought)
  • account_state:账户快照
  • positions:当前持仓
  • decisions:交易决策详情
  • execution_log:执行结果

常见错误

执行决策失败 (BNBUSDT open_short): 开空仓失败: < APIError > code=-4061, msg=Order’s position side does not match user’s setting.

仓位模式需要选择正确。

仓位模式需要选择正确。

执行决策失败 (BTCUSDT open_short): 开空仓失败: < APIError > code=-2019, msg=Margin is insufficient.

这种错误一般就是保证金不够,因为我仓位只有 100 美元,才出现的问题。

实测

从昨天晚上 11 点左右开始执行,到今天早上 8 点,净亏损 3 刀,并消耗月 2 元人民币 DeepSeek API 调用。
手把手教你部署 AI 自动化交易 nofx1

文章转载自:https://linux.do/t/topic/1118884

一键提取 TikTok 字幕:免费免注册,支持 .srt/.txt
一键提取 TikTok 字幕:免费免注册,支持 .srt/.txt
立即使用:tiktoktranscript.org

最近把一个小想法做成了在线工具:粘贴 TikTok 视频链接,一键提取字幕;支持复制或下载 .srt/.txt ,多语言也都能拿。名字很直白:TikTok Transcript Generator 。

  • 为什么做这个

    • 刷到好内容想精读做笔记,抄字幕太折磨
    • 做剪辑/二创需要干净的字幕文件
    • 教培/自媒体同学经常问“有没快捷拿字幕的办法”
  • 怎么用(超级简单)

    • 打开页面 → 粘贴 TikTok 链接 → 点“Extract”
    • 有字幕就直接出结果;可复制或下载 .srt/.txt
  • 核心特点

    • 完全免费、无需注册
    • 多语言字幕提取(视频里有啥语言就拿啥)
    • 即时预览与复制
    • 一键下载 .srt / .txt
  • 已知限制

    • 视频本身没有字幕 → 不能“凭空生成”
    • 私密/受限视频可能拿不到
    • 偶发失败(网络/上游波动),重试一般能好
  • 想继续做的

    • 批量提取(一次贴一组链接)
    • 可能考虑 chrome 插件方式
    • API 开放(方便自动化)

EZPPT 是一个基于 FastAPI + Web 前端的本地化演示文稿生成平台,适用于快速搭建主题演讲、技术分享、项目汇报等内容的初稿。

? 功能与亮点

  • 大模型生成

    • 大纲生成:根据主题、受众、风格与参考资料,生成章节与要点。
    • 布局规划:为核心内容页生成“布局指令”,保持页面多样性与统一性。
    • 页面生成:调用大模型生成HTML代码。
  • 图片能力(可选) 通过 SearXNG 聚合搜索图片。
  • 自定义参考资料:支持自定义参考资料,用于生成内容,减少模型自身知识的幻觉。
  • 在线预览编辑 可在浏览器中实时预览与编辑。
  • 导出 PDF 或 PPTX 导出的 PPTX 文件可保持 HTML 预览 90% 的效果,并且内容可二次编辑。

?️ 环境要求

  • Python 3
  • 可访问的 LLM API(支持 OpenAI/Gemini 规范接口)
  • 可用的 SearXNG 实例(公共或自建,用于图片搜索,可选)

? 平台支持

  • Linux (x64 / ARM64)
  • Windows (x64)
  • macOS(未经测试,理论可行)

✨ 快速开始(本机运行)

1. 准备配置
复制根目录下的 .env.template 文件为 .env,并根据您的环境填写配置:

  • OUTLINE_*:大纲生成模型的配置(API_TYPE / API_KEY / API_URL / MODEL)
  • PPT_:页面生成模型的配置(若留空,则使用 OUTLINE_ 的配置)
  • PIC_*:图片理解模型的配置(需支持多模态,启用图片搜索时需要,可选)
  • SEARXNG_URL:SearXNG 搜索实例地址(用于图片搜索,可选)
  • APRYSE_LICENSE_KEY:Apryse License Key(用于导出 PPTX,已内置)
cp .env.template .env

2. 安装依赖(任选其一)
- 方式一:使用 uv (推荐)

# 创建并激活虚拟环境
uv venv

# 同步安装依赖
uv sync

# 首次运行时,准备浏览器与 Apryse 资源
uv run setup.py

- 方式二:使用 pip

# 创建并激活虚拟环境
python -m venv .venv && source .venv/bin/activate  # Windows 用户请使用: .venv\Scripts\activate

# 安装 apryse-sdk (需要额外源)
pip install --extra-index-url https://pypi.apryse.com apryse-sdk

# 安装其他依赖
pip install fastapi uvicorn sqlmodel requests pillow playwright pypdf lxml bs4 python-dotenv

# 安装额外依赖
python setup.py

3. 启动服务

# 如果使用 uv
uv run main.py

# 如果使用 pip
python main.py

4. 打开浏览器
访问控制台主页:http://127.0.0.1:8000

? Docker 运行

使用预构建镜像(推荐)
我们已提供打包好的 Docker 镜像:cat3399/ezppt

docker run --name ezppt \
  -p 8000:8000 \
  -v "$(pwd)/data:/work/data" \
  -v "$(pwd)/.env:/work/.env" \
  cat3399/ezppt:latest

从源码构建镜像
1.构建镜像

docker build -t ezppt .

2.运行容器

docker run --name ezppt \
  -p 8000:8000 \
  -v "$(pwd)/data:/work/data" \
  -v "$(pwd)/.env:/work/.env" \
  ezppt

? 使用指南 (WebUI)

  • 新建项目:在首页点击“新建项目”,输入主题、受众、风格、页数,可选“启用图片搜索”和参考资料。
  • 查看进度:右侧项目详情卡片会显示生成进度百分比,点击进入详情页可查看各部分统计。
  • 预览编辑:点击项目卡片上的“打开预览”,支持侧边栏切换页面、内容实时编辑与自动保存。
  • 导出文件:

    • 项目生成完成后,在“更多操作”菜单中选择“导出为 PDF/PPTX”。
    • 导出任务完成后,“下载 PDF/PPTX”按钮将自动变为可用状态。
  • 重新生成:支持对整个项目或单个页面进行重新生成。

文件存储: 生成的文件位于 data/projects/<项目名>/ 目录下:

  • html_files/:存放每一页的 HTML 文件。
  • <项目名>.pdf:导出后生成的合并 PDF 文件。
  • <项目名>.pptx:导出后生成的 PPTX 文件。

效果展示

EZPPT —— 一键生成可导出 PDF/PPTX 的演示文稿平台

项目地址

[bsgit user="cat3399"]ezppt[/bsgit]

最近发现了个好项目,AI万能追踪,就是本文内容,以下内容就是利用这个东西总结出来的,感觉还是有一定的实用性,除了GitHub,还可以去盯着一些相关新闻,让他及时通知到你。项目地址:https://task.linso.ai/zh

您好,这是为您整理的今日 GitHub 热点项目报告。所有信息均已根据您的要求抓取并清晰呈现,项目地址已明确列出。

今日热点项目列表:
1. 项目名称: 666ghj / BettaFish

  • 项目地址: https://github.com/666ghj/BettaFish
  • 项目简介: 微舆:人人可用的多Agent舆情分析助手,打破信息茧房,还原舆情原貌,预测未来走向,辅助决策!从0实现,不依赖任何框架。
  • 编程语言: Python
  • 星标数: 4,324

2. 项目名称: Wei-Shaw / claude-relay-service

  • 项目地址: https://github.com/Wei-Shaw/claude-relay-service
  • 项目简介: CRS-自建Claude Code镜像,一站式开源中转服务,让 Claude、OpenAI、Gemini、Droid 订阅统一接入,支持拼车共享,更高效分摊成本,原生工具无缝使用。
  • 编程语言: JavaScript
  • 星标数: 4,839

3. 项目名称: microsoft / agent-lightning

4. 项目名称: HKUDS / DeepCode

  • 项目地址: https://github.com/HKUDS/DeepCode
  • 项目简介: "DeepCode: Open Agentic Coding (Paper2Code & Text2Web & Text2Backend)"
  • 编程语言: Python
  • 星标数: 8,408

5. 项目名称: GeeeekExplorer / nano-vllm

6. 项目名称: sst / opencode

7. 项目名称: charmbracelet / glow

8. 项目名称: NARKOZ / hacker-scripts

9 项目名称: moondevonyt / moon-dev-ai-agents

10 项目名称: suitenumerique / docs

  • 项目地址: https://github.com/suitenumerique/docs
  • 项目简介: A collaborative note taking, wiki and documentation platform that scales. Built with Django and React.
  • 编程语言: Python
  • 星标数: 14,369

11 项目名称: Fosowl / agenticSeek

  • 项目地址: https://github.com/Fosowl/agenticSeek
  • 项目简介: Fully Local Manus AI. No APIs, No $200 monthly bills. Enjoy an autonomous agent that thinks, browses the web, and code for the sole cost of electricity. ? Official updates only via twitter @Martin993886460 (Beware of fake account)
  • 编程语言: Python
  • 星标数: 22,646

12 项目名称: HandsOnLLM / Hands-On-Large-Language-Models

13 项目名称: hmjz100 / LinkSwift

  • 项目地址: https://github.com/hmjz100/LinkSwift
  • 项目简介: 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云盘 / 夸克网盘 / UC网盘 / 123云盘 八大网盘
  • 编程语言: JavaScript
  • 星标数: 8,037

AI 增强型 IDE 和编辑器

  • Cursor: AI 优先的代码编辑器(VS Code 分支),具备智能补全、智能重构和多 LLM 支持。支持对话式代码导航和"代码感知"上下文,适合深度 AI 集成和全项目工作流。
  • Windsurf: Codeium 的多 IDE 支持工具,具备"级联流"智能体多步骤自动化、UI 实时预览和强大的团队协作功能。特别适合快速原型开发,但在大项目中容易丢失上下文。
  • Kiro: AWS 实验性 IDE,具备规范驱动的微服务和云原生解决方案脚手架,使端到端开发和部署变得顺畅。
  • 腾讯云 CodeBuddy: AI 驱动的 IDE,用于自动化前端/后端/数据库生成,集成多种 LLM 选择和 Figma 转代码功能。
  • Trae: 字节跳动的自动化构建工具,同步 Figma 设计到代码,专门针对小团队的低代码原型开发。
  • Zed: Rust 驱动的超高速编辑器,120fps 渲染、原生 AI 建议和强大的前端开发协作功能。
  • 通义灵码: 阿里巴巴的旗舰代码助手,支持中英文、主要 IDE 和独立运行。
  • 百度 Comate: 多语言支持,50% 真实采用率,支持所有主要 IDE 和插件,端到端开发自动化。
  • Qoder: 智能代码生成和编程助手,支持多种编程语言,提供代码补全、错误检测和智能重构功能。
  • Crystal (Claude Code Manager): 多会话智能体管理器,Git 工作树集成,差异/合并查看器。非常适合多解决方案原型开发。
  • Void: 开源 Cursor 替代品,检查点可视化,支持任何模型/本地托管的智能体 AI,注重企业隐私。
  • IntelliJ IDEA AI: 企业级主流 Java IDE,原生 AI 补全,大型项目代码导航。

终端 AI 编程助手

  • Claude Code: 全代码库感知,终端中的智能体编辑/测试/PR 流程。适合高度自动化的项目工作流。
  • Gemini CLI :谷歌命令行旗舰产品,100万上下文,多模态聊天和强大的 Shell 脚本自动化。
  • Aider: 终端 Git 集成的结对编程工具,高 Swe-bench 分数,专注于补丁和智能代码导航。
  • Goose: 可扩展的开源 CLI 智能体,插件架构,多模型支持,适合分布式代码工作流。
  • OpenCode: 原生终端智能体,支持 LSP 和数十种 LLM。适合多语言项目和多模型集成。
  • Warp: AI 驱动的终端,自然语言命令和智能自动补全。
  • Codex CLI: OpenAI 官方工具,轻量快速的终端代码生成。
  • Crush: Charmbracelet 的智能体,多模型和 LSP,高度可定制的终端编码。
  • Cursor CLI: 与 Cursor IDE 共享上下文,支持高级实时代码审查、编写和智能体指导。
  • Groq Code CLI: 可扩展插件框架,CLI 工作流自动化,完全可定制。
  • Amp: 自主推理和编辑,适合终端中的多模型和智能体代码任务。
  • iflow CLI: 智能工作流自动化CLI工具,为开发者提供AI驱动的任务编排和终端中的简化开发流程。
  • Qwen3-Coder: 阿里云开发的先进编程模型,支持多种编程语言,具备强大的代码理解、生成和调试能力。提供针对各种编程任务的微调模型,在代码基准测试中表现出色。
  • Auggie: Augment Code 的命令行版本,将企业级AI编程辅助带到终端,具有大上下文窗口和法规遵从性功能。

VS Code 扩展插件

  • GitHub Copilot: 上下文感知的多模型代码建议,支持 14 种语言,与 VS Code、JetBrains 等集成。高级聊天和企业功能。
  • Cline: 自主 AI 智能体,具备文件/网络编辑功能,完全开源可扩展,支持 CLI 模式。
  • Continue: 开源 GPT/Claude/Gemini 集成,内联代码聊天,文件/项目上下文支持,API/模型选择。
  • RooCode: 智能体团队允许并发多模型自动化,高级 API 支持。
  • KiloCode: Roo/Cline 超集,编排器模式和错误恢复,基于积分的系统,高级多智能体权限。
  • Cody (Sourcegraph): 多仓库代码搜索,解释,自定义样式提示,支持多个主要 LLM。
  • CodeGPT: 编辑器内聊天/AI 调试,解释,代码/测试/文档生成,支持 OpenAI/Anthropic。
  • Graphite: 堆叠 PR 工作流,即时 AI 代码审查评论,侧边栏分支管理。
  • Tabnine: 本地部署,适应个人编码风格,适合隐私/安全优先的团队。
  • Gemini Code Assist: 深度谷歌/Colab 集成,实时代码支持。
  • ChatGPT for VS Code: 直接 OpenAI 聊天集成,支持调试/测试/文档生成。
  • Augment Code: 20万+ 上下文令牌,针对大型企业仓库和法规遵从性进行优化,支持 SOC2 级部署。

在线开发平台

  • v0 (Vercel): 自然语言转 React UI,内置 shadcn/ui,极简前端应用原型开发。
  • Bolt.new (StackBlitz): 浏览器内全栈应用创建/部署,利用 WebContainers,无需本地工具。
  • Lovable: 无代码构建器,从自然语言即时创建全栈网络应用。
  • Replit AI Agent/Ghostwriter: 浏览器 IDE,多语言编程,即时解释和错误修复,实时协作。
  • Knack: 自动化代码/数据驱动开发,针对速度/质量/团队用例优化。
  • CodeWP: WordPress 的 AI 网站构建器,端到端生成和部署。

企业级解决方案

  • Codex (OpenAI): 云智能体,CLI,私有部署,具备审计/安全选项的综合代码生成。
  • Devin (Cognition): 团队级自主软件工程师,端到端自动化。
  • Replit: 多智能体工作空间,自然语言生成,多用户协作。
  • Jules (Google): 自动化拉取请求,CI/CD 和代码修复集成。
  • Open SWE (LangGraph): 开源企业智能体平台,工作流可定制性。
  • Amazon Q Developer: AWS 原生编码智能体,IDE 集成,云/服务支持。
  • IBM CodeAssist: AI 驱动的大型机开发者自动化,为受监管行业量身定制。
  • Tabnine Enterprise: 私有云,大型团队的合规/安全。

专业工具

  • RepoPrompt: Mac 原生 AI 文件/代码管理和迭代,非常适合版本组织。
  • DeepCode (Snyk): AI 快速代码安全分析和可操作的修复建议。
  • Umami: AI 驱动的前端优化/性能分析。
  • TraceRoot AI: 错误定位和补丁建议,自动根因分析。
  • Blitz: Next.js 原生 AI 插件,快速前端开发。
  • BlackBox AI: 代码补全加安全扫描一体化。
  • ColDeco: 可视化 AI 生成的代码检查和审查。
  • IntelliDev: ML 驱动的终端工作流助手,用于开发/日志/任务。

最近一直在折腾 AI Agent ,发现让 Agent 可靠地与 Web 交互是个大难题,现有工具要么太底层,要么不够灵活。所以动手撸了一个轮子: @isdk/web-fetcher,想和大家分享一下,也希望能得到一些反馈。

解决了什么痛点?

你可能会问,为啥不用 fetch 或 Playwright/Crawlee ?

  • fetch 拿不到 JS 动态渲染的内容,对现代网页基本没用。
  • Playwright 虽然强大,但需要写大量命令式的过程代码 (await page.click(...) 等),不仅繁琐,而且 AI (比如 LLM) 很难直接生成这种复杂的逻辑。

我不想重复造轮子,所以底层用了Crawlee 库来处理。

我的目标是在 Crawlee 之上构建一个跨引擎一致性:抽象/模拟 HTTP 与 Browser 的共有行为,声明式的“意图层”,让 AI 可以通过生成简单的 JSON 来“指挥”浏览器完成任务,而不是去写具体的执行代码。

核心功能

  • ⚙️ 双引擎架构: 你可以选择 http 模式(基于 Cheerio )来极速抓取静态内容,也可以用 browser 模式(基于 Playwright )来处理复杂的动态网页。
  • ✨ 统一的操作模型 (核心设计): 这是最关键的一点。我抽象了 http 和 browser 模式下的共性行为。无论底层用哪个引擎,你都使用同一套 actions API 。比如 extract (提取数据) 这个操作,在 http 模式下它会通过 Cheerio 解析静态 HTML ,在 browser 模式下它会操作浏览器渲染后的 DOM 。你只需要学习一套 API ,库在内部完成了适配和翻译。
  • ? 声明式操作脚本: 基于统一的模型,你可以用 JSON 定义一个多步骤任务流(登录、填表、点击),AI 生成这个 JSON 的成本远低于生成 JS 代码。
  • ? 强大的数据提取: 同样是声明式的 Schema ,轻松从页面提取结构化数据。
  • ?️ 内置反爬: browser 模式下开启 antibot: true,能处理一些常见的 Cloudflare 挑战。
  • ? 易于扩展: 可以自己封装常用的操作,比如把“登录知乎”封装成一个 loginToZhihu 的自定义动作。

快速上手:提取个标题

注意,下面的代码不关心目标 URL 是静态还是动态的,extract 操作在两种模式下都有效。

import { fetchWeb } from '@isdk/web-fetcher';
async function getTitle(url: string) {
  const { outputs } = await fetchWeb({
    url,
    actions: [
      {
        id: 'extract',
        params: {
          selector: 'title', // 提取 <title> 标签内容
        },
        storeAs: 'pageTitle', // 结果存到 outputs.pageTitle
      },
    ],
  });
  console.log('页面标题:', outputs.pageTitle);
}
getTitle('https://blog.xiaohack.org');

进阶玩法:多步表单提交 (Google 搜索)

这个例子展示了如何用 JSON 指挥浏览器执行一系列动作。

import { fetchWeb } from '@isdk/web-fetcher';
async function searchGoogle(query: string) {
  const { result } = await fetchWeb({
    url: 'https://www.google.com',
    engine: 'browser', // 显式指定需要浏览器环境
    actions: [
      // 步骤 1: 找到输入框并填入内容
      { id: 'fill', params: { selector: 'textarea[name=q]', value: query } },
      // 步骤 2: 提交表单
      { id: 'submit', params: { selector: 'form' } },
      // 步骤 3: 等待搜索结果容器加载出来
      { id: 'waitFor', params: { selector: '#search' } },
    ]
  });
  console.log('搜索结果页 URL:', result?.finalUrl);
}
searchGoogle('xiaohack');

项目状态

项目刚起步,核心架构已经搭好。下一步计划是实现更智能的抓取策略(比如发现 http 模式拿不到内容时,自动升级到 browser 模式)。

项目是开源的,欢迎大家试用、Star 、提 Issue ,或者狠狠地拍砖!感谢。

本次开源了一个我自用的工具 IPA-Harbor, 基于 ipatool ,用来下载 ipa ,避免重复的抓包下载 ipa 等操作,使用 Web 面板访问,支持 App 搜索、历史版本下载,支持 Docker 部署。

Docker 仓库地址 https://hub.docker.com/r/uuphy/ipa-harbor

Github 源码地址 https://github.com/ij369/ipa-harbor

GitHub 文档里有更详细的说明,感兴趣的可以点个小星星,有问题提 issue.

我以前每次想下一个旧版 ipa 都要抓包,然后 AirDrop 给 iPhone , 后面逛帖子时发现 ipatool ,后面拿电脑抠命令,是在是厌烦了,可读的版本号也没有,所以有了想法写这个。

另外,有一个 ipatool.ts 的项目,也非常好,不过我不想维护 ipatool 核心的部分,直接去 ipatool 项目的发版页下载最新的二进制文件,拷贝到我这个项目的 bin 目录即可,正所谓大树下好乘凉,感谢 ipatool 的贡献者,同时省去大家时间。

目前我 ipatool 自用到现在已经有一年时间,两个地区的 ID (美区和日区)都没被封过,非常建议使用的话拿独立的 Apple ID 独立的容器运行,看了源码且如果对 ipatool 项目信任的话,再使用主力 Apple ID 。

没有花钱购买应用的 ID ,这样能避免损失,具体可以去 App Store 进行切换登录,其实折腾这个的不一定只有一个 ID 吧。

整个项目拿 Cursor 断断续续写的, 前期几乎是 Vibe Coding ,后续人手改,所以后端实现以及界面啥的都有点糙,不想投入大精力在这方面,主打安全,能用,后续慢慢打磨。 因为我的文件夹辗转腾挪,我导出过提示词,看了下很多都包含敏感内容,脱敏工作量有点大,就 git 忽略了,后续我如果有空再阅读完整理下放出来。

侧载功能我按照好几个帖子试了下,好像是不可用, 前端已经暂时隐藏了该功能, 看看有没有大佬熟悉这这块帮忙看下能不能实现。

我目前一直挂在外网在用,方便手机领免费应用啥的,以下截图的域名我已经做了更换。 截图里的内容仅供参考,仅作为功能演示:

开源一个可以 Docker 容器部署的 ipa 下载工具,用于下载历史版本的 iOS 应用
开源一个可以 Docker 容器部署的 ipa 下载工具,用于下载历史版本的 iOS 应用1

切勿盈利切勿盈利切勿盈利,不听劝一切后果自行承担。

端里面服务端部分部署时可能有广告之类的,不影响客户端游玩,客户端没广告,广告与我无关。端都是买来的

源码【搬运】

https://pan.baidu.com/share/init?surl=Biogd0N-4WlDtesAFPbUeg&pwd=7swg
https://pan.baidu.com/share/init?surl=ldGOwIMHIbieYLxkv_MC-A&pwd=j3fx

夸克网盘:
【16T爆款游戏合集】
https://pan.quark.cn/s/c294e4308f13#/list/share
【1T精选游戏库】
https://pan.quark.cn/s/28b72bb0b942#/list/share
【14T 3A大作全集】
https://pan.quark.cn/s/d1260648bac6#/list/share
【2T游戏宝藏】
https://pan.quark.cn/s/d92b9cf99d59#/list/share
【1T DNF怀旧端游】
https://pan.quark.cn/s/2e142afe8170#/list/share
【80后喜欢的游戏】
https://pan.quark.cn/s/94c798c8cffe#/list/share

更新 2:寻道大千端更新了!!!新增内容,同时新增一键部分的 VM 端,小白也能用。更新内容:

  1. 更新角色等级到9000级!
  2. 新增10个新坐骑!
  3. 新增活动深渊钥匙!
  4. 修复灵宠绿色技能显示!
  5. 新增 VM 一键端