Skip to content

Commit 8868026

Browse files
committed
fix list of models
1 parent e683492 commit 8868026

4 files changed

Lines changed: 71 additions & 10 deletions

File tree

api/transformerlab/routers/model.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,45 @@ async def model_local_list():
3838
return models
3939

4040

41+
@router.get("/model/registry_versions")
42+
@cached(key="models:registry_versions", ttl="1h", tags=["models", "models:registry_versions", "asset_versions"])
43+
async def model_registry_versions():
44+
"""List model registry versions as selectable model IDs."""
45+
from transformerlab.services import asset_version_service
46+
47+
groups = await asset_version_service.list_groups("model")
48+
versions: list[dict] = []
49+
50+
for group in groups:
51+
group_id = group.get("group_id")
52+
group_name = group.get("group_name") or group_id
53+
if not group_id:
54+
continue
55+
56+
group_versions = await asset_version_service.list_versions("model", group_id)
57+
for version in group_versions:
58+
model_id = version.get("asset_id")
59+
version_label = version.get("version_label")
60+
if not model_id or not version_label:
61+
continue
62+
63+
tag = version.get("tag")
64+
tag_suffix = f" ({tag})" if tag else ""
65+
versions.append(
66+
{
67+
"model_id": model_id,
68+
"name": f"{group_name}/{version_label}{tag_suffix}",
69+
"group_id": group_id,
70+
"group_name": group_name,
71+
"version_label": version_label,
72+
"tag": tag,
73+
"created_at": version.get("created_at"),
74+
}
75+
)
76+
77+
return versions
78+
79+
4180
@router.get("/model/create")
4281
async def model_local_create(id: str, name: str, json_data={}):
4382
# Use filesystem instead of database

src/renderer/components/Experiment/Tasks/EditInteractiveTaskModal.tsx

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type ProviderOption = {
3838
type ConfigField = {
3939
field_name: string;
4040
env_var: string;
41-
field_type: 'str' | 'integer';
41+
field_type: 'str' | 'integer' | 'model';
4242
required?: boolean;
4343
placeholder?: string;
4444
help_text?: string;
@@ -399,11 +399,18 @@ export default function EditInteractiveTaskModal({
399399
body.provider_name = provider.name;
400400
}
401401

402-
// Persist model name to history before saving
403-
const modelName = configFieldValues['MODEL_NAME'];
404-
if (modelName?.trim() && (interactiveType || galleryId)) {
405-
const taskTypeOrId = interactiveType || galleryId;
406-
saveModelToHistory(getModelHistoryKey(taskTypeOrId), modelName.trim());
402+
// Persist all model-type fields to history before saving
403+
const taskTypeOrId = interactiveType || galleryId;
404+
if (taskTypeOrId) {
405+
const historyKey = getModelHistoryKey(taskTypeOrId);
406+
templateConfigFields
407+
.filter((field) => field.field_type === 'model')
408+
.forEach((field) => {
409+
const modelValue = configFieldValues[field.env_var];
410+
if (modelValue?.trim()) {
411+
saveModelToHistory(historyKey, modelValue.trim());
412+
}
413+
});
407414
}
408415

409416
// The caller is responsible for actually persisting the changes via API.
@@ -542,20 +549,20 @@ export default function EditInteractiveTaskModal({
542549
<>
543550
{templateConfigFields.map((field) => {
544551
const isNgrokField = field.env_var === 'NGROK_AUTH_TOKEN';
545-
const isModelNameField = field.env_var === 'MODEL_NAME';
552+
const isModelField = field.field_type === 'model';
546553
return (
547554
<FormControl
548555
key={field.env_var}
549556
required={field.required && !isNgrokField}
550557
>
551558
<FormLabel>{field.field_name}</FormLabel>
552-
{isModelNameField ? (
559+
{isModelField ? (
553560
<ModelNameInput
554561
value={configFieldValues[field.env_var] || ''}
555562
onChange={(v) =>
556563
handleConfigFieldChange(field.env_var, v)
557564
}
558-
taskTypeOrId={interactiveType}
565+
taskTypeOrId={interactiveType || galleryId}
559566
placeholder={field.placeholder}
560567
disabled={false}
561568
required={!!field.required}

src/renderer/components/Experiment/Tasks/NewInteractiveTaskModal.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,12 +234,23 @@ export default function NewInteractiveTaskModal({
234234
open && step === 'config' ? chatAPI.Endpoints.Models.LocalList() : null,
235235
fetcher,
236236
);
237+
const { data: registryModelsData } = useSWR(
238+
open && step === 'config'
239+
? chatAPI.Endpoints.Models.RegistryVersionList()
240+
: null,
241+
fetcher,
242+
);
237243

238244
const installedModels = React.useMemo(() => {
239245
if (!installedModelsData || !Array.isArray(installedModelsData)) return [];
240246
return installedModelsData as Array<{ model_id: string; name?: string }>;
241247
}, [installedModelsData]);
242248

249+
const registryModels = React.useMemo(() => {
250+
if (!registryModelsData || !Array.isArray(registryModelsData)) return [];
251+
return registryModelsData as Array<{ model_id: string; name?: string }>;
252+
}, [registryModelsData]);
253+
243254
React.useEffect(() => {
244255
if (!open) {
245256
setStep('provider');
@@ -737,7 +748,10 @@ export default function NewInteractiveTaskModal({
737748
listbox: { sx: { maxHeight: 240 } },
738749
}}
739750
>
740-
{installedModels.map((m) => (
751+
{(registryModels.length > 0
752+
? registryModels
753+
: installedModels
754+
).map((m) => (
741755
<Option
742756
key={m.model_id}
743757
value={m.model_id}

src/renderer/lib/api-client/endpoints.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ Endpoints.Dataset = {
179179

180180
Endpoints.Models = {
181181
LocalList: () => `${API_URL()}model/list`,
182+
RegistryVersionList: () => `${API_URL()}model/registry_versions`,
182183
ModelGroups: () => `${API_URL()}model/model_groups_list`,
183184
GetPeftsForModel: () => `${API_URL()}model/pefts`,
184185
DeletePeft: (modelId: string, peft: string) =>

0 commit comments

Comments
 (0)