@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.
- package/.env.defaults +9 -16
- package/README.md +17 -0
- package/SPEC.md +128 -45
- package/dist/AiSdkProvider.d.ts +16 -9
- package/dist/AiSdkProvider.d.ts.map +1 -1
- package/dist/AiSdkProvider.js +151 -54
- package/dist/AiSdkProvider.js.map +1 -1
- package/dist/Mock.d.ts +8 -4
- package/dist/Mock.d.ts.map +1 -1
- package/dist/Mock.js +53 -18
- package/dist/Mock.js.map +1 -1
- package/dist/Pool.d.ts +8 -4
- package/dist/Pool.d.ts.map +1 -1
- package/dist/Pool.js +68 -12
- package/dist/Pool.js.map +1 -1
- package/dist/accounting.d.ts.map +1 -1
- package/dist/accounting.js.map +1 -1
- package/dist/accountingPublic.d.ts +5 -0
- package/dist/accountingPublic.d.ts.map +1 -0
- package/dist/accountingPublic.js +3 -0
- package/dist/accountingPublic.js.map +1 -0
- package/dist/capacity.d.ts +26 -0
- package/dist/capacity.d.ts.map +1 -0
- package/dist/capacity.js +90 -0
- package/dist/capacity.js.map +1 -0
- package/dist/catalogProvider.d.ts +2 -1
- package/dist/catalogProvider.d.ts.map +1 -1
- package/dist/catalogProvider.js +18 -20
- package/dist/catalogProvider.js.map +1 -1
- package/dist/compatibleProvider.d.ts.map +1 -1
- package/dist/compatibleProvider.js +10 -7
- package/dist/compatibleProvider.js.map +1 -1
- package/dist/env.d.ts +8 -10
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +54 -37
- package/dist/env.js.map +1 -1
- package/dist/errors.d.ts +6 -22
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +30 -91
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/promptTokens.d.ts.map +1 -1
- package/dist/promptTokens.js +7 -4
- package/dist/promptTokens.js.map +1 -1
- package/dist/providerError.d.ts +25 -0
- package/dist/providerError.d.ts.map +1 -0
- package/dist/providerError.js +91 -0
- package/dist/providerError.js.map +1 -0
- package/dist/sdkModels.d.ts +1 -0
- package/dist/sdkModels.d.ts.map +1 -1
- package/dist/sdkModels.js +5 -8
- package/dist/sdkModels.js.map +1 -1
- package/dist/types.d.ts +24 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/usage.d.ts +1 -0
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +7 -2
- package/dist/usage.js.map +1 -1
- package/package.json +22 -7
- package/src/AiSdkProvider.test.ts +198 -37
- package/src/AiSdkProvider.ts +192 -59
- package/src/Mock.test.ts +32 -18
- package/src/Mock.ts +58 -19
- package/src/Pool.test.ts +71 -13
- package/src/Pool.ts +78 -13
- package/src/ProviderRegistry.test.ts +1 -1
- package/src/accounting.ts +0 -1
- package/src/accountingPublic.ts +9 -0
- package/src/boundaries.test.ts +28 -15
- package/src/capacity.test.ts +92 -0
- package/src/capacity.ts +140 -0
- package/src/catalogProvider.test.ts +82 -9
- package/src/catalogProvider.ts +24 -21
- package/src/compatibleProvider.test.ts +1 -2
- package/src/compatibleProvider.ts +10 -7
- package/src/cost.test.ts +31 -0
- package/src/env.test.ts +49 -20
- package/src/env.ts +114 -51
- package/src/errors.test.ts +33 -0
- package/src/errors.ts +38 -134
- package/src/index.ts +5 -2
- package/src/ollama.test.ts +1 -2
- package/src/promptTokens.ts +8 -5
- package/src/providerError.ts +139 -0
- package/src/sdkModels.test.ts +2 -5
- package/src/sdkModels.ts +6 -8
- package/src/types.ts +41 -19
- package/src/usage.ts +7 -2
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,
|
|
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
package/dist/usage.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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.
|
|
75
|
-
"@plurnk/plurnk-aliases": "1.
|
|
76
|
-
"@plurnk/plurnk-contracts": "1.
|
|
77
|
-
"@plurnk/plurnk-meta": "1.
|
|
78
|
-
"@plurnk/plurnk-models": "1.
|
|
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 })
|
|
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 })
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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'
|
|
1417
|
-
const base = { model: "m", url: "http://x/v1/chat/completions", contextWindow: 640,
|
|
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:
|
|
1426
|
-
/
|
|
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
|
|
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
|
-
|
|
1436
|
-
|
|
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:
|
|
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("
|
|
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: [],
|
|
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
|
|
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,
|
|
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("
|
|
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
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
assert.equal(
|
|
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
|
+
});
|