@venturekit-pro/ai 0.0.47 → 0.0.50
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/README.md +192 -0
- package/dist/agent-loop/index.d.ts +9 -0
- package/dist/agent-loop/index.d.ts.map +1 -0
- package/dist/agent-loop/index.js +7 -0
- package/dist/agent-loop/index.js.map +1 -0
- package/dist/agent-loop/registry.d.ts +85 -0
- package/dist/agent-loop/registry.d.ts.map +1 -0
- package/dist/agent-loop/registry.js +100 -0
- package/dist/agent-loop/registry.js.map +1 -0
- package/dist/agent-loop/run-agent.d.ts +37 -0
- package/dist/agent-loop/run-agent.d.ts.map +1 -0
- package/dist/agent-loop/run-agent.js +405 -0
- package/dist/agent-loop/run-agent.js.map +1 -0
- package/dist/agent-loop/tools.d.ts +10 -0
- package/dist/agent-loop/tools.d.ts.map +1 -0
- package/dist/agent-loop/tools.js +28 -0
- package/dist/agent-loop/tools.js.map +1 -0
- package/dist/agent-loop/types.d.ts +175 -0
- package/dist/agent-loop/types.d.ts.map +1 -0
- package/dist/agent-loop/types.js +8 -0
- package/dist/agent-loop/types.js.map +1 -0
- package/dist/chat/types.d.ts +4 -2
- package/dist/chat/types.d.ts.map +1 -1
- package/dist/cost/types.d.ts +15 -0
- package/dist/cost/types.d.ts.map +1 -1
- package/dist/cost-ledger/migrations/vk_ai_cost_0004_llm_gateway.sql +69 -0
- package/dist/cost-ledger/migrations/vk_ai_cost_0005_harness.sql +99 -0
- package/dist/cost-ledger/migrations/vk_ai_cost_0006_cache_write_prices.sql +17 -0
- package/dist/cost-ledger/migrations/vk_ai_cost_0007_harness_fan_out.sql +47 -0
- package/dist/gateway/errors.d.ts +24 -0
- package/dist/gateway/errors.d.ts.map +1 -0
- package/dist/gateway/errors.js +29 -0
- package/dist/gateway/errors.js.map +1 -0
- package/dist/gateway/gateway.d.ts +27 -0
- package/dist/gateway/gateway.d.ts.map +1 -0
- package/dist/gateway/gateway.js +503 -0
- package/dist/gateway/gateway.js.map +1 -0
- package/dist/gateway/index.d.ts +13 -0
- package/dist/gateway/index.d.ts.map +1 -0
- package/dist/gateway/index.js +10 -0
- package/dist/gateway/index.js.map +1 -0
- package/dist/gateway/policies.d.ts +32 -0
- package/dist/gateway/policies.d.ts.map +1 -0
- package/dist/gateway/policies.js +45 -0
- package/dist/gateway/policies.js.map +1 -0
- package/dist/gateway/postgres.d.ts +55 -0
- package/dist/gateway/postgres.d.ts.map +1 -0
- package/dist/gateway/postgres.js +127 -0
- package/dist/gateway/postgres.js.map +1 -0
- package/dist/gateway/pricing.d.ts +11 -0
- package/dist/gateway/pricing.d.ts.map +1 -0
- package/dist/gateway/pricing.js +47 -0
- package/dist/gateway/pricing.js.map +1 -0
- package/dist/gateway/routing.d.ts +25 -0
- package/dist/gateway/routing.d.ts.map +1 -0
- package/dist/gateway/routing.js +23 -0
- package/dist/gateway/routing.js.map +1 -0
- package/dist/gateway/types.d.ts +225 -0
- package/dist/gateway/types.d.ts.map +1 -0
- package/dist/gateway/types.js +7 -0
- package/dist/gateway/types.js.map +1 -0
- package/dist/generate/anthropic.d.ts +38 -0
- package/dist/generate/anthropic.d.ts.map +1 -0
- package/dist/generate/anthropic.js +446 -0
- package/dist/generate/anthropic.js.map +1 -0
- package/dist/generate/client.d.ts +9 -0
- package/dist/generate/client.d.ts.map +1 -0
- package/dist/generate/client.js +44 -0
- package/dist/generate/client.js.map +1 -0
- package/dist/generate/google.d.ts +39 -0
- package/dist/generate/google.d.ts.map +1 -0
- package/dist/generate/google.js +372 -0
- package/dist/generate/google.js.map +1 -0
- package/dist/generate/http.d.ts +48 -0
- package/dist/generate/http.d.ts.map +1 -0
- package/dist/generate/http.js +180 -0
- package/dist/generate/http.js.map +1 -0
- package/dist/generate/index.d.ts +13 -0
- package/dist/generate/index.d.ts.map +1 -0
- package/dist/generate/index.js +12 -0
- package/dist/generate/index.js.map +1 -0
- package/dist/generate/openai.d.ts +29 -0
- package/dist/generate/openai.d.ts.map +1 -0
- package/dist/generate/openai.js +314 -0
- package/dist/generate/openai.js.map +1 -0
- package/dist/generate/perplexity.d.ts +27 -0
- package/dist/generate/perplexity.d.ts.map +1 -0
- package/dist/generate/perplexity.js +208 -0
- package/dist/generate/perplexity.js.map +1 -0
- package/dist/generate/types.d.ts +253 -0
- package/dist/generate/types.d.ts.map +1 -0
- package/dist/generate/types.js +19 -0
- package/dist/generate/types.js.map +1 -0
- package/dist/harness/define.d.ts +15 -0
- package/dist/harness/define.d.ts.map +1 -0
- package/dist/harness/define.js +38 -0
- package/dist/harness/define.js.map +1 -0
- package/dist/harness/harness.d.ts +29 -0
- package/dist/harness/harness.d.ts.map +1 -0
- package/dist/harness/harness.js +1287 -0
- package/dist/harness/harness.js.map +1 -0
- package/dist/harness/index.d.ts +14 -0
- package/dist/harness/index.d.ts.map +1 -0
- package/dist/harness/index.js +10 -0
- package/dist/harness/index.js.map +1 -0
- package/dist/harness/memory-store.d.ts +8 -0
- package/dist/harness/memory-store.d.ts.map +1 -0
- package/dist/harness/memory-store.js +270 -0
- package/dist/harness/memory-store.js.map +1 -0
- package/dist/harness/postgres-store.d.ts +12 -0
- package/dist/harness/postgres-store.d.ts.map +1 -0
- package/dist/harness/postgres-store.js +368 -0
- package/dist/harness/postgres-store.js.map +1 -0
- package/dist/harness/scheduler.d.ts +12 -0
- package/dist/harness/scheduler.d.ts.map +1 -0
- package/dist/harness/scheduler.js +23 -0
- package/dist/harness/scheduler.js.map +1 -0
- package/dist/harness/store.d.ts +172 -0
- package/dist/harness/store.d.ts.map +1 -0
- package/dist/harness/store.js +21 -0
- package/dist/harness/store.js.map +1 -0
- package/dist/harness/types.d.ts +312 -0
- package/dist/harness/types.d.ts.map +1 -0
- package/dist/harness/types.js +11 -0
- package/dist/harness/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/model-catalog/crud.d.ts.map +1 -1
- package/dist/model-catalog/crud.js +33 -2
- package/dist/model-catalog/crud.js.map +1 -1
- package/dist/model-catalog/types.d.ts +20 -0
- package/dist/model-catalog/types.d.ts.map +1 -1
- package/dist/tracing/index.d.ts +68 -0
- package/dist/tracing/index.d.ts.map +1 -0
- package/dist/tracing/index.js +72 -0
- package/dist/tracing/index.js.map +1 -0
- package/dist/tracing/recording.d.ts +23 -0
- package/dist/tracing/recording.d.ts.map +1 -0
- package/dist/tracing/recording.js +49 -0
- package/dist/tracing/recording.js.map +1 -0
- package/package.json +7 -4
- package/src/cost-ledger/migrations/vk_ai_cost_0004_llm_gateway.sql +69 -0
- package/src/cost-ledger/migrations/vk_ai_cost_0005_harness.sql +99 -0
- package/src/cost-ledger/migrations/vk_ai_cost_0006_cache_write_prices.sql +17 -0
- package/src/cost-ledger/migrations/vk_ai_cost_0007_harness_fan_out.sql +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC;AAE3F,MAAM,WAAW,MAAM;IACrB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAC5D,aAAa,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAAG,OAAO,CAAC;IACrE,eAAe,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;IAC/D,GAAG,IAAI,IAAI,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,QAAQ;IACvB,eAAe,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EACjD,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,CAAC,GACJ,UAAU,CAAC,CAAC,CAAC,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,SAAkB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAIzF;AAED,eAAO,MAAM,SAAS;;;CAAsC,CAAC;AAC7D,eAAO,MAAM,WAAW;;;CAA+B,CAAC;AAExD,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAE5D;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,GAC1D,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAKlC;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,CAAC,EAC5B,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenTelemetry GenAI spans without a dependency: pass any tracer with
|
|
3
|
+
* `startActiveSpan` — an `@opentelemetry/api` `Tracer`
|
|
4
|
+
* (`trace.getTracer('venturekit-ai')`) fits as is — to the gateway, the
|
|
5
|
+
* agent loop or the harness.
|
|
6
|
+
*
|
|
7
|
+
* harness.node <graph>/<node> one per node attempt (run, step, attempt, outcome, cost)
|
|
8
|
+
* invoke_agent <name> one per `runAgent`
|
|
9
|
+
* execute_tool <tool> one per tool call
|
|
10
|
+
* chat <model> one per gateway call (retries and fallbacks inside)
|
|
11
|
+
*
|
|
12
|
+
* Model-call attributes follow the GenAI semantic conventions
|
|
13
|
+
* (`gen_ai.provider.name`, `gen_ai.request.model`, `gen_ai.usage.*` with
|
|
14
|
+
* cache reads and writes, `gen_ai.response.finish_reasons`,
|
|
15
|
+
* `gen_ai.response.time_to_first_chunk`); VentureKit's own (cost, call id,
|
|
16
|
+
* tenant, feature, fallback) are under `vk.ai.*` / `vk.harness.*`. Spans
|
|
17
|
+
* nest through the tracer's active context, so the exporter (CloudWatch /
|
|
18
|
+
* X-Ray, OTLP…) is whatever the app configured.
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* The tracer of the OpenTelemetry SDK registered in this process (the AWS
|
|
22
|
+
* Lambda Layer for OpenTelemetry registers one before the handler loads —
|
|
23
|
+
* `lambda.otel` in the VentureKit config), or `undefined` when none is.
|
|
24
|
+
*
|
|
25
|
+
* Reads the global registry `@opentelemetry/api` v1 keeps on `globalThis`
|
|
26
|
+
* rather than importing the package: nothing to install, and it works in
|
|
27
|
+
* Lambda bundles where the layer's packages can't be `import()`ed.
|
|
28
|
+
*/
|
|
29
|
+
export function otelTracer(name = 'venturekit-ai', version) {
|
|
30
|
+
const api = globalThis[Symbol.for('opentelemetry.js.api.1')];
|
|
31
|
+
return api?.trace?.getTracer(name, version);
|
|
32
|
+
}
|
|
33
|
+
export const SPAN_KIND = { INTERNAL: 0, CLIENT: 2 };
|
|
34
|
+
export const SPAN_STATUS = { OK: 1, ERROR: 2 };
|
|
35
|
+
/** GenAI `gen_ai.provider.name` for a VentureKit provider. */
|
|
36
|
+
export function genAiProvider(provider) {
|
|
37
|
+
return provider === 'google' ? 'gcp.gen_ai' : provider;
|
|
38
|
+
}
|
|
39
|
+
/** Attributes without the undefined / null values (OpenTelemetry drops them anyway). */
|
|
40
|
+
export function attributes(values) {
|
|
41
|
+
const out = {};
|
|
42
|
+
for (const [key, value] of Object.entries(values))
|
|
43
|
+
if (value !== undefined && value !== null)
|
|
44
|
+
out[key] = value;
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Run `fn` in an active span when a tracer is set (`span` is `null`
|
|
49
|
+
* otherwise). A thrown error is recorded and marks the span as failed;
|
|
50
|
+
* the span always ends.
|
|
51
|
+
*/
|
|
52
|
+
export async function inSpan(tracer, name, options, fn) {
|
|
53
|
+
if (!tracer)
|
|
54
|
+
return fn(null);
|
|
55
|
+
return tracer.startActiveSpan(name, options, async (span) => {
|
|
56
|
+
try {
|
|
57
|
+
return await fn(span);
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
span.recordException(err instanceof Error ? err : String(err));
|
|
61
|
+
span.setStatus({
|
|
62
|
+
code: SPAN_STATUS.ERROR,
|
|
63
|
+
message: err instanceof Error ? err.message : String(err),
|
|
64
|
+
});
|
|
65
|
+
throw err;
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
span.end();
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tracing/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AA4BH;;;;;;;;GAQG;AACH,MAAM,UAAU,UAAU,CAAC,IAAI,GAAG,eAAe,EAAE,OAAgB;IACjE,MAAM,GAAG,GAAI,UAAsC,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CACR,CAAC;IACjF,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,CAAyB,CAAC;AACtE,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAW,CAAC;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAExD,8DAA8D;AAC9D,MAAM,UAAU,aAAa,CAAC,QAAsB;IAClD,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC;AACzD,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,UAAU,CACxB,MAA2D;IAE3D,MAAM,GAAG,GAAqC,EAAE,CAAC;IACjD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC9D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,MAA4B,EAC5B,IAAY,EACZ,OAAsB,EACtB,EAAuC;IAEvC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;QAClE,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,WAAW,CAAC,KAAK;gBACvB,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aAC1D,CAAC,CAAC;YACH,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createRecordingTracer` — an in-memory `AiTracer` for tests and local
|
|
3
|
+
* debugging: every span with its attributes, status, exceptions and parent
|
|
4
|
+
* (spans opened while another one runs nest under it).
|
|
5
|
+
*/
|
|
6
|
+
import type { AiAttributeValue, AiTracer } from './index.js';
|
|
7
|
+
export interface RecordedSpan {
|
|
8
|
+
name: string;
|
|
9
|
+
kind: number | undefined;
|
|
10
|
+
attributes: Record<string, AiAttributeValue>;
|
|
11
|
+
status: {
|
|
12
|
+
code: number;
|
|
13
|
+
message?: string;
|
|
14
|
+
} | null;
|
|
15
|
+
exceptions: Array<Error | string>;
|
|
16
|
+
/** Name of the span this one was opened under. */
|
|
17
|
+
parent: string | null;
|
|
18
|
+
ended: boolean;
|
|
19
|
+
}
|
|
20
|
+
export declare function createRecordingTracer(): AiTracer & {
|
|
21
|
+
spans: RecordedSpan[];
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=recording.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/tracing/recording.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAyB,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC7C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClD,UAAU,EAAE,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAClC,kDAAkD;IAClD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,qBAAqB,IAAI,QAAQ,GAAG;IAAE,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,CA2C5E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createRecordingTracer` — an in-memory `AiTracer` for tests and local
|
|
3
|
+
* debugging: every span with its attributes, status, exceptions and parent
|
|
4
|
+
* (spans opened while another one runs nest under it).
|
|
5
|
+
*/
|
|
6
|
+
export function createRecordingTracer() {
|
|
7
|
+
const spans = [];
|
|
8
|
+
const active = [];
|
|
9
|
+
return {
|
|
10
|
+
spans,
|
|
11
|
+
startActiveSpan(name, options, fn) {
|
|
12
|
+
const span = {
|
|
13
|
+
name,
|
|
14
|
+
kind: options.kind,
|
|
15
|
+
attributes: { ...(options.attributes ?? {}) },
|
|
16
|
+
status: null,
|
|
17
|
+
exceptions: [],
|
|
18
|
+
parent: active[active.length - 1]?.name ?? null,
|
|
19
|
+
ended: false,
|
|
20
|
+
};
|
|
21
|
+
spans.push(span);
|
|
22
|
+
const api = {
|
|
23
|
+
setAttribute: (key, value) => void (span.attributes[key] = value),
|
|
24
|
+
setAttributes: (values) => void Object.assign(span.attributes, values),
|
|
25
|
+
recordException: (exception) => void span.exceptions.push(exception),
|
|
26
|
+
setStatus: (status) => void (span.status = status),
|
|
27
|
+
end: () => void (span.ended = true),
|
|
28
|
+
};
|
|
29
|
+
active.push(span);
|
|
30
|
+
const leave = () => {
|
|
31
|
+
const i = active.lastIndexOf(span);
|
|
32
|
+
if (i >= 0)
|
|
33
|
+
active.splice(i, 1);
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
const result = fn(api);
|
|
37
|
+
if (result instanceof Promise)
|
|
38
|
+
return result.finally(leave);
|
|
39
|
+
leave();
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
leave();
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=recording.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/tracing/recording.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,MAAM,UAAU,qBAAqB;IACnC,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,OAAO;QACL,KAAK;QACL,eAAe,CACb,IAAY,EACZ,OAAsB,EACtB,EAAK;YAEL,MAAM,IAAI,GAAiB;gBACzB,IAAI;gBACJ,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;gBAC7C,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,EAAE;gBACd,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI;gBAC/C,KAAK,EAAE,KAAK;aACb,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,MAAM,GAAG,GAAW;gBAClB,YAAY,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBACjE,aAAa,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;gBACtE,eAAe,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;gBACpE,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;gBAClD,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;aACpC,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,MAAM,KAAK,GAAG,GAAG,EAAE;gBACjB,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,CAAC,IAAI,CAAC;oBAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAClC,CAAC,CAAC;YACF,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;gBACvB,IAAI,MAAM,YAAY,OAAO;oBAAE,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAkB,CAAC;gBAC7E,KAAK,EAAE,CAAC;gBACR,OAAO,MAAuB,CAAC;YACjC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,KAAK,EAAE,CAAC;gBACR,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@venturekit-pro/ai",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "AI utilities for VentureKit - embeddings, RAG,
|
|
3
|
+
"version": "0.0.50",
|
|
4
|
+
"description": "AI utilities for VentureKit - LLM gateway, agent loop, durable harness, embeddings, RAG, chat completion, and image generation",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -34,10 +34,13 @@
|
|
|
34
34
|
"saas",
|
|
35
35
|
"ai",
|
|
36
36
|
"embeddings",
|
|
37
|
-
"rag"
|
|
37
|
+
"rag",
|
|
38
|
+
"llm-gateway",
|
|
39
|
+
"agents",
|
|
40
|
+
"harness"
|
|
38
41
|
],
|
|
39
42
|
"dependencies": {
|
|
40
|
-
"@venturekit/core": "0.0.
|
|
43
|
+
"@venturekit/core": "0.0.50"
|
|
41
44
|
},
|
|
42
45
|
"peerDependencies": {
|
|
43
46
|
"@aws-sdk/client-bedrock-runtime": "^3.0.0",
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
-- @venturekit-pro/ai — LLM gateway (SCHEMA ONLY).
|
|
2
|
+
--
|
|
3
|
+
-- 1. Two prices on the catalog the gateway needs (`src/gateway/pricing.ts`):
|
|
4
|
+
-- cost_per_1k_cached_input USD per 1K input tokens served from the
|
|
5
|
+
-- provider's prompt cache. NULL = priced at
|
|
6
|
+
-- the input rate (conservative).
|
|
7
|
+
-- web_search_per_1k USD per 1,000 native web searches
|
|
8
|
+
-- (Anthropic web search, OpenAI web_search,
|
|
9
|
+
-- Gemini grounding). NULL = $0.
|
|
10
|
+
-- Mirrors `ModelDescriptor.costPer1kCachedInputUsd` / `webSearchPer1kUsd`.
|
|
11
|
+
--
|
|
12
|
+
-- 2. `vk_llm_calls` — the gateway's audit trail: one row per call (served,
|
|
13
|
+
-- failed, denied or cancelled) with its context, every candidate tried,
|
|
14
|
+
-- policy decisions, usage, cost and the full request / response content.
|
|
15
|
+
-- File and image inputs are stored as size + SHA-256, never their bytes.
|
|
16
|
+
-- Rows carry `expires_at` (retention at write time) and are deleted by
|
|
17
|
+
-- `purgeExpiredLlmCalls()`.
|
|
18
|
+
--
|
|
19
|
+
-- The cost ledger (`vk_llm_cost_events`) stays the billing record; this
|
|
20
|
+
-- table is the "what exactly was asked and answered" record.
|
|
21
|
+
--
|
|
22
|
+
-- Idempotent: every statement is IF NOT EXISTS.
|
|
23
|
+
|
|
24
|
+
ALTER TABLE vk_llm_models
|
|
25
|
+
ADD COLUMN IF NOT EXISTS cost_per_1k_cached_input numeric(12, 8),
|
|
26
|
+
ADD COLUMN IF NOT EXISTS web_search_per_1k numeric(12, 6);
|
|
27
|
+
|
|
28
|
+
CREATE TABLE IF NOT EXISTS vk_llm_calls (
|
|
29
|
+
id uuid PRIMARY KEY,
|
|
30
|
+
tenant_id uuid,
|
|
31
|
+
feature text NOT NULL,
|
|
32
|
+
actor_type text,
|
|
33
|
+
actor_id text,
|
|
34
|
+
target_type text,
|
|
35
|
+
target_id text,
|
|
36
|
+
correlation_id text,
|
|
37
|
+
-- succeeded | failed | denied | cancelled
|
|
38
|
+
status text NOT NULL,
|
|
39
|
+
model_key text,
|
|
40
|
+
provider text,
|
|
41
|
+
model text,
|
|
42
|
+
-- platform | tenant
|
|
43
|
+
credential_source text,
|
|
44
|
+
fell_back boolean NOT NULL DEFAULT false,
|
|
45
|
+
attempts jsonb NOT NULL DEFAULT '[]'::jsonb,
|
|
46
|
+
policy_decisions jsonb NOT NULL DEFAULT '[]'::jsonb,
|
|
47
|
+
usage jsonb,
|
|
48
|
+
cost_usd numeric(12, 8),
|
|
49
|
+
cost_micro_usd bigint,
|
|
50
|
+
latency_ms integer,
|
|
51
|
+
labels jsonb NOT NULL DEFAULT '{}'::jsonb,
|
|
52
|
+
request jsonb NOT NULL,
|
|
53
|
+
response jsonb,
|
|
54
|
+
error jsonb,
|
|
55
|
+
started_at timestamptz NOT NULL,
|
|
56
|
+
finished_at timestamptz NOT NULL,
|
|
57
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
58
|
+
expires_at timestamptz NOT NULL
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
CREATE INDEX IF NOT EXISTS llm_calls_correlation_idx
|
|
62
|
+
ON vk_llm_calls (correlation_id, started_at DESC)
|
|
63
|
+
WHERE correlation_id IS NOT NULL;
|
|
64
|
+
|
|
65
|
+
CREATE INDEX IF NOT EXISTS llm_calls_tenant_started_idx
|
|
66
|
+
ON vk_llm_calls (tenant_id, started_at DESC);
|
|
67
|
+
|
|
68
|
+
CREATE INDEX IF NOT EXISTS llm_calls_expires_idx
|
|
69
|
+
ON vk_llm_calls (expires_at);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
-- @venturekit-pro/ai — harness (durable graph runs), SCHEMA ONLY.
|
|
2
|
+
--
|
|
3
|
+
-- Store behind `createPostgresHarnessStore` (src/harness/postgres-store.ts):
|
|
4
|
+
--
|
|
5
|
+
-- vk_harness_runs one row per run: graph key@version pinned at
|
|
6
|
+
-- start, status, the run context, input, every
|
|
7
|
+
-- node's output, the node to run, its step and
|
|
8
|
+
-- attempt, delays, the worker lease, cancel flag,
|
|
9
|
+
-- error, spend. `version` is the compare-and-set
|
|
10
|
+
-- token every state change checks; `event_seq`
|
|
11
|
+
-- numbers the run's events.
|
|
12
|
+
-- vk_harness_node_runs one row per node attempt (output, error, spend).
|
|
13
|
+
-- vk_harness_map_items per-item checkpoints of map nodes.
|
|
14
|
+
-- vk_harness_events append-only event log (timeline, progress,
|
|
15
|
+
-- tool calls, gates) ordered by (run_id, seq).
|
|
16
|
+
--
|
|
17
|
+
-- Statuses: queued · running · waiting · completed · failed · cancelled.
|
|
18
|
+
-- Idempotent: every statement is IF NOT EXISTS.
|
|
19
|
+
|
|
20
|
+
CREATE TABLE IF NOT EXISTS vk_harness_runs (
|
|
21
|
+
id uuid PRIMARY KEY,
|
|
22
|
+
tenant_id uuid,
|
|
23
|
+
graph_key text NOT NULL,
|
|
24
|
+
graph_version integer NOT NULL,
|
|
25
|
+
status text NOT NULL,
|
|
26
|
+
context jsonb NOT NULL DEFAULT '{}'::jsonb,
|
|
27
|
+
target_type text,
|
|
28
|
+
target_id text,
|
|
29
|
+
input jsonb,
|
|
30
|
+
outputs jsonb NOT NULL DEFAULT '{}'::jsonb,
|
|
31
|
+
current_node text,
|
|
32
|
+
step integer NOT NULL DEFAULT 1,
|
|
33
|
+
attempt integer NOT NULL DEFAULT 1,
|
|
34
|
+
attempt_base integer NOT NULL DEFAULT 0,
|
|
35
|
+
not_before timestamptz,
|
|
36
|
+
lease_until timestamptz,
|
|
37
|
+
cancel_requested boolean NOT NULL DEFAULT false,
|
|
38
|
+
error jsonb,
|
|
39
|
+
cost_usd numeric(14, 8) NOT NULL DEFAULT 0,
|
|
40
|
+
event_seq integer NOT NULL DEFAULT 0,
|
|
41
|
+
version integer NOT NULL DEFAULT 0,
|
|
42
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
43
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
44
|
+
completed_at timestamptz,
|
|
45
|
+
CONSTRAINT harness_runs_status_chk CHECK (status IN ('queued', 'running', 'waiting', 'completed', 'failed', 'cancelled'))
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
CREATE INDEX IF NOT EXISTS harness_runs_tenant_graph_idx
|
|
49
|
+
ON vk_harness_runs (tenant_id, graph_key, status, created_at DESC);
|
|
50
|
+
|
|
51
|
+
CREATE INDEX IF NOT EXISTS harness_runs_target_idx
|
|
52
|
+
ON vk_harness_runs (tenant_id, target_type, target_id)
|
|
53
|
+
WHERE target_type IS NOT NULL;
|
|
54
|
+
|
|
55
|
+
-- The sweep: queued runs (lost / due tasks) and running runs (expired leases).
|
|
56
|
+
CREATE INDEX IF NOT EXISTS harness_runs_sweep_idx
|
|
57
|
+
ON vk_harness_runs (status, updated_at)
|
|
58
|
+
WHERE status IN ('queued', 'running');
|
|
59
|
+
|
|
60
|
+
CREATE TABLE IF NOT EXISTS vk_harness_node_runs (
|
|
61
|
+
run_id uuid NOT NULL REFERENCES vk_harness_runs(id) ON DELETE CASCADE,
|
|
62
|
+
step integer NOT NULL,
|
|
63
|
+
node_id text NOT NULL,
|
|
64
|
+
attempt integer NOT NULL,
|
|
65
|
+
-- succeeded | failed | cancelled
|
|
66
|
+
status text NOT NULL,
|
|
67
|
+
started_at timestamptz NOT NULL,
|
|
68
|
+
finished_at timestamptz NOT NULL,
|
|
69
|
+
output jsonb,
|
|
70
|
+
error jsonb,
|
|
71
|
+
cost_usd numeric(14, 8) NOT NULL DEFAULT 0,
|
|
72
|
+
PRIMARY KEY (run_id, step, attempt)
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
CREATE TABLE IF NOT EXISTS vk_harness_map_items (
|
|
76
|
+
run_id uuid NOT NULL REFERENCES vk_harness_runs(id) ON DELETE CASCADE,
|
|
77
|
+
step integer NOT NULL,
|
|
78
|
+
item_index integer NOT NULL,
|
|
79
|
+
output jsonb,
|
|
80
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
81
|
+
PRIMARY KEY (run_id, step, item_index)
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
CREATE TABLE IF NOT EXISTS vk_harness_events (
|
|
85
|
+
run_id uuid NOT NULL REFERENCES vk_harness_runs(id) ON DELETE CASCADE,
|
|
86
|
+
seq integer NOT NULL,
|
|
87
|
+
at timestamptz NOT NULL DEFAULT now(),
|
|
88
|
+
type text NOT NULL,
|
|
89
|
+
node_id text,
|
|
90
|
+
step integer,
|
|
91
|
+
attempt integer,
|
|
92
|
+
label text NOT NULL,
|
|
93
|
+
detail text,
|
|
94
|
+
data jsonb,
|
|
95
|
+
PRIMARY KEY (run_id, seq)
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
CREATE INDEX IF NOT EXISTS harness_events_type_idx
|
|
99
|
+
ON vk_harness_events (run_id, type, seq DESC);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- @venturekit-pro/ai — prompt-cache write prices (SCHEMA ONLY).
|
|
2
|
+
--
|
|
3
|
+
-- Writing a prompt prefix to the provider's cache costs more than reading
|
|
4
|
+
-- plain input: Anthropic 1.25× input for 5-minute entries and 2× for
|
|
5
|
+
-- 1-hour entries, OpenAI GPT-5.6+ 1.25×. The gateway prices them
|
|
6
|
+
-- (`src/gateway/pricing.ts`) from:
|
|
7
|
+
-- cost_per_1k_cache_write USD per 1K tokens written to the cache.
|
|
8
|
+
-- NULL = priced at the input rate.
|
|
9
|
+
-- cost_per_1k_cache_write_1h USD per 1K tokens written with a 1-hour
|
|
10
|
+
-- lifetime. NULL = the write rate.
|
|
11
|
+
-- Mirrors `ModelDescriptor.costPer1kCacheWriteUsd` / `costPer1kCacheWrite1hUsd`.
|
|
12
|
+
--
|
|
13
|
+
-- Idempotent: ADD COLUMN IF NOT EXISTS.
|
|
14
|
+
|
|
15
|
+
ALTER TABLE vk_llm_models
|
|
16
|
+
ADD COLUMN IF NOT EXISTS cost_per_1k_cache_write numeric(12, 8),
|
|
17
|
+
ADD COLUMN IF NOT EXISTS cost_per_1k_cache_write_1h numeric(12, 8);
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
-- @venturekit-pro/ai — harness fan-out (SCHEMA ONLY).
|
|
2
|
+
--
|
|
3
|
+
-- A map node with `dispatch: 'tasks'` sends one queue message per item
|
|
4
|
+
-- (src/harness/harness.ts). Each item becomes a small task row of its own
|
|
5
|
+
-- in `vk_harness_map_items`:
|
|
6
|
+
-- status pending (not sent yet) · queued (its message is out)
|
|
7
|
+
-- · running (leased) · done · failed. Rows of inline maps
|
|
8
|
+
-- are `done` (the default keeps the existing rows valid).
|
|
9
|
+
-- input the item, as the node's `items()` returned it.
|
|
10
|
+
-- attempt attempts so far — never reset, so a worker left over
|
|
11
|
+
-- from an earlier node attempt can't commit.
|
|
12
|
+
-- attempt_base `attempt` when the current node attempt fanned out
|
|
13
|
+
-- (its retry budget counts from there).
|
|
14
|
+
-- lease_until the worker's lease on a running item.
|
|
15
|
+
-- not_before when a retried item is due.
|
|
16
|
+
-- error the last failure.
|
|
17
|
+
-- cost_usd model spend of the item (added to the run at the join).
|
|
18
|
+
-- and `vk_harness_map_joins` is the join counter: the item whose write
|
|
19
|
+
-- brings `done` to `total` commits the node.
|
|
20
|
+
--
|
|
21
|
+
-- Idempotent: ADD COLUMN / CREATE ... IF NOT EXISTS.
|
|
22
|
+
|
|
23
|
+
ALTER TABLE vk_harness_map_items
|
|
24
|
+
ADD COLUMN IF NOT EXISTS status text NOT NULL DEFAULT 'done',
|
|
25
|
+
ADD COLUMN IF NOT EXISTS input jsonb,
|
|
26
|
+
ADD COLUMN IF NOT EXISTS attempt integer NOT NULL DEFAULT 0,
|
|
27
|
+
ADD COLUMN IF NOT EXISTS attempt_base integer NOT NULL DEFAULT 0,
|
|
28
|
+
ADD COLUMN IF NOT EXISTS lease_until timestamptz,
|
|
29
|
+
ADD COLUMN IF NOT EXISTS not_before timestamptz,
|
|
30
|
+
ADD COLUMN IF NOT EXISTS error jsonb,
|
|
31
|
+
ADD COLUMN IF NOT EXISTS cost_usd numeric(14, 8) NOT NULL DEFAULT 0,
|
|
32
|
+
ADD COLUMN IF NOT EXISTS updated_at timestamptz NOT NULL DEFAULT now();
|
|
33
|
+
|
|
34
|
+
-- The sweep: items whose message was lost, or whose worker died.
|
|
35
|
+
CREATE INDEX IF NOT EXISTS harness_map_items_sweep_idx
|
|
36
|
+
ON vk_harness_map_items (status, updated_at)
|
|
37
|
+
WHERE status IN ('queued', 'running');
|
|
38
|
+
|
|
39
|
+
CREATE TABLE IF NOT EXISTS vk_harness_map_joins (
|
|
40
|
+
run_id uuid NOT NULL REFERENCES vk_harness_runs(id) ON DELETE CASCADE,
|
|
41
|
+
step integer NOT NULL,
|
|
42
|
+
total integer NOT NULL,
|
|
43
|
+
done integer NOT NULL DEFAULT 0,
|
|
44
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
45
|
+
updated_at timestamptz NOT NULL DEFAULT now(),
|
|
46
|
+
PRIMARY KEY (run_id, step)
|
|
47
|
+
);
|