toad-eye 1.1.0 → 2.0.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 (57) hide show
  1. package/README.md +132 -87
  2. package/dist/alerts/channels.d.ts +2 -0
  3. package/dist/alerts/channels.js +81 -0
  4. package/dist/alerts/conditions.d.ts +29 -0
  5. package/dist/alerts/conditions.js +147 -0
  6. package/dist/alerts/grafana.d.ts +5 -0
  7. package/dist/alerts/grafana.js +19 -0
  8. package/dist/alerts/index.d.ts +5 -0
  9. package/dist/alerts/index.js +12 -0
  10. package/dist/alerts/manager.d.ts +13 -0
  11. package/dist/alerts/manager.js +87 -0
  12. package/dist/alerts/types.d.ts +46 -0
  13. package/dist/alerts/types.js +1 -0
  14. package/dist/cli.js +72 -1
  15. package/dist/index.d.ts +6 -2
  16. package/dist/index.js +3 -1
  17. package/dist/instrumentations/anthropic.d.ts +1 -0
  18. package/dist/instrumentations/anthropic.js +54 -0
  19. package/dist/instrumentations/create.d.ts +11 -0
  20. package/dist/instrumentations/create.js +67 -0
  21. package/dist/instrumentations/gemini.d.ts +1 -0
  22. package/dist/instrumentations/gemini.js +48 -0
  23. package/dist/instrumentations/openai.d.ts +1 -0
  24. package/dist/instrumentations/openai.js +58 -0
  25. package/dist/instrumentations/registry.d.ts +5 -0
  26. package/dist/instrumentations/registry.js +31 -0
  27. package/dist/instrumentations/types.d.ts +29 -0
  28. package/dist/instrumentations/types.js +1 -0
  29. package/dist/metrics.js +31 -16
  30. package/dist/pricing.d.ts +24 -0
  31. package/dist/pricing.js +52 -0
  32. package/dist/spans.d.ts +1 -1
  33. package/dist/spans.js +46 -20
  34. package/dist/tracer.d.ts +4 -1
  35. package/dist/tracer.js +9 -0
  36. package/dist/types/attributes.d.ts +36 -0
  37. package/dist/types/attributes.js +38 -0
  38. package/dist/types/config.d.ts +20 -0
  39. package/dist/types/config.js +1 -0
  40. package/dist/types/index.d.ts +17 -0
  41. package/dist/types/index.js +13 -0
  42. package/dist/types/metrics.d.ts +25 -0
  43. package/dist/types/metrics.js +23 -0
  44. package/dist/types/providers.d.ts +5 -0
  45. package/dist/types/providers.js +1 -0
  46. package/dist/types/spans.d.ts +19 -0
  47. package/dist/types/spans.js +1 -0
  48. package/dist/types.d.ts +60 -25
  49. package/dist/types.js +47 -21
  50. package/package.json +15 -4
  51. package/templates/alerts.example.yml +54 -0
  52. package/templates/docker-compose.yml +1 -2
  53. package/templates/grafana/dashboards/cost-breakdown.json +208 -0
  54. package/templates/grafana/dashboards/error-drilldown.json +188 -0
  55. package/templates/grafana/dashboards/latency-analysis.json +134 -0
  56. package/templates/grafana/dashboards/llm-overview.json +161 -30
  57. package/templates/grafana/dashboards/model-comparison.json +143 -0
@@ -0,0 +1,208 @@
1
+ {
2
+ "annotations": { "list": [] },
3
+ "editable": true,
4
+ "fiscalYearStartMonth": 0,
5
+ "graphTooltip": 1,
6
+ "id": null,
7
+ "links": [],
8
+ "panels": [
9
+ {
10
+ "title": "Total Cost",
11
+ "type": "stat",
12
+ "gridPos": { "h": 4, "w": 8, "x": 0, "y": 0 },
13
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
14
+ "targets": [
15
+ {
16
+ "expr": "sum(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"})",
17
+ "refId": "A"
18
+ }
19
+ ],
20
+ "fieldConfig": {
21
+ "defaults": {
22
+ "unit": "currencyUSD",
23
+ "thresholds": {
24
+ "steps": [
25
+ { "color": "green", "value": null },
26
+ { "color": "yellow", "value": 50 },
27
+ { "color": "red", "value": 500 }
28
+ ]
29
+ }
30
+ },
31
+ "overrides": []
32
+ }
33
+ },
34
+ {
35
+ "title": "Cost Today",
36
+ "type": "stat",
37
+ "gridPos": { "h": 4, "w": 8, "x": 8, "y": 0 },
38
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
39
+ "targets": [
40
+ {
41
+ "expr": "sum(increase(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1d]))",
42
+ "refId": "A"
43
+ }
44
+ ],
45
+ "fieldConfig": {
46
+ "defaults": {
47
+ "unit": "currencyUSD",
48
+ "thresholds": {
49
+ "steps": [
50
+ { "color": "green", "value": null },
51
+ { "color": "yellow", "value": 10 },
52
+ { "color": "red", "value": 50 }
53
+ ]
54
+ }
55
+ },
56
+ "overrides": []
57
+ }
58
+ },
59
+ {
60
+ "title": "Projected Monthly Cost",
61
+ "type": "stat",
62
+ "gridPos": { "h": 4, "w": 8, "x": 16, "y": 0 },
63
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
64
+ "targets": [
65
+ {
66
+ "expr": "sum(rate(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1d])) * 86400 * 30",
67
+ "refId": "A"
68
+ }
69
+ ],
70
+ "fieldConfig": {
71
+ "defaults": {
72
+ "unit": "currencyUSD",
73
+ "thresholds": {
74
+ "steps": [
75
+ { "color": "green", "value": null },
76
+ { "color": "yellow", "value": 100 },
77
+ { "color": "red", "value": 1000 }
78
+ ]
79
+ }
80
+ },
81
+ "overrides": []
82
+ }
83
+ },
84
+ {
85
+ "title": "Cost by Provider",
86
+ "type": "timeseries",
87
+ "gridPos": { "h": 8, "w": 12, "x": 0, "y": 4 },
88
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
89
+ "targets": [
90
+ {
91
+ "expr": "sum(rate(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) by (gen_ai_provider_name) * 60",
92
+ "legendFormat": "{{ gen_ai_provider_name }}",
93
+ "refId": "A"
94
+ }
95
+ ],
96
+ "fieldConfig": {
97
+ "defaults": {
98
+ "unit": "currencyUSD",
99
+ "custom": {
100
+ "drawStyle": "bars",
101
+ "fillOpacity": 50,
102
+ "lineWidth": 1,
103
+ "stacking": { "mode": "normal" }
104
+ }
105
+ },
106
+ "overrides": []
107
+ }
108
+ },
109
+ {
110
+ "title": "Cost by Model",
111
+ "type": "timeseries",
112
+ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 4 },
113
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
114
+ "targets": [
115
+ {
116
+ "expr": "sum(rate(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) by (gen_ai_request_model) * 60",
117
+ "legendFormat": "{{ gen_ai_request_model }}",
118
+ "refId": "A"
119
+ }
120
+ ],
121
+ "fieldConfig": {
122
+ "defaults": {
123
+ "unit": "currencyUSD",
124
+ "custom": {
125
+ "drawStyle": "bars",
126
+ "fillOpacity": 50,
127
+ "lineWidth": 1,
128
+ "stacking": { "mode": "normal" }
129
+ }
130
+ },
131
+ "overrides": []
132
+ }
133
+ },
134
+ {
135
+ "title": "Cost per Request",
136
+ "type": "timeseries",
137
+ "gridPos": { "h": 8, "w": 12, "x": 0, "y": 12 },
138
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
139
+ "targets": [
140
+ {
141
+ "expr": "sum(rate(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) / sum(rate(gen_ai_client_request_cost_USD_count{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m]))",
142
+ "legendFormat": "avg cost/request",
143
+ "refId": "A"
144
+ }
145
+ ],
146
+ "fieldConfig": {
147
+ "defaults": {
148
+ "unit": "currencyUSD",
149
+ "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
150
+ },
151
+ "overrides": []
152
+ }
153
+ },
154
+ {
155
+ "title": "Daily Cost Trend",
156
+ "type": "timeseries",
157
+ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 12 },
158
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
159
+ "targets": [
160
+ {
161
+ "expr": "sum(increase(gen_ai_client_request_cost_USD_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1h]))",
162
+ "legendFormat": "hourly cost",
163
+ "refId": "A"
164
+ }
165
+ ],
166
+ "fieldConfig": {
167
+ "defaults": {
168
+ "unit": "currencyUSD",
169
+ "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
170
+ },
171
+ "overrides": []
172
+ }
173
+ }
174
+ ],
175
+ "refresh": "5s",
176
+ "schemaVersion": 39,
177
+ "tags": ["llm", "observability", "toad-eye"],
178
+ "templating": {
179
+ "list": [
180
+ {
181
+ "name": "provider",
182
+ "type": "query",
183
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
184
+ "query": "label_values(gen_ai_client_requests_total, gen_ai_provider_name)",
185
+ "includeAll": true,
186
+ "allValue": ".*",
187
+ "current": { "text": "All", "value": "$__all" },
188
+ "multi": true
189
+ },
190
+ {
191
+ "name": "model",
192
+ "type": "query",
193
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
194
+ "query": "label_values(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\"}, gen_ai_request_model)",
195
+ "includeAll": true,
196
+ "allValue": ".*",
197
+ "current": { "text": "All", "value": "$__all" },
198
+ "multi": true
199
+ }
200
+ ]
201
+ },
202
+ "time": { "from": "now-15m", "to": "now" },
203
+ "timepicker": {},
204
+ "timezone": "browser",
205
+ "title": "toad-eye: Cost Breakdown",
206
+ "uid": "toad-eye-cost",
207
+ "version": 1
208
+ }
@@ -0,0 +1,188 @@
1
+ {
2
+ "annotations": { "list": [] },
3
+ "editable": true,
4
+ "fiscalYearStartMonth": 0,
5
+ "graphTooltip": 1,
6
+ "id": null,
7
+ "links": [],
8
+ "panels": [
9
+ {
10
+ "title": "Total Errors",
11
+ "type": "stat",
12
+ "gridPos": { "h": 4, "w": 8, "x": 0, "y": 0 },
13
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
14
+ "targets": [
15
+ {
16
+ "expr": "sum(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"})",
17
+ "refId": "A"
18
+ }
19
+ ],
20
+ "fieldConfig": {
21
+ "defaults": {
22
+ "unit": "short",
23
+ "thresholds": {
24
+ "steps": [
25
+ { "color": "green", "value": null },
26
+ { "color": "yellow", "value": 10 },
27
+ { "color": "red", "value": 100 }
28
+ ]
29
+ }
30
+ },
31
+ "overrides": []
32
+ }
33
+ },
34
+ {
35
+ "title": "Error Rate %",
36
+ "type": "stat",
37
+ "gridPos": { "h": 4, "w": 8, "x": 8, "y": 0 },
38
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
39
+ "targets": [
40
+ {
41
+ "expr": "sum(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}) / sum(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}) * 100",
42
+ "refId": "A"
43
+ }
44
+ ],
45
+ "fieldConfig": {
46
+ "defaults": {
47
+ "unit": "percent",
48
+ "thresholds": {
49
+ "steps": [
50
+ { "color": "green", "value": null },
51
+ { "color": "yellow", "value": 5 },
52
+ { "color": "red", "value": 20 }
53
+ ]
54
+ }
55
+ },
56
+ "overrides": []
57
+ }
58
+ },
59
+ {
60
+ "title": "Errors Last Hour",
61
+ "type": "stat",
62
+ "gridPos": { "h": 4, "w": 8, "x": 16, "y": 0 },
63
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
64
+ "targets": [
65
+ {
66
+ "expr": "sum(increase(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1h]))",
67
+ "refId": "A"
68
+ }
69
+ ],
70
+ "fieldConfig": {
71
+ "defaults": {
72
+ "unit": "short",
73
+ "thresholds": {
74
+ "steps": [
75
+ { "color": "green", "value": null },
76
+ { "color": "yellow", "value": 5 },
77
+ { "color": "red", "value": 50 }
78
+ ]
79
+ }
80
+ },
81
+ "overrides": []
82
+ }
83
+ },
84
+ {
85
+ "title": "Error Rate by Provider",
86
+ "type": "timeseries",
87
+ "gridPos": { "h": 8, "w": 12, "x": 0, "y": 4 },
88
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
89
+ "targets": [
90
+ {
91
+ "expr": "sum(rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) by (gen_ai_provider_name) * 60",
92
+ "legendFormat": "{{ gen_ai_provider_name }}",
93
+ "refId": "A"
94
+ }
95
+ ],
96
+ "fieldConfig": {
97
+ "defaults": {
98
+ "unit": "reqpm",
99
+ "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
100
+ },
101
+ "overrides": []
102
+ }
103
+ },
104
+ {
105
+ "title": "Error Rate by Model",
106
+ "type": "timeseries",
107
+ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 4 },
108
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
109
+ "targets": [
110
+ {
111
+ "expr": "sum(rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) by (gen_ai_request_model) * 60",
112
+ "legendFormat": "{{ gen_ai_request_model }}",
113
+ "refId": "A"
114
+ }
115
+ ],
116
+ "fieldConfig": {
117
+ "defaults": {
118
+ "unit": "reqpm",
119
+ "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
120
+ },
121
+ "overrides": []
122
+ }
123
+ },
124
+ {
125
+ "title": "Error vs Success Rate",
126
+ "type": "timeseries",
127
+ "gridPos": { "h": 8, "w": 24, "x": 0, "y": 12 },
128
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
129
+ "targets": [
130
+ {
131
+ "expr": "sum(rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) * 60",
132
+ "legendFormat": "errors/min",
133
+ "refId": "A"
134
+ },
135
+ {
136
+ "expr": "(sum(rate(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m])) - sum(rate(gen_ai_client_errors_total{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[1m]))) * 60",
137
+ "legendFormat": "success/min",
138
+ "refId": "B"
139
+ }
140
+ ],
141
+ "fieldConfig": {
142
+ "defaults": {
143
+ "unit": "reqpm",
144
+ "custom": {
145
+ "drawStyle": "line",
146
+ "fillOpacity": 15,
147
+ "lineWidth": 2,
148
+ "stacking": { "mode": "normal" }
149
+ }
150
+ },
151
+ "overrides": []
152
+ }
153
+ }
154
+ ],
155
+ "refresh": "5s",
156
+ "schemaVersion": 39,
157
+ "tags": ["llm", "observability", "toad-eye"],
158
+ "templating": {
159
+ "list": [
160
+ {
161
+ "name": "provider",
162
+ "type": "query",
163
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
164
+ "query": "label_values(gen_ai_client_requests_total, gen_ai_provider_name)",
165
+ "includeAll": true,
166
+ "allValue": ".*",
167
+ "current": { "text": "All", "value": "$__all" },
168
+ "multi": true
169
+ },
170
+ {
171
+ "name": "model",
172
+ "type": "query",
173
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
174
+ "query": "label_values(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\"}, gen_ai_request_model)",
175
+ "includeAll": true,
176
+ "allValue": ".*",
177
+ "current": { "text": "All", "value": "$__all" },
178
+ "multi": true
179
+ }
180
+ ]
181
+ },
182
+ "time": { "from": "now-15m", "to": "now" },
183
+ "timepicker": {},
184
+ "timezone": "browser",
185
+ "title": "toad-eye: Error Drill-down",
186
+ "uid": "toad-eye-errors",
187
+ "version": 1
188
+ }
@@ -0,0 +1,134 @@
1
+ {
2
+ "annotations": { "list": [] },
3
+ "editable": true,
4
+ "fiscalYearStartMonth": 0,
5
+ "graphTooltip": 1,
6
+ "id": null,
7
+ "links": [],
8
+ "panels": [
9
+ {
10
+ "title": "Latency p50 / p95 / p99 by Model",
11
+ "type": "timeseries",
12
+ "gridPos": { "h": 8, "w": 24, "x": 0, "y": 0 },
13
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
14
+ "targets": [
15
+ {
16
+ "expr": "histogram_quantile(0.50, sum(rate(gen_ai_client_operation_duration_milliseconds_bucket{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (le, gen_ai_request_model))",
17
+ "legendFormat": "p50 {{ gen_ai_request_model }}",
18
+ "refId": "A"
19
+ },
20
+ {
21
+ "expr": "histogram_quantile(0.95, sum(rate(gen_ai_client_operation_duration_milliseconds_bucket{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (le, gen_ai_request_model))",
22
+ "legendFormat": "p95 {{ gen_ai_request_model }}",
23
+ "refId": "B"
24
+ },
25
+ {
26
+ "expr": "histogram_quantile(0.99, sum(rate(gen_ai_client_operation_duration_milliseconds_bucket{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (le, gen_ai_request_model))",
27
+ "legendFormat": "p99 {{ gen_ai_request_model }}",
28
+ "refId": "C"
29
+ }
30
+ ],
31
+ "fieldConfig": {
32
+ "defaults": {
33
+ "unit": "ms",
34
+ "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
35
+ },
36
+ "overrides": []
37
+ }
38
+ },
39
+ {
40
+ "title": "Latency Distribution",
41
+ "type": "histogram",
42
+ "gridPos": { "h": 8, "w": 12, "x": 0, "y": 8 },
43
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
44
+ "targets": [
45
+ {
46
+ "expr": "sum(rate(gen_ai_client_operation_duration_milliseconds_bucket{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (le)",
47
+ "legendFormat": "{{ le }}",
48
+ "refId": "A",
49
+ "format": "heatmap"
50
+ }
51
+ ],
52
+ "fieldConfig": {
53
+ "defaults": {
54
+ "unit": "ms",
55
+ "custom": { "fillOpacity": 50 }
56
+ },
57
+ "overrides": []
58
+ }
59
+ },
60
+ {
61
+ "title": "Avg Latency by Model",
62
+ "type": "timeseries",
63
+ "gridPos": { "h": 8, "w": 12, "x": 12, "y": 8 },
64
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
65
+ "targets": [
66
+ {
67
+ "expr": "sum(rate(gen_ai_client_operation_duration_milliseconds_sum{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model) / sum(rate(gen_ai_client_operation_duration_milliseconds_count{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (gen_ai_request_model)",
68
+ "legendFormat": "{{ gen_ai_request_model }}",
69
+ "refId": "A"
70
+ }
71
+ ],
72
+ "fieldConfig": {
73
+ "defaults": {
74
+ "unit": "ms",
75
+ "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
76
+ },
77
+ "overrides": []
78
+ }
79
+ },
80
+ {
81
+ "title": "Slow Requests p99 by Provider",
82
+ "type": "timeseries",
83
+ "gridPos": { "h": 8, "w": 24, "x": 0, "y": 16 },
84
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
85
+ "targets": [
86
+ {
87
+ "expr": "histogram_quantile(0.99, sum(rate(gen_ai_client_operation_duration_milliseconds_bucket{gen_ai_provider_name=~\"$provider\", gen_ai_request_model=~\"$model\"}[5m])) by (le, gen_ai_provider_name))",
88
+ "legendFormat": "p99 {{ gen_ai_provider_name }}",
89
+ "refId": "A"
90
+ }
91
+ ],
92
+ "fieldConfig": {
93
+ "defaults": {
94
+ "unit": "ms",
95
+ "custom": { "drawStyle": "line", "fillOpacity": 15, "lineWidth": 2 }
96
+ },
97
+ "overrides": []
98
+ }
99
+ }
100
+ ],
101
+ "refresh": "5s",
102
+ "schemaVersion": 39,
103
+ "tags": ["llm", "observability", "toad-eye"],
104
+ "templating": {
105
+ "list": [
106
+ {
107
+ "name": "provider",
108
+ "type": "query",
109
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
110
+ "query": "label_values(gen_ai_client_requests_total, gen_ai_provider_name)",
111
+ "includeAll": true,
112
+ "allValue": ".*",
113
+ "current": { "text": "All", "value": "$__all" },
114
+ "multi": true
115
+ },
116
+ {
117
+ "name": "model",
118
+ "type": "query",
119
+ "datasource": { "type": "prometheus", "uid": "prometheus" },
120
+ "query": "label_values(gen_ai_client_requests_total{gen_ai_provider_name=~\"$provider\"}, gen_ai_request_model)",
121
+ "includeAll": true,
122
+ "allValue": ".*",
123
+ "current": { "text": "All", "value": "$__all" },
124
+ "multi": true
125
+ }
126
+ ]
127
+ },
128
+ "time": { "from": "now-15m", "to": "now" },
129
+ "timepicker": {},
130
+ "timezone": "browser",
131
+ "title": "toad-eye: Latency Analysis",
132
+ "uid": "toad-eye-latency",
133
+ "version": 1
134
+ }