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.
Files changed (39) hide show
  1. jiuzhang_sdk-0.1.0a10/.gitignore +112 -0
  2. jiuzhang_sdk-0.1.0a10/PKG-INFO +141 -0
  3. jiuzhang_sdk-0.1.0a10/README.md +113 -0
  4. jiuzhang_sdk-0.1.0a10/pyproject.toml +141 -0
  5. jiuzhang_sdk-0.1.0a10/src/jiuzhang/__init__.py +56 -0
  6. jiuzhang_sdk-0.1.0a10/src/jiuzhang/auth/__init__.py +7 -0
  7. jiuzhang_sdk-0.1.0a10/src/jiuzhang/auth/token_manager.py +86 -0
  8. jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/__init__.py +8 -0
  9. jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/client.py +276 -0
  10. jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/models.py +39 -0
  11. jiuzhang_sdk-0.1.0a10/src/jiuzhang/cloud/transport.py +130 -0
  12. jiuzhang_sdk-0.1.0a10/src/jiuzhang/errors.py +81 -0
  13. jiuzhang_sdk-0.1.0a10/src/jiuzhang/exceptions.py +132 -0
  14. jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/__init__.py +14 -0
  15. jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/analysis.py +146 -0
  16. jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/mock.py +120 -0
  17. jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/params.py +115 -0
  18. jiuzhang_sdk-0.1.0a10/src/jiuzhang/gbs/result.py +169 -0
  19. jiuzhang_sdk-0.1.0a10/src/jiuzhang/jupyter.py +61 -0
  20. jiuzhang_sdk-0.1.0a10/src/jiuzhang/logging_utils.py +58 -0
  21. jiuzhang_sdk-0.1.0a10/src/jiuzhang/result.py +61 -0
  22. jiuzhang_sdk-0.1.0a10/src/jiuzhang/settings.py +55 -0
  23. jiuzhang_sdk-0.1.0a10/src/jiuzhang/version.py +14 -0
  24. jiuzhang_sdk-0.1.0a10/tests/__init__.py +0 -0
  25. jiuzhang_sdk-0.1.0a10/tests/conftest.py +11 -0
  26. jiuzhang_sdk-0.1.0a10/tests/integration/test_cloud_platform_mock.py +92 -0
  27. jiuzhang_sdk-0.1.0a10/tests/integration/test_jupyter_integration.py +76 -0
  28. jiuzhang_sdk-0.1.0a10/tests/unit/__init__.py +0 -0
  29. jiuzhang_sdk-0.1.0a10/tests/unit/test_cloud_client.py +114 -0
  30. jiuzhang_sdk-0.1.0a10/tests/unit/test_cloud_transport.py +67 -0
  31. jiuzhang_sdk-0.1.0a10/tests/unit/test_domain.py +60 -0
  32. jiuzhang_sdk-0.1.0a10/tests/unit/test_exceptions.py +165 -0
  33. jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_analysis.py +50 -0
  34. jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_mock.py +37 -0
  35. jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_params.py +60 -0
  36. jiuzhang_sdk-0.1.0a10/tests/unit/test_gbs_result.py +57 -0
  37. jiuzhang_sdk-0.1.0a10/tests/unit/test_logging_utils.py +77 -0
  38. jiuzhang_sdk-0.1.0a10/tests/unit/test_result.py +69 -0
  39. 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,7 @@
1
+ """认证模块:token 本地校验与持有。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from jiuzhang.auth.token_manager import TokenManager
6
+
7
+ __all__ = ["TokenManager"]
@@ -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
+ )
@@ -0,0 +1,8 @@
1
+ """九章云平台 HTTP 客户端主线。"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from jiuzhang.cloud.client import CloudClient
6
+ from jiuzhang.cloud.transport import HttpTransport
7
+
8
+ __all__ = ["CloudClient", "HttpTransport"]