@aid-framework/runtime 0.0.0-stage → 0.1.39

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 (188) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +52 -2
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/agents/deep_agents.d.ts +78 -0
  5. package/dist/agents/deep_agents.d.ts.map +1 -0
  6. package/dist/agents/deep_agents.js +477 -0
  7. package/dist/agents/deep_agents.js.map +1 -0
  8. package/dist/agents/engine.d.ts +85 -0
  9. package/dist/agents/engine.d.ts.map +1 -0
  10. package/dist/agents/engine.js +129 -0
  11. package/dist/agents/engine.js.map +1 -0
  12. package/dist/agents/gateway_chat_model.d.ts +151 -0
  13. package/dist/agents/gateway_chat_model.d.ts.map +1 -0
  14. package/dist/agents/gateway_chat_model.js +350 -0
  15. package/dist/agents/gateway_chat_model.js.map +1 -0
  16. package/dist/agents/guardrail_middleware.d.ts +57 -0
  17. package/dist/agents/guardrail_middleware.d.ts.map +1 -0
  18. package/dist/agents/guardrail_middleware.js +85 -0
  19. package/dist/agents/guardrail_middleware.js.map +1 -0
  20. package/dist/agents/guardrails.d.ts +124 -0
  21. package/dist/agents/guardrails.d.ts.map +1 -0
  22. package/dist/agents/guardrails.js +336 -0
  23. package/dist/agents/guardrails.js.map +1 -0
  24. package/dist/agents/index.d.ts +15 -0
  25. package/dist/agents/index.d.ts.map +1 -0
  26. package/dist/agents/index.js +15 -0
  27. package/dist/agents/index.js.map +1 -0
  28. package/dist/agents/ir.d.ts +144 -0
  29. package/dist/agents/ir.d.ts.map +1 -0
  30. package/dist/agents/ir.js +513 -0
  31. package/dist/agents/ir.js.map +1 -0
  32. package/dist/agents/loop.d.ts +145 -0
  33. package/dist/agents/loop.d.ts.map +1 -0
  34. package/dist/agents/loop.js +1025 -0
  35. package/dist/agents/loop.js.map +1 -0
  36. package/dist/agents/memory.d.ts +115 -0
  37. package/dist/agents/memory.d.ts.map +1 -0
  38. package/dist/agents/memory.js +258 -0
  39. package/dist/agents/memory.js.map +1 -0
  40. package/dist/agents/state.d.ts +137 -0
  41. package/dist/agents/state.d.ts.map +1 -0
  42. package/dist/agents/state.js +255 -0
  43. package/dist/agents/state.js.map +1 -0
  44. package/dist/concurrency.d.ts +36 -0
  45. package/dist/concurrency.d.ts.map +1 -0
  46. package/dist/concurrency.js +86 -0
  47. package/dist/concurrency.js.map +1 -0
  48. package/dist/control.d.ts +116 -0
  49. package/dist/control.d.ts.map +1 -0
  50. package/dist/control.js +281 -0
  51. package/dist/control.js.map +1 -0
  52. package/dist/cost.d.ts +95 -0
  53. package/dist/cost.d.ts.map +1 -0
  54. package/dist/cost.js +161 -0
  55. package/dist/cost.js.map +1 -0
  56. package/dist/errors.d.ts +213 -0
  57. package/dist/errors.d.ts.map +1 -0
  58. package/dist/errors.js +316 -0
  59. package/dist/errors.js.map +1 -0
  60. package/dist/evals/dataset.d.ts +45 -0
  61. package/dist/evals/dataset.d.ts.map +1 -0
  62. package/dist/evals/dataset.js +147 -0
  63. package/dist/evals/dataset.js.map +1 -0
  64. package/dist/evals/gate.d.ts +236 -0
  65. package/dist/evals/gate.d.ts.map +1 -0
  66. package/dist/evals/gate.js +572 -0
  67. package/dist/evals/gate.js.map +1 -0
  68. package/dist/evals/metrics.d.ts +141 -0
  69. package/dist/evals/metrics.d.ts.map +1 -0
  70. package/dist/evals/metrics.js +364 -0
  71. package/dist/evals/metrics.js.map +1 -0
  72. package/dist/evals/predicate.d.ts +79 -0
  73. package/dist/evals/predicate.d.ts.map +1 -0
  74. package/dist/evals/predicate.js +178 -0
  75. package/dist/evals/predicate.js.map +1 -0
  76. package/dist/evals/runner.d.ts +94 -0
  77. package/dist/evals/runner.d.ts.map +1 -0
  78. package/dist/evals/runner.js +202 -0
  79. package/dist/evals/runner.js.map +1 -0
  80. package/dist/gateway.d.ts +118 -0
  81. package/dist/gateway.d.ts.map +1 -0
  82. package/dist/gateway.js +250 -0
  83. package/dist/gateway.js.map +1 -0
  84. package/dist/index.d.ts +83 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +59 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/internal/json.d.ts +44 -0
  89. package/dist/internal/json.d.ts.map +1 -0
  90. package/dist/internal/json.js +90 -0
  91. package/dist/internal/json.js.map +1 -0
  92. package/dist/internal/text.d.ts +17 -0
  93. package/dist/internal/text.d.ts.map +1 -0
  94. package/dist/internal/text.js +22 -0
  95. package/dist/internal/text.js.map +1 -0
  96. package/dist/pipeline.d.ts +80 -0
  97. package/dist/pipeline.d.ts.map +1 -0
  98. package/dist/pipeline.js +159 -0
  99. package/dist/pipeline.js.map +1 -0
  100. package/dist/policy.d.ts +52 -0
  101. package/dist/policy.d.ts.map +1 -0
  102. package/dist/policy.js +199 -0
  103. package/dist/policy.js.map +1 -0
  104. package/dist/prompts.d.ts +86 -0
  105. package/dist/prompts.d.ts.map +1 -0
  106. package/dist/prompts.js +337 -0
  107. package/dist/prompts.js.map +1 -0
  108. package/dist/providers/base.d.ts +19 -0
  109. package/dist/providers/base.d.ts.map +1 -0
  110. package/dist/providers/base.js +13 -0
  111. package/dist/providers/base.js.map +1 -0
  112. package/dist/providers/fake.d.ts +98 -0
  113. package/dist/providers/fake.d.ts.map +1 -0
  114. package/dist/providers/fake.js +181 -0
  115. package/dist/providers/fake.js.map +1 -0
  116. package/dist/providers/http.d.ts +62 -0
  117. package/dist/providers/http.d.ts.map +1 -0
  118. package/dist/providers/http.js +245 -0
  119. package/dist/providers/http.js.map +1 -0
  120. package/dist/retrieval/chunking.d.ts +88 -0
  121. package/dist/retrieval/chunking.d.ts.map +1 -0
  122. package/dist/retrieval/chunking.js +188 -0
  123. package/dist/retrieval/chunking.js.map +1 -0
  124. package/dist/retrieval/citations.d.ts +98 -0
  125. package/dist/retrieval/citations.d.ts.map +1 -0
  126. package/dist/retrieval/citations.js +134 -0
  127. package/dist/retrieval/citations.js.map +1 -0
  128. package/dist/retrieval/connectors.d.ts +74 -0
  129. package/dist/retrieval/connectors.d.ts.map +1 -0
  130. package/dist/retrieval/connectors.js +218 -0
  131. package/dist/retrieval/connectors.js.map +1 -0
  132. package/dist/retrieval/embedding.d.ts +116 -0
  133. package/dist/retrieval/embedding.d.ts.map +1 -0
  134. package/dist/retrieval/embedding.js +282 -0
  135. package/dist/retrieval/embedding.js.map +1 -0
  136. package/dist/retrieval/gate.d.ts +52 -0
  137. package/dist/retrieval/gate.d.ts.map +1 -0
  138. package/dist/retrieval/gate.js +91 -0
  139. package/dist/retrieval/gate.js.map +1 -0
  140. package/dist/retrieval/hybrid.d.ts +76 -0
  141. package/dist/retrieval/hybrid.d.ts.map +1 -0
  142. package/dist/retrieval/hybrid.js +150 -0
  143. package/dist/retrieval/hybrid.js.map +1 -0
  144. package/dist/retrieval/metrics.d.ts +126 -0
  145. package/dist/retrieval/metrics.d.ts.map +1 -0
  146. package/dist/retrieval/metrics.js +200 -0
  147. package/dist/retrieval/metrics.js.map +1 -0
  148. package/dist/retrieval/pgvector.d.ts +62 -0
  149. package/dist/retrieval/pgvector.d.ts.map +1 -0
  150. package/dist/retrieval/pgvector.js +262 -0
  151. package/dist/retrieval/pgvector.js.map +1 -0
  152. package/dist/retrieval/rerank.d.ts +61 -0
  153. package/dist/retrieval/rerank.d.ts.map +1 -0
  154. package/dist/retrieval/rerank.js +105 -0
  155. package/dist/retrieval/rerank.js.map +1 -0
  156. package/dist/retrieval/retriever.d.ts +125 -0
  157. package/dist/retrieval/retriever.d.ts.map +1 -0
  158. package/dist/retrieval/retriever.js +281 -0
  159. package/dist/retrieval/retriever.js.map +1 -0
  160. package/dist/retrieval/stores.d.ts +106 -0
  161. package/dist/retrieval/stores.d.ts.map +1 -0
  162. package/dist/retrieval/stores.js +142 -0
  163. package/dist/retrieval/stores.js.map +1 -0
  164. package/dist/retrieval/types.d.ts +314 -0
  165. package/dist/retrieval/types.d.ts.map +1 -0
  166. package/dist/retrieval/types.js +388 -0
  167. package/dist/retrieval/types.js.map +1 -0
  168. package/dist/steps.d.ts +156 -0
  169. package/dist/steps.d.ts.map +1 -0
  170. package/dist/steps.js +199 -0
  171. package/dist/steps.js.map +1 -0
  172. package/dist/structured.d.ts +91 -0
  173. package/dist/structured.d.ts.map +1 -0
  174. package/dist/structured.js +155 -0
  175. package/dist/structured.js.map +1 -0
  176. package/dist/tools.d.ts +100 -0
  177. package/dist/tools.d.ts.map +1 -0
  178. package/dist/tools.js +201 -0
  179. package/dist/tools.js.map +1 -0
  180. package/dist/tracing.d.ts +104 -0
  181. package/dist/tracing.d.ts.map +1 -0
  182. package/dist/tracing.js +155 -0
  183. package/dist/tracing.js.map +1 -0
  184. package/dist/types.d.ts +240 -0
  185. package/dist/types.d.ts.map +1 -0
  186. package/dist/types.js +357 -0
  187. package/dist/types.js.map +1 -0
  188. package/package.json +77 -3
@@ -0,0 +1,178 @@
1
+ /**
2
+ * The PredicateExpr evaluator an `assert` metric runs.
3
+ *
4
+ * The AST is data, not code: the IR parses and validates it, the generator emits it
5
+ * as a plain object literal, and this module walks it. There is no `eval` and no
6
+ * `new Function` anywhere on that path, so a predicate can only ever do what this
7
+ * file implements -- read the prediction, the case id and one metadata key, call
8
+ * four total string builtins, and compare. Anything else is a node kind this walker
9
+ * does not know, and an unknown node throws rather than passing.
10
+ *
11
+ * Throwing matters more than it looks. A false assertion and an *undecidable* one
12
+ * are different outcomes: `false` is a legitimate result the gate must see, while a
13
+ * missing metadata key or a string where a number belongs means the eval itself is
14
+ * misconfigured. Returning `false` for either would report a broken eval as a
15
+ * failing candidate, and returning `true` would hide it, so both throw `EvalError`.
16
+ *
17
+ * Both sides of `and`/`or` are always evaluated. Short-circuiting would let
18
+ * `case.metadata.missing == "x" or true` pass silently, which is the one failure
19
+ * mode this whole design exists to prevent.
20
+ */
21
+ // biome-ignore lint/suspicious/noShadowRestrictedNames: the framework's own error name, matching the Python runtime's public surface
22
+ import { EvalError } from '../errors.js';
23
+ const ORDERING = new Set(['<', '<=', '>', '>=']);
24
+ /** The name a diagnostic uses for a value's type. */
25
+ export function typeName(value) {
26
+ if (typeof value === 'boolean')
27
+ return 'boolean';
28
+ if (typeof value === 'number')
29
+ return 'number';
30
+ return 'string';
31
+ }
32
+ /**
33
+ * Evaluate `node` against one case and prediction, or throw if it cannot be.
34
+ *
35
+ * A non-boolean result is an error rather than a truthiness test: the expression's
36
+ * type is fixed at build time, so a non-boolean here means the AST and the walker
37
+ * disagree, and guessing which one is right is exactly the kind of guess that makes
38
+ * a gate untrustworthy.
39
+ */
40
+ export function evaluatePredicate(node, context) {
41
+ const value = evaluateValue(node, context);
42
+ if (typeof value !== 'boolean') {
43
+ throw new EvalError(`predicate expected a boolean, got ${typeName(value)}`);
44
+ }
45
+ return value;
46
+ }
47
+ function evaluateValue(node, context) {
48
+ if (node === undefined || node === null || typeof node !== 'object') {
49
+ throw new EvalError('predicate node must be an object');
50
+ }
51
+ switch (node.kind) {
52
+ case 'string':
53
+ return literalString(node);
54
+ case 'number':
55
+ return literalNumber(node);
56
+ case 'boolean':
57
+ return literalBoolean(node);
58
+ case 'invalid':
59
+ // Unreachable through a built metric -- the build drops an invalid
60
+ // expression -- but a hand-written AST must not become a silent pass.
61
+ throw new EvalError(`invalid predicate: ${node.reason || 'unknown reason'}`);
62
+ case 'path':
63
+ return path(node, context);
64
+ case 'call':
65
+ return call(node, context);
66
+ case 'comparison':
67
+ return compare(node, context);
68
+ case 'not':
69
+ return !booleanAt(node.operand, context);
70
+ case 'and': {
71
+ const left = booleanAt(node.left, context);
72
+ const right = booleanAt(node.right, context);
73
+ return left && right;
74
+ }
75
+ case 'or': {
76
+ const left = booleanAt(node.left, context);
77
+ const right = booleanAt(node.right, context);
78
+ return left || right;
79
+ }
80
+ default:
81
+ throw new EvalError(`unknown predicate node '${String(node.kind)}'`);
82
+ }
83
+ }
84
+ function literalString(node) {
85
+ if (typeof node.value !== 'string') {
86
+ throw new EvalError(`predicate string literal must be a string, got ${typeName(node.value)}`);
87
+ }
88
+ return node.value;
89
+ }
90
+ function literalNumber(node) {
91
+ if (typeof node.value !== 'number') {
92
+ throw new EvalError(`predicate number literal must be a number, got ${typeName(node.value)}`);
93
+ }
94
+ return node.value;
95
+ }
96
+ function literalBoolean(node) {
97
+ if (typeof node.value !== 'boolean') {
98
+ throw new EvalError(`predicate boolean literal must be a boolean, got ${typeName(node.value)}`);
99
+ }
100
+ return node.value;
101
+ }
102
+ function path(node, context) {
103
+ if (node.path === 'prediction')
104
+ return context.prediction;
105
+ if (node.path === 'case.id')
106
+ return context.entry.id;
107
+ if (node.path === 'case.metadata') {
108
+ if (typeof node.name !== 'string') {
109
+ throw new EvalError('case.metadata path must name a key');
110
+ }
111
+ if (!(node.name in context.entry.metadata)) {
112
+ throw new EvalError(`unbound case.metadata key '${node.name}'`);
113
+ }
114
+ return context.entry.metadata[node.name];
115
+ }
116
+ throw new EvalError(`unknown predicate path '${node.path}'`);
117
+ }
118
+ function call(node, context) {
119
+ const values = node.args.map((arg) => evaluateValue(arg, context));
120
+ if (node.name === 'length') {
121
+ arity(node.name, values, 1);
122
+ return stringFor(node.name, values[0]).length;
123
+ }
124
+ if (node.name === 'contains' || node.name === 'startswith' || node.name === 'endswith') {
125
+ arity(node.name, values, 2);
126
+ const text = stringFor(node.name, values[0]);
127
+ const needle = stringFor(node.name, values[1]);
128
+ if (node.name === 'contains')
129
+ return text.includes(needle);
130
+ if (node.name === 'startswith')
131
+ return text.startsWith(needle);
132
+ return text.endsWith(needle);
133
+ }
134
+ throw new EvalError(`unknown predicate builtin '${node.name}'`);
135
+ }
136
+ function arity(name, values, wanted) {
137
+ if (values.length !== wanted) {
138
+ throw new EvalError(`${name}() takes ${wanted} argument(s), got ${values.length}`);
139
+ }
140
+ }
141
+ function stringFor(name, value) {
142
+ if (typeof value !== 'string') {
143
+ throw new EvalError(`${name}() requires strings, got ${typeName(value)}`);
144
+ }
145
+ return value;
146
+ }
147
+ function compare(node, context) {
148
+ const left = evaluateValue(node.left, context);
149
+ const right = evaluateValue(node.right, context);
150
+ if (ORDERING.has(node.op)) {
151
+ if (typeof left !== 'number' || typeof right !== 'number') {
152
+ throw new EvalError(`ordering comparison '${node.op}' requires two numbers, got ${typeName(left)} and ${typeName(right)}`);
153
+ }
154
+ if (node.op === '<')
155
+ return left < right;
156
+ if (node.op === '<=')
157
+ return left <= right;
158
+ if (node.op === '>')
159
+ return left > right;
160
+ return left >= right;
161
+ }
162
+ if (node.op !== '==' && node.op !== '!=') {
163
+ throw new EvalError(`unknown predicate operator '${node.op}'`);
164
+ }
165
+ if (typeName(left) !== typeName(right)) {
166
+ throw new EvalError(`type mismatch: cannot apply '${node.op}' to ${typeName(left)} and ${typeName(right)}`);
167
+ }
168
+ const equal = left === right;
169
+ return node.op === '==' ? equal : !equal;
170
+ }
171
+ function booleanAt(node, context) {
172
+ const value = evaluateValue(node, context);
173
+ if (typeof value !== 'boolean') {
174
+ throw new EvalError(`predicate expected a boolean, got ${typeName(value)}`);
175
+ }
176
+ return value;
177
+ }
178
+ //# sourceMappingURL=predicate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"predicate.js","sourceRoot":"","sources":["../../src/evals/predicate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,qIAAqI;AACrI,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AA8BzC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAEjD,qDAAqD;AACrD,MAAM,UAAU,QAAQ,CAAC,KAAqB;IAC5C,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAA+B,EAC/B,OAAkE;IAElE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CAAC,qCAAqC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAOD,SAAS,aAAa,CAAC,IAA+B,EAAE,OAAgB;IACtE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC1D,CAAC;IACD,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,QAAQ;YACX,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,SAAS;YACZ,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,SAAS;YACZ,mEAAmE;YACnE,sEAAsE;YACtE,MAAM,IAAI,SAAS,CAAC,sBAAsB,IAAI,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC,CAAC;QAC/E,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7B,KAAK,YAAY;YACf,OAAO,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAChC,KAAK,KAAK;YACR,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,KAAK,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,IAAI,IAAI,KAAK,CAAC;QACvB,CAAC;QACD,KAAK,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,IAAI,IAAI,KAAK,CAAC;QACvB,CAAC;QACD;YACE,MAAM,IAAI,SAAS,CAAC,2BAA2B,MAAM,CAAE,IAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,IAAyD;IAC9E,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,SAAS,CAAC,kDAAkD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,aAAa,CAAC,IAAyD;IAC9E,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,IAAI,SAAS,CAAC,kDAAkD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,IAA2D;IACjF,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,SAAS,CAAC,oDAAoD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,IAAI,CACX,IAA8E,EAC9E,OAAgB;IAEhB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;QAAE,OAAO,OAAO,CAAC,UAAU,CAAC;IAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QAClC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,SAAS,CAAC,8BAA8B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAW,CAAC;IACrD,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,2BAA2B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,IAAI,CACX,IAA+F,EAC/F,OAAgB;IAEhB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAmB,CAAC,CAAC,MAAM,CAAC;IAClE,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvF,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAmB,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAmB,CAAC,CAAC;QACjE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,SAAS,CAAC,8BAA8B,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,KAAK,CAAC,IAAY,EAAE,MAAiC,EAAE,MAAc;IAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,YAAY,MAAM,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAqB;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,SAAS,CAAC,GAAG,IAAI,4BAA4B,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,OAAO,CACd,IAKC,EACD,OAAgB;IAEhB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC1D,MAAM,IAAI,SAAS,CACjB,wBAAwB,IAAI,CAAC,EAAE,+BAA+B,QAAQ,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,KAAK,CAAC,EAAE,CACtG,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG;YAAE,OAAO,IAAI,GAAG,KAAK,CAAC;QACzC,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI;YAAE,OAAO,IAAI,IAAI,KAAK,CAAC;QAC3C,IAAI,IAAI,CAAC,EAAE,KAAK,GAAG;YAAE,OAAO,IAAI,GAAG,KAAK,CAAC;QACzC,OAAO,IAAI,IAAI,KAAK,CAAC;IACvB,CAAC;IACD,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,+BAA+B,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,SAAS,CACjB,gCAAgC,IAAI,CAAC,EAAE,QAAQ,QAAQ,CAAC,IAAI,CAAC,QAAQ,QAAQ,CAAC,KAAK,CAAC,EAAE,CACvF,CAAC;IACJ,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC;IAC7B,OAAO,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AAC3C,CAAC;AAED,SAAS,SAAS,CAAC,IAA+B,EAAE,OAAgB;IAClE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,SAAS,CAAC,qCAAqC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Running a dataset through a gateway, once or N times.
3
+ *
4
+ * The split with {@link import('./gate.js')} is deliberate: this module *produces*
5
+ * numbers, the gate *judges* them. Keeping them apart is what lets the sampling loop
6
+ * stay boring and the decision logic stay testable without a provider.
7
+ */
8
+ import type { ModelGateway } from '../gateway.js';
9
+ import { CompletionRequest } from '../types.js';
10
+ import type { Dataset, EvalCase } from './dataset.js';
11
+ import { EvalRun } from './gate.js';
12
+ import type { Metric, MetricResult } from './metrics.js';
13
+ /** Anything that turns a case into a prediction. */
14
+ export type Runner = (entry: EvalCase) => Promise<string>;
15
+ /** One case's prediction and its per-metric scores, for inspection. */
16
+ export declare class CaseOutcome {
17
+ readonly caseId: string;
18
+ readonly prediction: string;
19
+ readonly scores: readonly MetricResult[];
20
+ constructor(init: {
21
+ readonly caseId: string;
22
+ readonly prediction: string;
23
+ readonly scores?: readonly MetricResult[];
24
+ });
25
+ get passed(): boolean;
26
+ }
27
+ /** A single pass over a dataset, keeping per-case detail. */
28
+ export declare class DatasetRun {
29
+ readonly dataset: string;
30
+ readonly datasetVersion: string;
31
+ readonly outcomes: readonly CaseOutcome[];
32
+ constructor(init: {
33
+ readonly dataset: string;
34
+ readonly datasetVersion: string;
35
+ readonly outcomes: readonly CaseOutcome[];
36
+ });
37
+ /** Mean score per metric across the cases of this pass. */
38
+ means(): Record<string, number>;
39
+ failures(): CaseOutcome[];
40
+ outcome(caseId: string): CaseOutcome;
41
+ summary(): string;
42
+ }
43
+ export interface GatewayRunnerOptions {
44
+ readonly system?: string;
45
+ readonly temperature?: number;
46
+ readonly maxOutputTokens?: number;
47
+ /** Supply a prompt-registry-backed request instead of the default shape. */
48
+ readonly requestFor?: (entry: EvalCase) => CompletionRequest;
49
+ readonly fallbacks?: readonly string[];
50
+ }
51
+ /**
52
+ * Adapts a {@link ModelGateway} into a {@link Runner}.
53
+ *
54
+ * `requestFor` exists so a caller can supply a prompt-registry-backed request (with its
55
+ * own system message and version) instead of the default one-message-for-`case.input`
56
+ * shape. Keeping it an option rather than a subclass is enough: the only thing that
57
+ * varies is how a case becomes a request.
58
+ */
59
+ export declare class GatewayRunner {
60
+ private readonly _gateway;
61
+ private readonly _alias;
62
+ private readonly _fallbacks;
63
+ private readonly _temperature;
64
+ private readonly _maxOutputTokens;
65
+ private readonly _system;
66
+ private readonly _requestFor;
67
+ constructor(gateway: ModelGateway, alias: string, options?: GatewayRunnerOptions);
68
+ get alias(): string;
69
+ get costUsd(): number;
70
+ run(entry: EvalCase): Promise<string>;
71
+ private defaultRequest;
72
+ }
73
+ /**
74
+ * A judge call backed by the gateway, for {@link import('./metrics.js').LlmJudge}.
75
+ *
76
+ * Note what this does *not* do: it does not make the judge deterministic. It is still
77
+ * unfit for a CI threshold.
78
+ */
79
+ export declare function gatewayJudge(gateway: ModelGateway, alias: string, options?: {
80
+ readonly system?: string;
81
+ }): (prompt: string) => Promise<string>;
82
+ /** One pass over `dataset`, scoring every prediction with every metric. */
83
+ export declare function evaluateOnce(dataset: Dataset, runner: Runner, metrics: readonly Metric[]): Promise<DatasetRun>;
84
+ /**
85
+ * Sample `dataset` `runs` times, recording one mean per metric per run.
86
+ *
87
+ * Every run makes fresh calls, which is the point: the spread across runs is the
88
+ * measurement of how much this system varies when nothing has changed. Without it there
89
+ * is nothing to compare a "regression" against.
90
+ */
91
+ export declare function runEvaluation(dataset: Dataset, runner: Runner, metrics: readonly Metric[], options?: {
92
+ readonly runs?: number;
93
+ }): Promise<EvalRun>;
94
+ //# sourceMappingURL=runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/evals/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Running a dataset through a gateway, once or N times.
3
+ *
4
+ * The split with {@link import('./gate.js')} is deliberate: this module *produces*
5
+ * numbers, the gate *judges* them. Keeping them apart is what lets the sampling loop
6
+ * stay boring and the decision logic stay testable without a provider.
7
+ */
8
+ // biome-ignore lint/suspicious/noShadowRestrictedNames: the framework's own error name, matching the Python runtime's public surface
9
+ import { EvalError } from '../errors.js';
10
+ import { repr } from '../internal/json.js';
11
+ import { CompletionRequest, Message } from '../types.js';
12
+ import { EvalRun, MetricRun } from './gate.js';
13
+ /** One case's prediction and its per-metric scores, for inspection. */
14
+ export class CaseOutcome {
15
+ caseId;
16
+ prediction;
17
+ scores;
18
+ constructor(init) {
19
+ this.caseId = init.caseId;
20
+ this.prediction = init.prediction;
21
+ this.scores = init.scores ?? [];
22
+ }
23
+ get passed() {
24
+ return this.scores.every((score) => score.passed);
25
+ }
26
+ }
27
+ function mean(values) {
28
+ let total = 0;
29
+ for (const value of values)
30
+ total += value;
31
+ return total / values.length;
32
+ }
33
+ /** A single pass over a dataset, keeping per-case detail. */
34
+ export class DatasetRun {
35
+ dataset;
36
+ datasetVersion;
37
+ outcomes;
38
+ constructor(init) {
39
+ if (init.outcomes.length === 0)
40
+ throw new RangeError('a dataset run needs at least one outcome');
41
+ this.dataset = init.dataset;
42
+ this.datasetVersion = init.datasetVersion;
43
+ this.outcomes = init.outcomes;
44
+ }
45
+ /** Mean score per metric across the cases of this pass. */
46
+ means() {
47
+ const collected = new Map();
48
+ for (const outcome of this.outcomes) {
49
+ for (const score of outcome.scores) {
50
+ const bucket = collected.get(score.metric);
51
+ if (bucket === undefined)
52
+ collected.set(score.metric, [score.score]);
53
+ else
54
+ bucket.push(score.score);
55
+ }
56
+ }
57
+ const out = {};
58
+ for (const [name, values] of collected)
59
+ out[name] = mean(values);
60
+ return out;
61
+ }
62
+ failures() {
63
+ return this.outcomes.filter((outcome) => !outcome.passed);
64
+ }
65
+ outcome(caseId) {
66
+ for (const outcome of this.outcomes) {
67
+ if (outcome.caseId === caseId)
68
+ return outcome;
69
+ }
70
+ throw new EvalError(`no outcome recorded for case ${repr(caseId)}`);
71
+ }
72
+ summary() {
73
+ const failed = this.failures();
74
+ const lines = [
75
+ `${this.dataset}@${this.datasetVersion}: ${this.outcomes.length - failed.length}/${this.outcomes.length} cases passed`,
76
+ ];
77
+ for (const [name, value] of Object.entries(this.means()).sort(([a], [b]) => (a < b ? -1 : 1))) {
78
+ lines.push(` ${name}: ${value.toFixed(4)}`);
79
+ }
80
+ for (const outcome of failed) {
81
+ const detail = outcome.scores
82
+ .filter((score) => !score.passed)
83
+ .map((score) => `${score.metric}: ${score.detail}`)
84
+ .join('; ');
85
+ lines.push(` FAIL ${outcome.caseId}: ${detail}`);
86
+ }
87
+ return lines.join('\n');
88
+ }
89
+ }
90
+ /**
91
+ * Adapts a {@link ModelGateway} into a {@link Runner}.
92
+ *
93
+ * `requestFor` exists so a caller can supply a prompt-registry-backed request (with its
94
+ * own system message and version) instead of the default one-message-for-`case.input`
95
+ * shape. Keeping it an option rather than a subclass is enough: the only thing that
96
+ * varies is how a case becomes a request.
97
+ */
98
+ export class GatewayRunner {
99
+ _gateway;
100
+ _alias;
101
+ _fallbacks;
102
+ _temperature;
103
+ _maxOutputTokens;
104
+ _system;
105
+ _requestFor;
106
+ constructor(gateway, alias, options = {}) {
107
+ gateway.resolve(alias);
108
+ this._gateway = gateway;
109
+ this._alias = alias;
110
+ this._fallbacks = options.fallbacks ?? [];
111
+ this._temperature = options.temperature;
112
+ this._maxOutputTokens = options.maxOutputTokens;
113
+ this._system = options.requestFor === undefined ? options.system : undefined;
114
+ this._requestFor = options.requestFor ?? ((entry) => this.defaultRequest(entry));
115
+ }
116
+ get alias() {
117
+ return this._alias;
118
+ }
119
+ get costUsd() {
120
+ return this._gateway.ledger.costUsd;
121
+ }
122
+ async run(entry) {
123
+ const request = this._requestFor(entry);
124
+ const result = await this._gateway.generate(this._alias, request, {
125
+ fallbacks: this._fallbacks,
126
+ });
127
+ return result.text;
128
+ }
129
+ defaultRequest(entry) {
130
+ const messages = [];
131
+ if (this._system !== undefined)
132
+ messages.push(Message.system(this._system));
133
+ messages.push(Message.user(entry.input));
134
+ return new CompletionRequest({
135
+ messages,
136
+ temperature: this._temperature,
137
+ maxOutputTokens: this._maxOutputTokens,
138
+ });
139
+ }
140
+ }
141
+ /**
142
+ * A judge call backed by the gateway, for {@link import('./metrics.js').LlmJudge}.
143
+ *
144
+ * Note what this does *not* do: it does not make the judge deterministic. It is still
145
+ * unfit for a CI threshold.
146
+ */
147
+ export function gatewayJudge(gateway, alias, options = {}) {
148
+ return async (prompt) => {
149
+ const result = await gateway.generate(alias, CompletionRequest.prompt(prompt, options.system));
150
+ return result.text;
151
+ };
152
+ }
153
+ /** One pass over `dataset`, scoring every prediction with every metric. */
154
+ export async function evaluateOnce(dataset, runner, metrics) {
155
+ if (metrics.length === 0)
156
+ throw new RangeError('at least one metric is required');
157
+ const outcomes = [];
158
+ for (const entry of dataset.cases) {
159
+ const prediction = await runner(entry);
160
+ const scores = [];
161
+ for (const metric of metrics)
162
+ scores.push(await metric.score(entry, prediction));
163
+ outcomes.push(new CaseOutcome({ caseId: entry.id, prediction, scores }));
164
+ }
165
+ return new DatasetRun({
166
+ dataset: dataset.name,
167
+ datasetVersion: dataset.version,
168
+ outcomes,
169
+ });
170
+ }
171
+ /**
172
+ * Sample `dataset` `runs` times, recording one mean per metric per run.
173
+ *
174
+ * Every run makes fresh calls, which is the point: the spread across runs is the
175
+ * measurement of how much this system varies when nothing has changed. Without it there
176
+ * is nothing to compare a "regression" against.
177
+ */
178
+ export async function runEvaluation(dataset, runner, metrics, options = {}) {
179
+ const runs = options.runs ?? 5;
180
+ if (runs < 1)
181
+ throw new RangeError('runs must be at least 1');
182
+ if (metrics.length === 0)
183
+ throw new RangeError('at least one metric is required');
184
+ const collected = new Map(metrics.map((metric) => [metric.name, []]));
185
+ for (let pass = 0; pass < runs; pass += 1) {
186
+ const result = await evaluateOnce(dataset, runner, metrics);
187
+ const means = result.means();
188
+ for (const metric of metrics) {
189
+ const bucket = collected.get(metric.name);
190
+ if (bucket === undefined)
191
+ continue;
192
+ bucket.push(means[metric.name] ?? 0);
193
+ }
194
+ }
195
+ return new EvalRun({
196
+ dataset: dataset.name,
197
+ datasetVersion: dataset.version,
198
+ runs,
199
+ metrics: metrics.map((metric) => new MetricRun({ metric: metric.name, values: collected.get(metric.name) ?? [] })),
200
+ });
201
+ }
202
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/evals/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * The model gateway: alias resolution, capability negotiation, cost accounting.
3
+ *
4
+ * Three responsibilities, in this order:
5
+ *
6
+ * 1. **Pinning.** An alias resolves to an exact provider model id. Unknown aliases are
7
+ * an error; there is no fall-through to a provider default, because a provider
8
+ * default is precisely the floating version a stored eval baseline cannot survive.
9
+ * 2. **Ordered fallback.** A caller may name fallback aliases. They are tried in the
10
+ * order given, and the aliases actually attempted are reported on the result.
11
+ * Escalation routing -- "use the strong model if the cheap one is unsure" -- is
12
+ * *not* implemented: "unsure" needs an agent loop to define.
13
+ * 3. **Budgets and tracing.** Every charged call opens a GenAI span and updates the
14
+ * ledger.
15
+ */
16
+ import type { ConcurrencyLimiter } from './concurrency.js';
17
+ import { type Budget, CostLedger, type LedgerEntry } from './cost.js';
18
+ import type { Provider } from './providers/base.js';
19
+ import { type Capability, type CompletionRequest, type CompletionResponse, GenerationResult, type ModelSpec, PinnedModel, TokenUsage } from './types.js';
20
+ /** Called after every successfully charged call. */
21
+ export type CallHook = (entry: LedgerEntry) => void;
22
+ /** An alias table entry: a bare spec, or one already pinned to an alias. */
23
+ export type AliasEntry = ModelSpec | PinnedModel;
24
+ export interface ModelGatewayOptions {
25
+ readonly providers: Readonly<Record<string, Provider>>;
26
+ readonly aliases: Readonly<Record<string, AliasEntry>>;
27
+ readonly ledger?: CostLedger;
28
+ readonly budget?: Budget;
29
+ readonly onCall?: readonly CallHook[];
30
+ readonly tracerName?: string;
31
+ /**
32
+ * The application's single limiter, from `deployments.concurrency`.
33
+ *
34
+ * A gateway constructed without one is unbounded, which keeps plain request/response
35
+ * usage free of concurrency surprises. Sharing the instance with the tool executor is
36
+ * what makes "one limiter, not two" true.
37
+ */
38
+ readonly limiter?: ConcurrencyLimiter;
39
+ }
40
+ /** Resolves aliases to pinned models and executes calls within a budget. */
41
+ export declare class ModelGateway {
42
+ private readonly _providers;
43
+ private readonly _aliases;
44
+ private readonly _ledger;
45
+ private readonly _budget;
46
+ private readonly _hooks;
47
+ private readonly _tracerName;
48
+ private readonly _limiter;
49
+ constructor(options: ModelGatewayOptions);
50
+ /** The pinned aliases, sorted. */
51
+ get aliases(): string[];
52
+ get ledger(): CostLedger;
53
+ get budget(): Budget | undefined;
54
+ /** Resolve an alias to its pinned model, or fail loudly. */
55
+ resolve(alias: string): PinnedModel;
56
+ /** The adapter that serves `alias`. Raises for an unknown alias. */
57
+ providerFor(alias: string): Provider;
58
+ /**
59
+ * Assert a pinned model *and* its adapter advertise every capability.
60
+ *
61
+ * Both sides are checked: a model that supports tool calling behind an adapter that
62
+ * does not serialise tool definitions cannot tool-call.
63
+ */
64
+ require(alias: string, capabilities: Iterable<Capability>): PinnedModel;
65
+ /**
66
+ * Run one call, falling back through `fallbacks` in order.
67
+ *
68
+ * A fallback is only tried for a failure another model could plausibly survive: a
69
+ * provider error or a missing capability. A {@link BudgetExceededError} propagates
70
+ * immediately -- retrying a different model cannot make an exhausted budget
71
+ * affordable.
72
+ */
73
+ generate(alias: string, request: CompletionRequest, options?: {
74
+ readonly fallbacks?: readonly string[];
75
+ readonly budget?: Budget;
76
+ }): Promise<GenerationResult>;
77
+ /** Declared but not implemented; see the module docstring. */
78
+ stream(_alias: string, _request: CompletionRequest): Promise<never>;
79
+ close(): Promise<void>;
80
+ /**
81
+ * What this request's prompt would cost on top of what is already spent.
82
+ *
83
+ * Public because a routing decision needs the same number the preflight enforces: an
84
+ * agent stepping down a price ladder asks whether the *cheaper* alias fits before
85
+ * switching, and a second estimator would let the two disagree about the same ceiling.
86
+ */
87
+ projectedCostUsd(alias: string, request: CompletionRequest): number;
88
+ /**
89
+ * Whether this request still fits the budget. A question, never a charge.
90
+ *
91
+ * An unset ceiling always fits -- there is nothing to exceed. An *already* exceeded
92
+ * budget does not fit whatever the prompt, which is what makes a degraded agent stop
93
+ * rather than step down for every remaining step.
94
+ */
95
+ fits(alias: string, request: CompletionRequest, budget: Budget | undefined): boolean;
96
+ private attempt;
97
+ /**
98
+ * Acquire the shared concurrency slot around one provider call.
99
+ *
100
+ * The slot wraps the call, not the surrounding bookkeeping, so a cache hit or a
101
+ * refused call never consumes one, and the slot is released on completion and on
102
+ * failure alike.
103
+ */
104
+ private limit;
105
+ /**
106
+ * Refuse a call whose *prompt* alone already breaches the budget.
107
+ *
108
+ * Only the prompt is priced, and deliberately over-estimated, because the response
109
+ * is unknowable before the call. This catches gross overruns early; the post-call
110
+ * charge is what enforces the ceiling exactly.
111
+ */
112
+ private preflight;
113
+ }
114
+ /** Token estimate for a set of strings, at the usual four characters per token. */
115
+ export declare function estimateUsage(texts: string | readonly string[]): TokenUsage;
116
+ /** Re-exported so callers naming a response type do not reach across modules. */
117
+ export type { CompletionResponse };
118
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../src/gateway.ts"],"names":[],"mappings":"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"}