1
0

完成uv运行python代码的skill

This commit is contained in:
2026-02-04 18:48:19 +08:00
parent 9b7342825b
commit 8ee22c3944
28 changed files with 883 additions and 3697 deletions

View File

@@ -0,0 +1,2 @@
schema: spec-driven
created: 2026-02-04

View File

@@ -0,0 +1,234 @@
## Context
当前项目中还没有skill实现需要创建第一个skill来指导大模型使用uv运行Python脚本。该项目专门用于开发大模型工具技能所有skill都放在`skills`目录下每个子目录代表一个skill。
Python环境管理是一个常见问题大模型在处理各种任务时经常需要执行Python脚本数据分析、API测试、文件操作等传统做法需要在系统Python环境预安装依赖导致环境污染、版本冲突等问题。
uv是Astral开发的快速Python包管理器支持PEP 723内联元数据格式可以在脚本中声明依赖并在隔离环境中执行自动管理虚拟环境和依赖安装。这为解决环境隔离问题提供了标准化的解决方案。
**约束条件:**
- skill文件遵循特定格式YAML前置元数据 + Markdown内容
- skill必须是指导型的不直接执行代码
- 不支持命令行参数或stdin输入
- 不支持持久化环境
- 严格错误处理模式
- 必须支持Windows、macOS、Linux三个平台的临时目录处理
**利益相关者:**
- 大模型需要清晰的模式指导来生成符合规范的Python脚本
- 最终用户通过大模型获得环境隔离的Python执行能力
## Goals / Non-Goals
**Goals:**
- 创建指导大模型使用uv执行Python脚本的通用skill
- 提供符合PEP 723规范的脚本编写模式
- 确保环境隔离不污染系统Python环境
- 严格错误处理,任何错误都停止并给出清晰提示
- 临时文件使用系统目录,系统自动清理
- 适用于任何Python可处理的任务数据处理、API交互、文件操作等
- 支持Windows、macOS、Linux跨平台自动适配临时目录
**Non-Goals:**
- 不直接执行用户提供的Python代码只指导大模型
- 不支持命令行参数传递给脚本
- 不支持从stdin读取输入
- 不支持持久化虚拟环境(每次都是临时隔离环境)
- 不支持自定义Python版本约束使用uv默认版本
- 不支持复杂的依赖版本约束解析
- 不处理动态import语句
## Decisions
### Decision 1: 技能定位为指导型而非执行型
**决策:** skill提供指导模式和最佳实践不直接执行Python代码。
**理由:**
- skill的主要用户是大模型而不是最终用户
- 大模型需要理解"如何用uv执行"的模式和规范
- 保持skill的通用性可以适应各种任务场景
**替代方案考虑:**
- 执行型skill直接接收Python代码并执行
- ❌ 需要处理更多边界情况(代码注入、安全性等)
- ❌ 限制了灵活性(无法指导大模型编写更复杂的脚本)
- ❌ 增加了复杂度
### Decision 2: 使用辅助脚本实现跨平台临时目录
**决策:** 创建`skills/uv-python-runner/script/get_temp_path.py`辅助脚本使用Python标准库的`tempfile`模块在系统临时目录中创建空的Python脚本文件并返回脚本文件路径。**辅助脚本本身也使用uv run执行保持一致性。**
**理由:**
- `tempfile.gettempdir()`自动适配所有平台Windows/macOS/Linux
- 避免了大模型需要检测平台和记住不同路径的复杂度
- 辅助脚本直接创建临时Python脚本文件大模型直接得到脚本文件路径
- 简化大模型工作流:无需拼接路径,直接使用返回的文件路径写入内容
- 使用Python标准库保证跨平台兼容性
- 辅助脚本可以复用,逻辑集中管理
- **使用uv run执行辅助脚本保持skill内所有Python脚本使用统一方式**
**辅助脚本设计:**
- **功能**在系统临时目录创建空的Python脚本文件返回文件路径
- **无注释**:脚本只包含必要代码,没有文档字符串或注释
- **PEP 723格式**:包含空的依赖声明`# dependencies = []`
- **执行方式**`uv run skills/uv-python-runner/script/get_temp_path.py`
- **输出**直接在stdout输出临时Python脚本文件的完整路径
- Linux/macOS: `/tmp/uv_script_xxx.py`
- Windows: `C:\Users\<username>\AppData\Local\Temp\uv_script_xxx.py`
**大模型使用流程:**
1. 调用辅助脚本获取临时脚本文件路径(使用相对路径`./script/get_temp_path.py`相对于SKILL.md所在目录
```bash
temp_file_path=$(uv run ./script/get_temp_path.py)
```
2. 在返回的脚本文件路径中直接写入PEP 723脚本内容
```python
# 使用大模型的Write工具
with open(temp_file_path, 'w') as f:
f.write(script_content)
```
3. 使用`uv run`执行脚本:
```bash
uv run $temp_file_path
```
4. 系统自动清理临时文件,无需手动管理
**替代方案考虑:**
- 在辅助脚本中导出函数供导入:
- ❌ 需要大模型导入模块并调用函数,增加了复杂度
- ❌ 辅助脚本需要更多代码(函数定义、文档等)
- ❌ 不符合"简单直接"的设计原则
- 在skill文档中说明平台差异
- ❌ 大模型需要检测平台,容易出错
- ❌ 文档冗长,增加了复杂度
- ❌ 不符合"简化使用模式"的设计目标
### Decision 3: 依赖声明使用无版本约束的包名
**决策:** 在PEP 723元数据块中只声明包名不指定版本约束让uv自动选择兼容的最新版本。
**理由:**
- 简化依赖声明,降低大模型的认知负担
- uv的依赖解析器会自动选择兼容版本
- 使用最新版本通常更安全(包含安全修复)
- 避免版本固定带来的兼容性问题
**替代方案考虑:**
- 固定版本号(如`pandas==2.1.0`
- ❌ 需要大模型了解每个包的最新版本
- ❌ 版本过时可能引入安全漏洞
- ❌ 可能与其他包产生版本冲突
- ❌ 增加维护成本
### Decision 4: 严格错误处理模式
**决策:** 任何错误条件都停止任务并显示清晰错误消息。错误类型包括uv未安装、Python语法错误、依赖解析失败、脚本运行时错误。
**理由:**
- 严格模式符合skill作为工具的定位可靠、可预测
- 避免错误传播导致难以调试的问题
- 清晰的错误消息帮助大模型和用户快速定位问题
- 保留失败的临时文件便于调试
**替代方案考虑:**
- 宽松模式(跳过错误包继续执行):
- ❌ 可能导致部分依赖缺失的脚本执行
- ❌ 错误难以定位和调试
- ❌ 不符合"可靠工具"的设计目标
### Decision 5: 无外部输入支持
**决策:** 所有输入、参数和数据源都嵌入在Python脚本内部。不支持命令行参数和stdin输入。
**理由:**
- 简化skill的使用模型
- 符合大模型生成脚本的使用模式(大模型知道所有参数)
- 避免参数传递的复杂度和安全风险
- 保持脚本的完整性和可移植性
**替代方案考虑:**
- 支持命令行参数:
- ❌ 增加skill复杂度需要参数传递机制
- ❌ 脚本可能依赖外部输入而不可移植
- ❌ 不符合"所有逻辑嵌入脚本"的设计目标
### Decision 6: 通用任务适用性
**决策:** skill不限制在特定领域适用于任何Python可处理的任务。在文档中提供常见用例示例数据分析、API交互、文件操作等但不硬编码限制。
**理由:**
- 最大化skill的复用性
- Python的适用范围很广不应预先限制
- 通过示例而非硬编码来引导使用
**替代方案考虑:**
- 针对特定领域(如只支持数据分析):
- ❌ 限制了skill的通用性
- ❌ 可能需要多个类似skill覆盖不同场景
- ❌ 违反"通用工具"的设计目标
## Risks / Trade-offs
### Risk 1: uv依赖外部可用性
**风险:** 技能依赖uv包管理器如果系统未安装uvskill无法工作。
**缓解措施:**
- 错误消息中提供清晰的uv安装链接
- 在skill文档中明确说明uv是必需依赖
- 提供uv安装指南https://docs.astral.sh/uv/getting-started/installation/
### Risk 2: 临时文件
**风险:** 临时文件存储在系统临时目录(/tmp 或 Windows Temp磁盘空间占用。
**缓解措施:**
- 临时文件使用系统标准临时目录,系统会自动定期清理
- 文件名包含时间戳,便于识别
- 在失败时显示文件路径,方便用户手动删除
### Risk 3: 依赖解析时间
**风险:** 首次执行某个脚本时uv需要下载和安装依赖可能需要较长时间影响用户体验。
**缓解措施:**
- 在文档中说明首次执行可能较慢
- uv的依赖解析和安装速度很快比传统pip快10-100倍
- 使用最新版本通常减少兼容性问题,加快解析速度
### Risk 4: PyPI包可用性
**风险:** 如果声明的依赖包在PyPI上不存在或名称错误依赖解析会失败。
**缓解措施:**
- 严格错误处理模式会显示uv的完整错误输出
- 大模型在编写脚本时已经知道依赖的包名
- 保留失败的临时文件便于检查依赖声明
### Risk 5: 大模型理解复杂度
**风险:** PEP 723元数据格式对大模型来说可能不熟悉可能生成不符合规范的脚本。
**缓解措施:**
- skill文档提供清晰的示例和模板
- 严格错误处理会在语法或格式错误时立即停止并提示
- 文档中说明常见的格式错误和修正方法
## Migration Plan
这是新skill的首次实现不存在迁移问题。
**部署步骤:**
1. 创建skill目录`skills/uv-python-runner/`
2. 创建skill文件`skills/uv-python-runner/SKILL.md`
3. 编写skill内容YAML元数据 + Markdown文档
4. 测试skill是否可以被正确加载和触发
**回滚策略:**
- 如有问题,直接删除`skills/uv-python-runner/`目录即可
- skill文件不影响系统或现有代码
## Open Questions
无。所有设计决策已在上述章节明确说明。

View File

@@ -0,0 +1,41 @@
## Why
大模型在处理任务时经常需要执行Python脚本数据分析、API测试、文件处理等传统的做法需要在系统Python环境中预安装依赖包这会导致
- 环境污染:不同任务的依赖可能冲突
- 版本混乱:无法确保依赖版本一致性
- 系统依赖:必须在操作系统级别安装所有可能的包
使用uv的PEP 723内联元数据格式可以让每个脚本自带依赖声明并在隔离环境中执行从根本上解决这些问题。
## What Changes
- 创建新的skill`uv-python-runner`
- 指导大模型按照PEP 723规范编写Python脚本
- 提供临时文件创建和uv run执行的标准流程
- 严格错误处理模式
- 临时文件使用系统目录,系统自动清理
- 技能特性:
- 通用型工具适用于任何Python可处理的任务
- 无需预安装依赖uv自动管理隔离环境
- 使用临时文件,系统自动清理
- 简单返回值stdout/stderr
- 不支持命令行参数或stdin输入
## Capabilities
### New Capabilities
- `uv-python-runner`: 通用Python脚本执行工具指导大模型使用uv的隔离环境特性来执行临时Python脚本无需在系统环境预安装依赖。适用于数据处理、API交互、文件操作、科学计算等各种任务。
### Modified Capabilities
## Impact
- **代码影响**新增skill文件 `skills/uv-python-runner/SKILL.md`
- **依赖影响**要求系统安装uvhttps://docs.astral.sh/uv/
- **系统影响**skill只提供指导不直接修改系统
- **API影响**:无
- **用户影响**大模型在需要执行Python脚本时会使用此skill生成符合PEP 723规范的代码并使用uv执行提升环境隔离和依赖管理的可靠性

View File

@@ -0,0 +1,119 @@
## 新增需求
### 需求生成符合PEP 723规范的Python脚本
Skill SHALL指导LLM生成符合PEP 723内联元数据规范的Python脚本。脚本SHALL在顶部包含`# /// script`块,使用`dependencies`字段声明所有外部依赖。依赖SHALL使用不带版本约束的包名允许uv选择兼容的最新版本。没有依赖的脚本SHALL声明空的依赖列表。
#### 场景:包含外部依赖的脚本
- **WHEN** LLM需要执行需要外部包的Python代码例如pandas、requests、numpy
- **THEN** skill SHALL指导LLM包含列出所有必需包的PEP 723元数据块
- **THEN** 依赖列表SHALL只包含包名不带版本约束
- **THEN** 脚本SHALL是有效的Python代码顶部包含元数据块
#### 场景:仅使用标准库的脚本
- **WHEN** LLM需要执行只使用标准库模块的Python代码
- **THEN** skill SHALL指导LLM包含空依赖的PEP 723元数据块`# dependencies = []`
- **THEN** 脚本SHALL是有效的Python代码顶部包含元数据块
### 需求在隔离的uv环境中执行脚本
Skill SHALL指导LLM在系统临时目录中创建临时Python文件并使用`uv run`命令执行它们。临时文件SHALL使用包含时间戳和随机标识符的唯一名称创建。Skill SHALL确保所有脚本参数和逻辑都嵌入在脚本本身中没有命令行参数或stdin输入。
#### 场景:成功执行脚本
- **WHEN** LLM生成符合PEP 723的有效Python脚本
- **THEN** skill SHALL指导LLM在`/tmp/uv_script_<timestamp>_<random>.py`创建临时文件
- **THEN** skill SHALL指导LLM使用`uv run /tmp/uv_script_XXX.py`执行脚本
- **THEN** uv SHALL自动创建隔离的虚拟环境安装依赖并执行脚本
- **THEN** skill SHALL捕获并返回stdout/stderr输出
- **THEN** 临时文件使用系统目录,系统自动清理
#### 场景:脚本执行失败
- **WHEN** 脚本执行失败(运行时错误、依赖解析失败等)
- **THEN** skill SHALL保留临时文件用于调试
- **THEN** skill SHALL显示包含traceback的完整错误消息
- **THEN** skill SHALL显示保留的临时文件路径
- **THEN** skill SHALL停止任务严格错误处理模式
### 需求:跨平台临时目录支持
Skill SHALL使用`skills/uv-python-runner/script/get_temp_path.py`辅助脚本来获取平台特定的临时目录。Skill SHALL在创建临时Python文件之前先调用此辅助脚本获取临时目录路径。Skill SHALL支持Windows、macOS、Linux三个平台。
#### 场景:获取临时目录路径
- **WHEN** LLM需要为Python脚本创建临时文件
- **THEN** skill SHALL指导LLM先调用辅助脚本获取临时目录
- **THEN** skill SHALL指导LLM导入并使用`get_temp_dir()`函数
- **THEN** skill SHALL指导LLM使用`get_temp_file_path()`函数生成唯一文件路径(可选)
- **THEN** 辅助脚本SHALL使用`tempfile.gettempdir()`自动返回平台特定的路径
#### 场景Windows平台
- **WHEN** 辅助脚本在Windows平台运行
- **THEN** skill SHALL指导LLM调用辅助脚本会返回Windows临时目录例如`C:\Users\<username>\AppData\Local\Temp`
- **THEN** skill SHALL确保大模型不需要检测或硬编码Windows路径
#### 场景macOS/Linux平台
- **WHEN** 辅助脚本在macOS或Linux平台运行
- **THEN** skill SHALL指导LLM调用辅助脚本会返回`/tmp`路径
- **THEN** skill SHALL确保大模型不需要检测或硬编码Unix路径
### 需求:严格错误处理
Skill SHALL强制执行严格错误处理模式。任何错误条件SHALL导致任务停止并显示清晰错误消息。错误条件SHALL包括uv未安装、生成的脚本中的Python语法错误、uv的依赖解析失败、以及脚本运行时错误。
#### 场景uv未安装
- **WHEN** LLM尝试执行脚本但系统中未找到uv命令
- **THEN** skill SHALL显示清晰错误消息"uv not found"
- **THEN** skill SHALL提供uv安装链接https://docs.astral.sh/uv/getting-started/installation/
- **THEN** skill SHALL停止任务
#### 场景Python语法错误
- **WHEN** LLM生成包含语法错误的Python代码
- **THEN** skill SHALL在创建临时文件之前检测语法错误
- **THEN** skill SHALL显示包含行号和Python错误描述的错误消息
- **THEN** skill SHALL停止任务而不创建临时文件
#### 场景:依赖解析失败
- **WHEN** uv无法解析或安装声明的依赖
- **THEN** skill SHALL显示完整的uv错误输出
- **THEN** skill SHALL显示临时文件路径用户可手动删除调试
- **THEN** skill SHALL停止任务
#### 场景:脚本运行时错误
- **WHEN** Python脚本执行但在运行时抛出异常
- **THEN** skill SHALL显示完整的Python traceback
- **THEN** skill SHALL显示临时文件路径用户可手动删除调试
- **THEN** skill SHALL停止任务
### 需求:无外部输入或参数
Skill SHALL要求所有输入、参数和数据源都直接嵌入在Python脚本中。Skill SHALL不支持传递给脚本的命令行参数。Skill SHALL不支持从stdin读取输入。所有必要的数据SHALL硬编码或从脚本引用的文件中读取。
#### 场景:数据处理任务
- **WHEN** LLM需要处理数据例如CSV文件分析
- **THEN** skill SHALL指导LLM将文件路径作为字符串字面量包含在脚本中
- **THEN** skill SHALL不接受文件路径或参数的外部命令行参数
- **THEN** 所有数据处理逻辑SHALL嵌入在脚本中
#### 场景API交互任务
- **WHEN** LLM需要与API交互例如对特定URL的GET请求
- **THEN** skill SHALL指导LLM将URL和参数作为字符串字面量包含在脚本中
- **THEN** skill SHALL不接受作为命令行参数的API端点或身份验证令牌
- **THEN** 所有API交互逻辑SHALL嵌入在脚本中
### 需求:通用任务适用性
Skill SHALL适用于任何可以用Python脚本完成的任务。Skill SHALL不限于特定领域但SHALL为常见用例提供指导包括数据处理pandas、numpy、API交互requests、httpx、文件操作pathlib、shutil、科学计算scipy、sympy和数据转换json、yaml、csv
#### 场景:数据分析任务
- **WHEN** 用户请求数据分析或统计计算
- **THEN** skill SHALL提供生成具有适当依赖例如pandas的脚本的指导
- **THEN** skill SHALL不基于任务领域进行限制或过滤
#### 场景:文件操作任务
- **WHEN** 用户请求文件操作(重命名、转换、格式化)
- **THEN** skill SHALL提供生成具有适当标准库或外部模块的脚本的指导
- **THEN** skill SHALL不基于任务领域进行限制或过滤
#### 场景API测试任务
- **WHEN** 用户请求API测试或数据检索
- **THEN** skill SHALL提供生成具有适当HTTP客户端库的脚本的指导
- **THEN** skill SHALL不基于任务领域进行限制或过滤

View File

@@ -0,0 +1,99 @@
## 1. Skill结构设置
- [x] 1.1 创建skill目录`skills/uv-python-runner/`
- [x] 1.2 创建script子目录`skills/uv-python-runner/script/`
- [x] 1.3 创建辅助脚本:`skills/uv-python-runner/script/get_temp_path.py`
- [x] 1.3.1 添加PEP 723元数据块`# dependencies = []`
- [x] 1.3.2 在系统临时目录创建空的Python脚本文件并返回路径
- [x] 1.3.3 直接在stdout输出脚本文件完整路径
- [x] 1.3.4 添加命令行支持,直接运行脚本
- [x] 1.4 创建skill文件`skills/uv-python-runner/SKILL.md`
## 2. 编写YAML前置元数据
- [x] 2.1 添加skill名称`uv-python-runner`
- [x] 2.2 添加英文skill描述
- [x] 2.3 添加参数提示不适用此skill无参数
## 3. 编写Skill内容 - 概览
- [x] 3.1 编写skill目的和定位
- [x] 3.2 说明为什么uv是有益的环境隔离、依赖管理
- [x] 3.3 列出何时使用此skill
## 4. 编写Skill内容 - 何时使用章节
- [x] 4.1 记录典型用例数据处理、API交互、文件操作等
- [x] 4.2 记录此skill不适用的场景交互式输入、持久化环境等
## 5. 编写Skill内容 - 工作流程章节
- [x] 5.1 记录步骤1生成符合PEP 723的Python脚本
- [x] 5.1.1 说明元数据块格式
- [x] 5.1.2 提供包含外部依赖的示例
- [x] 5.1.3 提供仅使用标准库的示例
- [x] 5.2 记录步骤2获取临时目录
- [x] 5.2.1 说明调用辅助脚本:`uv run skills/uv-python-runner/script/get_temp_path.py`
- [x] 5.2.2 说明辅助脚本直接在stdout输出临时目录路径
- [x] 5.2.3 说明大模型捕获stdout输出得到临时目录
- [x] 5.2.4 说明根据临时目录构造脚本文件路径:`<temp_dir>/uv_script_<timestamp>_<random>.py`
- [x] 5.2.5 提供简化的工作流示例
- [x] 5.3 记录步骤3使用uv执行
- [x] 5.3.1 说明`uv run`命令的用法
- [x] 5.3.2 描述uv自动做什么隔离、依赖安装
## 6. 编写Skill内容 - 错误处理章节
- [x] 6.1 记录uv未安装场景
- [x] 6.1.1 提供清晰错误消息
- [x] 6.1.2 包含uv安装链接
- [x] 6.2 记录Python语法错误场景
- [x] 6.2.1 说明文件创建前的检测
- [x] 6.2.2 提供错误消息格式
- [x] 6.3 记录依赖解析失败场景
- [x] 6.3.1 说明显示uv错误输出
- [x] 6.3.2 说明文件保留
- [x] 6.4 记录脚本运行时错误场景
- [x] 6.4.1 说明显示完整traceback
- [x] 6.4.2 说明文件保留和路径显示
## 7. 编写Skill内容 - 示例章节
- [x] 7.1 提供示例1数据分析pandas
- [x] 7.1.1 显示完整的PEP 723脚本
- [x] 7.1.2 说明场景
- [x] 7.2 提供示例2API交互requests
- [x] 7.2.1 显示完整的PEP 723脚本
- [x] 7.2.2 说明场景
- [x] 7.3 提供示例3文件操作标准库
- [x] 7.3.1 显示完整的PEP 723脚本
- [x] 7.3.2 说明场景
## 8. 编写Skill内容 - 注意事项章节
- [x] 8.1 创建"为什么使用uv"对比表
- [x] 8.2 记录最佳实践
- [x] 8.2.1 总是使用内联元数据
- [x] 8.2.2 使用最新版本
- [x] 8.2.3 错误处理指南
- [x] 8.3 记录限制
- [x] 8.3.1 无命令行参数
- [x] 8.3.2 无stdin输入
- [x] 8.3.3 无持久化环境
- [x] 8.3.4 无自定义Python版本
- [x] 8.3.5 无复杂依赖约束
## 9. 编写Skill内容 - 依赖章节
- [x] 9.1 列出必需依赖uv
- [x] 9.2 包含uv文档链接
- [x] 9.3 标记可选依赖此skill无
## 10. 验证和测试
- [x] 10.1 验证YAML前置元数据格式有效
- [x] 10.2 检查所有Markdown章节格式正确
- [x] 10.3 确保所有示例在语法上是正确的Python
- [x] 10.4 验证所有PEP 723元数据块符合规范
- [x] 10.5 确认所有链接uv安装正确
- [x] 10.6 审查skill内容的清晰性和完整性

View File

@@ -1,10 +1,6 @@
schema: spec-driven
# Project context (optional)
# This is shown to AI when creating artifacts.
# Add your tech stack, conventions, style guides, domain knowledge, etc.
# Example:
# context: |
# Tech stack: TypeScript, React, Node.js
# We use conventional commits
# Domain: e-commerce platform
context: |
忽略项目目录下的「.opencode」和「opencode」两个目录与开发的skill无关
这个项目是专门用于开发用于大模型工具的 skill
所有开发的 skill 都放在「skills」目录下每个子目录都代表一个 skill目录名为 skill 的名称;