🚀 fix: Resolve Google Client Issues, CDN Screenshots, Update Models (#5703)

* 🤖 refactor: streamline model selection logic for title model in GoogleClient

* refactor: add options for empty object schemas in convertJsonSchemaToZod

* refactor: add utility function to check for empty object schemas in convertJsonSchemaToZod

* fix: Google MCP Tool errors, and remove Object Unescaping as Google fixed this

* fix: google safetySettings

* feat: add safety settings exclusion via GOOGLE_EXCLUDE_SAFETY_SETTINGS environment variable

* fix: rename environment variable for console JSON string length

* fix: disable portal for dropdown in ExportModal component

* fix: screenshot functionality to use image placeholder for remote images

* feat: add visionMode property to BaseClient and initialize in GoogleClient to fix resendFiles issue

* fix: enhance formatMessages to include image URLs in message content for Vertex AI

* fix: safety settings for titleChatCompletion

* fix: remove deprecated model assignment in GoogleClient and streamline title model retrieval

* fix: remove unused image preloading logic in ScreenshotContext

* chore: update default google models to latest models shared by vertex ai and gen ai

* refactor: enhance Google error messaging

* fix: update token values and model limits for Gemini models

* ci: fix model matching

* chore: bump version of librechat-data-provider to 0.7.699
This commit is contained in:
Danny Avila 2025-02-06 18:13:18 -05:00 committed by GitHub
parent 33e60c379b
commit 63afb317c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 939 additions and 720 deletions

View file

@ -9,7 +9,24 @@ export type JsonSchemaType = {
description?: string;
};
export function convertJsonSchemaToZod(schema: JsonSchemaType): z.ZodType {
function isEmptyObjectSchema(jsonSchema?: JsonSchemaType): boolean {
return (
jsonSchema != null &&
typeof jsonSchema === 'object' &&
jsonSchema.type === 'object' &&
(jsonSchema.properties == null || Object.keys(jsonSchema.properties).length === 0)
);
}
export function convertJsonSchemaToZod(
schema: JsonSchemaType,
options: { allowEmptyObject?: boolean } = {},
): z.ZodType | undefined {
const { allowEmptyObject = true } = options;
if (!allowEmptyObject && isEmptyObjectSchema(schema)) {
return undefined;
}
let zodSchema: z.ZodType;
// Handle primitive types
@ -26,13 +43,16 @@ export function convertJsonSchemaToZod(schema: JsonSchemaType): z.ZodType {
zodSchema = z.boolean();
} else if (schema.type === 'array' && schema.items !== undefined) {
const itemSchema = convertJsonSchemaToZod(schema.items);
zodSchema = z.array(itemSchema);
zodSchema = z.array(itemSchema as z.ZodType);
} else if (schema.type === 'object') {
const shape: Record<string, z.ZodType> = {};
const properties = schema.properties ?? {};
for (const [key, value] of Object.entries(properties)) {
let fieldSchema = convertJsonSchemaToZod(value);
if (!fieldSchema) {
continue;
}
if (value.description != null && value.description !== '') {
fieldSchema = fieldSchema.describe(value.description);
}