jiuzhang-sdk 0.1.0a10__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.
- jiuzhang_sdk-0.1.0a10/.gitignore +112 -0
- jiuzhang_sdk-0.1.0a10/PKG-INFO +141 -0
- jiuzhang_sdk-0.1.0a10/README.md +113 -0
- jiuzhang_sdk-0.1.0a10/pyproject.toml +141 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/__init__.py +56 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/auth/__init__.py +7 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/auth/token_manager.py +86 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/__init__.py +8 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/client.py +276 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/models.py +39 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/transport.py +130 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/errors.py +81 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/exceptions.py +132 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/__init__.py +14 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/analysis.py +146 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/mock.py +120 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/params.py +115 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/result.py +169 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/jupyter.py +61 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/logging_utils.py +58 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/result.py +61 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/settings.py +55 -0
- jiuzhang_sdk-0.1.0a10/src/jiuzhang/version.py +14 -0
- jiuzhang_sdk-0.1.0a10/tests/__init__.py +0 -0
- jiuzhang_sdk-0.1.0a10/tests/conftest.py +11 -0
- jiuzhang_sdk-0.1.0a10/tests/integration/test_cloud_platform_mock.py +92 -0
- jiuzhang_sdk-0.1.0a10/tests/integration/test_jupyter_integration.py +76 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/__init__.py +0 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_cloud_client.py +114 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_cloud_transport.py +67 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_domain.py +60 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_exceptions.py +165 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_analysis.py +50 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_mock.py +37 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_params.py +60 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_result.py +57 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_logging_utils.py +77 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_result.py +69 -0
- jiuzhang_sdk-0.1.0a10/tests/unit/test_smoke.py +132 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# ---------- Python ----------
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
|
|
8
|
+
# Build & dist
|
|
9
|
+
build/
|
|
10
|
+
dist/
|
|
11
|
+
release/
|
|
12
|
+
*.egg-info/
|
|
13
|
+
*.egg
|
|
14
|
+
*.whl
|
|
15
|
+
*.tar.gz
|
|
16
|
+
wheels/
|
|
17
|
+
pip-wheel-metadata/
|
|
18
|
+
share/python-wheels/
|
|
19
|
+
|
|
20
|
+
# Virtual envs
|
|
21
|
+
.venv/
|
|
22
|
+
venv/
|
|
23
|
+
env/
|
|
24
|
+
ENV/
|
|
25
|
+
|
|
26
|
+
# uv
|
|
27
|
+
.uv/
|
|
28
|
+
uv.lock.bak
|
|
29
|
+
|
|
30
|
+
# Testing & coverage
|
|
31
|
+
.pytest_cache/
|
|
32
|
+
.coverage
|
|
33
|
+
.coverage.*
|
|
34
|
+
htmlcov/
|
|
35
|
+
.tox/
|
|
36
|
+
.nox/
|
|
37
|
+
coverage.xml
|
|
38
|
+
*.cover
|
|
39
|
+
|
|
40
|
+
# Type checkers & linters
|
|
41
|
+
.mypy_cache/
|
|
42
|
+
.ruff_cache/
|
|
43
|
+
.pytype/
|
|
44
|
+
.dmypy.json
|
|
45
|
+
dmypy.json
|
|
46
|
+
|
|
47
|
+
# Docs build
|
|
48
|
+
docs/_build/
|
|
49
|
+
site/
|
|
50
|
+
|
|
51
|
+
# Jupyter
|
|
52
|
+
.ipynb_checkpoints/
|
|
53
|
+
|
|
54
|
+
# ---------- IDE ----------
|
|
55
|
+
.idea/
|
|
56
|
+
.vscode/
|
|
57
|
+
.claude/
|
|
58
|
+
*.swp
|
|
59
|
+
*.swo
|
|
60
|
+
*~
|
|
61
|
+
|
|
62
|
+
# ---------- OS ----------
|
|
63
|
+
.DS_Store
|
|
64
|
+
Thumbs.db
|
|
65
|
+
desktop.ini
|
|
66
|
+
|
|
67
|
+
# ---------- 项目私密 ----------
|
|
68
|
+
群聊记录/
|
|
69
|
+
*.local.md
|
|
70
|
+
.env
|
|
71
|
+
.env.*
|
|
72
|
+
!.env.example
|
|
73
|
+
doc/~$*
|
|
74
|
+
*.pptx
|
|
75
|
+
Claude Conversations/
|
|
76
|
+
|
|
77
|
+
# Python
|
|
78
|
+
.eggs/
|
|
79
|
+
|
|
80
|
+
# IDE
|
|
81
|
+
remote/
|
|
82
|
+
|
|
83
|
+
# Claude Code local settings
|
|
84
|
+
.claude/settings.local.json
|
|
85
|
+
# Python-generated files
|
|
86
|
+
*.py[oc]
|
|
87
|
+
*.egg-info
|
|
88
|
+
|
|
89
|
+
# IDE
|
|
90
|
+
|
|
91
|
+
# Database
|
|
92
|
+
*.db
|
|
93
|
+
*.sqlite
|
|
94
|
+
*.sqlite3
|
|
95
|
+
|
|
96
|
+
# Logs
|
|
97
|
+
logs/
|
|
98
|
+
*.log
|
|
99
|
+
*.log.*
|
|
100
|
+
|
|
101
|
+
# OS
|
|
102
|
+
dataset/
|
|
103
|
+
.claude
|
|
104
|
+
|
|
105
|
+
debug/
|
|
106
|
+
debug.ipynb
|
|
107
|
+
.agents/
|
|
108
|
+
.codex/
|
|
109
|
+
|
|
110
|
+
# user
|
|
111
|
+
/remote
|
|
112
|
+
/daily_report
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: jiuzhang-sdk
|
|
3
|
+
Version: 0.1.0a10
|
|
4
|
+
Summary: 九章光量子真机云接入软件包(jiuzhang SDK)
|
|
5
|
+
Author: 九章量子 SDK 团队
|
|
6
|
+
License: Proprietary
|
|
7
|
+
Keywords: gbs,jiuzhang,photonic,quantum,sdk
|
|
8
|
+
Classifier: Development Status :: 2 - Pre-Alpha
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: Other/Proprietary License
|
|
11
|
+
Classifier: Operating System :: OS Independent
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
15
|
+
Requires-Python: >=3.12
|
|
16
|
+
Requires-Dist: httpx>=0.27
|
|
17
|
+
Requires-Dist: numpy>=1.26
|
|
18
|
+
Provides-Extra: dev
|
|
19
|
+
Requires-Dist: mypy>=1.11; extra == 'dev'
|
|
20
|
+
Requires-Dist: pre-commit>=3.8; extra == 'dev'
|
|
21
|
+
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
22
|
+
Requires-Dist: pytest-mock>=3; extra == 'dev'
|
|
23
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
24
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
25
|
+
Provides-Extra: jupyter
|
|
26
|
+
Requires-Dist: ipython>=8; extra == 'jupyter'
|
|
27
|
+
Description-Content-Type: text/markdown
|
|
28
|
+
|
|
29
|
+
# jiuzhang SDK 开发说明
|
|
30
|
+
|
|
31
|
+
本目录是 `jiuzhang` Python SDK 的源码工程。仓库根 `README.md` 面向用户和外部
|
|
32
|
+
协作方,本文件面向 SDK 开发维护。
|
|
33
|
+
|
|
34
|
+
## 当前主线
|
|
35
|
+
|
|
36
|
+
当前主线是九章云平台 HTTP SDK:
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
Python / Jupyter
|
|
40
|
+
-> jiuzhang SDK
|
|
41
|
+
-> 九章云平台 API / 本地九章云平台 Mock
|
|
42
|
+
-> 天衍适配器
|
|
43
|
+
-> 天衍平台 / tianyan-Mock
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
SDK 不直接请求天衍平台,不直接请求 tianyan-Mock,也不保留早期 TCP 真机直连
|
|
47
|
+
协议线。
|
|
48
|
+
|
|
49
|
+
## 工程结构
|
|
50
|
+
|
|
51
|
+
```text
|
|
52
|
+
code/
|
|
53
|
+
├── pyproject.toml
|
|
54
|
+
├── README.md
|
|
55
|
+
├── src/jiuzhang/
|
|
56
|
+
│ ├── __init__.py
|
|
57
|
+
│ ├── auth/ # TokenManager
|
|
58
|
+
│ ├── cloud/ # CloudClient / HttpTransport
|
|
59
|
+
│ ├── gbs/ # GBSParams / GBSResult / analysis / mock
|
|
60
|
+
│ ├── jupyter.py # Notebook helpers
|
|
61
|
+
│ ├── settings.py # Settings.from_env()
|
|
62
|
+
│ ├── errors.py
|
|
63
|
+
│ ├── exceptions.py
|
|
64
|
+
│ └── result.py
|
|
65
|
+
└── tests/
|
|
66
|
+
├── unit/
|
|
67
|
+
└── integration/
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 本地开发
|
|
71
|
+
|
|
72
|
+
使用本机 `jzsdk` conda 环境:
|
|
73
|
+
|
|
74
|
+
```powershell
|
|
75
|
+
conda activate jzsdk
|
|
76
|
+
cd C:\Users\Administrator\Documents\Project\gitlab\jiuzhang_sdk\code
|
|
77
|
+
pip install -e ".[dev,jupyter]"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
质量检查:
|
|
81
|
+
|
|
82
|
+
```powershell
|
|
83
|
+
ruff format src tests
|
|
84
|
+
ruff check src tests
|
|
85
|
+
mypy src
|
|
86
|
+
pytest tests
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 公开 API
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
from jiuzhang import CloudClient, TokenManager
|
|
93
|
+
from jiuzhang import GBSParams, GBSResult, parse_gbs_result
|
|
94
|
+
from jiuzhang.gbs.analysis import photon_count_histogram
|
|
95
|
+
from jiuzhang.gbs.mock import generate_mock_samples
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 云平台接口
|
|
99
|
+
|
|
100
|
+
SDK 当前请求九章云平台公开接口:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
POST /estimate
|
|
104
|
+
POST /tasks/submit
|
|
105
|
+
GET /tasks/{task_id}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
认证头:
|
|
109
|
+
|
|
110
|
+
```text
|
|
111
|
+
X-Jiuzhang-API-Key: <api_key>
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
提交任务时自动携带:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
X-Request-Id: <uuid>
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
所有云平台响应先检查 `code`,只有 `code == 0` 才视为业务成功。
|
|
121
|
+
|
|
122
|
+
## 本地 Mock
|
|
123
|
+
|
|
124
|
+
```powershell
|
|
125
|
+
cd C:\Users\Administrator\Documents\Project\gitlab\jiuzhang_sdk
|
|
126
|
+
python local_test/mock_cloud_platform/mock_cloud_platform.py --port 18081 --mode standalone
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
SDK 测试和示例中的 `base_url` 指向本地九章云平台 Mock:
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
http://127.0.0.1:18081
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 版本
|
|
136
|
+
|
|
137
|
+
当前版本:`0.1.0a10`。
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
Proprietary — Copyright © 2026 九章量子.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# jiuzhang SDK 开发说明
|
|
2
|
+
|
|
3
|
+
本目录是 `jiuzhang` Python SDK 的源码工程。仓库根 `README.md` 面向用户和外部
|
|
4
|
+
协作方,本文件面向 SDK 开发维护。
|
|
5
|
+
|
|
6
|
+
## 当前主线
|
|
7
|
+
|
|
8
|
+
当前主线是九章云平台 HTTP SDK:
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
Python / Jupyter
|
|
12
|
+
-> jiuzhang SDK
|
|
13
|
+
-> 九章云平台 API / 本地九章云平台 Mock
|
|
14
|
+
-> 天衍适配器
|
|
15
|
+
-> 天衍平台 / tianyan-Mock
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
SDK 不直接请求天衍平台,不直接请求 tianyan-Mock,也不保留早期 TCP 真机直连
|
|
19
|
+
协议线。
|
|
20
|
+
|
|
21
|
+
## 工程结构
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
code/
|
|
25
|
+
├── pyproject.toml
|
|
26
|
+
├── README.md
|
|
27
|
+
├── src/jiuzhang/
|
|
28
|
+
│ ├── __init__.py
|
|
29
|
+
│ ├── auth/ # TokenManager
|
|
30
|
+
│ ├── cloud/ # CloudClient / HttpTransport
|
|
31
|
+
│ ├── gbs/ # GBSParams / GBSResult / analysis / mock
|
|
32
|
+
│ ├── jupyter.py # Notebook helpers
|
|
33
|
+
│ ├── settings.py # Settings.from_env()
|
|
34
|
+
│ ├── errors.py
|
|
35
|
+
│ ├── exceptions.py
|
|
36
|
+
│ └── result.py
|
|
37
|
+
└── tests/
|
|
38
|
+
├── unit/
|
|
39
|
+
└── integration/
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 本地开发
|
|
43
|
+
|
|
44
|
+
使用本机 `jzsdk` conda 环境:
|
|
45
|
+
|
|
46
|
+
```powershell
|
|
47
|
+
conda activate jzsdk
|
|
48
|
+
cd C:\Users\Administrator\Documents\Project\gitlab\jiuzhang_sdk\code
|
|
49
|
+
pip install -e ".[dev,jupyter]"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
质量检查:
|
|
53
|
+
|
|
54
|
+
```powershell
|
|
55
|
+
ruff format src tests
|
|
56
|
+
ruff check src tests
|
|
57
|
+
mypy src
|
|
58
|
+
pytest tests
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## 公开 API
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
from jiuzhang import CloudClient, TokenManager
|
|
65
|
+
from jiuzhang import GBSParams, GBSResult, parse_gbs_result
|
|
66
|
+
from jiuzhang.gbs.analysis import photon_count_histogram
|
|
67
|
+
from jiuzhang.gbs.mock import generate_mock_samples
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 云平台接口
|
|
71
|
+
|
|
72
|
+
SDK 当前请求九章云平台公开接口:
|
|
73
|
+
|
|
74
|
+
```text
|
|
75
|
+
POST /estimate
|
|
76
|
+
POST /tasks/submit
|
|
77
|
+
GET /tasks/{task_id}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
认证头:
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
X-Jiuzhang-API-Key: <api_key>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
提交任务时自动携带:
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
X-Request-Id: <uuid>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
所有云平台响应先检查 `code`,只有 `code == 0` 才视为业务成功。
|
|
93
|
+
|
|
94
|
+
## 本地 Mock
|
|
95
|
+
|
|
96
|
+
```powershell
|
|
97
|
+
cd C:\Users\Administrator\Documents\Project\gitlab\jiuzhang_sdk
|
|
98
|
+
python local_test/mock_cloud_platform/mock_cloud_platform.py --port 18081 --mode standalone
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
SDK 测试和示例中的 `base_url` 指向本地九章云平台 Mock:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
http://127.0.0.1:18081
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## 版本
|
|
108
|
+
|
|
109
|
+
当前版本:`0.1.0a10`。
|
|
110
|
+
|
|
111
|
+
## License
|
|
112
|
+
|
|
113
|
+
Proprietary — Copyright © 2026 九章量子.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "jiuzhang-sdk"
|
|
3
|
+
version = "0.1.0a10"
|
|
4
|
+
description = "九章光量子真机云接入软件包(jiuzhang SDK)"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12"
|
|
7
|
+
license = { text = "Proprietary" }
|
|
8
|
+
authors = [
|
|
9
|
+
{ name = "九章量子 SDK 团队" },
|
|
10
|
+
]
|
|
11
|
+
keywords = ["quantum", "photonic", "gbs", "jiuzhang", "sdk"]
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 2 - Pre-Alpha",
|
|
14
|
+
"Intended Audience :: Developers",
|
|
15
|
+
"License :: Other/Proprietary License",
|
|
16
|
+
"Operating System :: OS Independent",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Topic :: Scientific/Engineering :: Physics",
|
|
20
|
+
]
|
|
21
|
+
dependencies = [
|
|
22
|
+
"httpx>=0.27",
|
|
23
|
+
"numpy>=1.26",
|
|
24
|
+
]
|
|
25
|
+
|
|
26
|
+
[project.optional-dependencies]
|
|
27
|
+
dev = [
|
|
28
|
+
"pytest>=8",
|
|
29
|
+
"pytest-cov>=5",
|
|
30
|
+
"pytest-mock>=3",
|
|
31
|
+
"ruff>=0.6",
|
|
32
|
+
"mypy>=1.11",
|
|
33
|
+
"pre-commit>=3.8",
|
|
34
|
+
]
|
|
35
|
+
jupyter = [
|
|
36
|
+
"ipython>=8",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[build-system]
|
|
40
|
+
requires = ["hatchling"]
|
|
41
|
+
build-backend = "hatchling.build"
|
|
42
|
+
|
|
43
|
+
[tool.hatch.build.targets.wheel]
|
|
44
|
+
packages = ["src/jiuzhang"]
|
|
45
|
+
|
|
46
|
+
[tool.hatch.build.targets.sdist]
|
|
47
|
+
include = [
|
|
48
|
+
"src/jiuzhang",
|
|
49
|
+
"tests",
|
|
50
|
+
"README.md",
|
|
51
|
+
"pyproject.toml",
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
# -------------------------------------------------------------------
|
|
55
|
+
# ruff: 格式化 + lint + import 排序 + docstring 规范
|
|
56
|
+
# -------------------------------------------------------------------
|
|
57
|
+
[tool.ruff]
|
|
58
|
+
line-length = 100
|
|
59
|
+
target-version = "py312"
|
|
60
|
+
src = ["src", "tests"]
|
|
61
|
+
extend-exclude = [".venv", "dist", "build"]
|
|
62
|
+
|
|
63
|
+
[tool.ruff.lint]
|
|
64
|
+
# E/W: pycodestyle, F: pyflakes, I: isort, N: pep8-naming, UP: pyupgrade,
|
|
65
|
+
# B: flake8-bugbear, SIM: flake8-simplify, RUF: ruff-specific,
|
|
66
|
+
# D: pydocstyle (启用 Google 风格 docstring 校验)
|
|
67
|
+
select = ["E", "F", "W", "I", "N", "UP", "B", "SIM", "RUF", "D"]
|
|
68
|
+
ignore = [
|
|
69
|
+
# 模块级 docstring 不强制(D100 模块、D104 包 __init__)
|
|
70
|
+
"D100",
|
|
71
|
+
"D104",
|
|
72
|
+
# 中文 docstring 适配:句号 "。" 不被 D415 识别为结束符
|
|
73
|
+
"D415",
|
|
74
|
+
# 中文 docstring/字符串/注释允许使用全角标点(,。:;())
|
|
75
|
+
"RUF001",
|
|
76
|
+
"RUF002",
|
|
77
|
+
"RUF003",
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
[tool.ruff.lint.per-file-ignores]
|
|
81
|
+
# 测试代码不要求 docstring
|
|
82
|
+
"tests/**" = ["D"]
|
|
83
|
+
|
|
84
|
+
[tool.ruff.lint.pydocstyle]
|
|
85
|
+
convention = "google"
|
|
86
|
+
|
|
87
|
+
[tool.ruff.format]
|
|
88
|
+
quote-style = "double"
|
|
89
|
+
indent-style = "space"
|
|
90
|
+
line-ending = "auto"
|
|
91
|
+
|
|
92
|
+
# -------------------------------------------------------------------
|
|
93
|
+
# mypy: 严格类型检查
|
|
94
|
+
# -------------------------------------------------------------------
|
|
95
|
+
[tool.mypy]
|
|
96
|
+
python_version = "3.12"
|
|
97
|
+
strict = true
|
|
98
|
+
warn_return_any = true
|
|
99
|
+
warn_unused_ignores = true
|
|
100
|
+
warn_redundant_casts = true
|
|
101
|
+
warn_unused_configs = true
|
|
102
|
+
disallow_untyped_defs = true
|
|
103
|
+
disallow_incomplete_defs = true
|
|
104
|
+
check_untyped_defs = true
|
|
105
|
+
no_implicit_optional = true
|
|
106
|
+
show_error_codes = true
|
|
107
|
+
show_column_numbers = true
|
|
108
|
+
|
|
109
|
+
# -------------------------------------------------------------------
|
|
110
|
+
# pytest: 测试配置
|
|
111
|
+
# -------------------------------------------------------------------
|
|
112
|
+
[tool.pytest.ini_options]
|
|
113
|
+
minversion = "8.0"
|
|
114
|
+
testpaths = ["tests"]
|
|
115
|
+
addopts = [
|
|
116
|
+
"-ra",
|
|
117
|
+
"--strict-markers",
|
|
118
|
+
"--strict-config",
|
|
119
|
+
"--cov=jiuzhang",
|
|
120
|
+
"--cov-report=term-missing",
|
|
121
|
+
]
|
|
122
|
+
markers = [
|
|
123
|
+
"unit: 单元测试(默认)",
|
|
124
|
+
"integration: 集成测试(需要本地 Mock 或外部 HTTP 服务)",
|
|
125
|
+
"slow: 慢测试(默认跳过)",
|
|
126
|
+
]
|
|
127
|
+
|
|
128
|
+
# -------------------------------------------------------------------
|
|
129
|
+
# coverage: 覆盖率配置
|
|
130
|
+
# -------------------------------------------------------------------
|
|
131
|
+
[tool.coverage.run]
|
|
132
|
+
source = ["jiuzhang"]
|
|
133
|
+
branch = true
|
|
134
|
+
|
|
135
|
+
[tool.coverage.report]
|
|
136
|
+
exclude_lines = [
|
|
137
|
+
"pragma: no cover",
|
|
138
|
+
"raise NotImplementedError",
|
|
139
|
+
"if TYPE_CHECKING:",
|
|
140
|
+
"if __name__ == .__main__.:",
|
|
141
|
+
]
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"""jiuzhang — 九章光量子云接入 Python SDK。
|
|
2
|
+
|
|
3
|
+
公开 API 由本模块的 ``__all__`` 锁定。未在其中列出的符号视为内部实现,
|
|
4
|
+
任何版本均可能变更。集成方应通过::
|
|
5
|
+
|
|
6
|
+
from jiuzhang import CloudClient, TokenManager
|
|
7
|
+
|
|
8
|
+
的方式引用,避免直接 import 子模块的私有路径。
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from jiuzhang.auth import TokenManager
|
|
14
|
+
from jiuzhang.cloud import CloudClient, HttpTransport
|
|
15
|
+
from jiuzhang.errors import _populate_error_code_to_exception
|
|
16
|
+
from jiuzhang.exceptions import (
|
|
17
|
+
InternalError,
|
|
18
|
+
InvalidParameterError,
|
|
19
|
+
JiuzhangError,
|
|
20
|
+
MachineBusyError,
|
|
21
|
+
MachineOfflineError,
|
|
22
|
+
PermissionDeniedError,
|
|
23
|
+
TimeoutError,
|
|
24
|
+
TokenExpiredError,
|
|
25
|
+
TokenInvalidError,
|
|
26
|
+
)
|
|
27
|
+
from jiuzhang.gbs import GBSParams, GBSResult, input_mode_count, output_mode_count, parse_gbs_result
|
|
28
|
+
from jiuzhang.settings import Settings
|
|
29
|
+
from jiuzhang.version import __version__
|
|
30
|
+
|
|
31
|
+
# 在所有异常类完成导入后填充错误码 → 异常类映射,打破 errors.py 与
|
|
32
|
+
# exceptions.py 之间的循环依赖。
|
|
33
|
+
_populate_error_code_to_exception()
|
|
34
|
+
del _populate_error_code_to_exception
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"CloudClient",
|
|
38
|
+
"GBSParams",
|
|
39
|
+
"GBSResult",
|
|
40
|
+
"HttpTransport",
|
|
41
|
+
"InternalError",
|
|
42
|
+
"InvalidParameterError",
|
|
43
|
+
"JiuzhangError",
|
|
44
|
+
"MachineBusyError",
|
|
45
|
+
"MachineOfflineError",
|
|
46
|
+
"PermissionDeniedError",
|
|
47
|
+
"Settings",
|
|
48
|
+
"TimeoutError",
|
|
49
|
+
"TokenExpiredError",
|
|
50
|
+
"TokenInvalidError",
|
|
51
|
+
"TokenManager",
|
|
52
|
+
"__version__",
|
|
53
|
+
"input_mode_count",
|
|
54
|
+
"output_mode_count",
|
|
55
|
+
"parse_gbs_result",
|
|
56
|
+
]
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""TokenManager — API Key 本地格式校验与持有。
|
|
2
|
+
|
|
3
|
+
当前九章云平台 API Key 真实格式尚未冻结,SDK 暂接受 ``JZ-`` 或 ``PQ-``
|
|
4
|
+
前缀 + 32 位十六进制小写字符作为本地占位校验规则,例如::
|
|
5
|
+
|
|
6
|
+
JZ-3f2c2a3b0f7a4a2ab1cdb0b7d2f1a9c4
|
|
7
|
+
PQ-3f2c2a3b0f7a4a2ab1cdb0b7d2f1a9c4
|
|
8
|
+
|
|
9
|
+
本模块仅做客户端本地格式校验,**不产生任何网络请求**。后续云平台认证规则
|
|
10
|
+
确定后,应优先在本模块集中调整 API Key 格式校验与脱敏展示逻辑。
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import re
|
|
16
|
+
from typing import Any
|
|
17
|
+
|
|
18
|
+
from jiuzhang.exceptions import TokenInvalidError
|
|
19
|
+
from jiuzhang.result import make_result
|
|
20
|
+
|
|
21
|
+
__all__ = ["TokenManager"]
|
|
22
|
+
|
|
23
|
+
_TOKEN_PATTERN = re.compile(r"^(JZ|PQ)-[0-9a-f]{32}$")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TokenManager:
|
|
27
|
+
"""持有 API Key 并提供本地格式校验。
|
|
28
|
+
|
|
29
|
+
Attributes:
|
|
30
|
+
token_id: 调用方传入的 API Key 字符串。
|
|
31
|
+
|
|
32
|
+
Examples:
|
|
33
|
+
>>> tm = TokenManager(token_id="PQ-3f2c2a3b0f7a4a2ab1cdb0b7d2f1a9c4")
|
|
34
|
+
>>> result = tm.validate_token()
|
|
35
|
+
>>> result["code"]
|
|
36
|
+
'OK'
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, token_id: str) -> None:
|
|
40
|
+
"""构造 TokenManager。
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
token_id: API Key 字符串。本构造函数不做校验,校验在
|
|
44
|
+
:meth:`validate_token` 中执行。
|
|
45
|
+
"""
|
|
46
|
+
self.token_id: str = token_id
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def masked_token(self) -> str:
|
|
50
|
+
"""脱敏展示:保留前缀与末 4 位,中间用 ``***`` 替代。
|
|
51
|
+
|
|
52
|
+
Examples:
|
|
53
|
+
>>> TokenManager("PQ-3f2c2a3b0f7a4a2ab1cdb0b7d2f1a9c4").masked_token
|
|
54
|
+
'PQ-3f2c***a9c4'
|
|
55
|
+
"""
|
|
56
|
+
if len(self.token_id) >= 10:
|
|
57
|
+
return self.token_id[:7] + "***" + self.token_id[-4:]
|
|
58
|
+
return "***"
|
|
59
|
+
|
|
60
|
+
def validate_token(self) -> dict[str, Any]:
|
|
61
|
+
"""对持有的 API Key 做本地格式校验。
|
|
62
|
+
|
|
63
|
+
校验规则:
|
|
64
|
+
|
|
65
|
+
* 前缀暂定为 ``JZ-`` 或 ``PQ-``
|
|
66
|
+
* 前缀后为 32 位十六进制小写字符
|
|
67
|
+
* 总长度为 35 个字符
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
统一返回结构 dict。校验通过时 ``code == "OK"``,
|
|
71
|
+
``data`` 含 ``tokenId``(脱敏)与 ``format``(``"VALID"``)。
|
|
72
|
+
|
|
73
|
+
Raises:
|
|
74
|
+
TokenInvalidError: 格式不符合规则。
|
|
75
|
+
"""
|
|
76
|
+
if not _TOKEN_PATTERN.match(self.token_id):
|
|
77
|
+
raise TokenInvalidError(
|
|
78
|
+
"API Key 格式非法:期望 'JZ-' 或 'PQ-' + 32 位十六进制小写,"
|
|
79
|
+
f"实际为 {self.masked_token!r}",
|
|
80
|
+
details={"token_masked": self.masked_token},
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
return make_result(
|
|
84
|
+
message="token 校验通过",
|
|
85
|
+
data={"tokenId": self.masked_token, "format": "VALID"},
|
|
86
|
+
)
|