forked from XiaoMo/ChatGPT-Next-Web
feat: CUSTOM_MODELS support mapper
This commit is contained in:
parent
be9774943b
commit
a5a1f2e8ad
@ -81,7 +81,7 @@ export async function requestOpenai(req: NextRequest) {
|
|||||||
const jsonBody = JSON.parse(clonedBody) as { model?: string };
|
const jsonBody = JSON.parse(clonedBody) as { model?: string };
|
||||||
|
|
||||||
// not undefined and is false
|
// not undefined and is false
|
||||||
if (modelTable[jsonBody?.model ?? ""] === false) {
|
if (modelTable[jsonBody?.model ?? ""].available === false) {
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
{
|
{
|
||||||
error: true,
|
error: true,
|
||||||
|
@ -433,7 +433,7 @@ export function ChatActions(props: {
|
|||||||
const currentModel = chatStore.currentSession().mask.modelConfig.model;
|
const currentModel = chatStore.currentSession().mask.modelConfig.model;
|
||||||
const allModels = useAllModels();
|
const allModels = useAllModels();
|
||||||
const models = useMemo(
|
const models = useMemo(
|
||||||
() => allModels.filter((m) => m.available).map((m) => m.name),
|
() => allModels.filter((m) => m.available),
|
||||||
[allModels],
|
[allModels],
|
||||||
);
|
);
|
||||||
const [showModelSelector, setShowModelSelector] = useState(false);
|
const [showModelSelector, setShowModelSelector] = useState(false);
|
||||||
@ -441,9 +441,9 @@ export function ChatActions(props: {
|
|||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// if current model is not available
|
// if current model is not available
|
||||||
// switch to first available model
|
// switch to first available model
|
||||||
const isUnavaliableModel = !models.includes(currentModel);
|
const isUnavaliableModel = !models.some((m) => m.name === currentModel);
|
||||||
if (isUnavaliableModel && models.length > 0) {
|
if (isUnavaliableModel && models.length > 0) {
|
||||||
const nextModel = models[0] as ModelType;
|
const nextModel = models[0].name as ModelType;
|
||||||
chatStore.updateCurrentSession(
|
chatStore.updateCurrentSession(
|
||||||
(session) => (session.mask.modelConfig.model = nextModel),
|
(session) => (session.mask.modelConfig.model = nextModel),
|
||||||
);
|
);
|
||||||
@ -531,8 +531,8 @@ export function ChatActions(props: {
|
|||||||
<Selector
|
<Selector
|
||||||
defaultSelectedValue={currentModel}
|
defaultSelectedValue={currentModel}
|
||||||
items={models.map((m) => ({
|
items={models.map((m) => ({
|
||||||
title: m,
|
title: m.displayName,
|
||||||
value: m,
|
value: m.name,
|
||||||
}))}
|
}))}
|
||||||
onClose={() => setShowModelSelector(false)}
|
onClose={() => setShowModelSelector(false)}
|
||||||
onSelection={(s) => {
|
onSelection={(s) => {
|
||||||
|
@ -4,21 +4,34 @@ export function collectModelTable(
|
|||||||
models: readonly LLMModel[],
|
models: readonly LLMModel[],
|
||||||
customModels: string,
|
customModels: string,
|
||||||
) {
|
) {
|
||||||
const modelTable: Record<string, boolean> = {};
|
const modelTable: Record<
|
||||||
|
string,
|
||||||
|
{ available: boolean; name: string; displayName: string }
|
||||||
|
> = {};
|
||||||
|
|
||||||
// default models
|
// default models
|
||||||
models.forEach((m) => (modelTable[m.name] = m.available));
|
models.forEach(
|
||||||
|
(m) =>
|
||||||
|
(modelTable[m.name] = {
|
||||||
|
...m,
|
||||||
|
displayName: m.name,
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
// server custom models
|
// server custom models
|
||||||
customModels
|
customModels
|
||||||
.split(",")
|
.split(",")
|
||||||
.filter((v) => !!v && v.length > 0)
|
.filter((v) => !!v && v.length > 0)
|
||||||
.map((m) => {
|
.map((m) => {
|
||||||
if (m.startsWith("+")) {
|
const available = !m.startsWith("-");
|
||||||
modelTable[m.slice(1)] = true;
|
const nameConfig =
|
||||||
} else if (m.startsWith("-")) {
|
m.startsWith("+") || m.startsWith("-") ? m.slice(1) : m;
|
||||||
modelTable[m.slice(1)] = false;
|
const [name, displayName] = nameConfig.split(":");
|
||||||
} else modelTable[m] = true;
|
modelTable[name] = {
|
||||||
|
name,
|
||||||
|
displayName: displayName || name,
|
||||||
|
available,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
return modelTable;
|
return modelTable;
|
||||||
}
|
}
|
||||||
@ -31,10 +44,7 @@ export function collectModels(
|
|||||||
customModels: string,
|
customModels: string,
|
||||||
) {
|
) {
|
||||||
const modelTable = collectModelTable(models, customModels);
|
const modelTable = collectModelTable(models, customModels);
|
||||||
const allModels = Object.keys(modelTable).map((m) => ({
|
const allModels = Object.values(modelTable);
|
||||||
name: m,
|
|
||||||
available: modelTable[m],
|
|
||||||
}));
|
|
||||||
|
|
||||||
return allModels;
|
return allModels;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user