mirror of
https://github.com/Mintplex-Labs/anything-llm
synced 2026-04-25 17:15:37 +02:00
Gemini model list sync (#3609)
* Update defaultModels.js add gemma-3-27b-it to v1BetaModels * Update defaultModels.js 20250330 model update * Update defaultModels.js remove text embedding * Update name and inputTokenLimit modelMap.js * Update gemini to load models from both endpoints dedupe models decide endpoint based on expieremental status from fetch add util script for maintainers reduce cache time on gemini models to 1 day * remove comment --------- Co-authored-by: DreamerC <dreamerwolf.tw@gmail.com>
This commit is contained in:
@@ -10,6 +10,7 @@ frontend/bundleinspector.html
|
|||||||
|
|
||||||
#server
|
#server
|
||||||
server/swagger/openapi.json
|
server/swagger/openapi.json
|
||||||
|
server/**/*.mjs
|
||||||
|
|
||||||
#embed
|
#embed
|
||||||
**/static/**
|
**/static/**
|
||||||
|
|||||||
@@ -1,29 +1,52 @@
|
|||||||
const { MODEL_MAP } = require("../modelMap");
|
const { MODEL_MAP } = require("../modelMap");
|
||||||
|
|
||||||
const stableModels = [
|
const stableModels = [
|
||||||
"gemini-pro",
|
// %STABLE_MODELS% - updated 2025-04-07T20:29:49.276Z
|
||||||
"gemini-1.0-pro",
|
"gemini-1.5-pro-001",
|
||||||
"gemini-1.5-pro-latest",
|
"gemini-1.5-pro-002",
|
||||||
"gemini-1.5-flash-latest",
|
"gemini-1.5-pro",
|
||||||
];
|
"gemini-1.5-flash-001",
|
||||||
|
"gemini-1.5-flash",
|
||||||
const experimentalModels = [
|
"gemini-1.5-flash-002",
|
||||||
"gemini-1.5-pro-exp-0801",
|
"gemini-1.5-flash-8b",
|
||||||
"gemini-1.5-pro-exp-0827",
|
"gemini-1.5-flash-8b-001",
|
||||||
"gemini-1.5-flash-exp-0827",
|
"gemini-2.0-flash",
|
||||||
"gemini-1.5-flash-8b-exp-0827",
|
"gemini-2.0-flash-001",
|
||||||
"gemini-exp-1114",
|
"gemini-2.0-flash-lite-001",
|
||||||
"gemini-exp-1121",
|
"gemini-2.0-flash-lite",
|
||||||
"gemini-exp-1206",
|
// %EOC_STABLE_MODELS%
|
||||||
"learnlm-1.5-pro-experimental",
|
|
||||||
"gemini-2.0-flash-exp",
|
|
||||||
];
|
];
|
||||||
|
|
||||||
// There are some models that are only available in the v1beta API
|
// There are some models that are only available in the v1beta API
|
||||||
// and some models that are only available in the v1 API
|
// and some models that are only available in the v1 API
|
||||||
// generally, v1beta models have `exp` in the name, but not always
|
// generally, v1beta models have `exp` in the name, but not always
|
||||||
// so we check for both against a static list as well.
|
// so we check for both against a static list as well via API.
|
||||||
const v1BetaModels = ["gemini-1.5-pro-latest", "gemini-1.5-flash-latest"];
|
const v1BetaModels = [
|
||||||
|
// %V1BETA_MODELS% - updated 2025-04-07T20:29:49.276Z
|
||||||
|
"gemini-1.5-pro-latest",
|
||||||
|
"gemini-1.5-flash-latest",
|
||||||
|
"gemini-1.5-flash-8b-latest",
|
||||||
|
"gemini-1.5-flash-8b-exp-0827",
|
||||||
|
"gemini-1.5-flash-8b-exp-0924",
|
||||||
|
"gemini-2.5-pro-exp-03-25",
|
||||||
|
"gemini-2.5-pro-preview-03-25",
|
||||||
|
"gemini-2.0-flash-exp",
|
||||||
|
"gemini-2.0-flash-exp-image-generation",
|
||||||
|
"gemini-2.0-flash-lite-preview-02-05",
|
||||||
|
"gemini-2.0-flash-lite-preview",
|
||||||
|
"gemini-2.0-pro-exp",
|
||||||
|
"gemini-2.0-pro-exp-02-05",
|
||||||
|
"gemini-exp-1206",
|
||||||
|
"gemini-2.0-flash-thinking-exp-01-21",
|
||||||
|
"gemini-2.0-flash-thinking-exp",
|
||||||
|
"gemini-2.0-flash-thinking-exp-1219",
|
||||||
|
"learnlm-1.5-pro-experimental",
|
||||||
|
"gemma-3-1b-it",
|
||||||
|
"gemma-3-4b-it",
|
||||||
|
"gemma-3-12b-it",
|
||||||
|
"gemma-3-27b-it",
|
||||||
|
// %EOC_V1BETA_MODELS%
|
||||||
|
];
|
||||||
|
|
||||||
const defaultGeminiModels = [
|
const defaultGeminiModels = [
|
||||||
...stableModels.map((model) => ({
|
...stableModels.map((model) => ({
|
||||||
@@ -32,7 +55,7 @@ const defaultGeminiModels = [
|
|||||||
contextWindow: MODEL_MAP.gemini[model],
|
contextWindow: MODEL_MAP.gemini[model],
|
||||||
experimental: false,
|
experimental: false,
|
||||||
})),
|
})),
|
||||||
...experimentalModels.map((model) => ({
|
...v1BetaModels.map((model) => ({
|
||||||
id: model,
|
id: model,
|
||||||
name: model,
|
name: model,
|
||||||
contextWindow: MODEL_MAP.gemini[model],
|
contextWindow: MODEL_MAP.gemini[model],
|
||||||
|
|||||||
@@ -28,21 +28,11 @@ class GeminiLLM {
|
|||||||
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
|
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
|
||||||
this.model =
|
this.model =
|
||||||
modelPreference || process.env.GEMINI_LLM_MODEL_PREF || "gemini-pro";
|
modelPreference || process.env.GEMINI_LLM_MODEL_PREF || "gemini-pro";
|
||||||
|
|
||||||
|
const isExperimental = this.isExperimentalModel(this.model);
|
||||||
this.gemini = genAI.getGenerativeModel(
|
this.gemini = genAI.getGenerativeModel(
|
||||||
{ model: this.model },
|
{ model: this.model },
|
||||||
{
|
{ apiVersion: isExperimental ? "v1beta" : "v1" }
|
||||||
apiVersion:
|
|
||||||
/**
|
|
||||||
* There are some models that are only available in the v1beta API
|
|
||||||
* and some models that are only available in the v1 API
|
|
||||||
* generally, v1beta models have `exp` in the name, but not always
|
|
||||||
* so we check for both against a static list as well.
|
|
||||||
* @see {v1BetaModels}
|
|
||||||
*/
|
|
||||||
this.model.includes("exp") || v1BetaModels.includes(this.model)
|
|
||||||
? "v1beta"
|
|
||||||
: "v1",
|
|
||||||
}
|
|
||||||
);
|
);
|
||||||
this.limits = {
|
this.limits = {
|
||||||
history: this.promptWindowLimit() * 0.15,
|
history: this.promptWindowLimit() * 0.15,
|
||||||
@@ -59,7 +49,7 @@ class GeminiLLM {
|
|||||||
this.cacheModelPath = path.resolve(cacheFolder, "models.json");
|
this.cacheModelPath = path.resolve(cacheFolder, "models.json");
|
||||||
this.cacheAtPath = path.resolve(cacheFolder, ".cached_at");
|
this.cacheAtPath = path.resolve(cacheFolder, ".cached_at");
|
||||||
this.#log(
|
this.#log(
|
||||||
`Initialized with model: ${this.model} (${this.promptWindowLimit()})`
|
`Initialized with model: ${this.model} ${isExperimental ? "[Experimental v1beta]" : "[Stable v1]"} - ctx: ${this.promptWindowLimit()}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +61,7 @@ class GeminiLLM {
|
|||||||
// from the current date. If it is, then we will refetch the API so that all the models are up
|
// from the current date. If it is, then we will refetch the API so that all the models are up
|
||||||
// to date.
|
// to date.
|
||||||
static cacheIsStale() {
|
static cacheIsStale() {
|
||||||
const MAX_STALE = 6.048e8; // 1 Week in MS
|
const MAX_STALE = 8.64e7; // 1 day in MS
|
||||||
if (!fs.existsSync(path.resolve(cacheFolder, ".cached_at"))) return true;
|
if (!fs.existsSync(path.resolve(cacheFolder, ".cached_at"))) return true;
|
||||||
const now = Number(new Date());
|
const now = Number(new Date());
|
||||||
const timestampMs = Number(
|
const timestampMs = Number(
|
||||||
@@ -168,6 +158,28 @@ class GeminiLLM {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a model is experimental by reading from the cache if available, otherwise it will perform
|
||||||
|
* a blind check against the v1BetaModels list - which is manually maintained and updated.
|
||||||
|
* @param {string} modelName - The name of the model to check
|
||||||
|
* @returns {boolean} A boolean indicating if the model is experimental
|
||||||
|
*/
|
||||||
|
isExperimentalModel(modelName) {
|
||||||
|
if (
|
||||||
|
fs.existsSync(cacheFolder) &&
|
||||||
|
fs.existsSync(path.resolve(cacheFolder, "models.json"))
|
||||||
|
) {
|
||||||
|
const models = safeJsonParse(
|
||||||
|
fs.readFileSync(path.resolve(cacheFolder, "models.json"))
|
||||||
|
);
|
||||||
|
const model = models.find((model) => model.id === modelName);
|
||||||
|
if (!model) return false;
|
||||||
|
return model.experimental;
|
||||||
|
}
|
||||||
|
|
||||||
|
return modelName.includes("exp") || v1BetaModels.includes(modelName);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetches Gemini models from the Google Generative AI API
|
* Fetches Gemini models from the Google Generative AI API
|
||||||
* @param {string} apiKey - The API key to use for the request
|
* @param {string} apiKey - The API key to use for the request
|
||||||
@@ -186,15 +198,18 @@ class GeminiLLM {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const stableModels = [];
|
||||||
|
const allModels = [];
|
||||||
|
|
||||||
|
// Fetch from v1
|
||||||
|
try {
|
||||||
const url = new URL(
|
const url = new URL(
|
||||||
"https://generativelanguage.googleapis.com/v1beta/models"
|
"https://generativelanguage.googleapis.com/v1/models"
|
||||||
);
|
);
|
||||||
url.searchParams.set("pageSize", limit);
|
url.searchParams.set("pageSize", limit);
|
||||||
url.searchParams.set("key", apiKey);
|
url.searchParams.set("key", apiKey);
|
||||||
if (pageToken) url.searchParams.set("pageToken", pageToken);
|
if (pageToken) url.searchParams.set("pageToken", pageToken);
|
||||||
let success = false;
|
await fetch(url.toString(), {
|
||||||
|
|
||||||
const models = await fetch(url.toString(), {
|
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: { "Content-Type": "application/json" },
|
headers: { "Content-Type": "application/json" },
|
||||||
})
|
})
|
||||||
@@ -204,30 +219,89 @@ class GeminiLLM {
|
|||||||
return data.models ?? [];
|
return data.models ?? [];
|
||||||
})
|
})
|
||||||
.then((models) => {
|
.then((models) => {
|
||||||
success = true;
|
|
||||||
return models
|
return models
|
||||||
.filter(
|
.filter(
|
||||||
(model) => !model.displayName.toLowerCase().includes("tuning")
|
(model) => !model.displayName?.toLowerCase()?.includes("tuning")
|
||||||
)
|
) // remove tuning models
|
||||||
|
.filter(
|
||||||
|
(model) =>
|
||||||
|
!model.description?.toLowerCase()?.includes("deprecated")
|
||||||
|
) // remove deprecated models (in comment)
|
||||||
.filter((model) =>
|
.filter((model) =>
|
||||||
|
// Only generateContent is supported
|
||||||
model.supportedGenerationMethods.includes("generateContent")
|
model.supportedGenerationMethods.includes("generateContent")
|
||||||
) // Only generateContent is supported
|
)
|
||||||
.map((model) => {
|
.map((model) => {
|
||||||
return {
|
stableModels.push(model.name);
|
||||||
|
allModels.push({
|
||||||
id: model.name.split("/").pop(),
|
id: model.name.split("/").pop(),
|
||||||
name: model.displayName,
|
name: model.displayName,
|
||||||
contextWindow: model.inputTokenLimit,
|
contextWindow: model.inputTokenLimit,
|
||||||
experimental: model.name.includes("exp"),
|
experimental: false,
|
||||||
};
|
});
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
console.error(`Gemini:getGeminiModels`, e.message);
|
console.error(`Gemini:getGeminiModelsV1`, e.message);
|
||||||
success = false;
|
return;
|
||||||
return defaultGeminiModels;
|
|
||||||
});
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(`Gemini:getGeminiModelsV1`, e.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch from v1beta
|
||||||
|
try {
|
||||||
|
const url = new URL(
|
||||||
|
"https://generativelanguage.googleapis.com/v1beta/models"
|
||||||
|
);
|
||||||
|
url.searchParams.set("pageSize", limit);
|
||||||
|
url.searchParams.set("key", apiKey);
|
||||||
|
if (pageToken) url.searchParams.set("pageToken", pageToken);
|
||||||
|
await fetch(url.toString(), {
|
||||||
|
method: "GET",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
})
|
||||||
|
.then((res) => res.json())
|
||||||
|
.then((data) => {
|
||||||
|
if (data.error) throw new Error(data.error.message);
|
||||||
|
return data.models ?? [];
|
||||||
|
})
|
||||||
|
.then((models) => {
|
||||||
|
return models
|
||||||
|
.filter((model) => !stableModels.includes(model.name)) // remove stable models that are already in the v1 list
|
||||||
|
.filter(
|
||||||
|
(model) => !model.displayName?.toLowerCase()?.includes("tuning")
|
||||||
|
) // remove tuning models
|
||||||
|
.filter(
|
||||||
|
(model) =>
|
||||||
|
!model.description?.toLowerCase()?.includes("deprecated")
|
||||||
|
) // remove deprecated models (in comment)
|
||||||
|
.filter((model) =>
|
||||||
|
// Only generateContent is supported
|
||||||
|
model.supportedGenerationMethods.includes("generateContent")
|
||||||
|
)
|
||||||
|
.map((model) => {
|
||||||
|
allModels.push({
|
||||||
|
id: model.name.split("/").pop(),
|
||||||
|
name: model.displayName,
|
||||||
|
contextWindow: model.inputTokenLimit,
|
||||||
|
experimental: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
})
|
||||||
|
.catch((e) => {
|
||||||
|
console.error(`Gemini:getGeminiModelsV1beta`, e.message);
|
||||||
|
return;
|
||||||
|
});
|
||||||
|
} catch (e) {
|
||||||
|
console.error(`Gemini:getGeminiModelsV1beta`, e.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (allModels.length === 0) {
|
||||||
|
console.error(`Gemini:getGeminiModels - No models found`);
|
||||||
|
return defaultGeminiModels;
|
||||||
|
}
|
||||||
|
|
||||||
if (success) {
|
|
||||||
console.log(
|
console.log(
|
||||||
`\x1b[32m[GeminiLLM]\x1b[0m Writing cached models API response to disk.`
|
`\x1b[32m[GeminiLLM]\x1b[0m Writing cached models API response to disk.`
|
||||||
);
|
);
|
||||||
@@ -235,14 +309,14 @@ class GeminiLLM {
|
|||||||
fs.mkdirSync(cacheFolder, { recursive: true });
|
fs.mkdirSync(cacheFolder, { recursive: true });
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
path.resolve(cacheFolder, "models.json"),
|
path.resolve(cacheFolder, "models.json"),
|
||||||
JSON.stringify(models)
|
JSON.stringify(allModels)
|
||||||
);
|
);
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
path.resolve(cacheFolder, ".cached_at"),
|
path.resolve(cacheFolder, ".cached_at"),
|
||||||
new Date().getTime().toString()
|
new Date().getTime().toString()
|
||||||
);
|
);
|
||||||
}
|
|
||||||
return models;
|
return allModels;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
79
server/utils/AiProviders/gemini/syncStaticLists.mjs
Normal file
79
server/utils/AiProviders/gemini/syncStaticLists.mjs
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
/**
|
||||||
|
* This is a script that syncs the static lists of models from the Gemini API
|
||||||
|
* so that maintainers can keep the fallback lists up to date.
|
||||||
|
*
|
||||||
|
* To run, cd into this directory and run:
|
||||||
|
* node syncStaticLists.mjs
|
||||||
|
*/
|
||||||
|
|
||||||
|
import fs from "fs";
|
||||||
|
import path from "path";
|
||||||
|
import dotenv from "dotenv";
|
||||||
|
import { MODEL_MAP } from "../modelMap.js";
|
||||||
|
|
||||||
|
dotenv.config({ path: `../../../.env.development` });
|
||||||
|
const existingCachePath = path.resolve('../../../storage/models/gemini')
|
||||||
|
|
||||||
|
// This will fetch all of the models from the Gemini API as well as post-process them
|
||||||
|
// to remove any models that are deprecated or experimental.
|
||||||
|
import { GeminiLLM } from "./index.js";
|
||||||
|
|
||||||
|
if (fs.existsSync(existingCachePath)) {
|
||||||
|
console.log("Removing existing cache so we can fetch fresh models from Gemini endpoints...");
|
||||||
|
fs.rmSync(existingCachePath, { recursive: true, force: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
const models = await GeminiLLM.fetchModels(process.env.GEMINI_API_KEY);
|
||||||
|
|
||||||
|
function updateDefaultModelsFile(models) {
|
||||||
|
const stableModelKeys = models.filter((model) => !model.experimental).map((model) => model.id);
|
||||||
|
const v1BetaModelKeys = models.filter((model) => model.experimental).map((model) => model.id);
|
||||||
|
|
||||||
|
let defaultModelFileContents = fs.readFileSync(path.join("./defaultModels.js"), "utf8");
|
||||||
|
|
||||||
|
// Update the stable models between %STABLE_MODELS% and %EOC_STABLE_MODELS% comments
|
||||||
|
defaultModelFileContents = defaultModelFileContents.replace(
|
||||||
|
/%STABLE_MODELS%[\s\S]*?%EOC_STABLE_MODELS%/,
|
||||||
|
`%STABLE_MODELS% - updated ${new Date().toISOString()}\n"${stableModelKeys.join('",\n"')}",\n// %EOC_STABLE_MODELS%`
|
||||||
|
);
|
||||||
|
|
||||||
|
// Update the v1beta models between %V1BETA_MODELS% and %EOC_V1BETA_MODELS% comments
|
||||||
|
defaultModelFileContents = defaultModelFileContents.replace(
|
||||||
|
/%V1BETA_MODELS%[\s\S]*?%EOC_V1BETA_MODELS%/,
|
||||||
|
`%V1BETA_MODELS% - updated ${new Date().toISOString()}\n"${v1BetaModelKeys.join('",\n"')}",\n// %EOC_V1BETA_MODELS%`
|
||||||
|
);
|
||||||
|
|
||||||
|
fs.writeFileSync(path.join("./defaultModels.js"), defaultModelFileContents);
|
||||||
|
console.log("Updated defaultModels.js. Dont forget to `yarn lint` and commit!");
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateModelMap(models) {
|
||||||
|
const existingModelMap = MODEL_MAP;
|
||||||
|
console.log('Updating modelMap.js `gemini` object...')
|
||||||
|
console.log(`Removed existing gemini object (${Object.keys(existingModelMap.gemini).length} models) from modelMap.js`);
|
||||||
|
existingModelMap.gemini = {};
|
||||||
|
|
||||||
|
for (const model of models) existingModelMap.gemini[model.id] = model.contextWindow;
|
||||||
|
console.log(`Updated modelMap.js 'gemini' object with ${Object.keys(existingModelMap.gemini).length} models from API`);
|
||||||
|
|
||||||
|
// Update the modelMap.js file
|
||||||
|
const contents = `/**
|
||||||
|
* The model name and context window for all know model windows
|
||||||
|
* that are available through providers which has discrete model options.
|
||||||
|
* This file is automatically generated by syncStaticLists.mjs
|
||||||
|
* and should not be edited manually.
|
||||||
|
*
|
||||||
|
* Last updated: ${new Date().toISOString()}
|
||||||
|
*/
|
||||||
|
const MODEL_MAP = {
|
||||||
|
${Object.entries(existingModelMap).map(([key, value]) => `${key}: ${JSON.stringify(value, null, 2)}`).join(',\n')}
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = { MODEL_MAP };
|
||||||
|
`;
|
||||||
|
fs.writeFileSync(path.resolve("../modelMap.js"), contents);
|
||||||
|
console.log('Updated modelMap.js `gemini` object. Dont forget to `yarn lint` and commit!');
|
||||||
|
}
|
||||||
|
|
||||||
|
updateDefaultModelsFile(models);
|
||||||
|
updateModelMap(models);
|
||||||
@@ -1,46 +1,71 @@
|
|||||||
/**
|
/**
|
||||||
* The model name and context window for all know model windows
|
* The model name and context window for all know model windows
|
||||||
* that are available through providers which has discrete model options.
|
* that are available through providers which has discrete model options.
|
||||||
|
* This file is automatically generated by syncStaticLists.mjs
|
||||||
|
* and should not be edited manually.
|
||||||
|
*
|
||||||
|
* Last updated: 2025-04-07T20:29:49.277Z
|
||||||
*/
|
*/
|
||||||
const MODEL_MAP = {
|
const MODEL_MAP = {
|
||||||
anthropic: {
|
anthropic: {
|
||||||
"claude-instant-1.2": 100_000,
|
"claude-instant-1.2": 100000,
|
||||||
"claude-2.0": 100_000,
|
"claude-2.0": 100000,
|
||||||
"claude-2.1": 200_000,
|
"claude-2.1": 200000,
|
||||||
"claude-3-haiku-20240307": 200_000,
|
"claude-3-haiku-20240307": 200000,
|
||||||
"claude-3-sonnet-20240229": 200_000,
|
"claude-3-sonnet-20240229": 200000,
|
||||||
"claude-3-opus-20240229": 200_000,
|
"claude-3-opus-20240229": 200000,
|
||||||
"claude-3-opus-latest": 200_000,
|
"claude-3-opus-latest": 200000,
|
||||||
"claude-3-5-haiku-latest": 200_000,
|
"claude-3-5-haiku-latest": 200000,
|
||||||
"claude-3-5-haiku-20241022": 200_000,
|
"claude-3-5-haiku-20241022": 200000,
|
||||||
"claude-3-5-sonnet-latest": 200_000,
|
"claude-3-5-sonnet-latest": 200000,
|
||||||
"claude-3-5-sonnet-20241022": 200_000,
|
"claude-3-5-sonnet-20241022": 200000,
|
||||||
"claude-3-5-sonnet-20240620": 200_000,
|
"claude-3-5-sonnet-20240620": 200000,
|
||||||
"claude-3-7-sonnet-20250219": 200_000,
|
"claude-3-7-sonnet-20250219": 200000,
|
||||||
"claude-3-7-sonnet-latest": 200_000,
|
"claude-3-7-sonnet-latest": 200000,
|
||||||
},
|
},
|
||||||
cohere: {
|
cohere: {
|
||||||
"command-r": 128_000,
|
"command-r": 128000,
|
||||||
"command-r-plus": 128_000,
|
"command-r-plus": 128000,
|
||||||
command: 4_096,
|
command: 4096,
|
||||||
"command-light": 4_096,
|
"command-light": 4096,
|
||||||
"command-nightly": 8_192,
|
"command-nightly": 8192,
|
||||||
"command-light-nightly": 8_192,
|
"command-light-nightly": 8192,
|
||||||
},
|
},
|
||||||
gemini: {
|
gemini: {
|
||||||
"gemini-pro": 30_720,
|
"gemini-1.5-pro-001": 2000000,
|
||||||
"gemini-1.0-pro": 30_720,
|
"gemini-1.5-pro-002": 2000000,
|
||||||
"gemini-1.5-flash-latest": 1_048_576,
|
"gemini-1.5-pro": 2000000,
|
||||||
"gemini-1.5-pro-latest": 2_097_152,
|
"gemini-1.5-flash-001": 1000000,
|
||||||
"gemini-1.5-pro-exp-0801": 2_097_152,
|
"gemini-1.5-flash": 1000000,
|
||||||
"gemini-1.5-pro-exp-0827": 2_097_152,
|
"gemini-1.5-flash-002": 1000000,
|
||||||
"gemini-1.5-flash-exp-0827": 1_048_576,
|
"gemini-1.5-flash-8b": 1000000,
|
||||||
"gemini-1.5-flash-8b-exp-0827": 1_048_576,
|
"gemini-1.5-flash-8b-001": 1000000,
|
||||||
"gemini-exp-1114": 32_767,
|
"gemini-2.0-flash": 1048576,
|
||||||
"gemini-exp-1121": 32_767,
|
"gemini-2.0-flash-001": 1048576,
|
||||||
"gemini-exp-1206": 32_767,
|
"gemini-2.0-flash-lite-001": 1048576,
|
||||||
"learnlm-1.5-pro-experimental": 32_767,
|
"gemini-2.0-flash-lite": 1048576,
|
||||||
"gemini-2.0-flash-exp": 1_048_576,
|
"gemini-1.5-pro-latest": 2000000,
|
||||||
|
"gemini-1.5-flash-latest": 1000000,
|
||||||
|
"gemini-1.5-flash-8b-latest": 1000000,
|
||||||
|
"gemini-1.5-flash-8b-exp-0827": 1000000,
|
||||||
|
"gemini-1.5-flash-8b-exp-0924": 1000000,
|
||||||
|
"gemini-2.5-pro-exp-03-25": 1048576,
|
||||||
|
"gemini-2.5-pro-preview-03-25": 1048576,
|
||||||
|
"gemini-2.0-flash-exp": 1048576,
|
||||||
|
"gemini-2.0-flash-exp-image-generation": 1048576,
|
||||||
|
"gemini-2.0-flash-lite-preview-02-05": 1048576,
|
||||||
|
"gemini-2.0-flash-lite-preview": 1048576,
|
||||||
|
"gemini-2.0-pro-exp": 1048576,
|
||||||
|
"gemini-2.0-pro-exp-02-05": 1048576,
|
||||||
|
"gemini-exp-1206": 1048576,
|
||||||
|
"gemini-2.0-flash-thinking-exp-01-21": 1048576,
|
||||||
|
"gemini-2.0-flash-thinking-exp": 1048576,
|
||||||
|
"gemini-2.0-flash-thinking-exp-1219": 1048576,
|
||||||
|
"learnlm-1.5-pro-experimental": 32767,
|
||||||
|
"gemma-3-1b-it": 32768,
|
||||||
|
"gemma-3-4b-it": 32768,
|
||||||
|
"gemma-3-12b-it": 32768,
|
||||||
|
"gemma-3-27b-it": 131072,
|
||||||
},
|
},
|
||||||
groq: {
|
groq: {
|
||||||
"gemma2-9b-it": 8192,
|
"gemma2-9b-it": 8192,
|
||||||
@@ -52,32 +77,32 @@ const MODEL_MAP = {
|
|||||||
"mixtral-8x7b-32768": 32768,
|
"mixtral-8x7b-32768": 32768,
|
||||||
},
|
},
|
||||||
openai: {
|
openai: {
|
||||||
"gpt-3.5-turbo": 16_385,
|
"gpt-3.5-turbo": 16385,
|
||||||
"gpt-3.5-turbo-1106": 16_385,
|
"gpt-3.5-turbo-1106": 16385,
|
||||||
"gpt-4o": 128_000,
|
"gpt-4o": 128000,
|
||||||
"gpt-4o-2024-08-06": 128_000,
|
"gpt-4o-2024-08-06": 128000,
|
||||||
"gpt-4o-2024-05-13": 128_000,
|
"gpt-4o-2024-05-13": 128000,
|
||||||
"gpt-4o-mini": 128_000,
|
"gpt-4o-mini": 128000,
|
||||||
"gpt-4o-mini-2024-07-18": 128_000,
|
"gpt-4o-mini-2024-07-18": 128000,
|
||||||
"gpt-4-turbo": 128_000,
|
"gpt-4-turbo": 128000,
|
||||||
"gpt-4-1106-preview": 128_000,
|
"gpt-4-1106-preview": 128000,
|
||||||
"gpt-4-turbo-preview": 128_000,
|
"gpt-4-turbo-preview": 128000,
|
||||||
"gpt-4": 8_192,
|
"gpt-4": 8192,
|
||||||
"gpt-4-32k": 32_000,
|
"gpt-4-32k": 32000,
|
||||||
"o1-preview": 128_000,
|
"o1-preview": 128000,
|
||||||
"o1-preview-2024-09-12": 128_000,
|
"o1-preview-2024-09-12": 128000,
|
||||||
"o1-mini": 128_000,
|
"o1-mini": 128000,
|
||||||
"o1-mini-2024-09-12": 128_000,
|
"o1-mini-2024-09-12": 128000,
|
||||||
"o3-mini": 200_000,
|
"o3-mini": 200000,
|
||||||
"o3-mini-2025-01-31": 200_000,
|
"o3-mini-2025-01-31": 200000,
|
||||||
},
|
},
|
||||||
deepseek: {
|
deepseek: {
|
||||||
"deepseek-chat": 128_000,
|
"deepseek-chat": 128000,
|
||||||
"deepseek-coder": 128_000,
|
"deepseek-coder": 128000,
|
||||||
"deepseek-reasoner": 128_000,
|
"deepseek-reasoner": 128000,
|
||||||
},
|
},
|
||||||
xai: {
|
xai: {
|
||||||
"grok-beta": 131_072,
|
"grok-beta": 131072,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user