@kindgi/capabilities 0.1.2 → 0.1.3
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/dist/attempts.d.ts +35 -0
- package/dist/attempts.d.ts.map +1 -0
- package/dist/attempts.js +45 -0
- package/dist/attempts.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +84 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/usage.d.ts +17 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +28 -0
- package/dist/usage.js.map +1 -0
- package/package.json +10 -5
- package/src/attempts.ts +67 -0
- package/src/index.ts +4 -0
- package/src/types.ts +83 -4
- package/src/usage.ts +43 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Counts each model call's HTTP attempts, retries included, without
|
|
3
|
+
* taking over the vendor SDK's retry policy (its `Retry-After` handling,
|
|
4
|
+
* its backoff). An adapter gives its SDK client `fetch`, and runs each
|
|
5
|
+
* call inside `count`: every request the SDK sends for that call, the
|
|
6
|
+
* first and each retry, goes through `fetch` and is counted for it.
|
|
7
|
+
* Calls running at the same time are counted apart.
|
|
8
|
+
*
|
|
9
|
+
* A call that throws throws its own error, unchanged (callers may check
|
|
10
|
+
* its type or status); the attempts it took are `attemptsOf(error)`.
|
|
11
|
+
*
|
|
12
|
+
* Node only (`AsyncLocalStorage`): it's the `@kindgi/capabilities/attempts`
|
|
13
|
+
* entry, apart from the package's runtime-neutral main entry.
|
|
14
|
+
*/
|
|
15
|
+
export interface AttemptCounter {
|
|
16
|
+
/** The `fetch` the SDK client sends with: counts, then sends with `inner`. */
|
|
17
|
+
readonly fetch: typeof globalThis.fetch;
|
|
18
|
+
/** Run one call; its result, and the HTTP attempts it took. */
|
|
19
|
+
count<T>(call: () => PromiseLike<T>): Promise<{
|
|
20
|
+
readonly value: T;
|
|
21
|
+
readonly attempts: number;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* An `AttemptCounter` over `inner`. Without one, it sends with the global
|
|
26
|
+
* `fetch` as it is at each request, so a `fetch` patched after the
|
|
27
|
+
* provider was built (a test's mock, a tracer) still sees the requests.
|
|
28
|
+
*/
|
|
29
|
+
export declare function createAttemptCounter(inner?: typeof globalThis.fetch): AttemptCounter;
|
|
30
|
+
/**
|
|
31
|
+
* The HTTP attempts a counted call took before it threw `error`;
|
|
32
|
+
* `undefined` when it wasn't counted, or sent nothing.
|
|
33
|
+
*/
|
|
34
|
+
export declare function attemptsOf(error: unknown): number | undefined;
|
|
35
|
+
//# sourceMappingURL=attempts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempts.d.ts","sourceRoot":"","sources":["../src/attempts.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACxC,+DAA+D;IAC/D,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjG;AAKD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,GAAG,cAAc,CAwBpF;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE7D"}
|
package/dist/attempts.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
4
|
+
/** The attempts of counted calls that threw, by their error (`attemptsOf`). */
|
|
5
|
+
const failedAttempts = new WeakMap();
|
|
6
|
+
/**
|
|
7
|
+
* An `AttemptCounter` over `inner`. Without one, it sends with the global
|
|
8
|
+
* `fetch` as it is at each request, so a `fetch` patched after the
|
|
9
|
+
* provider was built (a test's mock, a tracer) still sees the requests.
|
|
10
|
+
*/
|
|
11
|
+
export function createAttemptCounter(inner) {
|
|
12
|
+
const calls = new AsyncLocalStorage();
|
|
13
|
+
return {
|
|
14
|
+
fetch: (input, init) => {
|
|
15
|
+
const call = calls.getStore();
|
|
16
|
+
if (call !== undefined)
|
|
17
|
+
call.attempts += 1;
|
|
18
|
+
return (inner ?? globalThis.fetch)(input, init);
|
|
19
|
+
},
|
|
20
|
+
async count(call) {
|
|
21
|
+
const state = { attempts: 0 };
|
|
22
|
+
try {
|
|
23
|
+
// Awaited inside the store: an SDK's promise can be lazy (OpenAI's
|
|
24
|
+
// `APIPromise` sends, and retries a body that stalls, only when
|
|
25
|
+
// it's awaited), and those requests are this call's too.
|
|
26
|
+
const value = await calls.run(state, async () => await call());
|
|
27
|
+
return { value, attempts: state.attempts };
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (typeof error === 'object' && error !== null && state.attempts > 0) {
|
|
31
|
+
failedAttempts.set(error, state.attempts);
|
|
32
|
+
}
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The HTTP attempts a counted call took before it threw `error`;
|
|
40
|
+
* `undefined` when it wasn't counted, or sent nothing.
|
|
41
|
+
*/
|
|
42
|
+
export function attemptsOf(error) {
|
|
43
|
+
return typeof error === 'object' && error !== null ? failedAttempts.get(error) : undefined;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=attempts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attempts.js","sourceRoot":"","sources":["../src/attempts.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAuBrD,+EAA+E;AAC/E,MAAM,cAAc,GAAG,IAAI,OAAO,EAAkB,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAA+B;IAClE,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAwB,CAAC;IAC5D,OAAO;QACL,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC;YAC3C,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;QACD,KAAK,CAAC,KAAK,CAAC,IAAI;YACd,MAAM,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,mEAAmE;gBACnE,gEAAgE;gBAChE,yDAAyD;gBACzD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBAC/D,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;YAC7C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;oBACtE,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC5C,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7F,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,9 @@ export { CAPABILITY_SCHEMA_URI, defineCapability } from './define.js';
|
|
|
4
4
|
export { createProviderRegistry } from './registry.js';
|
|
5
5
|
export { matchTuples, route } from './router.js';
|
|
6
6
|
export type { RouteInput } from './router.js';
|
|
7
|
+
export { recordModelUsage } from './usage.js';
|
|
8
|
+
export type { RecordModelUsageOptions } from './usage.js';
|
|
7
9
|
export { BUILT_IN_CAPABILITY_KINDS, DEFAULT_CAPABILITY_KIND, FEATURES } from './types.js';
|
|
8
|
-
export type { Budget, BuiltInCapabilityKind, Capability, CapabilityKind, ComparisonOp, Feature, ModelCallInput, ModelCallResult, ModelMessage, ModelInfo, ModelProvider, ModelToolCall, ModelToolDefinition, Preference, ProviderMetadata, ProviderModelPick, ProviderRegistry, RejectionReason, Requirement, RoutingDecision, StructuredOutputRequest, TenantPolicy, UpperBoundOp, UsageCounters, } from './types.js';
|
|
10
|
+
export type { Budget, BuiltInCapabilityKind, Capability, CapabilityKind, ComparisonOp, Feature, ModelCallInput, ModelUsageRecord, ModelCallResult, ModelMessage, ModelInfo, ModelProvider, ModelToolCall, ModelToolDefinition, Preference, ProviderMetadata, ProviderModelPick, ProviderRegistry, RejectionReason, Requirement, RoutingDecision, StructuredOutputRequest, TenantPolicy, UpperBoundOp, UsageCounters, UsageSink, } from './types.js';
|
|
9
11
|
export type { BudgetExceededError, CapabilityError, CapabilityUnsatisfiableError, DuplicateProviderError, InvalidCapabilityError, InvalidProviderError, } from './errors.js';
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1F,YAAY,EACV,MAAM,EACN,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,eAAe,EACf,uBAAuB,EACvB,YAAY,EACZ,YAAY,EACZ,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EACV,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1F,YAAY,EACV,MAAM,EACN,qBAAqB,EACrB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,SAAS,EACT,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,eAAe,EACf,uBAAuB,EACvB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,4BAA4B,EAC5B,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,5 +4,6 @@ export { createAdapterFactoryRegistry } from './adapter-factory.js';
|
|
|
4
4
|
export { CAPABILITY_SCHEMA_URI, defineCapability } from './define.js';
|
|
5
5
|
export { createProviderRegistry } from './registry.js';
|
|
6
6
|
export { matchTuples, route } from './router.js';
|
|
7
|
+
export { recordModelUsage } from './usage.js';
|
|
7
8
|
export { BUILT_IN_CAPABILITY_KINDS, DEFAULT_CAPABILITY_KIND, FEATURES } from './types.js';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AASpE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AASpE,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TenantId } from '@kindgi/types';
|
|
1
|
+
import type { ProjectId, RunId, TenantId } from '@kindgi/types';
|
|
2
2
|
/**
|
|
3
3
|
* The closed set of feature flags an agent can require. Matches
|
|
4
4
|
* `@kindgi/specs/capability.schema.json` FeatureRequirement enum. Providers self-
|
|
@@ -351,12 +351,27 @@ export interface ModelCallInput {
|
|
|
351
351
|
/** Cooperative cancellation. Handlers should observe. */
|
|
352
352
|
readonly abortSignal?: AbortSignal;
|
|
353
353
|
}
|
|
354
|
-
/**
|
|
354
|
+
/**
|
|
355
|
+
* A model call's token counts. `promptTokens` and `completionTokens` are
|
|
356
|
+
* the totals; the optional counts are parts of them, there when the
|
|
357
|
+
* provider reports them (a reported 0 is 0; a part it doesn't report is
|
|
358
|
+
* absent):
|
|
359
|
+
* - `cacheReadTokens` and `cacheWriteTokens` are part of `promptTokens`;
|
|
360
|
+
* - `reasoningTokens` are part of `completionTokens`.
|
|
361
|
+
* Nothing is folded away: the provider's own counts are in
|
|
362
|
+
* `ModelCallResult.rawUsage`.
|
|
363
|
+
*/
|
|
355
364
|
export interface UsageCounters {
|
|
365
|
+
/** Every input token, cache reads and writes included. */
|
|
356
366
|
readonly promptTokens: number;
|
|
367
|
+
/** Every output token, reasoning included. */
|
|
357
368
|
readonly completionTokens: number;
|
|
358
|
-
/**
|
|
359
|
-
readonly
|
|
369
|
+
/** Prompt tokens read from the provider's prompt cache. */
|
|
370
|
+
readonly cacheReadTokens?: number;
|
|
371
|
+
/** Prompt tokens written to the provider's prompt cache. */
|
|
372
|
+
readonly cacheWriteTokens?: number;
|
|
373
|
+
/** Completion tokens the model spent reasoning ("thinking"). */
|
|
374
|
+
readonly reasoningTokens?: number;
|
|
360
375
|
}
|
|
361
376
|
/**
|
|
362
377
|
* The result of a model invocation. `finishReason` matches OpenAI-style
|
|
@@ -379,6 +394,71 @@ export interface ModelCallResult {
|
|
|
379
394
|
readonly id: string;
|
|
380
395
|
readonly model: string;
|
|
381
396
|
};
|
|
397
|
+
/**
|
|
398
|
+
* The exact model version the vendor says answered. Vendors alias: a
|
|
399
|
+
* `…-pro` request can be served by `…-pro-001`.
|
|
400
|
+
*/
|
|
401
|
+
readonly servedModel?: string;
|
|
402
|
+
/** The vendor's id for the request: Anthropic's `request-id`, OpenAI's `x-request-id`, Gemini's `responseId`. */
|
|
403
|
+
readonly providerRequestId?: string;
|
|
404
|
+
/** HTTP attempts the call took, its client's own retries included. */
|
|
405
|
+
readonly attempts?: number;
|
|
406
|
+
/** The vendor's usage object, exactly as it reported it. */
|
|
407
|
+
readonly rawUsage?: Readonly<Record<string, unknown>>;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* One model call, as a usage sink records it: who made it (tenant,
|
|
411
|
+
* project, run, agent, step), which provider and model answered, and what
|
|
412
|
+
* the call used. Never the messages.
|
|
413
|
+
*/
|
|
414
|
+
export interface ModelUsageRecord {
|
|
415
|
+
/** The call's id, unique per call; its provenance node carries it too. */
|
|
416
|
+
readonly callId: string;
|
|
417
|
+
readonly tenantId: TenantId;
|
|
418
|
+
readonly projectId?: ProjectId;
|
|
419
|
+
readonly runId?: RunId;
|
|
420
|
+
readonly agentId?: string;
|
|
421
|
+
readonly agentVersion?: string;
|
|
422
|
+
readonly conversationId?: string;
|
|
423
|
+
/** The step of the run that made the call (`model-call`, `evaluate-guardrails`). */
|
|
424
|
+
readonly nodeId?: string;
|
|
425
|
+
/** The turn's step: its loop iteration. */
|
|
426
|
+
readonly step?: number;
|
|
427
|
+
/**
|
|
428
|
+
* What the call was for, when it isn't the turn's own model step:
|
|
429
|
+
* `guardrail-judge:<guardrail id>`.
|
|
430
|
+
*/
|
|
431
|
+
readonly purpose?: string;
|
|
432
|
+
readonly providerId: string;
|
|
433
|
+
/** The model of the provider invoked. */
|
|
434
|
+
readonly model: string;
|
|
435
|
+
/** The router picked a fallback provider (`ProviderMetadata.fallback`). */
|
|
436
|
+
readonly fallback?: boolean;
|
|
437
|
+
/** When the call ended (ISO 8601). */
|
|
438
|
+
readonly occurredAt: string;
|
|
439
|
+
/** `ok`: the provider answered. `failed`: the call threw. */
|
|
440
|
+
readonly status: 'ok' | 'failed';
|
|
441
|
+
/** What the answer used, and what the vendor said about it (`ok`). */
|
|
442
|
+
readonly result?: Omit<ModelCallResult, 'message'>;
|
|
443
|
+
/**
|
|
444
|
+
* Why the call failed (`failed`), and the HTTP attempts it took before
|
|
445
|
+
* it did, when they were counted (`attemptsOf`).
|
|
446
|
+
*/
|
|
447
|
+
readonly error?: {
|
|
448
|
+
readonly message: string;
|
|
449
|
+
readonly attempts?: number;
|
|
450
|
+
};
|
|
451
|
+
/** How long the call took, failed or not. */
|
|
452
|
+
readonly durationMs: number;
|
|
453
|
+
}
|
|
454
|
+
/**
|
|
455
|
+
* Where model calls are recorded: the runtime's cost ledger. The caller
|
|
456
|
+
* awaits `record` before it goes on with the answer, and a `record` that
|
|
457
|
+
* throws fails the caller: a model call isn't left unrecorded. Recording
|
|
458
|
+
* the same `callId` again changes nothing.
|
|
459
|
+
*/
|
|
460
|
+
export interface UsageSink {
|
|
461
|
+
record(call: ModelUsageRecord): Promise<void>;
|
|
382
462
|
}
|
|
383
463
|
/**
|
|
384
464
|
* A registered provider — metadata + invoke function. Registered once at
|
package/dist/types.d.ts.map
CHANGED
|
@@ -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":"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"}
|
package/dist/usage.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Result } from '@kindgi/types';
|
|
2
|
+
import type { ModelUsageRecord, UsageSink } from './types.js';
|
|
3
|
+
/** How `recordModelUsage` tries a sink that fails. */
|
|
4
|
+
export interface RecordModelUsageOptions {
|
|
5
|
+
/** Tries in all, the first included. Default 3. */
|
|
6
|
+
readonly tries?: number;
|
|
7
|
+
/** The wait before the second try; each later wait is 4× the one before. Default 50 ms. */
|
|
8
|
+
readonly backoffMs?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Record one model call in `sink`, trying again when the sink fails: a
|
|
12
|
+
* record is idempotent by `callId`, so a retry can't count a call twice.
|
|
13
|
+
* `err` carries the last failure when every try failed; the caller
|
|
14
|
+
* decides what that means for its step.
|
|
15
|
+
*/
|
|
16
|
+
export declare function recordModelUsage(sink: UsageSink, call: ModelUsageRecord, options?: RecordModelUsageOptions): Promise<Result<void, unknown>>;
|
|
17
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE9D,sDAAsD;AACtD,MAAM,WAAW,uBAAuB;IACtC,mDAAmD;IACnD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,2FAA2F;IAC3F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,gBAAgB,EACtB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAiBhC"}
|
package/dist/usage.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
/**
|
|
4
|
+
* Record one model call in `sink`, trying again when the sink fails: a
|
|
5
|
+
* record is idempotent by `callId`, so a retry can't count a call twice.
|
|
6
|
+
* `err` carries the last failure when every try failed; the caller
|
|
7
|
+
* decides what that means for its step.
|
|
8
|
+
*/
|
|
9
|
+
export async function recordModelUsage(sink, call, options = {}) {
|
|
10
|
+
const tries = Math.max(1, options.tries ?? 3);
|
|
11
|
+
let wait = options.backoffMs ?? 50;
|
|
12
|
+
let last;
|
|
13
|
+
for (let attempt = 1; attempt <= tries; attempt += 1) {
|
|
14
|
+
try {
|
|
15
|
+
await sink.record(call);
|
|
16
|
+
return { kind: 'ok', value: undefined };
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
last = error;
|
|
20
|
+
if (attempt < tries) {
|
|
21
|
+
await new Promise((resolve) => setTimeout(resolve, wait));
|
|
22
|
+
wait *= 4;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return { kind: 'err', error: last };
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAcjC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAe,EACf,IAAsB,EACtB,UAAmC,EAAE;IAErC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;IAC9C,IAAI,IAAI,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;IACnC,IAAI,IAAa,CAAC;IAClB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,KAAK,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,GAAG,KAAK,CAAC;YACb,IAAI,OAAO,GAAG,KAAK,EAAE,CAAC;gBACpB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;gBAC1D,IAAI,IAAI,CAAC,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kindgi/capabilities",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Capability declarations + provider router for Kindgi™. Agents declare what they need from a model (features such as structured-output or tool-use, context window, cost, region, latency, provider and model allow/deny lists) and what they prefer; the router picks a registered (provider, model) pair that satisfies every hard constraint plus tenant policy, ranked by soft preferences, and reports per requirement which candidates it rejected when none qualify. Also the provider-neutral ModelProvider contract, a tenant-scoped provider registry, and an adapter-factory registry. Capability kinds are open strings matched by equality; llm-inference is the default.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
"types": "./dist/index.d.ts",
|
|
21
21
|
"import": "./dist/index.js",
|
|
22
22
|
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./attempts": {
|
|
25
|
+
"types": "./dist/attempts.d.ts",
|
|
26
|
+
"import": "./dist/attempts.js",
|
|
27
|
+
"default": "./dist/attempts.js"
|
|
23
28
|
}
|
|
24
29
|
},
|
|
25
30
|
"files": [
|
|
@@ -30,12 +35,12 @@
|
|
|
30
35
|
"type-manifest.json"
|
|
31
36
|
],
|
|
32
37
|
"dependencies": {
|
|
33
|
-
"@kindgi/platform": "0.1.
|
|
34
|
-
"@kindgi/schema": "0.1.
|
|
35
|
-
"@kindgi/types": "0.1.
|
|
38
|
+
"@kindgi/platform": "0.1.3",
|
|
39
|
+
"@kindgi/schema": "0.1.3",
|
|
40
|
+
"@kindgi/types": "0.1.3"
|
|
36
41
|
},
|
|
37
42
|
"devDependencies": {
|
|
38
|
-
"@kindgi/specs": "0.1.
|
|
43
|
+
"@kindgi/specs": "0.1.3",
|
|
39
44
|
"@types/node": "^22.10.5",
|
|
40
45
|
"typescript": "^5.7.3",
|
|
41
46
|
"vitest": "^2.1.8"
|
package/src/attempts.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
|
|
4
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Counts each model call's HTTP attempts, retries included, without
|
|
8
|
+
* taking over the vendor SDK's retry policy (its `Retry-After` handling,
|
|
9
|
+
* its backoff). An adapter gives its SDK client `fetch`, and runs each
|
|
10
|
+
* call inside `count`: every request the SDK sends for that call, the
|
|
11
|
+
* first and each retry, goes through `fetch` and is counted for it.
|
|
12
|
+
* Calls running at the same time are counted apart.
|
|
13
|
+
*
|
|
14
|
+
* A call that throws throws its own error, unchanged (callers may check
|
|
15
|
+
* its type or status); the attempts it took are `attemptsOf(error)`.
|
|
16
|
+
*
|
|
17
|
+
* Node only (`AsyncLocalStorage`): it's the `@kindgi/capabilities/attempts`
|
|
18
|
+
* entry, apart from the package's runtime-neutral main entry.
|
|
19
|
+
*/
|
|
20
|
+
export interface AttemptCounter {
|
|
21
|
+
/** The `fetch` the SDK client sends with: counts, then sends with `inner`. */
|
|
22
|
+
readonly fetch: typeof globalThis.fetch;
|
|
23
|
+
/** Run one call; its result, and the HTTP attempts it took. */
|
|
24
|
+
count<T>(call: () => PromiseLike<T>): Promise<{ readonly value: T; readonly attempts: number }>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** The attempts of counted calls that threw, by their error (`attemptsOf`). */
|
|
28
|
+
const failedAttempts = new WeakMap<object, number>();
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* An `AttemptCounter` over `inner`. Without one, it sends with the global
|
|
32
|
+
* `fetch` as it is at each request, so a `fetch` patched after the
|
|
33
|
+
* provider was built (a test's mock, a tracer) still sees the requests.
|
|
34
|
+
*/
|
|
35
|
+
export function createAttemptCounter(inner?: typeof globalThis.fetch): AttemptCounter {
|
|
36
|
+
const calls = new AsyncLocalStorage<{ attempts: number }>();
|
|
37
|
+
return {
|
|
38
|
+
fetch: (input, init) => {
|
|
39
|
+
const call = calls.getStore();
|
|
40
|
+
if (call !== undefined) call.attempts += 1;
|
|
41
|
+
return (inner ?? globalThis.fetch)(input, init);
|
|
42
|
+
},
|
|
43
|
+
async count(call) {
|
|
44
|
+
const state = { attempts: 0 };
|
|
45
|
+
try {
|
|
46
|
+
// Awaited inside the store: an SDK's promise can be lazy (OpenAI's
|
|
47
|
+
// `APIPromise` sends, and retries a body that stalls, only when
|
|
48
|
+
// it's awaited), and those requests are this call's too.
|
|
49
|
+
const value = await calls.run(state, async () => await call());
|
|
50
|
+
return { value, attempts: state.attempts };
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (typeof error === 'object' && error !== null && state.attempts > 0) {
|
|
53
|
+
failedAttempts.set(error, state.attempts);
|
|
54
|
+
}
|
|
55
|
+
throw error;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The HTTP attempts a counted call took before it threw `error`;
|
|
63
|
+
* `undefined` when it wasn't counted, or sent nothing.
|
|
64
|
+
*/
|
|
65
|
+
export function attemptsOf(error: unknown): number | undefined {
|
|
66
|
+
return typeof error === 'object' && error !== null ? failedAttempts.get(error) : undefined;
|
|
67
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -14,6 +14,8 @@ export { CAPABILITY_SCHEMA_URI, defineCapability } from './define.js';
|
|
|
14
14
|
export { createProviderRegistry } from './registry.js';
|
|
15
15
|
export { matchTuples, route } from './router.js';
|
|
16
16
|
export type { RouteInput } from './router.js';
|
|
17
|
+
export { recordModelUsage } from './usage.js';
|
|
18
|
+
export type { RecordModelUsageOptions } from './usage.js';
|
|
17
19
|
export { BUILT_IN_CAPABILITY_KINDS, DEFAULT_CAPABILITY_KIND, FEATURES } from './types.js';
|
|
18
20
|
export type {
|
|
19
21
|
Budget,
|
|
@@ -23,6 +25,7 @@ export type {
|
|
|
23
25
|
ComparisonOp,
|
|
24
26
|
Feature,
|
|
25
27
|
ModelCallInput,
|
|
28
|
+
ModelUsageRecord,
|
|
26
29
|
ModelCallResult,
|
|
27
30
|
ModelMessage,
|
|
28
31
|
ModelInfo,
|
|
@@ -40,6 +43,7 @@ export type {
|
|
|
40
43
|
TenantPolicy,
|
|
41
44
|
UpperBoundOp,
|
|
42
45
|
UsageCounters,
|
|
46
|
+
UsageSink,
|
|
43
47
|
} from './types.js';
|
|
44
48
|
export type {
|
|
45
49
|
BudgetExceededError,
|
package/src/types.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
// Copyright (C) 2026 Kindgi Inc.
|
|
3
3
|
|
|
4
|
-
import type { TenantId } from '@kindgi/types';
|
|
4
|
+
import type { ProjectId, RunId, TenantId } from '@kindgi/types';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* The closed set of feature flags an agent can require. Matches
|
|
@@ -384,12 +384,27 @@ export interface ModelCallInput {
|
|
|
384
384
|
readonly abortSignal?: AbortSignal;
|
|
385
385
|
}
|
|
386
386
|
|
|
387
|
-
/**
|
|
387
|
+
/**
|
|
388
|
+
* A model call's token counts. `promptTokens` and `completionTokens` are
|
|
389
|
+
* the totals; the optional counts are parts of them, there when the
|
|
390
|
+
* provider reports them (a reported 0 is 0; a part it doesn't report is
|
|
391
|
+
* absent):
|
|
392
|
+
* - `cacheReadTokens` and `cacheWriteTokens` are part of `promptTokens`;
|
|
393
|
+
* - `reasoningTokens` are part of `completionTokens`.
|
|
394
|
+
* Nothing is folded away: the provider's own counts are in
|
|
395
|
+
* `ModelCallResult.rawUsage`.
|
|
396
|
+
*/
|
|
388
397
|
export interface UsageCounters {
|
|
398
|
+
/** Every input token, cache reads and writes included. */
|
|
389
399
|
readonly promptTokens: number;
|
|
400
|
+
/** Every output token, reasoning included. */
|
|
390
401
|
readonly completionTokens: number;
|
|
391
|
-
/**
|
|
392
|
-
readonly
|
|
402
|
+
/** Prompt tokens read from the provider's prompt cache. */
|
|
403
|
+
readonly cacheReadTokens?: number;
|
|
404
|
+
/** Prompt tokens written to the provider's prompt cache. */
|
|
405
|
+
readonly cacheWriteTokens?: number;
|
|
406
|
+
/** Completion tokens the model spent reasoning ("thinking"). */
|
|
407
|
+
readonly reasoningTokens?: number;
|
|
393
408
|
}
|
|
394
409
|
|
|
395
410
|
/**
|
|
@@ -410,6 +425,70 @@ export interface ModelCallResult {
|
|
|
410
425
|
readonly durationMs: number;
|
|
411
426
|
/** Provider + model actually invoked (in case the router picked a variant). */
|
|
412
427
|
readonly provider: { readonly id: string; readonly model: string };
|
|
428
|
+
/**
|
|
429
|
+
* The exact model version the vendor says answered. Vendors alias: a
|
|
430
|
+
* `…-pro` request can be served by `…-pro-001`.
|
|
431
|
+
*/
|
|
432
|
+
readonly servedModel?: string;
|
|
433
|
+
/** The vendor's id for the request: Anthropic's `request-id`, OpenAI's `x-request-id`, Gemini's `responseId`. */
|
|
434
|
+
readonly providerRequestId?: string;
|
|
435
|
+
/** HTTP attempts the call took, its client's own retries included. */
|
|
436
|
+
readonly attempts?: number;
|
|
437
|
+
/** The vendor's usage object, exactly as it reported it. */
|
|
438
|
+
readonly rawUsage?: Readonly<Record<string, unknown>>;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* One model call, as a usage sink records it: who made it (tenant,
|
|
443
|
+
* project, run, agent, step), which provider and model answered, and what
|
|
444
|
+
* the call used. Never the messages.
|
|
445
|
+
*/
|
|
446
|
+
export interface ModelUsageRecord {
|
|
447
|
+
/** The call's id, unique per call; its provenance node carries it too. */
|
|
448
|
+
readonly callId: string;
|
|
449
|
+
readonly tenantId: TenantId;
|
|
450
|
+
readonly projectId?: ProjectId;
|
|
451
|
+
readonly runId?: RunId;
|
|
452
|
+
readonly agentId?: string;
|
|
453
|
+
readonly agentVersion?: string;
|
|
454
|
+
readonly conversationId?: string;
|
|
455
|
+
/** The step of the run that made the call (`model-call`, `evaluate-guardrails`). */
|
|
456
|
+
readonly nodeId?: string;
|
|
457
|
+
/** The turn's step: its loop iteration. */
|
|
458
|
+
readonly step?: number;
|
|
459
|
+
/**
|
|
460
|
+
* What the call was for, when it isn't the turn's own model step:
|
|
461
|
+
* `guardrail-judge:<guardrail id>`.
|
|
462
|
+
*/
|
|
463
|
+
readonly purpose?: string;
|
|
464
|
+
readonly providerId: string;
|
|
465
|
+
/** The model of the provider invoked. */
|
|
466
|
+
readonly model: string;
|
|
467
|
+
/** The router picked a fallback provider (`ProviderMetadata.fallback`). */
|
|
468
|
+
readonly fallback?: boolean;
|
|
469
|
+
/** When the call ended (ISO 8601). */
|
|
470
|
+
readonly occurredAt: string;
|
|
471
|
+
/** `ok`: the provider answered. `failed`: the call threw. */
|
|
472
|
+
readonly status: 'ok' | 'failed';
|
|
473
|
+
/** What the answer used, and what the vendor said about it (`ok`). */
|
|
474
|
+
readonly result?: Omit<ModelCallResult, 'message'>;
|
|
475
|
+
/**
|
|
476
|
+
* Why the call failed (`failed`), and the HTTP attempts it took before
|
|
477
|
+
* it did, when they were counted (`attemptsOf`).
|
|
478
|
+
*/
|
|
479
|
+
readonly error?: { readonly message: string; readonly attempts?: number };
|
|
480
|
+
/** How long the call took, failed or not. */
|
|
481
|
+
readonly durationMs: number;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Where model calls are recorded: the runtime's cost ledger. The caller
|
|
486
|
+
* awaits `record` before it goes on with the answer, and a `record` that
|
|
487
|
+
* throws fails the caller: a model call isn't left unrecorded. Recording
|
|
488
|
+
* the same `callId` again changes nothing.
|
|
489
|
+
*/
|
|
490
|
+
export interface UsageSink {
|
|
491
|
+
record(call: ModelUsageRecord): Promise<void>;
|
|
413
492
|
}
|
|
414
493
|
|
|
415
494
|
/**
|
package/src/usage.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
// Copyright (C) 2026 Kindgi Inc.
|
|
3
|
+
|
|
4
|
+
import type { Result } from '@kindgi/types';
|
|
5
|
+
|
|
6
|
+
import type { ModelUsageRecord, UsageSink } from './types.js';
|
|
7
|
+
|
|
8
|
+
/** How `recordModelUsage` tries a sink that fails. */
|
|
9
|
+
export interface RecordModelUsageOptions {
|
|
10
|
+
/** Tries in all, the first included. Default 3. */
|
|
11
|
+
readonly tries?: number;
|
|
12
|
+
/** The wait before the second try; each later wait is 4× the one before. Default 50 ms. */
|
|
13
|
+
readonly backoffMs?: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Record one model call in `sink`, trying again when the sink fails: a
|
|
18
|
+
* record is idempotent by `callId`, so a retry can't count a call twice.
|
|
19
|
+
* `err` carries the last failure when every try failed; the caller
|
|
20
|
+
* decides what that means for its step.
|
|
21
|
+
*/
|
|
22
|
+
export async function recordModelUsage(
|
|
23
|
+
sink: UsageSink,
|
|
24
|
+
call: ModelUsageRecord,
|
|
25
|
+
options: RecordModelUsageOptions = {},
|
|
26
|
+
): Promise<Result<void, unknown>> {
|
|
27
|
+
const tries = Math.max(1, options.tries ?? 3);
|
|
28
|
+
let wait = options.backoffMs ?? 50;
|
|
29
|
+
let last: unknown;
|
|
30
|
+
for (let attempt = 1; attempt <= tries; attempt += 1) {
|
|
31
|
+
try {
|
|
32
|
+
await sink.record(call);
|
|
33
|
+
return { kind: 'ok', value: undefined };
|
|
34
|
+
} catch (error) {
|
|
35
|
+
last = error;
|
|
36
|
+
if (attempt < tries) {
|
|
37
|
+
await new Promise((resolve) => setTimeout(resolve, wait));
|
|
38
|
+
wait *= 4;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return { kind: 'err', error: last };
|
|
43
|
+
}
|