File size: 1,618 Bytes
8a37e0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import { EMPTY_ARRAY } from 'app/store/constants';
import { useCallback } from 'react';
import { modelConfigsAdapterSelectors, useGetModelConfigsQuery } from 'services/api/endpoints/models';
import type { StarterModel } from 'services/api/types';

type ModelInstallArg = {
  config: Pick<StarterModel, 'name' | 'base' | 'type' | 'description' | 'format'>;
  source: string;
};

/**
 * Flattens a starter model and its dependencies into a list of models, including the starter model itself.
 */
export const flattenStarterModel = (starterModel: StarterModel): StarterModel[] => {
  return [starterModel, ...(starterModel.dependencies || [])];
};

export const useBuildModelInstallArg = () => {
  const { modelList } = useGetModelConfigsQuery(undefined, {
    selectFromResult: ({ data }) => ({ modelList: data ? modelConfigsAdapterSelectors.selectAll(data) : EMPTY_ARRAY }),
  });

  const getIsInstalled = useCallback(
    ({ source, name, base, type, is_installed, previous_names }: StarterModel): boolean =>
      modelList.some(
        (mc) =>
          is_installed ||
          source === mc.source ||
          (base === mc.base && (name === mc.name || previous_names?.includes(name)) && type === mc.type)
      ),
    [modelList]
  );

  const buildModelInstallArg = useCallback((starterModel: StarterModel): ModelInstallArg => {
    const { name, base, type, source, description, format } = starterModel;

    return {
      config: {
        name,
        base,
        type,
        description,
        format,
      },
      source,
    };
  }, []);

  return { getIsInstalled, buildModelInstallArg };
};