Merge pull request #3190 from M0ch0/staging Update for Latest Google AI Studio
Signed| @@ -3025,34 +3025,30 @@ | |||
| 3025 | <optgroup label="Primary"> | 3025 | <optgroup label="Primary"> |
| 3026 | <option value="gemini-1.5-pro">Gemini 1.5 Pro</option> | 3026 | <option value="gemini-1.5-pro">Gemini 1.5 Pro</option> |
| 3027 | <option value="gemini-1.5-flash">Gemini 1.5 Flash</option> | 3027 | <option value="gemini-1.5-flash">Gemini 1.5 Flash</option> |
| 3028 | <option value="gemini-1.0-pro">Gemini 1.0 Pro</option> | 3028 | <option value="gemini-1.0-pro">Gemini 1.0 Pro (Deprecated)</option> |
| 3029 | <option value="gemini-pro">Gemini Pro (1.0)</option> | 3029 | <option value="gemini-pro">Gemini Pro (1.0) (Deprecated)</option> |
| 3030 | <option value="gemini-pro-vision">Gemini Pro Vision (1.0)</option> | ||
| 3031 | <option value="gemini-ultra">Gemini Ultra (1.0)</option> | 3030 | <option value="gemini-ultra">Gemini Ultra (1.0)</option> |
| 3032 | <option value="gemini-1.0-ultra-latest">Gemini 1.0 Ultra</option> | 3031 | <option value="gemini-1.0-ultra-latest">Gemini 1.0 Ultra</option> |
| 3033 | <option value="text-bison-001">PaLM 2 (Legacy)</option> | ||
| 3034 | <option value="chat-bison-001">PaLM 2 Chat (Legacy)</option> | ||
| 3035 | </optgroup> | 3032 | </optgroup> |
| 3036 | <optgroup label="Subversions"> | 3033 | <optgroup label="Subversions"> |
| 3037 | <option value="gemini-2.0-flash-exp">Gemini 2.0 Flash Experiment</option> | 3034 | <option value="gemini-2.0-flash-exp">Gemini 2.0 Flash Experimental</option> |
| 3038 | <option value="gemini-exp-1114">Gemini Experimental 2024-11-14</option> | 3035 | <option value="gemini-exp-1114">Gemini Experimental 2024-11-14</option> |
| 3039 | <option value="gemini-exp-1121">Gemini Experimental 2024-11-21</option> | 3036 | <option value="gemini-exp-1121">Gemini Experimental 2024-11-21</option> |
| 3040 | <option value="gemini-exp-1206">Gemini Experimental 2024-12-06</option> | 3037 | <option value="gemini-exp-1206">Gemini Experimental 2024-12-06</option> |
| 3041 | <option value="gemini-1.5-pro-exp-0801">Gemini 1.5 Pro Experiment 2024-08-01</option> | 3038 | <option value="gemini-1.5-pro-exp-0801">Gemini 1.5 Pro Experimental 2024-08-01</option> |
| 3042 | <option value="gemini-1.5-pro-exp-0827">Gemini 1.5 Pro Experiment 2024-08-27</option> | 3039 | <option value="gemini-1.5-pro-exp-0827">Gemini 1.5 Pro Experimental 2024-08-27</option> |
| 3043 | <option value="gemini-1.5-pro-latest">Gemini 1.5 Pro [latest]</option> | 3040 | <option value="gemini-1.5-pro-latest">Gemini 1.5 Pro [latest]</option> |
| 3044 | <option value="gemini-1.5-pro-001">Gemini 1.5 Pro [001]</option> | 3041 | <option value="gemini-1.5-pro-001">Gemini 1.5 Pro [001]</option> |
| 3045 | <option value="gemini-1.5-pro-002">Gemini 1.5 Pro [002]</option> | 3042 | <option value="gemini-1.5-pro-002">Gemini 1.5 Pro [002]</option> |
| 3046 | <option value="gemini-1.5-flash-8b">Gemini 1.5 Flash 8B</option> | 3043 | <option value="gemini-1.5-flash-8b">Gemini 1.5 Flash 8B</option> |
| 3047 | <option value="gemini-1.5-flash-exp-0827">Gemini 1.5 Flash Experiment 2024-08-27</option> | 3044 | <option value="gemini-1.5-flash-exp-0827">Gemini 1.5 Flash Experimental 2024-08-27</option> |
| 3048 | <option value="gemini-1.5-flash-8b-exp-0827">Gemini 1.5 Flash 8B Experiment 2024-08-27</option> | 3045 | <option value="gemini-1.5-flash-8b-exp-0827">Gemini 1.5 Flash 8B Experimental 2024-08-27</option> |
| 3049 | <option value="gemini-1.5-flash-8b-exp-0924">Gemini 1.5 Flash 8B Experiment 2024-09-24</option> | 3046 | <option value="gemini-1.5-flash-8b-exp-0924">Gemini 1.5 Flash 8B Experimental 2024-09-24</option> |
| 3050 | <option value="gemini-1.5-flash-latest">Gemini 1.5 Flash [latest]</option> | 3047 | <option value="gemini-1.5-flash-latest">Gemini 1.5 Flash [latest]</option> |
| 3051 | <option value="gemini-1.5-flash-001">Gemini 1.5 Flash [001]</option> | 3048 | <option value="gemini-1.5-flash-001">Gemini 1.5 Flash [001]</option> |
| 3052 | <option value="gemini-1.5-flash-002">Gemini 1.5 Flash [002]</option> | 3049 | <option value="gemini-1.5-flash-002">Gemini 1.5 Flash [002]</option> |
| 3053 | <option value="gemini-1.0-pro-latest">Gemini 1.0 Pro [latest]</option> | 3050 | <option value="gemini-1.0-pro-latest">Gemini 1.0 Pro [latest] (Deprecated)</option> |
| 3054 | <option value="gemini-1.0-pro-001">Gemini 1.0 Pro (Tuning) [001]</option> | 3051 | <option value="gemini-1.0-pro-001">Gemini 1.0 Pro (Tuning) [001] (Deprecated)</option> |
| 3055 | <option value="gemini-1.0-pro-vision-latest">Gemini 1.0 Pro Vision [latest]</option> | ||
| 3056 | </optgroup> | 3052 | </optgroup> |
| 3057 | </select> | 3053 | </select> |
| 3058 | </div> | 3054 | </div> |
| @@ -70,7 +70,6 @@ | |||
| 70 | <option data-type="google" value="gemini-1.5-pro-002">gemini-1.5-pro-002</option> | 70 | <option data-type="google" value="gemini-1.5-pro-002">gemini-1.5-pro-002</option> |
| 71 | <option data-type="google" value="gemini-1.5-pro-exp-0801">gemini-1.5-pro-exp-0801</option> | 71 | <option data-type="google" value="gemini-1.5-pro-exp-0801">gemini-1.5-pro-exp-0801</option> |
| 72 | <option data-type="google" value="gemini-1.5-pro-exp-0827">gemini-1.5-pro-exp-0827</option> | 72 | <option data-type="google" value="gemini-1.5-pro-exp-0827">gemini-1.5-pro-exp-0827</option> |
| 73 | <option data-type="google" value="gemini-pro-vision">gemini-pro-vision</option> | ||
| 74 | <option data-type="groq" value="llama-3.2-11b-vision-preview">llama-3.2-11b-vision-preview</option> | 73 | <option data-type="groq" value="llama-3.2-11b-vision-preview">llama-3.2-11b-vision-preview</option> |
| 75 | <option data-type="groq" value="llama-3.2-90b-vision-preview">llama-3.2-90b-vision-preview</option> | 74 | <option data-type="groq" value="llama-3.2-90b-vision-preview">llama-3.2-90b-vision-preview</option> |
| 76 | <option data-type="groq" value="llava-v1.5-7b-4096-preview">llava-v1.5-7b-4096-preview</option> | 75 | <option data-type="groq" value="llava-v1.5-7b-4096-preview">llava-v1.5-7b-4096-preview</option> |
| @@ -4087,13 +4087,8 @@ async function onModelChange() { | |||
| 4087 | $('#openai_max_context').attr('max', max_2mil); | 4087 | $('#openai_max_context').attr('max', max_2mil); |
| 4088 | } else if (value.includes('gemini-1.5-flash') || value.includes('gemini-2.0-flash-exp')) { | 4088 | } else if (value.includes('gemini-1.5-flash') || value.includes('gemini-2.0-flash-exp')) { |
| 4089 | $('#openai_max_context').attr('max', max_1mil); | 4089 | $('#openai_max_context').attr('max', max_1mil); |
| 4090 | } else if (value.includes('gemini-1.0-pro-vision') || value === 'gemini-pro-vision') { | ||
| 4091 | $('#openai_max_context').attr('max', max_16k); | ||
| 4092 | } else if (value.includes('gemini-1.0-pro') || value === 'gemini-pro') { | 4090 | } else if (value.includes('gemini-1.0-pro') || value === 'gemini-pro') { |
| 4093 | $('#openai_max_context').attr('max', max_32k); | 4091 | $('#openai_max_context').attr('max', max_32k); |
| 4094 | } else if (value === 'text-bison-001') { | ||
| 4095 | $('#openai_max_context').attr('max', max_8k); | ||
| 4096 | // The ultra endpoints are possibly dead: | ||
| 4097 | } else if (value.includes('gemini-1.0-ultra') || value === 'gemini-ultra') { | 4092 | } else if (value.includes('gemini-1.0-ultra') || value === 'gemini-ultra') { |
| 4098 | $('#openai_max_context').attr('max', max_32k); | 4093 | $('#openai_max_context').attr('max', max_32k); |
| 4099 | } else { | 4094 | } else { |
| @@ -4776,7 +4771,6 @@ export function isImageInliningSupported() { | |||
| 4776 | 'gemini-1.5-pro-002', | 4771 | 'gemini-1.5-pro-002', |
| 4777 | 'gemini-1.5-pro-exp-0801', | 4772 | 'gemini-1.5-pro-exp-0801', |
| 4778 | 'gemini-1.5-pro-exp-0827', | 4773 | 'gemini-1.5-pro-exp-0827', |
| 4779 | 'gemini-pro-vision', | ||
| 4780 | 'claude-3', | 4774 | 'claude-3', |
| 4781 | 'claude-3-5', | 4775 | 'claude-3-5', |
| 4782 | 'gpt-4-turbo', | 4776 | 'gpt-4-turbo', |
| @@ -159,33 +159,6 @@ export const GEMINI_SAFETY = [ | |||
| 159 | }, | 159 | }, |
| 160 | ]; | 160 | ]; |
| 161 | 161 | ||
| 162 | export const BISON_SAFETY = [ | ||
| 163 | { | ||
| 164 | category: 'HARM_CATEGORY_DEROGATORY', | ||
| 165 | threshold: 'BLOCK_NONE', | ||
| 166 | }, | ||
| 167 | { | ||
| 168 | category: 'HARM_CATEGORY_TOXICITY', | ||
| 169 | threshold: 'BLOCK_NONE', | ||
| 170 | }, | ||
| 171 | { | ||
| 172 | category: 'HARM_CATEGORY_VIOLENCE', | ||
| 173 | threshold: 'BLOCK_NONE', | ||
| 174 | }, | ||
| 175 | { | ||
| 176 | category: 'HARM_CATEGORY_SEXUAL', | ||
| 177 | threshold: 'BLOCK_NONE', | ||
| 178 | }, | ||
| 179 | { | ||
| 180 | category: 'HARM_CATEGORY_MEDICAL', | ||
| 181 | threshold: 'BLOCK_NONE', | ||
| 182 | }, | ||
| 183 | { | ||
| 184 | category: 'HARM_CATEGORY_DANGEROUS', | ||
| 185 | threshold: 'BLOCK_NONE', | ||
| 186 | }, | ||
| 187 | ]; | ||
| 188 | |||
| 189 | export const CHAT_COMPLETION_SOURCES = { | 162 | export const CHAT_COMPLETION_SOURCES = { |
| 190 | OPENAI: 'openai', | 163 | OPENAI: 'openai', |
| 191 | WINDOWAI: 'windowai', | 164 | WINDOWAI: 'windowai', |
| @@ -6,7 +6,6 @@ import { jsonParser } from '../../express-common.js'; | |||
| 6 | import { | 6 | import { |
| 7 | CHAT_COMPLETION_SOURCES, | 7 | CHAT_COMPLETION_SOURCES, |
| 8 | GEMINI_SAFETY, | 8 | GEMINI_SAFETY, |
| 9 | BISON_SAFETY, | ||
| 10 | OPENROUTER_HEADERS, | 9 | OPENROUTER_HEADERS, |
| 11 | } from '../../constants.js'; | 10 | } from '../../constants.js'; |
| 12 | import { | 11 | import { |
| @@ -262,9 +261,7 @@ async function sendMakerSuiteRequest(request, response) { | |||
| 262 | } | 261 | } |
| 263 | 262 | ||
| 264 | const model = String(request.body.model); | 263 | const model = String(request.body.model); |
| 265 | const isGemini = model.includes('gemini'); | 264 | const stream = Boolean(request.body.stream); |
| 266 | const isText = model.includes('text'); | ||
| 267 | const stream = Boolean(request.body.stream) && isGemini; | ||
| 268 | 265 | ||
| 269 | const generationConfig = { | 266 | const generationConfig = { |
| 270 | stopSequences: request.body.stop, | 267 | stopSequences: request.body.stop, |
| @@ -301,39 +298,7 @@ async function sendMakerSuiteRequest(request, response) { | |||
| 301 | return body; | 298 | return body; |
| 302 | } | 299 | } |
| 303 | 300 | ||
| 304 | function getBisonBody() { | 301 | const body = getGeminiBody(); |
| 305 | const prompt = isText | ||
| 306 | ? ({ text: convertTextCompletionPrompt(request.body.messages) }) | ||
| 307 | : ({ messages: convertGooglePrompt(request.body.messages, model).contents }); | ||
| 308 | |||
| 309 | /** @type {any} Shut the lint up */ | ||
| 310 | const bisonBody = { | ||
| 311 | ...generationConfig, | ||
| 312 | safetySettings: BISON_SAFETY, | ||
| 313 | candidate_count: 1, // lewgacy spelling | ||
| 314 | prompt: prompt, | ||
| 315 | }; | ||
| 316 | |||
| 317 | if (!isText) { | ||
| 318 | delete bisonBody.stopSequences; | ||
| 319 | delete bisonBody.maxOutputTokens; | ||
| 320 | delete bisonBody.safetySettings; | ||
| 321 | |||
| 322 | if (Array.isArray(prompt.messages)) { | ||
| 323 | for (const msg of prompt.messages) { | ||
| 324 | msg.author = msg.role; | ||
| 325 | msg.content = msg.parts[0].text; | ||
| 326 | delete msg.parts; | ||
| 327 | delete msg.role; | ||
| 328 | } | ||
| 329 | } | ||
| 330 | } | ||
| 331 | |||
| 332 | delete bisonBody.candidateCount; | ||
| 333 | return bisonBody; | ||
| 334 | } | ||
| 335 | |||
| 336 | const body = isGemini ? getGeminiBody() : getBisonBody(); | ||
| 337 | console.log('Google AI Studio request:', body); | 302 | console.log('Google AI Studio request:', body); |
| 338 | 303 | ||
| 339 | try { | 304 | try { |
| @@ -343,10 +308,8 @@ async function sendMakerSuiteRequest(request, response) { | |||
| 343 | controller.abort(); | 308 | controller.abort(); |
| 344 | }); | 309 | }); |
| 345 | 310 | ||
| 346 | const apiVersion = isGemini ? 'v1beta' : 'v1beta2'; | 311 | const apiVersion = 'v1beta'; |
| 347 | const responseType = isGemini | 312 | const responseType = (stream ? 'streamGenerateContent' : 'generateContent'); |
| 348 | ? (stream ? 'streamGenerateContent' : 'generateContent') | ||
| 349 | : (isText ? 'generateText' : 'generateMessage'); | ||
| 350 | 313 | ||
| 351 | const generateResponse = await fetch(`${apiUrl.toString().replace(/\/$/, '')}/${apiVersion}/models/${model}:${responseType}?key=${apiKey}${stream ? '&alt=sse' : ''}`, { | 314 | const generateResponse = await fetch(`${apiUrl.toString().replace(/\/$/, '')}/${apiVersion}/models/${model}:${responseType}?key=${apiKey}${stream ? '&alt=sse' : ''}`, { |
| 352 | body: JSON.stringify(body), | 315 | body: JSON.stringify(body), |
| @@ -333,8 +333,6 @@ export function convertCohereMessages(messages, charName = '', userName = '') { | |||
| 333 | * @returns {{contents: *[], system_instruction: {parts: {text: string}}}} Prompt for Google MakerSuite models | 333 | * @returns {{contents: *[], system_instruction: {parts: {text: string}}}} Prompt for Google MakerSuite models |
| 334 | */ | 334 | */ |
| 335 | export function convertGooglePrompt(messages, model, useSysPrompt = false, charName = '', userName = '') { | 335 | export function convertGooglePrompt(messages, model, useSysPrompt = false, charName = '', userName = '') { |
| 336 | // This is a 1x1 transparent PNG | ||
| 337 | const PNG_PIXEL = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYAAAAAYAAjCB0C8AAAAASUVORK5CYII='; | ||
| 338 | 336 | ||
| 339 | const visionSupportedModels = [ | 337 | const visionSupportedModels = [ |
| 340 | 'gemini-2.0-flash-exp', | 338 | 'gemini-2.0-flash-exp', |
| @@ -355,13 +353,6 @@ export function convertGooglePrompt(messages, model, useSysPrompt = false, charN | |||
| 355 | 'gemini-1.5-pro-002', | 353 | 'gemini-1.5-pro-002', |
| 356 | 'gemini-1.5-pro-exp-0801', | 354 | 'gemini-1.5-pro-exp-0801', |
| 357 | 'gemini-1.5-pro-exp-0827', | 355 | 'gemini-1.5-pro-exp-0827', |
| 358 | 'gemini-1.0-pro-vision-latest', | ||
| 359 | 'gemini-pro-vision', | ||
| 360 | ]; | ||
| 361 | |||
| 362 | const dummyRequiredModels = [ | ||
| 363 | 'gemini-1.0-pro-vision-latest', | ||
| 364 | 'gemini-pro-vision', | ||
| 365 | ]; | 356 | ]; |
| 366 | 357 | ||
| 367 | const isMultimodal = visionSupportedModels.includes(model); | 358 | const isMultimodal = visionSupportedModels.includes(model); |
| @@ -452,16 +443,6 @@ export function convertGooglePrompt(messages, model, useSysPrompt = false, charN | |||
| 452 | } | 443 | } |
| 453 | }); | 444 | }); |
| 454 | 445 | ||
| 455 | // pro 1.5 doesn't require a dummy image to be attached, other vision models do | ||
| 456 | if (isMultimodal && dummyRequiredModels.includes(model) && !hasImage) { | ||
| 457 | contents[0].parts.push({ | ||
| 458 | inlineData: { | ||
| 459 | mimeType: 'image/png', | ||
| 460 | data: PNG_PIXEL, | ||
| 461 | }, | ||
| 462 | }); | ||
| 463 | } | ||
| 464 | |||
| 465 | return { contents: contents, system_instruction: system_instruction }; | 446 | return { contents: contents, system_instruction: system_instruction }; |
| 466 | } | 447 | } |
| 467 | 448 | ||