@venturekit-pro/ai 0.0.48 → 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.
Files changed (147) hide show
  1. package/README.md +192 -0
  2. package/dist/agent-loop/index.d.ts +9 -0
  3. package/dist/agent-loop/index.d.ts.map +1 -0
  4. package/dist/agent-loop/index.js +7 -0
  5. package/dist/agent-loop/index.js.map +1 -0
  6. package/dist/agent-loop/registry.d.ts +85 -0
  7. package/dist/agent-loop/registry.d.ts.map +1 -0
  8. package/dist/agent-loop/registry.js +100 -0
  9. package/dist/agent-loop/registry.js.map +1 -0
  10. package/dist/agent-loop/run-agent.d.ts +37 -0
  11. package/dist/agent-loop/run-agent.d.ts.map +1 -0
  12. package/dist/agent-loop/run-agent.js +405 -0
  13. package/dist/agent-loop/run-agent.js.map +1 -0
  14. package/dist/agent-loop/tools.d.ts +10 -0
  15. package/dist/agent-loop/tools.d.ts.map +1 -0
  16. package/dist/agent-loop/tools.js +28 -0
  17. package/dist/agent-loop/tools.js.map +1 -0
  18. package/dist/agent-loop/types.d.ts +175 -0
  19. package/dist/agent-loop/types.d.ts.map +1 -0
  20. package/dist/agent-loop/types.js +8 -0
  21. package/dist/agent-loop/types.js.map +1 -0
  22. package/dist/chat/types.d.ts +4 -2
  23. package/dist/chat/types.d.ts.map +1 -1
  24. package/dist/cost/types.d.ts +15 -0
  25. package/dist/cost/types.d.ts.map +1 -1
  26. package/dist/cost-ledger/migrations/vk_ai_cost_0004_llm_gateway.sql +69 -0
  27. package/dist/cost-ledger/migrations/vk_ai_cost_0005_harness.sql +99 -0
  28. package/dist/cost-ledger/migrations/vk_ai_cost_0006_cache_write_prices.sql +17 -0
  29. package/dist/cost-ledger/migrations/vk_ai_cost_0007_harness_fan_out.sql +47 -0
  30. package/dist/gateway/errors.d.ts +24 -0
  31. package/dist/gateway/errors.d.ts.map +1 -0
  32. package/dist/gateway/errors.js +29 -0
  33. package/dist/gateway/errors.js.map +1 -0
  34. package/dist/gateway/gateway.d.ts +27 -0
  35. package/dist/gateway/gateway.d.ts.map +1 -0
  36. package/dist/gateway/gateway.js +503 -0
  37. package/dist/gateway/gateway.js.map +1 -0
  38. package/dist/gateway/index.d.ts +13 -0
  39. package/dist/gateway/index.d.ts.map +1 -0
  40. package/dist/gateway/index.js +10 -0
  41. package/dist/gateway/index.js.map +1 -0
  42. package/dist/gateway/policies.d.ts +32 -0
  43. package/dist/gateway/policies.d.ts.map +1 -0
  44. package/dist/gateway/policies.js +45 -0
  45. package/dist/gateway/policies.js.map +1 -0
  46. package/dist/gateway/postgres.d.ts +55 -0
  47. package/dist/gateway/postgres.d.ts.map +1 -0
  48. package/dist/gateway/postgres.js +127 -0
  49. package/dist/gateway/postgres.js.map +1 -0
  50. package/dist/gateway/pricing.d.ts +11 -0
  51. package/dist/gateway/pricing.d.ts.map +1 -0
  52. package/dist/gateway/pricing.js +47 -0
  53. package/dist/gateway/pricing.js.map +1 -0
  54. package/dist/gateway/routing.d.ts +25 -0
  55. package/dist/gateway/routing.d.ts.map +1 -0
  56. package/dist/gateway/routing.js +23 -0
  57. package/dist/gateway/routing.js.map +1 -0
  58. package/dist/gateway/types.d.ts +225 -0
  59. package/dist/gateway/types.d.ts.map +1 -0
  60. package/dist/gateway/types.js +7 -0
  61. package/dist/gateway/types.js.map +1 -0
  62. package/dist/generate/anthropic.d.ts +38 -0
  63. package/dist/generate/anthropic.d.ts.map +1 -0
  64. package/dist/generate/anthropic.js +446 -0
  65. package/dist/generate/anthropic.js.map +1 -0
  66. package/dist/generate/client.d.ts +9 -0
  67. package/dist/generate/client.d.ts.map +1 -0
  68. package/dist/generate/client.js +44 -0
  69. package/dist/generate/client.js.map +1 -0
  70. package/dist/generate/google.d.ts +39 -0
  71. package/dist/generate/google.d.ts.map +1 -0
  72. package/dist/generate/google.js +372 -0
  73. package/dist/generate/google.js.map +1 -0
  74. package/dist/generate/http.d.ts +48 -0
  75. package/dist/generate/http.d.ts.map +1 -0
  76. package/dist/generate/http.js +180 -0
  77. package/dist/generate/http.js.map +1 -0
  78. package/dist/generate/index.d.ts +13 -0
  79. package/dist/generate/index.d.ts.map +1 -0
  80. package/dist/generate/index.js +12 -0
  81. package/dist/generate/index.js.map +1 -0
  82. package/dist/generate/openai.d.ts +29 -0
  83. package/dist/generate/openai.d.ts.map +1 -0
  84. package/dist/generate/openai.js +314 -0
  85. package/dist/generate/openai.js.map +1 -0
  86. package/dist/generate/perplexity.d.ts +27 -0
  87. package/dist/generate/perplexity.d.ts.map +1 -0
  88. package/dist/generate/perplexity.js +208 -0
  89. package/dist/generate/perplexity.js.map +1 -0
  90. package/dist/generate/types.d.ts +253 -0
  91. package/dist/generate/types.d.ts.map +1 -0
  92. package/dist/generate/types.js +19 -0
  93. package/dist/generate/types.js.map +1 -0
  94. package/dist/harness/define.d.ts +15 -0
  95. package/dist/harness/define.d.ts.map +1 -0
  96. package/dist/harness/define.js +38 -0
  97. package/dist/harness/define.js.map +1 -0
  98. package/dist/harness/harness.d.ts +29 -0
  99. package/dist/harness/harness.d.ts.map +1 -0
  100. package/dist/harness/harness.js +1287 -0
  101. package/dist/harness/harness.js.map +1 -0
  102. package/dist/harness/index.d.ts +14 -0
  103. package/dist/harness/index.d.ts.map +1 -0
  104. package/dist/harness/index.js +10 -0
  105. package/dist/harness/index.js.map +1 -0
  106. package/dist/harness/memory-store.d.ts +8 -0
  107. package/dist/harness/memory-store.d.ts.map +1 -0
  108. package/dist/harness/memory-store.js +270 -0
  109. package/dist/harness/memory-store.js.map +1 -0
  110. package/dist/harness/postgres-store.d.ts +12 -0
  111. package/dist/harness/postgres-store.d.ts.map +1 -0
  112. package/dist/harness/postgres-store.js +368 -0
  113. package/dist/harness/postgres-store.js.map +1 -0
  114. package/dist/harness/scheduler.d.ts +12 -0
  115. package/dist/harness/scheduler.d.ts.map +1 -0
  116. package/dist/harness/scheduler.js +23 -0
  117. package/dist/harness/scheduler.js.map +1 -0
  118. package/dist/harness/store.d.ts +172 -0
  119. package/dist/harness/store.d.ts.map +1 -0
  120. package/dist/harness/store.js +21 -0
  121. package/dist/harness/store.js.map +1 -0
  122. package/dist/harness/types.d.ts +312 -0
  123. package/dist/harness/types.d.ts.map +1 -0
  124. package/dist/harness/types.js +11 -0
  125. package/dist/harness/types.js.map +1 -0
  126. package/dist/index.d.ts +12 -0
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +11 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/model-catalog/crud.d.ts.map +1 -1
  131. package/dist/model-catalog/crud.js +33 -2
  132. package/dist/model-catalog/crud.js.map +1 -1
  133. package/dist/model-catalog/types.d.ts +20 -0
  134. package/dist/model-catalog/types.d.ts.map +1 -1
  135. package/dist/tracing/index.d.ts +68 -0
  136. package/dist/tracing/index.d.ts.map +1 -0
  137. package/dist/tracing/index.js +72 -0
  138. package/dist/tracing/index.js.map +1 -0
  139. package/dist/tracing/recording.d.ts +23 -0
  140. package/dist/tracing/recording.d.ts.map +1 -0
  141. package/dist/tracing/recording.js +49 -0
  142. package/dist/tracing/recording.js.map +1 -0
  143. package/package.json +7 -4
  144. package/src/cost-ledger/migrations/vk_ai_cost_0004_llm_gateway.sql +69 -0
  145. package/src/cost-ledger/migrations/vk_ai_cost_0005_harness.sql +99 -0
  146. package/src/cost-ledger/migrations/vk_ai_cost_0006_cache_write_prices.sql +17 -0
  147. 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"}
@@ -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
- * `chat/<provider>.ts` and a branch in `chat/client.ts:createChatClient`.
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
  *
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/chat/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D;;;;;;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"}
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"}
@@ -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
@@ -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;CACjB"}
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"}