hazo_llm_api 1.2.12 → 1.3.0

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 (204) hide show
  1. package/README.md +321 -8
  2. package/config/hazo_llm_api_config.ini +33 -0
  3. package/dist/components/index.d.ts +2 -0
  4. package/dist/components/index.d.ts.map +1 -1
  5. package/dist/components/index.js +2 -0
  6. package/dist/components/index.js.map +1 -1
  7. package/dist/components/llm_call_inspector/index.d.ts +6 -0
  8. package/dist/components/llm_call_inspector/index.d.ts.map +1 -0
  9. package/dist/components/llm_call_inspector/index.js +5 -0
  10. package/dist/components/llm_call_inspector/index.js.map +1 -0
  11. package/dist/components/llm_call_inspector/llm_call_inspector.d.ts +18 -0
  12. package/dist/components/llm_call_inspector/llm_call_inspector.d.ts.map +1 -0
  13. package/dist/components/llm_call_inspector/llm_call_inspector.js +103 -0
  14. package/dist/components/llm_call_inspector/llm_call_inspector.js.map +1 -0
  15. package/dist/components/llm_cost_dashboard/index.d.ts +6 -0
  16. package/dist/components/llm_cost_dashboard/index.d.ts.map +1 -0
  17. package/dist/components/llm_cost_dashboard/index.js +5 -0
  18. package/dist/components/llm_cost_dashboard/index.js.map +1 -0
  19. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.d.ts +16 -0
  20. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.d.ts.map +1 -0
  21. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.js +154 -0
  22. package/dist/components/llm_cost_dashboard/llm_cost_dashboard.js.map +1 -0
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/lib/cascade/cascade_runner.d.ts +50 -0
  26. package/dist/lib/cascade/cascade_runner.d.ts.map +1 -0
  27. package/dist/lib/cascade/cascade_runner.js +115 -0
  28. package/dist/lib/cascade/cascade_runner.js.map +1 -0
  29. package/dist/lib/cascade/index.d.ts +5 -0
  30. package/dist/lib/cascade/index.d.ts.map +1 -0
  31. package/dist/lib/cascade/index.js +4 -0
  32. package/dist/lib/cascade/index.js.map +1 -0
  33. package/dist/lib/cascade/types.d.ts +35 -0
  34. package/dist/lib/cascade/types.d.ts.map +1 -0
  35. package/dist/lib/cascade/types.js +14 -0
  36. package/dist/lib/cascade/types.js.map +1 -0
  37. package/dist/lib/cost_cap/cost_cap.d.ts +40 -0
  38. package/dist/lib/cost_cap/cost_cap.d.ts.map +1 -0
  39. package/dist/lib/cost_cap/cost_cap.js +150 -0
  40. package/dist/lib/cost_cap/cost_cap.js.map +1 -0
  41. package/dist/lib/cost_cap/index.d.ts +3 -0
  42. package/dist/lib/cost_cap/index.d.ts.map +1 -0
  43. package/dist/lib/cost_cap/index.js +2 -0
  44. package/dist/lib/cost_cap/index.js.map +1 -0
  45. package/dist/lib/database/init_api_log.d.ts +10 -0
  46. package/dist/lib/database/init_api_log.d.ts.map +1 -0
  47. package/dist/lib/database/init_api_log.js +91 -0
  48. package/dist/lib/database/init_api_log.js.map +1 -0
  49. package/dist/lib/hazo_connect/direct_db_connect.d.ts +11 -7
  50. package/dist/lib/hazo_connect/direct_db_connect.d.ts.map +1 -1
  51. package/dist/lib/hazo_connect/direct_db_connect.js +59 -6
  52. package/dist/lib/hazo_connect/direct_db_connect.js.map +1 -1
  53. package/dist/lib/hazo_connect/types.d.ts +35 -3
  54. package/dist/lib/hazo_connect/types.d.ts.map +1 -1
  55. package/dist/lib/llm_api/embed_cache.d.ts +15 -0
  56. package/dist/lib/llm_api/embed_cache.d.ts.map +1 -0
  57. package/dist/lib/llm_api/embed_cache.js +53 -0
  58. package/dist/lib/llm_api/embed_cache.js.map +1 -0
  59. package/dist/lib/llm_api/hazo_llm_document_text.d.ts.map +1 -1
  60. package/dist/lib/llm_api/hazo_llm_document_text.js +56 -14
  61. package/dist/lib/llm_api/hazo_llm_document_text.js.map +1 -1
  62. package/dist/lib/llm_api/hazo_llm_dynamic_data_extract.d.ts.map +1 -1
  63. package/dist/lib/llm_api/hazo_llm_dynamic_data_extract.js +19 -1
  64. package/dist/lib/llm_api/hazo_llm_dynamic_data_extract.js.map +1 -1
  65. package/dist/lib/llm_api/hazo_llm_embed.d.ts +10 -0
  66. package/dist/lib/llm_api/hazo_llm_embed.d.ts.map +1 -0
  67. package/dist/lib/llm_api/hazo_llm_embed.js +80 -0
  68. package/dist/lib/llm_api/hazo_llm_embed.js.map +1 -0
  69. package/dist/lib/llm_api/hazo_llm_image_image.d.ts.map +1 -1
  70. package/dist/lib/llm_api/hazo_llm_image_image.js +56 -14
  71. package/dist/lib/llm_api/hazo_llm_image_image.js.map +1 -1
  72. package/dist/lib/llm_api/hazo_llm_image_text.d.ts.map +1 -1
  73. package/dist/lib/llm_api/hazo_llm_image_text.js +56 -14
  74. package/dist/lib/llm_api/hazo_llm_image_text.js.map +1 -1
  75. package/dist/lib/llm_api/hazo_llm_prompt_chain.d.ts.map +1 -1
  76. package/dist/lib/llm_api/hazo_llm_prompt_chain.js +17 -1
  77. package/dist/lib/llm_api/hazo_llm_prompt_chain.js.map +1 -1
  78. package/dist/lib/llm_api/hazo_llm_text_image.d.ts.map +1 -1
  79. package/dist/lib/llm_api/hazo_llm_text_image.js +56 -14
  80. package/dist/lib/llm_api/hazo_llm_text_image.js.map +1 -1
  81. package/dist/lib/llm_api/hazo_llm_text_text.d.ts.map +1 -1
  82. package/dist/lib/llm_api/hazo_llm_text_text.js +90 -15
  83. package/dist/lib/llm_api/hazo_llm_text_text.js.map +1 -1
  84. package/dist/lib/llm_api/index.d.ts +29 -1
  85. package/dist/lib/llm_api/index.d.ts.map +1 -1
  86. package/dist/lib/llm_api/index.js +433 -6
  87. package/dist/lib/llm_api/index.js.map +1 -1
  88. package/dist/lib/llm_api/prompt_parts_helper.d.ts +15 -0
  89. package/dist/lib/llm_api/prompt_parts_helper.d.ts.map +1 -0
  90. package/dist/lib/llm_api/prompt_parts_helper.js +9 -0
  91. package/dist/lib/llm_api/prompt_parts_helper.js.map +1 -0
  92. package/dist/lib/llm_api/types.d.ts +187 -2
  93. package/dist/lib/llm_api/types.d.ts.map +1 -1
  94. package/dist/lib/llm_api/types.js +4 -0
  95. package/dist/lib/llm_api/types.js.map +1 -1
  96. package/dist/lib/maintenance/purge_log_job.d.ts +23 -0
  97. package/dist/lib/maintenance/purge_log_job.d.ts.map +1 -0
  98. package/dist/lib/maintenance/purge_log_job.js +42 -0
  99. package/dist/lib/maintenance/purge_log_job.js.map +1 -0
  100. package/dist/lib/observability/log_context.d.ts +15 -0
  101. package/dist/lib/observability/log_context.d.ts.map +1 -0
  102. package/dist/lib/observability/log_context.js +32 -0
  103. package/dist/lib/observability/log_context.js.map +1 -0
  104. package/dist/lib/observability/log_writer.d.ts +35 -0
  105. package/dist/lib/observability/log_writer.d.ts.map +1 -0
  106. package/dist/lib/observability/log_writer.js +106 -0
  107. package/dist/lib/observability/log_writer.js.map +1 -0
  108. package/dist/lib/observability/queries.d.ts +15 -0
  109. package/dist/lib/observability/queries.d.ts.map +1 -0
  110. package/dist/lib/observability/queries.js +78 -0
  111. package/dist/lib/observability/queries.js.map +1 -0
  112. package/dist/lib/observability/types.d.ts +77 -0
  113. package/dist/lib/observability/types.d.ts.map +1 -0
  114. package/dist/lib/observability/types.js +8 -0
  115. package/dist/lib/observability/types.js.map +1 -0
  116. package/dist/lib/pricing/pricing.d.ts +49 -0
  117. package/dist/lib/pricing/pricing.d.ts.map +1 -0
  118. package/dist/lib/pricing/pricing.js +153 -0
  119. package/dist/lib/pricing/pricing.js.map +1 -0
  120. package/dist/lib/pricing/pricing.json +75 -0
  121. package/dist/lib/pricing/types.d.ts +58 -0
  122. package/dist/lib/pricing/types.d.ts.map +1 -0
  123. package/dist/lib/pricing/types.js +8 -0
  124. package/dist/lib/pricing/types.js.map +1 -0
  125. package/dist/lib/providers/anthropic/anthropic_client.d.ts +71 -0
  126. package/dist/lib/providers/anthropic/anthropic_client.d.ts.map +1 -0
  127. package/dist/lib/providers/anthropic/anthropic_client.js +134 -0
  128. package/dist/lib/providers/anthropic/anthropic_client.js.map +1 -0
  129. package/dist/lib/providers/anthropic/anthropic_provider.d.ts +60 -0
  130. package/dist/lib/providers/anthropic/anthropic_provider.d.ts.map +1 -0
  131. package/dist/lib/providers/anthropic/anthropic_provider.js +273 -0
  132. package/dist/lib/providers/anthropic/anthropic_provider.js.map +1 -0
  133. package/dist/lib/providers/anthropic/anthropic_response_to_usage.d.ts +21 -0
  134. package/dist/lib/providers/anthropic/anthropic_response_to_usage.d.ts.map +1 -0
  135. package/dist/lib/providers/anthropic/anthropic_response_to_usage.js +46 -0
  136. package/dist/lib/providers/anthropic/anthropic_response_to_usage.js.map +1 -0
  137. package/dist/lib/providers/anthropic/index.d.ts +3 -0
  138. package/dist/lib/providers/anthropic/index.d.ts.map +1 -0
  139. package/dist/lib/providers/anthropic/index.js +2 -0
  140. package/dist/lib/providers/anthropic/index.js.map +1 -0
  141. package/dist/lib/providers/deepseek/deepseek_client.d.ts +55 -0
  142. package/dist/lib/providers/deepseek/deepseek_client.d.ts.map +1 -0
  143. package/dist/lib/providers/deepseek/deepseek_client.js +129 -0
  144. package/dist/lib/providers/deepseek/deepseek_client.js.map +1 -0
  145. package/dist/lib/providers/deepseek/deepseek_provider.d.ts +50 -0
  146. package/dist/lib/providers/deepseek/deepseek_provider.d.ts.map +1 -0
  147. package/dist/lib/providers/deepseek/deepseek_provider.js +147 -0
  148. package/dist/lib/providers/deepseek/deepseek_provider.js.map +1 -0
  149. package/dist/lib/providers/deepseek/deepseek_response_to_usage.d.ts +21 -0
  150. package/dist/lib/providers/deepseek/deepseek_response_to_usage.d.ts.map +1 -0
  151. package/dist/lib/providers/deepseek/deepseek_response_to_usage.js +40 -0
  152. package/dist/lib/providers/deepseek/deepseek_response_to_usage.js.map +1 -0
  153. package/dist/lib/providers/deepseek/index.d.ts +3 -0
  154. package/dist/lib/providers/deepseek/index.d.ts.map +1 -0
  155. package/dist/lib/providers/deepseek/index.js +2 -0
  156. package/dist/lib/providers/deepseek/index.js.map +1 -0
  157. package/dist/lib/providers/gemini/gemini_provider.d.ts.map +1 -1
  158. package/dist/lib/providers/gemini/gemini_provider.js +40 -4
  159. package/dist/lib/providers/gemini/gemini_provider.js.map +1 -1
  160. package/dist/lib/providers/gemini/gemini_response_to_usage.d.ts +37 -0
  161. package/dist/lib/providers/gemini/gemini_response_to_usage.d.ts.map +1 -0
  162. package/dist/lib/providers/gemini/gemini_response_to_usage.js +49 -0
  163. package/dist/lib/providers/gemini/gemini_response_to_usage.js.map +1 -0
  164. package/dist/lib/providers/index.d.ts +3 -0
  165. package/dist/lib/providers/index.d.ts.map +1 -1
  166. package/dist/lib/providers/index.js +3 -0
  167. package/dist/lib/providers/index.js.map +1 -1
  168. package/dist/lib/providers/openai/index.d.ts +3 -0
  169. package/dist/lib/providers/openai/index.d.ts.map +1 -0
  170. package/dist/lib/providers/openai/index.js +2 -0
  171. package/dist/lib/providers/openai/index.js.map +1 -0
  172. package/dist/lib/providers/openai/openai_client.d.ts +99 -0
  173. package/dist/lib/providers/openai/openai_client.d.ts.map +1 -0
  174. package/dist/lib/providers/openai/openai_client.js +187 -0
  175. package/dist/lib/providers/openai/openai_client.js.map +1 -0
  176. package/dist/lib/providers/openai/openai_provider.d.ts +66 -0
  177. package/dist/lib/providers/openai/openai_provider.d.ts.map +1 -0
  178. package/dist/lib/providers/openai/openai_provider.js +297 -0
  179. package/dist/lib/providers/openai/openai_provider.js.map +1 -0
  180. package/dist/lib/providers/openai/openai_response_to_usage.d.ts +21 -0
  181. package/dist/lib/providers/openai/openai_response_to_usage.d.ts.map +1 -0
  182. package/dist/lib/providers/openai/openai_response_to_usage.js +50 -0
  183. package/dist/lib/providers/openai/openai_response_to_usage.js.map +1 -0
  184. package/dist/lib/providers/qwen/qwen_provider.d.ts.map +1 -1
  185. package/dist/lib/providers/qwen/qwen_provider.js +52 -5
  186. package/dist/lib/providers/qwen/qwen_provider.js.map +1 -1
  187. package/dist/lib/providers/qwen/qwen_response_to_usage.d.ts +36 -0
  188. package/dist/lib/providers/qwen/qwen_response_to_usage.d.ts.map +1 -0
  189. package/dist/lib/providers/qwen/qwen_response_to_usage.js +50 -0
  190. package/dist/lib/providers/qwen/qwen_response_to_usage.js.map +1 -0
  191. package/dist/lib/providers/types.d.ts +16 -6
  192. package/dist/lib/providers/types.d.ts.map +1 -1
  193. package/dist/lib/providers/types.js +1 -0
  194. package/dist/lib/providers/types.js.map +1 -1
  195. package/dist/lib/utils.d.ts +13 -0
  196. package/dist/lib/utils.d.ts.map +1 -0
  197. package/dist/lib/utils.js +16 -0
  198. package/dist/lib/utils.js.map +1 -0
  199. package/dist/server.d.ts +16 -2
  200. package/dist/server.d.ts.map +1 -1
  201. package/dist/server.js +29 -2
  202. package/dist/server.js.map +1 -1
  203. package/migrations/hazo_llm_api_log.sql +69 -0
  204. package/package.json +26 -11
@@ -0,0 +1,154 @@
1
+ /**
2
+ * LLMCostDashboard Component
3
+ *
4
+ * Displays aggregated LLM usage and cost data.
5
+ * Framework-agnostic: accepts a fetch_summary prop instead of accessing
6
+ * the database directly.
7
+ */
8
+ 'use client';
9
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
10
+ import { useState, useEffect, useCallback } from 'react';
11
+ import { cn } from '../../lib/utils.js';
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+ function fmt_cost(value) {
16
+ if (value == null)
17
+ return '$0.0000';
18
+ return `$${Number(value).toFixed(4)}`;
19
+ }
20
+ function fmt_latency(value) {
21
+ if (value == null)
22
+ return '—';
23
+ return `${Math.round(Number(value))} ms`;
24
+ }
25
+ function fmt_number(value) {
26
+ if (value == null)
27
+ return '—';
28
+ return Number(value).toLocaleString();
29
+ }
30
+ /** Return today's date as YYYY-MM-DD */
31
+ function today_str() {
32
+ return new Date().toISOString().slice(0, 10);
33
+ }
34
+ /** Return the date 30 days ago as YYYY-MM-DD */
35
+ function thirty_days_ago_str() {
36
+ const d = new Date();
37
+ d.setDate(d.getDate() - 30);
38
+ return d.toISOString().slice(0, 10);
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Group-by options shown in the select control
42
+ // ---------------------------------------------------------------------------
43
+ const GROUP_BY_OPTIONS = [
44
+ { value: 'date', label: 'Date' },
45
+ { value: 'provider', label: 'Provider' },
46
+ { value: 'model', label: 'Model' },
47
+ { value: 'service_type', label: 'Service Type' },
48
+ ];
49
+ // ---------------------------------------------------------------------------
50
+ // Component
51
+ // ---------------------------------------------------------------------------
52
+ export function LLMCostDashboard({ fetch_summary, className }) {
53
+ const [loading, set_loading] = useState(false);
54
+ const [error, set_error] = useState(null);
55
+ const [response, set_response] = useState(null);
56
+ // Filter state
57
+ const [group_by, set_group_by] = useState('date');
58
+ const [from, set_from] = useState(thirty_days_ago_str);
59
+ const [to, set_to] = useState(today_str);
60
+ // Pending filter state (used before "Apply Filters" is clicked)
61
+ const [pending_group_by, set_pending_group_by] = useState('date');
62
+ const [pending_from, set_pending_from] = useState(thirty_days_ago_str);
63
+ const [pending_to, set_pending_to] = useState(today_str);
64
+ const fetch_data = useCallback(async (opts) => {
65
+ set_loading(true);
66
+ set_error(null);
67
+ try {
68
+ const result = await fetch_summary({
69
+ from: opts.from,
70
+ to: opts.to,
71
+ group_by: [opts.group_by],
72
+ });
73
+ set_response(result);
74
+ }
75
+ catch (err) {
76
+ set_error(err instanceof Error ? err.message : 'Failed to fetch data');
77
+ }
78
+ finally {
79
+ set_loading(false);
80
+ }
81
+ }, [fetch_summary]);
82
+ // Auto-fetch on mount
83
+ useEffect(() => {
84
+ fetch_data({ from, to, group_by });
85
+ // eslint-disable-next-line react-hooks/exhaustive-deps
86
+ }, [fetch_data]); // fetch_data is memoized via useCallback; re-runs only if fetch_summary changes
87
+ function handle_apply() {
88
+ set_from(pending_from);
89
+ set_to(pending_to);
90
+ set_group_by(pending_group_by);
91
+ fetch_data({ from: pending_from, to: pending_to, group_by: pending_group_by });
92
+ }
93
+ function handle_refresh() {
94
+ fetch_data({ from, to, group_by });
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Chart (only when group_by === 'date')
98
+ // ---------------------------------------------------------------------------
99
+ const show_chart = group_by === 'date' && response !== null && response.rows.length > 0;
100
+ // Build simple inline SVG line chart — hazo_ui LineChart is a peer dep we
101
+ // cannot guarantee is available at this layer, so we render a minimal inline
102
+ // chart to avoid import errors at build time.
103
+ function render_inline_chart() {
104
+ if (!show_chart || !response)
105
+ return null;
106
+ const rows = response.rows;
107
+ const values = rows.map((r) => Number(r['total_cost_usd']) || 0);
108
+ const max_val = Math.max(...values, 0.0001);
109
+ const width = 600;
110
+ const height = 160;
111
+ const pad = 32;
112
+ const inner_w = width - pad * 2;
113
+ const inner_h = height - pad * 2;
114
+ const step = values.length > 1 ? inner_w / (values.length - 1) : inner_w;
115
+ const points = values.map((v, i) => {
116
+ const x = pad + (values.length > 1 ? i * step : inner_w / 2);
117
+ const y = pad + inner_h - (v / max_val) * inner_h;
118
+ return `${x},${y}`;
119
+ });
120
+ return (_jsxs("div", { className: "cls_cost_chart_wrapper mb-6 rounded-lg border border-gray-200 bg-white p-4", children: [_jsx("p", { className: "cls_chart_label mb-2 text-sm font-medium text-gray-600", children: "Total Cost (USD)" }), _jsxs("svg", { viewBox: `0 0 ${width} ${height}`, className: "cls_chart_svg w-full", style: { height: height }, "aria-label": "Total cost over time", role: "img", children: [[0, 0.25, 0.5, 0.75, 1].map((frac) => {
121
+ const y = pad + frac * inner_h;
122
+ return (_jsx("line", { x1: pad, y1: y, x2: pad + inner_w, y2: y, stroke: "#e5e7eb", strokeWidth: "1" }, frac));
123
+ }), values.length > 1 && (_jsx("polyline", { points: points.join(' '), fill: "none", stroke: "#6366f1", strokeWidth: "2", strokeLinejoin: "round", strokeLinecap: "round" })), points.map((pt, i) => {
124
+ const [x, y] = pt.split(',').map(Number);
125
+ return (_jsx("circle", { cx: x, cy: y, r: "3", fill: "#6366f1" }, i));
126
+ })] })] }));
127
+ }
128
+ // ---------------------------------------------------------------------------
129
+ // Table column definitions
130
+ // ---------------------------------------------------------------------------
131
+ function get_group_col_label() {
132
+ switch (group_by) {
133
+ case 'date': return 'Date';
134
+ case 'provider': return 'Provider';
135
+ case 'model': return 'Model';
136
+ case 'service_type': return 'Service Type';
137
+ case 'session_id': return 'Session ID';
138
+ case 'reference': return 'Reference';
139
+ default: return String(group_by);
140
+ }
141
+ }
142
+ function get_group_col_key() {
143
+ return group_by;
144
+ }
145
+ // ---------------------------------------------------------------------------
146
+ // Render
147
+ // ---------------------------------------------------------------------------
148
+ const rows = response?.rows ?? [];
149
+ const totals = response?.totals;
150
+ return (_jsxs("div", { className: cn('cls_llm_cost_dashboard', className), children: [_jsxs("div", { className: "cls_dashboard_header mb-4 flex items-center justify-between", children: [_jsx("h2", { className: "text-xl font-semibold text-gray-900", children: "LLM Cost Dashboard" }), _jsx("button", { type: "button", onClick: handle_refresh, disabled: loading, className: "cls_refresh_btn inline-flex items-center rounded-md border border-gray-300 bg-white px-3 py-1.5 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50", children: loading ? 'Loading...' : 'Refresh' })] }), _jsxs("div", { className: "cls_filter_bar mb-6 flex flex-wrap items-center gap-3 rounded-lg border border-gray-200 bg-gray-50 px-4 py-3", children: [_jsxs("div", { className: "cls_filter_dates flex items-center gap-2", children: [_jsx("label", { className: "text-sm text-gray-600", htmlFor: "cls_from_date", children: "From" }), _jsx("input", { id: "cls_from_date", type: "date", value: pending_from, onChange: (e) => set_pending_from(e.target.value), className: "cls_date_input rounded border border-gray-300 px-2 py-1 text-sm" }), _jsx("label", { className: "text-sm text-gray-600", htmlFor: "cls_to_date", children: "To" }), _jsx("input", { id: "cls_to_date", type: "date", value: pending_to, onChange: (e) => set_pending_to(e.target.value), className: "cls_date_input rounded border border-gray-300 px-2 py-1 text-sm" })] }), _jsxs("div", { className: "cls_filter_groupby flex items-center gap-2", children: [_jsx("label", { className: "text-sm text-gray-600", htmlFor: "cls_group_by_select", children: "Group by" }), _jsx("select", { id: "cls_group_by_select", value: pending_group_by, onChange: (e) => set_pending_group_by(e.target.value), className: "cls_groupby_select rounded border border-gray-300 px-2 py-1 text-sm", children: GROUP_BY_OPTIONS.map((opt) => (_jsx("option", { value: opt.value, children: opt.label }, opt.value))) })] }), _jsx("button", { type: "button", onClick: handle_apply, disabled: loading, className: "cls_apply_btn rounded-md bg-indigo-600 px-3 py-1.5 text-sm font-medium text-white hover:bg-indigo-700 disabled:cursor-not-allowed disabled:opacity-50", children: "Apply Filters" })] }), error && (_jsx("div", { className: "cls_error_msg mb-4 rounded-md border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700", children: error })), loading && (_jsx("div", { className: "cls_loading_msg py-8 text-center text-sm text-gray-500", children: "Loading..." })), !loading && response !== null && (_jsxs(_Fragment, { children: [render_inline_chart(), rows.length === 0 ? (_jsx("div", { className: "cls_empty_msg py-8 text-center text-sm text-gray-500", children: "No data" })) : (
151
+ /* Summary table */
152
+ _jsx("div", { className: "cls_summary_table_wrapper overflow-x-auto rounded-lg border border-gray-200", children: _jsxs("table", { className: "cls_summary_table w-full text-sm", children: [_jsx("thead", { children: _jsxs("tr", { className: "border-b border-gray-200 bg-gray-50", children: [_jsx("th", { className: "cls_th px-4 py-3 text-left font-medium text-gray-700", children: get_group_col_label() }), _jsx("th", { className: "cls_th px-4 py-3 text-right font-medium text-gray-700", children: "Count" }), _jsx("th", { className: "cls_th px-4 py-3 text-right font-medium text-gray-700", children: "Total Cost (USD)" }), _jsx("th", { className: "cls_th px-4 py-3 text-right font-medium text-gray-700", children: "Input Tokens" }), _jsx("th", { className: "cls_th px-4 py-3 text-right font-medium text-gray-700", children: "Output Tokens" }), _jsx("th", { className: "cls_th px-4 py-3 text-right font-medium text-gray-700", children: "Avg Latency" })] }) }), _jsx("tbody", { children: rows.map((row, idx) => (_jsxs("tr", { className: cn('cls_data_row border-b border-gray-100', idx % 2 === 0 ? 'bg-white' : 'bg-gray-50/50'), children: [_jsx("td", { className: "cls_td px-4 py-2.5 text-gray-900", children: String(row[get_group_col_key()] ?? '—') }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-700", children: fmt_number(row['count']) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-700", children: fmt_cost(row['total_cost_usd']) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-700", children: fmt_number(row['total_tokens_input']) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-700", children: fmt_number(row['total_tokens_output']) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-700", children: fmt_latency(row['avg_latency_ms']) })] }, idx))) }), totals && (_jsx("tfoot", { children: _jsxs("tr", { className: "cls_totals_row border-t-2 border-gray-300 bg-gray-100 font-medium", children: [_jsx("td", { className: "cls_td px-4 py-2.5 text-gray-900", children: "Totals" }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-900", children: fmt_number(totals.count) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-900", children: fmt_cost(totals.total_cost_usd) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-900", children: fmt_number(totals.total_tokens_input) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right tabular-nums text-gray-900", children: fmt_number(totals.total_tokens_output) }), _jsx("td", { className: "cls_td px-4 py-2.5 text-right text-gray-400", children: "\u2014" })] }) }))] }) }))] }))] }));
153
+ }
154
+ //# sourceMappingURL=llm_cost_dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm_cost_dashboard.js","sourceRoot":"","sources":["../../../src/components/llm_cost_dashboard/llm_cost_dashboard.tsx"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,5 +13,6 @@ export { LLM_PROVIDERS, SERVICE_TYPES } from './lib/providers/types.js';
13
13
  export type { ProviderName, ServiceType } from './lib/providers/types.js';
14
14
  export { LLM_ERROR_CODES } from './lib/llm_api/types.js';
15
15
  export type { LLMErrorCode, LLMError } from './lib/llm_api/types.js';
16
- export type { LLMApiConfig, LLMApiClient, CallLLMParams, LLMResponse, Logger, PromptVariable, PromptVariables, Base64Data, PromptTextMode, PromptRecord, } from './lib/llm_api/types.js';
16
+ export type { LLMApiConfig, LLMApiClient, CallLLMParams, LLMResponse, Logger, PromptVariable, PromptVariables, Base64Data, PromptTextMode, PromptRecord, EmbedParams, EmbedResponse, EmbedKeyv, PromptPart, } from './lib/llm_api/types.js';
17
+ export type { FetchSummaryFn, FetchDetailFn, UsageSummaryOptions, UsageSummaryResponse, UsageSummaryRow, UsageSummaryGroupBy, ApiLogRow, } from './lib/observability/types.js';
17
18
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,cAAc,uBAAuB,CAAC;AAMtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAK1E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAKrE,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,MAAM,EACN,cAAc,EACd,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,GACb,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,cAAc,uBAAuB,CAAC;AAMtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,YAAY,EACV,WAAW,EACX,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,EACX,YAAY,EACZ,qBAAqB,GACtB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACxE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAK1E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAKrE,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,WAAW,EACX,MAAM,EACN,cAAc,EACd,eAAe,EACf,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EACX,aAAa,EACb,SAAS,EACT,UAAU,GACX,MAAM,wBAAwB,CAAC;AAKhC,YAAY,EACV,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,mBAAmB,EACnB,SAAS,GACV,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { LLMProvider } from '../providers/types.js';
2
+ import type { LLMResponse, Logger } from '../llm_api/types.js';
3
+ import type { CascadeConfig } from './types.js';
4
+ import type { UsageAttempt } from '../pricing/types.js';
5
+ export interface CascadeRunOptions {
6
+ /** Resolved provider instances to try in order */
7
+ providers: LLMProvider[];
8
+ /** Bound call function (params already captured by closure) */
9
+ call_fn: (provider: LLMProvider) => Promise<LLMResponse>;
10
+ /** Error codes that allow cascade to next provider */
11
+ cascade_on_codes?: string[];
12
+ /** Per-attempt timeout in milliseconds (no timeout if absent) */
13
+ timeout_ms_per_attempt?: number;
14
+ /** Logger */
15
+ logger: Logger;
16
+ }
17
+ export interface CascadeRunResult {
18
+ response: LLMResponse;
19
+ /**
20
+ * Failed attempts before the final result. Empty array when the first
21
+ * provider succeeded (no cascade fired).
22
+ */
23
+ attempts: UsageAttempt[];
24
+ }
25
+ export interface ResolveProvidersOptions {
26
+ per_call?: string[];
27
+ init_cascade?: CascadeConfig;
28
+ single_llm?: string;
29
+ primary_llm: string;
30
+ }
31
+ /**
32
+ * Determine the ordered list of provider names to use.
33
+ * Precedence: per-call providers > init cascade providers > single_llm arg > primary_llm.
34
+ * An empty per_call array is treated as "not set" (falls through).
35
+ */
36
+ export declare function resolve_providers(opts: ResolveProvidersOptions): string[];
37
+ /**
38
+ * Try each provider in order, returning the first successful response.
39
+ *
40
+ * Rules:
41
+ * - Success on first try → `attempts` is empty (no cascade record).
42
+ * - Cascadable error (RATE_LIMITED, NETWORK_ERROR, TIMEOUT, API_ERROR by default) →
43
+ * record attempt, try next provider.
44
+ * - Non-cascadable error (config errors: PROVIDER_NOT_FOUND, API_KEY_MISSING, etc.) →
45
+ * return immediately without trying more providers.
46
+ * - Timeout → treated as TIMEOUT error code, always cascadable.
47
+ * - All providers exhausted → return last error with all attempts recorded.
48
+ */
49
+ export declare function run_with_cascade(opts: CascadeRunOptions): Promise<CascadeRunResult>;
50
+ //# sourceMappingURL=cascade_runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade_runner.d.ts","sourceRoot":"","sources":["../../../src/lib/cascade/cascade_runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,+DAA+D;IAC/D,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IACzD,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,iEAAiE;IACjE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,WAAW,CAAC;IACtB;;;OAGG;IACH,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,EAAE,CAazE;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAgFzF"}
@@ -0,0 +1,115 @@
1
+ // file_description: Cascade runner — tries LLM providers in order until one succeeds
2
+ import { LLM_ERROR_CODES } from '../llm_api/types.js';
3
+ import { DEFAULT_CASCADE_ON_CODES } from './types.js';
4
+ // =============================================================================
5
+ // resolve_providers
6
+ // =============================================================================
7
+ /**
8
+ * Determine the ordered list of provider names to use.
9
+ * Precedence: per-call providers > init cascade providers > single_llm arg > primary_llm.
10
+ * An empty per_call array is treated as "not set" (falls through).
11
+ */
12
+ export function resolve_providers(opts) {
13
+ const { per_call, init_cascade, single_llm, primary_llm } = opts;
14
+ if (per_call && per_call.length > 0) {
15
+ return per_call;
16
+ }
17
+ if (init_cascade?.providers && init_cascade.providers.length > 0) {
18
+ return init_cascade.providers;
19
+ }
20
+ if (single_llm) {
21
+ return [single_llm];
22
+ }
23
+ return [primary_llm];
24
+ }
25
+ // =============================================================================
26
+ // run_with_cascade
27
+ // =============================================================================
28
+ /**
29
+ * Try each provider in order, returning the first successful response.
30
+ *
31
+ * Rules:
32
+ * - Success on first try → `attempts` is empty (no cascade record).
33
+ * - Cascadable error (RATE_LIMITED, NETWORK_ERROR, TIMEOUT, API_ERROR by default) →
34
+ * record attempt, try next provider.
35
+ * - Non-cascadable error (config errors: PROVIDER_NOT_FOUND, API_KEY_MISSING, etc.) →
36
+ * return immediately without trying more providers.
37
+ * - Timeout → treated as TIMEOUT error code, always cascadable.
38
+ * - All providers exhausted → return last error with all attempts recorded.
39
+ */
40
+ export async function run_with_cascade(opts) {
41
+ const { providers, call_fn, cascade_on_codes = DEFAULT_CASCADE_ON_CODES, timeout_ms_per_attempt, logger, } = opts;
42
+ const attempts = [];
43
+ for (let i = 0; i < providers.length; i++) {
44
+ const provider = providers[i];
45
+ const provider_name = provider.get_name();
46
+ const is_last = i === providers.length - 1;
47
+ const t0 = Date.now();
48
+ let response;
49
+ try {
50
+ if (timeout_ms_per_attempt) {
51
+ response = await Promise.race([
52
+ call_fn(provider),
53
+ make_timeout_promise(timeout_ms_per_attempt, provider_name),
54
+ ]);
55
+ }
56
+ else {
57
+ response = await call_fn(provider);
58
+ }
59
+ }
60
+ catch (err) {
61
+ // Thrown exception: timeout or unhandled provider throw
62
+ const latency_ms = Date.now() - t0;
63
+ const error_code = err instanceof TimeoutError
64
+ ? LLM_ERROR_CODES.TIMEOUT
65
+ : LLM_ERROR_CODES.NETWORK_ERROR;
66
+ const error_msg = err instanceof Error ? err.message : String(err);
67
+ const attempt = { provider: provider_name, success: false, error_code, latency_ms };
68
+ if (!is_last && cascade_on_codes.includes(error_code)) {
69
+ logger.warn(`[cascade] ${provider_name} threw ${error_code} — trying next`, { provider: provider_name, error_code, latency_ms });
70
+ attempts.push(attempt);
71
+ continue;
72
+ }
73
+ return {
74
+ response: {
75
+ success: false,
76
+ error: error_msg,
77
+ error_info: { code: error_code, message: error_msg, retryable: true },
78
+ },
79
+ attempts: [...attempts, attempt],
80
+ };
81
+ }
82
+ const latency_ms = Date.now() - t0;
83
+ if (response.success) {
84
+ return { response, attempts };
85
+ }
86
+ // Failed response
87
+ const error_code = response.error_info?.code ?? LLM_ERROR_CODES.UNKNOWN;
88
+ const is_cascadable = cascade_on_codes.includes(error_code);
89
+ if (!is_last && is_cascadable) {
90
+ logger.warn(`[cascade] ${provider_name} returned ${error_code} — trying next`, { provider: provider_name, error_code, latency_ms });
91
+ attempts.push({ provider: provider_name, success: false, error_code, latency_ms });
92
+ continue;
93
+ }
94
+ // Either last provider or non-cascadable error — return now
95
+ const final_attempts = is_last && attempts.length > 0
96
+ ? [...attempts, { provider: provider_name, success: false, error_code, latency_ms }]
97
+ : attempts;
98
+ return { response, attempts: final_attempts };
99
+ }
100
+ // Unreachable — loop always returns
101
+ return { response: { success: false, error: 'cascade: no providers' }, attempts };
102
+ }
103
+ // =============================================================================
104
+ // Timeout helper
105
+ // =============================================================================
106
+ class TimeoutError extends Error {
107
+ constructor(provider, ms) {
108
+ super(`[cascade] provider "${provider}" timed out after ${ms}ms`);
109
+ this.name = 'TimeoutError';
110
+ }
111
+ }
112
+ function make_timeout_promise(ms, provider) {
113
+ return new Promise((_, reject) => setTimeout(() => reject(new TimeoutError(provider, ms)), ms));
114
+ }
115
+ //# sourceMappingURL=cascade_runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cascade_runner.js","sourceRoot":"","sources":["../../../src/lib/cascade/cascade_runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { CascadeConfig } from './types.js';
2
+ export { DEFAULT_CASCADE_ON_CODES } from './types.js';
3
+ export { run_with_cascade, resolve_providers } from './cascade_runner.js';
4
+ export type { CascadeRunOptions, CascadeRunResult, ResolveProvidersOptions } from './cascade_runner.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/cascade/index.ts"],"names":[],"mappings":"AAEA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,4 @@
1
+ // file_description: Cascade module exports
2
+ export { DEFAULT_CASCADE_ON_CODES } from './types.js';
3
+ export { run_with_cascade, resolve_providers } from './cascade_runner.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/cascade/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAG3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { LLMErrorCode } from '../llm_api/types.js';
2
+ /**
3
+ * Cascade configuration — controls provider failover behavior.
4
+ *
5
+ * Precedence (highest to lowest):
6
+ * 1. per-call `params.providers`
7
+ * 2. `initialize_llm_api({ cascade })` config
8
+ * 3. `[llm_cascade]` ini section
9
+ * 4. no cascade (single primary provider)
10
+ */
11
+ export interface CascadeConfig {
12
+ /**
13
+ * Ordered list of provider names to try. First is attempted first.
14
+ * If empty or unset, no cascade — uses primary provider.
15
+ */
16
+ providers?: string[];
17
+ /**
18
+ * Timeout per individual provider attempt in milliseconds.
19
+ * No timeout if not set.
20
+ */
21
+ timeout_ms_per_attempt?: number;
22
+ /**
23
+ * Error codes that permit cascade to the next provider.
24
+ * Defaults to: RATE_LIMITED, NETWORK_ERROR, TIMEOUT, API_ERROR.
25
+ */
26
+ cascade_on_codes?: LLMErrorCode[];
27
+ }
28
+ /**
29
+ * Default error codes that trigger cascade to the next provider.
30
+ * Only transient / server-side errors are included.
31
+ * Configuration errors (PROVIDER_NOT_FOUND, CAPABILITY_NOT_SUPPORTED, API_KEY_MISSING)
32
+ * are intentionally excluded — they won't succeed on retry.
33
+ */
34
+ export declare const DEFAULT_CASCADE_ON_CODES: LLMErrorCode[];
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/cascade/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAEhC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,YAAY,EAAE,CAAC;CACnC;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,YAAY,EAKlD,CAAC"}
@@ -0,0 +1,14 @@
1
+ // file_description: Cascade configuration and runner types for hazo_llm_api
2
+ /**
3
+ * Default error codes that trigger cascade to the next provider.
4
+ * Only transient / server-side errors are included.
5
+ * Configuration errors (PROVIDER_NOT_FOUND, CAPABILITY_NOT_SUPPORTED, API_KEY_MISSING)
6
+ * are intentionally excluded — they won't succeed on retry.
7
+ */
8
+ export const DEFAULT_CASCADE_ON_CODES = [
9
+ 'RATE_LIMITED',
10
+ 'NETWORK_ERROR',
11
+ 'TIMEOUT',
12
+ 'API_ERROR',
13
+ ];
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/cascade/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAiC5E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAmB;IACtD,cAAc;IACd,eAAe;IACf,SAAS;IACT,WAAW;CACZ,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Cost Cap Gate
3
+ *
4
+ * Pre-call gate that checks the accumulated cost for the current session
5
+ * against a configured cap. Returns a COST_LIMIT_EXCEEDED error response
6
+ * when the cap is reached (block mode) or fires a warn hook and proceeds
7
+ * (warn mode).
8
+ *
9
+ * Requires:
10
+ * - hazo_llm_api_log table to exist (ensure_api_log_table must be called first)
11
+ * - A session_id available via hazo_logs ALS (safe_get_log_context)
12
+ * - cost_cap.enabled = true in LLMApiConfig
13
+ */
14
+ import type { Logger, LLMResponse, CostCapConfig } from '../llm_api/types.js';
15
+ import type { HazoConnect } from '../hazo_connect/types.js';
16
+ /**
17
+ * Ensure the session_id + created_at composite index exists on hazo_llm_api_log.
18
+ * Idempotent — safe to call on every initialization.
19
+ * Errors are swallowed to avoid crashing initialization.
20
+ */
21
+ export declare function ensure_cost_cap_index(connect: HazoConnect, logger: Logger): Promise<void>;
22
+ /**
23
+ * Query the total cost_usd accumulated for a session within the given window.
24
+ *
25
+ * Returns 0 if connect has no raw_sql, if there are no matching rows, or if
26
+ * any DB error occurs (errors are swallowed).
27
+ */
28
+ export declare function query_session_cost(connect: HazoConnect, session_id: string, window_start: string, logger: Logger): Promise<number>;
29
+ /**
30
+ * Pre-call cost cap gate.
31
+ *
32
+ * Returns:
33
+ * - `null` if the gate should not block (cap disabled, no session, current < cap, or warn mode)
34
+ * - `LLMResponse` if the call should be blocked (block mode, cap exceeded)
35
+ *
36
+ * In warn mode the `cost_cap_exceeded` hook is called (errors swallowed) and null is returned
37
+ * so the call proceeds.
38
+ */
39
+ export declare function check_cost_cap_gate(connect: HazoConnect | null, cap_config: CostCapConfig | undefined, logger: Logger): Promise<LLMResponse | null>;
40
+ //# sourceMappingURL=cost_cap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost_cap.d.ts","sourceRoot":"","sources":["../../../src/lib/cost_cap/cost_cap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA+B5D;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,WAAW,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,UAAU,EAAE,aAAa,GAAG,SAAS,EACrC,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAoE7B"}