@exellix/ai-tasks 8.4.1 → 8.4.2
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/README.md +1 -1
- package/documenations/upstream-feature-requests/README.md +2 -1
- package/documenations/upstream-feature-requests/ai-tasks-wrap-up-after-upstream.md +3 -3
- package/documenations/upstream-feature-requests/xynthesis-ai-profiles-2.1-import-break.md +324 -0
- package/documenations/upstream-feature-requests/xynthesis-orchestrator-invoke-contract-4.2.md +6 -4
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ Private Git/npm package for executing **tasks** using the Woreces execution stac
|
|
|
11
11
|
| Package | Role in `runTask` | Minimum |
|
|
12
12
|
|---------|-------------------|---------|
|
|
13
13
|
| `@x12i/ai-profiles` | Profile/shortcut → wire model (`catalogLane` required on resolve) | **2.1.0** |
|
|
14
|
-
| `@exellix/xynthesis` | PRE synthesis, POST audit/polish, scoping, utilities (`executeXynthesisAction`) | **4.3.0
|
|
14
|
+
| `@exellix/xynthesis` | PRE synthesis, POST audit/polish, scoping, utilities (`executeXynthesisAction`) | **≥ 4.3.1** (4.3.0 breaks import with ai-profiles 2.1 — see [upstream §0](./documenations/upstream-feature-requests/xynthesis-orchestrator-invoke-contract-4.2.md)) |
|
|
15
15
|
| `@exellix/ai-skills` | MAIN `runSkill` (Optimixer caps, `ModelConfig.reasoningEffort`) | **6.0.0** |
|
|
16
16
|
|
|
17
17
|
Use explicit **ai-profiles** profile keys (`cheap`, `pro`, `cyber`, …) or **shortcuts** (`cheapest`, `default`, …) or **`profile/choice`** keys — not removed sync helpers or legacy tier aliases.
|
|
@@ -7,7 +7,8 @@ Fix reports filed for sibling packages. Hand these to the package owners; after
|
|
|
7
7
|
| Package | Document | Status |
|
|
8
8
|
|---------|----------|--------|
|
|
9
9
|
| `@exellix/ai-skills` 6.0 | [ai-skills-orchestrator-invoke-contract-5.9.md](./ai-skills-orchestrator-invoke-contract-5.9.md) | **shipped** — `ModelConfig.reasoningEffort` |
|
|
10
|
-
| `@exellix/xynthesis` 4.3 | [xynthesis-
|
|
10
|
+
| `@exellix/xynthesis` 4.3 | [**xynthesis-ai-profiles-2.1-import-break.md**](./xynthesis-ai-profiles-2.1-import-break.md) | **P0 blocked** — **4.3.0** breaks `import "@exellix/xynthesis"` with ai-profiles **2.1.0**; need **≥ 4.3.1** |
|
|
11
|
+
| `@exellix/xynthesis` 4.3 | [xynthesis-orchestrator-invoke-contract-4.2.md](./xynthesis-orchestrator-invoke-contract-4.2.md) | **partial** — `reasoningEffort` shipped in 4.3.0; import break tracked in CR above |
|
|
11
12
|
| `@x12i/ai-profiles` 2.1 | — | **shipped** — `catalogLane` required; sync `isKnownProfileOrShortcut` removed (safer — resolve at invoke) |
|
|
12
13
|
| `@exellix/ai-tasks` | [ai-tasks-wrap-up-after-upstream.md](./ai-tasks-wrap-up-after-upstream.md) | **done** in 8.4 — no legacy tiers; resolve at invoke via `resolveAIProfile` |
|
|
13
14
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `@exellix/ai-tasks` — wrap-up after upstream invoke-contract fixes
|
|
2
2
|
|
|
3
|
-
Status: **blocked** on **@exellix/xynthesis ≥ 4.3.1**
|
|
3
|
+
Status: **blocked** on **@exellix/xynthesis ≥ 4.3.1** ([xynthesis-ai-profiles-2.1-import-break.md](./xynthesis-ai-profiles-2.1-import-break.md)); invoke-contract items below are otherwise shipped in **ai-skills 6.0** / **xynthesis 4.3**:
|
|
4
4
|
|
|
5
5
|
- [`ai-skills-orchestrator-invoke-contract-5.9.md`](./ai-skills-orchestrator-invoke-contract-5.9.md)
|
|
6
6
|
- [`xynthesis-orchestrator-invoke-contract-4.2.md`](./xynthesis-orchestrator-invoke-contract-4.2.md)
|
|
@@ -107,8 +107,8 @@ flowchart LR
|
|
|
107
107
|
|
|
108
108
|
Recommended sequence:
|
|
109
109
|
|
|
110
|
-
1. Merge **xynthesis** + **ai-skills** contract PRs (can be parallel).
|
|
111
|
-
2. Bump `package.json`
|
|
110
|
+
1. Merge **xynthesis** ai-profiles 2.1 import fix (**≥ 4.3.1**) + **ai-skills** contract PRs (can be parallel).
|
|
111
|
+
2. Bump `package.json`: `"@exellix/xynthesis": "^4.3.1"` (minimum — **do not** ship ai-tasks 8.4.x consumer release on **4.3.0**).
|
|
112
112
|
3. Execute **this wrap-up** checklist in one ai-tasks PR.
|
|
113
113
|
4. Release note in **8.4.x** or **8.5.0** with graph-engine migration (drop `maxTokensCap` on task payloads if removed).
|
|
114
114
|
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# `@exellix/xynthesis` — ai-profiles 2.1 import break (`isKnownProfileOrShortcut` removed)
|
|
2
|
+
|
|
3
|
+
Status: **open — blocks all consumers**
|
|
4
|
+
Owner: `@exellix/xynthesis`
|
|
5
|
+
Filed by: `@exellix/ai-tasks`
|
|
6
|
+
Target release: **`@exellix/xynthesis` ≥ 4.3.1**
|
|
7
|
+
Reproduced with: `@exellix/xynthesis` **4.3.0** (broken), `@x12i/ai-profiles` **2.1.0** (required by `@x12i/ai-tools` ≥ 2.4)
|
|
8
|
+
Consumers blocked: `@exellix/ai-tasks` **8.4.x**, graph-engine import tests, any app that `import "@exellix/xynthesis"`
|
|
9
|
+
|
|
10
|
+
Related: [`xynthesis-orchestrator-invoke-contract-4.2.md §0`](./xynthesis-orchestrator-invoke-contract-4.2.md) (invoke-contract track — this CR is the **P0 runtime fix**)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Summary
|
|
15
|
+
|
|
16
|
+
**`@exellix/xynthesis@4.3.0`** imports and re-exports **`isKnownProfileOrShortcut`** from **`@x12i/ai-profiles`**. That symbol was **removed from the package root in ai-profiles 2.1.0** (replaced by **`isKnownProfileChoice`** and strict **`profile/choice`** resolution).
|
|
17
|
+
|
|
18
|
+
With the current Exellix stack pinned to ai-profiles **2.1.0**, **module load fails before any API call**:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
SyntaxError: The requested module '@x12i/ai-profiles' does not provide an export named 'isKnownProfileOrShortcut'
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Not an ai-profiles bug** — 2.1.0 intentionally dropped sync alias guessing.
|
|
25
|
+
**Not an ai-tasks bug** — ai-tasks already migrated to ai-profiles 2.1 APIs.
|
|
26
|
+
**Not fixable in consumers** — npm `overrides`, deep imports of `dist/isKnownProfileOrShortcut.js`, or pinning ai-profiles `<2.1` violate the no-legacy invoke contract and break `@x12i/ai-tools`.
|
|
27
|
+
|
|
28
|
+
**Required:** xynthesis **4.3.1** patch — adopt ai-profiles 2.1 resolve input normalization (same pattern as ai-tasks 8.4).
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Impact
|
|
33
|
+
|
|
34
|
+
| Path | Symptom |
|
|
35
|
+
|------|---------|
|
|
36
|
+
| `import "@exellix/xynthesis"` | **SyntaxError** at ESM link time |
|
|
37
|
+
| `import "@exellix/ai-tasks"` | Same — ai-tasks depends on xynthesis |
|
|
38
|
+
| graph-engine / consumer test suites | Fail at import; no `runTask()` coverage |
|
|
39
|
+
| `executeXynthesisAction({ model: "cheap", … })` | Would fail at resolve **after** import fix if resolve path is not updated |
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## Reproduction
|
|
44
|
+
|
|
45
|
+
### Minimal (any Node 20+ project with both packages installed)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
npm i @exellix/xynthesis@4.3.0 @x12i/ai-profiles@2.1.0
|
|
49
|
+
node -e "import('@exellix/xynthesis').then(() => console.log('ok')).catch(e => console.error(e))"
|
|
50
|
+
# SyntaxError: ... does not provide an export named 'isKnownProfileOrShortcut'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### From ai-tasks repo
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
cd ai-tasks
|
|
57
|
+
npm install # tree dedupes ai-profiles@2.1.0
|
|
58
|
+
node -e "import('@exellix/xynthesis')"
|
|
59
|
+
npm run test # fails at import / dist-test compile depending on test graph
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Dependency tree (why ai-profiles cannot be downgraded)
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
@exellix/ai-tasks
|
|
66
|
+
├── @x12i/ai-profiles@2.1.0
|
|
67
|
+
├── @exellix/xynthesis@4.3.0 → imports isKnownProfileOrShortcut ✗
|
|
68
|
+
├── @exellix/ai-skills@6.0.0 → ai-profiles@2.1.0
|
|
69
|
+
└── @x12i/funcx@4.3.3 → ai-profiles@2.1.0
|
|
70
|
+
└── @exellix/xynthesis (transitive)
|
|
71
|
+
└── @x12i/ai-tools@2.4.0 → requires ai-profiles 2.1 (formatProfileChoiceKey)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Root cause (xynthesis 4.3.0)
|
|
77
|
+
|
|
78
|
+
### 1. Broken ESM import / re-export
|
|
79
|
+
|
|
80
|
+
**File:** `src/index.ts` (compiled to `dist/index.js`)
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
export {
|
|
84
|
+
resolveAIProfile,
|
|
85
|
+
isKnownProfileOrShortcut, // ← removed from ai-profiles 2.1 root
|
|
86
|
+
listAIProfiles,
|
|
87
|
+
listAIShortcuts,
|
|
88
|
+
} from "@x12i/ai-profiles";
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**File:** `src/resolveAiProfileModel.ts`
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
import { isKnownProfileOrShortcut, resolveAIProfile } from "@x12i/ai-profiles";
|
|
95
|
+
|
|
96
|
+
export function assertKnownModelAlias(input: string): void {
|
|
97
|
+
// ...
|
|
98
|
+
if (!isKnownProfileOrShortcut(key)) {
|
|
99
|
+
throw new Error(`xynthesis: unknown model alias "${key}"…`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
Because **`index.ts` re-exports the missing symbol**, Node fails while linking `@exellix/xynthesis` — even callers that never use `assertKnownModelAlias`.
|
|
105
|
+
|
|
106
|
+
### 2. Stale resolve input shape (secondary — fails after import fix)
|
|
107
|
+
|
|
108
|
+
**File:** `src/resolveAiProfileModel.ts` — `resolveXynthesisModel`
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
const profile = await resolveAIProfile(alias, mergedOptions);
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
ai-profiles **2.1.0** rejects bare profile keys:
|
|
115
|
+
|
|
116
|
+
```text
|
|
117
|
+
Unknown profile/choice key: cheap. Use "profile/choice" (e.g. "cheap/default") or a shortcut that pins both.
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Orchestrators (graph-engine, ai-tasks) still send **`preActionModel: "cheap"`** / **`postActionModel: "cheap"`** on the wire. ai-tasks expands at invoke via `formatProfileChoiceKey(profile, "default")`; xynthesis must do the same before `resolveAIProfile`.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Recommended fix (xynthesis ≥ 4.3.1)
|
|
125
|
+
|
|
126
|
+
**No consumer workarounds.** Fix belongs entirely in `@exellix/xynthesis`.
|
|
127
|
+
|
|
128
|
+
### Step 1 — Bump dependency
|
|
129
|
+
|
|
130
|
+
```json
|
|
131
|
+
"@x12i/ai-profiles": "^2.1.0"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Step 2 — Add ai-profiles 2.1 input normalization helper
|
|
135
|
+
|
|
136
|
+
Mirror **`@exellix/ai-tasks`** `src/utils/aiProfileModelFormat.ts` (`toStrictAiProfileResolveInput`). Suggested new file **`src/aiProfileResolveInput.ts`**:
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
import {
|
|
140
|
+
formatProfileChoiceKey,
|
|
141
|
+
isKnownProfileChoice,
|
|
142
|
+
isProfileChoiceKeyFormat,
|
|
143
|
+
} from "@x12i/ai-profiles";
|
|
144
|
+
|
|
145
|
+
/** Map caller alias → ai-profiles 2.1 `resolveAIProfile` input. */
|
|
146
|
+
export function toStrictAiProfileResolveInput(profileSlot: string, explicitChoice?: string): string {
|
|
147
|
+
const trimmed = profileSlot.trim();
|
|
148
|
+
if (!trimmed) return trimmed;
|
|
149
|
+
|
|
150
|
+
if (explicitChoice?.trim()) {
|
|
151
|
+
return formatProfileChoiceKey(trimmed, explicitChoice.trim());
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const at = trimmed.indexOf("@");
|
|
155
|
+
if (at > 0) {
|
|
156
|
+
const profile = trimmed.slice(0, at).trim();
|
|
157
|
+
const choice = trimmed.slice(at + 1).trim();
|
|
158
|
+
return choice
|
|
159
|
+
? formatProfileChoiceKey(profile, choice)
|
|
160
|
+
: formatProfileChoiceKey(profile, "default");
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (isProfileChoiceKeyFormat(trimmed) || isKnownProfileChoice(trimmed)) {
|
|
164
|
+
return trimmed;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Bare profile key (e.g. "cheap") → default choice ("cheap/default")
|
|
168
|
+
return formatProfileChoiceKey(trimmed, "default");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Sync bundled-registry check after normalization (shortcuts + profile/choice keys). */
|
|
172
|
+
export function isKnownXynthesisModelAlias(input: string): boolean {
|
|
173
|
+
const trimmed = input.trim();
|
|
174
|
+
if (!trimmed) return false;
|
|
175
|
+
const resolveInput = toStrictAiProfileResolveInput(trimmed);
|
|
176
|
+
return isKnownProfileChoice(resolveInput);
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Step 3 — Update `resolveAiProfileModel.ts`
|
|
181
|
+
|
|
182
|
+
```ts
|
|
183
|
+
import { resolveAIProfile } from "@x12i/ai-profiles";
|
|
184
|
+
import {
|
|
185
|
+
isKnownXynthesisModelAlias,
|
|
186
|
+
toStrictAiProfileResolveInput,
|
|
187
|
+
} from "./aiProfileResolveInput.js";
|
|
188
|
+
|
|
189
|
+
export function assertKnownModelAlias(input: string): void {
|
|
190
|
+
const key = normalizeAliasInput(input);
|
|
191
|
+
if (!key) {
|
|
192
|
+
throw new Error("xynthesis: model alias must be a non-empty string");
|
|
193
|
+
}
|
|
194
|
+
if (!isKnownXynthesisModelAlias(key)) {
|
|
195
|
+
throw new Error(
|
|
196
|
+
`xynthesis: unknown model alias "${key}". Use profile/choice (e.g. cheap/default), profile@choice, or a shortcut (cheapest, default, json).`
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export async function resolveXynthesisModel(input, options) {
|
|
202
|
+
// ... existing guards ...
|
|
203
|
+
const alias = normalizeAliasInput(input);
|
|
204
|
+
const resolveInput = toStrictAiProfileResolveInput(alias);
|
|
205
|
+
const profile = await resolveAIProfile(resolveInput, mergedOptions);
|
|
206
|
+
// ... rest unchanged ...
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Step 4 — Fix public re-exports in `index.ts`
|
|
211
|
+
|
|
212
|
+
**Remove** `isKnownProfileOrShortcut` from the ai-profiles re-export block.
|
|
213
|
+
|
|
214
|
+
**Preferred replacement:**
|
|
215
|
+
|
|
216
|
+
```ts
|
|
217
|
+
export {
|
|
218
|
+
resolveAIProfile,
|
|
219
|
+
isKnownProfileChoice,
|
|
220
|
+
formatProfileChoiceKey,
|
|
221
|
+
listAIProfiles,
|
|
222
|
+
listAIShortcuts,
|
|
223
|
+
} from "@x12i/ai-profiles";
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**Breaking note for xynthesis CHANGELOG:** `isKnownProfileOrShortcut` re-export removed; use `isKnownProfileChoice` + `toStrictAiProfileResolveInput` (exported from xynthesis) or import directly from `@x12i/ai-profiles`.
|
|
227
|
+
|
|
228
|
+
Optionally export `toStrictAiProfileResolveInput` / `isKnownXynthesisModelAlias` from the package root if downstream tools relied on xynthesis as the ai-profiles facade.
|
|
229
|
+
|
|
230
|
+
### Step 5 — Tests (xynthesis)
|
|
231
|
+
|
|
232
|
+
Extend **`test/resolveAiProfileModel.unit.ts`**:
|
|
233
|
+
|
|
234
|
+
```ts
|
|
235
|
+
import assert from "node:assert/strict";
|
|
236
|
+
import { isKnownXynthesisModelAlias, toStrictAiProfileResolveInput } from "../src/aiProfileResolveInput.js";
|
|
237
|
+
import { resolveXynthesisModel, assertKnownModelAlias } from "../src/resolveAiProfileModel.js";
|
|
238
|
+
|
|
239
|
+
// Import smoke (add dedicated test file if needed)
|
|
240
|
+
await import("../dist/index.js"); // must not throw with ai-profiles 2.1 peer
|
|
241
|
+
|
|
242
|
+
assert.equal(toStrictAiProfileResolveInput("cheap"), "cheap/default");
|
|
243
|
+
assert.equal(isKnownXynthesisModelAlias("cheap"), true);
|
|
244
|
+
assert.equal(isKnownXynthesisModelAlias("cheapest"), true);
|
|
245
|
+
assert.throws(() => assertKnownModelAlias("not-a-profile"));
|
|
246
|
+
|
|
247
|
+
const resolved = await resolveXynthesisModel("cheap", {
|
|
248
|
+
source: "bundled",
|
|
249
|
+
preferOpenRouter: false,
|
|
250
|
+
openrouterApiKeyPresent: false,
|
|
251
|
+
});
|
|
252
|
+
assert.ok(resolved?.wireModelId.includes("/"));
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
Add **`test/aiProfiles21Import.unit.ts`**:
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
await import("@exellix/xynthesis"); // ESM link test
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
Run full suite with **`@x12i/ai-profiles@2.1.0`** installed (not 2.0.x).
|
|
262
|
+
|
|
263
|
+
---
|
|
264
|
+
|
|
265
|
+
## Explicitly rejected (no workarounds)
|
|
266
|
+
|
|
267
|
+
| Approach | Why rejected |
|
|
268
|
+
|----------|--------------|
|
|
269
|
+
| Consumer npm `overrides` pinning ai-profiles 2.0.x | Breaks `@x12i/ai-tools` / `formatProfileChoiceKey`; violates stack alignment |
|
|
270
|
+
| Deep import `@x12i/ai-profiles/dist/isKnownProfileOrShortcut.js` | Private path; not in package exports |
|
|
271
|
+
| ai-profiles 2.1.1 re-export shim only | Pushes debt upstream; xynthesis still passes bare keys to `resolveAIProfile` |
|
|
272
|
+
| graph-engine / ai-tasks patch | Wrong layer — xynthesis owns PRE/POST model resolve |
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## After xynthesis 4.3.1 ships — ai-tasks follow-up
|
|
277
|
+
|
|
278
|
+
1. `"@exellix/xynthesis": "^4.3.1"` in `@exellix/ai-tasks` `package.json`
|
|
279
|
+
2. `npm install && npm run test`
|
|
280
|
+
3. Patch release **8.4.x** updating README / BREAKING-CHANGES minimums
|
|
281
|
+
|
|
282
|
+
See [`ai-tasks-wrap-up-after-upstream.md`](./ai-tasks-wrap-up-after-upstream.md).
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Paste-ready GitHub issue (xynthesis repo)
|
|
287
|
+
|
|
288
|
+
**Title:** ai-profiles 2.1: remove `isKnownProfileOrShortcut` import; normalize profile resolve input
|
|
289
|
+
|
|
290
|
+
**Labels:** `bug`, `ai-profiles`, `breaking`, `P0`
|
|
291
|
+
|
|
292
|
+
**Body:**
|
|
293
|
+
|
|
294
|
+
> `@exellix/xynthesis@4.3.0` fails to load with `@x12i/ai-profiles@2.1.0`:
|
|
295
|
+
>
|
|
296
|
+
> ```
|
|
297
|
+
> SyntaxError: The requested module '@x12i/ai-profiles' does not provide an export named 'isKnownProfileOrShortcut'
|
|
298
|
+
> ```
|
|
299
|
+
>
|
|
300
|
+
> Blocks `@exellix/ai-tasks@8.4.x` and graph-engine import tests.
|
|
301
|
+
>
|
|
302
|
+
> **Fix (4.3.1):**
|
|
303
|
+
> 1. Remove `isKnownProfileOrShortcut` import/re-export; use ai-profiles 2.1 APIs.
|
|
304
|
+
> 2. Normalize bare profile keys (`cheap` → `cheap/default`) before `resolveAIProfile` — see ai-tasks `toStrictAiProfileResolveInput`.
|
|
305
|
+
> 3. Bump `@x12i/ai-profiles` peer to `^2.1.0`; add import + resolve unit tests.
|
|
306
|
+
>
|
|
307
|
+
> Full spec: [link to this doc in ai-tasks repo]
|
|
308
|
+
|
|
309
|
+
**Acceptance criteria:**
|
|
310
|
+
|
|
311
|
+
- [ ] `node -e "import('@exellix/xynthesis')"` succeeds with `@x12i/ai-profiles@2.1.0`.
|
|
312
|
+
- [ ] `resolveXynthesisModel("cheap", { source: "bundled" })` returns a wire model id (no `UNKNOWN_PROFILE_CHOICE`).
|
|
313
|
+
- [ ] `assertKnownModelAlias("cheap")` does not throw; `assertKnownModelAlias("not-a-profile")` throws.
|
|
314
|
+
- [ ] `isKnownProfileOrShortcut` is **not** exported from `@exellix/xynthesis` root.
|
|
315
|
+
- [ ] CHANGELOG entry; publish **4.3.1** (patch).
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## Related
|
|
320
|
+
|
|
321
|
+
- [`@exellix/ai-tasks` `src/utils/aiProfileModelFormat.ts`](../../src/utils/aiProfileModelFormat.ts) — reference implementation
|
|
322
|
+
- [`.docs/ai-tasks-model-profile-aliases-7x.md`](../../.docs/ai-tasks-model-profile-aliases-7x.md) — wire shapes orchestrators send
|
|
323
|
+
- [`BREAKING-CHANGES.md`](../../BREAKING-CHANGES.md) — 8.4.x blocked subsection
|
|
324
|
+
- [`xynthesis-orchestrator-invoke-contract-4.2.md`](./xynthesis-orchestrator-invoke-contract-4.2.md) — invoke contract (reasoningEffort shipped; import fix is separate P0)
|
package/documenations/upstream-feature-requests/xynthesis-orchestrator-invoke-contract-4.2.md
CHANGED
|
@@ -10,13 +10,13 @@ Related (older, partially superseded): [`xynthesis-llm-observability.md`](./xynt
|
|
|
10
10
|
|
|
11
11
|
---
|
|
12
12
|
|
|
13
|
-
## 0. Blocker:
|
|
13
|
+
## 0. Blocker: ai-profiles 2.1 import break — **see dedicated CR**
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
**P0 — tracked in [`xynthesis-ai-profiles-2.1-import-break.md`](./xynthesis-ai-profiles-2.1-import-break.md).**
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
**`@exellix/xynthesis@4.3.0`** breaks `import "@exellix/xynthesis"` with **`@x12i/ai-profiles@2.1.0`** (`isKnownProfileOrShortcut` removed). Fix requires **≥ 4.3.1** with ai-profiles 2.1 resolve-input normalization — not a symbol rename only.
|
|
18
18
|
|
|
19
|
-
**
|
|
19
|
+
**After publish — ai-tasks bump:** `"@exellix/xynthesis": "^4.3.1"`, test, patch release.
|
|
20
20
|
|
|
21
21
|
---
|
|
22
22
|
|
|
@@ -167,6 +167,8 @@ ai-tasks will follow whichever contract is published; default integration is **n
|
|
|
167
167
|
|
|
168
168
|
## Verification checklist (for xynthesis PR)
|
|
169
169
|
|
|
170
|
+
- [ ] Replace `isKnownProfileOrShortcut` → `isKnownProfileChoice` (index re-export + `resolveAiProfileModel` / `assertKnownModelAlias`).
|
|
171
|
+
- [ ] `import "@exellix/xynthesis"` succeeds with `@x12i/ai-profiles@2.1.0` installed.
|
|
170
172
|
- [ ] `ExecuteXynthesisActionRequest.reasoningEffort` (and gateway wrappers).
|
|
171
173
|
- [ ] Optimixer predict receives resolved `reasoningEffort`.
|
|
172
174
|
- [ ] `temperature` + `topP` integration tests on `executeXynthesisAction` + structured gateway.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@exellix/ai-tasks",
|
|
3
|
-
"version": "8.4.
|
|
3
|
+
"version": "8.4.2",
|
|
4
4
|
"description": "Task orchestration for the Exellix stack: runTask() with local handlers or LLM-backed execution, task-scoped memory/context enrichment, and executor dispatch via @exellix/ai-skills. ERC-compliant.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"@exellix/narrix-ingest": "^2.0.0",
|
|
79
79
|
"@exellix/narrix-runner": "^2.0.0",
|
|
80
80
|
"@exellix/narrix-web-scoper": "^2.0.0",
|
|
81
|
-
"@exellix/xynthesis": "^4.3.
|
|
81
|
+
"@exellix/xynthesis": "^4.3.1",
|
|
82
82
|
"@x12i/activix": "^8.5.0",
|
|
83
83
|
"@x12i/ai-profiles": "^2.1.0",
|
|
84
84
|
"@x12i/catalox": "^5.1.3",
|