@iblai/data-layer 1.18.0 → 1.19.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.
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iblai/data-layer",
3
- "version": "1.17.0",
3
+ "version": "1.18.1",
4
4
  "description": "ibl.ai data layer",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
@@ -67,6 +67,12 @@ export interface TranscriptsMessagesDetailsResponse {
67
67
  mentor: string;
68
68
  mentor_unique_id: string;
69
69
  model: string;
70
+ /**
71
+ * Provider key of `model` (e.g. `openai`), as the per-turn
72
+ * `metadata.llm_provider` names it. Not sent by the backend yet; when it
73
+ * is, the transcript badge resolves its logo from it directly.
74
+ */
75
+ llm_provider?: string | null;
70
76
  username: string;
71
77
  name: string;
72
78
  /** Preferred over `name`/`username` in the UI; older deployments omit it. */
@@ -83,14 +89,53 @@ export interface TranscriptsMessagesDetailsResponse {
83
89
  session: string;
84
90
  user: number;
85
91
  };
86
- messages: Array<{
87
- human: string;
88
- ai: string;
89
- /** Attachments uploaded with the human turn; a file-only turn has `human: ""`. */
90
- human_files?: TranscriptFile[] | null;
91
- /** Files produced by the assistant turn (same shape as `human_files`). */
92
- ai_files?: TranscriptFile[] | null;
93
- }>;
92
+ messages: TranscriptMessage[];
93
+ }
94
+ /** One human/AI exchange of a transcript, with its attachments and extended context. */
95
+ export interface TranscriptMessage extends TranscriptTurnExtendedContext {
96
+ human: string;
97
+ ai: string;
98
+ /** Attachments uploaded with the human turn; a file-only turn has `human: ""`. */
99
+ human_files?: TranscriptFile[] | null;
100
+ /** Files produced by the assistant turn (same shape as `human_files`). */
101
+ ai_files?: TranscriptFile[] | null;
102
+ }
103
+ /** A document the agent retrieved while producing an AI turn (a RAG source). */
104
+ export interface TranscriptRetrievedDocument {
105
+ source?: string | null;
106
+ title?: string | null;
107
+ snippet?: string | null;
108
+ score?: number | null;
109
+ confidence_level?: string | number | null;
110
+ [key: string]: unknown;
111
+ }
112
+ /** A tool the agent called while producing an AI turn. `input`/`output` are free-form. */
113
+ export interface TranscriptToolCall {
114
+ name?: string | null;
115
+ input?: unknown;
116
+ output?: unknown;
117
+ [key: string]: unknown;
118
+ }
119
+ /** Backend metadata recorded for an AI turn. Known keys are typed; anything else passes through. */
120
+ export interface TranscriptTurnMetadata {
121
+ client?: Record<string, unknown> | null;
122
+ llm_model?: string | null;
123
+ llm_provider?: string | null;
124
+ llm_temperature?: number | null;
125
+ [key: string]: unknown;
126
+ }
127
+ /**
128
+ * Extended per-turn context — retrieved documents, tool calls, metadata and the
129
+ * request context — that the backend attaches to each AI turn on the admin
130
+ * surfaces only (`analytics/messages/details/` and the admin `chat-history/`
131
+ * list). The learner-facing `my-chat-history` endpoints never carry these.
132
+ * Every field may be `null` or empty for turns with no retrieval/tool activity.
133
+ */
134
+ export interface TranscriptTurnExtendedContext {
135
+ documents?: TranscriptRetrievedDocument[] | null;
136
+ tool_calls?: TranscriptToolCall[] | null;
137
+ metadata?: TranscriptTurnMetadata | null;
138
+ request_context?: Record<string, unknown> | null;
94
139
  }
95
140
  /** A file attached to a transcript message; `url` is a presigned, time-limited link. */
96
141
  export interface TranscriptFile {
@@ -117,6 +162,12 @@ export interface TranscriptsMessagesResponse {
117
162
  mentor: string;
118
163
  mentor_unique_id: string;
119
164
  model: string;
165
+ /**
166
+ * Provider key of `model` (e.g. `openai`). Not sent by the backend yet;
167
+ * when it is, the list card's model badge shows the provider logo from it
168
+ * instead of inferring the provider from the model name.
169
+ */
170
+ llm_provider?: string | null;
120
171
  cost: number;
121
172
  username: string;
122
173
  name: string;
@@ -133,6 +184,14 @@ export interface TranscriptsMessagesResponse {
133
184
  platform: number;
134
185
  session: string;
135
186
  user: number;
187
+ /**
188
+ * Rollups of the extended per-turn context, so rows can be badged without
189
+ * opening the conversation. The generated API client types them as strings;
190
+ * older backends omit them. Zero / false when there is no extended history.
191
+ */
192
+ documents_count?: number | string | null;
193
+ tool_calls_count?: number | string | null;
194
+ used_documents?: boolean | string | null;
136
195
  }>;
137
196
  pagination: {
138
197
  page: number;
@@ -1,3 +1,4 @@
1
+ import type { TranscriptFile } from '../analytics/types';
1
2
  export type UserChatHistoryTopic = {
2
3
  id?: number;
3
4
  name: string;
@@ -17,6 +18,10 @@ export type UserChatHistoryMessage = {
17
18
  ai: string;
18
19
  human_message_inserted_at?: string;
19
20
  ai_message_inserted_at?: string;
21
+ /** Files the user attached to the turn (presigned `url`); a file-only turn has `human: ""`. */
22
+ human_files?: TranscriptFile[] | null;
23
+ /** Files the assistant produced on the turn. */
24
+ ai_files?: TranscriptFile[] | null;
20
25
  };
21
26
  export type UserChatHistorySession = {
22
27
  id: string;
@@ -0,0 +1,488 @@
1
+ import type { BaseQueryApi } from '@reduxjs/toolkit/query';
2
+ import { type ExtendedFetchBaseQueryError } from '@data-layer/features/utils';
3
+ import type { UserLlmUsageEnvelope, UserLlmUsageMetricsParams, UserLlmUsageMetricsResponse, UserLlmUsageObservationsParams, UserLlmUsageObservationsResponse, UserLlmUsageParams, UserLlmUsageResource, UserLlmUsageTracesParams, UserLlmUsageTracesResponse } from './types';
4
+ type QueryResult<T> = {
5
+ data: T;
6
+ } | {
7
+ error: ExtendedFetchBaseQueryError;
8
+ };
9
+ /**
10
+ * One request through the app's standard base query (auth header, token
11
+ * refresh, registered 401 handler). `iblFetchBaseQuery` throws on HTTP
12
+ * errors, and a thrown error would reach RTK as a SerializedError with the
13
+ * status stripped; catching it here keeps `{ status, data }` intact so the
14
+ * view can tell a 403 from a 404.
15
+ */
16
+ export declare function fetchUserLlmUsage<R extends UserLlmUsageResource, Row>(params: UserLlmUsageParams & {
17
+ resource: R;
18
+ }, api: BaseQueryApi, extraOptions: Record<string, unknown>): Promise<QueryResult<UserLlmUsageEnvelope<R, Row>>>;
19
+ /**
20
+ * Per-user llm-usage queries. Registered in the mentor and skills stores.
21
+ * Cache entries are keyed on the full param object, so `platform_key`,
22
+ * `username`, `resource` and every filter take part in the key.
23
+ */
24
+ export declare const userLlmUsageApiSlice: import("@reduxjs/toolkit/query").Api<import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
25
+ attempt?: number;
26
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, {
27
+ getUserLlmUsageMetrics: import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
28
+ attempt?: number;
29
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>;
30
+ getUserLlmUsageTraces: import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
31
+ attempt?: number;
32
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>;
33
+ getUserLlmUsageObservations: import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
34
+ attempt?: number;
35
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>;
36
+ }, "userLlmUsageApiSlice", string, typeof import("@reduxjs/toolkit/query").coreModuleName | typeof import("@reduxjs/toolkit/dist/query/react").reactHooksModuleName>;
37
+ export declare const useGetUserLlmUsageMetricsQuery: <R extends Record<string, any> = import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
38
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
39
+ originalArgs?: undefined | undefined;
40
+ data?: undefined | undefined;
41
+ error?: undefined | undefined;
42
+ requestId?: undefined | undefined;
43
+ endpointName?: string | undefined;
44
+ startedTimeStamp?: undefined | undefined;
45
+ fulfilledTimeStamp?: undefined | undefined;
46
+ } & {
47
+ currentData?: UserLlmUsageMetricsResponse | undefined;
48
+ isUninitialized: false;
49
+ isLoading: false;
50
+ isFetching: false;
51
+ isSuccess: false;
52
+ isError: false;
53
+ }, "isUninitialized"> & {
54
+ isUninitialized: true;
55
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
56
+ attempt?: number;
57
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
58
+ currentData?: UserLlmUsageMetricsResponse | undefined;
59
+ isUninitialized: false;
60
+ isLoading: false;
61
+ isFetching: false;
62
+ isSuccess: false;
63
+ isError: false;
64
+ }, {
65
+ isLoading: true;
66
+ isFetching: boolean;
67
+ data: undefined;
68
+ } | ({
69
+ isSuccess: true;
70
+ isFetching: true;
71
+ error: undefined;
72
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
73
+ attempt?: number;
74
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
75
+ currentData?: UserLlmUsageMetricsResponse | undefined;
76
+ isUninitialized: false;
77
+ isLoading: false;
78
+ isFetching: false;
79
+ isSuccess: false;
80
+ isError: false;
81
+ }, "data" | "fulfilledTimeStamp">>) | ({
82
+ isSuccess: true;
83
+ isFetching: false;
84
+ error: undefined;
85
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
86
+ attempt?: number;
87
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
88
+ currentData?: UserLlmUsageMetricsResponse | undefined;
89
+ isUninitialized: false;
90
+ isLoading: false;
91
+ isFetching: false;
92
+ isSuccess: false;
93
+ isError: false;
94
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
95
+ isError: true;
96
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
97
+ attempt?: number;
98
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
99
+ currentData?: UserLlmUsageMetricsResponse | undefined;
100
+ isUninitialized: false;
101
+ isLoading: false;
102
+ isFetching: false;
103
+ isSuccess: false;
104
+ isError: false;
105
+ }, "error">>)>> & {
106
+ status: import("@reduxjs/toolkit/query").QueryStatus;
107
+ }>(arg: UserLlmUsageMetricsParams | typeof import("@reduxjs/toolkit/query").skipToken, options?: (import("@reduxjs/toolkit/query").SubscriptionOptions & {
108
+ skip?: boolean;
109
+ refetchOnMountOrArgChange?: boolean | number;
110
+ } & {
111
+ skip?: boolean;
112
+ selectFromResult?: ((state: import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
113
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
114
+ originalArgs?: undefined | undefined;
115
+ data?: undefined | undefined;
116
+ error?: undefined | undefined;
117
+ requestId?: undefined | undefined;
118
+ endpointName?: string | undefined;
119
+ startedTimeStamp?: undefined | undefined;
120
+ fulfilledTimeStamp?: undefined | undefined;
121
+ } & {
122
+ currentData?: UserLlmUsageMetricsResponse | undefined;
123
+ isUninitialized: false;
124
+ isLoading: false;
125
+ isFetching: false;
126
+ isSuccess: false;
127
+ isError: false;
128
+ }, "isUninitialized"> & {
129
+ isUninitialized: true;
130
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
131
+ attempt?: number;
132
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
133
+ currentData?: UserLlmUsageMetricsResponse | undefined;
134
+ isUninitialized: false;
135
+ isLoading: false;
136
+ isFetching: false;
137
+ isSuccess: false;
138
+ isError: false;
139
+ }, {
140
+ isLoading: true;
141
+ isFetching: boolean;
142
+ data: undefined;
143
+ } | ({
144
+ isSuccess: true;
145
+ isFetching: true;
146
+ error: undefined;
147
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
148
+ attempt?: number;
149
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
150
+ currentData?: UserLlmUsageMetricsResponse | undefined;
151
+ isUninitialized: false;
152
+ isLoading: false;
153
+ isFetching: false;
154
+ isSuccess: false;
155
+ isError: false;
156
+ }, "data" | "fulfilledTimeStamp">>) | ({
157
+ isSuccess: true;
158
+ isFetching: false;
159
+ error: undefined;
160
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
161
+ attempt?: number;
162
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
163
+ currentData?: UserLlmUsageMetricsResponse | undefined;
164
+ isUninitialized: false;
165
+ isLoading: false;
166
+ isFetching: false;
167
+ isSuccess: false;
168
+ isError: false;
169
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
170
+ isError: true;
171
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
172
+ attempt?: number;
173
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>> & {
174
+ currentData?: UserLlmUsageMetricsResponse | undefined;
175
+ isUninitialized: false;
176
+ isLoading: false;
177
+ isFetching: false;
178
+ isSuccess: false;
179
+ isError: false;
180
+ }, "error">>)>> & {
181
+ status: import("@reduxjs/toolkit/query").QueryStatus;
182
+ }) => R) | undefined;
183
+ }) | undefined) => [R][R extends any ? 0 : never] & {
184
+ refetch: () => import("@reduxjs/toolkit/query").QueryActionCreatorResult<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageMetricsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
185
+ attempt?: number;
186
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageMetricsResponse, "userLlmUsageApiSlice", unknown>>;
187
+ }, useGetUserLlmUsageTracesQuery: <R extends Record<string, any> = import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
188
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
189
+ originalArgs?: undefined | undefined;
190
+ data?: undefined | undefined;
191
+ error?: undefined | undefined;
192
+ requestId?: undefined | undefined;
193
+ endpointName?: string | undefined;
194
+ startedTimeStamp?: undefined | undefined;
195
+ fulfilledTimeStamp?: undefined | undefined;
196
+ } & {
197
+ currentData?: UserLlmUsageTracesResponse | undefined;
198
+ isUninitialized: false;
199
+ isLoading: false;
200
+ isFetching: false;
201
+ isSuccess: false;
202
+ isError: false;
203
+ }, "isUninitialized"> & {
204
+ isUninitialized: true;
205
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
206
+ attempt?: number;
207
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
208
+ currentData?: UserLlmUsageTracesResponse | undefined;
209
+ isUninitialized: false;
210
+ isLoading: false;
211
+ isFetching: false;
212
+ isSuccess: false;
213
+ isError: false;
214
+ }, {
215
+ isLoading: true;
216
+ isFetching: boolean;
217
+ data: undefined;
218
+ } | ({
219
+ isSuccess: true;
220
+ isFetching: true;
221
+ error: undefined;
222
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
223
+ attempt?: number;
224
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
225
+ currentData?: UserLlmUsageTracesResponse | undefined;
226
+ isUninitialized: false;
227
+ isLoading: false;
228
+ isFetching: false;
229
+ isSuccess: false;
230
+ isError: false;
231
+ }, "data" | "fulfilledTimeStamp">>) | ({
232
+ isSuccess: true;
233
+ isFetching: false;
234
+ error: undefined;
235
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
236
+ attempt?: number;
237
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
238
+ currentData?: UserLlmUsageTracesResponse | undefined;
239
+ isUninitialized: false;
240
+ isLoading: false;
241
+ isFetching: false;
242
+ isSuccess: false;
243
+ isError: false;
244
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
245
+ isError: true;
246
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
247
+ attempt?: number;
248
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
249
+ currentData?: UserLlmUsageTracesResponse | undefined;
250
+ isUninitialized: false;
251
+ isLoading: false;
252
+ isFetching: false;
253
+ isSuccess: false;
254
+ isError: false;
255
+ }, "error">>)>> & {
256
+ status: import("@reduxjs/toolkit/query").QueryStatus;
257
+ }>(arg: UserLlmUsageTracesParams | typeof import("@reduxjs/toolkit/query").skipToken, options?: (import("@reduxjs/toolkit/query").SubscriptionOptions & {
258
+ skip?: boolean;
259
+ refetchOnMountOrArgChange?: boolean | number;
260
+ } & {
261
+ skip?: boolean;
262
+ selectFromResult?: ((state: import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
263
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
264
+ originalArgs?: undefined | undefined;
265
+ data?: undefined | undefined;
266
+ error?: undefined | undefined;
267
+ requestId?: undefined | undefined;
268
+ endpointName?: string | undefined;
269
+ startedTimeStamp?: undefined | undefined;
270
+ fulfilledTimeStamp?: undefined | undefined;
271
+ } & {
272
+ currentData?: UserLlmUsageTracesResponse | undefined;
273
+ isUninitialized: false;
274
+ isLoading: false;
275
+ isFetching: false;
276
+ isSuccess: false;
277
+ isError: false;
278
+ }, "isUninitialized"> & {
279
+ isUninitialized: true;
280
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
281
+ attempt?: number;
282
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
283
+ currentData?: UserLlmUsageTracesResponse | undefined;
284
+ isUninitialized: false;
285
+ isLoading: false;
286
+ isFetching: false;
287
+ isSuccess: false;
288
+ isError: false;
289
+ }, {
290
+ isLoading: true;
291
+ isFetching: boolean;
292
+ data: undefined;
293
+ } | ({
294
+ isSuccess: true;
295
+ isFetching: true;
296
+ error: undefined;
297
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
298
+ attempt?: number;
299
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
300
+ currentData?: UserLlmUsageTracesResponse | undefined;
301
+ isUninitialized: false;
302
+ isLoading: false;
303
+ isFetching: false;
304
+ isSuccess: false;
305
+ isError: false;
306
+ }, "data" | "fulfilledTimeStamp">>) | ({
307
+ isSuccess: true;
308
+ isFetching: false;
309
+ error: undefined;
310
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
311
+ attempt?: number;
312
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
313
+ currentData?: UserLlmUsageTracesResponse | undefined;
314
+ isUninitialized: false;
315
+ isLoading: false;
316
+ isFetching: false;
317
+ isSuccess: false;
318
+ isError: false;
319
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
320
+ isError: true;
321
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
322
+ attempt?: number;
323
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>> & {
324
+ currentData?: UserLlmUsageTracesResponse | undefined;
325
+ isUninitialized: false;
326
+ isLoading: false;
327
+ isFetching: false;
328
+ isSuccess: false;
329
+ isError: false;
330
+ }, "error">>)>> & {
331
+ status: import("@reduxjs/toolkit/query").QueryStatus;
332
+ }) => R) | undefined;
333
+ }) | undefined) => [R][R extends any ? 0 : never] & {
334
+ refetch: () => import("@reduxjs/toolkit/query").QueryActionCreatorResult<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageTracesParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
335
+ attempt?: number;
336
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageTracesResponse, "userLlmUsageApiSlice", unknown>>;
337
+ }, useGetUserLlmUsageObservationsQuery: <R extends Record<string, any> = import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
338
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
339
+ originalArgs?: undefined | undefined;
340
+ data?: undefined | undefined;
341
+ error?: undefined | undefined;
342
+ requestId?: undefined | undefined;
343
+ endpointName?: string | undefined;
344
+ startedTimeStamp?: undefined | undefined;
345
+ fulfilledTimeStamp?: undefined | undefined;
346
+ } & {
347
+ currentData?: UserLlmUsageObservationsResponse | undefined;
348
+ isUninitialized: false;
349
+ isLoading: false;
350
+ isFetching: false;
351
+ isSuccess: false;
352
+ isError: false;
353
+ }, "isUninitialized"> & {
354
+ isUninitialized: true;
355
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
356
+ attempt?: number;
357
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
358
+ currentData?: UserLlmUsageObservationsResponse | undefined;
359
+ isUninitialized: false;
360
+ isLoading: false;
361
+ isFetching: false;
362
+ isSuccess: false;
363
+ isError: false;
364
+ }, {
365
+ isLoading: true;
366
+ isFetching: boolean;
367
+ data: undefined;
368
+ } | ({
369
+ isSuccess: true;
370
+ isFetching: true;
371
+ error: undefined;
372
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
373
+ attempt?: number;
374
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
375
+ currentData?: UserLlmUsageObservationsResponse | undefined;
376
+ isUninitialized: false;
377
+ isLoading: false;
378
+ isFetching: false;
379
+ isSuccess: false;
380
+ isError: false;
381
+ }, "data" | "fulfilledTimeStamp">>) | ({
382
+ isSuccess: true;
383
+ isFetching: false;
384
+ error: undefined;
385
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
386
+ attempt?: number;
387
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
388
+ currentData?: UserLlmUsageObservationsResponse | undefined;
389
+ isUninitialized: false;
390
+ isLoading: false;
391
+ isFetching: false;
392
+ isSuccess: false;
393
+ isError: false;
394
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
395
+ isError: true;
396
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
397
+ attempt?: number;
398
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
399
+ currentData?: UserLlmUsageObservationsResponse | undefined;
400
+ isUninitialized: false;
401
+ isLoading: false;
402
+ isFetching: false;
403
+ isSuccess: false;
404
+ isError: false;
405
+ }, "error">>)>> & {
406
+ status: import("@reduxjs/toolkit/query").QueryStatus;
407
+ }>(arg: UserLlmUsageObservationsParams | typeof import("@reduxjs/toolkit/query").skipToken, options?: (import("@reduxjs/toolkit/query").SubscriptionOptions & {
408
+ skip?: boolean;
409
+ refetchOnMountOrArgChange?: boolean | number;
410
+ } & {
411
+ skip?: boolean;
412
+ selectFromResult?: ((state: import("@reduxjs/toolkit/query").TSHelpersId<(Omit<{
413
+ status: import("@reduxjs/toolkit/query").QueryStatus.uninitialized;
414
+ originalArgs?: undefined | undefined;
415
+ data?: undefined | undefined;
416
+ error?: undefined | undefined;
417
+ requestId?: undefined | undefined;
418
+ endpointName?: string | undefined;
419
+ startedTimeStamp?: undefined | undefined;
420
+ fulfilledTimeStamp?: undefined | undefined;
421
+ } & {
422
+ currentData?: UserLlmUsageObservationsResponse | undefined;
423
+ isUninitialized: false;
424
+ isLoading: false;
425
+ isFetching: false;
426
+ isSuccess: false;
427
+ isError: false;
428
+ }, "isUninitialized"> & {
429
+ isUninitialized: true;
430
+ }) | import("@reduxjs/toolkit/query").TSHelpersOverride<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
431
+ attempt?: number;
432
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
433
+ currentData?: UserLlmUsageObservationsResponse | undefined;
434
+ isUninitialized: false;
435
+ isLoading: false;
436
+ isFetching: false;
437
+ isSuccess: false;
438
+ isError: false;
439
+ }, {
440
+ isLoading: true;
441
+ isFetching: boolean;
442
+ data: undefined;
443
+ } | ({
444
+ isSuccess: true;
445
+ isFetching: true;
446
+ error: undefined;
447
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
448
+ attempt?: number;
449
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
450
+ currentData?: UserLlmUsageObservationsResponse | undefined;
451
+ isUninitialized: false;
452
+ isLoading: false;
453
+ isFetching: false;
454
+ isSuccess: false;
455
+ isError: false;
456
+ }, "data" | "fulfilledTimeStamp">>) | ({
457
+ isSuccess: true;
458
+ isFetching: false;
459
+ error: undefined;
460
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
461
+ attempt?: number;
462
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
463
+ currentData?: UserLlmUsageObservationsResponse | undefined;
464
+ isUninitialized: false;
465
+ isLoading: false;
466
+ isFetching: false;
467
+ isSuccess: false;
468
+ isError: false;
469
+ }, "data" | "fulfilledTimeStamp" | "currentData">>) | ({
470
+ isError: true;
471
+ } & Required<Pick<import("@reduxjs/toolkit/query").QuerySubState<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
472
+ attempt?: number;
473
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>> & {
474
+ currentData?: UserLlmUsageObservationsResponse | undefined;
475
+ isUninitialized: false;
476
+ isLoading: false;
477
+ isFetching: false;
478
+ isSuccess: false;
479
+ isError: false;
480
+ }, "error">>)>> & {
481
+ status: import("@reduxjs/toolkit/query").QueryStatus;
482
+ }) => R) | undefined;
483
+ }) | undefined) => [R][R extends any ? 0 : never] & {
484
+ refetch: () => import("@reduxjs/toolkit/query").QueryActionCreatorResult<import("@reduxjs/toolkit/query").QueryDefinition<UserLlmUsageObservationsParams, import("@reduxjs/toolkit/query").BaseQueryFn<void, unknown, unknown, {
485
+ attempt?: number;
486
+ } & import("@reduxjs/toolkit/query").RetryOptions, {}>, string, UserLlmUsageObservationsResponse, "userLlmUsageApiSlice", unknown>>;
487
+ };
488
+ export {};
@@ -0,0 +1,25 @@
1
+ import { SERVICES } from '@data-layer/constants';
2
+ import type { UserLlmUsageErrorKind, UserLlmUsageParams } from './types';
3
+ export declare const USER_LLM_USAGE_REDUCER_PATH = "userLlmUsageApiSlice";
4
+ export declare const USER_LLM_USAGE_QUERY_KEYS: {
5
+ GET_USER_LLM_USAGE: () => string[];
6
+ };
7
+ /** Upstream cap on `limit`. */
8
+ export declare const USER_LLM_USAGE_MAX_LIMIT = 1000;
9
+ /**
10
+ * The same llm-usage endpoint the admin analytics use, always scoped to one
11
+ * `username`. The path builder is the admin one, so array params (`measures`)
12
+ * serialize identically — comma-joined — and empty values are dropped the
13
+ * same way.
14
+ */
15
+ export declare const USER_LLM_USAGE_ENDPOINTS: {
16
+ GET_USER_LLM_USAGE: {
17
+ service: SERVICES;
18
+ path: ({ resource, ...rest }: UserLlmUsageParams) => string;
19
+ };
20
+ };
21
+ /**
22
+ * User-safe fallbacks per error kind. None of them echo the backend's detail,
23
+ * so a 403 or 404 never tells the viewer whether another user or tenant exists.
24
+ */
25
+ export declare const USER_LLM_USAGE_ERROR_MESSAGES: Record<UserLlmUsageErrorKind, string>;