nexus-ai-pro 1.24.0 → 2.0.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.
Files changed (295) hide show
  1. package/API_STABILITY.md +59 -4
  2. package/CHANGELOG.md +165 -1
  3. package/MIGRATING.md +303 -0
  4. package/README.md +28 -7
  5. package/dist/agent/create-agent.d.ts +6 -0
  6. package/dist/agent/create-agent.js +3 -2
  7. package/dist/agent/index.d.ts +1 -1
  8. package/dist/agent/index.js +1 -1
  9. package/dist/agent/loop.js +2 -2
  10. package/dist/agent/tool.d.ts +14 -1
  11. package/dist/agent/tool.js +17 -0
  12. package/dist/batch/manager.d.ts +7 -0
  13. package/dist/batch/manager.js +13 -2
  14. package/dist/capabilities/negotiate.d.ts +1 -0
  15. package/dist/capabilities/negotiate.js +9 -2
  16. package/dist/cli/args.js +2 -0
  17. package/dist/cli/migrate.d.ts +52 -0
  18. package/dist/cli/migrate.js +324 -0
  19. package/dist/cli/root-moves.d.ts +9 -0
  20. package/dist/cli/root-moves.js +501 -0
  21. package/dist/cli.js +8 -1
  22. package/dist/context/window.js +2 -0
  23. package/dist/core/lifecycle.d.ts +106 -0
  24. package/dist/core/lifecycle.js +257 -0
  25. package/dist/core/nexus.d.ts +60 -17
  26. package/dist/core/nexus.js +268 -272
  27. package/dist/core/response-format.d.ts +6 -1
  28. package/dist/core/response-format.js +44 -18
  29. package/dist/core/secure-stream.js +0 -1
  30. package/dist/core/usage.d.ts +3 -3
  31. package/dist/core/usage.js +2 -6
  32. package/dist/embeddings/auto-providers.d.ts +6 -0
  33. package/dist/embeddings/auto-providers.js +14 -0
  34. package/dist/embeddings/engine.d.ts +52 -0
  35. package/dist/embeddings/engine.js +560 -0
  36. package/dist/embeddings/manager.d.ts +20 -34
  37. package/dist/embeddings/manager.js +17 -536
  38. package/dist/embeddings/register.js +12 -29
  39. package/dist/graph/checkpoint-migration.d.ts +28 -0
  40. package/dist/graph/checkpoint-migration.js +16 -0
  41. package/dist/graph/checkpointer.d.ts +6 -3
  42. package/dist/graph/checkpointer.js +7 -3
  43. package/dist/graph/functional.d.ts +6 -0
  44. package/dist/graph/functional.js +12 -8
  45. package/dist/graph/graph.d.ts +9 -1
  46. package/dist/graph/graph.js +69 -39
  47. package/dist/graph/index.d.ts +2 -1
  48. package/dist/graph/index.js +1 -0
  49. package/dist/hallucination/index.d.ts +10 -0
  50. package/dist/hallucination/index.js +5 -0
  51. package/dist/images/dimensions.d.ts +5 -0
  52. package/dist/images/dimensions.js +9 -0
  53. package/dist/images/index.d.ts +1 -1
  54. package/dist/images/manager.d.ts +0 -11
  55. package/dist/images/manager.js +11 -379
  56. package/dist/images/operation.d.ts +17 -0
  57. package/dist/images/operation.js +367 -0
  58. package/dist/index.d.ts +17 -91
  59. package/dist/index.js +8 -80
  60. package/dist/jobs/queue.d.ts +6 -0
  61. package/dist/jobs/queue.js +2 -1
  62. package/dist/lifecycle/budget.d.ts +55 -0
  63. package/dist/lifecycle/budget.js +70 -0
  64. package/dist/lifecycle/index.d.ts +8 -0
  65. package/dist/lifecycle/index.js +2 -0
  66. package/dist/lifecycle/run.d.ts +10 -0
  67. package/dist/lifecycle/run.js +14 -0
  68. package/dist/models/registry.d.ts +10 -1
  69. package/dist/models/registry.js +19 -2
  70. package/dist/next/route-handler.d.ts +3 -0
  71. package/dist/ops/audit-logger.d.ts +2 -0
  72. package/dist/ops/audit-logger.js +3 -0
  73. package/dist/ops/family-telemetry.d.ts +32 -21
  74. package/dist/ops/family-telemetry.js +24 -52
  75. package/dist/ops/health.d.ts +0 -6
  76. package/dist/ops/health.js +0 -2
  77. package/dist/ops/index.d.ts +12 -0
  78. package/dist/ops/index.js +6 -0
  79. package/dist/ops/metrics.d.ts +4 -6
  80. package/dist/ops/metrics.js +9 -3
  81. package/dist/optimizer/index.d.ts +1 -0
  82. package/dist/optimizer/index.js +1 -2
  83. package/dist/pipeline/index.d.ts +7 -0
  84. package/dist/pipeline/index.js +1 -0
  85. package/dist/pipeline/pipeline.d.ts +17 -11
  86. package/dist/pipeline/pipeline.js +15 -7
  87. package/dist/pipeline/types.d.ts +36 -18
  88. package/dist/providers/anthropic.d.ts +4 -2
  89. package/dist/providers/anthropic.js +168 -42
  90. package/dist/providers/base.d.ts +8 -4
  91. package/dist/providers/base.js +0 -1
  92. package/dist/providers/cohere.d.ts +0 -1
  93. package/dist/providers/cohere.js +11 -25
  94. package/dist/providers/content.d.ts +29 -0
  95. package/dist/providers/content.js +79 -0
  96. package/dist/providers/google.d.ts +2 -0
  97. package/dist/providers/google.js +61 -18
  98. package/dist/providers/groq.d.ts +8 -3
  99. package/dist/providers/groq.js +17 -21
  100. package/dist/providers/lazy.d.ts +32 -0
  101. package/dist/providers/lazy.js +154 -0
  102. package/dist/providers/mistral.d.ts +8 -3
  103. package/dist/providers/mistral.js +17 -21
  104. package/dist/providers/ollama.js +0 -2
  105. package/dist/providers/openai.d.ts +15 -2
  106. package/dist/providers/openai.js +137 -44
  107. package/dist/providers/openrouter.d.ts +3 -2
  108. package/dist/providers/openrouter.js +4 -4
  109. package/dist/realtime/session.d.ts +5 -0
  110. package/dist/realtime/session.js +32 -0
  111. package/dist/realtime/types.d.ts +6 -0
  112. package/dist/router/auto-router.js +9 -10
  113. package/dist/router/failover.d.ts +6 -0
  114. package/dist/router/failover.js +14 -10
  115. package/dist/security/index.d.ts +1 -0
  116. package/dist/security/index.js +1 -5
  117. package/dist/security/schema-validator.d.ts +6 -230
  118. package/dist/security/schema-validator.js +142 -56
  119. package/dist/security/upload-scanner.d.ts +2 -2
  120. package/dist/security/upload-scanner.js +1 -1
  121. package/dist/server/tenancy.d.ts +3 -5
  122. package/dist/server/tenancy.js +4 -32
  123. package/dist/telephony/manager.d.ts +5 -2
  124. package/dist/telephony/manager.js +24 -49
  125. package/dist/testing/index.d.ts +8 -0
  126. package/dist/testing/index.js +3 -0
  127. package/dist/testing/provider-conformance.js +4 -4
  128. package/dist/types/batch.d.ts +7 -8
  129. package/dist/types/config.d.ts +34 -17
  130. package/dist/types/embeddings.d.ts +6 -12
  131. package/dist/types/graph.d.ts +47 -12
  132. package/dist/types/images.d.ts +6 -14
  133. package/dist/types/lifecycle.d.ts +163 -0
  134. package/dist/types/lifecycle.js +1 -0
  135. package/dist/types/messages.d.ts +41 -2
  136. package/dist/types/optimizer.d.ts +0 -6
  137. package/dist/types/providers.d.ts +15 -9
  138. package/dist/types/providers.js +326 -203
  139. package/dist/types/response.d.ts +12 -5
  140. package/dist/types/security.d.ts +0 -12
  141. package/dist/types/telephony.d.ts +7 -6
  142. package/dist/types/voice.d.ts +5 -4
  143. package/dist/utils/deprecation.d.ts +0 -2
  144. package/dist/utils/deprecation.js +0 -4
  145. package/dist/utils/periods.d.ts +7 -0
  146. package/dist/utils/periods.js +30 -0
  147. package/dist/utils/safe-fetch.d.ts +1 -0
  148. package/dist/utils/tokenizer.js +2 -0
  149. package/dist/voice/manager.js +6 -6
  150. package/dist-cjs/agent/create-agent.d.ts +6 -0
  151. package/dist-cjs/agent/create-agent.js +2 -1
  152. package/dist-cjs/agent/index.d.ts +1 -1
  153. package/dist-cjs/agent/index.js +4 -1
  154. package/dist-cjs/agent/loop.js +1 -1
  155. package/dist-cjs/agent/tool.d.ts +14 -1
  156. package/dist-cjs/agent/tool.js +20 -0
  157. package/dist-cjs/batch/manager.d.ts +7 -0
  158. package/dist-cjs/batch/manager.js +13 -2
  159. package/dist-cjs/capabilities/negotiate.d.ts +1 -0
  160. package/dist-cjs/capabilities/negotiate.js +9 -2
  161. package/dist-cjs/cli/args.js +2 -0
  162. package/dist-cjs/cli/migrate.d.ts +52 -0
  163. package/dist-cjs/cli/migrate.js +332 -0
  164. package/dist-cjs/cli/root-moves.d.ts +9 -0
  165. package/dist-cjs/cli/root-moves.js +504 -0
  166. package/dist-cjs/context/window.js +2 -0
  167. package/dist-cjs/core/lifecycle.d.ts +106 -0
  168. package/dist-cjs/core/lifecycle.js +263 -0
  169. package/dist-cjs/core/nexus.d.ts +60 -17
  170. package/dist-cjs/core/nexus.js +312 -283
  171. package/dist-cjs/core/response-format.d.ts +6 -1
  172. package/dist-cjs/core/response-format.js +77 -21
  173. package/dist-cjs/core/secure-stream.js +0 -1
  174. package/dist-cjs/core/usage.d.ts +3 -3
  175. package/dist-cjs/core/usage.js +1 -5
  176. package/dist-cjs/embeddings/auto-providers.d.ts +6 -0
  177. package/dist-cjs/embeddings/auto-providers.js +17 -0
  178. package/dist-cjs/embeddings/engine.d.ts +52 -0
  179. package/dist-cjs/embeddings/engine.js +564 -0
  180. package/dist-cjs/embeddings/manager.d.ts +20 -34
  181. package/dist-cjs/embeddings/manager.js +53 -539
  182. package/dist-cjs/embeddings/register.js +12 -29
  183. package/dist-cjs/graph/checkpoint-migration.d.ts +28 -0
  184. package/dist-cjs/graph/checkpoint-migration.js +20 -0
  185. package/dist-cjs/graph/checkpointer.d.ts +6 -3
  186. package/dist-cjs/graph/checkpointer.js +7 -3
  187. package/dist-cjs/graph/functional.d.ts +6 -0
  188. package/dist-cjs/graph/functional.js +12 -8
  189. package/dist-cjs/graph/graph.d.ts +9 -1
  190. package/dist-cjs/graph/graph.js +69 -39
  191. package/dist-cjs/graph/index.d.ts +2 -1
  192. package/dist-cjs/graph/index.js +4 -1
  193. package/dist-cjs/hallucination/index.d.ts +10 -0
  194. package/dist-cjs/hallucination/index.js +22 -0
  195. package/dist-cjs/images/dimensions.d.ts +5 -0
  196. package/dist-cjs/images/dimensions.js +12 -0
  197. package/dist-cjs/images/index.d.ts +1 -1
  198. package/dist-cjs/images/manager.d.ts +0 -11
  199. package/dist-cjs/images/manager.js +44 -379
  200. package/dist-cjs/images/operation.d.ts +17 -0
  201. package/dist-cjs/images/operation.js +370 -0
  202. package/dist-cjs/index.d.ts +17 -91
  203. package/dist-cjs/index.js +11 -299
  204. package/dist-cjs/jobs/queue.d.ts +6 -0
  205. package/dist-cjs/jobs/queue.js +2 -1
  206. package/dist-cjs/lifecycle/budget.d.ts +55 -0
  207. package/dist-cjs/lifecycle/budget.js +75 -0
  208. package/dist-cjs/lifecycle/index.d.ts +8 -0
  209. package/dist-cjs/lifecycle/index.js +11 -0
  210. package/dist-cjs/lifecycle/run.d.ts +10 -0
  211. package/dist-cjs/lifecycle/run.js +17 -0
  212. package/dist-cjs/models/registry.d.ts +10 -1
  213. package/dist-cjs/models/registry.js +26 -2
  214. package/dist-cjs/next/route-handler.d.ts +3 -0
  215. package/dist-cjs/ops/audit-logger.d.ts +2 -0
  216. package/dist-cjs/ops/audit-logger.js +3 -0
  217. package/dist-cjs/ops/family-telemetry.d.ts +32 -21
  218. package/dist-cjs/ops/family-telemetry.js +24 -52
  219. package/dist-cjs/ops/health.d.ts +0 -6
  220. package/dist-cjs/ops/health.js +0 -2
  221. package/dist-cjs/ops/index.d.ts +12 -0
  222. package/dist-cjs/ops/index.js +18 -0
  223. package/dist-cjs/ops/metrics.d.ts +4 -6
  224. package/dist-cjs/ops/metrics.js +9 -3
  225. package/dist-cjs/optimizer/index.d.ts +1 -0
  226. package/dist-cjs/optimizer/index.js +3 -3
  227. package/dist-cjs/pipeline/index.d.ts +7 -0
  228. package/dist-cjs/pipeline/index.js +6 -0
  229. package/dist-cjs/pipeline/pipeline.d.ts +17 -11
  230. package/dist-cjs/pipeline/pipeline.js +15 -7
  231. package/dist-cjs/pipeline/types.d.ts +36 -18
  232. package/dist-cjs/providers/anthropic.d.ts +4 -2
  233. package/dist-cjs/providers/anthropic.js +168 -42
  234. package/dist-cjs/providers/base.d.ts +8 -4
  235. package/dist-cjs/providers/base.js +0 -1
  236. package/dist-cjs/providers/cohere.d.ts +0 -1
  237. package/dist-cjs/providers/cohere.js +11 -25
  238. package/dist-cjs/providers/content.d.ts +29 -0
  239. package/dist-cjs/providers/content.js +88 -0
  240. package/dist-cjs/providers/google.d.ts +2 -0
  241. package/dist-cjs/providers/google.js +61 -18
  242. package/dist-cjs/providers/groq.d.ts +8 -3
  243. package/dist-cjs/providers/groq.js +17 -21
  244. package/dist-cjs/providers/lazy.d.ts +32 -0
  245. package/dist-cjs/providers/lazy.js +192 -0
  246. package/dist-cjs/providers/mistral.d.ts +8 -3
  247. package/dist-cjs/providers/mistral.js +17 -21
  248. package/dist-cjs/providers/ollama.js +0 -2
  249. package/dist-cjs/providers/openai.d.ts +15 -2
  250. package/dist-cjs/providers/openai.js +137 -44
  251. package/dist-cjs/providers/openrouter.d.ts +3 -2
  252. package/dist-cjs/providers/openrouter.js +4 -4
  253. package/dist-cjs/realtime/session.d.ts +5 -0
  254. package/dist-cjs/realtime/session.js +32 -0
  255. package/dist-cjs/realtime/types.d.ts +6 -0
  256. package/dist-cjs/router/auto-router.js +9 -10
  257. package/dist-cjs/router/failover.d.ts +6 -0
  258. package/dist-cjs/router/failover.js +14 -10
  259. package/dist-cjs/security/index.d.ts +1 -0
  260. package/dist-cjs/security/index.js +3 -6
  261. package/dist-cjs/security/schema-validator.d.ts +6 -230
  262. package/dist-cjs/security/schema-validator.js +143 -57
  263. package/dist-cjs/security/upload-scanner.d.ts +2 -2
  264. package/dist-cjs/security/upload-scanner.js +1 -1
  265. package/dist-cjs/server/tenancy.d.ts +3 -5
  266. package/dist-cjs/server/tenancy.js +8 -36
  267. package/dist-cjs/telephony/manager.d.ts +5 -2
  268. package/dist-cjs/telephony/manager.js +24 -49
  269. package/dist-cjs/testing/index.d.ts +8 -0
  270. package/dist-cjs/testing/index.js +12 -0
  271. package/dist-cjs/testing/provider-conformance.js +4 -4
  272. package/dist-cjs/types/batch.d.ts +7 -8
  273. package/dist-cjs/types/config.d.ts +34 -17
  274. package/dist-cjs/types/embeddings.d.ts +6 -12
  275. package/dist-cjs/types/graph.d.ts +47 -12
  276. package/dist-cjs/types/images.d.ts +6 -14
  277. package/dist-cjs/types/lifecycle.d.ts +163 -0
  278. package/dist-cjs/types/lifecycle.js +2 -0
  279. package/dist-cjs/types/messages.d.ts +41 -2
  280. package/dist-cjs/types/optimizer.d.ts +0 -6
  281. package/dist-cjs/types/providers.d.ts +15 -9
  282. package/dist-cjs/types/providers.js +326 -203
  283. package/dist-cjs/types/response.d.ts +12 -5
  284. package/dist-cjs/types/security.d.ts +0 -12
  285. package/dist-cjs/types/telephony.d.ts +7 -6
  286. package/dist-cjs/types/voice.d.ts +5 -4
  287. package/dist-cjs/utils/deprecation.d.ts +0 -2
  288. package/dist-cjs/utils/deprecation.js +0 -5
  289. package/dist-cjs/utils/periods.d.ts +7 -0
  290. package/dist-cjs/utils/periods.js +35 -0
  291. package/dist-cjs/utils/safe-fetch.d.ts +1 -0
  292. package/dist-cjs/utils/tokenizer.js +2 -0
  293. package/dist-cjs/voice/manager.js +6 -6
  294. package/llms.txt +61 -0
  295. package/package.json +162 -14
package/API_STABILITY.md CHANGED
@@ -1,12 +1,13 @@
1
1
  # API Stability Policy
2
2
 
3
- This policy describes compatibility guarantees for `nexus-ai-pro`. The 1.x compatibility guarantees
4
- apply beginning with version 1.0.0.
3
+ This policy describes compatibility guarantees for `nexus-ai-pro`. The 2.x guarantees apply beginning
4
+ with version 2.0.0, as the 1.x guarantees applied from 1.0.0. The sections for the 1.x stages below
5
+ still describe each surface; where they say "the 1.x rules", read the rules of the current major line.
5
6
 
6
7
  ## Release stages
7
8
 
8
- The package follows semantic versioning. Within the 1.x line, incompatible changes to stable public
9
- APIs require a major release. Minor releases may add backward-compatible features, and patch releases
9
+ The package follows semantic versioning. Within a major line, incompatible changes to stable public
10
+ APIs require the next major release. Minor releases may add backward-compatible features, and patch releases
10
11
  are intended to remain backward compatible.
11
12
 
12
13
  The following surfaces are public and covered by this policy:
@@ -40,6 +41,45 @@ Both are covered by this policy:
40
41
  Deep imports into `dist`, `dist-cjs`, or `src` are not supported. Import only from `nexus-ai-pro` or
41
42
  one of its explicit subpaths.
42
43
 
44
+ ## 2.0 stage (2.0.0)
45
+
46
+ 2.0 removes what 1.x deprecated and promotes the surfaces that have settled.
47
+
48
+ **Promoted to stable.** These follow the 2.x rules without an experimental label:
49
+
50
+ - graphs, with their advanced APIs: `Send`, `Command`, breakpoints, `updateState()`, `fork()`, node
51
+ caching, and functional workflows (`nexus-ai-pro/graph`, `/graph/functional`, `/graph/visualize`);
52
+ - the store (`nexus-ai-pro/store`, `/store/redis`), agents (`nexus-ai-pro/agent`), and tracing
53
+ (`nexus-ai-pro/tracing`);
54
+ - evaluation (`nexus-ai-pro/evaluate`) and prompts (`nexus-ai-pro/prompts` and `/postgres/prompts`);
55
+ - the agent server (`nexus-ai-pro/server`): its routes, `RunRecord`, `ThreadRecord`, `RunEvent`, and
56
+ recovery.
57
+
58
+ **New in 2.0, and stable from the start:**
59
+
60
+ - the operation lifecycle: the stage order, `LifecycleConfig`, `LifecycleHooks`, the
61
+ `OperationDescriptor`, `OperationOutcome`, and `OperationTicket` shapes, the `BudgetLedger`
62
+ contract, and `ProviderCallContext`. New families and stages may be added in a minor release;
63
+ existing ones keep their names;
64
+ - mixed content: `AssetContent`, `ToolOutput`, and `response.assets`;
65
+ - checkpoint schema version 2. Both checkpointers read version 1 throughout 2.x.
66
+
67
+ **Still experimental in production readiness**, each following the 2.x rules all the same:
68
+
69
+ - images, until recorded live conformance passes on all three backends;
70
+ - the studio package;
71
+ - deployments, tenant limits, and the server's worker queue (1.24);
72
+ - the context hub, insights, and the studio's accounts (1.23);
73
+ - the loaders, the vector stores added in 1.20 and 1.22, the retrievers, and the MCP registry;
74
+ - the SQLite adapters (1.21).
75
+
76
+ **Root import.** The root exports the core client, its config builders, its types, the errors it
77
+ throws, the lifecycle, and `tool()` and `toolOutput()`. Adding anything else to the root waits for a
78
+ major release, and a check in CI fails when the root grows.
79
+
80
+ **Dependencies.** The package has no required dependency. `zod`, `ajv`, `ajv-formats`, and
81
+ `@types/node` are optional peers; making any of them required again would need a major release.
82
+
43
83
  ## Capability negotiation stage
44
84
 
45
85
  `negotiateCompletionRequest()`, `NexusCapabilityError`, `CapabilityPolicy`, `CapabilityWarning`, and
@@ -457,6 +497,21 @@ with nexus-ai-pro and declares the core versions it works with as a peer depende
457
497
  - The access rules are a guarantee: loopback binding by default, a token on every request, the token
458
498
  in a header for every change, and loopback hosts only unless others are allowed.
459
499
 
500
+ ## 2.0 preparation stage (1.25.0)
501
+
502
+ The last 1.x minor deprecates what 2.0 removes. Deprecated APIs keep working, unchanged, for the rest
503
+ of the 1.x line.
504
+
505
+ - The 2.0 root import keeps the core client, its config builders, the types of its configuration,
506
+ requests, and responses, and the errors it throws. Every other root export is deprecated in favour of
507
+ the subpath that already provides it, under the same name or, where noted, another.
508
+ - Every deprecated option warns once per process through Node's `DeprecationWarning` channel, so
509
+ `--throw-deprecation` finds them in a test run. Deprecated exports and fields are marked in the type
510
+ declarations, where editors show them.
511
+ - `nexus migrate` and its map follow the root's deprecations; both are generated from the export map,
512
+ so they cannot disagree.
513
+ - A 1.x checkpoint stays readable throughout 2.x, by both checkpointers and by `migrateCheckpoint()`.
514
+
460
515
  ## Deployment stage (1.24.0)
461
516
 
462
517
  Deployments (`nexus-ai-pro/server/deployments`), tenant limits (`nexus-ai-pro/server/tenancy`), and the
package/CHANGELOG.md CHANGED
@@ -4,6 +4,168 @@ Notable changes to this project are recorded here. The format follows [Keep a Ch
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [2.0.0] - 2026-10-02
8
+
9
+ Consolidation. One lifecycle runs every call of every family, the root import holds the core client
10
+ and nothing else, and the package installs with no required dependency. Everything removed here was
11
+ deprecated in 1.x; [MIGRATING.md](./MIGRATING.md) covers each change with before-and-after code, and
12
+ `nexus migrate` rewrites the imports.
13
+
14
+ ### Breaking
15
+
16
+ - **The root import keeps only the core**: the client, its config builders, its types, the errors it
17
+ throws, the lifecycle, and the tool helpers. The 498 other names it re-exported are on their
18
+ subpaths; `nexus migrate` moves 1.x imports there. Importing the root costs 323 KB, down from 572 KB.
19
+ - **`zod`, `ajv`, `ajv-formats`, and `@types/node` are optional peer dependencies.** A zod shape is
20
+ checked through its own `safeParse`; a JSON Schema response format loads ajv on its first check, and
21
+ says what to install when it is missing. A production install is 5.3 MB, the package alone, down
22
+ from 12.3 MB.
23
+ - **A response's `estimatedCost` string is removed**, for the numeric `cost`. A plan's
24
+ `estimatedCost` object stays.
25
+ - **Modalities say which way they flow.** `ModelCapabilities.inputModalities` and `outputModalities`
26
+ are required on every entry, bundled or registered; `modalities`, the `Modality` type, and the
27
+ `modalities` routing requirement are removed.
28
+ - **Checkpoint schema version 2.** A checkpoint has its `version`, an `id`, its `tasks` always, and its
29
+ questions only in `interrupts`; `interrupt` is gone. Both checkpointers read version 1 for the whole
30
+ 2.x line, so threads 1.x left waiting resume. A checkpointer's `get()` and `history()` return a
31
+ `StoredGraphCheckpoint` of either version.
32
+ - **Options that were never read are removed**: `GoogleProviderConfig.projectId`,
33
+ `OllamaProviderConfig.timeout`, `MetricsConfig.prometheus`, `DensificationConfig.preserveMarkdown`,
34
+ `HealthConfig.latencyHalfLife`, `InjectionDetectionConfig.sensitivity`, and
35
+ `ToolPolicyConfig.requiresApproval`.
36
+ - **`ImageManagerConfig` is removed**, for `ImageConfig`.
37
+ - **`PipelineStepName` is a closed list.** A custom step is recorded as `customStep`, with its own name
38
+ in `PipelineTraceStep.custom`. The `auditLog` step is replaced by the lifecycle's `audit`.
39
+ - **`ai.stream()` opens on its first read**, so authorization, rate-limit, guardrail, and budget errors
40
+ come out of the loop rather than from the call.
41
+ - **What the lifecycle records changed**: metrics carry `family` and `operation` for every family, the
42
+ image family is labelled `image`, audit events carry `family` and `operation` and add an `error`
43
+ event, and `response.meta.requestId` is the operation's id.
44
+ - **The model registry is current as of 2026-10-02.** Models their providers shut down are removed:
45
+ Claude 3.x and 4.0 to 4.1, `gpt-4.5-preview`, `o1-mini`, `gpt-5-codex`, Gemini 1.5 and 2.0 and the
46
+ shut-down 3.x previews, Groq Compound, Llama 4 Scout, and Qwen3 32B, Mistral's 2024 models, Devstral,
47
+ and Magistral, and DeepSeek's `deepseek-chat`, `deepseek-reasoner`, V3, and R1. Four names no
48
+ provider served are gone too: `claude-sonnet-5-0`, `claude-haiku-5-0`, `claude-fable-5-0`, and
49
+ `gemini-3.5-pro`. Cohere's `command-r` and `command-r-plus` are filed under their dated names, and
50
+ `mistral-medium-3-5` under `mistral-medium-2604`. Every intent alias points at a current model.
51
+
52
+ ### Added
53
+
54
+ - **One lifecycle for every operation.** Completions, streams, embeddings, voice, telephony, images,
55
+ realtime sessions, graphs, agents, queued jobs, and provider batches pass through the same stages:
56
+ validate, authorize, input policy, resolve assets, route, reserve budget, execute, output policy,
57
+ persist, reconcile cost, and audit. `lifecycle` on the client configures what they share: an
58
+ `authorize` callback that can refuse any call, a `budget` every family draws on, and `hooks` that see
59
+ each call start and finish, cache hits included. `ai.lifecycle` makes graphs, agents, workflows,
60
+ realtime sessions, job queues, and batches operations of the client too.
61
+ - **A shared spend budget**: `budgetLedger()` on the new `nexus-ai-pro/lifecycle` holds each call's
62
+ estimate before it runs and charges what it cost after, per tenant and per period, so concurrent calls
63
+ cannot overshoot together. It keeps totals in memory or in any tenant usage store, Redis included.
64
+ - **`ProviderCallContext`**, handed to every provider call of every family: the request id, the abort
65
+ signal, the deadline, trace headers, and the idempotency key. The OpenAI and Anthropic adapters send
66
+ the key and the headers on. Requests take `requestId`, `tenantId`, and `idempotencyKey`.
67
+ - **Mixed text-and-asset content.** `toolOutput()` lets a tool return text, images, and asset
68
+ references, sent as the tool message itself instead of base64 JSON. An `asset` content part names an
69
+ asset by reference, an image part can carry an asset, and a model that produces images returns them
70
+ on `response.assets`.
71
+ - **Typed pipelines**: `PipelineContext` and the runner are generic over the request and response, with
72
+ `PipelineShapes` for another family's types.
73
+ - **New models**: OpenAI GPT-6 Astra, GPT-6.1 Sol, GPT-6 Sol, GPT-6 Luna, GPT-5 Pro, o3-pro, and
74
+ GPT-5.3 Codex; Claude Fable 5.1, Opus 5.5, Sonnet 5.5, Fable 5, Opus 5, Sonnet 5, and Sonnet 4.5;
75
+ Gemini 3.8, 3.7, and 3.6 Flash, 3.5 Flash-Lite, 3.1 Flash-Lite, 3 Pro Image, and 3.1 Flash Image;
76
+ Groq's Qwen3.8 27B and MiniMax M2.7; Mistral Medium 3.5 and Ministral 3 14B, 8B, and 3B; DeepSeek
77
+ Flash and V4 Pro; and Cohere Command A Plus, North Mini Code, North Small Translate, and three Tiny
78
+ Aya models.
79
+ - `ModelCapabilities.sampling`, false for a model that accepts only its default temperature and top-p.
80
+ Negotiation drops a non-default value for it.
81
+ - `nexus migrate` lists each model name the 2.0 registry dropped, with what to use instead.
82
+ - Anthropic responses report thinking tokens in `usage.reasoningTokens`.
83
+ - **`llms.txt` and `llms-full.txt`** for AI assistants and coding agents: an index of every guide with
84
+ the facts an assistant needs to recommend the package correctly, and the guides in one file.
85
+ `llms.txt` ships in the package. Both are generated from the README and the guides, and CI fails
86
+ when they fall behind.
87
+ - `toCheckpoint()` and `CheckpointDraft` for building a version 2 checkpoint by hand.
88
+ - A `cache_hits` metric, and `routingDecision.provider` and `.model` on a response.
89
+
90
+ ### Changed
91
+
92
+ - Provider adapters, and the agent, verification, evaluation, workflow, semantic-cache, image, and
93
+ embedding engines, load on first use, so importing the client never loads them.
94
+ - A context-window summary is an operation of its own, authorized, budgeted, and audited.
95
+ - `getCall()`, `listPhoneNumbers()`, and `updatePhoneNumber()` run through the lifecycle, so they are
96
+ rate-limited and audited like `createCall()`.
97
+ - `nexus migrate` lists the options and model entries 2.0 removed, and keeps a single moved name on
98
+ one line.
99
+ - **Prices and limits follow the providers.** GPT-5.6, GPT-5.2 Pro, Mistral Large 3, and Mistral
100
+ Small 4 cost less. Gemini 3.5 Flash costs $1.50 and $9 per million tokens, not $0.10 and $0.40.
101
+ Claude Opus 4.5 has a 200K context and 64K output, not 1M and 128K, and Codestral a 128K context.
102
+ Models with an announced shutdown are `deprecated`, with the date and the replacement in their
103
+ notes, and an alias that resolves to one is deprecated too.
104
+ - `toolChoice: false` now means a call cannot be forced: negotiation drops `required` or a named tool
105
+ and lets `auto` and `none` through.
106
+
107
+ ### Fixed
108
+
109
+ - **Claude 4.6 onward get adaptive thinking.** The Anthropic adapter sent every model a thinking
110
+ budget, which Claude rejects after 4.6, so a request with `reasoning` failed on current models. It
111
+ now sends adaptive thinking and `output_config.effort` from 4.6 on, and turns thinking off the way
112
+ each model allows. It drops sampling values that Claude 4.7 and later reject, and leaves room for
113
+ thinking when no output limit is set.
114
+ - **Tool calls reach providers whole.** The OpenAI chat and Responses, Anthropic, and Google adapters
115
+ dropped a conversation's tool calls and the ids that link results to them, so a real tool loop could
116
+ fail on its second turn. Each now sends both the way its API expects, images in results included.
117
+ - **Responses are priced on the model they were routed to.** A provider that echoed a dated snapshot
118
+ name priced the call at nothing; Groq, Mistral, and Cohere models filed under a prefix did too.
119
+ - `resolveModel('google/gemini-2.5-flash')` found no capabilities for a provider-prefixed name. It now
120
+ finds the entry filed without the prefix, when that entry belongs to the same provider.
121
+ - Streams honour the circuit breaker, the cost budget, audit, and metrics, as completions always did.
122
+ - A cache hit is audited and counted.
123
+ - The upload scanner's types no longer need Node's: `content` takes text or any `Uint8Array`.
124
+
125
+ ## [1.25.0] - 2026-10-01
126
+
127
+ The bridge to 2.0. Everything 2.0 removes is deprecated now, every capability has a subpath of its
128
+ own, and the tools to migrate ship with it, so a codebase can move while it is still on 1.x.
129
+
130
+ ### Added
131
+
132
+ - **A subpath for every capability.** What could only be imported from the root has an entry point
133
+ of its own, each with no third-party dependency: `nexus-ai-pro/grounding` (grounded prompts,
134
+ verification, self-consistency, knowledge graphs), `/connectors` (web tools), `/ops` (metrics,
135
+ health, audit, OpenTelemetry export, rate limiting), `/pipeline`, `/router`, `/testing`
136
+ (conformance suites), `/next` (the route handler), `/rag/files` (scanned file ingestion), and
137
+ `/optimizer/cost` (cost estimates and budgets). Grounding alone is 15 KB, where it used to mean the
138
+ 584 KB root and its validators. `hardenPrompt()` joins `/security`, `Tokenizer` joins `/optimizer`, the
139
+ registry's data joins `/models`, and the capability types join `/capabilities`.
140
+ - **`nexus migrate`**, a codemod that moves imports to the subpaths the 2.0 root keeps them on. It
141
+ rewrites `import`, `import type`, `export … from`, and destructured `require()` in TypeScript,
142
+ JavaScript, and Markdown code blocks, keeps local names when a name moved under another, and lists
143
+ what it cannot rewrite safely. `--check` fails a CI job while anything is left.
144
+ - **`MIGRATING.md`**, shipped in the package: every change 2.0 makes, with before-and-after code.
145
+ - **Modalities with a direction**: `inputModalities` and `outputModalities` on a model's capabilities,
146
+ `modalitiesOf()` on `nexus-ai-pro/models` to read either shape, and both as routing requirements.
147
+ - **The 2.0 checkpoint schema, readable now**: `migrateCheckpoint()` and `GraphCheckpointV2` on
148
+ `nexus-ai-pro/graph`.
149
+
150
+ ### Deprecated
151
+
152
+ - 499 exports of the root import, each in favour of the subpath that already provides it. 2.0 keeps
153
+ only the core client, its config builders, its types, and the errors it throws on the root. Editors
154
+ strike a deprecated import through and name the subpath; `nexus migrate` moves them.
155
+ - `ModelCapabilities.modalities` and `routing.requiredCapabilities.modalities`, for the directional
156
+ fields. The routing requirement warns once per process.
157
+ - `GraphCheckpoint.interrupt`, for `interrupts`.
158
+
159
+ ### Changed
160
+
161
+ - The guides' examples import from subpaths, as 2.0 requires.
162
+
163
+ ### Fixed
164
+
165
+ - The agents guide pointed at `nexus-ai-pro/connectors`, which did not exist. It does now.
166
+ - `tenantLimits({ now })` drives the default usage and rate stores too. They kept the system clock, so
167
+ a budget judged on a replaced clock reset when the real day ended.
168
+
7
169
  ## [1.24.0] - 2026-09-30
8
170
 
9
171
  Deployment at scale, self-managed. Running assistants as a service without a hosted platform:
@@ -1211,7 +1373,9 @@ shared policy vocabulary is in place for a future release that revisits this.
1211
1373
  - URL fetching rejects unsafe private-network targets and limits response reads.
1212
1374
  - CLI and audit findings no longer disclose detected secret values.
1213
1375
 
1214
- [Unreleased]: https://github.com/mkhitar-abrahamyan/nexus-ai/compare/v1.24.0...HEAD
1376
+ [Unreleased]: https://github.com/mkhitar-abrahamyan/nexus-ai/compare/v2.0.0...HEAD
1377
+ [2.0.0]: https://github.com/mkhitar-abrahamyan/nexus-ai/compare/v1.25.0...v2.0.0
1378
+ [1.25.0]: https://github.com/mkhitar-abrahamyan/nexus-ai/compare/v1.24.0...v1.25.0
1215
1379
  [1.24.0]: https://github.com/mkhitar-abrahamyan/nexus-ai/compare/v1.23.0...v1.24.0
1216
1380
  [1.23.0]: https://github.com/mkhitar-abrahamyan/nexus-ai/compare/v1.22.0...v1.23.0
1217
1381
  [1.22.0]: https://github.com/mkhitar-abrahamyan/nexus-ai/compare/v1.21.0...v1.22.0
package/MIGRATING.md ADDED
@@ -0,0 +1,303 @@
1
+ # Migrating to 2.0
2
+
3
+ 2.0.0 removes what the 1.x line deprecated, and runs every call of every family through one
4
+ lifecycle. Most applications change only their imports, and a codemod does that.
5
+
6
+ Start with the codemod. It rewrites what it can safely, and lists the rest:
7
+
8
+ ```bash
9
+ npx nexus migrate src # reports what would change
10
+ npx nexus migrate src --write # rewrites the files
11
+ npx nexus migrate src --check # exits 1 while anything is left, for CI
12
+ ```
13
+
14
+ Run it while you are still on 1.25, where every name it moves already works on its subpath. Then
15
+ upgrade, and work through the table.
16
+
17
+ | Change | The codemod | By hand |
18
+ | --- | --- | --- |
19
+ | [The root import keeps only the core](#the-root-import-keeps-only-the-core) | Rewrites the imports | Namespace and dynamic imports of the root |
20
+ | [Validators and Node types are optional](#validators-and-node-types-are-optional) | — | Install what you use |
21
+ | [`estimatedCost` is removed](#a-responses-estimatedcost-is-removed) | Lists each read | Read `cost.amount` |
22
+ | [Modalities say which way they flow](#modalities-say-which-way-they-flow) | Lists entries that name `vision` or `pdf` | Write the two fields |
23
+ | [Checkpoints are version 2](#checkpoints-are-version-2) | — | Read `interrupts`; build checkpoints with `toCheckpoint()` |
24
+ | [Options that were never read are removed](#options-that-were-never-read-are-removed) | Lists each one | Delete them |
25
+ | [`ImageManagerConfig` is removed](#imagemanagerconfig-is-removed) | Renames it | — |
26
+ | [Pipeline step names are a closed list](#pipeline-step-names-are-a-closed-list) | — | Read a custom step's name from `custom` |
27
+ | [Streams open on their first read](#streams-open-on-their-first-read) | — | Catch errors around the loop |
28
+ | [Every call runs through the lifecycle](#every-call-runs-through-the-lifecycle) | — | Check dashboards, audit sinks, and rate limits |
29
+ | [Responses are priced on the routed model](#responses-are-priced-on-the-routed-model) | — | Expect costs that were 0 to be priced |
30
+ | [The model registry is current](#the-model-registry-is-current) | Lists each dropped model name, with its replacement | Choose the replacement; check what your aliases resolve to |
31
+ | [Claude 4.6 onward think adaptively](#claude-46-onward-think-adaptively) | — | Nothing |
32
+ | [Tool calls reach providers whole](#tool-calls-reach-providers-whole) | — | Nothing |
33
+
34
+ ## The root import keeps only the core
35
+
36
+ In 2.0, `nexus-ai-pro` exports the core client and nothing else:
37
+
38
+ - `NexusAI`, `createNexus`, and the config builders;
39
+ - `tool()`, `toolOutput()`, the streaming helpers, and the usage and pricing helpers;
40
+ - the lifecycle: `OperationLifecycle`, its errors, and its types;
41
+ - the types of the client's configuration, requests, and responses;
42
+ - the errors the client throws: `NexusProviderError`, `NexusSecurityError`, `NexusRateLimitError`,
43
+ `NexusCapabilityError`, `TokenBudgetError`, `CostBudgetError`, and `ResponseFormatError`.
44
+
45
+ Every other export is on its own subpath.
46
+
47
+ ```ts
48
+ // Before
49
+ import { NexusAI, MemoryVectorStore, withRagContext, OperationRunner } from 'nexus-ai-pro';
50
+
51
+ // After
52
+ import { NexusAI } from 'nexus-ai-pro';
53
+ import { OperationRunner } from 'nexus-ai-pro/operations';
54
+ import { withRagContext } from 'nexus-ai-pro/grounding';
55
+ import { MemoryVectorStore } from 'nexus-ai-pro/rag';
56
+ ```
57
+
58
+ The codemod does this for `import`, `import type`, `export … from`, and destructured `require()`. A
59
+ name that moved under another name keeps its local name through an alias:
60
+
61
+ ```ts
62
+ // Before
63
+ import type { AgentModelClient } from 'nexus-ai-pro';
64
+ // After
65
+ import type { AgentLoopModelClient as AgentModelClient } from 'nexus-ai-pro/agent';
66
+ ```
67
+
68
+ It cannot split a namespace import (`import * as nexus from 'nexus-ai-pro'`) or a dynamic `import()`,
69
+ so it lists them. Import each name you use from its subpath instead. Every subpath, and what it costs,
70
+ is in the [packaging guide](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/packaging.md).
71
+
72
+ The root import now costs about 323 KB, down from 572 KB.
73
+
74
+ ## Validators and Node types are optional
75
+
76
+ `zod`, `ajv`, `ajv-formats`, and `@types/node` are optional peer dependencies. A production install
77
+ is the package alone, about 5.3 MB instead of 12.3 MB.
78
+
79
+ | You | Install |
80
+ | --- | --- |
81
+ | Compile TypeScript for Node | `npm install --save-dev @types/node` |
82
+ | Write schemas with zod | Nothing more: the package uses the zod your schema came from |
83
+ | Check output against a JSON Schema object | `npm install ajv ajv-formats` |
84
+
85
+ A JSON Schema response format without ajv fails with a `ResponseFormatError` that says what to
86
+ install. A zod shape is checked through each field's own `safeParse`.
87
+
88
+ The request check in the guardrails, `SchemaValidator`, no longer uses zod. It reports the same
89
+ fields by the same paths; the wording of its findings changed.
90
+
91
+ ## A response's `estimatedCost` is removed
92
+
93
+ The formatted string on a response's metadata is gone. Read the numeric cost, and format it yourself:
94
+
95
+ ```ts
96
+ // Before
97
+ console.log(response.meta.estimatedCost); // '$0.0012'
98
+
99
+ // After
100
+ const cost = response.meta.cost;
101
+ if (cost) console.log(new Intl.NumberFormat('en-US', { style: 'currency', currency: cost.currency }).format(cost.amount));
102
+ ```
103
+
104
+ A plan's `estimatedCost`, from `ai.plan()`, is an object and stays. A custom provider that set the
105
+ string should drop it; `buildMeta()` fills `usage` and `cost`.
106
+
107
+ ## Modalities say which way they flow
108
+
109
+ A model's `modalities` list mixed inputs and outputs: `vision` meant an image in, and `image` meant an
110
+ image out. 2.0 removes it, and the `Modality` type with it. Every entry declares `inputModalities` and
111
+ `outputModalities`, and both are required.
112
+
113
+ ```ts
114
+ // Before
115
+ models: { registry: { 'my-model': { modalities: ['text', 'vision'], /* … */ } } }
116
+
117
+ // After
118
+ models: { registry: { 'my-model': { inputModalities: ['text', 'image'], outputModalities: ['text'], /* … */ } } }
119
+ ```
120
+
121
+ | 1.x value | 2.0 |
122
+ | --- | --- |
123
+ | `text` | `text` in both lists |
124
+ | `vision` | `image` in `inputModalities` |
125
+ | `image` | `image` in `outputModalities` |
126
+ | `audio`, `video`, `pdf` | the same name in `inputModalities` |
127
+
128
+ In routing requirements, replace `modalities` with `inputModalities` or `outputModalities`.
129
+ `modalitiesOf()` still reads both lists, and now requires both.
130
+
131
+ ## Checkpoints are version 2
132
+
133
+ A checkpoint 2.x writes has a `version` of 2, an `id`, its `tasks` always spelled out, and every
134
+ pending question in `interrupts`. The single `interrupt` field is gone.
135
+
136
+ ```ts
137
+ // Before
138
+ const question = checkpoint.interrupt;
139
+
140
+ // After
141
+ const [question] = checkpoint.interrupts;
142
+ ```
143
+
144
+ Threads stored by 1.x keep working. Both bundled checkpointers read version 1 for the whole 2.x line,
145
+ so a thread left waiting resumes after the upgrade.
146
+
147
+ | You | What to do |
148
+ | --- | --- |
149
+ | Read checkpoints through a graph | Nothing: `state()` and `history()` return version 2 |
150
+ | Wrote your own `GraphCheckpointer` | Its `get()` and `history()` may return either version, typed `StoredGraphCheckpoint`; the graph reads both |
151
+ | Read a store directly | Pass what you read to `migrateCheckpoint()` |
152
+ | Build a checkpoint by hand | Use `toCheckpoint()`, which fills in the version, id, tasks, and questions |
153
+ | Named `GraphCheckpointV2` | It still compiles; it is now another name for `GraphCheckpoint` |
154
+
155
+ ## Options that were never read are removed
156
+
157
+ These were accepted and ignored, and warned once per process since they were deprecated. The codemod
158
+ lists each one it finds.
159
+
160
+ | Option | Deprecated in |
161
+ | --- | --- |
162
+ | `GoogleProviderConfig.projectId` | 1.16.0 |
163
+ | `OllamaProviderConfig.timeout` | 1.16.0 |
164
+ | `MetricsConfig.prometheus` | 1.16.0 |
165
+ | `DensificationConfig.preserveMarkdown` | 1.16.0 |
166
+ | `HealthConfig.latencyHalfLife` | 1.16.0 |
167
+ | `InjectionDetectionConfig.sensitivity` | 1.19.0 |
168
+ | `ToolPolicyConfig.requiresApproval` | 1.19.0 |
169
+
170
+ Delete them. Nothing changes, because nothing read them. Approval before a tool runs is
171
+ `interruptOn` on `createAgent()`.
172
+
173
+ ## `ImageManagerConfig` is removed
174
+
175
+ It was another name for `ImageConfig`. The codemod renames the import and keeps your local name.
176
+
177
+ ## Pipeline step names are a closed list
178
+
179
+ `PipelineStepName` lists the built-in stages only, so a `switch` over it can be exhaustive. A step you
180
+ add with `use()` is recorded as `customStep`, with its own name in `custom`.
181
+
182
+ ```ts
183
+ // Before
184
+ const mine = response.meta.pipeline?.steps.find((step) => step.name === 'enrich');
185
+
186
+ // After
187
+ const mine = response.meta.pipeline?.steps.find((step) => step.custom === 'enrich');
188
+ ```
189
+
190
+ The trace's `auditLog` step is gone: auditing is the lifecycle's `audit` stage. `authorize` and
191
+ `audit` appear when a lifecycle has work to do, and `reconcileCost` appears on every response.
192
+ Metrics for a custom step keep its own name as their `step` label.
193
+
194
+ `PipelineContext`, `PipelineMiddleware`, `PipelineStep`, `PipelineHooksConfig`, `PipelineConfig`, and
195
+ `PipelineRunner` are generic over the request and the response. Both default to a completion's, so
196
+ existing code compiles unchanged.
197
+
198
+ ## Streams open on their first read
199
+
200
+ `ai.stream()` returns at once. Authorization, the rate limit, guardrails, routing, and the budget run
201
+ when the stream is first read, so their errors come out of the loop:
202
+
203
+ ```ts
204
+ // Before: a blocked request threw here
205
+ const stream = ai.stream(request);
206
+
207
+ // After: it throws from the loop
208
+ try {
209
+ for await (const chunk of ai.stream(request)) render(chunk);
210
+ } catch (error) {
211
+ // NexusSecurityError, NexusRateLimitError, OperationDeniedError, BudgetExceededError, …
212
+ }
213
+ ```
214
+
215
+ Streams now get what completions always had. They are audited and counted, the cost budget and the
216
+ circuit breaker apply, and the `done` chunk carries the request id and a cost priced on the routed
217
+ model.
218
+
219
+ ## Every call runs through the lifecycle
220
+
221
+ Completions, streams, embeddings, voice, telephony, images, realtime sessions, graphs, agents, jobs,
222
+ and batches share one [lifecycle](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/lifecycle.md).
223
+ Nothing has to change in your code, but what the lifecycle records looks different:
224
+
225
+ | What | 1.x | 2.0 |
226
+ | --- | --- | --- |
227
+ | Metric labels | `model`, or `provider` and `model`, per family | `family`, `operation`, `provider`, and `model` for every family |
228
+ | The image family's label | `family=images` | `family=image` |
229
+ | Audit event family | in `metadata.family` | `family` and `operation` on the event |
230
+ | A call that fails after it starts | No event after `request` | An `error` event |
231
+ | A blocked request | `blocked`, with `metadata.findings` | `blocked`, with `metadata.error` and `metadata.findings` |
232
+ | `response.meta.requestId` | An id the adapter made up | The operation's id, the same on its audit events |
233
+ | A cache hit | Not audited or counted | Audited, counted, and seen by `onFinish` |
234
+ | A context-window summary | An unrecorded model call | Its own `summarize` operation |
235
+ | `getCall()`, `listPhoneNumbers()`, `updatePhoneNumber()` | Called directly | Rate-limited and audited like `createCall()` |
236
+
237
+ So check three things:
238
+
239
+ - dashboards and alerts that match an exact label set;
240
+ - audit sinks that read `metadata.family`, or that expect no event after a failed `request`;
241
+ - rate limits, which now also count streams and the telephony reads above.
242
+
243
+ To use the lifecycle, set `lifecycle` on the client: an `authorize` callback, a shared `budget`, and
244
+ `hooks`. Pass `ai.lifecycle` to graphs, agents, workflows, realtime sessions, queues, and batches to
245
+ make their runs operations of the client too.
246
+
247
+ ## Responses are priced on the routed model
248
+
249
+ The client now prices each response on the model the request was routed to, as the registry names
250
+ it. Providers often answer with a dated snapshot name the registry does not file. In 1.x, pricing on
251
+ that echo cost the call nothing, so OpenAI responses could show a cost of 0, and so could Groq, Mistral,
252
+ DeepSeek, and Cohere models filed under a prefix. Expect those costs to be priced in 2.0, and budgets
253
+ to count them. A charge the provider reports, with `basis: 'reported'`, is kept as it is.
254
+
255
+ ## The model registry is current
256
+
257
+ The bundled registry was checked against each provider's documentation on 2026-10-02.
258
+
259
+ - **Shut-down models are gone.** So are four names 1.x invented that no provider served:
260
+ `claude-sonnet-5-0`, `claude-haiku-5-0`, `claude-fable-5-0`, and `gemini-3.5-pro`. The codemod lists
261
+ each one it finds, with what to use instead.
262
+ - **Models with an announced shutdown stay,** marked `deprecated`. Their notes give the date and the
263
+ replacement, and an alias that resolves to one is deprecated too.
264
+ - **Intent aliases point at current models.** For example, `anthropic/best` is `claude-fable-5-1`,
265
+ `openai/fast` is `gpt-6-luna`, and `deepseek/best` is `deepseek/deepseek-v4-pro`. Pin the resolved
266
+ model when a run must be reproducible.
267
+ - **Prices moved both ways.** GPT-5.6 and Mistral Large 3 cost less. Gemini 3.5 Flash costs more than
268
+ 1.x said, and the Gemini 3.6 to 3.8 Flash prices double on 2027-01-01.
269
+
270
+ `describeModel()` shows what a name resolves to and when its entry was verified.
271
+
272
+ ## Claude 4.6 onward think adaptively
273
+
274
+ From the 4.6 generation on, Claude takes adaptive thinking and an effort level, not a thinking budget.
275
+ After 4.6 a budget is rejected, so 1.x requests with `reasoning` failed on those models. 2.0 sends what
276
+ each model accepts, and the [core guide](docs/core.md#reasoning) has the details. Nothing changes in
277
+ your code. From 4.7 on, Claude also rejects a non-default `temperature` or `topP`, so the client
278
+ drops one and records a capability warning.
279
+
280
+ ## Tool calls reach providers whole
281
+
282
+ In 1.x the OpenAI, Anthropic, and Google adapters dropped a conversation's tool calls and the ids that
283
+ link results to them. A real tool loop could fail on its second turn. 2.0 sends both the way each API
284
+ expects. Nothing changes in your code.
285
+
286
+ Two things are new beside it. A tool can return `toolOutput()`, whose text, images, and asset
287
+ references go back as the tool message itself. And a model that produces images returns them on
288
+ `response.assets`.
289
+
290
+ ## For provider authors
291
+
292
+ The provider contracts only grew:
293
+
294
+ - `BaseProvider.complete()` and `stream()` take a second, optional `ProviderCallContext`;
295
+ - voice and telephony provider methods take it too;
296
+ - `ImageProviderCallContext`, `EmbeddingProviderCallContext`, and `BatchProviderCallContext` extend it;
297
+ - `FamilyTelemetry.run()` hands its function the context, and takes an optional settle function.
298
+
299
+ A provider written for 1.x compiles unchanged.
300
+
301
+ ## Runtime
302
+
303
+ 2.0 runs on Node 22 and newer.
package/README.md CHANGED
@@ -5,14 +5,16 @@ workflows that run branches in parallel and survive a restart, retrieval over an
5
5
  durable background operations, guardrails, cost control, images, voice, and evals — with a studio a
6
6
  team can share.
7
7
 
8
- Import the whole runtime, or one piece: every capability has its own entry point with a size budget
9
- CI enforces, and [the packaging guide](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/packaging.md) publishes what each one costs. A graph-only application loads 49 KB
10
- and installs no third-party package at all.
8
+ Import only what you use. The root import is the client and nothing else, and every other capability
9
+ has its own entry point with a size budget CI enforces; [the packaging guide](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/packaging.md)
10
+ publishes what each one costs. The package has no required dependencies: a graph-only application
11
+ loads 51 KB, and installs nothing but this package.
11
12
 
12
13
  - NPM: https://www.npmjs.com/package/nexus-ai-pro
13
14
  - GitHub: https://github.com/mkhitar-abrahamyan/nexus-ai
14
15
  - Contributing, testing, and release procedure: [CONTRIBUTING.md](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/CONTRIBUTING.md)
15
16
  - Delivered work and what is planned next: [ROADMAP.md](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/ROADMAP.md)
17
+ - For AI assistants: [llms.txt](https://raw.githubusercontent.com/mkhitar-abrahamyan/nexus-ai/main/llms.txt) indexes every guide, and [llms-full.txt](https://raw.githubusercontent.com/mkhitar-abrahamyan/nexus-ai/main/llms-full.txt) holds them all in one file
16
18
 
17
19
  ## Install
18
20
 
@@ -32,6 +34,14 @@ Install only the provider SDKs your app uses. The OpenAI SDK also powers OpenAI-
32
34
  npm install openai @anthropic-ai/sdk ollama
33
35
  ```
34
36
 
37
+ Everything else is optional too. Add what your code needs:
38
+
39
+ | Package | When |
40
+ | --- | --- |
41
+ | `@types/node` | A TypeScript project on Node. The client, graphs, and the lifecycle compile without it. |
42
+ | `zod` | You write schemas with zod. The package uses the zod your schema came from. |
43
+ | `ajv`, `ajv-formats` | A response format checks output against a JSON Schema object. |
44
+
35
45
  The Google Gemini provider uses Node.js `fetch`, so it does not need an extra SDK.
36
46
  Realtime transports use injected or platform WebRTC, WebSocket, and `fetch` interfaces and do not
37
47
  require the OpenAI SDK.
@@ -105,6 +115,9 @@ You can still pass a plain `NexusAIConfig` to `new NexusAI(...)` when you want f
105
115
  - reach the providers' half-price asynchronous batch tier behind one operation handle
106
116
  - persist generated media to disk or S3 with tenant isolation, retention, and checksums
107
117
  - build persistent realtime voice agents with interruption, live tools, and normalized conversation state
118
+ - authorize, budget, audit, and observe every call of every family in one place, with hooks that see
119
+ each one finish
120
+ - pass images a tool made back to the model by reference, never as base64 text
108
121
  - keep TypeScript types around every request and response
109
122
 
110
123
  ## Guides
@@ -115,6 +128,7 @@ from the doc comments. The guides live in the repository, so these links go to G
115
128
  | Guide | Covers |
116
129
  | --- | --- |
117
130
  | [The client](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/core.md) | Requests, context windows, token optimization, cost checks, reasoning, prompt caching, streaming |
131
+ | [The lifecycle](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/lifecycle.md) | Authorization, a shared budget, hooks, audit, and metrics for every call of every family |
118
132
  | [Providers and routing](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/providers.md) | The twelve completion providers, routing and failover, the model registry |
119
133
  | [Guardrails](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/security.md) | Injection, PII, secrets, schema validation, output redaction |
120
134
  | [Graphs](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/docs/graphs.md) | Parallel branches, interrupts, checkpoints, time travel, subgraphs, caching, diagrams |
@@ -224,10 +238,17 @@ Shipped so far:
224
238
  - a shared studio with accounts, roles, an audit log, and comments; a context hub; insights with
225
239
  evaluated fix proposals; and evaluation caching;
226
240
  - self-managed deployment at scale: revisions and canaries with automatic rollback, a worker queue
227
- that autoscales on Kubernetes, and per-tenant limits.
228
-
229
- Next: 2.0.0 consolidates. The image family leaves experimental once recorded live
230
- conformance passes on all three backends.
241
+ that autoscales on Kubernetes, and per-tenant limits;
242
+ - the bridge to 2.0: every capability on a subpath of its own, everything 2.0 removes deprecated, and
243
+ a codemod that moves your imports;
244
+ - 2.0 consolidation: one lifecycle for every call of every family, a shared spend budget, a root
245
+ import that holds only the client, no required dependencies, and a model registry checked against
246
+ every provider.
247
+
248
+ Upgrading from 1.x: `npx nexus migrate src --write` moves your imports, and
249
+ [MIGRATING.md](https://github.com/mkhitar-abrahamyan/nexus-ai/blob/main/MIGRATING.md) covers the rest.
250
+ Next, the image family leaves experimental once recorded live conformance passes on all three
251
+ backends.
231
252
 
232
253
  ## Before Production
233
254
 
@@ -1,3 +1,4 @@
1
+ import type { OperationLifecycleLike } from '../types/lifecycle.js';
1
2
  import { type CompiledGraph } from '../graph/graph.js';
2
3
  import type { GraphCheckpointer, NodeContext } from '../types/graph.js';
3
4
  import type { CompletionRequest, Message, ToolDefinition } from '../types/messages.js';
@@ -102,6 +103,11 @@ export interface CreateAgentOptions {
102
103
  responseFormat?: CompletionRequest['responseFormat'];
103
104
  /** Application data sent with every model request. */
104
105
  metadata?: Record<string, unknown>;
106
+ /**
107
+ * Runs every invocation as one operation of a client's lifecycle, labelled `agent`: pass
108
+ * `ai.lifecycle`. Its model calls are operations of their own.
109
+ */
110
+ lifecycle?: OperationLifecycleLike;
105
111
  }
106
112
  declare const agentChannels: () => {
107
113
  messages: import("../types/graph.js").Channel<Message[]>;