2026年1月

相信各位佬友现在已经或多或少使用过 skills 并且创建了更好用更合适的协助式 skills,今天我以我个人这几天在简单使用中来小小的总结一下 skills 和 commands(希望各位大佬批评指正 )

Skills 的使用:

1. skills 的基本要素:

首先 skills 分为用户级与项目级,两者的存放位置如下,仅需要把你想要下载的 skills 放在下面的目录中,cc 在每次对话开始前就会自动识别并加载用户级与项目级的 skills,并且可以用 /{skill-name} 的方式调用或者根据你的上下文内容自动调用 skills:

  • 用户级:~/.claude/skills/ 用户级的 skills 全局生效,可以在任何目录中调用用户级 skills
  • 项目级:<项目根目录>/.claude/skills/ 项目级 skills 仅在当前项目生效,适合针对该项目做专业的工作

skills 的一般目录结构如下,以官方的 skill-creator 中的 SKILL.md 中的内容为例

skill-name/
├── SKILL.md(必需)
│   ├── YAML frontmatter 元数据(必需)
│   │   ├── name:(必需)
│   │   └── description:(必需)
│   └── Markdown 指令(必需)
└── 捆绑资源(可选)
    ├── scripts/          # 可执行代码(Python/Bash 等)
    ├── references/       # 需要时加载到上下文的文档
    └── assets/           # 用于输出的文件(模板、图标、字体等) 

在官方的 skill-creator 中的 SKILL.md 中介绍了每个 skill 所需要的内容

  • YAML frontmatter: Claude 会通过上下文中的内容匹配 description 中的应用场景来触发 skill,或者通过 /skillname {描述}l 来触发,需要简短并全面的描述整个 skill 的功能和应用场景。

    ---
    name: <skill-name>
    description: <简要说明技能功能>。当用户请求"<触发短语1>"、"<触发短语2>"、"<触发短语3>",或涉及<相关领域/任务>时,使用此技能。  
    
    ---
    
  • references/:在加载 skill 时会一并加载到上下文中来作为补充思考的参考资料,通常是执行一个 skill 中多个模式时的参考资料补充,也可以是每个模式具体的流程。

  • scripts/:skill 可以包含脚本,可以变成一个主动触发的小型 MCP 服务,一些重复性或者规定格式文件生成工作可以以脚本的形式写在 skill 中,比如你可以让它读取数据库指定表并按照模板自动生成全后端的 CRUD 代码。

  • assets/:静态的文件,图像、logo 等等,这个应该是写一些前端代码生成时用到的东西,目前我还没用到过。

skill-creator 的完整描述
---
name: skill-creator
description: 创建高效技能的指南。当用户想要创建新技能(或更新现有技能)以扩展 Claude 的能力时,应使用此技能,包括专业知识、工作流程或工具集成。
license: 完整条款见 LICENSE.txt
---
# 技能创建器 本技能提供创建高效技能的指导。 ## 关于技能 技能是模块化、自包含的软件包,通过提供专业知识、工作流程和工具来扩展 Claude 的能力。可以将它们视为特定领域或任务的"入职指南"——它们将 Claude 从通用代理转变为配备程序性知识的专业代理,而这些知识是任何模型都无法完全具备的。 ### 技能提供的内容 1. 专业工作流程 - 特定领域的多步骤程序 2. 工具集成 - 处理特定文件格式或 API 的指令 3. 领域专业知识 - 公司特定知识、数据模式、业务逻辑 4. 捆绑资源 - 用于复杂和重复任务的脚本、参考资料和资产 ## 核心原则 ### 简洁至上 上下文窗口是公共资源。技能与 Claude 所需的其他所有内容共享上下文窗口:系统提示、对话历史、其他技能的元数据以及实际的用户请求。 **默认假设:Claude 已经非常智能。** 只添加 Claude 尚不具备的上下文。对每条信息提出质疑:"Claude 真的需要这个解释吗?"以及"这段内容值得消耗这些 token 吗?" 优先使用简洁的示例,而非冗长的解释。 ### 设置适当的自由度 根据任务的脆弱性和可变性匹配具体程度: **高自由度(基于文本的指令)**:当多种方法都有效、决策取决于上下文或启发式方法指导方案时使用。 **中等自由度(伪代码或带参数的脚本)**:当存在首选模式、可接受一定变化或配置影响行为时使用。 **低自由度(特定脚本,少量参数)**:当操作脆弱且容易出错、一致性至关重要或必须遵循特定顺序时使用。 将 Claude 想象为探索一条路径:悬崖边的窄桥需要特定的护栏(低自由度),而开阔的田野允许多条路线(高自由度)。 ### 技能的结构 每个技能由一个必需的 SKILL.md 文件和可选的捆绑资源组成: ```
skill-name/
├── SKILL.md(必需)
│ ├── YAML frontmatter 元数据(必需)
│ │ ├── name:(必需)
│ │ └── description:(必需)
│ └── Markdown 指令(必需)
└── 捆绑资源(可选)
├── scripts/ - 可执行代码(Python/Bash 等)
├── references/ - 需要时加载到上下文的文档
└── assets/ - 用于输出的文件(模板、图标、字体等)
```
#### SKILL.md(必需) 每个 SKILL.md 包含: - **Frontmatter**(YAML):包含 `name``description` 字段。这是 Claude 用来判断何时使用技能的唯一字段,因此清晰全面地描述技能是什么以及何时应该使用它非常重要。 - **Body**(Markdown):使用技能的指令和指导。仅在技能触发后加载(如果触发的话)。 #### 捆绑资源(可选) ##### 脚本(`scripts/`) 用于需要确定性可靠性或反复重写的任务的可执行代码(Python/Bash 等)。 - **何时包含**:当相同的代码被反复重写或需要确定性可靠性时 - **示例**:用于 PDF 旋转任务的 `scripts/rotate_pdf.py` - **优点**:节省 token、确定性、可以在不加载到上下文的情况下执行 - **注意**:脚本可能仍需要被 Claude 读取以进行修补或环境特定调整 ##### 参考资料(`references/`) 需要时加载到上下文中以指导 Claude 流程和思考的文档和参考材料。 - **何时包含**:用于 Claude 在工作时应参考的文档 - **示例**:用于财务模式的 `references/finance.md`、用于公司保密协议模板的 `references/mnda.md`、用于公司政策的 `references/policies.md`、用于 API 规范的 `references/api_docs.md` - **用例**:数据库模式、API 文档、领域知识、公司政策、详细工作流程指南 - **优点**:保持 SKILL.md 精简,仅在 Claude 确定需要时加载 - **最佳实践**:如果文件较大(>10k 词),在 SKILL.md 中包含 grep 搜索模式 - **避免重复**:信息应该存在于 SKILL.md 或参考文件中,而不是两者都有。除非信息确实是技能的核心,否则优先将详细信息放在参考文件中——这样可以保持 SKILL.md 精简,同时使信息可发现而不占用上下文窗口。仅在 SKILL.md 中保留基本的程序性指令和工作流程指导;将详细的参考材料、模式和示例移至参考文件。 ##### 资产(`assets/`) 不打算加载到上下文中,而是用于 Claude 产出的输出中的文件。 - **何时包含**:当技能需要将在最终输出中使用的文件时 - **示例**:用于品牌资产的 `assets/logo.png`、用于 PowerPoint 模板的 `assets/slides.pptx`、用于 HTML/React 样板的 `assets/frontend-template/`、用于排版的 `assets/font.ttf` - **用例**:模板、图像、图标、样板代码、字体、被复制或修改的示例文档 - **优点**:将输出资源与文档分离,使 Claude 能够使用文件而无需将其加载到上下文中 #### 技能中不应包含的内容 技能应仅包含直接支持其功能的必要文件。不要创建无关的文档或辅助文件,包括: - README.md - INSTALLATION_GUIDE.md
- QUICK_
REFERENCE.md - CHANGELOG.md - 等等 技能应仅包含 AI 代理完成手头工作所需的信息。它不应包含关于创建过程的辅助上下文、设置和测试程序、面向用户的文档等。创建额外的文档文件只会增加混乱和困惑。 ### 渐进式披露设计原则 技能使用三级加载系统来高效管理上下文: 1. **元数据(name + description)** - 始终在上下文中(约 100 词) 2. **SKILL.md body** - 当技能触发时(<5k 词) 3. **捆绑资源** - 根据 Claude 需要(无限制,因为脚本可以在不读入上下文窗口的情况下执行) #### 渐进式披露模式 将 SKILL.md body 保持在必要内容且不超过 500 行,以最小化上下文膨胀。接近此限制时将内容拆分到单独的文件中。当将内容拆分到其他文件时,非常重要的是从 SKILL.md 引用它们并清楚描述何时读取它们,以确保技能的读者知道它们的存在以及何时使用它们。 **关键原则:** 当技能支持多种变体、框架或选项时,仅在 SKILL.md 中保留核心工作流程和选择指导。将特定变体的详细信息(模式、示例、配置)移至单独的参考文件。 **模式 1:带参考资料的高级指南** ```markdown
# PDF 处理

## 快速开始

使用 pdfplumber 提取文本:
[代码示例]

## 高级功能

- **表单填写**:完整指南见 [FORMS.md](FORMS.md)
- **API 参考**:所有方法见 [REFERENCE.md](REFERENCE.md)
- **示例**:常见模式见 [EXAMPLES.md](EXAMPLES.md)
```
Claude 仅在需要时加载 FORMS.md、REFERENCE.md 或 EXAMPLES.md。 **模式 2:领域特定组织** 对于具有多个领域的技能,按领域组织内容以避免加载不相关的上下文: ```
bigquery-skill/
├── SKILL.md(概述和导航)
└── reference/
├── finance.md(收入、计费指标)
├── sales.md(商机、管道)
├── product.md(API 使用、功能)
└── marketing.md(营销活动、归因)
```
当用户询问销售指标时,Claude 只读取 sales.md。 类似地,对于支持多个框架或变体的技能,按变体组织: ```
cloud-deploy/
├── SKILL.md(工作流程 + 提供商选择)
└── references/
├── aws.md(AWS 部署模式)
├── gcp.md(GCP 部署模式)
└── azure.md(Azure 部署模式)
```
当用户选择 AWS 时,Claude 只读取 aws.md。 **模式 3:条件性详情** 显示基本内容,链接到高级内容: ```markdown
# DOCX 处理

## 创建文档

使用 docx-js 创建新文档。见 [DOCX-JS.md](DOCX-JS.md)。

## 编辑文档

对于简单编辑,直接修改 XML。

**对于修订跟踪**:见 [REDLINING.md](REDLINING.md)
**对于 OOXML 详情**:见 [OOXML.md](OOXML.md)
```
Claude 仅在用户需要这些功能时读取 REDLINING.md 或 OOXML.md。 **重要指南:** - **避免深层嵌套引用** - 保持引用从 SKILL.md 只有一层深度。所有参考文件应直接从 SKILL.md 链接。 - **结构化较长的参考文件** - 对于超过 100 行的文件,在顶部包含目录,以便 Claude 在预览时可以看到完整范围。 ## 技能创建流程 技能创建包括以下步骤: 1. 通过具体示例理解技能 2. 规划可复用的技能内容(脚本、参考资料、资产) 3. 初始化技能(运行 init_skill.py)
4. 编辑技能(实现资源并编写 SKILL.md)
5. 打包技能(运行 package_
skill.py) 6. 基于实际使用进行迭代 按顺序执行这些步骤,仅在有明确理由说明不适用时才跳过。 ### 步骤 1:通过具体示例理解技能 仅当技能的使用模式已经清楚理解时才跳过此步骤。即使在处理现有技能时,此步骤仍然有价值。 要创建有效的技能,需要清楚理解技能将如何使用的具体示例。这种理解可以来自直接的用户示例或经过用户反馈验证的生成示例。 例如,在构建图像编辑器技能时,相关问题包括: - "图像编辑器技能应该支持什么功能?编辑、旋转,还有其他吗?" - "你能给出一些这个技能将如何使用的示例吗?" - "我可以想象用户会要求'去除这张图片的红眼'或'旋转这张图片'。你还能想象这个技能的其他使用方式吗?" - "用户说什么应该触发这个技能?" 为避免让用户不知所措,避免在单条消息中问太多问题。从最重要的问题开始,根据需要跟进以获得更好的效果。 当对技能应支持的功能有清晰认识时,结束此步骤。 ### 步骤 2:规划可复用的技能内容 要将具体示例转化为有效的技能,通过以下方式分析每个示例: 1. 考虑如何从头开始执行示例 2. 识别在反复执行这些工作流程时哪些脚本、参考资料和资产会有帮助 示例:在构建 `pdf-editor` 技能以处理"帮我旋转这个 PDF"等查询时,分析显示: 1. 旋转 PDF 每次都需要重写相同的代码 2. 在技能中存储 `scripts/rotate_pdf.py` 脚本会有帮助 示例:在设计 `frontend-webapp-builder` 技能以处理"给我构建一个待办事项应用"或"给我构建一个跟踪步数的仪表板"等查询时,分析显示: 1. 编写前端 webapp 每次都需要相同的 HTML/React 样板 2. 在技能中存储包含样板 HTML/React 项目文件的 `assets/hello-world/` 模板会有帮助 示例:在构建 `big-query` 技能以处理"今天有多少用户登录?"等查询时,分析显示: 1. 查询 BigQuery 每次都需要重新发现表模式和关系 2. 在技能中存储记录表模式的 `references/schema.md` 文件会有帮助 要确定技能的内容,分析每个具体示例以创建要包含的可复用资源列表:脚本、参考资料和资产。 ### 步骤 3:初始化技能 此时,是时候实际创建技能了。 仅当正在开发的技能已经存在且需要迭代或打包时才跳过此步骤。在这种情况下,继续下一步。 从头创建新技能时,始终运行 `init_skill.py` 脚本。该脚本方便地生成一个新的模板技能目录,自动包含技能所需的一切,使技能创建过程更加高效和可靠。 用法: ```bash
scripts/init_skill.py <skill-name> --path <output-directory>
```
该脚本: - 在指定路径创建技能目录 - 生成带有正确 frontmatter 和 TODO 占位符的 SKILL.md 模板 - 创建示例资源目录:`scripts/``references/``assets/` - 在每个目录中添加可以自定义或删除的示例文件 初始化后,根据需要自定义或删除生成的 SKILL.md 和示例文件。 ### 步骤 4:编辑技能 在编辑(新生成或现有的)技能时,请记住技能是为另一个 Claude 实例使用而创建的。包含对 Claude 有益且非显而易见的信息。考虑什么程序性知识、领域特定细节或可复用资产将帮助另一个 Claude 实例更有效地执行这些任务。 #### 学习经过验证的设计模式 根据技能需求查阅这些有用的指南: - **多步骤流程**:见 references/workflows.md 了解顺序工作流程和条件逻辑 - **特定输出格式或质量标准**:见 references/output-patterns.md 了解模板和示例模式 这些文件包含有效技能设计的既定最佳实践。 #### 从可复用技能内容开始 要开始实现,从上面确定的可复用资源开始:`scripts/``references/``assets/` 文件。请注意,此步骤可能需要用户输入。例如,在实现 `brand-guidelines` 技能时,用户可能需要提供品牌资产或模板存储在 `assets/` 中,或文档存储在 `references/` 中。 添加的脚本必须通过实际运行来测试,以确保没有错误且输出符合预期。如果有许多类似的脚本,只需测试具有代表性的样本,以确保它们都能工作,同时平衡完成时间。 任何技能不需要的示例文件和目录都应删除。初始化脚本在 `scripts/``references/``assets/` 中创建示例文件以演示结构,但大多数技能不需要所有这些。 #### 更新 SKILL.md **写作指南:** 始终使用祈使句/不定式形式。 ##### Frontmatter 编写包含 `name``description` 的 YAML frontmatter: - `name`:技能名称 - `description`:这是技能的主要触发机制,帮助 Claude 理解何时使用该技能。 - 包括技能做什么以及何时使用它的具体触发器/上下文。 - 将所有"何时使用"信息放在这里 - 不要放在 body 中。body 仅在触发后加载,因此 body 中的"何时使用此技能"部分对 Claude 没有帮助。 - `docx` 技能的示例描述:"全面的文档创建、编辑和分析,支持修订跟踪、批注、格式保留和文本提取。当 Claude 需要处理专业文档(.docx 文件)时使用,用于:(1) 创建新文档,(2) 修改或编辑内容,(3) 处理修订跟踪,(4) 添加批注,或任何其他文档任务" 不要在 YAML frontmatter 中包含任何其他字段。 ##### Body 编写使用技能及其捆绑资源的指令。 ### 步骤 5:打包技能 技能开发完成后,必须将其打包成可分发的 .skill 文件与用户共享。打包过程会自动先验证技能以确保它满足所有要求: ```bash
scripts/package_skill.py <path/to/skill-folder>
```
可选的输出目录指定: ```bash
scripts/package_skill.py <path/to/skill-folder> ./dist
```
打包脚本将: 1. **自动验证**技能,检查: - YAML frontmatter 格式和必需字段 - 技能命名约定和目录结构 - 描述的完整性和质量 - 文件组织和资源引用 2. 如果验证通过则**打包**技能,创建以技能命名的 .skill 文件(例如 `my-skill.skill`),包含所有文件并保持正确的目录结构以供分发。.skill 文件是带有 .skill 扩展名的 zip 文件。 如果验证失败,脚本将报告错误并退出而不创建包。修复任何验证错误并再次运行打包命令。 ### 步骤 6:迭代 测试技能后,用户可能会要求改进。这通常发生在使用技能后不久,对技能表现有新鲜的上下文。 **迭代工作流程:** 1. 在实际任务中使用技能 2. 注意困难或低效之处 3. 确定应如何更新 SKILL.md 或捆绑资源 4. 实施更改并再次测试

2. skill 的下载与快速创建

你可以在各类网站上找到你相中的 skills,然后直接把他们下载下来放在你的用户级或者项目集的 skills/ 目录中就可以了,你也可以直接用 cc-switch 来下载用户级的 skills

CC-Switch 下载 skills
一些 skills 网站(站内搜索 skills 就有很多分享的啦)

CliProxyApi 反重力生图 skill, 支持 4K, claude code ,codex 可用

GitHub - anthropics/skills: Public repository for Agent Skills

分享个今天看到 Skills 相关的网站等

快速创建:

首先安装官方的 skill-creator,这里需要注意的是 windows 的 cli 中默认编码是 GBK,所以可能会遇见脚本执行编码错误的情况,直接让 cc 帮你修复,也可以直接下载这个修复后的 skill

skill-creator.zip

安装好 skill-creator 后一定要重启 cc 让它加载好这个 skill,然后直接 /skill-creator 帮我创建一个项目级的{什么什么功能}的skill 然后 cc 就一顿操作猛如虎给你建好了,肯定少不了一顿改来改去的,所以一般都是拿现成的过来用。

创建好后的 skills 在正确加载后执行 /skills 命令是会显示的:

甚至还有一个 mcp-builder 可以帮你创建 mcp 服务,我就拿他创建了一个可以连接 mysql 的 mcp,还是挺方便的,总之我觉得 skills 可以理解为各种各样的插件,你缺什么功能了你就拿过来,还是挺有趣的。

Commands 的使用

1. commands 的基本介绍

commands 可以理解为纯提示词版的 skills(貌似 cc 加载的时候也会把自定义的 commands 当作 skills 加载?调用 /skills 可以看到创建的 skills 和 commands)一般内容都是些工作流程的约束,比如项目分析、解释代码、审查代码等简单工作流程,也分为用户级与项目级,但是 cc 不会根据上下文来自动调用,而是需要手动调用 /{command-name} 阿巴阿巴

  • 用户级:~/.claude/commands/ 全局生效
  • 项目级:<项目根目录>/.claude/commands/

commands 的目录结构(支持命名空间):

.claude/commands/
├── code/
│   ├── explain-code.md       # /code:explain-code
│   └── review-code.md       # /code:review-code
└── analysis/
    └── analyze-project.md      # /analysis:analyze-project 
正确加载后的样子

在 commands 中同样也会要求规定 YAML frontmatter

--- description: "分析项目结构和技术栈" allowed-tools: ["read", "grep", "bash", "glob"]
model: sonnet ---
  • description:命令描述。

  • allowed-tools:允许调用的工具。

  • model:指定的模型。

2. commands 的快速创建

commands 的创建目前好像没有相应的 skills 支持(也可以使用 skill-creator 来创建一个 commands-builder ),但我们依然可以拜托万能 cc 帮我们创建,他自己知道 commands 的规则,直接让它创建一个项目级的分析代码commands 即可。

貌似也可以在 commands 的工作流程中让其调用多个 skills 和 mcp 协作,实现一个完整的大型工作流程,这个我目前没试过,现在日常的代码工作应该够用了。

如果佬们想要体验更牛逼的协作功能可以体验一下站内大佬做的项目

【开源】CCG v1.7.24 : Claude Code 编排三 CLI 协作 | Codex + Gemini + Claude

[开源] CCW(Claude-code-workflow)6.3.X 版本新增 skill-generator-- 使用 ccw 设计具有 spec 风味的 Skill

以上就是我对于 skills 和 commands 的简单总结啦 ,大家快来鞭策我


📌 转载信息
原作者:
MrChen-hero
转载时间:
2026/1/14 10:37:26

from __future__ import annotations

from dataclasses import dataclass
from datetime import datetime, timezone
from typing import Any, Dict, List, Optional, Set, Tuple # --- 可选依赖:curl_cffi(你指定要用) --- try:
    from curl_cffi import requests as curl_requests  # type: ignore except Exception:  # pragma: no cover
    curl_requests = None def _parse_iso_dt(s: Optional[str]) -> Optional[datetime]:
    if not s:
        return None
    s = s.replace("Z", "+00:00")
    try:
        dt = datetime.fromisoformat(s)
        # 保证 tz-aware if dt.tzinfo is None:
            dt = dt.replace(tzinfo=timezone.utc)
        return dt
    except ValueError:
        return None def _now_utc() -> datetime:
    return datetime.now(timezone.utc)


@dataclass(frozen=True) class Provider:
    id: str
    name: str type: str
    model: str
    group: str
    endpoint: str

    latest_status: Optional[str] = None
    latest_latency_ms: Optional[int] = None
    latest_ping_latency_ms: Optional[int] = None
    latest_checked_at: Optional[datetime] = None
    latest_message: Optional[str] = None @staticmethod def from_dict(d: Dict[str, Any]) -> "Provider":
        latest = d.get("latest") or {}
        return Provider(
            id=str(d.get("id", "")),
            name=str(d.get("name", "")),
            type=str(d.get("type", "")),
            model=str(d.get("model", "")),
            group=str(d.get("group", "")),
            endpoint=str(d.get("endpoint", "")),
            latest_status=(latest.get("status") if isinstance(latest, dict) else None),
            latest_latency_ms=(latest.get("latencyMs") if isinstance(latest, dict) else None),
            latest_ping_latency_ms=(latest.get("pingLatencyMs") if isinstance(latest, dict) else None),
            latest_checked_at=_parse_iso_dt(latest.get("checkedAt") if isinstance(latest, dict) else None),
            latest_message=(latest.get("message") if isinstance(latest, dict) else None),
        )


class LinuxDoStatusClient:
    """
SDK-ish client for https://check.linux.do/api/v1/status

- 数值/元数据:用属性 .total .operational .generatedAt ...
- 列表/字典:用方法 getAllGroups() / getOfflineModels() ...
"""
DEFAULT_URL = "https://check.linux.do/api/v1/status" # 你之前定义的概念我保留,并做了可调的集合 DEGRADED_STATUSES: Set[str] = {"degraded"} # “离线”通常你会想把这些算进去;另外 error 不在 summary 里时会单独暴露 .error OFFLINE_STATUSES: Set[str] = {"failed", "validationfailed", "maintenance"} def __init__(self,
url: str = DEFAULT_URL,
timeout_s: float = 15.0,
impersonate: str = "chrome",
auto_refresh: bool = True,
data: Optional[Dict[str, Any]] = None,
): self._url = url self._timeout_s = timeout_s self._impersonate = impersonate self._raw: Dict[str, Any] = {} self._providers: List[Provider] = [] self._providers_raw_by_id: Dict[str, Dict[str, Any]] = {} self._fetched_at: Optional[datetime] = None if data is not None: self._load(data) elif auto_refresh: self.refresh() # 网络 / 载入 def refresh(self) -> "LinuxDoStatusClient": if curl_requests is None: raise RuntimeError( "curl_cffi 未安装。请先 pip install curl-cffi\n" "或把 data=... 传进来离线使用。" ) r = curl_requests.get( self._url, timeout=self._timeout_s, impersonate=self._impersonate, # chrome impersonate headers={"accept": "application/json", "cache-control": "no-cache"}, ) r.raise_for_status() data = r.json() if not isinstance(data, dict): raise ValueError("API response must be a JSON object") self._load(data) return self def refreshIfNeeded(self) -> "LinuxDoStatusClient": """按 metadata.pollIntervalMs 判断是否过期;过期才 refresh。""" if self.isStale: return self.refresh() return self def _load(self, data: Dict[str, Any]) -> None: self._raw = data providers = data.get("providers", []) if not isinstance(providers, list): raise ValueError('response["providers"] must be a list') self._providers_raw_by_id = { str(p.get("id", "")): p for p in providers if isinstance(p, dict) and p.get("id") } self._providers = [Provider.from_dict(p) for p in providers if isinstance(p, dict)] self._fetched_at = _now_utc() # SDK 属性:summary / metadata @property def total(self) -> int: v = (self._raw.get("summary") or {}).get("total") return v if isinstance(v, int) else len(self._providers) @property def operational(self) -> int: v = (self._raw.get("summary") or {}).get("operational") if isinstance(v, int): return v return self.statusCounts.get("operational", 0) @property def degraded(self) -> int: v = (self._raw.get("summary") or {}).get("degraded") if isinstance(v, int): return v return self.statusCounts.get("degraded", 0) @property def failed(self) -> int: v = (self._raw.get("summary") or {}).get("failed") if isinstance(v, int): return v return self.statusCounts.get("failed", 0) @property def validationFailed(self) -> int: v = (self._raw.get("summary") or {}).get("validationFailed") if isinstance(v, int): return v return self.statusCounts.get("validationfailed", 0) @property def maintenance(self) -> int: v = (self._raw.get("summary") or {}).get("maintenance") if isinstance(v, int): return v return self.statusCounts.get("maintenance", 0) @property def avgLatencyMs(self) -> Optional[int]: v = (self._raw.get("summary") or {}).get("avgLatencyMs") return v if isinstance(v, int) else None @property def generatedAt(self) -> Optional[datetime]: dt = (self._raw.get("metadata") or {}).get("generatedAt") return _parse_iso_dt(dt if isinstance(dt, str) else None) @property def generatedAtString(self) -> Optional[str]: s = (self._raw.get("metadata") or {}).get("generatedAt") return s if isinstance(s, str) else None @property def pollIntervalMs(self) -> Optional[int]: v = (self._raw.get("metadata") or {}).get("pollIntervalMs") return v if isinstance(v, int) else None @property def pollIntervalLabel(self) -> Optional[str]: v = (self._raw.get("metadata") or {}).get("pollIntervalLabel") return v if isinstance(v, str) else None @property def fetchedAt(self) -> Optional[datetime]: """本地拉取时间(不是接口 generatedAt)。""" return self._fetched_at @property def isStale(self) -> bool: """
依据 generatedAt + pollIntervalMs 判断是否过期:
- 没 metadata 就当 stale(更安全)
"""
gen = self.generatedAt interval = self.pollIntervalMs if gen is None or interval is None: return True return (_now_utc() - gen).total_seconds() * 1000 > interval # 扩展:状态统计 & “error”这种 summary 没给的状态 @property def statusCounts(self) -> Dict[str, int]: """
从 providers.latest.status 直接统计(比 summary 更“全”)
例如:operational / degraded / error / failed / ...
"""
counts: Dict[str, int] = {} for p in self._providers: k = (p.latest_status or "unknown").strip().lower() counts[k] = counts.get(k, 0) + 1 return counts @property def error(self) -> int: """接口 summary 里不一定有 error,这里从 providers 计算。""" return self.statusCounts.get("error", 0) @property def offline(self) -> int: """
“离线”综合数:failed + validationFailed + maintenance + error
(你也可以按自己口味改 OFFLINE_STATUSES / 规则)
"""
return self.failed + self.validationFailed + self.maintenance + self.error # SDK 方法:group/model/provider 查询 def providers(self) -> List[Provider]: return list(self._providers) def getProvider(self, key: str) -> Optional[Provider]: """按 id 或 name 精确匹配(大小写不敏感)。""" k = key.strip().lower() for p in self._providers: if p.id.lower() == k or p.name.lower() == k: return p return None def __getitem__(self, key: str) -> Provider: p = self.getProvider(key) if p is None: raise KeyError(f"provider not found: {key}") return p def getProviderRaw(self, provider_id: str) -> Optional[Dict[str, Any]]: """拿原始 provider dict(含 statistics / timeline)。""" return self._providers_raw_by_id.get(provider_id) def getAllGroups(self) -> List[str]: groups = {p.group for p in self._providers if p.group} return sorted(groups) def getAllTypes(self) -> List[str]: types_ = {p.type for p in self._providers if p.type} return sorted(types_) def getAllModels(self, by_group: bool = True) -> Dict[str, List[str]] | List[str]: if not by_group: models = {p.model for p in self._providers if p.model} return sorted(models) m: Dict[str, Set[str]] = {} for p in self._providers: if p.group and p.model: m.setdefault(p.group, set()).add(p.model) return {g: sorted(models) for g, models in sorted(m.items(), key=lambda x: x[0].lower())} def getModelsByGroup(self, group: str) -> List[str]: g = group.strip().lower() models = {p.model for p in self._providers if p.group.lower() == g and p.model} return sorted(models) def getProvidersByGroup(self, group: str) -> List[Provider]: g = group.strip().lower() return [p for p in self._providers if p.group.lower() == g] def getProvidersByModel(self, model: str) -> List[Provider]: m = model.strip().lower() return [p for p in self._providers if p.model.lower() == m] def getProvidersByStatus(self, status: str) -> List[Provider]: s = status.strip().lower() return [p for p in self._providers if (p.latest_status or "").lower() == s] # 你要的:离线/降级 models(保持原来的返回风格) def getDegradedModels(self, by_group: bool = True) -> Dict[str, List[str]] | List[str]: return self._models_by_status(self.DEGRADED_STATUSES, by_group=by_group) def getOfflineModels(self, by_group: bool = True) -> Dict[str, List[str]] | List[str]: # offline = OFFLINE_STATUSES + {"error"}(更符合你想要的直觉) statuses = set(self.OFFLINE_STATUSES) | {"error"} return self._models_by_status(statuses, by_group=by_group) def _models_by_status(self, statuses: Set[str], by_group: bool) -> Dict[str, List[str]] | List[str]: statuses_l = {s.lower() for s in statuses} def hit(p: Provider) -> bool: return (p.latest_status or "").lower() in statuses_l if not by_group: models = {p.model for p in self._providers if p.model and hit(p)} return sorted(models) m: Dict[str, Set[str]] = {} for p in self._providers: if p.group and p.model and hit(p): m.setdefault(p.group, set()).add(p.model) return {g: sorted(models) for g, models in sorted(m.items(), key=lambda x: x[0].lower())} # 额外:快/慢、分组汇总(很 SDK 常用) def getFastestProviders(self, n: int = 5) -> List[Provider]: def key(p: Provider) -> Tuple[int, int]: return (0 if p.latest_latency_ms is not None else 1, p.latest_latency_ms or 10**18) return sorted(self._providers, key=key)[: max(0, int(n))] def getSlowestProviders(self, n: int = 5) -> List[Provider]: def key(p: Provider) -> Tuple[int, int]: return (0 if p.latest_latency_ms is not None else 1, -(p.latest_latency_ms or -10**18)) return sorted(self._providers, key=key)[: max(0, int(n))] def getGroupSummary(self) -> Dict[str, Dict[str, int]]: """
返回:
{
"Packy": {"total": 10, "operational": 8, "degraded": 1, "error": 1, ...},
...
}
"""
out: Dict[str, Dict[str, int]] = {} for p in self._providers: g = p.group or "unknown" st = (p.latest_status or "unknown").lower() out.setdefault(g, {"total": 0}) out[g]["total"] += 1 out[g][st] = out[g].get(st, 0) + 1 # 排序输出(可读性更像 SDK) return {g: out[g] for g in sorted(out.keys(), key=lambda x: x.lower())} # 原始数据(调试用) def raw(self) -> Dict[str, Any]: return dict(self._raw)

简单搓了一下
反正我集成到我的 Bot 里面了

至于为什么要用 curl_cffi? 因为监测站有 Cloudflare 盾


📌 转载信息
转载时间:
2026/1/14 10:37:14

之前做了个简单的 opencoed 的介绍和插件 Oh my code 的 Ultrawork 模式多 agent 的说明

很多佬说不会配置 今天瞎搓了一个配置管理器 就是简单的参数映射编辑
对于不喜欢搞 json 格式的佬们省了个心 懒得费那劲的佬们可以试试
初版肯定有很多问题 还在重构界面中 临时先用 0.6.4

PS:操作前先备份原始配置文件~~ 切记!切记!切记!

新更新 opencode 默认是关闭 think 模式的 新增了 think 选项 如果你的模型支持 think 可以添加 添加之后才会有

7:30 又是爆肝的一夜 一口气更新迭代了 10 个版本
上下文压缩 (Compaction)
选项 / 变体 配置结构
MCP 服务器配置
外部导入功能
Skill 管理

Rules 管理

Agent 管理
该有的咱家人都要有

这就是 ulw 模式的魅力~

有任何问题和建议欢迎留言 我们大家一起来完善他
本人胆小! 高手勿喷..

觉得有帮助帮我点个 star


📌 转载信息
原作者:
icysaintdx
转载时间:
2026/1/14 10:36:55


第三届“数信杯”数据安全大赛数据安全个人赛初赛

数据安全

第四题

题目描述:工程师小王为了保证数据的安全存储,开发了对数据处理的程序,但这样的处理方式安全吗?分析程序功能,解密文件获取原始数据,提交第6行第2列数据。

IDA打开程序



Base64解密即可,第六行数据

MjU3MTA4NzYwNDAgNzE2ODk2MTk4ODI5MDM3NDkzIGFkNzg2MkBiNy5jb20K



答案:716896198829037493

第五题

题目描述:工程师小王认识到前面开发的程序并不能保证对数据的安全存储,现在对处理程序进行了改进,这次能行吗?分析程序功能,解密文件获取原始数据,提交第8行第2列数据。



程序re1e97e14f是64位ELF可执行文件(Linux x86-64,stripped)。通过静态分析确定程序结构:

入口点_start位于0x401190,通过__libc_start_main调用main函数。main函数位于0x401579,负责文件读写和调用核心加密函数。核心加密函数sub_401276位于0x401276,实现三阶段加密处理。

程序执行流程:读取./info_81bedab.ori → 三阶段加密 → 输出./info_81bedab.ori.en

Stage A - 位运算变换(sub_401276内,地址0x4012FE~0x401360):

Stage B - RWX自解密代码执行(sub_401276内,地址0x401360~0x401450):

关键函数调用序列:

0x401368: call malloc(0x1000) 申请4KB内存

0x401380: call mprotect(page, 0x1000, 7) 设置RWX权限

0x4013A0: 从.data段地址0x404060复制0x84(132)字节代码块到RWX页

0x4013B8: 获取密钥 state = (uint16_t)(buf + 0x339)

0x4013D0: 循环调用RWX代码处理每个字节

0x84字节代码块结构(位于.data段0x404060):

解密后的变换代码(key=0x6E72解密后):

等效变换函数:

Stage C - 循环XOR(sub_401276内,地址0x401450~0x4014A0):

解密算法:

Stage C逆操作:cipher XOR "e6911c24" → B[]

从B[0x339]=0xEB, B[0x33A]=0xAB约束搜索Stage B密钥,得到key=0x6E72

Stage B逆操作:通过逆映射表还原 → A[]

Stage A逆操作:A[i] >> 1 → plaintext[]

验证:A[0x339]=0x72, A[0x33A]=0x6E,与key一致

解密成功

答案:878052199921046799

第六题



题目给出一个SQLite数据库文件,提示在Freeblock空闲块中隐藏了自定义链表数据。首先连接数据库查询sys_config表获取三个关键配置:


入口指针格式为"物理页号:偏移",页号0x13B=315,偏移0x4F0=1264,该偏移已跳过Freeblock的4字节头部

链表节点结构为大端序,NextPage占4字节,NextOff占2字节,Len占2字节

加密方式为使用当前物理页号的大端4字节表示循环异或

SQLite文件头偏移16-17处读取页大小为4096字节。链表遍历算法:从入口页315偏移1264开始,读取8字节头部解析出NextPage、

NextOff、Len,然后读取Len字节的加密数据,用struct.pack('>I', current_page)生成4字节密钥循环XOR解密。当NextPage=0且

NextOff=0时链表结束。

解密拼接后得到完整SQL脚本:



执行该SQL查询得到container_id=CN2888991777license_plate=粤B-52816,按题目要求提取container_id和license_plate后五位数字

用下划线连接。

答案:CN2888991777_52816

第七题

题目实现了一个存在漏洞的AES-CBC加密,核心代码如下:

漏洞在于hint泄露了key与message前16字节的异或值。

对于38字节的flag,自定义padding函数会在前面添加10个\x0a字节,得到48字节。PKCS7填充后变成64字节(4块)。

消息结构为:

Block 0: \x0a*10 + flag[0:6]

Block 1: flag[6:22]

Block 2: flag[22:38]

Block 3: \x10*16

由于flag[:5]=b'flag{'已知,只需爆破flag[5]一个字符即可恢复完整key。验证方法是检查解密后最后一块是否为\x10*16。

利用CBC模式特性,后续块使用前一块密文作为IV解密,可恢复完整flag。

答案:flag{IADMIN-TOP-18880101-7634567_2025}

第八题

题目提供损坏的RSA私钥key_pri.pem和加密用户数据encrypted_users.csv。解析私钥DER编码发现大量参数被零填充,属于"变异RSA"私钥恢

复问题。

私钥ASN.1结构解析:

从dp字段提取p的部分高位(496位已知,低48位为0):

p_high =

0x9d025160d56d4971363f3cf2ce7e3e96215c50bf50d0cc606f5645de7ec113d16d931383e649bc2c7328499d219e2982b726ae41c5370

aa8000000000000

使用Coppersmith小根攻击恢复p的完整值。设p = p_high + x + y*2^496,其中x为低位未知部分(约48位),y为高位修正(约16位)。构

造格基,利用LLL算法求解满足p | n的小根。

cuso库求解代码:

恢复完整p =

0xf5e49d025160d56d4971363f3cf2ce7e3e96215c50bf50d0cc606f5645de7ec113d16d931383e649bc2c7328499d219e2982b726ae41c

5370aab851b8a28df37

验证:n mod p = 0,p为512位素数。计算q = n/p,d = e^(-1) mod (p-1)(q-1),构建RSA私钥,使用PKCS1_OAEP解密查找目标记录。

答案:294_010880753296303612_5108757973927325

第九题



答案:S20251001

第十题

题目提供了三个文件:secret_image.png(隐写图片)、multimodal_model.pth(PyTorch模型权重)和stego_hint.txt(提示文件)。

根据提示文件,隐写规则如下:

1图片的R通道中隐藏了模型输入特征

2取图片左上角前20个像素的R值,计算 R值 mod 10 得到20维特征向量

3将20维特征输入MLP模型,输出数值四舍五入取整即为flag的ASCII码

4ASCII码转换为字符得到完整flag

关键点在于"左上角前20个像素"的取法:按扫描顺序取第一列从上到下的20个像素(x=0, y=0..19)。

模型结构为3层全连接神经网络(MLP):20->64->32->27,使用ReLU激活函数。输出27维向量对应flag的27个字符。

答案:flag{A12I_shu1xin2bei_2025}

数据分析

数据应急

题目背景: 一家科技公司服务器被黑客入侵,重要文件被窃取并删除。需要根据系统自动备份的残存内容进行溯源分析。

第一题



三个文件全部导出



答案:HT-2025-001234

第二题

解压压缩包,得到一个内存镜像

非预期

直接搜索flag{



预期解



发现有C:\Program Files\TrueCrypt\TrueCrypt.exe

Elcomsoft Forensic Disk Decryptor挂载

加载内存镜像先搜索一下key

保存1.evk



成功挂载



答案:flag{33c3789a36bb61beb6d4268cd7d13038}

第三题

过滤响应200的包



最后一个包发现是exe程序



导出来看看

解包

找到一个exfiltrator_balanced.pyc

反编译

该程序是一个基于 ICMP 协议的隐蔽数据外带工具,通过将文件切分为 224 字节的数据块并伪装成 Windows Ping 流量发送。其核心安全机

制包含三个部分:
程序运行时会生成一个随机的 16 字节 CryptoSeed 和一个基于时间的 ScrambleSeed(用于乱序)。利用 PBKDF2-HMAC-SHA256 算

法,结合 CryptoSeed 和两组被混淆和硬编码的盐值(b'Bloodharbor!2024'b'Silent_Update!!!'),迭代 10,000 次分别派生出两

层加密所需的 32 字节密钥。
每个数据块首先添加 4 字节大端序长度头,然后使用 ChaCha20-Poly1305 进行内层加密(Layer 1),输出包含 Nonce、密文和 Tag。接着

对 Layer 1 的完整结果使用 AES-256-GCM 进行外层加密(Layer 2),同样输出 Nonce、密文和 Tag,确保了数据的机密性与完整性。
程序首先发送包含种子的元数据块(以 EX1L 开头)。为了对抗流量分析,它利用 ScrambleSeed 初始化随机数生成器,对所有数据块的发

送顺序进行全随机打乱(Shuffle)。发送时,每个 ICMP 包的 Payload 前部填充 16 字节的伪造 Windows Ping 数据,并使用复杂的线性同

余算法生成伪随机的 ICMP ID 和序列号,使得流量在外观和统计特征上极难被识别。



打开流量包,发现流量包含有大量 ICMP 请求,其中部包含 EX1L 标志的 Payload,确认为数据外带。提取 EX1L 元数据块,获取 Crypto

Seed 和 Scramble Seed。加密机制为双层加密:首先是 ChaCha20-Poly1305 (Layer 1,带 4 字节长度头),其次是 AES-GCM (Layer 2)。密

钥由 PBKDF2 基于 Crypto Seed 和硬编码盐值生成。数据块顺序经过混淆,需利用 Scramble Seed 初始化随机数生成器并还原顺序。编写脚

本提取 ICMP Payload,还原顺序并依次解密 Layer 2 和 Layer 1,拼接后得到一个 ZIP 文件。

解压得到100张图片



写一个脚本OCR识别18316978925

[+] 找到目标: person_086.png



答案:江苏省南京市鼓楼区西湖路200号梧桐里15栋4单元101室

数据分析

背景描述

随着维真科技(VerityTech)业务规模的不断扩张,公司积累了大量内部 PDF 文档,包括重要的研发资料、业务报告、内部制度说明等。在长期

的运作过程中,由于文档管理规范不完善、缺乏统一的安全策略,公司文档的安全风险逐渐显现。

近期,公司文档服务器遭遇未知勒索程序攻击。部分 PDF 文件被加密无法打开,系统中还出现可疑链接的文档,疑似为攻击入口。同时,安

全团队在受感染终端中提取到了一份可疑的可执行程序(exe 文件),推测为勒索程序主体。

为了定位安全漏洞、恢复文档数据、查明攻击来源,公司启动了"文档安全事件分析"专项工作。本题给出攻击样本、加密文档及疑似钓鱼

PDF 文档,请你协助安全团队进行取证分析、密钥恢复、数据解密以及钓鱼链接识别。

相关信息

公司合法域名为:

其余域名均视为可疑链接,需重点审查。

第一题

通过file命令识别en.exe为Windows PE可执行文件,使用strings发现Python相关字符串,判断为PyInstaller打包程序。使用pyinstxtractor.py

解包后,在en.exe_extracted/key/目录下发现RSA密钥对文件pr.pem和public_key.pem。读取pr.pem文件内容,定位-----BEGIN PRIVATE

KEY-----标记位置,提取其后的32位字符即为答案。

答案:MIIEvgIBADANBgkqhkiG9w0BAQEFAASC

第二题

反编译

分析解包后的pyc文件,发现加密流程采用混合加密机制:使用RSA-OAEP(SHA256)加密AES密钥并保存到store.key,使用AES-256-ECB模

式对PDF文件进行加密。解密流程为:首先使用提取的RSA私钥pr.pem通过PKCS1_OAEP(SHA256)解密store.key获取AES密钥,然后使用

AES-ECB模式解密PDF文件并去除PKCS7填充,最后计算解密后文件的MD5值。

答案:52fd2cb4fc43eceb3c79233038bb5f42

第三题

使用PyMuPDF遍历999份解密后的PDF,提取PDF Annotation超链接中的URI。合法域名为veritytech.com及其子域名*.veritytech.com,排

除.local和.internal等内部域名后,筛选出所有指向外部非法域名的钓鱼URL。同时检查URL参数中的跳转地址(redirect/next/url等参数)。

过滤掉包含非ASCII字符的无效URL,将所有钓鱼URL按字典序升序排序后用逗号拼接,计算MD5值。

答案:0a16f1ca5e8db1270074d0d39f6edeaf

数据审计

背景描述

某公司运维团队在日常安全巡检过程中发现系统存在异常访问和潜在入侵迹象。经初步技术研判,问题可能与公司用于关键服务器相关。该

服务器被确认存在一定安全风险,但目前尚无法确定攻击者是否已成功获取其中的证书信息。

为进一步排查与分析潜在的数据泄漏情况,运维团队已导出该服务器的所有网络流量文件,请根据流量包文件分析并回答以下问题。

第一题

题目提供了params.csv文件,包含500组RSA参数(id, e, p, q)。需要根据id=285的参数合成RSA私钥,然后遍历所有pcap文件,提取TLS证

书中的公钥模数n,与id=285计算得到的n(n = p * q)进行匹配,找到对应的流量包。具体步骤:首先读取params.csv获取id=285的e、p、

q参数,计算n = p * q;然后遍历pcap文件,解析其中的X.509证书,提取RSA公钥的模数n;最后比对两个n值,相等则说明该pcap使用了

id=285对应的证书。

答案:mAqY0WRHsV.pcap

第二题

需要使用params.csv中的RSA参数生成私钥,然后用私钥解密TLS加密的流量包,获取HTTP明文数据。具体步骤:首先根据e、p、q计算私

钥参数d = e^(-1) mod (p-1)(q-1),生成PEM格式私钥文件;然后遍历每个pcap文件,提取证书中的公钥模数n,匹配对应的私钥;使用

tshark配合私钥解密TLS流量,提取HTTP请求体;解密后的数据为POST请求到/api/v1/user/profile,请求体为hex编码的JSON,包含

username和phone字段;遍历所有解密结果,查找username为"王梅"的记录,获取其phone字段。

答案:13930079365

第三题

系统在请求包中设置了Authorization头部字段,使用JWT进行身份认证。JWT的payload中包含username和phone信息,而请求体中也包含

相同字段。越权访问的判断标准是:JWT中的用户信息与请求体中的用户信息不一致。具体步骤:解密所有流量包获取HTTP明文;提取

Authorization头部中的JWT token;JWT由三部分组成(header.payload.signature),对payload部分进行Base64URL解码获取JSON数

据;同时解析请求体中的hex编码JSON数据;比较JWT payload中的username和phone与请求体中的username和phone;若不一致则判定为

越权访问,统计越权账号总数。

答案:5

套壳了一下 DrissionPage,并做了优化
REPO:

微软 Fluent UI 风格,有空做下打包 :P,此项目完全本地(除了 Chrome 下载用的是谷歌的 api),无需登录,欢迎审查代码

UI 演示




(声明:由于以下并未控制变量,所以不能作为实际原因,仅为一个未控制变量的小测试,没有贬低 / 引起争论的意思,如果出现问题请通知我,谢谢 qaq)

小实验

不知道为什么 RoxyBrowser 注册不了的(使用邮箱:4e4f9ba9@aspireviastudios.org,此处指 Kiro AWS 账户,图片


),UselessBrowser 可以正常注册(使用邮箱:05919999@gotrak.org,此处指 KiroAWS 账户,图片

邮箱均可通过:https://mail.chatgpt.org.uk/<我所引用的邮箱地址> 来证实

再次声明:无引战、贬低等意思,谢谢理解 XP

由于此项目刚开坑,功能可能不全,还请各位多多 Issues/PullRequest,谢谢啦


📌 转载信息
转载时间:
2026/1/14 10:31:48

先放链接: https://apps.apple.com/cn/app/id6745865592

现在 AI 发展速度太快,量产了大量垃圾 App ,感觉 iOS App 审核速度都慢了许多。

过去 1 天就审核,这次上架花费了 15 天,每次打回来都要重新等 3-4 天。

Frame 3.png


回顾每一天,珍藏美好瞬间。

Moment ,让你以日历视图的方式,轻松回顾每一天的相册照片。

日历视图全自动完成,无需手动操作。

无论是查看“那年今日”的照片,还是按日历自动展示系统相册中的照片,一切都能简单操作,轻松完成。

主要功能:

  • 那年今日:回顾每一天的“那年今日”照片,让你重温往昔记忆。

  • 自动日历展示:自动按日历顺序展示系统相册中的照片,轻松查看每一天的珍贵瞬间。

  • 自定义日历图片:让你自由设定每一天的日历图片,按需展示。

  • 批量整理照片:轻松批量移动照片至不同相簿,保持相册整洁。

  • 批量删除照片:一键删除多张照片,节省时间,快速清理。

  • 未分类照片提醒:快速查看哪些照片尚未分类,避免错过重要记忆。

  • 100% 隐私保护:你的隐私始终得到严格保护,我们承诺不收集任何个人数据。

无论是整理回忆,还是管理照片库,这款应用都能为你提供便捷与高效的解决方案。


点击前往 App Store 下载

或在 App Store 搜索:Moment - 那年今日,因为刚上架,搜索 Moment 可能看不到 App 。

官方地址:https://domain.stackryze.com/

1. 注册
首先点击右上角【Get Started】按钮,然后使用使用邮箱注册就行了,注册很简单,就填入姓名,邮箱,密码这三项 就完了,这里懒得截图了,或者是使用 GitHub 登录。登录完成以后进入控制面板如下。然后点击【Register New Domain】按钮

2. 注册域名
然后输入自己想要的域名,这里我输入的 baidu.indevs.in。点击最下面的【Register Domain】就能完成注册了。

该域名是完全免费的,但是有效期只有 1 年,在快要过期的 60 天内续费是免费的 。快到期了官方会发邮件通知你续费的。域名注册完成以后就能在面板看到了,上面也能看到每个账号能注册 5 个域名,目前域名不支持转赠。如下

3.CloudFlare 托管






📌 转载信息
原作者:
user554
转载时间:
2026/1/14 10:30:04

这个主题是由我和 AI 一起开发的 typecho 模板,用了大概几天的时间,这是一款带双主题切换的主题,并且内置了网盘下载功能,全部开源给大家,这个主题后续我会持续更新,使用中有问题可以在此留言,后续我也会持续每周为大家更新一款我与 AI 的故事,最后喜欢我的主题,请在 github 帮我点个 star!

放一个 github 的链接:GitHub - FeiFan86/SeeLTheme: 一款现代化的 Typecho 博客主题,支持简洁化与玻璃态双主题自由切换。


📌 转载信息
原作者:
bybaby
转载时间:
2026/1/14 10:28:46

500万次围观,1X把「世界模型」真正用在了机器人NEO身上

0%
icon展开列表
500万次围观,1X把「世界模型」真正用在了机器人NEO身上
今天
img
跳出「黑盒」,人大刘勇团队最新大语言模型理论与机理综述
今天
img
百川开源全球最强医疗大模型M3,「严肃问诊」定义AI医疗新能力
今天
img
相约AAAI 2026 | 上海AI实验室北极星 X 星启交流会(报名开启)
01月13日
img
视觉模型既懂语义,又能还原细节,南洋理工&商汤提出棱镜假说
01月13日
img
无需重新训练,即可学习新任务,Arc研究所开源单细胞基础模型Stack及细胞反应全景图谱
01月13日
img
不上云、不租卡,如何优雅地在本地微调Qwen-VL-30B?
01月13日
img
OpenAI的首款硬件:是AI耳机,今年销量要冲5000万
01月13日
img
华为推出软工代码智能体SWE-Lego,解锁SFT训练极致性能
01月13日
img
大模型中标TOP10里的黑马:中关村科金的应用攻坚之道
01月13日
img
刚刚,梁文锋署名开源「记忆」模块,DeepSeek V4更细节了
01月13日
img
一个模型统一4D世界生成与重建,港科大One4D框架来了
01月13日
img
端到端智驾的算力困局,九章智算云这样破局
01月12日
img
真香!刚骂完AI,Linux之父的首个Vibe Coding项目上线
01月12日
img
引入几何约束后,VLM跨越了「空间推理」的认知鸿沟
01月12日
img
清华等团队用AI驱动百万倍速药物筛选,一天内十万亿次扫描的超高速虚拟平台
01月12日
img
2026年,大模型训练的下半场属于「强化学习云」
01月12日
img
顶尖AI竟输给三岁宝宝,BabyVision测试暴露多模态模型硬伤
01月12日
img
AAAI 2026 Oral|快手提出全新「检索数据引擎」CroPS,打破搜索信息茧房
01月12日
img
被Jim Fan点赞!全球第一的千寻智能Spirit v1.5正式开源!
01月12日
img

500万次围观,1X把「世界模型」真正用在了机器人NEO身上

还记得那个穿着「Lululemon」紧身衣、主打温柔陪伴的家用人形机器人 NEO 吗?

图片

上次聊到它时,大家还在吐槽其「远程操控」的隐私安全问题,调侃每个机器人的背后可能都是一个「印度小哥」。

昨天,1X 公司带着它的全新「大脑」亮相:1X World Model。这一次,NEO 似乎准备把「背后的操作员」给解放了。

简单来说,现在的 NEO 不再只是死记硬背动作,它学会了像人一样「想象」。通过观看海量的网络视频和人类第一视角的实操录像,它理解了物理世界是如何运作的:东西掉了会下落,门是可以推开的。

他们把类似 Sora 的视频生成技术装进了 NEO 的脑子里,接到指令时,它会先在脑海里生成一段「自己成功完成任务」的视频,然后倒推身体该怎么动,才能把这段想象变成现实。

不过,官方博客中也表示,有时候会出现「脑子学会了,手没学会」的情况:脑补出的视频很完美,但实际动作可能会抓空。

图片

那么这一次是「瑜伽服」下的真功夫,还是只存在于 Demo 里的「剪辑魔法」呢?不管技术落没落地,热度已经先爆表了。到截稿时间,官方推文浏览量已突破 500 万。

图片

看来,在经历了 AI 时代各式各样炫酷 Demo 的轮番轰炸之后,大家还是忍不住想看看:这一回,它是真长脑子了吗?

以下是 1X 技术团队对这颗「新大脑」的硬核拆解:

图片

家庭机器人要真正走进现实环境,必须具备常识性的行为能力以及对物理世界的深刻理解。

当前许多机器人基础模型采用的是 VLA 范式:即在一个预训练的 VLM 之上,增加一个用于预测机器人动作的输出头(例如 PI0.6、Helix、Groot N1.5)。VLM 能够从互联网规模的数据中学习到丰富的知识,但其训练目标更侧重于视觉与语义理解,而非对物理动态过程的预测。

因此,即便是对人类而言非常简单的任务,模型往往也需要数万小时、成本高昂的机器人数据才能学会完成。此外,为了进一步强化模型对物理交互中空间关系的理解,研究者通常还需要引入各种辅助训练目标(如 MolmoAct、Gemini-Robotics 1.5)。

在这篇博客中,1X 介绍了基于视频预训练的世界模型——1XWM,并将其集成进 NEO 机器人作为其控制策略。

与 VLA 模型直接从静态的图像-语言输入中预测动作轨迹不同,世界模型驱动策略是通过文本条件下的视频生成来推导机器人应采取的动作。借助互联网规模视频中蕴含的真实世界动力学规律,该世界模型能够在无需大规模机器人数据预训练、也不依赖任何相关的遥操作演示的情况下,即可泛化到全新的物体、运动方式和任务场景。

这标志着机器人智能范式的一次转变:机器人开始直接受益于视频预训练规模化带来的能力跃迁,而这一切得以实现,离不开一整套为高保真人类具身到机器人具身迁移而设计的硬件系统支持。

图片

从视频知识到世界模型

如今,诸如 Veo 和 Sora 等前沿文生视频模型已经能够生成极其逼真的视频内容。然而,这些模型在零样本生成场景下并未与机器人具身形态对齐,因而在控制任务所需的多个关键维度上往往存在不足,表现在以下几个方面:

  • 视觉/空间层面:生成的视频是否与机器人的相机内参和自我中心视角一致?是否能够准确保留操控任务所需的深度信息以及精确的空间关系?

  • 运动学层面:生成视频中的机器人动作是否在该具身形态下可实现,是否遵循其结构特性、关节极限、速度约束以及执行器能力?

  • 物理层面:生成过程是否避免了物理上不可能的结果(例如物体瞬移),从而保证其能够转化为现实世界中的成功执行?

原始视频能够提供看起来会发生什么,但并未给出如何去做。为了将视频知识转化为真正可用于控制的世界模型,1X 借助自身的端到端系统架构,采用了一种两阶段的对齐过程,思路与 DreamGen、UniPi 等已有工作一脉相承:

  • 世界模型主干:这是一个文本条件扩散模型:先在互联网规模的视频数据上进行预训练,随后在人类第一视角视频数据上进行中期训练,并最终在 NEO 专属的传感器-运动日志上进行微调。该模型能够高保真地预测场景随时间演化的过程,在视觉、空间和物理一致性方面表现出色。

  • 逆动力学模型(Inverse Dynamics Model, IDM):通过训练 IDM,将像素空间与执行器控制连接起来,使其能够预测在生成帧之间完成状态转移所需的精确动作序列。同时利用 IDM 的评估指标和拒绝采样机制,对生成结果施加运动学约束,从而确保动作在具身层面上的可行性。

在推理阶段,系统接收一个文本指令和一帧初始画面:世界模型负责生成符合意图的未来场景演化,逆动力学模型从中提取所需的动作轨迹,最终由机器人在现实世界中执行该动作序列。

图片

1XWM 的训练与推理流程

1XWM 的主干模型基于一个 140 亿参数的生成式视频模型。为了使该模型适配 NEO 的具身形态,1X 还采用了一种多阶段训练策略:

  • 第一视角中期训练:使用 900 小时的人类第一视角视频数据进行训练,使模型对第一人称的操作任务产生对齐。在这一阶段,模型能够学习到通用的操作行为模式,但仍然难以生成由 NEO 执行具体任务的视频。

  • 具身微调:随后,使用 70 小时的机器人数据进行微调,使模型进一步适配 NEO 的视觉外观与运动学特性。

以 DALL·E 3 等工作为例,已有研究表明,通过使用更具描述性的视觉文本标注进行训练,可以显著提升视觉基础模型对提示词的遵循能力。然而,许多第一视角数据集仅包含简要的任务描述。为此,1X 利用一个 VLM 生成更加详细的描述性字幕,并通过字幕上采样的方式将其用于训练。

此外,IDM 在 400 小时未经过滤的机器人数据上进行训练,其中既包括随机探索数据,也包含与任何具体任务无关的运动轨迹。这使得模型能够在任意状态下对 NEO 的运动进行准确追踪。

在测试阶段,系统接收一帧初始画面以及一条指导 NEO 执行动作的文本指令。1XWM 负责生成未来的视频序列,随后由 IDM 从生成视频中提取对应的机器人动作轨迹,并将其直接下发至机器人执行。为保证轨迹的平滑性,IDM 的输出会在多个初始噪声样本和滑动窗口维度上进行时间平均处理。

图片

NEO 后训练数据集主要包含高质量的抓取和放置数据(98.5%),这些数据经过筛选,仅包含桌面操作且手部可见的场景。通过利用基础视频模型的网络级预训练,1XWM 模型可以泛化到各种未曾见过的物体、环境和任务。

1XWM 到底能做啥

研究团队进一步评估了 1XWM 在任务泛化方面的能力,重点关注其是否能够完成 NEO 从未经历过的任务,以及生成视频与真实机器人执行之间的一致性程度。

在实验中,搭载 1XWM 的 NEO 被用于执行多种超出既有经验的任务,包括:

  • 抓取分布内与分布外的物体;

  • 操作此前从未见过、但具备复杂可供性的物体;

  • 完成需要全新动作模式的全新任务。

实验结果显示,1XWM 生成的视频与真实世界中的执行过程整体高度一致。将模型生成的视频与机器人实际完成任务后拍摄的视频进行并排对比,可以发现二者在视觉表现上非常接近。这表明,1XWM 在空间结构理解、运动学约束建模以及物理一致性等方面已经具备较强能力。

抓取:

图片

新动作:清洁

图片

接下来,1X 尝试需要双手协调和人机交互的任务。这些能力并未包含在训练数据集中。这表明此类知识来源于视频预训练和以第一人称视角进行的人机交互训练。由于 NEO 的身体结构与人类非常相似,因此从人类视频数据中学习到的功能可以直接迁移应用。

图片
图片

研究团队还通过系统性的实物实验评估了 1XWM 在分布内(ID)与分布外(OOD)任务上的表现。每类任务均重复执行 30 次。结果显示,1XWM 在多种动作原语上都保持了稳定的成功率,不过部分对精细操作要求较高的任务(例如倒液体、绘图等)仍然具有一定挑战性。

图片

能否将视频质量与任务成功率联系起来?

如果可以,就能使用视觉指标来衡量和改进视频质量,并估计实际任务成功的可能性。

有时,生成的视频是否可能成功一目了然。例如,向 1XWM 模型输入拉取纸巾指令,有时会生成 NEO 机器人拿起纸巾盒而不是拉取纸巾的视频。执行这些错误生成的视频时,成功率几乎为 0%。

1X 团队注意到像测试时计算这样的方法可以提高任务成功率。受此启发,他们尝试并行生成多个视频,并执行其中质量最好的一个。这个选择过程可以手动完成,但也可以使用 VLM 评估器进行自动化。

图片

第一视角数据与高质量字幕的重要性

基于此前假设:生成视频的质量与任务成功率之间存在相关性,研究团队对若干训练选择进行了视觉层面的消融分析,重点考察了字幕上采样以及第一视角人类数据训练这两项因素的影响。

实验共使用了三个评测数据集,每个数据集均包含 500 组起始图像–提示词对:

  • 分布内数据集:包含与机器人训练数据分布一致的复杂任务和场景,主要是杂乱环境中、物体位置较为困难的抓取与放置任务。

  • 新任务数据集:由一组全新的任务构成,例如搅拌碗、抽纸、相对尺寸判断(选择更大的物体)、双手协同操作等,数据采集于真实世界中的简单背景场景。

  • 分布外 T2I(OOD T2I)数据集:完全由抓取任务组成,其初始帧由文生图模型生成,随机采样分布外的家庭物体与背景场景。

下面是新任务数据示例:

图片

团队还要求人工标注员审查每个生成的视频,并根据物理合理性、任务完成情况以及与 NEO 的形态和能力的一致性来决定接受或拒绝该视频。

图片

字幕上采样在所有评测数据集上都能提升视频生成质量,因为更细致的字幕与视频模型预训练时的文本条件更加匹配,也能更清晰地引导具体动作生成。

引入第一视角人类数据则显著提升了新任务和分布外场景下的生成质量,说明这类数据为操作任务提供了可迁移的通用先验,且与 NEO 的类人具身高度契合。

不过,在已有大量 NEO 数据覆盖的分布内任务上,额外加入第一视角数据可能会稀释后训练数据分布,对效果提升有限,甚至略有负面影响。

图片

参考链接:https://www.1x.tech/discover/world-model-self-learning

GLM-Image 技术报告:GLM-Image: Auto-regressive for Dense-knowledge and High-fidelity Image Generation

模型基于昇腾 Atlas 800T A2 设备和昇思 MindSpore AI 框架完成从数据到训练的全流程,是首个在国产芯片上完成全程训练的 SOTA 多模态模型。
GLM-Image 采用自主创新的「自回归 + 扩散解码器」混合架构,实现了图像生成与语言模型的联合,是我们面向以 Nano Banana Pro 为代表的新一代「认知型生成」技术范式的一次重要探索。

新一代图像生成模型 GLM-Image 正式上线并开源!

这一次,图像生成不只 “好看”,更 “写对”

核心亮点:

强理解 × 准文字:理解复杂指令,文字绘制更精准,特别适合海报、插画等知识密集型场景

架构革新:面向以 Nano Banana Pro 为代表的新一代技术范式打造

硬核突破:首个在国产芯片上完成全程训练的 SOTA 图像模型

极致性价比:API 生成一张图仅 0.1 元

Bigmodel 已就位,欢迎大家上手体验,一起玩出新高度

详情 i3z.cc/v-8na7u

消息转发自官方开发者社群


📌 转载信息
原作者:
zhongruan
转载时间:
2026/1/14 10:25:43

素材转视频功能:现支持竖屏比例

应用户需求,我们正式推出竖屏模式!所有付费套餐现已支持竖屏素材转视频功能(免费版后续开放)。使用步骤如下:

在下拉菜单中选择 “素材转视频”。

上传或生成图像素材作为主题或风格参考。

在设置中将宽高比调整为竖屏模式。

请注意:当前该功能仅支持 Veo 3.1 Fast 版本(横竖屏模式均适用)。期待见证您的创作成果!

视频分辨率升级至 1080p 与 4K

我们深知分辨率的重要性。今日推出两款全新升级模型:1080p 升级版(更新)与 4K 升级版(新增),您可在下载心仪作品时调用。下载视频时(右上角菜单内),只需选择对应的分辨率选项即可。

重要提示

1080p 升级下载适用于所有付费套餐,无需消耗积分。

4K 升级下载仅限 Ultra 套餐用户使用,每次消耗 50 积分。

升级处理可能需要数分钟,完成时右上角将显示提示气泡。

费用及可用性可能随时调整。

Flow 团队敬上


📌 转载信息
原作者:
Menkelo
转载时间:
2026/1/14 10:25:19

  1. 一定要美国 IP
  2. 历史账号有重复操作过没成功的这个账号大概率用不了,(我就是)换了新账号
    3. 使用 https://www.adspower.net 浏览器进行认证
  3. https://batch.1key.me 这个地址认证,我发现最后一次页面显示认证失败,但是实际成功了
    5. 没有信用卡的,在海鲜市场买一个 3.99

📌 转载信息
原作者:
yxd
转载时间:
2026/1/14 10:25:10

开源微信推送服务

使用 Spring Boot 4.0 和 GraalVM Native

通过企业微信(WeCom),将系统消息稳定、合规地推送到用户的微信中接收。

整体消息流转路径如下:

HTTP 请求

企业微信 API

业务系统 / 服务

push-server

企业微信服务端

微信 App

最终效果是: 用户在微信中收到消息,但技术通道使用的是企业微信。

为什么选择企业微信?
相比微信公众号,企业微信具备天然的系统通知优势:

无缝触达:消息最终可到达 微信 App(需关注插件)。
主动推送:支持无限制的主动消息推送,适合通知。
稳定合规:官方允许的系统消息通道,不涉及内容风控。
简单易用:无需复杂的模板消息申请,开发接口清晰。

有什么需要的或者想法可以提,交流一下

项目地址

教程

1. 注册企业微信

谁都可以注册企业微信,无需认证,按说明注册并使用微信扫二维码完成管理员绑定

2. 微信插件

选择我的企业,点击微信插件,使用手机扫码关注

3. 添加应用

添加 logo 和应用名称以及可见范围,选择一个部门或者自己都行,创建应用

4. 配置应用

4.1 查看 Secret

创建完成后会进入当前页面,点击查看可以看 Secret

点击发送,可前往企业微信查看消息

点击查看,保存好,不要泄露,至关重要

4.2 配置可信 IP

在配置可信 IP 之前,我们需要先设置可信域名

可信域名需要校验域名,点击 申请校验域名 获得认证信息

下载文件放置到一个网站的根目录下,我这里放置到了自己在 cloudflare 的 Workers 和 Pages 博客上 https://mazepeng.com/

当文件可以访问到的时候就可以设置可信域名了


现在推送消息的服务必须有可信 IP,如何获得自己的 IP 呢

访问 https://ifconfig.me/ 或者直接百度 IP 就可以看到自己的公网 IP 了

点击应用管理,点击应用,拉倒最下面,配置可信 IP

5. 运行 push-server

支持 docker 部署和本地应用部署,这里我就介绍一下 docker 部署

5.1 docker 命令部署

  docker run -d \
  --name push-server \
  -p 8000:8000 \
  -e PUSH_AUTH_KEY="替换为自己的key" \
  -e PUSH_WECOM_APP_KEY="你的应用AppKey" \
  -e PUSH_WECOM_APP_SECRET="你的应用AppSecret" \
  -e PUSH_WECOM_AGENT_ID="1000001" \
  qingzhoudev/push-server:latest
  
#安全设置,默认值为下方值,需要修改添加环境变量修改
  docker run -d \
  --name push-server \
  -p 8000:8000 \
  -e PUSH_AUTH_KEY="替换为自己的key" \
  -e PUSH_WECOM_APP_KEY="你的应用AppKey" \
  -e PUSH_WECOM_APP_SECRET="你的应用AppSecret" \
  -e PUSH_WECOM_AGENT_ID="1000001" \
  -e PUSH_SECURITY_BLOCK_MINUTES="30" \
  -e PUSH_SECURITY_FAIL_WINDOW_MINUTES="5" \
  -e PUSH_SECURITY_MAX_FAILS="5" \
  -e PUSH_SECURITY_RATE_LIMIT_CAPACITY="10" \
  -e PUSH_SECURITY_RATE_LIMIT_QPS="1" \
  qingzhoudev/push-server:latest

  • PUSH_AUTH_KEY 请求头密钥,需要自己设置一个复杂的即可
  • PUSH_WECOM_APP_KEY 就是企业 ID
  • PUSH_WECOM_APP_SECRET 就是保存的 Secret
  • PUSH_WECOM_AGENT_ID 应用 ID

替换后直接 docker 启动

5.2 使用 Docker Compose

services: push-server:  qingzhoudev/push-server:latest container_name: push-server ports: - "8000:8000" volumes: - ./application-prod.yml:/app/config/application-prod.yml:ro restart: unless-stopped 

application-prod.yml 文件

push: auth: key: "CHANGE_ME" security: block-minutes: 30 fail-window-minutes: 5 max-fails: 5 rate-limit-capacity: 10 rate-limit-qps: 1 wecom: app-key: "CHANGE_ME" app-secret: "CHANGE_ME" agent-id: 1000001 webhook-url: server: port: 8000 

5.3 企业 ID

5.4 应用 ID

6 推送消息

和正常接收微信消息一样,没有什么区别

curl -X POST http://localhost:8000/api/v1/push \
  -H "X-API-Key: 替换为自己的key" \
  -H "Content-Type: application/json" \
  -d '{
"target": "ZhangSan|LiSi",
"type": "TEXT",
"content": "系统通知:您的任务已构建完成。"
}'
curl -X POST http://localhost:8000/api/v1/push \ -H "X-API-Key: 替换为自己的key" \ -H "Content-Type: application/json" \ -d '{
"target": "MaZePeng",
"type": "TEXT_CARD",
"title": "测试Push Server",
"content": "我是 Push Server,这是我作为服务端的第一条消息",
"url": "https://www.mazepeng.com"
}'
curl -X POST http://localhost:8000/api/v1/push \ -H "X-API-Key: 替换为自己的key" \ -H "Content-Type: application/json" \ -d '{
"target": "MaZePeng",
"type": "NEWS",
"articles": [
{
"title": "测试 Article",
"description": "我是描述",
"url": "https://www.mazepeng.com",
"picUrl": "https://mazepeng.com/img/bg/a_larger_image_of_the_homepage.jpg"
}
]
}'

类型有:

  • TEXT
  • MARKDOWN(微信不支持)
  • TEXT_CARD
  • NEWS

📌 转载信息
原作者:
mazp
转载时间:
2026/1/14 10:25:03

系统中存在多个 Claude Code 安装位置,PATH 环境变量包含了多个 npm 全局安装路径,例如:

  1. 新版本位置C:\Users\[用户名]\.npm-global (v2.1.7)
  2. 旧版本位置H:\Environment\nodejs\node_global (v2.0.25)

由于 PATH 环境变量的查找顺序问题,系统在不同目录下会找到不同版本的 claude.cmd

解决方案

方案 1:调整 PATH 环境变量顺序(推荐)

优点:无需删除文件,安全简单

步骤

  1. Win + R,输入 sysdm.cpl,回车
  2. 点击 "高级" 选项卡 → “环境变量”
  3. 在 "用户变量" 部分找到 Path,双击编辑
  4. 找到新版本路径(如 C:\Users\[用户名]\.npm-global
  5. 选中该路径,点击 "上移" 按钮,将其移到旧版本路径之前
  6. 点击 "确定" 保存所有设置
  7. 重启所有命令提示符窗口
  8. 验证:claude --version

方案 2:卸载旧版本

优点:彻底清理,避免混淆

步骤

# 从旧版本安装位置卸载
npm uninstall -g @anthropic-ai/claude-code --prefix="H:\Environment\nodejs\node_global"

# 验证
claude --version

注意:如果遇到权限问题,需要:

  • 关闭所有可能占用文件的程序(VSCode、IDE、终端等)
  • 以管理员身份运行命令提示符
  • 或手动删除目录:H:\Environment\nodejs\node_global\node_modules\@anthropic-ai\claude-code

📌 转载信息
原作者:
mapple
转载时间:
2026/1/14 10:23:48

本文仅为 孙佬 CCG 模式进行升级 而写

【CCG 自动化流 安装教程】 三合一自动化编程 ,助力每一位佬友 享受 [自动化流] 氛围编程时代(谁再说 AI 代替程序员,我就要开始闹了) - 开发调优 - LINUX DO

若初次使用,可直接跟着风佬教程走(风佬写的够细了)

前言

今天早上起来,风佬告诉我 CCG 整体优化和 BUG 修复已经完成,邀请我体验 CCG 。
收到这个消息的时候真的挺激动,毕竟我从风佬 CCG 刚开贴就一直在关注和观望。
目前等到可以成熟使用,怎么会不兴奋呢?
于是一早就开始着手升级了
在升级的时候发现居然还适配孙佬 CCG, 这一波无痛升级,我更亢奋了!
看我 CCG 第二篇!升级篇!!!

什么?! 还在凹战力?

开始升级之前,我先标一下孙佬和风佬的原文
(关于孙佬CCG的安装教程在上面那个链接)

孙佬 CCG: 【自己动手,丰衣足食 04】一个更现代的 SKILLs 集合,一个更省时的并行化 workflow。好的 agent 怎能局限于线性 cc+codex+gemini? - 开发调优 - LINUX DO
风佬 CCG: 【开源】CCG v1.7.24 : Claude Code 编排三 CLI 协作 | Codex + Gemini + Claude - 开发调优 - LINUX DO

相信关于 CCG 是什么,各位佬已经都熟悉了(如果不熟悉,那就借用风佬的截图)

最近不仅仅是 CCG, 还出现了 CCW 等其他同类型的协作整合,我们当然也不能落后!
(落后就要挨打 )

废话懒得说了,开始吧

CCG 升级正文

  1. 安装风佬 CCG-workflow :
    npx ccg-workflow

  2. 选择初始化 CCG 配置

  3. 测试安装
    控制台输入 Claude
    在 claude 中 测试以下指令是否可用:

  4. 结果分享


好了安装完了

你还在看什么?

怎么还不走?

就是这么简单啊,还能怎样?

快给风佬上 star,还有, 给我点赞


📌 转载信息
原作者:
akirann
转载时间:
2026/1/14 10:22:44

背景

你是不是也有这种痛苦:
每天在 PowerShell + 各种编辑器的 Terminal 里库库手打命令,输错一个字母就重来;
想找上一条命令只能疯狂按 ↑ ↓;
更离谱的是 —— 还没有自动补全,每条命令都得从头敲!

如果你也被这些折磨过 —— 恭喜你,今天这个工具能让你直接起飞:
装上它,PowerShell + 各种编辑器的 Terminal 的命令提示 / 补全体验立刻提升一大截,常见命令、参数、历史记录都能更顺手地调用。
一条命令安装,立刻告别重复手打!

工具

重磅推荐 PSReadLine (大家不会认为是我自己写的工具吧)

PSReadLinePowerShell 里用来 “增强命令行交互体验” 的组件(模块)。你可以把它理解成:给 PowerShell 的输入框加上更聪明的编辑器能力。

PSReadLine 支持:

  • 历史与搜索:支持 Ctrl + R 反向搜索历史命令,也能做 “按前缀翻历史”(输入 git 再按 ↑ 只找以 git 开头的历史)。
  • 智能补全 / 预测:根据你的历史记录(以及配置)在你输入时给出建议,减少重复敲命令。
  • 更好用的编辑体验:更顺手的光标移动、选中、剪切 / 复制、撤销等快捷键,输入长命令不再痛苦。
  • 可自定义键位和行为:你可以把常用操作绑定到自己习惯的按键上,甚至把补全、历史搜索的逻辑改成你想要的样子。

大家是不是已经等不及要安装了,安装非常简单,在 powellshell 中执行一行命令即可安装

Install-Module PSReadLine -Force

弹窗提示直接回车,等待安装完成。

提示:需要打开新的 shell 命令才会起作用哈。

展示效果

附录

VS Code 里把默认命令行设为 PowerShell

  1. Ctrl + Shift + P
  2. 输入并选择:Terminal: Select Default Profile
  3. PowerShell(一般会显示 PowerShellWindows PowerShell

📌 转载信息
原作者:
wangguodong
转载时间:
2026/1/14 10:22:05

第五代抽象

软件工程历史上的每一次重大转变都是由一种一致的力量驱动的:抽象的兴起。最早一代的软件是用原始机器代码编写的,后来汇编语言引入了可读性和控制层。更高级的语言已经跨越多个不同的范式发展,使得像 C、Java 和 Python 这样的通用语言及其衍生品得以发展。

 

这些语言使得抽象得以进步,其中像内存管理和特定平台的怪癖这样的概念在日常工作流程中被掩盖,并且由开发者代表进行处理。这种级别的可访问性允许更广泛的生态系统发展,因为随着每一代语言的出现,相应的支持工具链也在发展。 

图 1:编程语言的世代

 

第五代,即使用自然语言的第五代,长期以来一直是编程语言的目标演变,其中人类用他们的母语交谈,并且以可执行的方式进行解释。这种演变直到最近才真正成为主流。推动这一点的是人工智能(AI)的代际能力,现在已经成熟到可以接收以人为中心的输入,并用你选择的编程语言构建解决方案。几十年的学术研究记录了这一进化过程,博客也非正式地对此进行了讨论。

 

这些转变中的一个共同主题是开发人员角色的演变。每一次抽象提升都允许开发人员更多地关注意图,而不是机制,我们现在进入了另一个拐点。第五代不仅因为广泛使用生成式 AI 而加速,而且与行业主导的采用相吻合。这代表了开发者如何从根本上接近他们手艺的新纪元。

 

随着前几代的成熟,支持它的工具链也出现了。在前几代中,工具是在一段时期稳定后出现的;然而,随着 AI 研究和产出的快速发展,工具链现在有望塑造和定义这一代,而不仅仅是支持它。

 

作为这些进步的一部分,一套关键的工具出现了,集中在规范驱动开发(SDD)上。这种趋势是由 AI 辅助代码生成的接受所驱动的,它允许开发人员提升自己的抽象,并表达系统应该做什么,而智能工具则实现了它的实际完成方式。

 

这种转变重新定义了我们如何接近系统的架构和设计。现在,团队维护的是活的规范,而不是随着时间的推移而偏离原始意图的静态架构图。这些定义了系统契约、边界、不变量和行为。这些规范在设计上是可执行的;它们可以生成代码、文档、SDK、模拟甚至服务基础设施。AI 智能体,通过角色映射的能力来播种它们的上下文,其中角色的专业知识被捕捉为智能体的可消费输入,现在可以作为解释器、验证器和特定于领域的协作者行使权威。

 

在本文中,我们将 SDD 作为一种架构范例进行研究,详细说明规范如何成为系统的可执行支柱,漂移检测和持续验证如何将架构转变为运行时不变量,AI 和代理工具如何重塑生成和管理,以及这种模型如何代表软件抽象长期演变中的下一个主要拐点。

 

SDD 架构

规范驱动开发(SDD)这个名字可能暗示了一种方法论,类似于测试驱动开发。然而,这种框架低估了它的重要性。更准确的理解是,SDD 是一种架构模式,它通过将可执行规范提升到代码本身之上,从而颠倒了传统的事实来源。

 

SDD 代表了软件系统架构、治理和演变方式的根本转变。在技术层面上,它引入了一个声明性的、以契约为中心的控制平面,将规范重新定位为系统的主要可执行工件。相比之下,实现代码成为了次要的、生成的架构意图表示。

 

传统架构依赖于源代码作为规范的控制面。在 SDD 中,控制面向上移动到规范控制面。这个控制面正式允许我们定义诸如:

  • 接口契约(功能、输入/输出、行为保证)

  • 数据模式和不变量(结构、约束、验证规则)

  • 事件拓扑(允许的流、排序、传播语义)

  • 安全边界(身份、信任区域、策略实施)

  • 兼容性规则(包括向后和向前)

  • 版本控制语义(演进、降级、迁移)

  • 资源和性能约束(延迟、吞吐量、成本)

 

这一变化涵盖了跨行为和治理的经典体系结构表面区域的组合,并具有正确性的时间维度。SDD 不是独立地在服务和存储库之间协调这些领域,而是将它们集中到一个单一的权威模型中。这种模式更接近于语言类型系统或编译器:它不执行程序本身,而是定义了什么是可表达的,拒绝什么是无效的,并限制演变以保持随时间的正确性和兼容性。架构不再是咨询性的;它现在变得可实施和可执行。

 

尽管越来越多的工具被冠以 SDD 的标签,但从根本上说,它不是一个产品、框架或正式语言。相反,它是一个架构构造,以惊人的一致性作为一个五层执行模型重新出现。

 

以我们的订单管理服务为例,在规范层中,我们声明什么必须为真,而不是如何实现它。这是一个简单订单的伪规范可能看起来像:

 

图 2:SDD 5 层执行模型

 

这些层次共同构成了一个封闭的、由规范控制的控制系统,其中意图不断塑造执行,而执行不断地验证意图。由此产生的并不是对现有架构的渐进式改进,而是权威、控制和真实性所在位置的根本倒置。

 

现在让我们来看看这五个层次。在整个过程中,我们将遵循一个经典的订单管理服务的简化示例,以展示各层之间的进展以及它们是如何相互加强的。

 

规范层

这是系统行为的权威定义。它捕获了系统的声明性意图,而不是如何实现。这一层通常包含 API 模型、消息传递契约、领域模式和特定于系统、以策略为中心的约束。从抽象的角度来看,它既是人类可读的,也是机器可执行的,同时作为设计工件和操作控制面。

 

以我们的订单管理服务为例,在规范层,我们声明什么必须为真,而不是如何实现它。这是一个简单订单的伪规范可能的样子:

service: Ordersapi:     POST /orders:      request:               Order:                   id: uuid                   quantity: int > 0           responses:               201: OrderAccepted               400: ValidationError  policies:     compatibility:   backward-only     security:         auth: mTLS
复制代码

 

这个规范明确声明了我们的期望:

  • 订单必须是正数

  • API 不得引入破坏性变更

  • 请求必须经过认证

 

这里没有引用任何语言、框架或基础设施。

 

生成层

这一层将声明性系统意图转化为可执行的形式。它作为一个多目标系统编译器,但与发出机器指令的经典编译器不同,这一层发出系统形状和跨语言、框架和平台的可执行运行时界面。在这里,问题空间由规范层声明,工具将其操作形式具体化。典型的输出包括类型模型、契约存根、验证中间件、文档以及一系列集成和一致性测试。

 

以我们的订单示例为例,规范被摄取并发出可执行的系统表面。从概念上讲,这看起来像:

 

spec.yamlType models (Java, TypeScript)   → Request validators      → API stubs     → Contract tests
复制代码

 

工具将声明的意图转化为具体的、可执行的形式。

 

构件层

这一层包含了生成阶段的具体输出:生成的服务、组件、客户端、数据模型和适配器。关键的是,这些工件不被视为主要资产。相反,它们是可再生的、可丢弃的、可替换的,并且可以持续协调。这颠覆了传统软件架构的一个基本假设:代码不再是系统的记录;规范是。随着代码变得无限可复制和按需生成,新出现的术语环境代码恰如其分地抓住了这种范式转变。

 

我们的订单的形状现在可以用生成的一次性代码实现了。这可以看到类似于类型化模型的输出:

 

export interface Order{   id: string;   quantity: number; }With a validator:if (order.quantity <= 0) {    throw new ValidationError("quantity must be greater than zero"); }
复制代码

 

这些构件不是真相的来源。如果规范发生变化,它们将被重新生成。如果它们被删除,什么也不会丢失。

 

验证层

这一层强制执行意图和执行之间的持续一致性。它由契约测试、模式验证、有效载荷检查、向后兼容性分析和架构漂移检测机制组成。它在结构上扮演了编程语言的类型系统和管理程序对虚拟机所扮演的角色:积极防止架构违规传播到运行时。

 

我们的生成层创建的工件最终在这里进行管理,其中验证确保运行时不能偏离意图:

 

✓ Reject requests with quantity <= 0
复制代码

 

违规行为在构建时、部署期间以及我们的持续集成系统中被检测到。架构正确性是持续强制执行的,而不是手动审查的。

 

运行时层

这是操作系统本身,由典型的一系列构件组成,例如:

  • API

  • 消息代理和流处理管道

  • 函数、方法和等效结构

  • 集成服务

 

至关重要的是,运行时的形状完全受到上游规范和验证层的约束。因此,运行时行为在架构上是确定的,而不是涌现性的。

 

如果我们尝试在我们的订单服务使用负数量,如下所示:

 

POST /orders {   "id": "123",   "quantity": -1 }
复制代码

 

我们返回了一个 400 ValidationError,并不是因为运行时拒绝了请求,而是因为在系统执行任何请求之前,该行为在规范层中声明,由生成层具体化,由构件层实例化,并由验证层持续强制执行。

 

架构反转

几十年来,软件架构一直在一个基本上未受挑战的假设下运作,即代码是最终的权威。架构图、设计文档、接口契约和需求规范都是用来指导实现的。然而,运行中的系统总是从最终部署的内容中获得其真相。当出现不匹配时,标准的反应是“更新文档”。

 

SDD 完全颠覆了这种关系。规范成为系统现实的权威定义,实现是持续派生、验证的,并且在必要时重新生成以符合该真实性。这不是一个哲学上的区别;它是软件系统治理的结构性反转。

 

传统的软件交付遵循线性、有损失的管道,如图 3 所示。

图 3:传统的软件交付管道

 

每一步翻译都引入了重新解释、手动适应和隐藏的假设。因此,不能阻止架构漂移;它是在晚期被发现的,通常是通过生产事件、失败的集成、安全审计或合规性违规。当检测到不一致时,它是取证而不是纠正。

 

SDD 从根本上将这种流程重构为一个受控的控制循环:

图 4:SDD 受控的软件交付管道

 

这个控制循环用积极的架构强制执行取代了延迟发现。漂移检测不会修补运行时行为;它纠正规范权威,并触发系统的受控再生。传统架构假设代码随时间的推移成为事实;SDD 通过确保规范保持永久的事实来源,并且运行时持续被迫符合它,从而颠覆了这一点。

 

这种架构反转可以概括如下几点:

 

 

在 SDD 中,代码不再是真相出现的地方,而成为真相仅仅被实现的地方。

 

这种反转在结构上等同于早期的范式转变,即从人的责任中移除整个类别的正确性约束,并使其在机械上可执行:

  • 从手动内存管理到垃圾收集,内存安全成为运行时不变量

  • 从裸机到虚拟机,隔离和资源边界成为平台保证

  • 从物理服务器到声明性基础设施,其中配置漂移和拓扑正确性不断得到协调

  • 从无类型语言到静态类型系统,在编译时强制执行结构正确性

  • 从非正式的接口协议到模式和契约强制执行的 API,交互正确性被机械地验证

 

在每种情况下,正确性都从传统上由人类强制执行转变为由平台结构性强制执行。SDD 将这一原则应用于系统边界、架构和行为本身。

 

漂移检测:使架构自我强制执行

一旦规范成为权威,漂移检测不再是一种测试便利;它成为一种强制性的架构能力。它是将意图转化为不变性的执行机制。在这个模型中,漂移不仅仅是模式不匹配;它是声明的系统意图和观察到的系统行为之间的任何偏差。这种偏差可能是结构性的、行为性的、语义性的、与安全相关的或进化性的。我们在实验中遇到的一些例子包括:

  • 一个 API 返回了规范中未声明的字段

  • 一个服务在重构过程中默默地省略了必需的字段

  • 消息负载在没有协调的模式版本控制的情况下不断演变

  • 错误处理偏离了合同保证

  • 相对于最初的策略意图,安全范围正在退化

 

没有漂移检测,SDD 就会退回到文档驱动的开发。有了它,系统就变成了自我监管。漂移检测形成了一个闭环反馈控制系统。它不断地比较系统声称要做的事情和它实际做的事情。这与古典测试相比,后者只提供周期性的、基于样本的保证,是一种根本不同的操作姿态。

 

在传统架构中,意图的偏差会悄无声息地传播,通常数月之后才会以中断、审计失败或安全漏洞的形式显现出来。在 SDD 系统中,漂移变成了机器默认可以检测到的。规范验证器可以直接嵌入我们的 CI 管道中,运行时执行层:模式验证、有效负载检查、契约验证和规范差异引擎都成为了一等的架构组件。当输出违反规范时,系统会快速失败,并允许进行航向修正。

 

这种强制要求在一个固有的多模型未来中变得更加重要。软件系统将越来越多地受到人类驱动开发和机器驱动生成的影响,通常在同一规范表面上并行操作。系统中不再有单一的线性路径。更改可能来自开发者、AI 代理、自动化重构工具或政策驱动的生成器。这种进化路径的多样性极大地放大了漂移问题:分歧不再是边缘情况;它是必须持续治理的自然状态。

 

总体效果是治理方式的深刻转变。架构不再是设计阶段的产物;它变成了一个持续执行的运行时不变量。规范从被动的参考资料转变为主动的控制表面,漂移检测作为反馈信号,保持系统与意图一致。

 

然而,这并不意味着一个完全自主的系统,机器单方面定义正确性。规范不仅仅是一个机械合同;它是人类对目的、风险容忍度和权衡的表达。漂移检测可以识别系统已经偏离,但它不能单独决定这种偏离是可以接受的、偶然的还是可取的。一些漂移代表缺陷,而其他漂移代表进化。在这个边界上,当自动化执行遇到解释性判断时,人类的角色再次变得至关重要。不是作为失败后被动审查日志的审查者,而是作为治理意义、意图和受控变更的积极参与者。这就是 Human-in-the-Loop(人在循环中)不再只是一个安全网,而是一个一等的设计原则。

 

人在循环中:在自动化架构中保留意图

当我们最初探索这种系统设计模式时,我们以一种天真的“氛围编码”心态来接受生成的变化,最小化阻力,并信任 SDD 工具链为我们处理边缘情况。那个假设很快就失败了。取而代之的是一个更强大的认识:SDD 并没有将人类从循环中移除;它将人类判断重新定位到更高的控制层面。问题不再是人类如何实现系统,而是如何以及在哪里治理系统。

 

SDD 并没有消除人类在软件设计中的参与。它重新分配了人类认知的应用领域。传统上,一旦功能实现,开发人员就会花费大量的精力来解决不匹配、调试集成故障、协调分散的服务以及修复更改的意外副作用。随着时间的推移,这被错误地等同于软件工程本身的手艺。实际上,这是维护大型、长期、面向生产的系统的负担。SDD 将这个负担转移到机器上,同时故意保留人类对意图、策略和意义的权威。

 

这引入了一种新型的人机界面。人类仍然是领域语义、风险容忍度、安全范围和系统进化方向的最终守护者。这种权威也扩展到隐含地塑造工程决策的法律、伦理和道德框架中。这些维度不能仅从执行跟踪或行为观察中推断出来。它们存在于机器无法完全拥有的抽象层次上。

 

相反,人类将这些约束明确编码到规范层中,机器承担起执行、生成和持续一致性的责任。这反映了我们技术的历史演变:就像我们曾经将手动内存管理交给垃圾收集一样,我们现在正在将结构性执行和机械一致性委托给 SDD。取代这种委托的不是盲目的自动化,而是明确的审批边界:

  • 破坏模式更改需要人工批准

  • 策略转变需要人工授权

  • AI 提出的重构需要人工确认

  • 兼容性降级需要人工解释

 

因此,SDD 实现了有限的自主性,而不是完全自动化,并且在这些限制内,长期架构意图可以得以保留。

 

通过强制漂移检测和人工意图监督,SDD 在人和机器之间建立了新的责任分工。执行变得自动化。意义仍然是人类的。这种分离不是哲学上的;它是架构上的,正是这种分工产生了一类新的基础设施能力。一个的规范原生系统现在必须将执行、演化、验证和治理直接编码到其核心原语中。我们接下来探讨这些能力,以及它们为什么在结构上与经典软件架构中的能力不同。

 

规范原生系统的核心能力

SDD 不是由单一工具、框架或平台启用的。它源于一组紧密耦合的架构能力,这些能力共同允许规范变得可执行、可强制和可扩展。当这些能力中的任何一个缺失时,SDD 就会退回到文档驱动开发或临时代码生成。要从理论进入操作范式,系统必须内化五个核心能力:

  1. 规范编写作为一等工程表面

  2. 正式验证和类型强制

  3. 确定性生成和组合

  4. 持续的一致性和漂移执行

  5. 受控演化和兼容性控制

 

我们将这种操作规程称为 SpecOps,即规范操作。从 SpecOps 的角度来看,规范被视为一等的、可执行的系统资产,这些能力并没有定义一个产品类别;它们代表了软件意图的控制平面。在规范原生系统中,规范编写不是在实现之前进行的活动;它就是实现活动。因此,系统必须支持多模型规范,其中结构、行为和策略定义共存于统一的模式空间内。这需要可组合的领域建模,使得分层规范成为一种可行的架构策略,而不是文档便利。

 

随着规范成为主要的系统构件,它们必须像源代码一样被严格地处理:版本控制、同行评审、分支和受控合并策略都要是强制性的。此时,规范不再是描述性的,而是成为系统本身的可编程模型。

 

一旦规范是可执行的,它还必须是机器可验证的,就像编译器前端或类型系统一样严格。这种执行涵盖了结构验证、语义一致性和领域不变性执行。条件约束、引用完整性和跨规范一致性必须是可证明的。效果不仅仅是提高了正确性,而是从可以表示的所有内容的空间中消除了整个类别的系统故障,就像静态类型限制非法程序一样。

 

在这个范式中,生成不是脚手架的一种形式。它是声明的系统真理的具体化。这需要严格确定性行为。一个生产级别的规范原生系统必须保证输入的确定性:相同的规范总是产生相同的构件。它必须是目标无关的,跨语言、平台和运行时环境产生一致的输出。最关键的是,生成必须是逻辑可逆的。系统必须始终能够回答一个简单但基础的问题:哪个规范状态产生了这种行为?这种决策的谱系可追溯性是将生成从生产力辅助提升到架构权威的关键。

 

一旦生成自动化,执行就必然变得连续。运行时系统不能再悄悄地偏离声明的意图。实现不能引入未记录的行为。消费者不能依赖于未定义的属性。因此,架构从设计时断言转变为运行时不变性,由系统本身积极维护。

 

SDD 中最困难的能力不是生成或验证,而是不断裂的更改。规范原生系统必须自动将更改分类为添加性、兼容性、破坏性或模糊性,并执行明确的兼容性策略。这引入了受控演化的正式概念:需要并行版本表面、已知的兼容性窗口、受控的弃用曲线和用于破坏性更改的显式批准门。没有这个,SDD 在架构上就会变得脆弱。有了它,系统可以在不违反自己的正确性保证的情况下进行演化。

 

这五个能力引入的最深刻的转变不是技术上的;它是结构上的。

 

交付的单元不再是服务或代码库。交付的单元变成了规范本身。这将结果与产出重新对齐:声明的是什么,交付的就是什么。这与以氛围驱动、生成性编码方法形成鲜明对比,在这些方法中,偏差是创造力(或幻觉)的涌现属性,而不是设计中受控的行为。

 

结论:存在的工程权衡和挑战

软件工程中每一次重大的抽象飞跃都带来了非凡的生产力提升,同时引入了全新的系统性风险类别。垃圾收集消除了大量内存错误,同时引入了暂停时间行为和新的故障模式。虚拟机简化了部署,同时增加了业务编排的复杂性。云平台消除了基础设施负担,同时引入了深层操作耦合。规范驱动开发也不例外。

 

通过将系统的真实来源提升到规范和生成器中,SDD 并没有消除复杂性;它只是简单地重新定位了复杂性。下面的权衡定义了我们在大规模采用这种范式时所经历的真实工程成本。

 

规范成为主要的复杂性表面

在 SDD 中,规范不再是文档构件,而是成为长期存在的可执行基础设施。因此,它们获得了传统上与源代码相关的属性。它们继承了通常与源代码相关的所有属性:技术债、跨团队耦合、兼容性惯性和架构引力。因此,模式工程成为了与数据建模和分布式系统设计同等重要的一级架构学科。

 

生成器信任成为供应链问题

在 SDD 中,AI 代码生成器不再是开发者的便利工具。它们成为系统可信计算基础的结构组件。确定性、可重复性、可审计性、沙箱执行和可验证的出处不再是可选属性;它们是强制性的。代码生成从工具提升为关键基础设施。

 

运行时执行有实际成本

SDD 将执行从社会过程转移到技术控制。这种转变是强大的,但不是免费的。运行时契约验证引入了实际的计算开销。在小规模上,这个成本是微不足道的。在大规模上,我们需要考虑系统的目的,无论是高频 API、实时流还是对延迟敏感的系统。这成为了一个明确的架构预算项目。正确性成为了计量资源,而不是默认的免费属性。

 

认知转变非同小可

SDD 用契约优先推理取代了实现优先的思维。这要求工程师采用新的心智模型:

  • 用不变量而不是行为来思考

  • 关于兼容性而不是功能的推理

  • 用声明式而不是过程式表达意图

  • 将模式视为可执行程序

 

历史上每一次抽象的转变都扩大了人类的影响力,同时引入了不熟悉的失败模式,需要多年才能掌握。SDD 现在正进入相同的成熟曲线。

 

架构权威的价格

虽然新的范式转变通常令人兴奋,但最终是否采用这一转变归结于平衡所涉及的实际权衡。

 

一方面,SDD 提供了:

  • 架构确定性

  • 持续的正确性执行

  • 系统性减少漂移

  • 多语言平价

  • 可复制的系统边界

 

但它以以下代价:

  • 模式复杂性

  • 生成器信任要求

  • 运行时验证成本

  • 长期兼容性负担

  • 工程角色的认知转变

 

这不是避免 SDD 的理由。这是一个有意识地采用它的理由,要有明确的治理、有纪律的规范实践,以及对其成本的清醒认识。每一次抽象的飞跃都需要新的严谨形式。

 

SDD 只是将这种严谨重新定位到它一直属于的地方:系统真理本身的定义。

 

原文链接:

https://www.infoq.com/articles/spec-driven-development/

跳出「黑盒」,人大刘勇团队最新大语言模型理论与机理综述

0%
icon展开列表
跳出「黑盒」,人大刘勇团队最新大语言模型理论与机理综述
今天
img
百川开源全球最强医疗大模型M3,「严肃问诊」定义AI医疗新能力
今天
img
相约AAAI 2026 | 上海AI实验室北极星 X 星启交流会(报名开启)
01月13日
img
视觉模型既懂语义,又能还原细节,南洋理工&商汤提出棱镜假说
01月13日
img
无需重新训练,即可学习新任务,Arc研究所开源单细胞基础模型Stack及细胞反应全景图谱
01月13日
img
不上云、不租卡,如何优雅地在本地微调Qwen-VL-30B?
01月13日
img
OpenAI的首款硬件:是AI耳机,今年销量要冲5000万
01月13日
img
华为推出软工代码智能体SWE-Lego,解锁SFT训练极致性能
01月13日
img
大模型中标TOP10里的黑马:中关村科金的应用攻坚之道
01月13日
img
刚刚,梁文锋署名开源「记忆」模块,DeepSeek V4更细节了
01月13日
img
一个模型统一4D世界生成与重建,港科大One4D框架来了
01月13日
img
端到端智驾的算力困局,九章智算云这样破局
01月12日
img
真香!刚骂完AI,Linux之父的首个Vibe Coding项目上线
01月12日
img
引入几何约束后,VLM跨越了「空间推理」的认知鸿沟
01月12日
img
清华等团队用AI驱动百万倍速药物筛选,一天内十万亿次扫描的超高速虚拟平台
01月12日
img
2026年,大模型训练的下半场属于「强化学习云」
01月12日
img
顶尖AI竟输给三岁宝宝,BabyVision测试暴露多模态模型硬伤
01月12日
img
AAAI 2026 Oral|快手提出全新「检索数据引擎」CroPS,打破搜索信息茧房
01月12日
img
被Jim Fan点赞!全球第一的千寻智能Spirit v1.5正式开源!
01月12日
img
Sakana让AI互相「猎杀」,而它们开始了趋同进化
01月11日
img

跳出「黑盒」,人大刘勇团队最新大语言模型理论与机理综述

图片

大语言模型(LLMs)的爆发式增长引领了人工智能领域的范式转移,取得了巨大的工程成功。然而,一个关键的悖论依然存在:尽管 LLMs 在实践中表现卓越,但其理论研究仍处于起步阶段,导致这些系统在很大程度上被视为难以捉摸的「黑盒」。

为了打破这一僵局,中国人民大学的研究者们采用了一种统一的基于生命周期的分类法,将 LLM 理论研究整合为六个阶段:数据准备、模型准备、训练、对齐、推理和评估。

本文系统综述了驱动 LLM 性能的底层理论与机制,深入分析了数据混合的数学依据、不同架构的表示极限以及对齐算法的优化动力学,并指出了合成数据自我提升、安全保证数学边界等前沿挑战。本综述旨在为 LLM 发展从工程启发式方法向严谨科学学科的转型提供结构化路线图。

图片
  • 论文标题:Beyond the Black Box: Theory and Mechanism of Large Language Models

  • 论文链接:https://arxiv.org/abs/2601.02907

引言

近年来,ChatGPT、DeepSeek、Llama、Claude 等模型的涌现标志着 AI 领域的深刻变革。随着系统规模的扩大,LLMs 展现出类似人类推理的行为,正改变着人类与信息交互的方式。然而,正如核物理的发展经历了从爱因斯坦的质能方程到原子弹爆炸的 40 年跨度,AI 领域的理论与应用同步也存在显著滞后。

尽管工程上取得了巨大成功,LLM 的理论理解仍面临两大挑战:一是规模带来的前所未有的数学复杂度;二是模型展现出的诸多「涌现」现象(如幻觉、涌现能力、Scaling Laws 等)难以在统一框架下解释。

为了解决研究碎片化的问题,来自中国人民大学高瓴人工智能学院的研究团队发布了最新综述论文 《Beyond the Black Box: Theory and Mechanism of Large Language Models》。本文不仅是一份文献索引,更是一份试图将 LLM 研究从 「工程启发式」推向「严谨科学」的路线图。

本综述提出了涵盖六大阶段的生命周期路线图。

图片

      图表 1: 大语言模型理论与机制路线图。

LLM 理论与机制的六大阶段

数据准备阶段 (Data Preparation):探讨如何保证更好的数据利用率,并量化数据特征对模型最终能力的影响,分析数据混合策略 (Data Mixture)、去重与过滤机制以及记忆 (Memorization) 与模型能力之间的关系。

模型准备阶段 (Model Preparation):从理论上评估架构能力,理解 Transformer 结构的表示能力极限、优化景观(如「河谷」假设)以及从展开优化视角设计新架构。

训练阶段 (Training):研究简单的学习目标如何锻造出复杂的涌现能力,分析 Scaling Laws 的本质、预训练的获益机制以及参数高效微调(PEFT,如 LoRA)的机制。

对齐阶段 (Alignment):探讨鲁棒对齐是否在数学上可实现,分析 RLHF(的动力学,研究「超级对齐」(Superalignment)与「弱到强泛化」 (Weak-to-Strong Generalization)。

推理阶段 (Inference):解密冻结权重的模型如何在测试时模拟学习与算法执行,分析提示工程 (Prompt Engineering)、上下文学习 (In-Context Learning) 的机制以及推理时扩展 (Inference-Time Scaling) 带来的推理能力提升。

评估阶段 (Evaluation):从理论上定义与衡量复杂的、主观的人类价值观,探讨基准测试的有效性、LLM-as-a-Judge 的可靠性以及安全性与透明度的形式化保证。

各个阶段代表性的研究内容如下所述。

1 数据准备阶段:智能的基础

图片

      图表 2: 数据准备阶段的理论概览。

数据准备不仅仅是工程上的设计,而是决定模型能力的基石。研究者们从三个维度剖析了数据的理论机制:

  • 数据混合的数学逻辑:研究者利用多源学习视角,证明了当多任务结构共享时,泛化界限不再取决于模型海量的原始参数,而是取决于总压缩编码长度。通过引入「数据混合定律」(Data Mixing Laws),小规模实验拟合验证损失函数,实现对大规模混合策略性能的预先计算。最终,研究者们使用各种不同的理论框架,动态寻找最优数据混合权重的前沿方法。

  • 去重与过滤的理论保障:实证研究确认了去重能直接减少不必要的记忆,从而降低隐私风险。各种理论框架证明了高质量、高信息密度的网页数据甚至能超越人工精选语料。

  • 记忆机制的量化分析:模型对数据的记忆并非简单的「死记硬背」。理解这种记忆机制是平衡知识获取与隐私保护的关键。研究者们认为模型通过整合模糊重复序列形成复杂记忆,也揭示了熵与记忆之间的相关性。

此外,这一阶段也存在着重要的前沿开放问题:

  • 合成数据与自主进化:合成数据能否为模型带来理论上的性能提升?模型是否能够通过生成合成数据从而实现自主进化?

  • 数据污染:训练与测试数据的泄漏为 LLM 的隐私问题带来了挑战,能否从理论上规避或者缓解这一问题?

2 模型准备阶段:架构的表示极限

图片

      图表 3: 模型准备阶段的理论概览。

选择何种模型架构不仅关乎效率,更决定了信息的表示上限。研究者们通过以下视角探讨了架构的本质:

  • 表示能力的边界:研究者们探讨了 Transformer 作为通用逼近器的数学证明,并分析了在无限精度下 Transformer 的图灵完备性。通过电路复杂度(Circuit Complexity)理论,研究者分析了 Transformer 等架构在处理层级结构语言时的表达上限与下限,揭示了模型宽度如何成为函数组合能力的通信瓶颈。

  • 优化景观的几何特性:研究者们提出了诸如「河谷(River Valley)模型」等假设,解释了 Warmup-Stable-Decay 类学习率调度如何引导参数在复杂的函数空间中跨越「山坡」并在「河床」方向高效前进。

  • 理论驱动的架构设计:从「展开优化(Unrolled Optimization)」和「测试时训练(TTT)」的视角,研究者将网络层等效为优化算法的迭代步骤,为理解前沿的模型架构提供了统一框架。

除此之外,研究者们也在关注模型架构的演进,并从理论视角对新架构进行设计与分析:

  • 线性注意力模型:线性递归模型在提升效率的同时,是否存在无法逾越的表示瓶颈(如关联回想能力的缺失)?

  • 循环模型与隐式推理:权重共享的循环架构是否能通过增加推断深度,在更少的参数量下实现更强的泛化?

3 训练阶段:模型能力的锻造炉

图片

      图表 4: 训练阶段的理论概览。

训练阶段将静态架构转化为具备智能的实体。研究者们对预训练和微调的机制进行了深入解构:

  • 预训练的收益机制:研究者论证了预训练本质上是学习数据的底层上下文结构,并提出了「压缩即智能」的观点,认为语言模型的目标是实现对海量数据的无损压缩。从信息论视角出发,论证了 LLM 作为强大的无损压缩器,其压缩效率与下游任务性能之间存在强线性关系。

  • Scaling Laws 的本质:通过对计算、数据和参数规模的幂律关系分析,研究者探讨了能力「涌现」背后的连续性过程,并分析了流形假设下内在维度如何决定缩放指数。

  • 微调的数学保障:针对 LoRA 等 PEFT 技术,研究者分析了其在低秩子空间中的优化动力学,证明了低秩适配器在对齐预训练特征梯度方面的有效性,并揭示了权重初始化(如 A 随机、B 置零)对收敛稳定性的关键影响。

此外,这一阶段也存在着优化层面的前沿探索:

  • 超参数迁移:如何实现在小规模模型上寻找的最优超参数,能够「零样本」地直接应用于万亿级模型?

  • 优化算法的演进:除了 Adam 等一阶优化器,矩阵敏感型优化器(如 Muon)如何利用 Hessian 结构的块对角特性加速收敛?

4 对齐阶段:安全与价值的数学边界

图片

图表 5: 对齐阶段的理论概览。

对齐不仅是指令遵循,更是人类价值观的注入。研究者们从安全性与动力学视角进行了审视:

  • 对齐的理论基础:研究者分析了安全对齐的数学边界,探讨了现有对齐方法是否只是「浅层防御」,以及对齐后的模型是否存在回复原始分布的「弹性」。研究者认为只要有害行为的概率不被完全消除,通过对抗性提示触发违规行为在数学上是不可避免的。

  • 弱到强泛化(W2SG):在超智能时代,弱监督者如何可靠地控制强受训者?研究者从偏差 - 方差分解等视角,分析了强模型纠正弱信号错误的机制,并界定了泛化增益。

  • 强化学习的作用:研究者探讨了 RL 是激活了预训练中的潜在模式(如代码能力、数学推理能力),还是通过长期的策略复位真正扩张了推理边界。同时量化了对齐与预训练知识保持之间的权衡,并从变分信息瓶颈视角提出了缓解「Reward Hacking」的方法。

此外,对齐阶段还面临着深层次的开放挑战:

  • 训练与对齐的关系:SFT 和 RL 在塑造模型行为上有何本质区别?为什么 RL 在泛化性上通常优于简单的行为克隆?

  • RL 的前沿疆界:在缺乏验证器的开放领域,如何设计高效的奖励信号?

5 推理阶段:解密静态模型的前向过程

图片

      图表 6: 推理阶段的理论概览。

推理是释放模型潜力的关键环节。研究者们解密了大模型推理中的「思维」过程:

  • 提示工程与机制分析:研究者从任务重参数化角度理解 Prompt,利用 Token 分布动力学和归纳头(Induction Heads)机制,剖析了 Prompt 如何引导模型内部的信息路由。

  • 上下文学习(ICL)的机制:研究者对比了「算法执行」与「任务定位」两种观点,探讨了 Transformer 是否在推断时隐式地运行了优化算法。

  • 推理时扩展(Inference-Time Scaling):研究者分析了 CoT 如何作为模型的 「深度扩展器」,证明思维链能显著提升 Transformer 的计算复杂度上限,并探讨了搜索算法如何通过外部计算换取推理质量。

此外,推理阶段也暴露了一些特殊的理论现象:

  • 过度思考(Overthinking):在推理时投入更多计算资源是否总是正向的?模型为何会在简单问题上陷入冗余推理?

  • 隐式推理(Latent Reasoning):模型能否在不输出显式 Token 的情况下,直接在隐空间中完成多路径的思维并行?

6 评估阶段:从基准测试到形式化保证

图片

      图表 7: 评估阶段的理论概览。

评估是大模型进步的标准,但当前的评估手段正面临严峻挑战:

  • 基准测试理论:研究者利用不同的理论框架分析了传统基准测试的饱和问题与捷径学习现象,并剖析了「LLM-as-a-Judge」模式中的系统性偏见。

  • 安全性与透明度:研究者深入探讨了可解释性(如 Sparse Autoencoders),对模型内部特征进行解构,并利用计算不可解性证明了在任何可计算的 LLM 中,幻觉都是不可消除的理论必然。

  • 抗误用机制:研究者通过水印(Watermarking)等技术,探讨了识别 AI 生成内容与保持文本质量之间的理论权衡。

此外,评估阶段也催生了关于模型内部表示的深刻讨论:

  • 线性表示假设:语义概念(如真实性)在模型潜空间中是否真的以线性方向编码?

  • 推理失效模式:如「逆转诅咒(Reversal Curse)」和「位置偏差(Lost-in-the-Middle)」,这些失败案例揭示了自回归模型在逻辑对称性上的本质缺陷。

结语:迈向 AGI 的未来

尽管我们已经迈出了从经验迈向科学的第一步,但随着 LLM 的不断发展,更多的前沿理论问题依然亟待解决。正如爱因斯坦所言:「科学的伟大目标是用最少数量的假设或公理推导出最大数量的经验事实。」我们希望为社区提供一份结构化的 LLM 理论研究路线图,共同揭开黑盒背后的真理。

作者介绍

刘勇,中国人民大学,长聘副教授,博士生导师,国家级高层次青年人才。长期从事机器学习基础理论研究,共发表论文 100 余篇,其中以第一作者 / 通讯作者发表顶级期刊和会议论文近 50 篇,涵盖机器学习领域顶级期刊 JMLR、IEEE TPAMI、Artificial Intelligence 和顶级会议 ICML、NeurIPS 等。获中国人民大学「杰出学者」、中国科学院「青年创新促进会」成员、中国科学院信息工程研究所「引进优青」等称号。主持国家自然科学面上 / 基金青年、北京市面上项目、中科院基础前沿科学研究计划、腾讯犀牛鸟基金、CCF - 华为胡杨林基金等项目。

甘泽宇,中国人民大学高瓴人工智能学院博士研究生,本科及硕士研究生毕业于中国人民大学信息学院。当前主要研究方向包括大模型机理分析。

大家好,我是咕咚。

以前写技术博客,插入图片绝对是最烦的事之一。

流程大概是:

  1. 截图 / 导出图片
  2. 打开浏览器,登录图床
  3. 拖拽上传
  4. 等待上传完成
  5. 复制图片链接
  6. 回到编辑器,粘贴链接

一遍两遍还好,写一篇长文章要插入十几张图片,真的会让人崩溃。


现在的方案

最近在玩 Claude Code,发现它的技能系统特别好玩。

简单说,Claude Code 是 Anthropic 官方的 CLI 工具,你可以在终端里直接和 Claude 对话来编程。它的技能系统允许用户自定义功能扩展。

于是我就写了一个小技能:Image Publisher

把这个流程简化成一句话:

"上传图片 ~/Desktop/screenshot.png"

就这。完事。


功能介绍

Image Publisher 是一个 Claude Code 技能,让你用一句话就能上传图片到图床。

支持的图床:

  • GitHub 图床(免费,自带 jsDelivr CDN )
  • S3 兼容存储(七牛、阿里云 OSS 、腾讯云 COS 等)

特点:

  • 专注:只做图片上传
  • 简单:配置一次,永久使用
  • 开源:MIT 许可,随便改随便用
  • 集成:和 Claude Code 无缝集成


怎么用

git clone https://github.com/maoruibin/image-publisher.git
cp -r image-publisher ~/.claude/skills/
cd image-publisher
cp .env.example .env
# 编辑 .env 配置你的图床信息

然后在 Claude Code 里说:

我:上传图片 ~/Desktop/screenshot.png

Claude:上传成功!
     https://cdn.jsdelivr.net/gh/user/repo@master/images/screenshot.png


关于 AI 时代的一点思考

以前我要做图床,得开发一个 APP (咕咚云图就是我当时做的)。

现在有了 AI ,只需要写一个技能就够了。

不是写代码,是写"能力"。

这个感觉很奇妙。


项目地址

GitHubhttps://github.com/maoruibin/image-publisher

如果觉得有用,给个 Star ⭐️

有问题欢迎交流!

演示效果图


标签建议

#工具 #Claude #AI #开源 #GitHub