@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,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent loop types — a provider-neutral, bounded tool-use loop on top of
|
|
3
|
+
* the gateway's `generate`: the model calls function tools (and the
|
|
4
|
+
* vendor's native web search) until it answers, or until a step, tool
|
|
5
|
+
* call, cost or time limit asks it to wrap up.
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent-loop/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/chat/types.d.ts
CHANGED
|
@@ -14,9 +14,11 @@
|
|
|
14
14
|
* The vendor whose SDK / HTTP API a chat client is wired to.
|
|
15
15
|
*
|
|
16
16
|
* Adding a value requires a corresponding adapter file under
|
|
17
|
-
* `
|
|
17
|
+
* `generate/<provider>.ts` and a branch in `generate/client.ts:createGenerateClient`
|
|
18
|
+
* (and, for the legacy single-shot client, `chat/<provider>.ts` plus a branch in
|
|
19
|
+
* `chat/client.ts:createChatClient`). `perplexity` is served by `generate` only.
|
|
18
20
|
*/
|
|
19
|
-
export type ChatProvider = 'anthropic' | 'openai' | 'google';
|
|
21
|
+
export type ChatProvider = 'anthropic' | 'openai' | 'google' | 'perplexity';
|
|
20
22
|
/**
|
|
21
23
|
* One turn in a chat completion request.
|
|
22
24
|
*
|
package/dist/chat/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,0CAA0C;IAC1C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GACxB,MAAM,GACN,QAAQ,GACR,YAAY,GACZ,gBAAgB,GAChB,OAAO,GACP,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,QAAQ,EAAE,YAAY,CAAC;IACvB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,KAAK,EAAE,cAAc,CAAC;IACtB,gGAAgG;IAChG,IAAI,EAAE,SAAS,GAAG,IAAI,CAAC;IACvB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAC;IAClB,wEAAwE;IACxE,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACvC"}
|
package/dist/cost/types.d.ts
CHANGED
|
@@ -88,5 +88,20 @@ export interface ModelDescriptor extends Partial<ChatModelPricing> {
|
|
|
88
88
|
disabledAt?: string;
|
|
89
89
|
/** Free-form tags for filtering (`['fast', 'cheap', 'multilingual']`). */
|
|
90
90
|
tags?: string[];
|
|
91
|
+
/**
|
|
92
|
+
* USD per 1K input tokens served from the provider's prompt cache. When
|
|
93
|
+
* unset, cached tokens are priced at the input rate (conservative).
|
|
94
|
+
*/
|
|
95
|
+
costPer1kCachedInputUsd?: number;
|
|
96
|
+
/**
|
|
97
|
+
* USD per 1K input tokens written to the provider's prompt cache
|
|
98
|
+
* (Anthropic 5-minute entries, OpenAI GPT-5.6+: 1.25× input). When
|
|
99
|
+
* unset, cache writes are priced at the input rate.
|
|
100
|
+
*/
|
|
101
|
+
costPer1kCacheWriteUsd?: number;
|
|
102
|
+
/** USD per 1K tokens written with a 1-hour lifetime (Anthropic: 2× input). When unset, the 5-minute write rate. */
|
|
103
|
+
costPer1kCacheWrite1hUsd?: number;
|
|
104
|
+
/** USD per 1,000 native web searches. When unset, searches are priced at $0. */
|
|
105
|
+
webSearchPer1kUsd?: number;
|
|
91
106
|
}
|
|
92
107
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/cost/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cost/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AAElE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,gBAAgB,CAAC;IAChE,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,QAAQ,EAAE,YAAY,CAAC;IACvB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,EAAE,WAAW,CAAC;IACpB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cost/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEvE;;;;;;;;;;GAUG;AACH,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AAElE;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,gBAAgB,CAAC;IAChE,sEAAsE;IACtE,GAAG,EAAE,MAAM,CAAC;IACZ,qDAAqD;IACrD,QAAQ,EAAE,YAAY,CAAC;IACvB,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,MAAM,EAAE,WAAW,CAAC;IACpB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,mHAAmH;IACnH,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B"}
|
|
@@ -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
|
+
);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A policy denied the call (no credits, model not allowed, provider
|
|
3
|
+
* switched off). When every candidate is denied, the last denial is
|
|
4
|
+
* thrown to the caller.
|
|
5
|
+
*/
|
|
6
|
+
export declare class GatewayPolicyError extends Error {
|
|
7
|
+
readonly policy: string;
|
|
8
|
+
readonly code: string;
|
|
9
|
+
readonly details?: Record<string, unknown>;
|
|
10
|
+
constructor(policy: string, code: string, message: string, details?: Record<string, unknown>);
|
|
11
|
+
}
|
|
12
|
+
/** No candidate could serve the call (unknown / disabled models, no API key). */
|
|
13
|
+
export declare class GatewayUnavailableError extends Error {
|
|
14
|
+
readonly code = "model_unavailable";
|
|
15
|
+
readonly attempts: Array<{
|
|
16
|
+
modelKey: string;
|
|
17
|
+
reason?: string;
|
|
18
|
+
}>;
|
|
19
|
+
constructor(message: string, attempts: Array<{
|
|
20
|
+
modelKey: string;
|
|
21
|
+
reason?: string;
|
|
22
|
+
}>);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/gateway/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAE/B,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAO7F;AAED,iFAAiF;AACjF,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,uBAAuB;IACpC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;gBAEpD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAKpF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A policy denied the call (no credits, model not allowed, provider
|
|
3
|
+
* switched off). When every candidate is denied, the last denial is
|
|
4
|
+
* thrown to the caller.
|
|
5
|
+
*/
|
|
6
|
+
export class GatewayPolicyError extends Error {
|
|
7
|
+
policy;
|
|
8
|
+
code;
|
|
9
|
+
details;
|
|
10
|
+
constructor(policy, code, message, details) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.name = 'GatewayPolicyError';
|
|
13
|
+
this.policy = policy;
|
|
14
|
+
this.code = code;
|
|
15
|
+
if (details !== undefined)
|
|
16
|
+
this.details = details;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** No candidate could serve the call (unknown / disabled models, no API key). */
|
|
20
|
+
export class GatewayUnavailableError extends Error {
|
|
21
|
+
code = 'model_unavailable';
|
|
22
|
+
attempts;
|
|
23
|
+
constructor(message, attempts) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'GatewayUnavailableError';
|
|
26
|
+
this.attempts = attempts;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/gateway/errors.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAClC,MAAM,CAAS;IACf,IAAI,CAAS;IACb,OAAO,CAA2B;IAE3C,YAAY,MAAc,EAAE,IAAY,EAAE,OAAe,EAAE,OAAiC;QAC1F,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACpD,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACvC,IAAI,GAAG,mBAAmB,CAAC;IAC3B,QAAQ,CAA+C;IAEhE,YAAY,OAAe,EAAE,QAAsD;QACjF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `createLlmGateway` — the one call path for text models.
|
|
3
|
+
*
|
|
4
|
+
* Per call, in order:
|
|
5
|
+
* 1. Route — `[model, ...fallbacks]`, rewritten by `route` when set
|
|
6
|
+
* (`tierRoute` maps a request's `tier` to catalog keys).
|
|
7
|
+
* 2. Resolve — catalog lookup; unknown and disabled models are skipped.
|
|
8
|
+
* 3. Policies — per candidate; a denial skips to the next candidate, a
|
|
9
|
+
* policy that itself throws denies (fail closed).
|
|
10
|
+
* 4. Credentials — a missing key skips to the next candidate.
|
|
11
|
+
* 5. Call — retries 429 / 5xx / network (`fallback/retry`), then
|
|
12
|
+
* falls back; a caller error (other 4xx) fails at once;
|
|
13
|
+
* cancellation stops everything. A fallback never reuses
|
|
14
|
+
* the primary's vendor idempotency key. A stream may retry
|
|
15
|
+
* and fall back only until its first event.
|
|
16
|
+
* 6. Record — one audit row per call (served or not) and one ledger
|
|
17
|
+
* row per billed call. Sink failures are reported, never
|
|
18
|
+
* thrown.
|
|
19
|
+
*
|
|
20
|
+
* With a `tracer`, every call is one `chat <model>` span (GenAI semantic
|
|
21
|
+
* conventions, see `../tracing`).
|
|
22
|
+
*/
|
|
23
|
+
import type { GatewayRequest, LlmCallRequestRecord, LlmGateway, LlmGatewayConfig } from './types.js';
|
|
24
|
+
export declare function createLlmGateway(config: LlmGatewayConfig): LlmGateway;
|
|
25
|
+
/** The request as the audit trail keeps it: full text, file and image bytes as size + hash. */
|
|
26
|
+
export declare function requestRecord(request: GatewayRequest): LlmCallRequestRecord;
|
|
27
|
+
//# sourceMappingURL=gateway.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/gateway/gateway.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAwBH,OAAO,KAAK,EAKV,cAAc,EAId,oBAAoB,EAEpB,UAAU,EACV,gBAAgB,EACjB,MAAM,YAAY,CAAC;AA4BpB,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CA6ZrE;AAwDD,+FAA+F;AAC/F,wBAAgB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,oBAAoB,CAsB3E"}
|