@plurnk/plurnk-providers 1.6.0 → 1.7.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 (91) hide show
  1. package/.env.defaults +9 -16
  2. package/README.md +17 -0
  3. package/SPEC.md +128 -45
  4. package/dist/AiSdkProvider.d.ts +16 -9
  5. package/dist/AiSdkProvider.d.ts.map +1 -1
  6. package/dist/AiSdkProvider.js +151 -54
  7. package/dist/AiSdkProvider.js.map +1 -1
  8. package/dist/Mock.d.ts +8 -4
  9. package/dist/Mock.d.ts.map +1 -1
  10. package/dist/Mock.js +53 -18
  11. package/dist/Mock.js.map +1 -1
  12. package/dist/Pool.d.ts +8 -4
  13. package/dist/Pool.d.ts.map +1 -1
  14. package/dist/Pool.js +68 -12
  15. package/dist/Pool.js.map +1 -1
  16. package/dist/accounting.d.ts.map +1 -1
  17. package/dist/accounting.js.map +1 -1
  18. package/dist/accountingPublic.d.ts +5 -0
  19. package/dist/accountingPublic.d.ts.map +1 -0
  20. package/dist/accountingPublic.js +3 -0
  21. package/dist/accountingPublic.js.map +1 -0
  22. package/dist/capacity.d.ts +26 -0
  23. package/dist/capacity.d.ts.map +1 -0
  24. package/dist/capacity.js +90 -0
  25. package/dist/capacity.js.map +1 -0
  26. package/dist/catalogProvider.d.ts +2 -1
  27. package/dist/catalogProvider.d.ts.map +1 -1
  28. package/dist/catalogProvider.js +18 -20
  29. package/dist/catalogProvider.js.map +1 -1
  30. package/dist/compatibleProvider.d.ts.map +1 -1
  31. package/dist/compatibleProvider.js +10 -7
  32. package/dist/compatibleProvider.js.map +1 -1
  33. package/dist/env.d.ts +8 -10
  34. package/dist/env.d.ts.map +1 -1
  35. package/dist/env.js +54 -37
  36. package/dist/env.js.map +1 -1
  37. package/dist/errors.d.ts +6 -22
  38. package/dist/errors.d.ts.map +1 -1
  39. package/dist/errors.js +30 -91
  40. package/dist/errors.js.map +1 -1
  41. package/dist/index.d.ts +4 -3
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +2 -1
  44. package/dist/index.js.map +1 -1
  45. package/dist/promptTokens.d.ts.map +1 -1
  46. package/dist/promptTokens.js +7 -4
  47. package/dist/promptTokens.js.map +1 -1
  48. package/dist/providerError.d.ts +25 -0
  49. package/dist/providerError.d.ts.map +1 -0
  50. package/dist/providerError.js +91 -0
  51. package/dist/providerError.js.map +1 -0
  52. package/dist/sdkModels.d.ts +1 -0
  53. package/dist/sdkModels.d.ts.map +1 -1
  54. package/dist/sdkModels.js +5 -8
  55. package/dist/sdkModels.js.map +1 -1
  56. package/dist/types.d.ts +24 -4
  57. package/dist/types.d.ts.map +1 -1
  58. package/dist/usage.d.ts +1 -0
  59. package/dist/usage.d.ts.map +1 -1
  60. package/dist/usage.js +7 -2
  61. package/dist/usage.js.map +1 -1
  62. package/package.json +22 -7
  63. package/src/AiSdkProvider.test.ts +198 -37
  64. package/src/AiSdkProvider.ts +192 -59
  65. package/src/Mock.test.ts +32 -18
  66. package/src/Mock.ts +58 -19
  67. package/src/Pool.test.ts +71 -13
  68. package/src/Pool.ts +78 -13
  69. package/src/ProviderRegistry.test.ts +1 -1
  70. package/src/accounting.ts +0 -1
  71. package/src/accountingPublic.ts +9 -0
  72. package/src/boundaries.test.ts +28 -15
  73. package/src/capacity.test.ts +92 -0
  74. package/src/capacity.ts +140 -0
  75. package/src/catalogProvider.test.ts +82 -9
  76. package/src/catalogProvider.ts +24 -21
  77. package/src/compatibleProvider.test.ts +1 -2
  78. package/src/compatibleProvider.ts +10 -7
  79. package/src/cost.test.ts +31 -0
  80. package/src/env.test.ts +49 -20
  81. package/src/env.ts +114 -51
  82. package/src/errors.test.ts +33 -0
  83. package/src/errors.ts +38 -134
  84. package/src/index.ts +5 -2
  85. package/src/ollama.test.ts +1 -2
  86. package/src/promptTokens.ts +8 -5
  87. package/src/providerError.ts +139 -0
  88. package/src/sdkModels.test.ts +2 -5
  89. package/src/sdkModels.ts +6 -8
  90. package/src/types.ts +41 -19
  91. package/src/usage.ts +7 -2
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,KAAK,EACR,iBAAiB,EACjB,wBAAwB,EACxB,uBAAuB,EAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EACR,YAAY,EACZ,yBAAyB,EAC5B,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACR,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,aAAa,GAChB,MAAM,0BAA0B,CAAC;AAElC,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACnB;AAKD,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,MAAM,CAAC;AAInD,MAAM,MAAM,sBAAsB,GAC5B;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B,GACC;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B,GACC;IACE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEN,MAAM,MAAM,+BAA+B,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAK3E,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,QAAQ,EAAE,+BAA+B,CAAC;IACnD,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC;CAC3C;AAED,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC,CAAC;AAKrE,MAAM,WAAW,sBAAsB;IACnC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAGpC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAI1B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE;QACf,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;KACvD,CAAC;CACL;AAED,MAAM,MAAM,sBAAsB,GAAG,CACjC,QAAQ,EAAE,sBAAsB,KAC/B,YAAY,GAAG,SAAS,CAAC;AAE9B,MAAM,WAAW,uBAAuB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,yBAAyB,GAAG,CACpC,UAAU,EAAE,yBAAyB,KACpC,OAAO,CAAC,IAAI,CAAC,CAAC;AAInB,MAAM,MAAM,uBAAuB,GAAG,CAClC,QAAQ,EAAE,uBAAuB,KAChC,OAAO,CAAC,yBAAyB,CAAC,CAAC;AAIxC,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,gBAAgB,GAAG,IAAI,CAAC;AACtF,MAAM,MAAM,2BAA2B,GAAG,YAAY,GAAG,sBAAsB,CAAC;AAUhF,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC9C;AAKD,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,2BAA2B,GAAG,YAAY;IACzF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,aAAa,CAAC,8BAA8B,CAAC,CAAC;IAC5E,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAIvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAE5C,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAI5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,2BAA2B,GAAG,YAAY;IACxF,QAAQ,CAAC,SAAS,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAG/B,QAAQ,CAAC,UAAU,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAC1D,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAE3C,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAO3C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAOxC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAI3B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CAChD;AAED,MAAM,MAAM,eAAe,GAAG,gBAAgB,CAAC,2BAA2B,CAAC,CAAC;AAE5E,MAAM,WAAW,oBAAoB;IACjC,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,cAAc,CAAC,EAAE,uBAAuB,CAAC;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CACxC;AAED,MAAM,WAAW,QAAQ;IAGrB,YAAY,CAAC,CAAC,OAAO,EAAE,wBAAwB,GAAG,iBAAiB,CAAC;IAsDpE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAIhE,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAMvB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAK9B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAQpC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAKxC,qBAAqB,CACjB,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,eAAe,CAAC,EAAE,MAAM,EACxB,MAAM,CAAC,EAAE,WAAW,GACrB,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAIpC,iBAAiB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAM3G,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9C;AAUD,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC7B;AAID,MAAM,WAAW,mBAAoB,SAAQ,uBAAuB;IAChE,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC;CAC/C"}
package/dist/usage.d.ts CHANGED
@@ -33,6 +33,7 @@ export declare const normalizeUsage: (raw: RawUsage | null | undefined) => Provi
33
33
  export type TokenRates = {
34
34
  input: number;
35
35
  output: number;
36
+ reasoning?: number;
36
37
  cacheRead?: number;
37
38
  cacheWrite?: number;
38
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,oBAAoB,CAAC,EAAE;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,yBAAyB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,qBAAqB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAgBF,eAAO,MAAM,qBAAqB,UAAW,aAAa,KAAG,aAqD5D,CAAC;AAEF,eAAO,MAAM,cAAc,QAAS,QAAQ,GAAG,IAAI,GAAG,SAAS,KAAG,aAAa,GAAG,SA6FjF,CAAC;AAIF,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAiBF,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,SAAS,MAAM,KAAG,MAMrE,CAAC;AAEF,eAAO,MAAM,uBAAuB,UACzB,aAAa,SACb,UAAU,KAClB,MAAM,GAAG,IAqBX,CAAC"}
1
+ {"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE;QACpB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,oBAAoB,CAAC,EAAE;QACnB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC/B,CAAC;IACF,yBAAyB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,qBAAqB,CAAC,EAAE;QAAE,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAgBF,eAAO,MAAM,qBAAqB,UAAW,aAAa,KAAG,aAqD5D,CAAC;AAEF,eAAO,MAAM,cAAc,QAAS,QAAQ,GAAG,IAAI,GAAG,SAAS,KAAG,aAAa,GAAG,SA6FjF,CAAC;AAIF,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAiBF,eAAO,MAAM,gBAAgB,gBAAiB,MAAM,SAAS,MAAM,KAAG,MAMrE,CAAC;AAEF,eAAO,MAAM,uBAAuB,UACzB,aAAa,SACb,UAAU,KAClB,MAAM,GAAG,IAyBX,CAAC"}
package/dist/usage.js CHANGED
@@ -174,17 +174,22 @@ export const calculateCostUsdDecimal = (usage, rates) => {
174
174
  return null;
175
175
  const cacheReadRate = rates.cacheRead ?? rates.input;
176
176
  const cacheWriteRate = rates.cacheWrite ?? rates.input;
177
+ const reasoningRate = rates.reasoning ?? rates.output;
177
178
  const cacheReadTokens = usage.inputTokenDetails?.cacheReadTokens;
178
179
  const cacheWriteTokens = usage.inputTokenDetails?.cacheWriteTokens;
180
+ const reasoningTokens = usage.outputTokenDetails?.reasoningTokens;
179
181
  if (cacheReadRate !== rates.input && cacheReadTokens === undefined)
180
182
  return null;
181
183
  if (cacheWriteRate !== rates.input && cacheWriteTokens === undefined)
182
184
  return null;
183
- const parts = [rates.input, rates.output, cacheReadRate, cacheWriteRate].map(decimalParts);
185
+ if (reasoningRate !== rates.output && reasoningTokens === undefined)
186
+ return null;
187
+ const parts = [rates.input, rates.output, reasoningRate, cacheReadRate, cacheWriteRate].map(decimalParts);
184
188
  const rateScale = Math.max(...parts.map(({ scale }) => scale));
185
- const [input, output, cacheRead, cacheWrite] = parts.map(({ coefficient, scale }) => coefficient * 10n ** BigInt(rateScale - scale));
189
+ const [input, output, reasoning, cacheRead, cacheWrite] = parts.map(({ coefficient, scale }) => coefficient * 10n ** BigInt(rateScale - scale));
186
190
  const coefficient = BigInt(usage.inputTokens) * input
187
191
  + BigInt(usage.outputTokens) * output
192
+ + BigInt(reasoningTokens ?? 0) * (reasoning - output)
188
193
  + BigInt(cacheReadTokens ?? 0) * (cacheRead - input)
189
194
  + BigInt(cacheWriteTokens ?? 0) * (cacheWrite - input);
190
195
  if (coefficient < 0n)
package/dist/usage.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plurnk/plurnk-providers",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "PLURNK's stable model-provider contract and AI SDK adapter.",
5
5
  "keywords": [
6
6
  "plurnk",
@@ -37,6 +37,16 @@
37
37
  "types": "./dist/openai.d.ts",
38
38
  "default": "./dist/openai.js"
39
39
  },
40
+ "./accounting": {
41
+ "plurnk-dev": "./src/accountingPublic.ts",
42
+ "types": "./dist/accountingPublic.d.ts",
43
+ "default": "./dist/accountingPublic.js"
44
+ },
45
+ "./errors": {
46
+ "plurnk-dev": "./src/providerError.ts",
47
+ "types": "./dist/providerError.d.ts",
48
+ "default": "./dist/providerError.js"
49
+ },
40
50
  "./package.json": "./package.json"
41
51
  },
42
52
  "files": [
@@ -51,8 +61,10 @@
51
61
  "test:unit": "node --conditions=plurnk-dev --test src/**/*.test.ts scripts/*.test.mjs",
52
62
  "test:llama": "node --conditions=plurnk-dev --test test/llama/*.test.ts",
53
63
  "test:providersPing": "bash ../scripts/operator-environment.sh node --conditions=plurnk-dev --import=../plurnk-core/test/floor.ts --env-file-if-exists=../plurnk-core/.env.defaults --env-file-if-exists=$HOME/.plurnk/.env --env-file-if-exists=../plurnk-core/.env --env-file-if-exists=../plurnk-core/.env.test scripts/providers-ping.mjs",
64
+ "probe:tokens": "bash ../scripts/operator-environment.sh node --conditions=plurnk-dev --import=../plurnk-core/test/floor.ts --env-file-if-exists=../plurnk-core/.env.defaults --env-file-if-exists=$HOME/.plurnk/.env --env-file-if-exists=../plurnk-core/.env --env-file-if-exists=../plurnk-core/.env.test scripts/token-envelope-probe.mjs",
54
65
  "test": "npm run test:lint && npm run test:unit",
55
- "prepublishOnly": "npm audit --audit-level=moderate && npm test",
66
+ "release:check": "node scripts/runtime-neutral-worker-smoke.mjs",
67
+ "prepublishOnly": "npm audit --audit-level=moderate && npm test && npm run build && npm run release:check",
56
68
  "build:clean": "rm -rf dist",
57
69
  "build:dist": "tsc -p tsconfig.build.json",
58
70
  "build": "npm run build:clean && npm run build:dist",
@@ -71,12 +83,15 @@
71
83
  "@ai-sdk/togetherai": "^3.0.0",
72
84
  "@ai-sdk/xai": "^4.0.0",
73
85
  "@openrouter/ai-sdk-provider": "^3.0.0",
74
- "@plurnk/gbnf": "1.6.0",
75
- "@plurnk/plurnk-aliases": "1.6.0",
76
- "@plurnk/plurnk-contracts": "1.6.0",
77
- "@plurnk/plurnk-meta": "1.6.0",
78
- "@plurnk/plurnk-models": "1.6.0",
86
+ "@plurnk/gbnf": "1.7.0",
87
+ "@plurnk/plurnk-aliases": "1.7.0",
88
+ "@plurnk/plurnk-contracts": "1.7.0",
89
+ "@plurnk/plurnk-meta": "1.7.0",
90
+ "@plurnk/plurnk-models": "1.7.0",
79
91
  "ai": "^7.0.37",
80
92
  "zod": "^3.25.76"
93
+ },
94
+ "devDependencies": {
95
+ "esbuild": "^0.28.2"
81
96
  }
82
97
  }
@@ -519,6 +519,68 @@ test("injected prompt measurement preserves provenance and request cost estimati
519
519
  });
520
520
  });
521
521
 
522
+ test("an exact request overflow rejects before observer or provider I/O", async () => {
523
+ const calls = installFetch([{ choices: [{ delta: { content: "unreachable" } }] }]);
524
+ let observed = false;
525
+ const p = testProvider({
526
+ model: "m",
527
+ url: "http://x/v1/chat/completions",
528
+ contextWindow: 100,
529
+ outputBudget: 40,
530
+ countPromptTokens: () => ({ kind: "exact", tokens: 61, source: "test:exact" }),
531
+ fetchTimeoutMs: 1000,
532
+ temperature: 0.2,
533
+ repeatPenalty: 1.15,
534
+ reasoning: { mode: "off", budget: null },
535
+ retryAttempts: 0,
536
+ });
537
+ await assert.rejects(
538
+ () => p.generate({
539
+ workerId: "capacity",
540
+ messages: [{ role: "user", content: "payload" }],
541
+ observeRequest: async () => {
542
+ observed = true;
543
+ return async () => {};
544
+ },
545
+ }),
546
+ (error: unknown) => {
547
+ assert.ok(error instanceof ProviderError);
548
+ assert.equal(error.kind, "capacity_exceeded");
549
+ assert.equal(error.problem.capacityStage, "preflight");
550
+ assert.equal(error.capacity?.decision, "reject");
551
+ assert.deepEqual(error.accounting, []);
552
+ return true;
553
+ },
554
+ );
555
+ assert.equal(observed, false);
556
+ assert.equal(calls.length, 0);
557
+ });
558
+
559
+ test("an estimate above the known envelope defers to the provider", async () => {
560
+ const calls = installFetch([{ choices: [{ delta: { content: "ok" }, finish_reason: "stop" }] }]);
561
+ const p = testProvider({
562
+ model: "m",
563
+ url: "http://x/v1/chat/completions",
564
+ contextWindow: 100,
565
+ outputBudget: 40,
566
+ countPromptTokens: () => ({
567
+ kind: "estimate",
568
+ tokens: 61,
569
+ source: "test:estimate",
570
+ detail: "fixture has no serving tokenizer",
571
+ }),
572
+ fetchTimeoutMs: 1000,
573
+ temperature: 0.2,
574
+ repeatPenalty: 1.15,
575
+ reasoning: { mode: "off", budget: null },
576
+ retryAttempts: 0,
577
+ });
578
+ const response = await p.generate({ workerId: "capacity", messages: [] });
579
+ assert.equal(response.capacity.decision, "defer");
580
+ assert.equal(calls.length, 1);
581
+ assert.equal(JSON.parse(calls[0].init.body as string).max_tokens, 40);
582
+ });
583
+
522
584
  test("generate maps a streamed response into ProviderResponse", async () => {
523
585
  const p = testProvider({ model: "req-model", url: "http://x/v1/chat/completions", fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0 });
524
586
  installFetch([
@@ -791,7 +853,7 @@ test("#161: a streamed resource interruption is a failed exchange with complete
791
853
  totalTokens: 12,
792
854
  });
793
855
  assert.equal(
794
- (error.attempt?.assistantRaw as { rawFinishReason?: string }).rawFinishReason,
856
+ (error.attempt?.assistantRaw as { rawFinishReason?: string } | undefined)?.rawFinishReason,
795
857
  "insufficient_system_resource",
796
858
  );
797
859
  assert.ok(Array.isArray(error.attempt?.rawBody));
@@ -828,7 +890,7 @@ test("#161: a buffered resource interruption preserves the successful wire respo
828
890
  assert.equal(error.attempt?.assistant.finishReason, "resource_interrupted");
829
891
  assert.deepEqual(error.attempt?.rawBody, wire);
830
892
  assert.equal(
831
- (error.attempt?.assistantRaw as { rawFinishReason?: string }).rawFinishReason,
893
+ (error.attempt?.assistantRaw as { rawFinishReason?: string } | undefined)?.rawFinishReason,
832
894
  "insufficient_system_resource",
833
895
  );
834
896
  return true;
@@ -1097,7 +1159,7 @@ test("reasoningStyle 'think' follows activation (magnitude is irrelevant to the
1097
1159
 
1098
1160
  test("reasoningStyle 'effort' enables at the portable default without inventing a budget", async () => {
1099
1161
  for (const [budget, expected] of [[null, "medium"], [5000, "high"]] as const) {
1100
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "on", budget }, retryAttempts: 0, reasoningStyle: "effort" });
1162
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", ...(budget === null ? {} : { outputBudget: budget + 1, reasoningBudget: budget }), fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "on", budget }, retryAttempts: 0, reasoningStyle: "effort" });
1101
1163
  const calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1102
1164
  await p.generate({ workerId: "r", messages: [] });
1103
1165
  assert.equal(JSON.parse(calls[0].init.body as string).reasoning_effort, expected);
@@ -1110,7 +1172,7 @@ test("reasoningStyle 'effort_explicit': off SENDS none, adaptive OMITS, on sends
1110
1172
  // 400s reasoning_effort='adaptive' for non-MiniMax models (wire-verified,
1111
1173
  // Adaptive = the backend's own default posture = omission.
1112
1174
  for (const [reasoning, expected] of [[{ mode: "off", budget: null }, "none"], [{ mode: "adaptive", budget: null }, null], [{ mode: "on", budget: null }, "medium"], [{ mode: "on", budget: 5000 }, "high"]] as Array<[{ mode: "off" | "adaptive" | "on"; budget: number | null }, string | null]>) {
1113
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning, retryAttempts: 0, reasoningStyle: "effort_explicit" });
1175
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", ...(reasoning.budget === null ? {} : { outputBudget: reasoning.budget + 1, reasoningBudget: reasoning.budget }), fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning, retryAttempts: 0, reasoningStyle: "effort_explicit" });
1114
1176
  const calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1115
1177
  await p.generate({ workerId: "r", messages: [] });
1116
1178
  const body = JSON.parse(calls[0].init.body as string);
@@ -1134,6 +1196,7 @@ test("{§deepseek-reasoning-request} #157: thinking_effort maps the complete Dee
1134
1196
  fetchTimeoutMs: 5000,
1135
1197
  temperature: 0.2,
1136
1198
  repeatPenalty: 1.15,
1199
+ ...(reasoning.budget === null ? {} : { outputBudget: reasoning.budget + 1, reasoningBudget: reasoning.budget }),
1137
1200
  reasoning,
1138
1201
  retryAttempts: 0,
1139
1202
  reasoningStyle: "thinking_effort",
@@ -1239,7 +1302,7 @@ test("sampling passthrough forwards caller params; managed + reserved keys win",
1239
1302
  await p.generate({
1240
1303
  workerId: "r",
1241
1304
  messages: [{ role: "user", content: "hi" }],
1242
- maxTokens: 100,
1305
+ maxOutputTokens: 100,
1243
1306
  sampling: {
1244
1307
  temperature: 0.2, top_p: 0.9, top_k: 40, stop: ["\n"], // real sampling → passthrough
1245
1308
  model: "hijack", response_format: { type: "grammar", grammar: "x" }, id_slot: 7, // reserved → stripped
@@ -1262,7 +1325,7 @@ test("sampling passthrough guards contract invariants: n/tools/caps stripped, pl
1262
1325
  await p.generate({
1263
1326
  workerId: "r",
1264
1327
  messages: [{ role: "user", content: "hi" }],
1265
- maxTokens: 100,
1328
+ maxOutputTokens: 100,
1266
1329
  sampling: {
1267
1330
  n: 3, // breaks choices[0] atomicity -> stripped
1268
1331
  tools: [{ type: "function" }], tool_choice: "auto", // tools-in-body doctrine -> stripped
@@ -1282,7 +1345,7 @@ test("sampling passthrough guards contract invariants: n/tools/caps stripped, pl
1282
1345
  });
1283
1346
 
1284
1347
  test("template reasoning returns the exact pre-projection grammar sentence ({§gbnf-response-observation})", async () => {
1285
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { tokens: 64 }, completionReserve: { tokens: 160 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: null }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1348
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, reasoningBudget: 64, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: 64 }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1286
1349
  const grammarInput = "<|channel>thought\ncon🙂sider<channel|>x";
1287
1350
  const calls = installFetch([{ choices: [{ delta: { content: grammarInput } }] }]);
1288
1351
  const res = await p.generate({ workerId: "r", messages: [], grammar: `root ::= ${JSON.stringify(grammarInput)}` });
@@ -1302,7 +1365,7 @@ test("template reasoning returns the exact pre-projection grammar sentence ({§g
1302
1365
  });
1303
1366
 
1304
1367
  test("template reasoning projects a leading think envelope without losing grammar evidence", async () => {
1305
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { tokens: 64 }, completionReserve: { tokens: 160 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: null }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1368
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, reasoningBudget: 64, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: 64 }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1306
1369
  const input = "<think>\ncon🙂sider</think>x";
1307
1370
  const calls = installFetch([{ choices: [{ delta: { content: input } }] }]);
1308
1371
  const res = await p.generate({ workerId: "r", messages: [], grammar: `root ::= ${JSON.stringify(input)}` });
@@ -1318,7 +1381,7 @@ test("template reasoning projects a leading think envelope without losing gramma
1318
1381
  });
1319
1382
 
1320
1383
  test("a verbatim template response remains exact evidence when it has no channel envelope", async () => {
1321
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { tokens: 64 }, completionReserve: { tokens: 160 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: null }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1384
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, reasoningBudget: 64, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: 64 }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1322
1385
  const calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1323
1386
  const res = await p.generate({ workerId: "r", messages: [], grammar: 'root ::= "x"' });
1324
1387
  const body = JSON.parse(calls[0].init.body as string);
@@ -1327,7 +1390,7 @@ test("a verbatim template response remains exact evidence when it has no channel
1327
1390
  });
1328
1391
 
1329
1392
  test("a template grammar preserves exact evidence when reasoning is disabled", async () => {
1330
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { tokens: 64 }, completionReserve: { tokens: 160 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1393
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1331
1394
  const calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1332
1395
  const res = await p.generate({ workerId: "r", messages: [], grammar: 'root ::= "x"' });
1333
1396
  const body = JSON.parse(calls[0].init.body as string);
@@ -1337,14 +1400,14 @@ test("a template grammar preserves exact evidence when reasoning is disabled", a
1337
1400
  });
1338
1401
 
1339
1402
  test("an unexpectedly projected template response cannot claim pre-projection evidence", async () => {
1340
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { tokens: 64 }, completionReserve: { tokens: 160 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: null }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1403
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, reasoningBudget: 64, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: 64 }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1341
1404
  installFetch([{ choices: [{ delta: { reasoning_content: "reason", content: "x" } }] }]);
1342
1405
  const res = await p.generate({ workerId: "r", messages: [], grammar: 'root ::= "x"' });
1343
1406
  assert.equal(res.grammarEvidence, undefined);
1344
1407
  });
1345
1408
 
1346
1409
  test("template reasoning preserves an empty grammar-required channel as exact evidence", async () => {
1347
- const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { tokens: 64 }, completionReserve: { tokens: 160 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: null }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1410
+ const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, reasoningBudget: 64, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: 64 }, retryAttempts: 0, reasoningStyle: "template", grammarStyle: "llamacpp" });
1348
1411
  const input = "<|channel>thought\n<channel|>x";
1349
1412
  const calls = installFetch([{ choices: [{ delta: { content: input } }] }]);
1350
1413
  const res = await p.generate({ workerId: "r", messages: [], grammar: `root ::= ${JSON.stringify(input)}` });
@@ -1395,7 +1458,7 @@ test("channel-escape state is absent without a transported grammar", async () =>
1395
1458
  });
1396
1459
 
1397
1460
  test("reasoningStyle 'template' sends llama-server activation, parser, and response-wide allowance", async () => {
1398
- const on = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { percent: 0.1 }, completionReserve: { percent: 0.25 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: null }, retryAttempts: 0, reasoningStyle: "template" });
1461
+ const on = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, reasoningBudget: 64, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "adaptive", budget: 64 }, retryAttempts: 0, reasoningStyle: "template" });
1399
1462
  let calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1400
1463
  await on.generate({ workerId: "r", messages: [] });
1401
1464
  let body = JSON.parse(calls[0].init.body as string);
@@ -1404,7 +1467,7 @@ test("reasoningStyle 'template' sends llama-server activation, parser, and respo
1404
1467
  assert.equal(body.thinking_budget_tokens, 64);
1405
1468
 
1406
1469
  mock.restoreAll();
1407
- const off = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { percent: 0.1 }, completionReserve: { percent: 0.25 }, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0, reasoningStyle: "template" });
1470
+ const off = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0, reasoningStyle: "template" });
1408
1471
  calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1409
1472
  await off.generate({ workerId: "r", messages: [] });
1410
1473
  body = JSON.parse(calls[0].init.body as string);
@@ -1413,31 +1476,31 @@ test("reasoningStyle 'template' sends llama-server activation, parser, and respo
1413
1476
  assert.equal(body.thinking_budget_tokens, 0);
1414
1477
  });
1415
1478
 
1416
- test("reasoningStyle 'template' explicit budget tightens the reserve and cannot exceed it", async () => {
1417
- const base = { model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, reasoningReserve: { tokens: 64 } as const, completionReserve: { tokens: 160 } as const, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, retryAttempts: 0, reasoningStyle: "template" as const };
1418
- const p = testProvider({ ...base, reasoning: { mode: "on", budget: 32 } });
1479
+ test("reasoningStyle 'template' carries the explicit reasoning subset and rejects an additive envelope", async () => {
1480
+ const base = { model: "m", url: "http://x/v1/chat/completions", contextWindow: 640, outputBudget: 224, fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, retryAttempts: 0, reasoningStyle: "template" as const };
1481
+ const p = testProvider({ ...base, reasoningBudget: 32, reasoning: { mode: "on", budget: 32 } });
1419
1482
  const calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1420
1483
  await p.generate({ workerId: "r", messages: [], sampling: { thinking_budget_tokens: 999, reasoning_format: "none" } });
1421
1484
  const body = JSON.parse(calls[0].init.body as string);
1422
1485
  assert.equal(body.thinking_budget_tokens, 32);
1423
1486
  assert.equal(body.reasoning_format, "auto");
1424
1487
  assert.throws(
1425
- () => testProvider({ ...base, reasoning: { mode: "on", budget: 65 } }),
1426
- /REASONING_BUDGET \(65\) exceeds the resolved PLURNK_PROVIDERS_REASONING_RESERVE \(64\)/,
1488
+ () => testProvider({ ...base, reasoningBudget: 224, reasoning: { mode: "on", budget: 224 } }),
1489
+ /reasoningBudget must be smaller than the total outputBudget/,
1427
1490
  );
1428
1491
  });
1429
1492
 
1430
- test("reasoningStyle 'template' explicit activation without a budget uses the resolved reserve", async () => {
1493
+ test("reasoningStyle 'template' explicit activation uses the configured reasoning subset", async () => {
1431
1494
  const p = testProvider({
1432
1495
  model: "m",
1433
1496
  url: "http://x/v1/chat/completions",
1434
1497
  contextWindow: 640,
1435
- reasoningReserve: { tokens: 64 },
1436
- completionReserve: { tokens: 160 },
1498
+ outputBudget: 224,
1499
+ reasoningBudget: 64,
1437
1500
  fetchTimeoutMs: 5000,
1438
1501
  temperature: 0.2,
1439
1502
  repeatPenalty: 1.15,
1440
- reasoning: { mode: "on", budget: null },
1503
+ reasoning: { mode: "on", budget: 64 },
1441
1504
  retryAttempts: 0,
1442
1505
  reasoningStyle: "template",
1443
1506
  });
@@ -1671,10 +1734,10 @@ test("grammar transport: no grammar passed sends no grammar field, but the penal
1671
1734
  assert.equal(body.repeat_penalty, 1.15); // penalty is not grammar-gated
1672
1735
  });
1673
1736
 
1674
- test("maxTokens transports as max_tokens; absent → no wire field (server default)", async () => {
1737
+ test("maxOutputTokens tightens the total output budget; absent leaves an unconfigured provider uncapped", async () => {
1675
1738
  const p = testProvider({ model: "m", url: "http://x/v1/chat/completions", fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0 });
1676
1739
  let calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
1677
- await p.generate({ workerId: "r", messages: [], maxTokens: 2048 });
1740
+ await p.generate({ workerId: "r", messages: [], maxOutputTokens: 2048 });
1678
1741
  assert.equal(JSON.parse(calls[0].init.body as string).max_tokens, 2048);
1679
1742
 
1680
1743
  mock.restoreAll();
@@ -1683,6 +1746,52 @@ test("maxTokens transports as max_tokens; absent → no wire field (server defau
1683
1746
  assert.equal("max_tokens" in JSON.parse(calls[0].init.body as string), false);
1684
1747
  });
1685
1748
 
1749
+ test("{§provider-output-budget-conformance} reported output beyond the total budget fails once with complete evidence", async () => {
1750
+ const p = testProvider({
1751
+ model: "m",
1752
+ url: "http://x/v1/chat/completions",
1753
+ fetchTimeoutMs: 5000,
1754
+ temperature: 0.2,
1755
+ repeatPenalty: 1.15,
1756
+ reasoning: { mode: "adaptive", budget: null },
1757
+ retryAttempts: 2,
1758
+ });
1759
+ const calls = installFetch([
1760
+ { choices: [{ delta: { reasoning_content: "consider" } }] },
1761
+ { choices: [{ delta: { content: "x" }, finish_reason: "stop" }] },
1762
+ {
1763
+ choices: [],
1764
+ usage: {
1765
+ prompt_tokens: 5,
1766
+ completion_tokens: 17,
1767
+ total_tokens: 22,
1768
+ completion_tokens_details: { reasoning_tokens: 16 },
1769
+ },
1770
+ },
1771
+ ]);
1772
+
1773
+ await assert.rejects(
1774
+ p.generate({ workerId: "r", messages: [], maxOutputTokens: 16 }),
1775
+ (error: unknown) => {
1776
+ assert.ok(error instanceof ProviderError);
1777
+ assert.equal(error.kind, "invalid_response");
1778
+ assert.equal(error.status, 502);
1779
+ assert.equal(error.problem.stage, "provider-response");
1780
+ assert.equal(error.problem.retryable, false);
1781
+ assert.equal(error.problem.outputBudget, 16);
1782
+ assert.equal(error.problem.reportedOutputTokens, 17);
1783
+ assert.equal(error.attempt?.assistant.content, "x");
1784
+ assert.equal(error.attempt?.assistant.reasoning, "consider");
1785
+ assert.equal(error.attempt?.assistant.finishReason, "stop");
1786
+ assert.equal(error.attempt?.capacity.outputBudget, 16);
1787
+ assert.equal(error.accounting[0]?.outcome, "response");
1788
+ assert.equal(error.accounting[0]?.usage?.outputTokens, 17);
1789
+ return true;
1790
+ },
1791
+ );
1792
+ assert.equal(calls.length, 1, "a paid provider contract violation is never replayed");
1793
+ });
1794
+
1686
1795
  test("slot affinity is internal: sticky per workerId, distinct workers spread across slots", async () => {
1687
1796
  const pinning = testProvider({ model: "m", url: "http://x/v1/chat/completions", fetchTimeoutMs: 5000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null }, retryAttempts: 0, supportsSlotPinning: true, slotCount: 2 });
1688
1797
  const calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
@@ -2119,15 +2228,15 @@ test("retry: a caller abort during backoff rejects promptly with no further atte
2119
2228
 
2120
2229
  // — Anthropic reasoning style (wire `thinking` parameter) —
2121
2230
 
2122
- test("reasoningStyle 'anthropic' maps an optional budget or the resolved reserve to the thinking param", async () => {
2231
+ test("reasoningStyle 'anthropic' maps the configured reasoning subset to the thinking parameter", async () => {
2123
2232
  // N>0 → enabled with budget_tokens
2124
- const capped = testProvider({ model: "m", url: "http://x/v1/chat/completions", fetchTimeoutMs: 5000, retryAttempts: 0, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "on", budget: 4096 }, reasoningStyle: "anthropic" });
2233
+ const capped = testProvider({ model: "m", url: "http://x/v1/chat/completions", outputBudget: 8192, reasoningBudget: 4096, fetchTimeoutMs: 5000, retryAttempts: 0, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "on", budget: 4096 }, reasoningStyle: "anthropic" });
2125
2234
  let calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
2126
2235
  await capped.generate({ workerId: "r", messages: [] });
2127
2236
  assert.deepEqual(JSON.parse(calls[0].init.body as string).thinking, { type: "enabled", budget_tokens: 4096 });
2128
2237
 
2129
2238
  mock.restoreAll();
2130
- const unbudgeted = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 8192, reasoningReserve: { tokens: 2048 }, fetchTimeoutMs: 5000, retryAttempts: 0, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "on", budget: null }, reasoningStyle: "anthropic" });
2239
+ const unbudgeted = testProvider({ model: "m", url: "http://x/v1/chat/completions", contextWindow: 8192, outputBudget: 4096, reasoningBudget: 2048, fetchTimeoutMs: 5000, retryAttempts: 0, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "on", budget: 2048 }, reasoningStyle: "anthropic" });
2131
2240
  calls = installFetch([{ choices: [{ delta: { content: "x" } }] }]);
2132
2241
  await unbudgeted.generate({ workerId: "r", messages: [] });
2133
2242
  assert.deepEqual(JSON.parse(calls[0].init.body as string).thinking, { type: "enabled", budget_tokens: 2048 });
@@ -2260,16 +2369,22 @@ test("coordinates are 1-based — 0/absent/empty emit no header", async () => {
2260
2369
 
2261
2370
  // -- {§provider-generation-envelope} --
2262
2371
 
2263
- test("reserves derive from the detected window; absolutes stand alone; null window + percent = no claim", () => {
2372
+ test("the adapter exposes independent model limits and the resolved generation envelope", () => {
2264
2373
  const base = { model: "m", url: "http://x/v1/chat/completions", fetchTimeoutMs: 1000, temperature: 0.2, repeatPenalty: 1.15, reasoning: { mode: "off", budget: null } as const, retryAttempts: 0 };
2265
- const derived = testProvider({ ...base, contextWindow: 49152, reasoningReserve: { percent: 0.1 }, completionReserve: { percent: 0.25 } });
2266
- assert.equal(derived.reasoningReserve, 4915); // jennifer/turboderp: 10% of 49152
2267
- assert.equal(derived.completionReserve, 12288); // 25% of 49152
2268
- const pinned = testProvider({ ...base, contextWindow: null, reasoningReserve: { tokens: 4096 }, completionReserve: { percent: 0.25 } });
2269
- assert.equal(pinned.reasoningReserve, 4096); // absolute pin needs no window
2270
- assert.equal(pinned.completionReserve, null); // percent without a window = underivable
2271
- const legacy = testProvider({ ...base, contextWindow: 49152 });
2272
- assert.equal(legacy.reasoningReserve, null); // out-of-date sibling: no claim
2374
+ const bounded = testProvider({
2375
+ ...base,
2376
+ contextWindow: 49_152,
2377
+ maxInputTokens: 40_000,
2378
+ maxOutputTokens: 16_384,
2379
+ outputBudget: 12_288,
2380
+ });
2381
+ assert.equal(bounded.contextWindow, 49_152);
2382
+ assert.equal(bounded.maxInputTokens, 40_000);
2383
+ assert.equal(bounded.maxOutputTokens, 16_384);
2384
+ assert.equal(bounded.outputBudget, 12_288);
2385
+ assert.equal(bounded.reasoningBudget, null);
2386
+ const unknown = testProvider({ ...base, contextWindow: null });
2387
+ assert.equal(unknown.outputBudget, null);
2273
2388
  });
2274
2389
 
2275
2390
  test("router-owned tuning: tuningFloors:false drops the temperature/penalty floors, caller sampling still rides", async () => {
@@ -2426,3 +2541,49 @@ test("native AI SDK reasoning turns on without an operator token budget", async
2426
2541
  assert.equal(request?.reasoning, "medium");
2427
2542
  assert.equal(response.assistant.reasoning, "consider");
2428
2543
  });
2544
+
2545
+ test("native additive-reasoning adapters preserve one total output budget", async () => {
2546
+ for (const [provider, expected] of [
2547
+ ["anthropic", { anthropic: { thinking: { type: "enabled", budgetTokens: 1499 } } }],
2548
+ ["bedrock", { bedrock: { reasoningConfig: { type: "enabled", budgetTokens: 1499 } } }],
2549
+ ] as const) {
2550
+ let request: Record<string, unknown> | undefined;
2551
+ const languageModel = {
2552
+ specificationVersion: "v4",
2553
+ provider: `native.${provider}`,
2554
+ modelId: "native-additive",
2555
+ supportedUrls: {},
2556
+ doGenerate: async (options: Record<string, unknown>) => {
2557
+ request = options;
2558
+ return {
2559
+ content: [{ type: "text", text: "ok" }],
2560
+ finishReason: { unified: "stop", raw: "stop" },
2561
+ usage: {
2562
+ inputTokens: { total: 2, noCache: 2, cacheRead: 0, cacheWrite: 0 },
2563
+ outputTokens: { total: 1, text: 1, reasoning: 0 },
2564
+ },
2565
+ response: { id: "response", modelId: "native-additive" },
2566
+ warnings: [],
2567
+ };
2568
+ },
2569
+ doStream: async () => { throw new Error("streaming is not under test"); },
2570
+ } as unknown as LanguageModel;
2571
+ const p = testProvider({
2572
+ model: "native-additive",
2573
+ languageModel,
2574
+ additiveReasoningProvider: provider,
2575
+ outputBudget: 8192,
2576
+ reasoningBudget: 2048,
2577
+ fetchTimeoutMs: 5000,
2578
+ temperature: 0.2,
2579
+ repeatPenalty: 1.15,
2580
+ reasoning: { mode: "on", budget: 2048 },
2581
+ retryAttempts: 0,
2582
+ streaming: false,
2583
+ });
2584
+ await p.generate({ workerId: `worker-${provider}`, messages: [], maxOutputTokens: 1500 });
2585
+ assert.equal(request?.maxOutputTokens, 1);
2586
+ assert.equal(request?.reasoning, "provider-default");
2587
+ assert.deepEqual(request?.providerOptions, expected);
2588
+ }
2589
+ });