@zhuoyuezs/ml-platform 0.1.18 → 0.2.0
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.
- package/checksums.json +16 -16
- package/package.json +1 -1
- package/release.json +12 -12
- package/runtime/business-client/README.md +5 -2
- package/runtime/business-client/package-lock.json +2 -2
- package/runtime/business-client/package.json +1 -1
- package/runtime/business-client/src/cli.js +10 -4
- package/skills/model-deployment-management/SKILL.md +16 -4
- package/skills/model-deployment-management/references/contracts.md +43 -7
- package/skills/model-deployment-management/references/operations.md +25 -1
- package/skills/model-deployment-management/references/troubleshooting.md +10 -0
- package/skills/model-lifecycle-management/references/packaging.md +8 -0
package/checksums.json
CHANGED
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
"files": [
|
|
3
3
|
{
|
|
4
4
|
"path": "runtime/business-client/README.md",
|
|
5
|
-
"sha256": "sha256:
|
|
6
|
-
"size_bytes":
|
|
5
|
+
"sha256": "sha256:61708adaee4479fe138ac5e6df1adc02be09cfeb6c30a7f9211ccc372c0e8ced",
|
|
6
|
+
"size_bytes": 7553
|
|
7
7
|
},
|
|
8
8
|
{
|
|
9
9
|
"path": "runtime/business-client/package-lock.json",
|
|
10
|
-
"sha256": "sha256:
|
|
10
|
+
"sha256": "sha256:ff46c68537d57d95b324318ab10a0b70847afa6db15a9223b74b6bc074925a5c",
|
|
11
11
|
"size_bytes": 381
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"path": "runtime/business-client/package.json",
|
|
15
|
-
"sha256": "sha256:
|
|
15
|
+
"sha256": "sha256:3a82339cbb18e0e205647860f72a4a1ecbaf3182e22431c7810dd5e3e32bac19",
|
|
16
16
|
"size_bytes": 501
|
|
17
17
|
},
|
|
18
18
|
{
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"path": "runtime/business-client/src/cli.js",
|
|
25
|
-
"sha256": "sha256:
|
|
26
|
-
"size_bytes":
|
|
25
|
+
"sha256": "sha256:255c1ddf9521f7d6b336122a4678b1e9aab34e1ff4e894395a9e69316bacb4ad",
|
|
26
|
+
"size_bytes": 54119
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"path": "runtime/business-client/src/config.js",
|
|
@@ -117,8 +117,8 @@
|
|
|
117
117
|
},
|
|
118
118
|
{
|
|
119
119
|
"path": "skills/model-deployment-management/SKILL.md",
|
|
120
|
-
"sha256": "sha256:
|
|
121
|
-
"size_bytes":
|
|
120
|
+
"sha256": "sha256:d50f64fa709c8ff36da97c60ce0d20b1217d1d9f78f602048f49c0c4bbab7ea2",
|
|
121
|
+
"size_bytes": 3927
|
|
122
122
|
},
|
|
123
123
|
{
|
|
124
124
|
"path": "skills/model-deployment-management/agents/openai.yaml",
|
|
@@ -127,18 +127,18 @@
|
|
|
127
127
|
},
|
|
128
128
|
{
|
|
129
129
|
"path": "skills/model-deployment-management/references/contracts.md",
|
|
130
|
-
"sha256": "sha256:
|
|
131
|
-
"size_bytes":
|
|
130
|
+
"sha256": "sha256:de9fd3de8d88179b09108ee0778fb83fbffa304353706a3bbc14ae3d9276ac01",
|
|
131
|
+
"size_bytes": 5417
|
|
132
132
|
},
|
|
133
133
|
{
|
|
134
134
|
"path": "skills/model-deployment-management/references/operations.md",
|
|
135
|
-
"sha256": "sha256:
|
|
136
|
-
"size_bytes":
|
|
135
|
+
"sha256": "sha256:93977ec65a8b1ac51a5134ab98ac095e177de537c81f0db447ad97fb8a7e910f",
|
|
136
|
+
"size_bytes": 4455
|
|
137
137
|
},
|
|
138
138
|
{
|
|
139
139
|
"path": "skills/model-deployment-management/references/troubleshooting.md",
|
|
140
|
-
"sha256": "sha256:
|
|
141
|
-
"size_bytes":
|
|
140
|
+
"sha256": "sha256:08762d603b938375cd3a76539c1d0320337d48f5bcd5ba061b8f16eaf35f9268",
|
|
141
|
+
"size_bytes": 3555
|
|
142
142
|
},
|
|
143
143
|
{
|
|
144
144
|
"path": "skills/model-lifecycle-management/SKILL.md",
|
|
@@ -162,8 +162,8 @@
|
|
|
162
162
|
},
|
|
163
163
|
{
|
|
164
164
|
"path": "skills/model-lifecycle-management/references/packaging.md",
|
|
165
|
-
"sha256": "sha256:
|
|
166
|
-
"size_bytes":
|
|
165
|
+
"sha256": "sha256:1e3c5080fa085255b29223890c333333ee6011326b56f1b2e0b859b0d73d2ec0",
|
|
166
|
+
"size_bytes": 6146
|
|
167
167
|
},
|
|
168
168
|
{
|
|
169
169
|
"path": "skills/model-lifecycle-management/references/training-contracts.md",
|
package/package.json
CHANGED
package/release.json
CHANGED
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"entrypoint": "src/cli.js",
|
|
14
14
|
"name": "ml-platform",
|
|
15
15
|
"path": "runtime/business-client",
|
|
16
|
-
"sha256": "sha256:
|
|
17
|
-
"version": "0.
|
|
16
|
+
"sha256": "sha256:41f143a9451dbd740ec08070a33e21d4580e246cf4b282e0ffda6d9f6f9f880a",
|
|
17
|
+
"version": "0.8.0"
|
|
18
18
|
},
|
|
19
19
|
"policy_sha256": "sha256:02fbde0134696b78c0c365d6e0b76c9814227208da5b2b3d4e5dbd82dc4a3606",
|
|
20
20
|
"public_schema_versions": [
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"ml_data_platform.feature_set/v1",
|
|
26
26
|
"ml_data_platform.dataset_manifest/v1"
|
|
27
27
|
],
|
|
28
|
-
"release_version": "0.
|
|
28
|
+
"release_version": "0.2.0",
|
|
29
29
|
"runtime_requirements": {
|
|
30
30
|
"node": ">=18",
|
|
31
31
|
"os": [
|
|
@@ -37,22 +37,22 @@
|
|
|
37
37
|
"skills": {
|
|
38
38
|
"feature-management": {
|
|
39
39
|
"path": "skills/feature-management",
|
|
40
|
-
"requires_cli": ">=0.
|
|
41
|
-
"revision": "0.
|
|
40
|
+
"requires_cli": ">=0.8.0 <0.9.0",
|
|
41
|
+
"revision": "0.2.0",
|
|
42
42
|
"sha256": "sha256:d32f0306f129d7bf76eb037fe239c84dd3c29c64b61600799d6e40320784bb10"
|
|
43
43
|
},
|
|
44
44
|
"model-deployment-management": {
|
|
45
45
|
"path": "skills/model-deployment-management",
|
|
46
|
-
"requires_cli": ">=0.
|
|
47
|
-
"revision": "0.
|
|
48
|
-
"sha256": "sha256:
|
|
46
|
+
"requires_cli": ">=0.8.0 <0.9.0",
|
|
47
|
+
"revision": "0.2.0",
|
|
48
|
+
"sha256": "sha256:d81becca0076d0513e7b8277e7584d9f810db755aa56e79235df68d0f7a7659b"
|
|
49
49
|
},
|
|
50
50
|
"model-lifecycle-management": {
|
|
51
51
|
"path": "skills/model-lifecycle-management",
|
|
52
|
-
"requires_cli": ">=0.
|
|
53
|
-
"revision": "0.
|
|
54
|
-
"sha256": "sha256:
|
|
52
|
+
"requires_cli": ">=0.8.0 <0.9.0",
|
|
53
|
+
"revision": "0.2.0",
|
|
54
|
+
"sha256": "sha256:5a911eff6a4c188d8e3709f37e4f37819effea61db9f5a015e6ec4dddd4a0ec7"
|
|
55
55
|
}
|
|
56
56
|
},
|
|
57
|
-
"source_commit": "
|
|
57
|
+
"source_commit": "aa4c64af0715b168edd4d50766f7b6bf851763ff"
|
|
58
58
|
}
|
|
@@ -76,10 +76,13 @@ ml-platform get-deployment-events <deployment-id> --limit 100 --offset 0
|
|
|
76
76
|
ml-platform predict-deployment <deployment-id> /absolute/path/to/request.json
|
|
77
77
|
```
|
|
78
78
|
|
|
79
|
-
部署文件可用 `inference_policy` 配置默认执行 horizon
|
|
79
|
+
部署文件可用 `inference_policy` 配置默认执行 horizon 和输出窗口。`boundary` 默认
|
|
80
|
+
`[start,end)`,也可显式使用 `(start,end]`。例如 15 分钟频率、
|
|
80
81
|
当天 00:00 cutoff、只返回次日全天时,配置 `horizon=2d` 和 `[1d,2d)`;模型必须具备
|
|
81
82
|
192 点输出能力,响应返回 96 点。请求可省略 `horizon` 和 `output_window` 使用部署默认值,
|
|
82
|
-
也可携带其中任意一项覆盖;覆盖值仍受模型长度、频率和窗口边界校验。
|
|
83
|
+
也可携带其中任意一项覆盖;覆盖值仍受模型长度、频率和窗口边界校验。8 天、768 点模型要
|
|
84
|
+
返回次日 00:15 至第八天 24:00,可配置
|
|
85
|
+
`{"start_offset":"1d","end_offset":"8d","boundary":"(start,end]"}`,仍返回 672 点。
|
|
83
86
|
|
|
84
87
|
直接访问已知外部 Serving URL 时仍可使用 `predict-model`。Chronos-2 v2 的
|
|
85
88
|
`known_future` 协变量放在 inline 请求的 `inputs.future_covariates` 中;每个预测步一行,
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhuoyuezs/ml-platform-business-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "@zhuoyuezs/ml-platform-business-client",
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.8.0",
|
|
10
10
|
"license": "UNLICENSED",
|
|
11
11
|
"bin": {
|
|
12
12
|
"ml-platform": "src/cli.js"
|
|
@@ -29,7 +29,7 @@ const BUSINESS_COMMANDS = new Set([
|
|
|
29
29
|
"add-dataset", "update-dataset", "delete-dataset", "list-dataset-artifacts",
|
|
30
30
|
"register-operator", "show-operator-specs", "delete-operator", "run-operator",
|
|
31
31
|
"get-job", "wait-job", "retry-job", "cancel-job", "get-dataset-artifact", "download-dataset-artifact", "fetch-inference-data", "fetch-inference-context", "predict-model", "apply",
|
|
32
|
-
"
|
|
32
|
+
"list-system-models", "get-system-model", "list-trainer-definitions", "get-trainer-definition", "register-training-run", "validate-training-run", "submit-training-job", "get-training-job", "retry-training-job", "cancel-training-job",
|
|
33
33
|
"register-evaluation-config", "get-evaluation-config", "register-metric-definition", "get-metric-definition",
|
|
34
34
|
"register-executable-package", "verify-executable-package", "publish-executable-package",
|
|
35
35
|
"validate-evaluation-run", "submit-evaluation", "get-evaluation-run", "get-evaluation-job", "retry-evaluation-job", "cancel-evaluation-job", "list-evaluation-attempts",
|
|
@@ -110,7 +110,8 @@ const COMMAND_USAGE = {
|
|
|
110
110
|
"fetch-inference-data": "fetch-inference-data MANIFEST --cutoff-time TIMESTAMP [--max-workers N] [--max-source-lag-hours HOURS] [--no-validate-freshness] [--allow-missing]",
|
|
111
111
|
"fetch-inference-context": "fetch-inference-context REQUEST_JSON",
|
|
112
112
|
"predict-model": "predict-model REQUEST_JSON --serving-url URL",
|
|
113
|
-
"
|
|
113
|
+
"list-system-models": "list-system-models",
|
|
114
|
+
"get-system-model": "get-system-model NAME VERSION [--project PROJECT]",
|
|
114
115
|
"list-trainer-definitions": "list-trainer-definitions",
|
|
115
116
|
"get-trainer-definition": "get-trainer-definition NAME VERSION [--project PROJECT]",
|
|
116
117
|
"register-training-run": "register-training-run RUN_JSON",
|
|
@@ -598,18 +599,23 @@ async function runBusinessCli(argv) {
|
|
|
598
599
|
} else if (options.command === "get-executable-package") {
|
|
599
600
|
const name = positional(rest, "package name"); const version = positional(rest, "package version");
|
|
600
601
|
result = await client(options).get(`/executable-packages/${encodeURIComponent(name)}/${encodeURIComponent(version)}`);
|
|
602
|
+
} else if (options.command === "list-system-models") {
|
|
603
|
+
result = await client(options).get("/system-models");
|
|
604
|
+
} else if (options.command === "get-system-model") {
|
|
605
|
+
const name = positional(rest, "system model name"); const version = positional(rest, "system model version"); const project = take(rest, "--project", "default");
|
|
606
|
+
result = await client(options).get(`/system-models/${encodeURIComponent(project)}/${encodeURIComponent(name)}/${encodeURIComponent(version)}`);
|
|
601
607
|
} else if (options.command === "list-trainer-definitions") {
|
|
602
608
|
result = await client(options).get("/trainer-definitions");
|
|
603
609
|
} else if (options.command === "get-trainer-definition") {
|
|
604
610
|
const name = positional(rest, "trainer name"); const version = positional(rest, "trainer version"); const project = take(rest, "--project", "default");
|
|
605
611
|
result = await client(options).get(`/trainer-definitions/${encodeURIComponent(project)}/${encodeURIComponent(name)}/${encodeURIComponent(version)}`);
|
|
606
612
|
} else if ({
|
|
607
|
-
"register-
|
|
613
|
+
"register-training-run": "/training-runs", "validate-training-run": "/training-runs/validate",
|
|
608
614
|
"validate-training-job": "/training-jobs/validate", "validate-model-package": "/model-packages/validate", "submit-training-job": "/training-jobs", "register-evaluation-config": "/evaluation-configs", "register-metric-definition": "/metric-definitions",
|
|
609
615
|
"register-executable-package": "/executable-packages", "validate-evaluation-run": "/evaluation-runs/validate", "submit-evaluation": "/evaluation-runs",
|
|
610
616
|
"create-model-package": "/model-packages",
|
|
611
617
|
}[options.command]) {
|
|
612
|
-
const endpoint = { "register-
|
|
618
|
+
const endpoint = { "register-training-run": "/training-runs", "validate-training-run": "/training-runs/validate", "validate-training-job": "/training-jobs/validate", "validate-model-package": "/model-packages/validate", "submit-training-job": "/training-jobs", "register-evaluation-config": "/evaluation-configs", "register-metric-definition": "/metric-definitions", "register-executable-package": "/executable-packages", "validate-evaluation-run": "/evaluation-runs/validate", "submit-evaluation": "/evaluation-runs", "create-model-package": "/model-packages" }[options.command];
|
|
613
619
|
result = await client(options).post(endpoint, readSpec(positional(rest, "request JSON")));
|
|
614
620
|
} else if (/^(get|retry|cancel)-training-job$/.test(options.command)) {
|
|
615
621
|
const jobId = positional(rest, "training job id"); const endpoint = `/training-jobs/${encodeURIComponent(jobId)}`;
|
|
@@ -29,7 +29,8 @@ deployment does not reach `READY` or an operation is rejected.
|
|
|
29
29
|
- Use only a `READY` ModelPackage image with an immutable `@sha256:` digest and
|
|
30
30
|
the package-bound FeatureRetrievalSpec and smoke request.
|
|
31
31
|
- When `DeploymentSpec.inference_policy` is configured, treat its horizon and
|
|
32
|
-
|
|
32
|
+
output window as request defaults. The window boundary defaults to
|
|
33
|
+
`[start,end)` and may explicitly use `(start,end]`. Prediction requests may omit or
|
|
33
34
|
override `horizon` and `output_window`; every effective combination must fit
|
|
34
35
|
the model capacity and sampling grid. In `feature_lookup` mode, never send
|
|
35
36
|
`future_covariates`; the platform retrieves the complete known-future Feature
|
|
@@ -42,9 +43,20 @@ deployment does not reach `READY` or an operation is rejected.
|
|
|
42
43
|
returned an ambiguous result.
|
|
43
44
|
- Treat `READY` as valid only when `ReplicasReady`, `ArtifactsVerified`, and
|
|
44
45
|
`SmokePredictionPassed` are all true for the current revision.
|
|
45
|
-
- Use `predict-deployment
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
- Use `predict-deployment` for governed deployment verification. Do not infer
|
|
47
|
+
Kubernetes Service names from a deployment ID.
|
|
48
|
+
- Treat every prediction response `target_time` as China Standard Time in RFC
|
|
49
|
+
3339 `+08:00` form. The represented instant remains identical to the UTC
|
|
50
|
+
cutoff and output-window calculations.
|
|
51
|
+
- `DeploymentSpec.service_exposure` defaults to `ClusterIP`. An explicit
|
|
52
|
+
`NodePort` value creates one deployment-level direct Serving Service that
|
|
53
|
+
follows the current revision; it does not replace validation, approval,
|
|
54
|
+
rollout, READY gates, or audit history.
|
|
55
|
+
- Every model Serving process publishes that model's Swagger UI at `/docs`,
|
|
56
|
+
OpenAPI JSON at `/openapi.json`, and ReDoc at `/redoc`. The document embeds
|
|
57
|
+
the deployed artifact identity and its actual input modes, ordered columns,
|
|
58
|
+
horizon semantics, known-future contract, and output schema. These are model
|
|
59
|
+
data-plane documents, not the control-plane API documentation.
|
|
48
60
|
- Never create, modify, or delete NetworkPolicy. Cluster operators own that
|
|
49
61
|
boundary.
|
|
50
62
|
|
|
@@ -16,10 +16,21 @@ load-bearing fields:
|
|
|
16
16
|
"package_version": "1",
|
|
17
17
|
"image": "registry.example/model-serving@sha256:<64-hex>",
|
|
18
18
|
"target": {"type": "kubernetes", "namespace": "itsmp-model-serving"},
|
|
19
|
+
"service_exposure": {
|
|
20
|
+
"type": "NodePort",
|
|
21
|
+
"port": 80,
|
|
22
|
+
"node_port": 32080,
|
|
23
|
+
"advertised_host": "10.36.9.212",
|
|
24
|
+
"scheme": "http"
|
|
25
|
+
},
|
|
19
26
|
"feature_retrieval": {},
|
|
20
27
|
"inference_policy": {
|
|
21
28
|
"horizon": {"duration": "2d"},
|
|
22
|
-
"output_window": {
|
|
29
|
+
"output_window": {
|
|
30
|
+
"start_offset": "1d",
|
|
31
|
+
"end_offset": "2d",
|
|
32
|
+
"boundary": "[start,end)"
|
|
33
|
+
},
|
|
23
34
|
"allow_request_override": true
|
|
24
35
|
},
|
|
25
36
|
"replicas": 1,
|
|
@@ -35,18 +46,21 @@ The server normalizes an omitted lookup test from the package during
|
|
|
35
46
|
validation and creation.
|
|
36
47
|
|
|
37
48
|
`inference_policy` is optional. When present, its horizon and offsets must be
|
|
38
|
-
whole-minute durations aligned to the model sampling frequency.
|
|
39
|
-
|
|
40
|
-
the configured horizon, and fit the model's maximum
|
|
41
|
-
model using `horizon=2d` and `[1d,2d)` therefore
|
|
42
|
-
and returns 96 steps.
|
|
49
|
+
whole-minute durations aligned to the model sampling frequency. `boundary`
|
|
50
|
+
defaults to `[start,end)` and may be `(start,end]`. The selected interval must
|
|
51
|
+
be non-empty, end within the configured horizon, and fit the model's maximum
|
|
52
|
+
sequence output. A 15-minute model using `horizon=2d` and `[1d,2d)` therefore
|
|
53
|
+
needs at least 192 output steps and returns 96 steps. An 8-day, 768-step model
|
|
54
|
+
using `(1d,8d]` returns step 97 through step 768: next-day 00:15 through day-eight
|
|
55
|
+
24:00, 672 points total. This is a response projection, not extra model capacity.
|
|
43
56
|
|
|
44
57
|
The deployment values are defaults. Calls may omit `horizon` and
|
|
45
58
|
`output_window`, override either one, or override both. Serving validates the
|
|
46
59
|
effective values again; an output window must remain non-empty, aligned, inside
|
|
47
60
|
the effective horizon, and within model capacity. Set
|
|
48
61
|
`allow_request_override=false` only when the endpoint must reject non-equivalent
|
|
49
|
-
request values.
|
|
62
|
+
request values. An override that omits `boundary` uses `[start,end)`; include
|
|
63
|
+
`boundary` explicitly to preserve `(start,end]` semantics.
|
|
50
64
|
|
|
51
65
|
Known-future covariates still cover the model's complete prediction length,
|
|
52
66
|
including points outside a shorter returned window. In `feature_lookup` mode,
|
|
@@ -59,6 +73,22 @@ The first deployment starts at `staging`. A replacement for an existing
|
|
|
59
73
|
service/environment declares the active leaf in `previous_deployment_id`.
|
|
60
74
|
Production is reached only by staging to canary to production promotion.
|
|
61
75
|
|
|
76
|
+
`service_exposure` is optional and defaults to `{"type":"ClusterIP"}`. Set
|
|
77
|
+
`type=NodePort` only when direct node access is required. `node_port` is
|
|
78
|
+
optional; when omitted Kubernetes allocates it, and the observed endpoint
|
|
79
|
+
reports the assigned value. An explicit value must be in `30000..32767`.
|
|
80
|
+
`advertised_host` is also optional: provide it only when that node address is
|
|
81
|
+
known to be reachable by callers. Without it, the endpoint returns a URL
|
|
82
|
+
template rather than claiming external reachability.
|
|
83
|
+
|
|
84
|
+
The controller keeps preview, stable, and canary Services as ClusterIP for
|
|
85
|
+
verification and Gateway traffic. NodePort exposure uses one fixed-name Service
|
|
86
|
+
per DeploymentSpec and creates or updates it only after the revision passes all
|
|
87
|
+
READY gates. Retained revisions of that deployment share the Service, while a
|
|
88
|
+
replacement deployment receives a different Service so staging cannot rewrite
|
|
89
|
+
the existing production route. When replacement deployments request explicit
|
|
90
|
+
ports, their values must not collide while both deployments exist.
|
|
91
|
+
|
|
62
92
|
## Revision State
|
|
63
93
|
|
|
64
94
|
`DeploymentSpec` is immutable. Its inference policy and full deployment contract
|
|
@@ -77,6 +107,12 @@ The detail response includes `endpoints`. Cluster-local endpoints have
|
|
|
77
107
|
when rollout hostname metadata exists. `available=true` means the current
|
|
78
108
|
revision passed all READY gates.
|
|
79
109
|
|
|
110
|
+
Each endpoint advertises `inference_path=/v1/inference`, `docs_url`,
|
|
111
|
+
`openapi_url`, and `redoc_url`. When no reviewed host is available, the
|
|
112
|
+
NodePort endpoint returns corresponding URL templates instead. The Serving
|
|
113
|
+
OpenAPI document is generated for the deployed ModelArtifact and embeds the
|
|
114
|
+
effective model contract; it is not a generic platform API schema.
|
|
115
|
+
|
|
80
116
|
Successful smoke verification is cached durably by revision, image digest,
|
|
81
117
|
FeatureRetrieval contract hash, deployment contract hash, and frozen lookup-test
|
|
82
118
|
hash. A new revision or changed identity must run smoke again.
|
|
@@ -29,6 +29,22 @@ Use `get-deployment` to inspect the full revision history and endpoints. Use
|
|
|
29
29
|
`list-deployments` for discovery and `get-deployment-events` for paginated
|
|
30
30
|
audit evidence.
|
|
31
31
|
|
|
32
|
+
For direct model access, declare `service_exposure.type=NodePort` in the same
|
|
33
|
+
validated DeploymentSpec. After the revision is `READY`, read the observed
|
|
34
|
+
`nodeport` endpoint instead of constructing a Service name. Given an observed
|
|
35
|
+
base URL such as `http://<node-ip>:<node-port>`:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
curl http://<node-ip>:<node-port>/v1/model
|
|
39
|
+
curl http://<node-ip>:<node-port>/openapi.json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Open `http://<node-ip>:<node-port>/docs` for that model's Swagger UI or
|
|
43
|
+
`http://<node-ip>:<node-port>/redoc` for ReDoc. The schemas describe the exact
|
|
44
|
+
deployed model. NodePort network reachability remains an environment concern;
|
|
45
|
+
do not report it as reachable unless `advertised_host` was reviewed and the
|
|
46
|
+
client can connect.
|
|
47
|
+
|
|
32
48
|
## Promotion And Approval
|
|
33
49
|
|
|
34
50
|
```bash
|
|
@@ -87,10 +103,18 @@ the deployment horizon but returns its first day:
|
|
|
87
103
|
"input_mode": "feature_lookup",
|
|
88
104
|
"cutoff_time": "2026-09-14T00:00:00+08:00",
|
|
89
105
|
"entity": {},
|
|
90
|
-
"output_window": {
|
|
106
|
+
"output_window": {
|
|
107
|
+
"start_offset": "0min",
|
|
108
|
+
"end_offset": "1d",
|
|
109
|
+
"boundary": "[start,end)"
|
|
110
|
+
}
|
|
91
111
|
}
|
|
92
112
|
```
|
|
93
113
|
|
|
114
|
+
For the storage-power deployment that predicts eight days but returns only
|
|
115
|
+
next-day 00:15 through day-eight 24:00, use the deployment default or override
|
|
116
|
+
with `{"start_offset":"1d","end_offset":"8d","boundary":"(start,end]"}`.
|
|
117
|
+
|
|
94
118
|
Do not send `future_covariates` in `feature_lookup` mode. Serving derives the
|
|
95
119
|
declared known-future columns and full model prediction length from the
|
|
96
120
|
ModelArtifact, then the platform retrieves visible future Feature revisions.
|
|
@@ -14,6 +14,13 @@ Interpret conditions before considering a reconcile:
|
|
|
14
14
|
readiness through the platform/cluster diagnostic boundary.
|
|
15
15
|
- `ArtifactsVerified=false`: the Serving `/model` identity does not match the
|
|
16
16
|
revision, or the endpoint is unavailable.
|
|
17
|
+
- A NodePort endpoint with `url=null` is not a failed deployment. Kubernetes
|
|
18
|
+
assigned or will assign the port, but the DeploymentSpec did not declare a
|
|
19
|
+
reviewed `advertised_host`; use the returned `node_port` with a reachable
|
|
20
|
+
cluster node address.
|
|
21
|
+
- `/docs` or `/openapi.json` showing the wrong artifact identity indicates that
|
|
22
|
+
traffic is reaching a different Serving revision. Compare the document's
|
|
23
|
+
top-level `x-itsmp-model.artifact_id` with the observed DeploymentRevision.
|
|
17
24
|
- `SmokePredictionPassed=false`: preserve the frozen package smoke request and
|
|
18
25
|
error. Do not replace it with a current-time request to force success.
|
|
19
26
|
- `request horizon cannot override deployment inference_policy` or
|
|
@@ -35,6 +42,9 @@ Interpret conditions before considering a reconcile:
|
|
|
35
42
|
- An unexpected output point count usually indicates frequency/target-time
|
|
36
43
|
drift or an incomplete runtime trajectory. Inspect `output_window.boundary`,
|
|
37
44
|
UTC `start_time`/`end_time`, `point_count`, and the model sampling interval.
|
|
45
|
+
- If a right-closed deployment unexpectedly returns next-day 00:00 and omits
|
|
46
|
+
day-eight 24:00, check whether a request-level `output_window` omitted
|
|
47
|
+
`boundary`; omission intentionally falls back to `[start,end)`.
|
|
38
48
|
- `SUPERSEDED`: operate on the active deployment leaf.
|
|
39
49
|
- `SUSPENDED`: resume only with explicit authorization and a reason.
|
|
40
50
|
- `UNDEPLOYED`: create a governed deployment or rollback as supported; resume
|
|
@@ -24,6 +24,14 @@ do not guess registries or pass deployment secrets. A mismatch needs the approve
|
|
|
24
24
|
runtime contract, not repeated package versions. Unknown request keys return 422; do not add `runtime`, `image`, or `resources`
|
|
25
25
|
fields. Inspect the returned resolved package.
|
|
26
26
|
|
|
27
|
+
Chronos-2 LoRA packages also require exactly one platform-managed
|
|
28
|
+
`chronos2-checkpoint` runtime artifact for the selected trainer/device binding.
|
|
29
|
+
It must set `DATA_PLATFORM_CHRONOS2_MODEL_PATH`; otherwise
|
|
30
|
+
`validate-model-package` fails before a Kubernetes Job is created. Cache-hit
|
|
31
|
+
messages for `adapter_model.safetensors` or `model.chronos2` do not prove that
|
|
32
|
+
the base checkpoint is present. Full fine-tuned Chronos-2 artifacts contain
|
|
33
|
+
their complete weights and do not require this external checkpoint.
|
|
34
|
+
|
|
27
35
|
`input_modes` must be unique, include `inline`, and may additionally include
|
|
28
36
|
`feature_lookup` or `tabular_forecast` only when supported by the selected
|
|
29
37
|
runtime. `feature_lookup` still requires artifact lineage
|