Skip to content

Commit a82dbec

Browse files
zhwesky2010claude
andcommitted
[Code Agent] Update API compatibility skills documentation
- Refactor api-change-decider skill description and documentation structure - Normalize allowed-tools formatting (remove invisible characters) - Update api-compatibility, api-docs-updater, cpp-sink, create-pr, python-decorator, and pytorch-alignment-validator skills with improved descriptions and content organization - Enhance documentation clarity and consistency across all API compatibility skills Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 9b42275 commit a82dbec

7 files changed

Lines changed: 714 additions & 471 deletions

File tree

docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-change-decider/SKILL.md

Lines changed: 226 additions & 116 deletions
Large diffs are not rendered by default.

docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-compatibility/SKILL.md

Lines changed: 146 additions & 114 deletions
Large diffs are not rendered by default.

docs/dev_guides/coding_agent/api_compatibility/.claude/skills/api-docs-updater/SKILL.md

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
---
22
name: api-docs-updater
3-
description: 仅用于《Paddle API 对齐 PyTorch 项目》,负责 Step4,在 API 代码修改完成后,同步更新中文 API 文档,确保文档准确反映 API 的最新行为
4-
allowed-tools: Read Grep Glob‌ Write‌ Edit
5-
context: fork
6-
background: true
7-
verbose: true
3+
description: 负责《Paddle API 对齐 PyTorch 项目》中 Step4:API 文档修改,在 API 代码修改完成后,同步更新中文 API 文档,确保文档准确反映 API 的最新行为
4+
allowed-tools: Read Grep Glob Write Edit
85
disable-model-invocation: false
96
---
107

@@ -14,22 +11,20 @@ disable-model-invocation: false
1411

1512
| 文档类型 | 文件命名 | 改动点 |
1613
|----------|----------|----------|
17-
| API 概览文档 | `docs/api/paddle/Overview_cn.rst` | API 索引目录,新增 API 时需要更新 |
14+
| API 概览文档 | `${ROOT_DIR}/docs/api/paddle/Overview_cn.rst` | API 索引目录,新增 API 时需要更新 |
1815
| API 中文文档 | `{api_name}_cn.rst` | 针对 API 功能改动点,修改文档 |
1916

20-
# 二、工作流程概述
17+
# 二、标准工作流程
2118

22-
## 基本流程
23-
24-
1. **查找 API 英文文档** - 在两个位置查找:
19+
Step 1. **查找 API 英文文档** - 在两个位置查找:
2520
- 直接存储在 API 实现代码中的 `__doc__` 文档字符串
26-
- 集中存储在 `Paddle/python/paddle/_paddle_docs.py` 文件中
21+
- 集中存储在 `${ROOT_DIR}/Paddle/python/paddle/_paddle_docs.py` 文件中
2722

28-
2. **对比英文和中文文档** - 识别不一致之处
23+
Step 2. **对比英文和中文文档** - 识别不一致之处
2924

30-
3. **根据代码修改方案选择对应模式** - 见第三章
25+
Step 3. **根据代码修改方案选择对应模式** - 见第三章
3126

32-
4. **按照格式规范更新中文文档** - 见第四章
27+
Step 4. **按照格式规范更新中文文档** - 见第四章
3328

3429
# 三、常见修改模式
3530

@@ -50,7 +45,7 @@ disable-model-invocation: false
5045
**英文文档要求**(代码 docstring):
5146
- 格式:`Alias: ` + `` ``别名`` ``
5247
- 多个别名:`Alias: ` `` ``input`` ` or ` `` ``other`` ``
53-
- 位置:参数描述末尾
48+
- 位置:参数描述末尾**句号前**
5449

5550
```python
5651
Args:
@@ -144,7 +139,7 @@ Args:
144139
keyword-only 形式:
145140
```python
146141
Keyword Args:
147-
out (Tensor|None, optional): The output tensor. Default: None.
142+
out (Tensor|None, optional): The output Tensor. Default: None.
148143
```
149144

150145
位置参数形式:
@@ -245,13 +240,11 @@ Inplace 版本的 :ref:`cn_api_paddle_floor_divide` API,对输入 `x` 采用 I
245240
```
246241

247242

248-
# 四、格式规范与注意事项
249-
250-
## 格式规范
243+
# 四、格式规范
251244

252245
| 项目 | 规范 | 示例 |
253246
|------|------|------|
254-
| **别名说明位置** | 参数描述末尾,句号前 | `- **x** (Tensor) - 输入的 Tensor。别名 ` ``input``` |
247+
| **别名说明位置** | 参数描述末尾,**句号前** | `- **x** (Tensor) - 输入的 Tensor。别名 ` ``input``` |
255248
| **别名格式** | 2 个反单引号+别名+2 个反单引号 | `` ``input`` ```` ``dim`` `` |
256249
| **多个别名** | 用"或"连接 | `别名 ` ``input`` `` ``other``` |
257250
| **参数类型** | 可选参数用管道符 | `(float\|None,可选)``(str\|None,可选)` |
@@ -265,22 +258,24 @@ Inplace 版本的 :ref:`cn_api_paddle_floor_divide` API,对输入 `x` 采用 I
265258
- 参数类型用 `()` 包裹
266259
- 别名用反引号包裹:`` ``input`` ``
267260

268-
## 注意事项
269261

270-
1. **Tensor 类方法**(如 `paddle.Tensor.abs`
262+
# 五、注意事项
263+
264+
1. 严格按标准工作流程执行,杜绝自行臆断和跳过步骤
265+
2. 所有路径使用 `${ROOT_DIR}` 变量表示根目录,需自行替换为实际路径
266+
3. **Tensor 类方法**(如 `paddle.Tensor.abs`
271267
- 没有独立文档,无需处理
272268
- 勿与普通方法(如 `paddle.abs`)混淆
273-
274-
2. **Inplace 方法**(如 `paddle.abs_`
269+
4. **Inplace 方法**(如 `paddle.abs_`
275270
- 仅更新代码签名,不需修改文档
276271
- 参数别名支持与原方法一致
277-
278-
3. **文档内容保持**
272+
5. **文档内容保持**
279273
- 保留原有的文档风格和格式
280274
- 不要大面积删除文档原内容
281275
- 示例代码采用 COPY-FROM: 格式,不要修改
282-
283-
4. **英文文档与中文文档必须对应**
276+
6. **英文文档与中文文档必须对应**
284277
- 别名格式完全相同
285278
- Overload 说明内容对应
286279
- out 参数描述对齐
280+
281+
# 六、常见问题处理

docs/dev_guides/coding_agent/api_compatibility/.claude/skills/cpp-sink/SKILL.md

Lines changed: 80 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
---
22
name: cpp-sink
3-
description: 仅用于《Paddle API 对齐 PyTorch 项目》,负责 Step2:API 代码修改,实施 C++下沉的代码开发。通过将 Python API 下沉至 C++层,可以减少 Python 装饰器带来的性能开销,提升 API 调度效率。
4-
allowed-tools: Read Grep‌ Glob‌ Edit Bash
3+
description: 负责《Paddle API 对齐 PyTorch 项目》中 Step2:API 代码修改,实施 C++下沉的代码开发。通过将 Python API 下沉至 C++层,可以减少 Python 装饰器带来的性能开销,提升 API 调度效率。
4+
allowed-tools: Read Grep Glob Edit Bash
5+
context: fork
6+
background: false
7+
verbose: true
58
disable-model-invocation: false
69
---
710

@@ -55,7 +58,7 @@ disable-model-invocation: false
5558
### Step 2:迁移文档到 `_paddle_docs.py`
5659

5760
注意要更新函数文档字符,在文档的 Args 部分为有别名的参数添加 Alias Support 说明,如下:
58-
> 注:Alias 说明应放在该参数描述的末尾,格式为: Alias: ``alias_name`` ,多个 Alias 描述为: Alias: ``alias_name1`` or ``alias_name2``
61+
> 注:Alias 说明应放在该参数描述的末尾,**句号前**,格式为: Alias: ``alias_name`` ,多个 Alias 描述为: Alias: ``alias_name1`` or ``alias_name2``
5962

6063
```python
6164
add_doc_and_signature(
@@ -261,15 +264,15 @@ class Test<APIName>API(unittest.TestCase):
261264
3. 输出结果序号需要保持连贯,每一个输出结果均需要检验,尽可能循环检验减少行数。
262265
3. 比对测试项,对于内容相同的测试项,不要重复添加。
263266
264-
完整测试示例,请参考 `Paddle/test/legacy_test/test_api_compatibility[1-9]\.py` 中已有的测试类结构。
267+
完整测试示例,请参考 `${ROOT_DIR}/Paddle/test/legacy_test/test_api_compatibility[1-9]\.py` 中已有的测试类结构。
265268

266269
### Step 5:编译并运行
267270

268271
单测编写完成后,按以下命令验证执行(不可修改):
269272

270273
1. **重新编译项目**:
271274
```bash
272-
cd /workspace/Paddle/build
275+
cd ${ROOT_DIR}/Paddle/build
273276
cmake ..
274277
make -j$(nproc)
275278
```
@@ -282,8 +285,8 @@ class Test<APIName>API(unittest.TestCase):
282285
3. **问题排查**:根据报错信息调整代码或测试用例,确保所有测试用例通过。注意每次修改 Paddle 源码后,必须重新编译方可生效。
283286

284287
编译注意事项:
285-
- 编译完成后不需要重新安装,无需执行 setup/install 等任何安装操作,直接可生效
286-
- 编译不要删除 build 目录,否则会导致增量编译失效,编译时间极长
288+
- 无需重装,直接生效(勿执行 setup/install 等安装操作)
289+
- 勿删除 build 目录(否则增量编译失效,编译时间极长
287290

288291
## 场景二: 具有前处理逻辑(中等复杂度)
289292

@@ -377,7 +380,21 @@ void LogsumexpPreProcess(pir::Value *x, std::vector<int> *axis, bool *reduce_all
377380
- 函数通过指针修改参数值
378381
- 直接翻译 Python 前处理逻辑到 C++
379382

380-
### Step 3~6:参考 Step 1 的 Step 2~5
383+
### Step 3:迁移文档到 `_paddle_docs.py`
384+
385+
参考场景一的 Step 2 执行相同操作。
386+
387+
### Step 4:替换 Python 实现
388+
389+
参考场景一的 Step 3 执行相同操作。
390+
391+
### Step 5:添加测试用例
392+
393+
参考场景一的 Step 4 执行相同操作。
394+
395+
### Step 6:编译并运行
396+
397+
参考场景一的 Step 5 执行相同操作。
381398

382399
## 场景三: 复杂参数映射(最复杂)
383400

@@ -612,11 +629,21 @@ Returns:
612629
"""
613630
```
614631

615-
### Step 4~6:参考场景一的 Step 3~5
632+
参考场景一的 Step 2 执行文档迁移操作。
616633

617-
## 不同场景对比
634+
### Step 4:替换 Python 实现
635+
636+
参考场景一的 Step 3 执行相同操作。
637+
638+
### Step 5:添加测试用例
618639

619-
| 项目 | Step 1: 仅参数名不同 | Step 2: 有前处理逻辑 | Step 3: 复杂参数映射 |
640+
参考场景一的 Step 4 执行相同操作。
641+
642+
### Step 6:编译并运行
643+
644+
参考场景一的 Step 5 执行相同操作。
645+
646+
## 不同场景对比
620647
|------|---------------------|---------------------|---------------------|
621648
| **YAML 配置** | `args_alias` + `use_default_mapping` | `args_alias` + `pre_process` | `args_mapper` |
622649
| **C++实现** | 无需额外 C++代码 | `arg_pre_process.h/cc` | `args_mapper.h/cc` |
@@ -626,65 +653,9 @@ Returns:
626653
| **示例 API** | log2 | logsumexp | argmax, argmin |
627654

628655

629-
# 二、异常处理
630-
631-
## 2.1 处理流程
632-
当遇到错误时,建议按照以下步骤处理,确保代码能运行通过:
633-
1. **定位错误**:仔细阅读错误信息,确定错误类型和位置
634-
2. **分析原因**:根据错误信息分析具体问题,例如参数错误、类型不匹配
635-
3. **修改代码**:根据错误信息与分析结果,调整代码
636-
4. **验证修复**:重新运行测试确认问题解决
637-
638-
## 2.2 常见错误及解决方案
639-
640-
### 静态图兼容性问题
641-
**错误现象**:
642-
```python
643-
TypeError: (InvalidType) all(): argument (position 1) must be Value, but got Variable
644-
```
645-
646-
**问题原因**:
647-
API 下沉后使用了新的 Value 类型系统,但测试代码仍在使用旧的 Variable 类型
648-
649-
**解决方法**:
650-
1. 删除过时的测试文件:
651-
```bash
652-
rm -rf test/deprecated/test_xxx.py
653-
```
654-
2. 删除`CMakeLists.txt`中涉及的单测配置:
655-
```cmake
656-
# 删除相关单测配置
657-
# set_tests_properties(test_lbfgs_deprecated PROPERTIES TIMEOUT 100)
658-
```
659-
3. 检查并更新所有引用这些测试的代码
660-
661-
### 参数解析错误
662-
**错误现象**:
663-
```python
664-
TypeError: argmax() got an unexpected keyword argument 'invalid_param'
665-
```
666-
667-
**解决方法**:
668-
1. 检查参数名称拼写
669-
2. 确认是否支持该参数
670-
671-
### 类型转换错误
672-
**错误现象**:
673-
```python
674-
TypeError: expected Tensor as argument, got numpy.ndarray
675-
```
676-
677-
**解决方法**:
678-
1. 确保输入数据是 Tensor 类型:
679-
```python
680-
tensor_input = paddle.to_tensor(numpy_input)
681-
```
682-
2. 检查数据类型是否匹配
683-
684-
685-
# 三、技术背景知识
656+
# 二、技术背景知识
686657

687-
## 3.1 工具函数速查
658+
## 2.1 工具函数速查
688659

689660
```cpp
690661
// 获取 Tensor 参数(支持别名)
@@ -712,16 +683,50 @@ void CheckParamsCount(int nargs, int remaining_kwargs, int max_args);
712683
void CheckRemainingParamsValidity(PyObject* args, PyObject* kwargs, int remaining_kwargs, int nargs);
713684
```
714685

715-
# 、注意事项
686+
# 、注意事项
716687

717-
1. 若 Python API 参数顺序与`_C_ops` API 不同,属于特殊情况,Cpp 下沉方案无法实现,需要使用 Python 装饰器方案。
718-
2. 代码中不允许提交中文,代码注释采用英文
719-
3. 若 API 需支持`out`参数,必须修改`add_doc_and_signature`中的字符串,增加 out 参数
720-
4. 不要修改`generated_tensor_methods_patch.py`,该文件是自动生成的,修改没有意义,如无法对齐可考虑放弃 C++下沉方案而不是改动该文件
721-
5. 示例代码若涉及多种数据类型,可能触发类型检查误报,添加注释忽略:
688+
1. 严格按标准工作流程执行,杜绝自行臆断和跳过步骤
689+
2. 所有路径使用 `${ROOT_DIR}` 变量表示根目录,需自行替换为实际路径
690+
3. 若 Python API 参数顺序与`_C_ops` API 不同,属于特殊情况,Cpp 下沉方案无法实现,需要使用 Python 装饰器方案
691+
4. 代码中不允许提交中文,代码注释采用英文
692+
5. 若 API 需支持`out`参数,必须修改`add_doc_and_signature`中的字符串,增加 out 参数
693+
6. 不要修改`generated_tensor_methods_patch.py`,该文件是自动生成的,修改没有意义,如无法对齐可考虑放弃 C++下沉方案而不是改动该文件
694+
7. 示例代码若涉及多种数据类型,可能触发类型检查误报,添加注释忽略:
722695
```python
723696
.. code-block:: pycon
724697
>>> # type: ignore
725698
>>> import paddle
726699
>>> x = paddle.to_tensor([1.0, 2.0])
727700
```
701+
702+
# 四、常见问题处理
703+
704+
## Q1:静态图报错"must be Value, but got Variable"
705+
706+
**错误现象**:
707+
```python
708+
TypeError: (InvalidType) all(): argument (position 1) must be Value, but got Variable
709+
```
710+
711+
**解决方法**:
712+
1. 删除过时的测试文件:
713+
```bash
714+
rm -rf test/deprecated/test_xxx.py
715+
```
716+
2. 删除`CMakeLists.txt`中涉及的单测配置
717+
3. 检查并更新所有引用这些测试的代码
718+
719+
---
720+
721+
## Q2:参数解析报错"got an unexpected keyword argument"
722+
723+
**错误现象**:
724+
```python
725+
TypeError: argmax() got an unexpected keyword argument 'invalid_param'
726+
```
727+
728+
**解决方法**:
729+
1. 检查参数名称拼写
730+
2. 确认是否支持该参数
731+
732+
---

0 commit comments

Comments
 (0)