@mokuyoaxis/dsh-iris 0.1.3 → 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/.dsh/skills/iris-compose-media/SKILL.md +23 -49
- package/.dsh/skills/iris-compose-media/references/task-v2-recovery.md +30 -0
- package/.dsh/skills/iris-compose-media/references/workflows.md +38 -0
- package/.dsh/skills/iris-verify-ui/SKILL.md +3 -25
- package/.dsh/skills/iris-verify-ui/agents/openai.yaml +4 -0
- package/.dsh/skills/iris-verify-ui/references/verdict-and-degradation.md +31 -0
- package/CHANGELOG.md +77 -2
- package/README.en.md +98 -19
- package/README.md +98 -19
- package/bin/dsh-iris.js +392 -13
- package/docs/AGENT_QUICKSTART.md +35 -0
- package/docs/ARCHITECTURE.md +82 -52
- package/docs/ARTIFACT_LIBRARY.md +24 -0
- package/docs/ARTIFACT_MANIFEST.md +60 -0
- package/docs/CORE_RUNTIME_CONTRACT.md +83 -0
- package/docs/DSH_CORE_MIGRATION.md +106 -0
- package/docs/DSH_RC2_ADAPTATION.md +36 -0
- package/docs/HEADLESS_CLI.md +217 -0
- package/docs/HOST_ADAPTER_CONTRACT.md +105 -0
- package/docs/HOST_DOCTOR.md +49 -0
- package/docs/MODEL_PORT_CONTRACT.md +300 -0
- package/docs/PROVIDER_ADAPTER_CONTRACT.md +138 -0
- package/docs/PROVIDER_HEALTH.md +39 -0
- package/docs/PROVIDER_RUNTIME_HARNESS.md +33 -0
- package/docs/PROVIDER_SUBMISSION_CONTRACT.md +2 -2
- package/docs/ROADMAP.md +42 -76
- package/docs/SECURITY.md +10 -5
- package/docs/TASK_SEMANTICS.md +3 -2
- package/docs/assets/diagrams/iris-architecture.png +0 -0
- package/docs/assets/diagrams/iris-architecture.svg +5 -5
- package/docs/assets/logo/README.md +55 -0
- package/docs/assets/logo/iris-bubble-concept.svg +67 -0
- package/docs/assets/logo/iris-bubble.svg +14 -0
- package/docs/assets/logo/iris-interim-flower.png +0 -0
- package/docs/assets/logo/iris-logo-mono-inverse.svg +78 -0
- package/docs/assets/logo/iris-logo-mono.svg +78 -0
- package/docs/assets/logo/iris-logo.svg +78 -0
- package/docs/assets/logo/iris-mark-mono-inverse.svg +42 -0
- package/docs/assets/logo/iris-mark-mono.svg +42 -0
- package/docs/assets/logo/iris-mark.svg +42 -0
- package/docs/releases/0.1.4.md +59 -0
- package/docs/releases/0.2.0.md +48 -0
- package/lib/actions.js +673 -525
- package/lib/adapters.js +58 -21
- package/lib/api.js +182 -16
- package/lib/artifacts.js +239 -0
- package/lib/bundled-skills.js +5 -5
- package/lib/client.js +1116 -86
- package/lib/command-service.js +420 -0
- package/lib/config.js +245 -49
- package/lib/core-artifact-store.js +598 -0
- package/lib/core-artifacts.js +4 -0
- package/lib/core-attention.js +103 -0
- package/lib/core-contract.js +105 -0
- package/lib/core-doctor.js +41 -0
- package/lib/core-lease-recovery.js +170 -0
- package/lib/core-runtime.js +232 -0
- package/lib/core-tasks.js +560 -0
- package/lib/core-user-projection.js +192 -0
- package/lib/doctor.js +260 -30
- package/lib/dsh-core-adapter.js +599 -0
- package/lib/dsh-host-adapter.js +240 -0
- package/lib/generation-input.js +95 -0
- package/lib/guard.js +3 -3
- package/lib/host-contract.js +131 -0
- package/lib/host-runtime.js +156 -0
- package/lib/index.js +255 -166
- package/lib/locate.js +1 -1
- package/lib/media.js +16 -6
- package/lib/model-invoker.js +218 -0
- package/lib/model-port-contract.js +333 -0
- package/lib/models.js +97 -11
- package/lib/prompt-optimizer.js +10 -20
- package/lib/provider-adapter.js +397 -0
- package/lib/provider-adapters.js +342 -0
- package/lib/provider-catalog.js +171 -0
- package/lib/provider-contract.js +72 -3
- package/lib/provider-health.js +59 -0
- package/lib/provider-protocol.js +51 -2
- package/lib/provider-task-runner.js +328 -0
- package/lib/render.js +43 -12
- package/lib/tasks.js +45 -9
- package/lib/vision.js +51 -56
- package/package.json +20 -14
- package/user_guide.md +67 -12
- package/docs/assets/diagrams/iris-architecture.drawio +0 -1
- package/docs/assets/diagrams/iris-task-lifecycle.drawio +0 -1
- package/docs/assets/diagrams/iris-workflow-compose.drawio +0 -1
- package/docs/releases/0.1.1.md +0 -51
- package/docs/releases/0.1.2.md +0 -26
- package/docs/releases/0.1.3.md +0 -30
package/lib/vision.js
CHANGED
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
'use strict';
|
|
2
|
+
import { providerApiKey, unsupportedProtocolError } from './provider-protocol.js';
|
|
2
3
|
/**
|
|
3
4
|
* Iris 视觉后端抽象(阶段 1)。
|
|
4
5
|
*
|
|
5
6
|
* 把“识图”拆成「VisionBackend 接口 +
|
|
6
7
|
* 两个实现」,让自持栈与 DSH 全局模型可替换、按序降级。
|
|
7
8
|
* - SelfStackVisionBackend:自持栈(OpenAI 兼容 /chat/completions,qwen-vl)
|
|
8
|
-
* -
|
|
9
|
+
* - HostVisionBackend:由 Host Adapter 提供的可选视觉模型
|
|
9
10
|
*
|
|
10
|
-
* 调用方(工具)不感知底层:
|
|
11
|
+
* 调用方(工具)不感知底层:buildVisionBackendsFromHost 按 provider 顺序组装,
|
|
11
12
|
* askWithBackends 依次尝试、保留每个后端的失败现场。
|
|
12
13
|
*/
|
|
13
14
|
import * as adapters from './adapters.js';
|
|
15
|
+
import { hasHostPort } from './host-contract.js';
|
|
16
|
+
import { resolveModelRef, parseModelRef } from './models.js';
|
|
14
17
|
|
|
15
18
|
/** 后端接口约定:id / kind / model 只读,analyze(request) → Promise<string> */
|
|
16
19
|
|
|
17
20
|
export class SelfStackVisionBackend {
|
|
18
|
-
constructor({ provider }) {
|
|
21
|
+
constructor({ provider, model }) {
|
|
19
22
|
this.provider = provider;
|
|
23
|
+
this.requestedModel = model;
|
|
20
24
|
}
|
|
21
25
|
get id() {
|
|
22
26
|
return this.provider.id;
|
|
@@ -25,13 +29,18 @@ export class SelfStackVisionBackend {
|
|
|
25
29
|
return 'selfstack';
|
|
26
30
|
}
|
|
27
31
|
get model() {
|
|
28
|
-
|
|
32
|
+
const ref = resolveModelRef(this.provider, 'vision', this.requestedModel);
|
|
33
|
+
return parseModelRef(ref)?.modelId || '';
|
|
29
34
|
}
|
|
30
35
|
async analyze({ question, imageDataUrl, signal }) {
|
|
36
|
+
const model = this.model;
|
|
37
|
+
if (!model) throw Object.assign(new Error('iris: 未配置视觉模型,请发现或手工添加并标注 vision 能力'), {
|
|
38
|
+
code: 'IRIS_PROVIDER_MODEL_UNAVAILABLE'
|
|
39
|
+
});
|
|
31
40
|
return adapters.visionStream({
|
|
32
|
-
key: this.provider
|
|
41
|
+
key: providerApiKey(this.provider),
|
|
33
42
|
baseUrl: this.provider.baseUrl,
|
|
34
|
-
model
|
|
43
|
+
model,
|
|
35
44
|
prompt: question,
|
|
36
45
|
imageDataUrl,
|
|
37
46
|
signal
|
|
@@ -39,61 +48,37 @@ export class SelfStackVisionBackend {
|
|
|
39
48
|
}
|
|
40
49
|
}
|
|
41
50
|
|
|
42
|
-
export class
|
|
43
|
-
constructor({
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
get
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
get kind() {
|
|
50
|
-
return 'global';
|
|
51
|
-
}
|
|
52
|
-
get model() {
|
|
53
|
-
return '全局视觉模型';
|
|
54
|
-
}
|
|
55
|
-
async analyze({ question, ref, signal }) {
|
|
56
|
-
const chunks = [];
|
|
57
|
-
for await (const chunk of this.llm.stream({
|
|
58
|
-
sessionId: undefined,
|
|
59
|
-
provider: undefined,
|
|
60
|
-
model: undefined,
|
|
61
|
-
signal,
|
|
62
|
-
messages: [
|
|
63
|
-
{
|
|
64
|
-
role: 'user',
|
|
65
|
-
content: [
|
|
66
|
-
{ type: 'text', text: question },
|
|
67
|
-
{ type: 'image', attachment: ref }
|
|
68
|
-
]
|
|
69
|
-
}
|
|
70
|
-
]
|
|
71
|
-
})) {
|
|
72
|
-
const t = chunk && chunk.delta;
|
|
73
|
-
if (typeof t === 'string' && t) chunks.push(t);
|
|
74
|
-
if (chunks.join('').length > 6000) break;
|
|
75
|
-
}
|
|
76
|
-
return chunks.join('').trim();
|
|
77
|
-
}
|
|
51
|
+
export class HostVisionBackend {
|
|
52
|
+
constructor({ port }) { this.port = port; }
|
|
53
|
+
get id() { return this.port.id || 'host-vision'; }
|
|
54
|
+
get kind() { return this.port.kind || 'global'; }
|
|
55
|
+
get model() { return this.port.model || '宿主视觉模型'; }
|
|
56
|
+
async analyze(request) { return this.port.analyze(request); }
|
|
78
57
|
}
|
|
79
58
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
*/
|
|
87
|
-
export function buildVisionBackends(ctx, { providers, model }) {
|
|
59
|
+
const VISION_FACTORIES = new Map([
|
|
60
|
+
['openai', (provider, model) => new SelfStackVisionBackend({ provider, model })]
|
|
61
|
+
]);
|
|
62
|
+
|
|
63
|
+
/** Host Adapter 入口;Command 不读取 DSH ctx。 */
|
|
64
|
+
export function buildVisionBackendsFromHost(host, { providers, model }) {
|
|
88
65
|
const backends = [];
|
|
89
66
|
for (const p of providers || []) {
|
|
90
|
-
if (p
|
|
91
|
-
const
|
|
92
|
-
|
|
67
|
+
if (p) {
|
|
68
|
+
const type = typeof p.type === 'string' && p.type.trim() ? p.type.trim() : 'openai';
|
|
69
|
+
const factory = VISION_FACTORIES.get(type);
|
|
70
|
+
if (!factory) {
|
|
71
|
+
// 保留不可用证据,让宿主视觉端口仍能按既有顺序降级。
|
|
72
|
+
backends.push({
|
|
73
|
+
id: p.id, kind: 'selfstack', model: String(model || p.visionModel || ''),
|
|
74
|
+
async analyze() { throw unsupportedProtocolError(type, 'vision'); }
|
|
75
|
+
});
|
|
76
|
+
} else backends.push(factory(p, model));
|
|
93
77
|
}
|
|
94
78
|
}
|
|
95
|
-
|
|
96
|
-
|
|
79
|
+
if (hasHostPort(host, 'visionModel') && typeof host.ports.visionModel.analyze === 'function') {
|
|
80
|
+
backends.push(new HostVisionBackend({ port: host.ports.visionModel }));
|
|
81
|
+
}
|
|
97
82
|
return backends;
|
|
98
83
|
}
|
|
99
84
|
|
|
@@ -116,6 +101,8 @@ export async function askWithBackends(backends, request) {
|
|
|
116
101
|
errors.push({
|
|
117
102
|
backendId: b.id,
|
|
118
103
|
kind: b.kind,
|
|
104
|
+
model: b.model,
|
|
105
|
+
code: err && err.code,
|
|
119
106
|
category: err && err.category,
|
|
120
107
|
status: err && err.status,
|
|
121
108
|
message: String((err && err.message) || err)
|
|
@@ -123,6 +110,7 @@ export async function askWithBackends(backends, request) {
|
|
|
123
110
|
}
|
|
124
111
|
}
|
|
125
112
|
const err = new Error('iris: 视觉模型不可用——自持栈与全局视觉模型都失败了');
|
|
113
|
+
if (errors.length && errors[0].code && errors.every((error) => error.code === errors[0].code)) err.code = errors[0].code;
|
|
126
114
|
err.errors = errors;
|
|
127
115
|
throw err;
|
|
128
116
|
}
|
|
@@ -164,7 +152,14 @@ export async function testVisionCapability(backend, { timeoutMs = 10000, signal
|
|
|
164
152
|
const ok = RED_HINTS.test(String(answer || ''));
|
|
165
153
|
return { ok, answer: String(answer || '') };
|
|
166
154
|
} catch (err) {
|
|
167
|
-
return {
|
|
155
|
+
return {
|
|
156
|
+
ok: false,
|
|
157
|
+
answer: '',
|
|
158
|
+
error: String((err && err.message) || err),
|
|
159
|
+
timedOut: !!err.timedOut,
|
|
160
|
+
category: err && err.category,
|
|
161
|
+
status: err && err.status
|
|
162
|
+
};
|
|
168
163
|
} finally {
|
|
169
164
|
if (timer) clearTimeout(timer);
|
|
170
165
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mokuyoaxis/dsh-iris",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Multi-provider
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Multi-provider image, video, and speech generation, transcription, visual understanding, and prompt optimization with an integrated Iris workbench for DeepSeek Harness.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -24,13 +24,16 @@
|
|
|
24
24
|
"CHANGELOG.md",
|
|
25
25
|
"screenshots.json",
|
|
26
26
|
"docs",
|
|
27
|
-
"!docs/assets/
|
|
27
|
+
"!docs/assets/diagrams/*.drawio",
|
|
28
|
+
"!docs/releases/0.1.1.md",
|
|
29
|
+
"!docs/releases/0.1.2.md",
|
|
30
|
+
"!docs/releases/0.1.3.md",
|
|
28
31
|
".dsh/skills/iris-verify-ui",
|
|
29
32
|
".dsh/skills/iris-compose-media"
|
|
30
33
|
],
|
|
31
34
|
"dsh": {
|
|
32
35
|
"engines": {
|
|
33
|
-
"dsh": "
|
|
36
|
+
"dsh": "0.2.0-rc.2"
|
|
34
37
|
},
|
|
35
38
|
"bundle": {
|
|
36
39
|
"patch": "./cordis.patch.yml"
|
|
@@ -49,15 +52,18 @@
|
|
|
49
52
|
"keywords": [
|
|
50
53
|
"deepseek-harness",
|
|
51
54
|
"dsh-plugin",
|
|
52
|
-
"vision",
|
|
53
55
|
"image-generation",
|
|
56
|
+
"video-generation",
|
|
57
|
+
"text-to-speech",
|
|
58
|
+
"transcription",
|
|
59
|
+
"vision",
|
|
54
60
|
"dashscope",
|
|
55
|
-
"
|
|
56
|
-
"
|
|
61
|
+
"prompt-optimization",
|
|
62
|
+
"media-workbench"
|
|
57
63
|
],
|
|
58
64
|
"license": "MIT",
|
|
59
65
|
"engines": {
|
|
60
|
-
"node": ">=
|
|
66
|
+
"node": ">=22.0.0"
|
|
61
67
|
},
|
|
62
68
|
"scripts": {
|
|
63
69
|
"test": "node scripts/test.mjs",
|
|
@@ -65,11 +71,11 @@
|
|
|
65
71
|
"prepublishOnly": "npm test"
|
|
66
72
|
},
|
|
67
73
|
"peerDependencies": {
|
|
68
|
-
"@deepseek-ai/dsh-client-locale": "
|
|
69
|
-
"@deepseek-ai/dsh-client-ui-conversation": "
|
|
70
|
-
"@deepseek-ai/dsh-client-ui-renderer": "
|
|
71
|
-
"@deepseek-ai/dsh-client-ui-session": "
|
|
72
|
-
"@deepseek-ai/dsh-client-ui-settings": "
|
|
74
|
+
"@deepseek-ai/dsh-client-locale": "0.2.0-rc.2",
|
|
75
|
+
"@deepseek-ai/dsh-client-ui-conversation": "0.2.0-rc.2",
|
|
76
|
+
"@deepseek-ai/dsh-client-ui-renderer": "0.2.0-rc.2",
|
|
77
|
+
"@deepseek-ai/dsh-client-ui-session": "0.2.0-rc.2",
|
|
78
|
+
"@deepseek-ai/dsh-client-ui-settings": "0.2.0-rc.2"
|
|
73
79
|
},
|
|
74
80
|
"peerDependenciesMeta": {
|
|
75
81
|
"@deepseek-ai/dsh-client-locale": {
|
|
@@ -103,6 +109,6 @@
|
|
|
103
109
|
"url": "https://github.com/mokuyoaxis/dsh-iris/issues"
|
|
104
110
|
},
|
|
105
111
|
"bin": {
|
|
106
|
-
"dsh-iris": "
|
|
112
|
+
"dsh-iris": "bin/dsh-iris.js"
|
|
107
113
|
}
|
|
108
114
|
}
|
package/user_guide.md
CHANGED
|
@@ -4,26 +4,32 @@
|
|
|
4
4
|
|
|
5
5
|
## 安装
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
先运行 `dsh --version`。Iris `0.2.0` 仅声明支持 DSH `0.2.0-rc.2`;旧 DSH `>=0.1.2-rc.1 <0.1.3-0` 或 `0.1.5-rc.1` 使用固定版本 Iris `0.1.4`。验证边界见[适配说明](docs/DSH_RC2_ADAPTATION.md)。还需要 PATH 中的 `pnpm`,以及至少一个媒体或视觉服务供应商。Iris 0.2.0 要求 Node.js 22.0.0 或更高版本,旧 npm 0.1.4 的历史要求为 20.10.0;如果所用 DSH 版本要求更高,以 DSH 为准。Iris 0.1.1 及后续 0.1.x 不兼容 DSH 0.1.0/0.1.1 的旧客户端 Runtime。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
在上述旧 DSH 范围内,从 npm 安装固定稳定版到 Web profile:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
dsh plugin --profile web add @mokuyoaxis/dsh-iris
|
|
12
|
+
dsh plugin --profile web add @mokuyoaxis/dsh-iris@0.1.4
|
|
13
13
|
dsh web
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
npm 上无 scope 的 `dsh-iris` 是另一款插件;安装或更新 Iris Media 时必须使用完整 scoped 包名。
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
只下载旧稳定包可运行 `npm pack @mokuyoaxis/dsh-iris@0.1.4`,安装为普通 npm 依赖可运行 `npm install @mokuyoaxis/dsh-iris@0.1.4`;后者不会自动加入 DSH profile。固定版本仍可在 latest 更新后安装,0.1.4 不包含新的 Core 媒体 CLI。DSH rc.2 使用 0.2.0。
|
|
19
|
+
|
|
20
|
+
在 DSH `0.2.0-rc.2` 上,从 npm 安装:
|
|
19
21
|
|
|
20
22
|
```bash
|
|
21
|
-
dsh plugin --profile web add .
|
|
23
|
+
dsh plugin --profile web add @mokuyoaxis/dsh-iris@0.2.0
|
|
22
24
|
dsh web
|
|
23
25
|
```
|
|
24
26
|
|
|
25
27
|
浏览器默认打开 `http://127.0.0.1:3080`。插件安装后只会在下一次 DSH 启动时装载;如果 DSH 已经运行,请先停止再启动。启动输出包含一次性认证参数时,必须完整打开该 URL,不能只输入裸地址。
|
|
26
28
|
|
|
29
|
+
其他 DSH 版本,包括 `0.2.0` 正式版与其他 rc,须另行验收。让 Agent 协助安装时,可使用[简要 Prompt](docs/AGENT_QUICKSTART.md)。
|
|
30
|
+
|
|
31
|
+
通过 dsh-market 安装时也要核对显示的 Iris 版本、完整 scoped 包名和 DSH 支持范围。市场可能缓存 npm 信息;旧宿主仍按固定 `@0.1.4` 命令安装,不直接跟随 latest。
|
|
32
|
+
|
|
27
33
|
可以在启动前检查组合配置:
|
|
28
34
|
|
|
29
35
|
```bash
|
|
@@ -38,8 +44,8 @@ dsh --profile web --dump-config
|
|
|
38
44
|
|
|
39
45
|
1. 点击“+ 添加供应商”。
|
|
40
46
|
2. 名称可填“阿里云百炼”。
|
|
41
|
-
3. Base URL 填 `https://dashscope.aliyuncs.com/compatible-mode/v1
|
|
42
|
-
4.
|
|
47
|
+
3. Base URL 填 `https://dashscope.aliyuncs.com/compatible-mode/v1`;如果账号使用百炼业务空间专属域名,再把“媒体 Base URL”填为同地域的 `https://{WorkspaceId}.cn-beijing.maas.aliyuncs.com/compatible-mode/v1`(地域按账号实际情况替换)。
|
|
48
|
+
4. 填入与模型、Endpoint 同地域的 DashScope API Key,点击“保存”。
|
|
43
49
|
5. 展开刚添加的供应商,点击“发现模型”。
|
|
44
50
|
|
|
45
51
|
如果只有一个供应商,可以先保留“能力分配”为自动。Iris 会从模型池中为画图、视频、语音、转写和视觉能力选择第一个匹配模型。需要固定模型或设置故障转移顺序时,再到“能力分配(failover 顺序)”中调整。
|
|
@@ -55,13 +61,17 @@ Iris 当前支持两类调用路径:
|
|
|
55
61
|
| DashScope 百炼 | 图片、视频、TTS、转写、视觉 | 覆盖最完整;媒体请求只允许阿里云官方 HTTPS 域名 |
|
|
56
62
|
| OpenAI 兼容 | Images 图片生成、Chat Completions 视觉 | 具体模型和能力取决于兼容服务 |
|
|
57
63
|
|
|
58
|
-
|
|
64
|
+
工作台会按实际媒体端点安全推断协议:设置了“媒体 Base URL”时以它为准,否则沿用 Base URL。阿里云官方 DashScope、地域和 Workspace HTTPS 域名可使用 `dashscope`,其他地址使用 `openai-images`,也可以在供应商卡片中明确选择。即使配置被误标为 `dashscope`,Iris 也会在 fetch 前拒绝向非官方地址发送 DashScope API Key。分离端点后,普通 Base URL 可继续服务视觉/对话,媒体 Base URL 专门服务图片、视频、TTS、转写和媒体模型发现;留空即保持旧行为。
|
|
59
65
|
|
|
60
66
|
同一个 OpenAI 兼容 Base URL 只有在实际提供相应接口时才能承担对应能力:图片生成需要 Images 接口,视觉理解需要支持图片输入的 Chat Completions 接口。通用 OpenAI 兼容端点目前不能替代 Iris 的 DashScope 视频、TTS 或转写协议。
|
|
61
67
|
|
|
68
|
+
开发分支中,自动选择的未知端点会在供应商管理区显示“协议为推断值,请确认”,仍按 OpenAI Images 兼容格式请求。显式选择协议后清除标记;不支持的显式协议会在请求前报错,配置值仍保留。视觉类型 `type` 与媒体协议独立,未支持的视觉类型不会被转换为 OpenAI。
|
|
69
|
+
|
|
62
70
|
## 模型池
|
|
63
71
|
|
|
64
|
-
|
|
72
|
+
“发现模型”对普通 OpenAI 兼容服务读取 `GET /models`;对阿里云官方端点读取并分页拉完 `GET /api/v1/models`。官方 `IG/VG/ASR/TTS/VU` 能力元数据优先,缺少元数据时才按模型名兜底。用户手工纠正的能力标签优先级最高,后续重新发现不会覆盖。发现失败时,原模型池不会被清空。
|
|
73
|
+
|
|
74
|
+
开发分支采用合并发现:保留手工模型、手工能力标注及本次目录未返回的旧模型,只追加或更新发现项。删除模型仍需用户显式操作。运行时仅使用已配置模型;某项能力缺少模型时会提示配置,不再猜测厂商默认值。旧裸账号的兼容目录会在配置写入时转成可编辑的模型条目,显式空模型池不会触发该迁移。
|
|
65
75
|
|
|
66
76
|
模型池中的能力名称如下:
|
|
67
77
|
|
|
@@ -82,13 +92,28 @@ Iris 当前支持两类调用路径:
|
|
|
82
92
|
- 视频不会自动提交探针,因为“只确认受理”也可能创建计费任务;应通过“视频生成”操作验证。
|
|
83
93
|
- 转写不使用空样本探针,应通过“音频转写”操作用真实音频验证。
|
|
84
94
|
|
|
85
|
-
|
|
95
|
+
模型不必经过“测”才能使用;正常的真实任务成功也会形成健康证据。模型池按钮只测试被点击的“供应商 × 模型 × 能力”,不会顺带验证同名模型或其他能力。
|
|
96
|
+
|
|
97
|
+
### 健康颜色与时间
|
|
98
|
+
|
|
99
|
+
工作台顶部、功能卡片、模型池和主泡泡共享同一份持久健康快照:
|
|
100
|
+
|
|
101
|
+
| 颜色 | 状态 | 如何得到 |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| 灰色 | 未配置 | 没有可用的当前候选;默认 bearer 认证缺 Key 时会回到灰色,`auth:'none'` 不要求 Key |
|
|
104
|
+
| 蓝色 | 已配置,待验证 | 配置可用于路由,但尚无 7 天内成功证据,或旧成功已经过期 |
|
|
105
|
+
| 绿色 | 近期验证成功 | 显式实测或真实任务在 7 天内成功 |
|
|
106
|
+
| 暗红色 | 认证失败 | 最近出现明确 401、403 或认证/权限错误 |
|
|
107
|
+
|
|
108
|
+
绿色旁显示的是最近成功时间,红色旁显示的是最近决定性认证失败时间。修改 API Key、Base URL、协议、供应商类型或能力模型会使相关旧证据失效。429/额度限制、网络、5xx、内容安全、取消和受理未知不会把近期绿色改红;Iris 也不会定时后台探测或为了点亮状态产生隐形费用。
|
|
109
|
+
|
|
110
|
+
有多条 failover 路径时,只要一条近期成功,能力就是绿色;没有绿色但有待验证路径时为蓝色;只有全部已配置路径都明确认证失败时才为暗红。没有路径则为灰色。完整契约见 [Provider 与能力健康状态](docs/PROVIDER_HEALTH.md)。
|
|
86
111
|
|
|
87
112
|
## 能力分配和故障转移
|
|
88
113
|
|
|
89
114
|
每项能力都可以设置一个有序的“供应商 + 模型”列表。界面显示的是模型名和供应商,配置中保存为 `providerId::modelId` 复合引用,因此不同供应商的同名模型不会冲突。
|
|
90
115
|
|
|
91
|
-
-
|
|
116
|
+
- 未手工分配时,每个新请求都从模型池第一个匹配项开始;这不是 round-robin。
|
|
92
117
|
- 手工列表中的模型优先,并按列表顺序尝试。
|
|
93
118
|
- 模型池中其余具备该能力的模型仍会作为后续候选。
|
|
94
119
|
- 点击“恢复自动”会清除手工顺序。
|
|
@@ -134,6 +159,7 @@ $DSH_HOME/iris/v1/providers.json
|
|
|
134
159
|
"name": "Primary media provider",
|
|
135
160
|
"type": "openai",
|
|
136
161
|
"baseUrl": "https://api.example.com/v1",
|
|
162
|
+
"mediaBaseUrl": "https://WORKSPACE_ID.cn-beijing.maas.aliyuncs.com/compatible-mode/v1",
|
|
137
163
|
"apiKey": "YOUR_API_KEY",
|
|
138
164
|
"enabled": true,
|
|
139
165
|
"mediaProtocol": "openai-images",
|
|
@@ -150,7 +176,9 @@ $DSH_HOME/iris/v1/providers.json
|
|
|
150
176
|
}
|
|
151
177
|
```
|
|
152
178
|
|
|
153
|
-
`assignments` 可以省略;省略后使用模型池顺序。包含特殊字符的 provider 或模型引用会经过 URL 编码,复杂引用建议在工作台中生成,不要手写。
|
|
179
|
+
`mediaBaseUrl` 可以省略或留空,此时媒体调用沿用 `baseUrl`。`assignments` 可以省略;省略后使用模型池顺序。包含特殊字符的 provider 或模型引用会经过 URL 编码,复杂引用建议在工作台中生成,不要手写。
|
|
180
|
+
|
|
181
|
+
当前开发分支允许为明确不需要认证的本地端点设置 `"auth": "none"` 并省略 `apiKey`;缺省或 `"auth": "bearer"` 仍要求 Key,保持旧配置行为。无认证模式不会发送 Authorization 头,已有的旧 Key 也不会被带入该模式的媒体请求。工作台尚无专门的无认证开关,需要按上述停机原则编辑私有配置;不要对需要认证的公网端点使用 `auth:none`。
|
|
154
182
|
|
|
155
183
|
API Key 以明文保存在宿主侧的 `providers.json` 中。POSIX 上 Iris 目录为 `0700`、文件为 `0600`,0.1.1 首次启动会收紧既有 Iris 树但不修改内容或跟随符号链接;Windows 的 mode 不能替代 ACL。状态接口和界面只返回掩码,不会显示完整 Key。不要把这个文件提交到版本库或发给他人。
|
|
156
184
|
|
|
@@ -184,6 +212,16 @@ Iris 工作台中的文件字段提供三种方式:
|
|
|
184
212
|
|
|
185
213
|
从 0.1.2 起,插件会在 DSH Skill registry 可用时自动注册 `iris-verify-ui` 和 `iris-compose-media`,不要求会话工作区位于本仓库,也不需要用户复制 `.dsh/skills/`。项目目录中存在同名 Skill 时,DSH 仍优先使用项目版本;宿主未提供 Skill registry 时不影响 14 个 Iris 工具。
|
|
186
214
|
|
|
215
|
+
用户想稳定指定方法时,可直接用 DSH 的 `/name` 形式:
|
|
216
|
+
|
|
217
|
+
```text
|
|
218
|
+
/iris-compose-media 分析我上传的产品照,生成同构图海报,再检查是否符合要求
|
|
219
|
+
|
|
220
|
+
/iris-verify-ui 对比当前截图和参考图,定位偏差并给出有证据的结论
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
也可以继续用自然语言让 Agent 自动发现。单步绘图、OCR、转写等无需强行唤起组合 Skill,直接说需求或指定对应 Iris 工具即可。Skill 只规划工具链,不会绕过 Iris 的任务、费用确认和安全边界。
|
|
224
|
+
|
|
187
225
|
## 对话框提示词优化
|
|
188
226
|
|
|
189
227
|
安装并启用 Iris 后,DSH 对话输入区会出现一个没有边框、底色和文字的“🫧”入口。点击后打开半透明玻璃悬浮窗;桌面端靠近输入区,手机窄屏自动变为底部面板,并适配浏览器安全区、可用高度和内部滚动。它独立于 Iris 工作台,可用于普通问答、写作、编程以及图片/视频生成提示词。[查看 Android 16 真机完整流程](docs/screenshots.md)。
|
|
@@ -251,6 +289,12 @@ Task v2 将“供应商是否受理、观察是否继续、远端结果和本地
|
|
|
251
289
|
|
|
252
290
|
旧版任务会明确显示“旧任务 · 只读”。只有服务端明确返回 `schemaVersion=1` 才使用该标签;客户端与服务端热更新暂时不同步时,不会把字段缺失的新任务误判为旧任务。
|
|
253
291
|
|
|
292
|
+
### 清除历史与作品库
|
|
293
|
+
|
|
294
|
+
工作台中的作品库独立于任务历史。新落盘媒体会自动入库;首次升级会接回已有 `outputs/`,也可以随时点击“找回本地作品”重新扫描。清空已完成任务或清理旧任务只删除任务状态、Prompt、错误与重试记录,作品仍可在工作台和泡泡打开。
|
|
295
|
+
|
|
296
|
+
删除单件作品或清空作品库会删除实际媒体文件,需要独立确认;相关任务记录不会连带删除,但其中的媒体会无法打开。“删除孤儿产物”不会触碰已入库作品。重要作品仍应另行备份,详见[作品库 v0](docs/ARTIFACT_LIBRARY.md)。收藏、标签和搜索将在完整 Artifact Manifest 之后实现。
|
|
297
|
+
|
|
254
298
|
默认数据目录:
|
|
255
299
|
|
|
256
300
|
| 路径 | 内容 |
|
|
@@ -258,6 +302,7 @@ Task v2 将“供应商是否受理、观察是否继续、远端结果和本地
|
|
|
258
302
|
| `$DSH_HOME/iris/v1/outputs/` | 图片、音频和视频产物 |
|
|
259
303
|
| `$DSH_HOME/iris/v1/uploads/` | 浏览器上传的临时输入 |
|
|
260
304
|
| `$DSH_HOME/iris/v1/tasks.json` | 任务状态与附件索引 |
|
|
305
|
+
| `$DSH_HOME/iris/v1/artifacts.json` | 作品库最小索引与随机访问令牌,不含 Prompt 和任务关系 |
|
|
261
306
|
| `$DSH_HOME/iris/v1/providers.json` | 供应商、模型池和能力分配 |
|
|
262
307
|
| `$DSH_HOME/iris/v1/prompt-optimizer.json` | 提示词优化器的用户 JSON 配置 |
|
|
263
308
|
|
|
@@ -280,6 +325,16 @@ npx @mokuyoaxis/dsh-iris doctor --json
|
|
|
280
325
|
|
|
281
326
|
已安装包也可以直接运行 `dsh-iris doctor`。退出码为 `0`(正常)、`1`(警告)和 `2`(硬错误)。Doctor 会执行一个随后立即删除的本地写入探针,并检查配置、任务、能力分配、临时文件和产物引用;输出不含完整 API Key。离线模式无法检查 DSH 工具/客户端是否已经装载,也不会用付费请求验证 Provider。
|
|
282
327
|
|
|
328
|
+
**0.2.0** 另提供 `doctor --data-root <绝对路径> --json`:只读盘点指定 Core 数据根的 Task、Artifact、Index 和租约,不执行上述写入探针,也不自动修复。`providers list` 与 `capabilities list` 可用 `--provider-config <私有配置绝对路径>` 只读查看脱敏供应商摘要和按配置排序的候选链;它们不代表远端能力已实测。异常退出留下租约时,先用显式 Doctor 查看 owner,再按 [Headless CLI 的恢复步骤](docs/HEADLESS_CLI.md#异常退出后的写者租约)人工确认并运行 `runtime recover`,不要手动删除租约。安装 npm 0.2.0 后使用 `dsh-iris` 命令;临时运行可用 `npx --package @mokuyoaxis/dsh-iris@0.2.0 dsh-iris ...`。旧版 0.1.4 不包含这些 Core 命令。
|
|
329
|
+
|
|
330
|
+
## Host Doctor
|
|
331
|
+
|
|
332
|
+
DSH 运行后,打开“设置 → Iris 工作台 → 宿主诊断”。卡片会自动检查当前 DSH 版本、Iris 服务端和客户端版本、14 个工具、两项随包 Skill、四组 Web 路由、四个 UI Slot,以及 Browser、附件、会话和宿主模型端口;点击“刷新”可重新读取,展开项可查看全部结果。需要原始 JSON 时,可在已经完成 DSH Web 认证的同一浏览器访问 `/iris/api/doctor`。
|
|
333
|
+
|
|
334
|
+
Host Doctor 不打开 Browser、不读取附件或会话、不调用模型,也不请求供应商。报告中的 `exitCode` 是诊断严重度,不是 HTTP 状态:`0` 全部健康,`1` 有可降级警告,`2` 有硬错误。未安装 HTML Browser 时出现一条 Browser 警告是预期降级;如果提示尚未收到客户端握手,刷新 DSH 页面后再点“刷新”。若显示 `not found`,通常是前端已更新而 DSH 后端仍运行旧插件代码,应重启 DSH 后再刷新页面。
|
|
335
|
+
|
|
336
|
+
Host Doctor 显示通过,只代表“插件与宿主接口已正确装载”,不代表 API Key 或某个模型可调用。供应商侧应看四色能力健康,并在模型池中显式实测或完成一项真实任务。完整字段和安全边界见 [Host Doctor](docs/HOST_DOCTOR.md),两类检查的区别见 [Provider 与能力健康状态](docs/PROVIDER_HEALTH.md)。
|
|
337
|
+
|
|
283
338
|
## 可选依赖
|
|
284
339
|
|
|
285
340
|
视频抽帧和视频摘要依赖 PATH 中的 `ffmpeg` 与 `ffprobe`。缺少它们只会禁用这两项能力,不影响生成、看图、OCR 或语音工具。
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<mxfile host="iris-docs"><diagram id="iris-architecture" name="页 1"><mxGraphModel dx="1000" dy="700" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1180" pageHeight="800" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="host" value="DeepSeek Harness 宿主进程 · Iris 插件(复用宿主工具 / 路由 / 生命周期服务)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;strokeColor=#b9c2ce;verticalAlign=top;align=left;spacingLeft=10;spacingTop=6;fontColor=#5b6472;fontSize=12;" vertex="1" parent="1"><mxGeometry x="36" y="96" width="1108" height="560" as="geometry"/></mxCell><mxCell id="tools" value="Agent 工具(14 个)<br>iris_draw_image · iris_generate_video · …" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;" vertex="1" parent="1"><mxGeometry x="66" y="138" width="300" height="72" as="geometry"/></mxCell><mxCell id="cards" value="GUI 动作卡<br>会话内的 Iris 操作入口" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;" vertex="1" parent="1"><mxGeometry x="440" y="138" width="300" height="72" as="geometry"/></mxCell><mxCell id="bench" value="Iris 工作台(三座位)<br>设置 · 进度 · 悬浮泡泡" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;" vertex="1" parent="1"><mxGeometry x="790" y="138" width="290" height="72" as="geometry"/></mxCell><mxCell id="actions" value="统一动作层 · lib/actions.js<br>参数校验 · 输入解析(上传 / 会话附件 / 宿主路径)· failover 编排" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="200" y="268" width="540" height="74" as="geometry"/></mxCell><mxCell id="models" value="模型池 · lib/models.js + capability.js<br>providerId::modelId 复合身份 · 能力分配 · 有序候选" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="66" y="396" width="430" height="74" as="geometry"/></mxCell><mxCell id="adapters" value="Provider 适配 · lib/adapters.js<br>DashScope 媒体协议 · OpenAI Images 兼容" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="550" y="396" width="430" height="74" as="geometry"/></mxCell><mxCell id="tasks" value="任务系统 · lib/tasks.js<br>异步轮询 · 重启恢复 · 取消传播" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eaf7ef;strokeColor=#2e9e5b;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="66" y="524" width="340" height="74" as="geometry"/></mxCell><mxCell id="files" value="文件与媒体 · lib/media.js<br>uploads/ outputs/ · 令牌媒体链接 · Range 流式" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eaf7ef;strokeColor=#2e9e5b;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="430" y="524" width="300" height="74" as="geometry"/></mxCell><mxCell id="client" value="Web 客户端 · lib/client.js<br>三座位 UI · 共享状态订阅 + SSE" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="790" y="524" width="290" height="74" as="geometry"/></mxCell><mxCell id="skillreg" value="Skill registry<br>随包注册 iris-verify-ui / iris-compose-media" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;" vertex="1" parent="1"><mxGeometry x="790" y="268" width="290" height="74" as="geometry"/></mxCell><mxCell id="datanote" value="本地数据 · $DSH_HOME/iris/v1/<br>providers.json · tasks.json · uploads/ · outputs/(POSIX 0700 / 0600)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b9c2ce;fontColor=#5b6472;fontSize=11;dashed=1;" vertex="1" parent="1"><mxGeometry x="66" y="690" width="470" height="56" as="geometry"/></mxCell><mxCell id="providers" value="媒体 / 视觉服务商<br>DashScope 百炼 · OpenAI Images 兼容服务(凭据只发往官方 HTTPS 域名)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;" vertex="1" parent="1"><mxGeometry x="580" y="706" width="560" height="64" as="geometry"/></mxCell><mxCell id="c1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="tools" target="actions"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="216" y="239"/><mxPoint x="308" y="239"/></Array></mxGeometry></mxCell><mxCell id="c2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="cards" target="actions"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="590" y="239"/><mxPoint x="470" y="239"/></Array></mxGeometry></mxCell><mxCell id="c3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="bench" target="actions"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="848" y="239"/><mxPoint x="740" y="239"/></Array></mxGeometry></mxCell><mxCell id="c4" value="选择候选模型" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="actions" target="models"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="362" y="369"/><mxPoint x="281" y="369"/></Array></mxGeometry></mxCell><mxCell id="c5" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="actions" target="adapters"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="578" y="369"/><mxPoint x="765" y="369"/></Array></mxGeometry></mxCell><mxCell id="c6" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="models" target="adapters"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c7" value="创建任务" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="actions" target="tasks"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="524" y="480"/><mxPoint x="236" y="480"/></Array></mxGeometry></mxCell><mxCell id="c8" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="tasks" target="files"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c9" value="状态事件" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;dashed=1;exitX=0.5;exitY=1;entryX=0.5;entryY=1;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="tasks" target="client"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="236" y="640"/><mxPoint x="935" y="640"/></Array></mxGeometry></mxCell><mxCell id="c10" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;dashed=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="bench" target="skillreg"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c11" value="HTTPS" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="adapters" target="providers"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="765" y="676"/><mxPoint x="860" y="676"/></Array></mxGeometry></mxCell></root></mxGraphModel></diagram></mxfile>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<mxfile host="iris-docs"><diagram id="iris-task-lifecycle" name="页 1"><mxGraphModel dx="1000" dy="700" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1240" pageHeight="740" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="start" value="Agent 工具 / GUI 动作卡<br>提交生成请求" style="rounded=1;arcSize=50;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="40" y="300" width="180" height="60" as="geometry"/></mxCell><mxCell id="create" value="创建本地任务<br>status = running" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="268" y="300" width="180" height="60" as="geometry"/></mxCell><mxCell id="attempt" value="提交供应商(Attempt)<br>上传 · 提交 · 同步生成" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff6e5;strokeColor=#c98a1b;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="496" y="298" width="220" height="64" as="geometry"/></mxCell><mxCell id="decide" value="远端受理?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="764" y="280" width="180" height="100" as="geometry"/></mxCell><mxCell id="accepted" value="已受理<br>remoteTaskId 落盘" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eaf7ef;strokeColor=#2e9e5b;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="996" y="300" width="200" height="60" as="geometry"/></mxCell><mxCell id="failover" value="failover:切换下一候选模型" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fceded;strokeColor=#c94f4f;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="496" y="140" width="220" height="58" as="geometry"/></mxCell><mxCell id="exhausted" value="候选耗尽<br>任务失败" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fceded;strokeColor=#c94f4f;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="240" y="141" width="200" height="56" as="geometry"/></mxCell><mxCell id="watch" value="后台轮询盯守<br>重启后自动接管 running 任务" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="700" y="440" width="240" height="56" as="geometry"/></mxCell><mxCell id="succeeded" value="succeeded<br>产物转存 DSH 附件 + 令牌媒体链接" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eaf7ef;strokeColor=#2e9e5b;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="700" y="560" width="240" height="60" as="geometry"/></mxCell><mxCell id="failed" value="failed<br>保留错误说明" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fceded;strokeColor=#c94f4f;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="460" y="560" width="190" height="60" as="geometry"/></mxCell><mxCell id="canceled" value="canceled<br>取消信号传播" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;" vertex="1" parent="1"><mxGeometry x="230" y="560" width="180" height="60" as="geometry"/></mxCell><mxCell id="note1" value="黄金规则:远端受理后绝不自动重提<br>重提只发生在提交阶段的模型候选切换,避免重复计费" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b9c2ce;fontColor=#5b6472;fontSize=11;dashed=1;" vertex="1" parent="1"><mxGeometry x="40" y="650" width="560" height="64" as="geometry"/></mxCell><mxCell id="note2" value="启动恢复与取消<br>有 remoteTaskId 的任务继续盯守;孤儿提交清理为 failed;取消传播到本地等待与轮询" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b9c2ce;fontColor=#5b6472;fontSize=11;dashed=1;" vertex="1" parent="1"><mxGeometry x="640" y="650" width="556" height="64" as="geometry"/></mxCell><mxCell id="c1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="start" target="create"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="create" target="attempt"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="attempt" target="decide"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c4" value="是" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="decide" target="accepted"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c5" value="否" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=0;entryX=1;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="decide" target="failover"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="854" y="169"/><mxPoint x="716" y="169"/></Array></mxGeometry></mxCell><mxCell id="c6" value="重试提交" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="failover" target="attempt"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c7" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="failover" target="exhausted"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c8" value="转入盯守" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=1;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="accepted" target="watch"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="1096" y="468"/><mxPoint x="940" y="468"/></Array></mxGeometry></mxCell><mxCell id="c9" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="watch" target="succeeded"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c10" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;dashed=1;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="watch" target="failed"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="760" y="534"/><mxPoint x="555" y="534"/></Array></mxGeometry></mxCell><mxCell id="c11" value="轮询耗尽 / 取消 / 错误" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;dashed=1;exitX=0;exitY=0.5;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="watch" target="canceled"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="660" y="468"/><mxPoint x="660" y="524"/><mxPoint x="320" y="524"/></Array></mxGeometry></mxCell></root></mxGraphModel></diagram></mxfile>
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<mxfile host="iris-docs"><diagram id="iris-workflow-compose" name="页 1"><mxGraphModel dx="1000" dy="700" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1150" pageHeight="500" math="0" shadow="0"><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="src" value="源图片<br>宿主路径 / 会话附件" style="rounded=1;arcSize=50;whiteSpace=wrap;html=1;fillColor=#f5f6f8;strokeColor=#b9c2ce;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="40" y="116" width="190" height="66" as="geometry"/></mxCell><mxCell id="look" value="iris_look_at_image<br>结构化观察:主体 · 构图 · 色彩 · 文字" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="280" y="116" width="250" height="66" as="geometry"/></mxCell><mxCell id="prompt" value="生成自包含提示词<br>区分原图事实与本次改动要求" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="580" y="116" width="250" height="66" as="geometry"/></mxCell><mxCell id="draw" value="iris_draw_image<br>付费步骤 · 按产物数计" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff6e5;strokeColor=#c98a1b;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="880" y="116" width="230" height="66" as="geometry"/></mxCell><mxCell id="review" value="iris_relook_attachment<br>对照原始需求逐项复核" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="880" y="286" width="230" height="66" as="geometry"/></mxCell><mxCell id="decide" value="与需求一致?" style="rhombus;whiteSpace=wrap;html=1;fillColor=#eef3ff;strokeColor=#4d6bfe;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="600" y="272" width="180" height="94" as="geometry"/></mxCell><mxCell id="deliver" value="交付产物<br>attachment id + 任务记录 + 媒体链接" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#eaf7ef;strokeColor=#2e9e5b;fontColor=#1f2328;fontSize=12;strokeWidth=1.5;" vertex="1" parent="1"><mxGeometry x="320" y="278" width="220" height="82" as="geometry"/></mxCell><mxCell id="note1" value="纪律:只在缺失会改变结果时提问;复核不通过才重绘;生成前明确用途与比例;保留 attachment id 与任务记录供后续步骤复用" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#ffffff;strokeColor=#b9c2ce;fontColor=#5b6472;fontSize=11;dashed=1;" vertex="1" parent="1"><mxGeometry x="40" y="408" width="1070" height="40" as="geometry"/></mxCell><mxCell id="c1" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="src" target="look"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c2" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="look" target="prompt"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c3" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=1;exitY=0.5;entryX=0;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="prompt" target="draw"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c4" value="需要复核" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0.5;exitY=1;entryX=0.5;entryY=0;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="draw" target="review"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c5" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="review" target="decide"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c6" value="一致" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;exitX=0;exitY=0.5;entryX=1;entryY=0.5;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="decide" target="deliver"><mxGeometry relative="1" as="geometry"/></mxCell><mxCell id="c7" value="不一致 · 仅针对具体偏差重生成" style="edgeStyle=orthogonalEdgeStyle;rounded=1;html=1;strokeColor=#6b7686;strokeWidth=1.5;fontColor=#5b6472;fontSize=11;labelBackgroundColor=#ffffff;dashed=1;exitX=0.5;exitY=0;entryX=0.5;entryY=1;exitDx=0;exitDy=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="decide" target="prompt"><mxGeometry relative="1" as="geometry"><Array as="points"><mxPoint x="690" y="232"/><mxPoint x="705" y="232"/></Array></mxGeometry></mxCell></root></mxGraphModel></diagram></mxfile>
|
package/docs/releases/0.1.1.md
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
Iris v0.1.1 is a compatibility and hardening release of the media and visual
|
|
2
|
-
workspace for DeepSeek Harness, targeting DSH `>=0.1.2-rc.1 <0.1.3-0`.
|
|
3
|
-
|
|
4
|
-
## Highlights
|
|
5
|
-
- Register the client under the full npm package name, fixing a load failure
|
|
6
|
-
on DSH 0.1.2+ Web clients.
|
|
7
|
-
- Raise the minimum Node.js to 20.10; the image dependency requires JSON
|
|
8
|
-
import attributes that 20.9 cannot parse.
|
|
9
|
-
- The workbench now auto-detects media protocols with an explicit override,
|
|
10
|
-
and probes models per capability with confirmation before any paid call.
|
|
11
|
-
|
|
12
|
-
## Reliability and data safety
|
|
13
|
-
- Corrupted persistence files are quarantined with the original evidence
|
|
14
|
-
preserved and rebuilt safely, instead of crashing or silently losing updates.
|
|
15
|
-
- Large media downloads use streaming atomic writes; failed downloads clean
|
|
16
|
-
up their temporary files.
|
|
17
|
-
- Legacy ai-paint configuration is imported only when `IRIS_IMPORT_WORKBENCH_CONFIG`
|
|
18
|
-
is set explicitly; default startup no longer reads external paths.
|
|
19
|
-
- DashScope credentials are bound to official HTTPS endpoints before any
|
|
20
|
-
request is sent.
|
|
21
|
-
- On POSIX, Iris state is stored under `0700` directories and `0600` files;
|
|
22
|
-
`/iris/*` accepts loopback hosts only unless `IRIS_TRUSTED_HOSTS` is configured.
|
|
23
|
-
|
|
24
|
-
## Testing and release pipeline
|
|
25
|
-
- The full regression suite runs on a Linux/Windows × Node.js 20.10/22 matrix,
|
|
26
|
-
with a pure Node.js scheduler, per-file isolation, and automatic temp cleanup.
|
|
27
|
-
- Windows support hardened end to end: LF-forced checkout, CRLF-tolerant
|
|
28
|
-
parsers, and cross-platform module paths.
|
|
29
|
-
- Releases are now tag-driven: pushing `vX.Y.Z` runs the full suite, verifies
|
|
30
|
-
the tag against `package.json`, creates this Release with the packaged
|
|
31
|
-
tarball, and publishes to npm with provenance.
|
|
32
|
-
|
|
33
|
-
## Install
|
|
34
|
-
```bash
|
|
35
|
-
dsh plugin --profile web add @mokuyoaxis/dsh-iris
|
|
36
|
-
dsh web
|
|
37
|
-
```
|
|
38
|
-
> Requires Node.js 20.10.0 or later and DSH `>=0.1.2-rc.1`. Video frame
|
|
39
|
-
> extraction and video summaries require ffmpeg and ffprobe.
|
|
40
|
-
|
|
41
|
-
See the [README](https://github.com/mokuyoaxis/dsh-iris#readme) and
|
|
42
|
-
[User Guide](https://github.com/mokuyoaxis/dsh-iris/blob/v0.1.1/user_guide.md)
|
|
43
|
-
for provider and model configuration.
|
|
44
|
-
|
|
45
|
-
Image, video, and speech operations may incur charges from the configured provider.
|
|
46
|
-
|
|
47
|
-
## Package
|
|
48
|
-
- npm: [@mokuyoaxis/dsh-iris](https://www.npmjs.com/package/@mokuyoaxis/dsh-iris)
|
|
49
|
-
- Changelog: [v0.1.1](https://github.com/mokuyoaxis/dsh-iris/blob/v0.1.1/CHANGELOG.md)
|
|
50
|
-
|
|
51
|
-
**Full Changelog**: https://github.com/mokuyoaxis/dsh-iris/compare/v0.1.0...v0.1.1
|
package/docs/releases/0.1.2.md
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
# Iris Media for DSH v0.1.2
|
|
2
|
-
|
|
3
|
-
This release makes Iris easier to discover and use from a normal DSH installation, while giving prompt optimization a first-class place in the conversation composer.
|
|
4
|
-
|
|
5
|
-
## Highlights
|
|
6
|
-
|
|
7
|
-
- Adds a borderless 🫧 prompt-optimization control to the DSH composer. It supports general, image, video, and S2V prompts; previews before write-back; never sends automatically; and uses a glass, mobile-safe panel.
|
|
8
|
-
- Adds an independent, private JSON configuration for optimizer prompts, target templates, model routing, reasoning strategy, and output budget, with import, export, reset, disable, and re-enable controls.
|
|
9
|
-
- Defaults optimizer reasoning to `off-if-supported`, using DSH model metadata instead of inheriting the session's High/Low setting and consuming the visible output budget.
|
|
10
|
-
- Registers the bundled `iris-verify-ui` and `iris-compose-media` Skills when the plugin starts, so npm users can discover them outside this repository.
|
|
11
|
-
- Uses the unique Cordis row ID `mokuyoaxis-dsh-iris`, avoiding collision with the unrelated unscoped `dsh-iris` package.
|
|
12
|
-
- Adds an English README, architecture and workflow diagrams, an Android 16 screenshot gallery, and a real Iris image generated through the documented prompt-to-artifact loop.
|
|
13
|
-
- Keeps the floating quick panel focused on running tasks and recent successful artifacts; failed and canceled history remains available in the full workbench.
|
|
14
|
-
- Makes capability indicators immediately reflect configured providers without requiring every action card to be opened first; an action error dims its indicator.
|
|
15
|
-
|
|
16
|
-
## Compatibility
|
|
17
|
-
|
|
18
|
-
- DeepSeek Harness: `>=0.1.2-rc.1 <0.1.3-0`
|
|
19
|
-
- Node.js: `>=20.10.0`
|
|
20
|
-
- Verified locally on Linux ARM64 under Android 16 Termux/PRoot Debian with Node.js 22.23.2 and DSH 0.1.2-rc.1.
|
|
21
|
-
|
|
22
|
-
## Upgrade note
|
|
23
|
-
|
|
24
|
-
Normal plugin upgrades need no manual migration. If a personal `cordis.patch.yml` explicitly overrides the old row ID `dsh-iris`, change that override to `mokuyoaxis-dsh-iris`.
|
|
25
|
-
|
|
26
|
-
The npm package remains `@mokuyoaxis/dsh-iris`; the unscoped `dsh-iris` name belongs to another project.
|
package/docs/releases/0.1.3.md
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
## Iris Media for DSH 0.1.3
|
|
2
|
-
|
|
3
|
-
Version 0.1.3 makes media tasks safer to recover and much harder to accidentally submit twice. It is a reliability release: no new media provider is added.
|
|
4
|
-
|
|
5
|
-
### Highlights
|
|
6
|
-
|
|
7
|
-
- Introduces Task/Attempt v2 across image, video, transcription, and TTS generation. One user intent owns one Task, while provider/model candidates become auditable Attempts.
|
|
8
|
-
- Records every Attempt before a potentially billable request. Automatic failover is allowed only after an explicit `not_accepted` result; timeouts, 5xx responses, disconnects, missing responses, and local persistence failures stop conservatively.
|
|
9
|
-
- Separates remote generation outcome from local artifact delivery. A download or filesystem failure no longer rewrites a successful generation as failed.
|
|
10
|
-
- Adds stable workbench states for paused observation, unknown acceptance/outcome, and unavailable artifacts, with a dedicated “Needs attention” section on desktop and mobile.
|
|
11
|
-
- Adds re-observe and re-deliver controls that never submit a new generation request. Informed retry requires a separate duplicate-charge confirmation, creates a linked new Task, and archives the original reminder so it is not counted twice.
|
|
12
|
-
- Adds acknowledge/restore controls for attention items. Acknowledgement only changes local reminder metadata; it never rewrites unknown provider facts. Legacy read-only labels now require an explicit Task v1 marker, avoiding false labels during hot-update version skew.
|
|
13
|
-
- Adds process-scoped state epochs/revisions and SSE backpressure coalescing so delayed snapshots and slow clients cannot roll the UI backwards.
|
|
14
|
-
- Adds an offline, zero-network Doctor API and CLI: `dsh-iris doctor [--json]`, also available through `npx @mokuyoaxis/dsh-iris doctor`. Exit codes are 0 for healthy, 1 for warnings, and 2 for hard errors.
|
|
15
|
-
- Publishes architecture, security-boundary, provider-submission, task-semantics, and fault-injection documentation.
|
|
16
|
-
|
|
17
|
-
### Safety notes
|
|
18
|
-
|
|
19
|
-
- Re-observe only polls an already accepted remote task.
|
|
20
|
-
- Re-deliver only queries and downloads an already successful result.
|
|
21
|
-
- Informed retry may duplicate a still-running remote job and may incur another charge. Iris requires explicit confirmation and currently exposes it only when the original text input can be reconstructed safely.
|
|
22
|
-
- The offline Doctor does not start DSH, contact providers, print API keys, or claim that browser/tool registration is healthy.
|
|
23
|
-
|
|
24
|
-
### Compatibility
|
|
25
|
-
|
|
26
|
-
- DeepSeek Harness: `>=0.1.2-rc.1 <0.1.3-0`
|
|
27
|
-
- Node.js: `>=20.10.0`
|
|
28
|
-
- Package: `@mokuyoaxis/dsh-iris`
|
|
29
|
-
|
|
30
|
-
This release was developed and locally validated on Linux ARM64 under Android 16 Termux/PRoot Debian with DSH `0.1.2-rc.1`. Cross-platform CI results should be confirmed from the release commit before publishing.
|