agn-sdk 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agn_sdk-1.0.0/.env.example +20 -0
- agn_sdk-1.0.0/.gitignore +146 -0
- agn_sdk-1.0.0/AGENTS.md +538 -0
- agn_sdk-1.0.0/CHANGELOG.md +28 -0
- agn_sdk-1.0.0/PKG-INFO +477 -0
- agn_sdk-1.0.0/README.md +436 -0
- agn_sdk-1.0.0/README_zh.md +436 -0
- agn_sdk-1.0.0/agn/__init__.py +222 -0
- agn_sdk-1.0.0/agn/adapters/__init__.py +104 -0
- agn_sdk-1.0.0/agn/adapters/additional_models.py +1605 -0
- agn_sdk-1.0.0/agn/adapters/aggregation_platforms.py +1429 -0
- agn_sdk-1.0.0/agn/adapters/agnes.py +741 -0
- agn_sdk-1.0.0/agn/adapters/anthropic.py +610 -0
- agn_sdk-1.0.0/agn/adapters/audio_adapters.py +2039 -0
- agn_sdk-1.0.0/agn/adapters/azure.py +479 -0
- agn_sdk-1.0.0/agn/adapters/base.py +760 -0
- agn_sdk-1.0.0/agn/adapters/chinese.py +2301 -0
- agn_sdk-1.0.0/agn/adapters/emerging_models.py +1195 -0
- agn_sdk-1.0.0/agn/adapters/factory.py +132 -0
- agn_sdk-1.0.0/agn/adapters/gemini.py +666 -0
- agn_sdk-1.0.0/agn/adapters/kling.py +365 -0
- agn_sdk-1.0.0/agn/adapters/more_models.py +1592 -0
- agn_sdk-1.0.0/agn/adapters/openai.py +684 -0
- agn_sdk-1.0.0/agn/adapters/pika.py +359 -0
- agn_sdk-1.0.0/agn/adapters/runway.py +358 -0
- agn_sdk-1.0.0/agn/adapters/stability.py +443 -0
- agn_sdk-1.0.0/agn/adapters/volcengine_cv.py +427 -0
- agn_sdk-1.0.0/agn/client.py +526 -0
- agn_sdk-1.0.0/agn/core/__init__.py +40 -0
- agn_sdk-1.0.0/agn/core/config.py +128 -0
- agn_sdk-1.0.0/agn/core/errors.py +210 -0
- agn_sdk-1.0.0/agn/core/http_client.py +276 -0
- agn_sdk-1.0.0/agn/core/retry.py +147 -0
- agn_sdk-1.0.0/agn/core/utils.py +229 -0
- agn_sdk-1.0.0/agn/models/__init__.py +131 -0
- agn_sdk-1.0.0/agn/models/audio.py +155 -0
- agn_sdk-1.0.0/agn/models/chat.py +147 -0
- agn_sdk-1.0.0/agn/models/common.py +140 -0
- agn_sdk-1.0.0/agn/models/image.py +99 -0
- agn_sdk-1.0.0/agn/models/options.py +671 -0
- agn_sdk-1.0.0/agn/models/video.py +93 -0
- agn_sdk-1.0.0/agn/router.py +952 -0
- agn_sdk-1.0.0/docs/01-overview.md +129 -0
- agn_sdk-1.0.0/docs/02-architecture.md +589 -0
- agn_sdk-1.0.0/docs/03-api-reference.md +609 -0
- agn_sdk-1.0.0/docs/04-models-roadmap.md +391 -0
- agn_sdk-1.0.0/docs/05-project-structure.md +752 -0
- agn_sdk-1.0.0/examples/audio_usage.py +220 -0
- agn_sdk-1.0.0/examples/basic_usage.py +112 -0
- agn_sdk-1.0.0/examples/multi_provider.py +143 -0
- agn_sdk-1.0.0/pyproject.toml +112 -0
- agn_sdk-1.0.0/tests/__init__.py +1 -0
- agn_sdk-1.0.0/tests/conftest.py +44 -0
- agn_sdk-1.0.0/tests/test_adapters/__init__.py +1 -0
- agn_sdk-1.0.0/tests/test_adapters/test_additional_models.py +240 -0
- agn_sdk-1.0.0/tests/test_adapters/test_aggregation_platforms.py +191 -0
- agn_sdk-1.0.0/tests/test_adapters/test_agnes.py +727 -0
- agn_sdk-1.0.0/tests/test_adapters/test_anthropic.py +525 -0
- agn_sdk-1.0.0/tests/test_adapters/test_audio.py +2773 -0
- agn_sdk-1.0.0/tests/test_adapters/test_azure.py +314 -0
- agn_sdk-1.0.0/tests/test_adapters/test_chinese.py +290 -0
- agn_sdk-1.0.0/tests/test_adapters/test_emerging_models.py +922 -0
- agn_sdk-1.0.0/tests/test_adapters/test_gemini.py +570 -0
- agn_sdk-1.0.0/tests/test_adapters/test_kling.py +375 -0
- agn_sdk-1.0.0/tests/test_adapters/test_more_chinese.py +223 -0
- agn_sdk-1.0.0/tests/test_adapters/test_more_models.py +248 -0
- agn_sdk-1.0.0/tests/test_adapters/test_new_adapters.py +276 -0
- agn_sdk-1.0.0/tests/test_adapters/test_openai.py +579 -0
- agn_sdk-1.0.0/tests/test_adapters/test_pika.py +364 -0
- agn_sdk-1.0.0/tests/test_adapters/test_runway.py +367 -0
- agn_sdk-1.0.0/tests/test_adapters/test_stability.py +290 -0
- agn_sdk-1.0.0/tests/test_adapters/test_volcengine_cv.py +456 -0
- agn_sdk-1.0.0/tests/test_client.py +75 -0
- agn_sdk-1.0.0/tests/test_core/__init__.py +1 -0
- agn_sdk-1.0.0/tests/test_core/test_errors.py +114 -0
- agn_sdk-1.0.0/tests/test_router.py +373 -0
- agn_sdk-1.0.0/tests/test_unified_interface.py +457 -0
- agn_sdk-1.0.0/uv.lock +1822 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Agnes AI
|
|
2
|
+
AGN_AGNES_API_KEY=your-agnes-api-key
|
|
3
|
+
AGN_AGNES_BASE_URL=https://api.agnes.ai/v1
|
|
4
|
+
|
|
5
|
+
# OpenAI
|
|
6
|
+
AGN_OPENAI_API_KEY=your-openai-api-key
|
|
7
|
+
|
|
8
|
+
# Azure OpenAI
|
|
9
|
+
AGN_AZURE_API_KEY=your-azure-api-key
|
|
10
|
+
AGN_AZURE_BASE_URL=https://your-resource.openai.azure.com/openai/deployments/your-deployment
|
|
11
|
+
AGN_AZURE_API_VERSION=2024-02-15-preview
|
|
12
|
+
|
|
13
|
+
# Runway
|
|
14
|
+
AGN_RUNWAY_API_KEY=your-runway-api-key
|
|
15
|
+
|
|
16
|
+
# Pika
|
|
17
|
+
AGN_PIKA_API_KEY=your-pika-api-key
|
|
18
|
+
|
|
19
|
+
# Stability AI
|
|
20
|
+
AGN_STABILITY_API_KEY=your-stability-api-key
|
agn_sdk-1.0.0/.gitignore
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
*.egg-info/
|
|
24
|
+
.installed.cfg
|
|
25
|
+
*.egg
|
|
26
|
+
MANIFEST
|
|
27
|
+
|
|
28
|
+
# PyInstaller
|
|
29
|
+
*.manifest
|
|
30
|
+
*.spec
|
|
31
|
+
|
|
32
|
+
# Installer logs
|
|
33
|
+
pip-log.txt
|
|
34
|
+
pip-delete-this-directory.txt
|
|
35
|
+
|
|
36
|
+
# Unit test / coverage reports
|
|
37
|
+
htmlcov/
|
|
38
|
+
.tox/
|
|
39
|
+
.nox/
|
|
40
|
+
.coverage
|
|
41
|
+
.coverage.*
|
|
42
|
+
.cache
|
|
43
|
+
nosetests.xml
|
|
44
|
+
coverage.xml
|
|
45
|
+
*.cover
|
|
46
|
+
*.py,cover
|
|
47
|
+
.hypothesis/
|
|
48
|
+
.pytest_cache/
|
|
49
|
+
|
|
50
|
+
# Translations
|
|
51
|
+
*.mo
|
|
52
|
+
*.pot
|
|
53
|
+
|
|
54
|
+
# Django stuff:
|
|
55
|
+
*.log
|
|
56
|
+
local_settings.py
|
|
57
|
+
db.sqlite3
|
|
58
|
+
|
|
59
|
+
# Flask stuff:
|
|
60
|
+
instance/
|
|
61
|
+
.webassets-cache
|
|
62
|
+
|
|
63
|
+
# Scrapy stuff:
|
|
64
|
+
.scrapy
|
|
65
|
+
|
|
66
|
+
# Sphinx documentation
|
|
67
|
+
docs/_build/
|
|
68
|
+
|
|
69
|
+
# PyBuilder
|
|
70
|
+
target/
|
|
71
|
+
|
|
72
|
+
# Jupyter Notebook
|
|
73
|
+
.ipynb_checkpoints
|
|
74
|
+
|
|
75
|
+
# IPython
|
|
76
|
+
profile_default/
|
|
77
|
+
ipython_config.py
|
|
78
|
+
|
|
79
|
+
# pyenv
|
|
80
|
+
.python-version
|
|
81
|
+
|
|
82
|
+
# pipenv
|
|
83
|
+
Pipfile.lock
|
|
84
|
+
|
|
85
|
+
# poetry
|
|
86
|
+
poetry.lock
|
|
87
|
+
|
|
88
|
+
# pdm
|
|
89
|
+
pdm.lock
|
|
90
|
+
|
|
91
|
+
# PEP 582
|
|
92
|
+
__pypackages__/
|
|
93
|
+
|
|
94
|
+
# Celery beat schedule file
|
|
95
|
+
celerybeat-schedule
|
|
96
|
+
|
|
97
|
+
# SageMath parsed files
|
|
98
|
+
*.sage.py
|
|
99
|
+
|
|
100
|
+
# Environments
|
|
101
|
+
.env
|
|
102
|
+
.venv
|
|
103
|
+
env/
|
|
104
|
+
venv/
|
|
105
|
+
ENV/
|
|
106
|
+
env.bak/
|
|
107
|
+
venv.bak/
|
|
108
|
+
|
|
109
|
+
# Spyder project settings
|
|
110
|
+
.spyderproject
|
|
111
|
+
.spyproject
|
|
112
|
+
|
|
113
|
+
# Rope project settings
|
|
114
|
+
.ropeproject
|
|
115
|
+
|
|
116
|
+
# mkdocs documentation
|
|
117
|
+
/site
|
|
118
|
+
|
|
119
|
+
# mypy
|
|
120
|
+
.mypy_cache/
|
|
121
|
+
.dmypy.json
|
|
122
|
+
dmypy.json
|
|
123
|
+
|
|
124
|
+
# Pyre type checker
|
|
125
|
+
.pyre/
|
|
126
|
+
|
|
127
|
+
# pytype static type analyzer
|
|
128
|
+
.pytype/
|
|
129
|
+
|
|
130
|
+
# Cython debug symbols
|
|
131
|
+
cython_debug/
|
|
132
|
+
|
|
133
|
+
# IDE
|
|
134
|
+
.idea/
|
|
135
|
+
.vscode/
|
|
136
|
+
*.swp
|
|
137
|
+
*.swo
|
|
138
|
+
*~
|
|
139
|
+
|
|
140
|
+
# OS
|
|
141
|
+
.DS_Store
|
|
142
|
+
Thumbs.db
|
|
143
|
+
|
|
144
|
+
# Project specific
|
|
145
|
+
output/
|
|
146
|
+
*.egg-info/
|
agn_sdk-1.0.0/AGENTS.md
ADDED
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
# AGN-SDK 项目引导 - Agent 执行前必读
|
|
2
|
+
|
|
3
|
+
> 本文件是 Agent 执行任务时必须首先加载和理解的项目指南,包含项目目标、架构、规范、验收标准等关键信息。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 项目概述
|
|
8
|
+
|
|
9
|
+
### 1.1 项目名称
|
|
10
|
+
**AGN-SDK** - 多模型统一接口 SDK
|
|
11
|
+
|
|
12
|
+
### 1.2 项目目标
|
|
13
|
+
打造一个面向开发者的、轻量级的、可扩展的多模态 AI 统一接口 SDK:
|
|
14
|
+
|
|
15
|
+
1. **统一接口**:一套 API 调用所有 AI 模型(文本对话、图像生成、视频生成、语音处理、文本嵌入)
|
|
16
|
+
2. **零学习成本**:熟悉 OpenAI API 的开发者可以直接上手
|
|
17
|
+
3. **高度可扩展**:新增模型只需要实现一个适配器
|
|
18
|
+
4. **异步优先**:全异步设计,高性能,适合高并发场景
|
|
19
|
+
5. **生产级可靠**:内置重试、错误映射、参数归一化等企业级特性
|
|
20
|
+
|
|
21
|
+
### 1.3 技术栈
|
|
22
|
+
- **语言**:Python 3.10+
|
|
23
|
+
- **核心依赖**:
|
|
24
|
+
- httpx[http2]>=0.27.0 - 异步 HTTP 客户端
|
|
25
|
+
- pydantic>=2.0.0 - 数据校验与模型定义
|
|
26
|
+
- python-dotenv>=1.0.0 - 环境变量管理
|
|
27
|
+
- tenacity>=8.0.0 - 重试机制
|
|
28
|
+
- anyio>=4.0.0 - 异步工具
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2. 项目架构
|
|
33
|
+
|
|
34
|
+
### 2.1 分层架构
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
┌─────────────────────────────────────────────────────────┐
|
|
38
|
+
│ API 层 (Client) │
|
|
39
|
+
│ - chat() / image_generate() / video_create() │
|
|
40
|
+
│ - transcribe() / speech() / embed() │
|
|
41
|
+
└───────────────────────┬─────────────────────────────────┘
|
|
42
|
+
│
|
|
43
|
+
▼
|
|
44
|
+
┌─────────────────────────────────────────────────────────┐
|
|
45
|
+
│ 路由器层 (Router) │
|
|
46
|
+
│ - 模型路由、负载均衡、Fallback │
|
|
47
|
+
└───────────────────────┬─────────────────────────────────┘
|
|
48
|
+
│
|
|
49
|
+
▼
|
|
50
|
+
┌─────────────────────────────────────────────────────────┐
|
|
51
|
+
│ 适配器层 (Adapters) │
|
|
52
|
+
│ - 各模型提供商的具体实现 │
|
|
53
|
+
│ - BaseAdapter (抽象基类) │
|
|
54
|
+
│ - AdapterFactory (适配器工厂) │
|
|
55
|
+
└───────────────────────┬─────────────────────────────────┘
|
|
56
|
+
│
|
|
57
|
+
▼
|
|
58
|
+
┌─────────────────────────────────────────────────────────┐
|
|
59
|
+
│ 核心层 (Core) │
|
|
60
|
+
│ - HTTP 客户端、重试机制、错误处理 │
|
|
61
|
+
│ - 配置管理、工具函数 │
|
|
62
|
+
└───────────────────────┬─────────────────────────────────┘
|
|
63
|
+
│
|
|
64
|
+
▼
|
|
65
|
+
┌─────────────────────────────────────────────────────────┐
|
|
66
|
+
│ 数据模型层 (Models) │
|
|
67
|
+
│ - Pydantic 模型定义(统一数据结构) │
|
|
68
|
+
└─────────────────────────────────────────────────────────┘
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### 2.2 目录结构
|
|
72
|
+
|
|
73
|
+
```
|
|
74
|
+
agn-sdk/
|
|
75
|
+
├── agn/ # SDK 核心代码
|
|
76
|
+
│ ├── __init__.py # SDK 入口,导出核心类
|
|
77
|
+
│ ├── client.py # 统一客户端(API 层)
|
|
78
|
+
│ ├── router.py # 路由器(路由层)
|
|
79
|
+
│ ├── adapters/ # 适配器层
|
|
80
|
+
│ │ ├── __init__.py
|
|
81
|
+
│ │ ├── base.py # 适配器基类(抽象接口)
|
|
82
|
+
│ │ ├── factory.py # 适配器工厂
|
|
83
|
+
│ │ ├── agnes.py # Agnes AI 适配器
|
|
84
|
+
│ │ ├── openai.py # OpenAI 适配器
|
|
85
|
+
│ │ ├── azure.py # Azure OpenAI 适配器
|
|
86
|
+
│ │ ├── gemini.py # Google Gemini 适配器
|
|
87
|
+
│ │ ├── anthropic.py # Anthropic Claude 适配器
|
|
88
|
+
│ │ ├── runway.py # Runway 适配器
|
|
89
|
+
│ │ ├── pika.py # Pika 适配器
|
|
90
|
+
│ │ ├── kling.py # 可灵适配器
|
|
91
|
+
│ │ ├── stability.py # Stability AI 适配器
|
|
92
|
+
│ │ ├── chinese.py # 中文模型聚合适配器
|
|
93
|
+
│ │ └── ... # 其他适配器
|
|
94
|
+
│ ├── core/ # 核心层
|
|
95
|
+
│ │ ├── __init__.py
|
|
96
|
+
│ │ ├── http_client.py # HTTP 客户端
|
|
97
|
+
│ │ ├── retry.py # 重试机制封装
|
|
98
|
+
│ │ ├── errors.py # 错误定义与映射
|
|
99
|
+
│ │ ├── config.py # 配置管理
|
|
100
|
+
│ │ └── utils.py # 工具函数
|
|
101
|
+
│ └── models/ # 数据模型
|
|
102
|
+
│ ├── __init__.py
|
|
103
|
+
│ ├── common.py # 通用数据结构
|
|
104
|
+
│ ├── chat.py # 文本对话相关模型
|
|
105
|
+
│ ├── image.py # 图像生成相关模型
|
|
106
|
+
│ ├── video.py # 视频生成相关模型
|
|
107
|
+
│ ├── audio.py # 语音相关模型
|
|
108
|
+
│ └── options.py # 统一选项类与参数映射
|
|
109
|
+
├── docs/ # 项目文档
|
|
110
|
+
│ ├── 01-overview.md # 项目概述与目标
|
|
111
|
+
│ ├── 02-architecture.md # 技术架构设计
|
|
112
|
+
│ ├── 03-api-reference.md # API 设计规范
|
|
113
|
+
│ ├── 04-models-roadmap.md # 兼容模型路线图
|
|
114
|
+
│ └── 05-project-structure.md # 项目结构与开发计划
|
|
115
|
+
├── tests/ # 测试目录
|
|
116
|
+
│ ├── __init__.py
|
|
117
|
+
│ ├── conftest.py # pytest 配置与 fixtures
|
|
118
|
+
│ ├── test_client.py # Client 测试
|
|
119
|
+
│ ├── test_router.py # Router 测试
|
|
120
|
+
│ ├── test_unified_interface.py # 统一接口测试
|
|
121
|
+
│ ├── test_adapters/ # 适配器测试
|
|
122
|
+
│ │ └── test_*.py
|
|
123
|
+
│ └── test_core/ # 核心层测试
|
|
124
|
+
│ └── test_*.py
|
|
125
|
+
├── examples/ # 使用示例
|
|
126
|
+
│ ├── basic_usage.py
|
|
127
|
+
│ ├── multi_provider.py
|
|
128
|
+
│ └── audio_usage.py
|
|
129
|
+
├── pyproject.toml # Python 项目配置
|
|
130
|
+
├── README.md # 项目说明
|
|
131
|
+
├── CHANGELOG.md # 变更日志
|
|
132
|
+
└── AGENTS.md # 本文件 - Agent 项目引导
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 2.3 各层职责
|
|
136
|
+
|
|
137
|
+
| 层级 | 文件位置 | 职责 |
|
|
138
|
+
|------|---------|------|
|
|
139
|
+
| **API 层** | `agn/client.py`, `agn/__init__.py` | 对外统一接口,用户直接调用 |
|
|
140
|
+
| **路由器层** | `agn/router.py` | 模型选择、路由分发、负载均衡、Fallback |
|
|
141
|
+
| **适配器层** | `agn/adapters/` | 各模型提供商的具体实现,参数转换和响应归一化 |
|
|
142
|
+
| **核心层** | `agn/core/` | 通用能力(HTTP、重试、错误、配置、工具) |
|
|
143
|
+
| **数据模型层** | `agn/models/` | Pydantic 数据模型定义,统一数据结构 |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
## 3. 文档路径
|
|
148
|
+
|
|
149
|
+
详细文档存放在 `docs/` 目录下:
|
|
150
|
+
|
|
151
|
+
| 文档 | 路径 | 内容 |
|
|
152
|
+
|------|------|------|
|
|
153
|
+
| 项目概述 | [01-overview.md](file:///Users/skywing/agn-sdk/docs/01-overview.md) | 项目背景、目标、技术选型、设计原则 |
|
|
154
|
+
| 架构设计 | [02-architecture.md](file:///Users/skywing/agn-sdk/docs/02-architecture.md) | 分层架构、核心模块、数据模型、扩展机制 |
|
|
155
|
+
| API 参考 | [03-api-reference.md](file:///Users/skywing/agn-sdk/docs/03-api-reference.md) | API 设计规范、使用示例、参数说明 |
|
|
156
|
+
| 模型路线图 | [04-models-roadmap.md](file:///Users/skywing/agn-sdk/docs/04-models-roadmap.md) | 兼容模型规划 |
|
|
157
|
+
| 项目结构 | [05-project-structure.md](file:///Users/skywing/agn-sdk/docs/05-project-structure.md) | 目录结构、开发计划、编码规范、发布流程 |
|
|
158
|
+
|
|
159
|
+
**重要参考文件**:
|
|
160
|
+
- [base.py](file:///Users/skywing/agn-sdk/agn/adapters/base.py) - 适配器基类,新增适配器必须参考
|
|
161
|
+
- [errors.py](file:///Users/skywing/agn-sdk/agn/core/errors.py) - 标准错误类型定义
|
|
162
|
+
- [options.py](file:///Users/skywing/agn-sdk/agn/models/options.py) - 统一选项类与参数映射机制
|
|
163
|
+
- [conftest.py](file:///Users/skywing/agn-sdk/tests/conftest.py) - 测试 fixtures 参考
|
|
164
|
+
|
|
165
|
+
---
|
|
166
|
+
|
|
167
|
+
## 4. 开发规范
|
|
168
|
+
|
|
169
|
+
### 4.1 代码风格规范
|
|
170
|
+
|
|
171
|
+
#### 命名规范
|
|
172
|
+
- **类名**:PascalCase(首字母大写,每个单词首字母大写)
|
|
173
|
+
```python
|
|
174
|
+
class Client: ...
|
|
175
|
+
class AgnesAdapter: ...
|
|
176
|
+
```
|
|
177
|
+
- **方法名/函数名/变量名/参数名**:snake_case(全小写,下划线分隔)
|
|
178
|
+
```python
|
|
179
|
+
async def image_generate(self, prompt: str) -> ImageGenerationResult: ...
|
|
180
|
+
```
|
|
181
|
+
- **常量名**:UPPER_SNAKE_CASE(全大写,下划线分隔)
|
|
182
|
+
```python
|
|
183
|
+
DEFAULT_TIMEOUT = 300
|
|
184
|
+
```
|
|
185
|
+
- **私有方法/变量**:单下划线前缀 `_private_method`
|
|
186
|
+
|
|
187
|
+
#### 类型提示规范(强制)
|
|
188
|
+
- 所有函数和方法必须有完整的类型提示
|
|
189
|
+
- 使用 PEP 604 语法:`str | None` 而不是 `Optional[str]`
|
|
190
|
+
- 返回类型必须明确标注
|
|
191
|
+
- Pydantic 模型使用现代类型注解
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
# 正确示例
|
|
195
|
+
async def chat(
|
|
196
|
+
self,
|
|
197
|
+
model: str,
|
|
198
|
+
messages: list[ChatMessage],
|
|
199
|
+
temperature: float = 0.7,
|
|
200
|
+
**kwargs: Any,
|
|
201
|
+
) -> ChatCompletion:
|
|
202
|
+
...
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### 4.2 代码格式化与检查
|
|
206
|
+
|
|
207
|
+
项目配置了以下工具,提交前必须通过检查:
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# 代码格式化(black,行宽 88)
|
|
211
|
+
black agn/
|
|
212
|
+
|
|
213
|
+
# 代码检查(ruff)
|
|
214
|
+
ruff check agn/
|
|
215
|
+
|
|
216
|
+
# 类型检查(mypy,strict 模式)
|
|
217
|
+
mypy agn/
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**配置参考**(pyproject.toml):
|
|
221
|
+
- black:line-length=88,target-version=py310
|
|
222
|
+
- ruff:启用 E/W/F/I/UP/B/C4/ASYNC 规则
|
|
223
|
+
- mypy:strict=true,disallow_untyped_defs=true
|
|
224
|
+
|
|
225
|
+
### 4.3 注释与文档规范
|
|
226
|
+
|
|
227
|
+
**重要**:代码的功能模块必须有备注信息(用户规则要求)
|
|
228
|
+
|
|
229
|
+
- 每个文件开头必须有模块文档字符串(docstring),说明模块用途
|
|
230
|
+
- 每个类必须有类文档字符串,说明类的职责
|
|
231
|
+
- 每个公开方法必须有文档字符串,说明功能、参数、返回值
|
|
232
|
+
- 关键逻辑段落需要有行内注释说明
|
|
233
|
+
- 调整或修复代码时,必须检查是否删除了原有的功能模块备注,如果删掉需要补充回来
|
|
234
|
+
|
|
235
|
+
```python
|
|
236
|
+
"""
|
|
237
|
+
模块文档字符串:说明本模块的用途和主要内容
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
class SomeClass:
|
|
241
|
+
"""
|
|
242
|
+
类文档字符串:说明类的职责和主要功能
|
|
243
|
+
|
|
244
|
+
属性:
|
|
245
|
+
attr1: 属性1说明
|
|
246
|
+
attr2: 属性2说明
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
async def some_method(self, param1: str, param2: int) -> ResultType:
|
|
250
|
+
"""
|
|
251
|
+
方法文档字符串:说明方法功能
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
param1: 参数1说明
|
|
255
|
+
param2: 参数2说明
|
|
256
|
+
|
|
257
|
+
Returns:
|
|
258
|
+
返回值说明
|
|
259
|
+
|
|
260
|
+
Raises:
|
|
261
|
+
SomeError: 异常说明
|
|
262
|
+
"""
|
|
263
|
+
# 关键逻辑注释
|
|
264
|
+
result = await self._do_something(param1)
|
|
265
|
+
return result
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### 4.4 导入规范
|
|
269
|
+
导入顺序:标准库 → 第三方库 → 项目内部
|
|
270
|
+
```python
|
|
271
|
+
# 1. 标准库
|
|
272
|
+
import asyncio
|
|
273
|
+
from typing import Any
|
|
274
|
+
|
|
275
|
+
# 2. 第三方库
|
|
276
|
+
import httpx
|
|
277
|
+
from pydantic import BaseModel
|
|
278
|
+
|
|
279
|
+
# 3. 项目内部
|
|
280
|
+
from agn.core.errors import AGNError
|
|
281
|
+
from agn.models.chat import ChatCompletion
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### 4.5 适配器开发规范
|
|
285
|
+
|
|
286
|
+
新增 Provider 适配器必须遵循以下规范:
|
|
287
|
+
|
|
288
|
+
1. **继承基类**:必须继承 `BaseAdapter`
|
|
289
|
+
2. **注册工厂**:文件末尾必须调用 `AdapterFactory.register()`
|
|
290
|
+
3. **声明能力**:必须设置 `provider_type`、`provider_name`、`supported_capabilities`
|
|
291
|
+
4. **实现抽象方法**:必须实现 `start()`、`close()`、`chat()`、`image_generate()`、`video_create()`、`video_poll()`、`list_models()`
|
|
292
|
+
5. **参数映射**:使用 `_map_params()` 或自定义 `param_mapping` 处理参数转换
|
|
293
|
+
6. **错误处理**:使用 `_handle_http_error()` 统一处理 HTTP 错误
|
|
294
|
+
7. **响应归一化**:所有响应必须转换为标准 Pydantic 模型
|
|
295
|
+
8. **不支持能力**:不支持的能力直接继承基类默认实现(抛出 UnsupportedCapabilityError)
|
|
296
|
+
|
|
297
|
+
参考示例:
|
|
298
|
+
```python
|
|
299
|
+
"""
|
|
300
|
+
XX Provider 适配器
|
|
301
|
+
|
|
302
|
+
实现 XX AI 平台的 API 调用,支持对话、图像生成等能力。
|
|
303
|
+
"""
|
|
304
|
+
|
|
305
|
+
from .base import BaseAdapter
|
|
306
|
+
from .factory import AdapterFactory
|
|
307
|
+
from agn.models.chat import ChatCompletion
|
|
308
|
+
# ... 其他导入
|
|
309
|
+
|
|
310
|
+
class XXAdapter(BaseAdapter):
|
|
311
|
+
"""XX AI 适配器"""
|
|
312
|
+
|
|
313
|
+
provider_type = "xx"
|
|
314
|
+
provider_name = "XX AI"
|
|
315
|
+
supported_capabilities = [Capabilities.CHAT, Capabilities.IMAGE_GENERATE]
|
|
316
|
+
|
|
317
|
+
def __init__(self, config):
|
|
318
|
+
super().__init__(config)
|
|
319
|
+
# 初始化逻辑
|
|
320
|
+
|
|
321
|
+
async def start(self) -> None:
|
|
322
|
+
"""启动适配器,初始化 HTTP 客户端"""
|
|
323
|
+
# 实现逻辑
|
|
324
|
+
|
|
325
|
+
async def close(self) -> None:
|
|
326
|
+
"""关闭适配器,释放资源"""
|
|
327
|
+
# 实现逻辑
|
|
328
|
+
|
|
329
|
+
# ... 实现其他抽象方法
|
|
330
|
+
|
|
331
|
+
AdapterFactory.register("xx", XXAdapter)
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 4.6 错误处理规范
|
|
335
|
+
|
|
336
|
+
1. **使用标准错误类型**:必须使用 `agn.core.errors` 中定义的错误类型
|
|
337
|
+
2. **错误映射**:每个适配器负责将 Provider 特定错误映射到标准错误
|
|
338
|
+
3. **保留原始错误**:使用 `from e` 保留错误链,便于排查
|
|
339
|
+
4. **清晰错误信息**:错误信息应包含原因和上下文
|
|
340
|
+
|
|
341
|
+
标准错误类型:
|
|
342
|
+
- `AGNError` - SDK 基础错误
|
|
343
|
+
- `AuthenticationError` - 认证错误(API Key 无效)
|
|
344
|
+
- `RateLimitError` - 限流错误
|
|
345
|
+
- `ValidationError` - 参数校验错误
|
|
346
|
+
- `ModelNotFoundError` - 模型不存在
|
|
347
|
+
- `APIError` - API 调用错误
|
|
348
|
+
- `TimeoutError` - 超时错误
|
|
349
|
+
- `UnsupportedCapabilityError` - 不支持的能力
|
|
350
|
+
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
## 5. 测试规范
|
|
354
|
+
|
|
355
|
+
### 5.1 测试框架
|
|
356
|
+
- **测试框架**:pytest + pytest-asyncio
|
|
357
|
+
- **异步测试**:`asyncio_mode = "auto"`
|
|
358
|
+
- **测试覆盖率**:目标 ≥ 80%
|
|
359
|
+
|
|
360
|
+
### 5.2 测试目录结构
|
|
361
|
+
- `tests/conftest.py` - 公共 fixtures
|
|
362
|
+
- `tests/test_client.py` - Client 测试
|
|
363
|
+
- `tests/test_router.py` - Router 测试
|
|
364
|
+
- `tests/test_adapters/` - 各适配器测试
|
|
365
|
+
- `tests/test_core/` - 核心模块测试
|
|
366
|
+
|
|
367
|
+
### 5.3 测试命令
|
|
368
|
+
```bash
|
|
369
|
+
# 运行所有测试
|
|
370
|
+
pytest
|
|
371
|
+
|
|
372
|
+
# 运行特定测试文件
|
|
373
|
+
pytest tests/test_adapters/test_agnes.py -v
|
|
374
|
+
|
|
375
|
+
# 运行测试并显示覆盖率
|
|
376
|
+
pytest --cov=agn --cov-report=term-missing
|
|
377
|
+
|
|
378
|
+
# 生成 HTML 覆盖率报告
|
|
379
|
+
pytest --cov=agn --cov-report=html
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
### 5.4 测试编写规范
|
|
383
|
+
|
|
384
|
+
1. **测试命名**:`test_<功能名>`,如 `test_chat_completion`
|
|
385
|
+
2. **异步测试**:测试函数使用 `async def` 定义
|
|
386
|
+
3. **使用 fixtures**:复用 conftest.py 中定义的 fixtures(mock_api_key, sample_chat_messages 等)
|
|
387
|
+
4. **Mock 外部调用**:HTTP 请求必须 mock,不调用真实 API
|
|
388
|
+
5. **覆盖边界情况**:正常流程、异常流程、边界条件都要覆盖
|
|
389
|
+
6. **测试独立**:测试之间不依赖,可单独运行
|
|
390
|
+
|
|
391
|
+
测试示例参考:
|
|
392
|
+
```python
|
|
393
|
+
"""
|
|
394
|
+
XX 适配器测试
|
|
395
|
+
|
|
396
|
+
测试 XXAdapter 的各项功能。
|
|
397
|
+
"""
|
|
398
|
+
import pytest
|
|
399
|
+
from agn.adapters.xx import XXAdapter
|
|
400
|
+
|
|
401
|
+
@pytest.mark.asyncio
|
|
402
|
+
async def test_chat(mock_provider_config, sample_chat_messages):
|
|
403
|
+
"""测试文本对话功能"""
|
|
404
|
+
adapter = XXAdapter.from_config(mock_provider_config)
|
|
405
|
+
await adapter.start()
|
|
406
|
+
|
|
407
|
+
# Mock HTTP 响应...
|
|
408
|
+
|
|
409
|
+
result = await adapter.chat(model="test-model", messages=sample_chat_messages)
|
|
410
|
+
assert isinstance(result, ChatCompletion)
|
|
411
|
+
assert len(result.choices) > 0
|
|
412
|
+
|
|
413
|
+
await adapter.close()
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## 6. 验收方式和标准
|
|
419
|
+
|
|
420
|
+
### 6.1 代码修改验收清单
|
|
421
|
+
|
|
422
|
+
完成任何代码修改后,必须逐项检查以下内容:
|
|
423
|
+
|
|
424
|
+
#### ✅ 代码质量检查
|
|
425
|
+
- [ ] 所有公开类、方法、模块都有文档字符串(备注)
|
|
426
|
+
- [ ] 所有函数/方法都有完整的类型提示
|
|
427
|
+
- [ ] 代码通过 black 格式化:`black agn/`
|
|
428
|
+
- [ ] 代码通过 ruff 检查:`ruff check agn/`
|
|
429
|
+
- [ ] 代码通过 mypy 类型检查:`mypy agn/`
|
|
430
|
+
- [ ] 没有删除原有的功能模块备注(如有删除必须补充)
|
|
431
|
+
|
|
432
|
+
#### ✅ 功能验收
|
|
433
|
+
- [ ] 新增功能按照现有架构模式实现
|
|
434
|
+
- [ ] 适配器继承 BaseAdapter 并注册到工厂
|
|
435
|
+
- [ ] 错误映射到标准错误类型
|
|
436
|
+
- [ ] 响应归一化为标准 Pydantic 模型
|
|
437
|
+
- [ ] 参数处理符合统一规范
|
|
438
|
+
|
|
439
|
+
#### ✅ 测试验收
|
|
440
|
+
- [ ] 为新功能编写了对应的单元测试
|
|
441
|
+
- [ ] 所有现有测试通过:`pytest`
|
|
442
|
+
- [ ] 新增测试覆盖正常流程和异常流程
|
|
443
|
+
- [ ] 测试覆盖率不降低
|
|
444
|
+
|
|
445
|
+
#### ✅ 文档验收(如需要)
|
|
446
|
+
- [ ] README 或相关文档已更新
|
|
447
|
+
- [ ] API 变更已在文档中反映
|
|
448
|
+
- [ ] 示例代码(如需要)已提供
|
|
449
|
+
|
|
450
|
+
### 6.2 新增适配器验收标准
|
|
451
|
+
|
|
452
|
+
新增 Provider 适配器必须满足:
|
|
453
|
+
|
|
454
|
+
1. **文件位置**:`agn/adapters/<provider_name>.py`
|
|
455
|
+
2. **类定义**:继承 `BaseAdapter`,类名 `<ProviderName>Adapter`
|
|
456
|
+
3. **类变量**:
|
|
457
|
+
- `provider_type`:小写唯一标识
|
|
458
|
+
- `provider_name`:显示名称
|
|
459
|
+
- `supported_capabilities`:使用 `Capabilities` 常量声明支持的能力
|
|
460
|
+
4. **必须实现的方法**:
|
|
461
|
+
- `start()` - 初始化 HTTP 客户端
|
|
462
|
+
- `close()` - 释放资源
|
|
463
|
+
- `chat()` - 文本对话(如支持)
|
|
464
|
+
- `image_generate()` - 图像生成(如支持)
|
|
465
|
+
- `video_create()` - 创建视频任务(如支持)
|
|
466
|
+
- `video_poll()` - 查询视频状态(如支持)
|
|
467
|
+
- `list_models()` - 列出可用模型
|
|
468
|
+
5. **注册**:文件末尾调用 `AdapterFactory.register()`
|
|
469
|
+
6. **测试**:在 `tests/test_adapters/` 下有对应测试文件
|
|
470
|
+
7. **导出**:在 `agn/adapters/__init__.py` 中导入(确保自动注册)
|
|
471
|
+
|
|
472
|
+
### 6.3 Bug 修复验收标准
|
|
473
|
+
|
|
474
|
+
1. **复现**:有复现步骤或测试用例证明 bug 存在
|
|
475
|
+
2. **修复**:修复代码不引入新问题,不破坏现有功能
|
|
476
|
+
3. **回归测试**:所有现有测试通过
|
|
477
|
+
4. **测试用例**:添加测试用例防止 bug 复发
|
|
478
|
+
|
|
479
|
+
### 6.4 命令验证流程
|
|
480
|
+
|
|
481
|
+
提交代码前,按顺序执行以下命令确保全部通过:
|
|
482
|
+
|
|
483
|
+
```bash
|
|
484
|
+
# 1. 代码格式化
|
|
485
|
+
black agn/ tests/
|
|
486
|
+
|
|
487
|
+
# 2. 代码检查
|
|
488
|
+
ruff check agn/ tests/
|
|
489
|
+
|
|
490
|
+
# 3. 类型检查
|
|
491
|
+
mypy agn/
|
|
492
|
+
|
|
493
|
+
# 4. 运行所有测试
|
|
494
|
+
pytest
|
|
495
|
+
|
|
496
|
+
# 5. (可选)查看覆盖率
|
|
497
|
+
pytest --cov=agn --cov-report=term-missing
|
|
498
|
+
```
|
|
499
|
+
|
|
500
|
+
---
|
|
501
|
+
|
|
502
|
+
## 7. 工作流程
|
|
503
|
+
|
|
504
|
+
### 7.1 开始任务前
|
|
505
|
+
1. 首先阅读本文件(AGENTS.md)理解项目规范
|
|
506
|
+
2. 查看相关文档和现有代码实现模式
|
|
507
|
+
3. 参考类似功能的实现(如新增适配器先看现有适配器)
|
|
508
|
+
|
|
509
|
+
### 7.2 开发中
|
|
510
|
+
1. 遵循编码规范
|
|
511
|
+
2. 边开发边写测试(TDD 优先)
|
|
512
|
+
3. 保持功能模块备注完整
|
|
513
|
+
4. 不破坏现有测试
|
|
514
|
+
|
|
515
|
+
### 7.3 完成任务后
|
|
516
|
+
1. 运行验收清单中的所有检查
|
|
517
|
+
2. 运行所有验证命令确保通过
|
|
518
|
+
3. 确认没有遗漏的备注信息
|
|
519
|
+
|
|
520
|
+
---
|
|
521
|
+
|
|
522
|
+
## 8. 常见问题参考
|
|
523
|
+
|
|
524
|
+
### Q: 新增一个最简单的适配器需要做什么?
|
|
525
|
+
A: 参考现有适配器(如 [agnes.py](file:///Users/skywing/agn-sdk/agn/adapters/agnes.py)),创建继承 BaseAdapter 的类,实现必要方法,注册到工厂,写测试。
|
|
526
|
+
|
|
527
|
+
### Q: 参数如何做映射?
|
|
528
|
+
A: 参考 [options.py](file:///Users/skywing/agn-sdk/agn/models/options.py) 中的 `ParameterMapping`,可以定义通用参数到厂商特定参数的映射规则。OpenAI 兼容的适配器可以直接使用 `OPENAI_COMPATIBLE_MAPPING`。
|
|
529
|
+
|
|
530
|
+
### Q: 如何处理不同模型的特有参数?
|
|
531
|
+
A: 使用 `**kwargs` 透传,适配器内部从 kwargs 中提取特有参数。
|
|
532
|
+
|
|
533
|
+
### Q: 视频生成的轮询机制怎么实现?
|
|
534
|
+
A: `video_create()` 返回 `VideoTask`(含 task_id),`video_poll()` 接收 task_id 返回 `VideoStatus`(含 status, video_url, progress, error)。
|
|
535
|
+
|
|
536
|
+
---
|
|
537
|
+
|
|
538
|
+
**最后提醒**:所有代码修改完成后,务必运行完整的测试和代码检查,确保符合本文件中的所有规范!
|