summaryrefslogtreecommitdiff
path: root/extension/react-app/src/components/ModelSelect.tsx
blob: 9699847c86e9337ba46c87a8d998949792658021 (plain)
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import styled from "styled-components";
import {
  defaultBorderRadius,
  secondaryDark,
  vscBackground,
  vscForeground,
} from ".";
import { useContext, useEffect } from "react";
import { GUIClientContext } from "../App";
import { RootStore } from "../redux/store";
import { useSelector } from "react-redux";

const MODEL_INFO: { title: string; class: string; args: any }[] = [
  {
    title: "gpt-4",
    class: "MaybeProxyOpenAI",
    args: {
      model: "gpt-4",
      api_key: "",
    },
  },
  {
    title: "gpt-3.5-turbo",
    class: "MaybeProxyOpenAI",
    args: {
      model: "gpt-3.5-turbo",
      api_key: "",
    },
  },
  {
    title: "claude-2",
    class: "AnthropicLLM",
    args: {
      model: "claude-2",
      api_key: "<ANTHROPIC_API_KEY>",
    },
  },
  {
    title: "GGML",
    class: "GGML",
    args: {},
  },
  {
    title: "Ollama",
    class: "Ollama",
    args: {
      model: "codellama",
    },
  },
  {
    title: "Replicate",
    class: "ReplicateLLM",
    args: {
      model:
        "replicate/llama-2-70b-chat:58d078176e02c219e11eb4da5a02a7830a283b14cf8f94537af893ccff5ee781",
      api_key: "<REPLICATE_API_KEY>",
    },
  },
  {
    title: "TogetherAI",
    class: "TogetherLLM",
    args: {
      model: "gpt-4",
      api_key: "<TOGETHER_API_KEY>",
    },
  },
  {
    title: "llama.cpp",
    class: "LlamaCpp",
    args: {},
  },
];

const Select = styled.select`
  border: none;
  width: fit-content;
  background-color: ${secondaryDark};
  color: ${vscForeground};
  border-radius: ${defaultBorderRadius};
  padding: 6px;
  /* box-shadow: 0px 0px 1px 0px ${vscForeground}; */
  max-height: 35vh;
  overflow: scroll;
  cursor: pointer;
  margin-right: auto;

  &:focus {
    outline: none;
  }
`;

function ModelSelect(props: {}) {
  const client = useContext(GUIClientContext);
  const defaultModel = useSelector(
    (state: RootStore) =>
      (state.serverState.config as any)?.models?.default?.class_name
  );

  return (
    <Select
      defaultValue={0}
      onChange={(e) => {
        const model = MODEL_INFO[parseInt(e.target.value)];
        client?.setModelForRole("*", model.class, model.args);
      }}
    >
      {MODEL_INFO.map((model, idx) => {
        return (
          <option selected={defaultModel === model.class} value={idx}>
            {model.title}
          </option>
        );
      })}
    </Select>
  );
}

export default ModelSelect;