Skip to content

Commit 90dfbe9

Browse files
peppescgkantord
andauthored
feat: add workspace preferred model (#217)
* feat(mux): wip model overrides workspace update * fetch providers from BE (currently mocked) * render multiple overrides * fix form submit * feat: add/remove model ovveride row * add sorting feature * fix sortable partially * fix sorting * . * fix scrolling * actually save filter to zustand store * fix label * fix label layout * remove console logs * remove unnecessary div * extract <SortableArea /> * use renderprop in <SortableArea /> * simplify drag behavior * simplify folder structure * fix: add key to array item * test: add workspace model override * fix: type * fix: mock types * chore: update api * feat: add discard button * refactor: configure preferred model * hide preferred model section * chore: update api * refactor: notification message --------- Co-authored-by: Daniel Kantor <[email protected]>
1 parent aebe051 commit 90dfbe9

13 files changed

+724
-190
lines changed

src/api/generated/@tanstack/react-query.gen.ts

+61-37
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,12 @@ import {
77
healthCheckHealthGet,
88
v1ListProviderEndpoints,
99
v1AddProviderEndpoint,
10+
v1ListAllModelsForAllProviders,
11+
v1ListModelsByProvider,
1012
v1GetProviderEndpoint,
1113
v1UpdateProviderEndpoint,
1214
v1DeleteProviderEndpoint,
13-
v1ListModelsByProvider,
14-
v1ListAllModelsForAllProviders,
15+
v1ConfigureAuthMaterial,
1516
v1ListWorkspaces,
1617
v1CreateWorkspace,
1718
v1ListActiveWorkspaces,
@@ -36,14 +37,17 @@ import type {
3637
V1AddProviderEndpointData,
3738
V1AddProviderEndpointError,
3839
V1AddProviderEndpointResponse,
40+
V1ListModelsByProviderData,
3941
V1GetProviderEndpointData,
4042
V1UpdateProviderEndpointData,
4143
V1UpdateProviderEndpointError,
4244
V1UpdateProviderEndpointResponse,
4345
V1DeleteProviderEndpointData,
4446
V1DeleteProviderEndpointError,
4547
V1DeleteProviderEndpointResponse,
46-
V1ListModelsByProviderData,
48+
V1ConfigureAuthMaterialData,
49+
V1ConfigureAuthMaterialError,
50+
V1ConfigureAuthMaterialResponse,
4751
V1CreateWorkspaceData,
4852
V1CreateWorkspaceError,
4953
V1CreateWorkspaceResponse,
@@ -190,6 +194,48 @@ export const v1AddProviderEndpointMutation = (
190194
return mutationOptions;
191195
};
192196

197+
export const v1ListAllModelsForAllProvidersQueryKey = (
198+
options?: OptionsLegacyParser,
199+
) => [createQueryKey("v1ListAllModelsForAllProviders", options)];
200+
201+
export const v1ListAllModelsForAllProvidersOptions = (
202+
options?: OptionsLegacyParser,
203+
) => {
204+
return queryOptions({
205+
queryFn: async ({ queryKey, signal }) => {
206+
const { data } = await v1ListAllModelsForAllProviders({
207+
...options,
208+
...queryKey[0],
209+
signal,
210+
throwOnError: true,
211+
});
212+
return data;
213+
},
214+
queryKey: v1ListAllModelsForAllProvidersQueryKey(options),
215+
});
216+
};
217+
218+
export const v1ListModelsByProviderQueryKey = (
219+
options: OptionsLegacyParser<V1ListModelsByProviderData>,
220+
) => [createQueryKey("v1ListModelsByProvider", options)];
221+
222+
export const v1ListModelsByProviderOptions = (
223+
options: OptionsLegacyParser<V1ListModelsByProviderData>,
224+
) => {
225+
return queryOptions({
226+
queryFn: async ({ queryKey, signal }) => {
227+
const { data } = await v1ListModelsByProvider({
228+
...options,
229+
...queryKey[0],
230+
signal,
231+
throwOnError: true,
232+
});
233+
return data;
234+
},
235+
queryKey: v1ListModelsByProviderQueryKey(options),
236+
});
237+
};
238+
193239
export const v1GetProviderEndpointQueryKey = (
194240
options: OptionsLegacyParser<V1GetProviderEndpointData>,
195241
) => [createQueryKey("v1GetProviderEndpoint", options)];
@@ -251,46 +297,24 @@ export const v1DeleteProviderEndpointMutation = (
251297
return mutationOptions;
252298
};
253299

254-
export const v1ListModelsByProviderQueryKey = (
255-
options: OptionsLegacyParser<V1ListModelsByProviderData>,
256-
) => [createQueryKey("v1ListModelsByProvider", options)];
257-
258-
export const v1ListModelsByProviderOptions = (
259-
options: OptionsLegacyParser<V1ListModelsByProviderData>,
260-
) => {
261-
return queryOptions({
262-
queryFn: async ({ queryKey, signal }) => {
263-
const { data } = await v1ListModelsByProvider({
264-
...options,
265-
...queryKey[0],
266-
signal,
267-
throwOnError: true,
268-
});
269-
return data;
270-
},
271-
queryKey: v1ListModelsByProviderQueryKey(options),
272-
});
273-
};
274-
275-
export const v1ListAllModelsForAllProvidersQueryKey = (
276-
options?: OptionsLegacyParser,
277-
) => [createQueryKey("v1ListAllModelsForAllProviders", options)];
278-
279-
export const v1ListAllModelsForAllProvidersOptions = (
280-
options?: OptionsLegacyParser,
300+
export const v1ConfigureAuthMaterialMutation = (
301+
options?: Partial<OptionsLegacyParser<V1ConfigureAuthMaterialData>>,
281302
) => {
282-
return queryOptions({
283-
queryFn: async ({ queryKey, signal }) => {
284-
const { data } = await v1ListAllModelsForAllProviders({
303+
const mutationOptions: UseMutationOptions<
304+
V1ConfigureAuthMaterialResponse,
305+
V1ConfigureAuthMaterialError,
306+
OptionsLegacyParser<V1ConfigureAuthMaterialData>
307+
> = {
308+
mutationFn: async (localOptions) => {
309+
const { data } = await v1ConfigureAuthMaterial({
285310
...options,
286-
...queryKey[0],
287-
signal,
311+
...localOptions,
288312
throwOnError: true,
289313
});
290314
return data;
291315
},
292-
queryKey: v1ListAllModelsForAllProvidersQueryKey(options),
293-
});
316+
};
317+
return mutationOptions;
294318
};
295319

296320
export const v1ListWorkspacesQueryKey = (options?: OptionsLegacyParser) => [

src/api/generated/sdk.gen.ts

+52-32
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ import type {
1414
V1AddProviderEndpointData,
1515
V1AddProviderEndpointError,
1616
V1AddProviderEndpointResponse,
17+
V1ListAllModelsForAllProvidersError,
18+
V1ListAllModelsForAllProvidersResponse,
19+
V1ListModelsByProviderData,
20+
V1ListModelsByProviderError,
21+
V1ListModelsByProviderResponse,
1722
V1GetProviderEndpointData,
1823
V1GetProviderEndpointError,
1924
V1GetProviderEndpointResponse,
@@ -23,11 +28,9 @@ import type {
2328
V1DeleteProviderEndpointData,
2429
V1DeleteProviderEndpointError,
2530
V1DeleteProviderEndpointResponse,
26-
V1ListModelsByProviderData,
27-
V1ListModelsByProviderError,
28-
V1ListModelsByProviderResponse,
29-
V1ListAllModelsForAllProvidersError,
30-
V1ListAllModelsForAllProvidersResponse,
31+
V1ConfigureAuthMaterialData,
32+
V1ConfigureAuthMaterialError,
33+
V1ConfigureAuthMaterialResponse,
3134
V1ListWorkspacesError,
3235
V1ListWorkspacesResponse,
3336
V1CreateWorkspaceData,
@@ -131,6 +134,42 @@ export const v1AddProviderEndpoint = <ThrowOnError extends boolean = false>(
131134
});
132135
};
133136

137+
/**
138+
* List All Models For All Providers
139+
* List all models for all providers.
140+
*/
141+
export const v1ListAllModelsForAllProviders = <
142+
ThrowOnError extends boolean = false,
143+
>(
144+
options?: OptionsLegacyParser<unknown, ThrowOnError>,
145+
) => {
146+
return (options?.client ?? client).get<
147+
V1ListAllModelsForAllProvidersResponse,
148+
V1ListAllModelsForAllProvidersError,
149+
ThrowOnError
150+
>({
151+
...options,
152+
url: "/api/v1/provider-endpoints/models",
153+
});
154+
};
155+
156+
/**
157+
* List Models By Provider
158+
* List models by provider.
159+
*/
160+
export const v1ListModelsByProvider = <ThrowOnError extends boolean = false>(
161+
options: OptionsLegacyParser<V1ListModelsByProviderData, ThrowOnError>,
162+
) => {
163+
return (options?.client ?? client).get<
164+
V1ListModelsByProviderResponse,
165+
V1ListModelsByProviderError,
166+
ThrowOnError
167+
>({
168+
...options,
169+
url: "/api/v1/provider-endpoints/{provider_id}/models",
170+
});
171+
};
172+
134173
/**
135174
* Get Provider Endpoint
136175
* Get a provider endpoint by ID.
@@ -183,38 +222,19 @@ export const v1DeleteProviderEndpoint = <ThrowOnError extends boolean = false>(
183222
};
184223

185224
/**
186-
* List Models By Provider
187-
* List models by provider.
188-
*/
189-
export const v1ListModelsByProvider = <ThrowOnError extends boolean = false>(
190-
options: OptionsLegacyParser<V1ListModelsByProviderData, ThrowOnError>,
191-
) => {
192-
return (options?.client ?? client).get<
193-
V1ListModelsByProviderResponse,
194-
V1ListModelsByProviderError,
195-
ThrowOnError
196-
>({
197-
...options,
198-
url: "/api/v1/provider-endpoints/{provider_name}/models",
199-
});
200-
};
201-
202-
/**
203-
* List All Models For All Providers
204-
* List all models for all providers.
225+
* Configure Auth Material
226+
* Configure auth material for a provider.
205227
*/
206-
export const v1ListAllModelsForAllProviders = <
207-
ThrowOnError extends boolean = false,
208-
>(
209-
options?: OptionsLegacyParser<unknown, ThrowOnError>,
228+
export const v1ConfigureAuthMaterial = <ThrowOnError extends boolean = false>(
229+
options: OptionsLegacyParser<V1ConfigureAuthMaterialData, ThrowOnError>,
210230
) => {
211-
return (options?.client ?? client).get<
212-
V1ListAllModelsForAllProvidersResponse,
213-
V1ListAllModelsForAllProvidersError,
231+
return (options?.client ?? client).put<
232+
V1ConfigureAuthMaterialResponse,
233+
V1ConfigureAuthMaterialError,
214234
ThrowOnError
215235
>({
216236
...options,
217-
url: "/api/v1/provider-endpoints/models",
237+
url: "/api/v1/provider-endpoints/{provider_id}/auth-material",
218238
});
219239
};
220240

src/api/generated/types.gen.ts

+38-17
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,14 @@ export type CodeSnippet = {
4444
libraries?: Array<string>;
4545
};
4646

47+
/**
48+
* Represents a request to configure auth material for a provider.
49+
*/
50+
export type ConfigureAuthMaterial = {
51+
auth_type: ProviderAuthType;
52+
api_key?: string | null;
53+
};
54+
4755
/**
4856
* Represents a conversation.
4957
*/
@@ -84,7 +92,8 @@ export type ListWorkspacesResponse = {
8492
*/
8593
export type ModelByProvider = {
8694
name: string;
87-
provider: string;
95+
provider_id: string;
96+
provider_name: string;
8897
};
8998

9099
/**
@@ -99,10 +108,10 @@ export enum MuxMatcherType {
99108
* Represents a mux rule for a provider.
100109
*/
101110
export type MuxRule = {
102-
provider: string;
111+
provider_id: string;
103112
model: string;
104113
matcher_type: MuxMatcherType;
105-
matcher: string | null;
114+
matcher?: string | null;
106115
};
107116

108117
/**
@@ -120,12 +129,12 @@ export enum ProviderAuthType {
120129
* so we can use this for muxing messages.
121130
*/
122131
export type ProviderEndpoint = {
123-
id: number;
132+
id?: string | null;
124133
name: string;
125134
description?: string;
126135
provider_type: ProviderType;
127136
endpoint: string;
128-
auth_type: ProviderAuthType;
137+
auth_type?: ProviderAuthType | null;
129138
};
130139

131140
/**
@@ -135,8 +144,9 @@ export enum ProviderType {
135144
OPENAI = "openai",
136145
ANTHROPIC = "anthropic",
137146
VLLM = "vllm",
138-
LLAMACPP = "llamacpp",
139147
OLLAMA = "ollama",
148+
LM_STUDIO = "lm_studio",
149+
LLAMACPP = "llamacpp",
140150
}
141151

142152
/**
@@ -216,9 +226,23 @@ export type V1AddProviderEndpointResponse = ProviderEndpoint;
216226

217227
export type V1AddProviderEndpointError = HTTPValidationError;
218228

229+
export type V1ListAllModelsForAllProvidersResponse = Array<ModelByProvider>;
230+
231+
export type V1ListAllModelsForAllProvidersError = unknown;
232+
233+
export type V1ListModelsByProviderData = {
234+
path: {
235+
provider_id: string;
236+
};
237+
};
238+
239+
export type V1ListModelsByProviderResponse = Array<ModelByProvider>;
240+
241+
export type V1ListModelsByProviderError = HTTPValidationError;
242+
219243
export type V1GetProviderEndpointData = {
220244
path: {
221-
provider_id: number;
245+
provider_id: string;
222246
};
223247
};
224248

@@ -229,7 +253,7 @@ export type V1GetProviderEndpointError = HTTPValidationError;
229253
export type V1UpdateProviderEndpointData = {
230254
body: ProviderEndpoint;
231255
path: {
232-
provider_id: number;
256+
provider_id: string;
233257
};
234258
};
235259

@@ -239,27 +263,24 @@ export type V1UpdateProviderEndpointError = HTTPValidationError;
239263

240264
export type V1DeleteProviderEndpointData = {
241265
path: {
242-
provider_id: number;
266+
provider_id: string;
243267
};
244268
};
245269

246270
export type V1DeleteProviderEndpointResponse = unknown;
247271

248272
export type V1DeleteProviderEndpointError = HTTPValidationError;
249273

250-
export type V1ListModelsByProviderData = {
274+
export type V1ConfigureAuthMaterialData = {
275+
body: ConfigureAuthMaterial;
251276
path: {
252-
provider_name: string;
277+
provider_id: string;
253278
};
254279
};
255280

256-
export type V1ListModelsByProviderResponse = Array<ModelByProvider>;
257-
258-
export type V1ListModelsByProviderError = HTTPValidationError;
281+
export type V1ConfigureAuthMaterialResponse = void;
259282

260-
export type V1ListAllModelsForAllProvidersResponse = Array<ModelByProvider>;
261-
262-
export type V1ListAllModelsForAllProvidersError = unknown;
283+
export type V1ConfigureAuthMaterialError = HTTPValidationError;
263284

264285
export type V1ListWorkspacesResponse = ListWorkspacesResponse;
265286

0 commit comments

Comments
 (0)