diff --git a/client/src/localization/languages/Br.tsx b/client/src/localization/languages/Br.tsx
index edb51686d95..1761a7cbc59 100644
--- a/client/src/localization/languages/Br.tsx
+++ b/client/src/localization/languages/Br.tsx
@@ -40,6 +40,7 @@ export default {
com_ui_cancel: 'Cancelar',
com_ui_save: 'Salvar',
com_ui_save_submit: 'Salvar e Enviar',
+ com_user_message: 'Você',
com_ui_copy_to_clipboard: 'Copiar para a área de transferência',
com_ui_copied_to_clipboard: 'Copiado para a área de transferência',
com_ui_regenerate: 'Regenerar',
diff --git a/client/src/localization/languages/Eng.tsx b/client/src/localization/languages/Eng.tsx
index e3c023c66bc..aa07add58b7 100644
--- a/client/src/localization/languages/Eng.tsx
+++ b/client/src/localization/languages/Eng.tsx
@@ -39,6 +39,7 @@ export default {
com_ui_cancel: 'Cancel',
com_ui_save: 'Save',
com_ui_save_submit: 'Save & Submit',
+ com_user_message: 'You',
com_ui_copy_to_clipboard: 'Copy to clipboard',
com_ui_copied_to_clipboard: 'Copied to clipboard',
com_ui_regenerate: 'Regenerate',
diff --git a/client/src/localization/languages/Es.tsx b/client/src/localization/languages/Es.tsx
index 40136b32116..e64869a3ada 100644
--- a/client/src/localization/languages/Es.tsx
+++ b/client/src/localization/languages/Es.tsx
@@ -2,195 +2,200 @@
export default {
com_ui_examples: 'Ejemplos',
- com_ui_new_chat: 'Nuevo chat',
- com_ui_example_quantum_computing: 'Explica la computación cuántica en términos simples',
+ com_ui_new_chat: 'Nuevo Chat',
+ com_ui_example_quantum_computing: 'Explicar la computación cuántica en términos simples',
com_ui_example_10_year_old_b_day:
'¿Tienes alguna idea creativa para el cumpleaños de un niño de 10 años?',
com_ui_example_http_in_js: '¿Cómo hago una solicitud HTTP en Javascript?',
com_ui_capabilities: 'Capacidades',
com_ui_capability_remember: 'Recuerda lo que el usuario dijo anteriormente en la conversación',
- com_ui_capability_correction: 'Permite al usuario proporcionar correcciones de seguimiento',
+ com_ui_capability_correction: 'Permite que el usuario proporcione correcciones de seguimiento',
com_ui_capability_decline_requests: 'Entrenado para rechazar solicitudes inapropiadas',
com_ui_limitations: 'Limitaciones',
com_ui_limitation_incorrect_info: 'Puede generar ocasionalmente información incorrecta',
com_ui_limitation_harmful_biased:
- 'Puede producir ocasionalmente instrucciones dañinas o contenido sesgado',
- com_ui_limitation_limited_2021: 'Conocimiento limitado del mundo y los eventos después de 2021',
+ 'Puede ocasionalmente producir instrucciones perjudiciales o contenido sesgado',
+ com_ui_limitation_limited_2021: 'Conocimiento limitado del mundo y eventos después de 2021',
+ com_ui_experimental: 'Experimental',
com_ui_input: 'Entrada',
com_ui_close: 'Cerrar',
com_ui_model: 'Modelo',
- com_ui_select_model: 'Selecciona un modelo',
- com_ui_use_prompt: 'Usar indicación',
+ com_ui_select_model: 'Seleccione un modelo',
+ com_ui_use_prompt: 'Usar el prompt',
com_ui_prev: 'Anterior',
com_ui_next: 'Siguiente',
com_ui_stop: 'Detener',
- com_ui_prompt_templates: 'Plantillas de indicación',
- com_ui_hide_prompt_templates: 'Ocultar plantillas de indicación',
+ com_ui_prompt_templates: 'Plantillas de Prompt',
+ com_ui_hide_prompt_templates: 'Ocultar Plantillas de Prompt',
com_ui_showing: 'Mostrando',
com_ui_of: 'de',
com_ui_entries: 'Entradas',
- com_ui_pay_per_call:
- 'Todas las conversaciones de IA en un solo lugar. Paga por llamada y no por mes',
+ com_ui_pay_per_call: 'Todas las conversaciones de IA en un solo lugar. Pague por llamada y no por mes',
+ com_ui_new_footer: 'Todas las conversaciones de IA en un solo lugar.',
com_ui_enter: 'Entrar',
com_ui_submit: 'Enviar',
- com_ui_upload_success: 'Archivo subido con éxito',
- com_ui_upload_invalid: 'Archivo inválido para subir',
+ com_ui_upload_success: 'Archivo cargado con éxito',
+ com_ui_upload_error: 'Hubo un error al cargar su archivo',
+ com_ui_upload_invalid: 'Archivo no válido para cargar. Debe ser una imagen que no exceda los 2 MB',
com_ui_cancel: 'Cancelar',
com_ui_save: 'Guardar',
- com_ui_save_submit: 'Guardar y enviar',
+ com_ui_save_submit: 'Guardar y Enviar',
+ com_user_message: 'Tú',
+ com_user_message: 'Usted',
com_ui_copy_to_clipboard: 'Copiar al portapapeles',
com_ui_copied_to_clipboard: 'Copiado al portapapeles',
com_ui_regenerate: 'Regenerar',
com_ui_continue: 'Continuar',
com_ui_edit: 'Editar',
com_ui_success: 'Éxito',
- com_ui_all: 'todo',
+ com_ui_all: 'todos',
com_ui_clear: 'Limpiar',
com_ui_revoke: 'Revocar',
- com_ui_revoke_info: 'Revoca todas las credenciales proporcionadas por el usuario',
- com_ui_confirm_action: 'Confirmar acción',
+ com_ui_revoke_info: 'Revocar todas las credenciales proporcionadas por el usuario',
+ com_ui_confirm_action: 'Confirmar Acción',
com_ui_chats: 'chats',
com_ui_delete: 'Eliminar',
com_ui_delete_conversation: '¿Eliminar chat?',
com_ui_delete_conversation_confirm: 'Esto eliminará',
+ com_ui_preview: 'Vista previa',
+ com_ui_upload: 'Cargar',
+ com_ui_connect: 'Conectar',
com_auth_error_login:
- 'No se pudo iniciar sesión con la información proporcionada. Por favor, comprueba tus credenciales e inténtalo de nuevo.',
+ 'No se pudo iniciar sesión con la información proporcionada. Por favor, verifique sus credenciales e inténtelo de nuevo.',
com_auth_error_login_rl:
- 'Demasiados intentos de inicio de sesión en poco tiempo. Por favor, inténtalo de nuevo más tarde.',
- com_auth_error_login_ban: 'Tu cuenta ha sido temporalmente baneada por violar nuestro servicio.',
+ 'Demasiados intentos de inicio de sesión en un corto período de tiempo. Por favor, inténtelo nuevamente más tarde.',
+ com_auth_error_login_ban:
+ 'Su cuenta ha sido temporalmente suspendida debido a violaciones de nuestro servicio.',
com_auth_error_login_server:
- 'Hubo un error interno del servidor. Por favor, espera unos momentos e inténtalo de nuevo.',
- com_auth_no_account: '¿No tienes una cuenta?',
- com_auth_sign_up: 'Regístrate',
+ 'Hubo un error interno del servidor. Por favor, espere unos momentos e inténtelo nuevamente.',
+ com_auth_no_account: '¿No tiene una cuenta?',
+ com_auth_sign_up: 'Registrarse',
com_auth_sign_in: 'Iniciar sesión',
- com_auth_google_login: 'Iniciar sesión con Google',
- com_auth_facebook_login: 'Iniciar sesión con Facebook',
- com_auth_github_login: 'Iniciar sesión con Github',
- com_auth_discord_login: 'Iniciar sesión con Discord',
+ com_auth_google_login: 'Inicio de sesión con Google',
+ com_auth_facebook_login: 'Inicio de sesión con Facebook',
+ com_auth_github_login: 'Inicio de sesión con Github',
+ com_auth_discord_login: 'Inicio de sesión con Discord',
com_auth_email: 'Correo electrónico',
- com_auth_email_required: 'Se requiere correo electrónico',
+ com_auth_email_required: 'El correo electrónico es obligatorio',
com_auth_email_min_length: 'El correo electrónico debe tener al menos 6 caracteres',
com_auth_email_max_length: 'El correo electrónico no debe tener más de 120 caracteres',
- com_auth_email_pattern: 'Debes introducir una dirección de correo electrónico válida',
+ com_auth_email_pattern: 'Debe ingresar una dirección de correo electrónico válida',
com_auth_email_address: 'Dirección de correo electrónico',
com_auth_password: 'Contraseña',
- com_auth_password_required: 'Se requiere contraseña',
+ com_auth_password_required: 'La contraseña es obligatoria',
com_auth_password_min_length: 'La contraseña debe tener al menos 8 caracteres',
com_auth_password_max_length: 'La contraseña debe tener menos de 128 caracteres',
- com_auth_password_forgot: '¿Olvidaste la contraseña?',
+ com_auth_password_forgot: '¿Olvidó la contraseña?',
com_auth_password_confirm: 'Confirmar contraseña',
com_auth_password_not_match: 'Las contraseñas no coinciden',
com_auth_continue: 'Continuar',
- com_auth_create_account: 'Crea tu cuenta',
- com_auth_error_create:
- 'Hubo un error al intentar registrar tu cuenta. Por favor, inténtalo de nuevo.',
+ com_auth_create_account: 'Crear su cuenta',
+ com_auth_error_create: 'Hubo un error al intentar registrar su cuenta. Por favor, inténtelo nuevamente.',
com_auth_full_name: 'Nombre completo',
- com_auth_name_required: 'Se requiere nombre',
+ com_auth_name_required: 'El nombre es obligatorio',
com_auth_name_min_length: 'El nombre debe tener al menos 3 caracteres',
- com_auth_name_max_length: 'El nombre debe tener menos de 80 caracteres',
+ com_auth_name_max_length: 'El nombre no debe tener más de 80 caracteres',
com_auth_username: 'Nombre de usuario (opcional)',
- com_auth_username_required: 'Se requiere nombre de usuario',
+ com_auth_username_required: 'El nombre de usuario es obligatorio',
com_auth_username_min_length: 'El nombre de usuario debe tener al menos 2 caracteres',
com_auth_username_max_length: 'El nombre de usuario debe tener menos de 20 caracteres',
- com_auth_already_have_account: '¿Ya tienes una cuenta?',
+ com_auth_already_have_account: '¿Ya tiene una cuenta?',
com_auth_login: 'Iniciar sesión',
- com_auth_reset_password: 'Restablece tu contraseña',
- com_auth_click: 'Haz clic',
+ com_auth_reset_password: 'Restablecer su contraseña',
+ com_auth_click: 'Haga clic',
com_auth_here: 'AQUÍ',
- com_auth_to_reset_your_password: 'para restablecer tu contraseña.',
+ com_auth_to_reset_your_password: 'para restablecer su contraseña.',
com_auth_reset_password_link_sent: 'Correo electrónico enviado',
com_auth_reset_password_email_sent:
- 'Se te ha enviado un correo electrónico con más instrucciones para restablecer tu contraseña.',
+ 'Se ha enviado un correo electrónico con más instrucciones para restablecer su contraseña.',
com_auth_error_reset_password:
- 'Hubo un problema al restablecer tu contraseña. No se encontró ningún usuario con la dirección de correo electrónico proporcionada. Por favor, inténtalo de nuevo.',
- com_auth_reset_password_success: 'Contraseña restablecida con éxito',
- com_auth_login_with_new_password: 'Ahora puedes iniciar sesión con tu nueva contraseña.',
- com_auth_error_invalid_reset_token:
- 'Este token de restablecimiento de contraseña ya no es válido.',
- com_auth_click_here: 'Haz clic aquí',
+ 'Hubo un problema al restablecer su contraseña. No se encontró ningún usuario con la dirección de correo electrónico proporcionada. Por favor, inténtelo nuevamente.',
+ com_auth_reset_password_success: 'Restablecimiento de contraseña exitoso',
+ com_auth_login_with_new_password: 'Ahora puede iniciar sesión con su nueva contraseña.',
+ com_auth_error_invalid_reset_token: 'Este token de restablecimiento de contraseña ya no es válido.',
+ com_auth_click_here: 'Haga clic aquí',
com_auth_to_try_again: 'para intentarlo de nuevo.',
com_auth_submit_registration: 'Enviar registro',
com_auth_welcome_back: 'Bienvenido de nuevo',
- com_endpoint_open_menu: 'Abrir menú',
- com_endpoint_bing_enable_sydney: 'Activar Sydney',
- com_endpoint_bing_to_enable_sydney: 'Para activar Sydney',
+ com_endpoint_open_menu: 'Abrir Menú',
+ com_endpoint_bing_enable_sydney: 'Habilitar Sydney',
+ com_endpoint_bing_to_enable_sydney: 'Para habilitar Sydney',
com_endpoint_bing_jailbreak: 'Jailbreak',
com_endpoint_bing_context_placeholder:
- 'Bing puede usar hasta 7k tokens para el "contexto", al que puede hacer referencia para la conversación. El límite específico no se conoce, pero puede dar errores al superar los 7k tokens',
+ 'Bing puede usar hasta 7k tokens para "contexto", que puede referenciar en la conversación. El límite específico no se conoce, pero puede haber errores al exceder los 7k tokens.',
com_endpoint_bing_system_message_placeholder:
- 'ADVERTENCIA: ¡El uso indebido de esta función puede hacer que te BANEEN de usar Bing! Haz clic en "Mensaje del sistema" para ver las instrucciones completas y el mensaje predeterminado si se omite, que es el preajuste de "Sydney" que se considera seguro.',
- com_endpoint_system_message: 'Mensaje del sistema',
+ 'ADVERTENCIA: El uso indebido de esta función puede provocar que sea EXPULSADO de usar Bing. Haga clic en \'System Message\' para obtener instrucciones completas y el mensaje predeterminado si se omite, que es el preajuste \'Sydney\' que se considera seguro.',
+ com_endpoint_system_message: 'Mensaje del Sistema',
+ com_endpoint_message: 'Conversar con',
+ com_endpoint_message_not_appendable: 'Edite su mensaje o Regenere.',
com_endpoint_default_blank: 'predeterminado: en blanco',
com_endpoint_default_false: 'predeterminado: falso',
com_endpoint_default_creative: 'predeterminado: creativo',
com_endpoint_default_empty: 'predeterminado: vacío',
com_endpoint_default_with_num: 'predeterminado: {0}',
com_endpoint_context: 'Contexto',
- com_endpoint_tone_style: 'Estilo de tono',
- com_endpoint_token_count: 'Recuento de tokens',
+ com_endpoint_tone_style: 'Estilo de Tono',
+ com_endpoint_token_count: 'Recuento de Tokens',
com_endpoint_output: 'Salida',
com_endpoint_google_temp:
- 'Valores más altos = más aleatorios, mientras que valores más bajos = más enfocados y deterministas. Recomendamos alterar esto o Top P pero no ambos.',
+ 'Valores más altos = más aleatorio, mientras que valores más bajos = más enfocado y determinista. Recomendamos cambiar esto o Top P, pero no ambos.',
com_endpoint_google_topp:
- 'Top-p cambia cómo el modelo selecciona tokens para la salida. Los tokens se seleccionan desde el más K (ver parámetro topK) probable al menos hasta que la suma de sus probabilidades sea igual al valor de top-p.',
+ 'Top-p cambia cómo el modelo selecciona tokens para la salida. Los tokens se seleccionan desde el más K (ver el parámetro topK) probable hasta el menos, hasta que la suma de sus probabilidades sea igual al valor de top-p.',
com_endpoint_google_topk:
- 'Top K cambia cómo el modelo selecciona los tokens para la salida. Un top-k de 1 significa que el token seleccionado es el más probable entre todos los tokens en el vocabulario del modelo (también conocido como decodificación codiciosa), mientras que un top-k de 3 significa que el siguiente token se selecciona entre los 3 tokens más probables (usando temperatura).',
- com_endpoint_google_prompt_prefix_placeholder:
- 'Establece instrucciones o contexto personalizado. Ignorado si está vacío.',
+ 'Top-k cambia cómo el modelo selecciona tokens para la salida. Un top-k de 1 significa que el token seleccionado es el más probable entre todos los tokens en el vocabulario del modelo (también llamado decodificación codiciosa), mientras que un top-k de 3 significa que el próximo token se selecciona entre los 3 tokens más probables (usando temperatura).',
com_endpoint_google_maxoutputtokens:
- 'Número máximo de tokens que se pueden generar en la respuesta. Especifica un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
- com_endpoint_google_custom_name_placeholder: 'Establece un nombre personalizado para Google',
+ 'Número máximo de tokens que pueden generarse en la respuesta. Especifique un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
+ com_endpoint_google_custom_name_placeholder: 'Defina un nombre personalizado para Google',
com_endpoint_prompt_prefix_placeholder:
- 'Establece instrucciones o contexto personalizados. Se ignora si está vacío.',
- com_endpoint_custom_name: 'Nombre personalizado',
- com_endpoint_prompt_prefix: 'Prefijo de indicación',
+ 'Defina instrucciones personalizadas o contexto. Se ignora si está vacío.',
+ com_endpoint_custom_name: 'Nombre Personalizado',
+ com_endpoint_prompt_prefix: 'Prefijo del Prompt',
com_endpoint_temperature: 'Temperatura',
com_endpoint_default: 'predeterminado',
com_endpoint_top_p: 'Top P',
com_endpoint_top_k: 'Top K',
- com_endpoint_max_output_tokens: 'Tokens máximos de salida',
+ com_endpoint_max_output_tokens: 'Máximo de Tokens de Salida',
com_endpoint_openai_temp:
- 'Valores más altos = más aleatorios, mientras que valores más bajos = más enfocados y deterministas. Recomendamos alterar esto o Top P pero no ambos.',
+ 'Valores más altos = más aleatorio, mientras que valores más bajos = más enfocado y determinista. Recomendamos cambiar esto o Top P, pero no ambos.',
com_endpoint_openai_max:
- 'Los tokens máximos a generar. La longitud total de los tokens de entrada y los tokens generados está limitada por la longitud de contexto del modelo.',
+ 'Tokens máximos para generar. La longitud total de los tokens de entrada y los tokens generados está limitada por la longitud del contexto del modelo.',
com_endpoint_openai_topp:
- 'Una alternativa al muestreo con temperatura, llamada muestreo de núcleo, donde el modelo considera los resultados de los tokens con masa de probabilidad top_p. Así que 0.1 significa que solo se consideran los tokens que comprenden la masa de probabilidad del 10% superior. Recomendamos alterar esto o la temperatura pero no ambos.',
+ 'Una alternativa para el muestreo con temperatura, llamada muestreo de núcleo, donde el modelo considera los resultados de los tokens con masa de probabilidad top_p. Entonces, 0.1 significa que solo se consideran los tokens que comprenden la masa de probabilidad de los 10% principales. Recomendamos cambiar esto o la temperatura, pero no ambos.',
com_endpoint_openai_freq:
- 'Número entre -2.0 y 2.0. Los valores positivos penalizan los nuevos tokens en función de su frecuencia existente en el texto hasta el momento, disminuyendo la probabilidad del modelo de repetir la misma línea textualmente.',
+ 'Número entre -2.0 y 2.0. Los valores positivos penalizan los nuevos tokens según su frecuencia existente en el texto hasta ahora, disminuyendo la probabilidad de que el modelo repita la misma línea literalmente.',
com_endpoint_openai_pres:
- 'Número entre -2.0 y 2.0. Los valores positivos penalizan los nuevos tokens en función de si aparecen en el texto hasta el momento, aumentando la probabilidad del modelo de hablar de nuevos temas.',
- com_endpoint_openai_custom_name_placeholder: 'Establece un nombre personalizado para ChatGPT',
+ 'Número entre -2.0 y 2.0. Los valores positivos penalizan los nuevos tokens según si aparecen en el texto hasta ahora, aumentando la probabilidad de que el modelo hable sobre nuevos temas.',
+ com_endpoint_openai_custom_name_placeholder: 'Defina un nombre personalizado para ChatGPT',
com_endpoint_openai_prompt_prefix_placeholder:
- 'Establece instrucciones personalizadas para incluir en el mensaje del sistema. Predeterminado: ninguno',
+ 'Defina instrucciones personalizadas para incluir en el Mensaje del Sistema. Predeterminado: ninguno',
com_endpoint_anthropic_temp:
- 'Varía de 0 a 1. Usa una temperatura más cercana a 0 para analítico / opción múltiple, y más cercana a 1 para tareas creativas y generativas. Recomendamos alterar esto o Top P pero no ambos.',
+ 'Varía de 0 a 1. Use temp más cercano a 0 para analítico / opción múltiple, y más cercano a 1 para tareas creativas y generativas. Recomendamos cambiar esto o Top P, pero no ambos.',
com_endpoint_anthropic_topp:
- 'Top-p cambia cómo el modelo selecciona tokens para la salida. Los tokens se seleccionan desde el más K (ver parámetro topK) probable al menos hasta que la suma de sus probabilidades sea igual al valor de top-p.',
+ 'Top-p cambia cómo el modelo selecciona tokens para la salida. Los tokens se seleccionan desde el más K (ver el parámetro topK) probable hasta el menos, hasta que la suma de sus probabilidades sea igual al valor de top-p.',
com_endpoint_anthropic_topk:
- 'Top-k cambia cómo el modelo selecciona tokens para la salida. Un top-k de 1 significa que el token seleccionado es el más probable entre todos los tokens del vocabulario del modelo (también llamado decodificación codiciosa), mientras que un top-k de 3 significa que el siguiente token se selecciona entre los 3 tokens más probables (usando la temperatura).',
+ 'Top-k cambia cómo el modelo selecciona tokens para la salida. Un top-k de 1 significa que el token seleccionado es el más probable entre todos los tokens en el vocabulario del modelo (también llamado decodificación codiciosa), mientras que un top-k de 3 significa que el próximo token se selecciona entre los 3 tokens más probables (usando temperatura).',
com_endpoint_anthropic_maxoutputtokens:
- 'Número máximo de tokens que se pueden generar en la respuesta. Especifica un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
- com_endpoint_anthropic_custom_name_placeholder:
- 'Establece un nombre personalizado para Anthropic',
- com_endpoint_frequency_penalty: 'Penalización de frecuencia',
+ 'Número máximo de tokens que pueden generarse en la respuesta. Especifique un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
+ com_endpoint_anthropic_custom_name_placeholder: 'Defina un nombre personalizado para Anthropic',
+ com_endpoint_frequency_penalty: 'Penalización de Frecuencia',
com_endpoint_presence_penalty: 'Penalización de presencia',
com_endpoint_plug_use_functions: 'Usar funciones',
com_endpoint_plug_skip_completion: 'Saltar completación',
- com_endpoint_disabled_with_tools: 'desactivado con herramientas',
+ com_endpoint_disabled_with_tools: 'Desactivado con herramientas',
com_endpoint_disabled_with_tools_placeholder: 'Desactivado con herramientas seleccionadas',
com_endpoint_plug_set_custom_instructions_for_gpt_placeholder:
- 'Establece instrucciones personalizadas para incluir en el mensaje del sistema. Predeterminado: ninguno',
+ 'Establecer instrucciones personalizadas para incluir en el mensaje del sistema. Predeterminado: ninguno',
com_endpoint_import: 'Importar',
com_endpoint_set_custom_name:
- 'Establece un nombre personalizado, en caso de que puedas encontrar este preajuste',
- com_endpoint_preset: 'preajuste',
- com_endpoint_presets: 'preajustes',
+ 'Establecer un nombre personalizado, en caso de que puedas encontrar este preajuste',
+ com_endpoint_preset: 'Preajuste',
+ com_endpoint_presets: 'Preajustes',
com_endpoint_preset_name: 'Nombre del preajuste',
com_endpoint_new_topic: 'Nuevo tema',
com_endpoint: 'Punto final',
com_endpoint_hide: 'Ocultar',
com_endpoint_show: 'Mostrar',
- com_endpoint_examples: ' Preajustes',
+ com_endpoint_examples: 'Ejemplos',
com_endpoint_completion: 'Completación',
com_endpoint_agent: 'Agente',
com_endpoint_show_what_settings: 'Mostrar {0} ajustes',
@@ -198,7 +203,7 @@ export default {
com_endpoint_export: 'Exportar',
com_endpoint_save_as_preset: 'Guardar como preajuste',
com_endpoint_presets_clear_warning:
- '¿Estás seguro de que quieres borrar todos los preajustes? Esto es irreversible.',
+ '¿Estás seguro de que quieres borrar todos los preajustes? Esto es irreversible.',
com_endpoint_not_implemented: 'No implementado',
com_endpoint_no_presets: 'Aún no hay preajustes, usa el botón de ajustes para crear uno',
com_endpoint_not_available: 'No hay punto final disponible',
@@ -209,7 +214,7 @@ export default {
com_endpoint_completion_model: 'Modelo de completación (Recomendado: GPT-4)',
com_endpoint_func_hover: 'Habilitar el uso de plugins como funciones de OpenAI',
com_endpoint_skip_hover:
- 'Habilitar el salto del paso de completación, que revisa la respuesta final y los pasos generados',
+ 'Habilitar el salto del paso de completación, que revisa la respuesta final y los pasos generados',
com_endpoint_config_key: 'Establecer clave de API',
com_endpoint_config_key_for: 'Establecer clave de API para',
com_endpoint_config_key_name: 'Clave',
@@ -219,18 +224,18 @@ export default {
com_endpoint_config_key_expiry: 'la hora de caducidad',
com_endpoint_config_key_import_json_key: 'Importar clave JSON de cuenta de servicio.',
com_endpoint_config_key_import_json_key_success:
- 'Clave JSON de cuenta de servicio importada con éxito',
+ 'Clave JSON de cuenta de servicio importada con éxito',
com_endpoint_config_key_import_json_key_invalid:
- 'Clave JSON de cuenta de servicio inválida, ¿importaste el archivo correcto?',
+ 'Clave JSON de cuenta de servicio inválida, ¿importaste el archivo correcto?',
com_endpoint_config_key_get_edge_key:
- 'Para obtener tu token de acceso para Bing, inicia sesión en',
+ 'Para obtener tu token de acceso para Bing, inicia sesión en',
com_endpoint_config_key_get_edge_key_dev_tool:
- 'Usa las herramientas de desarrollo o una extensión mientras estás conectado al sitio para copiar el contenido de la cookie _U. Si esto falla, sigue estas',
+ 'Usa las herramientas de desarrollo o una extensión mientras estás conectado al sitio para copiar el contenido de la cookie _U. Si esto falla, sigue estas',
com_endpoint_config_key_edge_instructions: 'instrucciones',
com_endpoint_config_key_edge_full_key_string:
- 'para proporcionar las cadenas de cookies completas.',
+ 'para proporcionar las cadenas de cookies completas.',
com_endpoint_config_key_chatgpt:
- 'Para obtener tu token de acceso para ChatGPT "Versión gratuita", inicia sesión en',
+ 'Para obtener tu token de acceso para ChatGPT "Versión gratuita", inicia sesión en',
com_endpoint_config_key_chatgpt_then_visit: 'luego visita',
com_endpoint_config_key_chatgpt_copy_token: 'Copia el token de acceso.',
com_endpoint_config_key_google_need_to: 'Necesitas',
@@ -238,12 +243,12 @@ export default {
com_endpoint_config_key_google_vertex_api: 'API en Google Cloud, luego',
com_endpoint_config_key_google_service_account: 'Crear una cuenta de servicio',
com_endpoint_config_key_google_vertex_api_role:
- 'Asegúrate de hacer clic en "Crear y continuar" para dar al menos el rol de "Usuario de Vertex AI". Por último, crea una clave JSON para importarla aquí.',
+ 'Asegúrate de hacer clic en "Crear y continuar" para dar al menos el rol de "Usuario de Vertex AI". Por último, crea una clave JSON para importarla aquí.',
com_nav_auto_scroll: 'Desplazamiento automático al más reciente al abrir',
com_nav_plugin_store: 'Tienda de plugins',
com_nav_plugin_search: 'Buscar plugins',
com_nav_plugin_auth_error:
- 'Hubo un error al intentar autenticar este plugin. Por favor, inténtalo de nuevo.',
+ 'Hubo un error al intentar autenticar este plugin. Por favor, inténtalo de nuevo.',
com_nav_export_filename: 'Nombre de archivo',
com_nav_export_filename_placeholder: 'Establece el nombre de archivo',
com_nav_export_type: 'Tipo',
@@ -267,10 +272,11 @@ export default {
com_nav_user: 'USUARIO',
com_nav_clear_conversation: 'Borrar conversaciones',
com_nav_clear_conversation_confirm_message:
- '¿Estás seguro de que quieres borrar todas las conversaciones? Esto es irreversible.',
+ '¿Estás seguro de que quieres borrar todas las conversaciones? Esto es irreversible.',
com_nav_help_faq: 'Ayuda y preguntas frecuentes',
com_nav_settings: 'Ajustes',
com_nav_search_placeholder: 'Buscar mensajes',
com_nav_setting_general: 'General',
com_nav_setting_data: 'Controles de datos',
+ com_nav_lang_spanish: 'Español',
};
From e0d08c7ccba928e9c3fb131bad6cce7e58cb63e1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ra=C3=AD=20Santos?=
<140329135+itzraiss@users.noreply.github.com>
Date: Wed, 17 Jan 2024 21:38:27 -0300
Subject: [PATCH 3/9] fix: remove "!"
---
client/src/components/Chat/Messages/Message.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/client/src/components/Chat/Messages/Message.tsx b/client/src/components/Chat/Messages/Message.tsx
index 16d24880158..57084e9c97c 100644
--- a/client/src/components/Chat/Messages/Message.tsx
+++ b/client/src/components/Chat/Messages/Message.tsx
@@ -62,7 +62,7 @@ export default function Message(props: TMessageProps) {
className={cn('relative flex w-full flex-col', isCreatedByUser ? '' : 'agent-turn')}
>
diff --git a/client/src/components/Nav/SettingsTabs/General/General.tsx b/client/src/components/Nav/SettingsTabs/General/General.tsx
index 8cc59537656..28a0f2eb275 100644
--- a/client/src/components/Nav/SettingsTabs/General/General.tsx
+++ b/client/src/components/Nav/SettingsTabs/General/General.tsx
@@ -1,5 +1,6 @@
import { useRecoilState } from 'recoil';
import * as Tabs from '@radix-ui/react-tabs';
+import { SettingsTabValues } from 'librechat-data-provider';
import React, { useState, useContext, useCallback, useRef } from 'react';
import { useClearConversationsMutation } from 'librechat-data-provider/react-query';
import {
@@ -14,7 +15,6 @@ import type { TDangerButtonProps } from '~/common';
import AutoScrollSwitch from './AutoScrollSwitch';
import { Dropdown } from '~/components/ui';
import DangerButton from '../DangerButton';
-import ModularChat from './ModularChat';
import store from '~/store';
export const ThemeSelector = ({
@@ -167,7 +167,7 @@ function General() {
return (
-
-
-
);
diff --git a/client/src/components/Nav/SettingsTabs/index.ts b/client/src/components/Nav/SettingsTabs/index.ts
index 73174aa7984..71e8c36c198 100644
--- a/client/src/components/Nav/SettingsTabs/index.ts
+++ b/client/src/components/Nav/SettingsTabs/index.ts
@@ -1,5 +1,6 @@
export { default as General } from './General/General';
export { ClearChatsButton } from './General/General';
export { default as Data } from './Data/Data';
+export { default as Beta } from './Beta/Beta';
export { RevokeKeysButton } from './Data/Data';
export { default as Account } from './Account/Account';
diff --git a/client/src/components/svg/ExperimentIcon.tsx b/client/src/components/svg/ExperimentIcon.tsx
new file mode 100644
index 00000000000..f3de09bd09f
--- /dev/null
+++ b/client/src/components/svg/ExperimentIcon.tsx
@@ -0,0 +1,27 @@
+export default function ExperimentIcon() {
+ return (
+
+ );
+}
diff --git a/client/src/components/svg/index.ts b/client/src/components/svg/index.ts
index 5421233eaab..ac4ad7f0b8f 100644
--- a/client/src/components/svg/index.ts
+++ b/client/src/components/svg/index.ts
@@ -42,3 +42,4 @@ export { default as GoogleMinimalIcon } from './GoogleMinimalIcon';
export { default as AnthropicMinimalIcon } from './AnthropicMinimalIcon';
export { default as SendMessageIcon } from './SendMessageIcon';
export { default as UserIcon } from './UserIcon';
+export { default as ExperimentIcon } from './ExperimentIcon';
diff --git a/client/src/localization/languages/Eng.tsx b/client/src/localization/languages/Eng.tsx
index e3c023c66bc..296fe6833d2 100644
--- a/client/src/localization/languages/Eng.tsx
+++ b/client/src/localization/languages/Eng.tsx
@@ -15,7 +15,7 @@ export default {
com_ui_limitation_harmful_biased:
'May occasionally produce harmful instructions or biased content',
com_ui_limitation_limited_2021: 'Limited knowledge of world and events after 2021',
- com_ui_experimental: 'Experimental',
+ com_ui_experimental: 'Experimental Features',
com_ui_input: 'Input',
com_ui_close: 'Close',
com_ui_model: 'Model',
@@ -265,6 +265,8 @@ export default {
com_nav_welcome_message: 'How can I help you today?',
com_nav_auto_scroll: 'Auto-scroll to Newest on Open',
com_nav_modular_chat: 'Enable switching Endpoints mid-conversation',
+ com_nav_latex_parsing:
+ 'Toggle parsing LaTeX in messages. Enabled by default but may affect performance on mobile or longer conversations.',
com_nav_profile_picture: 'Profile Picture',
com_nav_change_picture: 'Change picture',
com_nav_plugin_store: 'Plugin store',
@@ -303,6 +305,7 @@ export default {
com_nav_settings: 'Settings',
com_nav_search_placeholder: 'Search messages',
com_nav_setting_general: 'General',
+ com_nav_setting_beta: 'Beta features',
com_nav_setting_data: 'Data controls',
com_nav_setting_account: 'Account',
com_nav_language: 'Language',
diff --git a/client/src/store/settings.ts b/client/src/store/settings.ts
index d580e4bf3b6..9c1b572b5e1 100644
--- a/client/src/store/settings.ts
+++ b/client/src/store/settings.ts
@@ -69,6 +69,25 @@ const modularChat = atom({
] as const,
});
+const LaTeXParsing = atom({
+ key: 'LaTeXParsing',
+ default: true,
+ effects: [
+ ({ setSelf, onSet }) => {
+ const savedValue = localStorage.getItem('LaTeXParsing');
+ if (savedValue != null) {
+ setSelf(savedValue === 'true');
+ }
+
+ onSet((newValue: unknown) => {
+ if (typeof newValue === 'boolean') {
+ localStorage.setItem('LaTeXParsing', newValue.toString());
+ }
+ });
+ },
+ ] as const,
+});
+
export default {
abortScroll,
optionSettings,
@@ -78,4 +97,5 @@ export default {
showPopover,
autoScroll,
modularChat,
+ LaTeXParsing,
};
diff --git a/client/src/utils/index.ts b/client/src/utils/index.ts
index 12a32faf636..e329ed69dd5 100644
--- a/client/src/utils/index.ts
+++ b/client/src/utils/index.ts
@@ -1,5 +1,6 @@
export * from './json';
export * from './files';
+export * from './latex';
export * from './presets';
export * from './languages';
export * from './endpoints';
diff --git a/client/src/utils/latex.spec.ts b/client/src/utils/latex.spec.ts
new file mode 100644
index 00000000000..9cb483dd27d
--- /dev/null
+++ b/client/src/utils/latex.spec.ts
@@ -0,0 +1,86 @@
+import { processLaTeX } from './latex';
+
+describe('processLaTeX', () => {
+ test('returns the same string if no LaTeX patterns are found', () => {
+ const content = 'This is a test string without LaTeX';
+ expect(processLaTeX(content)).toBe(content);
+ });
+
+ test('converts inline LaTeX expressions correctly', () => {
+ const content = 'This is an inline LaTeX expression: \\(x^2 + y^2 = z^2\\)';
+ const expected = 'This is an inline LaTeX expression: $x^2 + y^2 = z^2$';
+ expect(processLaTeX(content)).toBe(expected);
+ });
+
+ test('converts block LaTeX expressions correctly', () => {
+ const content = 'This is a block LaTeX expression: \\[E = mc^2\\]';
+ const expected = 'This is a block LaTeX expression: $$E = mc^2$$';
+ expect(processLaTeX(content)).toBe(expected);
+ });
+
+ test('converts mixed LaTeX expressions correctly', () => {
+ const content = 'Inline \\(a + b = c\\) and block \\[x^2 + y^2 = z^2\\]';
+ const expected = 'Inline $a + b = c$ and block $$x^2 + y^2 = z^2$$';
+ expect(processLaTeX(content)).toBe(expected);
+ });
+
+ test('escapes dollar signs followed by a digit or space and digit', () => {
+ const content = 'Price is $50 and $ 100';
+ const expected = 'Price is \\$50 and \\$ 100';
+ expect(processLaTeX(content)).toBe(expected);
+ });
+
+ test('handles strings with no content', () => {
+ const content = '';
+ expect(processLaTeX(content)).toBe('');
+ });
+
+ test('does not alter already valid inline Markdown LaTeX', () => {
+ const content = 'This is a valid inline LaTeX: $x^2 + y^2 = z^2$';
+ expect(processLaTeX(content)).toBe(content);
+ });
+
+ test('does not alter already valid block Markdown LaTeX', () => {
+ const content = 'This is a valid block LaTeX: $$E = mc^2$$';
+ expect(processLaTeX(content)).toBe(content);
+ });
+
+ test('correctly processes a mix of valid Markdown LaTeX and LaTeX patterns', () => {
+ const content = 'Valid $a + b = c$ and LaTeX to convert \\(x^2 + y^2 = z^2\\)';
+ const expected = 'Valid $a + b = c$ and LaTeX to convert $x^2 + y^2 = z^2$';
+ expect(processLaTeX(content)).toBe(expected);
+ });
+
+ test('correctly handles strings with LaTeX and non-LaTeX dollar signs', () => {
+ const content = 'Price $100 and LaTeX \\(x^2 + y^2 = z^2\\)';
+ const expected = 'Price \\$100 and LaTeX $x^2 + y^2 = z^2$';
+ expect(processLaTeX(content)).toBe(expected);
+ });
+
+ test('ignores non-LaTeX content enclosed in dollar signs', () => {
+ const content = 'This is not LaTeX: $This is just text$';
+ expect(processLaTeX(content)).toBe(content);
+ });
+
+ test('correctly processes complex block LaTeX with line breaks', () => {
+ const complexBlockLatex = `Certainly! Here's an example of a mathematical formula written in LaTeX:
+
+ \\[
+ \\sum_{i=1}^{n} \\left( \\frac{x_i}{y_i} \\right)^2
+ \\]
+
+ This formula represents the sum of the squares of the ratios of \\(x\\) to \\(y\\) for \\(n\\) terms, where \\(x_i\\) and \\(y_i\\) represent the values of \\(x\\) and \\(y\\) for each term.
+
+ LaTeX is a typesetting system commonly used for mathematical and scientific documents. It provides a wide range of formatting options and symbols for expressing mathematical expressions.`;
+ const expectedOutput = `Certainly! Here's an example of a mathematical formula written in LaTeX:
+
+ $$
+ \\sum_{i=1}^{n} \\left( \\frac{x_i}{y_i} \\right)^2
+ $$
+
+ This formula represents the sum of the squares of the ratios of $x$ to $y$ for $n$ terms, where $x_i$ and $y_i$ represent the values of $x$ and $y$ for each term.
+
+ LaTeX is a typesetting system commonly used for mathematical and scientific documents. It provides a wide range of formatting options and symbols for expressing mathematical expressions.`;
+ expect(processLaTeX(complexBlockLatex)).toBe(expectedOutput);
+ });
+});
diff --git a/client/src/utils/latex.ts b/client/src/utils/latex.ts
new file mode 100644
index 00000000000..209859e95b6
--- /dev/null
+++ b/client/src/utils/latex.ts
@@ -0,0 +1,24 @@
+// Regex to check if the processed content contains any potential LaTeX patterns
+const containsLatexRegex =
+ /\\\(.*?\\\)|\\\[.*?\\\]|\$.*?\$|\\begin\{equation\}.*?\\end\{equation\}/;
+// Regex for inline and block LaTeX expressions
+const inlineLatex = new RegExp(/\\\((.+?)\\\)/, 'g');
+// const blockLatex = new RegExp(/\\\[(.*?)\\\]/, 'gs');
+const blockLatex = new RegExp(/\\\[(.*?[^\\])\\\]/, 'gs');
+
+export const processLaTeX = (content: string) => {
+ // Escape dollar signs followed by a digit or space and digit
+ let processedContent = content.replace(/(\$)(?=\s?\d)/g, '\\$');
+
+ // If no LaTeX patterns are found, return the processed content
+ if (!containsLatexRegex.test(processedContent)) {
+ return processedContent;
+ }
+
+ // Convert LaTeX expressions to a markdown compatible format
+ processedContent = processedContent
+ .replace(inlineLatex, (match: string, equation: string) => `$${equation}$`) // Convert inline LaTeX
+ .replace(blockLatex, (match: string, equation: string) => `$$${equation}$$`); // Convert block LaTeX
+
+ return processedContent;
+};
diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts
index a7cc732d16c..145fc124524 100644
--- a/packages/data-provider/src/config.ts
+++ b/packages/data-provider/src/config.ts
@@ -212,3 +212,25 @@ export enum ImageDetailCost {
*/
ADDITIONAL = 85,
}
+
+/**
+ * Tab values for Settings Dialog
+ */
+export enum SettingsTabValues {
+ /**
+ * Tab for General Settings
+ */
+ GENERAL = 'general',
+ /**
+ * Tab for Beta Features
+ */
+ BETA = 'beta',
+ /**
+ * Tab for Data Controls
+ */
+ DATA = 'data',
+ /**
+ * Tab for Account Settings
+ */
+ ACCOUNT = 'account',
+}
From ab3339210a0b64d6bc51feb7f14bf5c9a734e4be Mon Sep 17 00:00:00 2001
From: Danny Avila <110412045+danny-avila@users.noreply.github.com>
Date: Thu, 18 Jan 2024 19:39:27 -0500
Subject: [PATCH 5/9] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20feat(DALL-E):=20Azu?=
=?UTF-8?q?re=20OpenAI=20Support=20&=20New=20Config=20Variables=20(#1586)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat(DALL-E-3/DALL-E-2): Azure OpenAI support. New Version specific environment credentials:
- DALLEx_SYSTEM_PROMPT=
- DALLEx_AZURE_API_VERSION=
- DALLEx_BASEURL=
- DALLEx_API_KEY=
- replace `x` with `3` or `2`
* docs: update docs based on new env vars and Azure OpenAI support for DALL-E
* docs: breaking change for user provided DALLE_API_KEY:
- **DALL-E Update**: user-provided keys for DALL-E are now specific to each DALL-E version, i.e.: and
- Note: will work for both DALL-E-3 and DALL-E-2 when the admin provides the credential; in other words, this may only affect your users if DALLE_API_KEY is not set in the file. In this case, they will simply have to uninstall the plugin, and provide their API key again.
* refactor: use process.env at runtime instead of from memory to fix testing DALLE3.spec.js, adjust test
---
.env.example | 19 +++-
api/app/clients/tools/DALL-E.js | 87 ++++++++++---------
api/app/clients/tools/manifest.json | 4 +-
api/app/clients/tools/structured/DALLE3.js | 50 +++++++----
.../tools/structured/specs/DALLE3.spec.js | 11 ++-
docs/general_info/breaking_changes.md | 5 ++
docs/install/configuration/ai_setup.md | 42 +++++++++
docs/install/configuration/dotenv.md | 68 +++++++++++----
8 files changed, 206 insertions(+), 80 deletions(-)
diff --git a/.env.example b/.env.example
index 4c3900d9c1f..54301bebd2d 100644
--- a/.env.example
+++ b/.env.example
@@ -143,11 +143,22 @@ AZURE_AI_SEARCH_SEARCH_OPTION_QUERY_TYPE=
AZURE_AI_SEARCH_SEARCH_OPTION_TOP=
AZURE_AI_SEARCH_SEARCH_OPTION_SELECT=
-# DALL·E 3
+# DALL·E
#----------------
-# DALLE_API_KEY=
-# DALLE3_SYSTEM_PROMPT="Your System Prompt here"
-# DALLE_REVERSE_PROXY=
+# DALLE_API_KEY= # Key for both DALL-E-2 and DALL-E-3
+# DALLE3_API_KEY= # Key for DALL-E-3 only
+# DALLE2_API_KEY= # Key for DALL-E-2 only
+# DALLE3_SYSTEM_PROMPT="Your DALL-E-3 System Prompt here"
+# DALLE2_SYSTEM_PROMPT="Your DALL-E-2 System Prompt here"
+# DALLE_REVERSE_PROXY= # Reverse proxy for DALL-E-2 and DALL-E-3
+# DALLE3_BASEURL= # Base URL for DALL-E-3
+# DALLE2_BASEURL= # Base URL for DALL-E-2
+
+# DALL·E (via Azure OpenAI)
+# Note: requires some of the variables above to be set
+#----------------
+# DALLE3_AZURE_API_VERSION= # Azure OpenAI API version for DALL-E-3
+# DALLE2_AZURE_API_VERSION= # Azure OpenAI API versiion for DALL-E-2
# Google
#-----------------
diff --git a/api/app/clients/tools/DALL-E.js b/api/app/clients/tools/DALL-E.js
index 7f0c9520300..4eca7f7932e 100644
--- a/api/app/clients/tools/DALL-E.js
+++ b/api/app/clients/tools/DALL-E.js
@@ -1,7 +1,5 @@
-// From https://platform.openai.com/docs/api-reference/images/create
-// To use this tool, you must pass in a configured OpenAIApi object.
+const path = require('path');
const OpenAI = require('openai');
-// const { genAzureEndpoint } = require('~/utils/genAzureEndpoints');
const { v4: uuidv4 } = require('uuid');
const { Tool } = require('langchain/tools');
const { HttpsProxyAgent } = require('https-proxy-agent');
@@ -10,46 +8,39 @@ const { processFileURL } = require('~/server/services/Files/process');
const extractBaseURL = require('~/utils/extractBaseURL');
const { logger } = require('~/config');
-const { DALLE_REVERSE_PROXY, PROXY } = process.env;
+const {
+ DALLE2_SYSTEM_PROMPT,
+ DALLE_REVERSE_PROXY,
+ PROXY,
+ DALLE2_AZURE_API_VERSION,
+ DALLE2_BASEURL,
+ DALLE2_API_KEY,
+ DALLE_API_KEY,
+} = process.env;
class OpenAICreateImage extends Tool {
constructor(fields = {}) {
super();
this.userId = fields.userId;
this.fileStrategy = fields.fileStrategy;
- let apiKey = fields.DALLE_API_KEY || this.getApiKey();
+ let apiKey = fields.DALLE2_API_KEY ?? fields.DALLE_API_KEY ?? this.getApiKey();
const config = { apiKey };
if (DALLE_REVERSE_PROXY) {
config.baseURL = extractBaseURL(DALLE_REVERSE_PROXY);
}
+ if (DALLE2_AZURE_API_VERSION && DALLE2_BASEURL) {
+ config.baseURL = DALLE2_BASEURL;
+ config.defaultQuery = { 'api-version': DALLE2_AZURE_API_VERSION };
+ config.defaultHeaders = { 'api-key': DALLE2_API_KEY, 'Content-Type': 'application/json' };
+ config.apiKey = DALLE2_API_KEY;
+ }
+
if (PROXY) {
config.httpAgent = new HttpsProxyAgent(PROXY);
}
- // let azureKey = fields.AZURE_API_KEY || process.env.AZURE_API_KEY;
-
- // if (azureKey) {
- // apiKey = azureKey;
- // const azureConfig = {
- // apiKey,
- // azureOpenAIApiInstanceName: process.env.AZURE_OPENAI_API_INSTANCE_NAME || fields.azureOpenAIApiInstanceName,
- // azureOpenAIApiDeploymentName: process.env.AZURE_OPENAI_API_DEPLOYMENT_NAME || fields.azureOpenAIApiDeploymentName,
- // azureOpenAIApiVersion: process.env.AZURE_OPENAI_API_VERSION || fields.azureOpenAIApiVersion
- // };
- // config = {
- // apiKey,
- // basePath: genAzureEndpoint({
- // ...azureConfig,
- // }),
- // baseOptions: {
- // headers: { 'api-key': apiKey },
- // params: {
- // 'api-version': azureConfig.azureOpenAIApiVersion // this might change. I got the current value from the sample code at https://oai.azure.com/portal/chat
- // }
- // }
- // };
- // }
+
this.openai = new OpenAI(config);
this.name = 'dall-e';
this.description = `You can generate images with 'dall-e'. This tool is exclusively for visual content.
@@ -59,10 +50,24 @@ Guidelines:
- It's best to follow this format for image creation. Come up with the optional inputs yourself if none are given:
"Subject: [subject], Style: [style], Color: [color], Details: [details], Emotion: [emotion]"
- Generate images only once per human query unless explicitly requested by the user`;
+ this.description_for_model =
+ DALLE2_SYSTEM_PROMPT ??
+ `// Whenever a description of an image is given, generate prompts (following these rules), and use dalle to create the image. If the user does not ask for a specific number of images, default to creating 2 prompts to send to dalle that are written to be as diverse as possible. All prompts sent to dalle must abide by the following policies:
+// 1. Prompts must be in English. Translate to English if needed.
+// 2. One image per function call. Create only 1 image per request unless explicitly told to generate more than 1 image.
+// 3. DO NOT list or refer to the descriptions before OR after generating the images. They should ONLY ever be written out ONCE, in the \`"prompts"\` field of the request. You do not need to ask for permission to generate, just do it!
+// 4. Always mention the image type (photo, oil painting, watercolor painting, illustration, cartoon, drawing, vector, render, etc.) at the beginning of the caption. Unless the captions suggests otherwise, make one of the images a photo.
+// 5. Diversify depictions of ALL images with people to always include always DESCENT and GENDER for EACH person using direct terms. Adjust only human descriptions.
+// - EXPLICITLY specify these attributes, not abstractly reference them. The attributes should be specified in a minimal way and should directly describe their physical form.
+// - Your choices should be grounded in reality. For example, all of a given OCCUPATION should not be the same gender or race. Additionally, focus on creating diverse, inclusive, and exploratory scenes via the properties you choose during rewrites. Make choices that may be insightful or unique sometimes.
+// - Use "various" or "diverse" ONLY IF the description refers to groups of more than 3 people. Do not change the number of people requested in the original description.
+// - Don't alter memes, fictional character origins, or unseen people. Maintain the original prompt's intent and prioritize quality.
+// The prompt must intricately describe every part of the image in concrete, objective detail. THINK about what the end goal of the description is, and extrapolate that to what would make satisfying images.
+// All descriptions sent to dalle should be a paragraph of text that is extremely descriptive and detailed. Each should be more than 3 sentences long.`;
}
getApiKey() {
- const apiKey = process.env.DALLE_API_KEY || '';
+ const apiKey = DALLE2_API_KEY ?? DALLE_API_KEY ?? '';
if (!apiKey) {
throw new Error('Missing DALLE_API_KEY environment variable.');
}
@@ -96,17 +101,19 @@ Guidelines:
}
const imageBasename = getImageBasename(theImageUrl);
- let imageName = `image_${uuidv4()}.png`;
-
- if (imageBasename) {
- imageName = imageBasename;
- logger.debug('[DALL-E]', { imageName }); // Output: img-lgCf7ppcbhqQrz6a5ear6FOb.png
- } else {
- logger.debug('[DALL-E] No image name found in the string.', {
- theImageUrl,
- data: resp.data[0],
- });
- }
+ const imageExt = path.extname(imageBasename);
+
+ const extension = imageExt.startsWith('.') ? imageExt.slice(1) : imageExt;
+ const imageName = `img-${uuidv4()}.${extension}`;
+
+ logger.debug('[DALL-E-2]', {
+ imageName,
+ imageBasename,
+ imageExt,
+ extension,
+ theImageUrl,
+ data: resp.data[0],
+ });
try {
const result = await processFileURL({
diff --git a/api/app/clients/tools/manifest.json b/api/app/clients/tools/manifest.json
index d5f2c75d3d5..bde4c8a87a9 100644
--- a/api/app/clients/tools/manifest.json
+++ b/api/app/clients/tools/manifest.json
@@ -89,7 +89,7 @@
"icon": "https://i.imgur.com/u2TzXzH.png",
"authConfig": [
{
- "authField": "DALLE_API_KEY",
+ "authField": "DALLE2_API_KEY",
"label": "OpenAI API Key",
"description": "You can use DALL-E with your API Key from OpenAI."
}
@@ -102,7 +102,7 @@
"icon": "https://i.imgur.com/u2TzXzH.png",
"authConfig": [
{
- "authField": "DALLE_API_KEY",
+ "authField": "DALLE3_API_KEY",
"label": "OpenAI API Key",
"description": "You can use DALL-E with your API Key from OpenAI."
}
diff --git a/api/app/clients/tools/structured/DALLE3.js b/api/app/clients/tools/structured/DALLE3.js
index 16326acdeec..33df93e7fcf 100644
--- a/api/app/clients/tools/structured/DALLE3.js
+++ b/api/app/clients/tools/structured/DALLE3.js
@@ -1,6 +1,5 @@
-// From https://platform.openai.com/docs/guides/images/usage?context=node
-// To use this tool, you must pass in a configured OpenAIApi object.
const { z } = require('zod');
+const path = require('path');
const OpenAI = require('openai');
const { v4: uuidv4 } = require('uuid');
const { Tool } = require('langchain/tools');
@@ -10,19 +9,33 @@ const { processFileURL } = require('~/server/services/Files/process');
const extractBaseURL = require('~/utils/extractBaseURL');
const { logger } = require('~/config');
-const { DALLE3_SYSTEM_PROMPT, DALLE_REVERSE_PROXY, PROXY } = process.env;
+const {
+ DALLE3_SYSTEM_PROMPT,
+ DALLE_REVERSE_PROXY,
+ PROXY,
+ DALLE3_AZURE_API_VERSION,
+ DALLE3_BASEURL,
+ DALLE3_API_KEY,
+} = process.env;
class DALLE3 extends Tool {
constructor(fields = {}) {
super();
this.userId = fields.userId;
this.fileStrategy = fields.fileStrategy;
- let apiKey = fields.DALLE_API_KEY || this.getApiKey();
+ let apiKey = fields.DALLE3_API_KEY ?? fields.DALLE_API_KEY ?? this.getApiKey();
const config = { apiKey };
if (DALLE_REVERSE_PROXY) {
config.baseURL = extractBaseURL(DALLE_REVERSE_PROXY);
}
+ if (DALLE3_AZURE_API_VERSION && DALLE3_BASEURL) {
+ config.baseURL = DALLE3_BASEURL;
+ config.defaultQuery = { 'api-version': DALLE3_AZURE_API_VERSION };
+ config.defaultHeaders = { 'api-key': DALLE3_API_KEY, 'Content-Type': 'application/json' };
+ config.apiKey = DALLE3_API_KEY;
+ }
+
if (PROXY) {
config.httpAgent = new HttpsProxyAgent(PROXY);
}
@@ -46,7 +59,8 @@ class DALLE3 extends Tool {
// - Use "various" or "diverse" ONLY IF the description refers to groups of more than 3 people. Do not change the number of people requested in the original description.
// - Don't alter memes, fictional character origins, or unseen people. Maintain the original prompt's intent and prioritize quality.
// The prompt must intricately describe every part of the image in concrete, objective detail. THINK about what the end goal of the description is, and extrapolate that to what would make satisfying images.
- // All descriptions sent to dalle should be a paragraph of text that is extremely descriptive and detailed. Each should be more than 3 sentences long.`;
+ // All descriptions sent to dalle should be a paragraph of text that is extremely descriptive and detailed. Each should be more than 3 sentences long.
+ // - The "vivid" style is HIGHLY preferred, but "natural" is also supported.`;
this.schema = z.object({
prompt: z
.string()
@@ -71,7 +85,7 @@ class DALLE3 extends Tool {
}
getApiKey() {
- const apiKey = process.env.DALLE_API_KEY || '';
+ const apiKey = process.env.DALLE3_API_KEY ?? process.env.DALLE_API_KEY ?? '';
if (!apiKey) {
throw new Error('Missing DALLE_API_KEY environment variable.');
}
@@ -121,17 +135,19 @@ Error Message: ${error.message}`;
}
const imageBasename = getImageBasename(theImageUrl);
- let imageName = `image_${uuidv4()}.png`;
-
- if (imageBasename) {
- imageName = imageBasename;
- logger.debug('[DALL-E-3]', { imageName }); // Output: img-lgCf7ppcbhqQrz6a5ear6FOb.png
- } else {
- logger.debug('[DALL-E-3] No image name found in the string.', {
- theImageUrl,
- data: resp.data[0],
- });
- }
+ const imageExt = path.extname(imageBasename);
+
+ const extension = imageExt.startsWith('.') ? imageExt.slice(1) : imageExt;
+ const imageName = `img-${uuidv4()}.${extension}`;
+
+ logger.debug('[DALL-E-3]', {
+ imageName,
+ imageBasename,
+ imageExt,
+ extension,
+ theImageUrl,
+ data: resp.data[0],
+ });
try {
const result = await processFileURL({
diff --git a/api/app/clients/tools/structured/specs/DALLE3.spec.js b/api/app/clients/tools/structured/specs/DALLE3.spec.js
index 65a5fbd844d..58771b1459e 100644
--- a/api/app/clients/tools/structured/specs/DALLE3.spec.js
+++ b/api/app/clients/tools/structured/specs/DALLE3.spec.js
@@ -48,6 +48,9 @@ jest.mock('path', () => {
resolve: jest.fn(),
join: jest.fn(),
relative: jest.fn(),
+ extname: jest.fn().mockImplementation((filename) => {
+ return filename.slice(filename.lastIndexOf('.'));
+ }),
};
});
@@ -148,7 +151,7 @@ describe('DALLE3', () => {
await expect(dalle._call(mockData)).rejects.toThrow('Missing required field: prompt');
});
- it('should log to console if no image name is found in the URL', async () => {
+ it('should log appropriate debug values', async () => {
const mockData = {
prompt: 'A test prompt',
};
@@ -162,9 +165,13 @@ describe('DALLE3', () => {
generate.mockResolvedValue(mockResponse);
await dalle._call(mockData);
- expect(logger.debug).toHaveBeenCalledWith('[DALL-E-3] No image name found in the string.', {
+ expect(logger.debug).toHaveBeenCalledWith('[DALL-E-3]', {
data: { url: 'http://example.com/invalid-url' },
theImageUrl: 'http://example.com/invalid-url',
+ extension: expect.any(String),
+ imageBasename: expect.any(String),
+ imageExt: expect.any(String),
+ imageName: expect.any(String),
});
});
diff --git a/docs/general_info/breaking_changes.md b/docs/general_info/breaking_changes.md
index 9991d42f6ff..35ab805c3cc 100644
--- a/docs/general_info/breaking_changes.md
+++ b/docs/general_info/breaking_changes.md
@@ -9,6 +9,11 @@ weight: -10
**If you experience any issues after updating, we recommend clearing your browser cache and cookies.**
Certain changes in the updates may impact cookies, leading to unexpected behaviors if not cleared properly.
+## v0.6.6
+
+- **DALL-E Update**: user-provided keys for DALL-E are now specific to each DALL-E version, i.e.: `DALLE3_API_KEY` and `DALLE2_API_KEY`
+- Note: `DALLE_API_KEY` will work for both DALL-E-3 and DALL-E-2 when the admin provides the credential; in other words, this may only affect your users if DALLE_API_KEY is not set in the `.env` file. In this case, they will simply have to "uninstall" the plugin, and provide their API key again.
+
## v0.6.x
- **Meilisearch Update**: Following the recent update to Meilisearch, an unused folder named `meili_data` may be present in your root directory. This folder is no longer required and can be **safely deleted** to free up space.
diff --git a/docs/install/configuration/ai_setup.md b/docs/install/configuration/ai_setup.md
index 46ee613ed14..9a412c936fb 100644
--- a/docs/install/configuration/ai_setup.md
+++ b/docs/install/configuration/ai_setup.md
@@ -301,6 +301,48 @@ As of December 18th, 2023, Vision models seem to have degraded performance with
> Note: a change will be developed to improve current configuration settings, to allow multiple deployments/model configurations setup with ease: **[#1390](https://github.com/danny-avila/LibreChat/issues/1390)**
+### Generate images with Azure OpenAI Service (DALL-E)
+
+| Model ID | Feature Availability | Max Request (characters) |
+|----------|----------------------|-------------------------|
+| dalle2 | East US | 1000 |
+| dalle3 | Sweden Central | 4000 |
+
+- First you need to create an Azure resource that hosts DALL-E
+ - At the time of writing, dall-e-3 is available in the `SwedenCentral` region, dall-e-2 in the `EastUS` region.
+- Then, you need to deploy the image generation model in one of the above regions.
+ - Read the [Azure OpenAI Image Generation Quickstart Guide](https://learn.microsoft.com/en-us/azure/ai-services/openai/dall-e-quickstart) for further assistance
+- Configure your environment variables based on Azure credentials:
+
+**- For DALL-E-3:**
+
+```bash
+DALLE3_AZURE_API_VERSION=the-api-version # e.g.: 2023-12-01-preview
+DALLE3_BASEURL=https://.openai.azure.com/openai/deployments//
+DALLE3_API_KEY=your-azure-api-key-for-dall-e-3
+```
+
+**- For DALL-E-2:**
+
+```bash
+DALLE2_AZURE_API_VERSION=the-api-version # e.g.: 2023-12-01-preview
+DALLE2_BASEURL=https://.openai.azure.com/openai/deployments//
+DALLE2_API_KEY=your-azure-api-key-for-dall-e-2
+```
+
+**DALL-E Notes:**
+
+- For DALL-E-3, the default system prompt has the LLM prefer the ["vivid" style](https://platform.openai.com/docs/api-reference/images/create#images-create-style) parameter, which seems to be the preferred setting for ChatGPT as "natural" can sometimes produce lackluster results.
+- See official prompt for reference: **[DALL-E System Prompt](https://github.com/spdustin/ChatGPT-AutoExpert/blob/main/_system-prompts/dall-e.md)**
+- You can adjust the system prompts to your liking:
+
+```bash
+DALLE3_SYSTEM_PROMPT="Your DALL-E-3 System Prompt here"
+DALLE2_SYSTEM_PROMPT="Your DALL-E-2 System Prompt here"
+```
+
+- The `DALLE_REVERSE_PROXY` environment variable is ignored when Azure credentials (DALLEx_AZURE_API_VERSION and DALLEx_BASEURL) for DALL-E are configured.
+
### Optional Variables
*These variables are currently not used by LibreChat*
diff --git a/docs/install/configuration/dotenv.md b/docs/install/configuration/dotenv.md
index 19f91110822..09ade2a7f3c 100644
--- a/docs/install/configuration/dotenv.md
+++ b/docs/install/configuration/dotenv.md
@@ -197,6 +197,23 @@ AZURE_USE_MODEL_AS_DEPLOYMENT_NAME=TRUE
```bash
PLUGINS_USE_AZURE="true"
```
+** Generate images with Azure OpenAI Service**
+
+- For DALL-E-3:
+
+```bash
+DALLE3_AZURE_API_VERSION=the-api-version # e.g.: 2023-12-01-preview
+DALLE3_BASEURL=https://.openai.azure.com/openai/deployments//
+DALLE3_API_KEY=your-azure-api-key-for-dall-e-3
+```
+
+- For DALL-E-2:
+
+```bash
+DALLE2_AZURE_API_VERSION=the-api-version # e.g.: 2023-12-01-preview
+DALLE2_BASEURL=https://.openai.azure.com/openai/deployments//
+DALLE2_API_KEY=your-azure-api-key-for-dall-e-2
+```
### BingAI
Bing, also used for Sydney, jailbreak, and Bing Image Creator, see: [Bing Access token](./ai_setup.md#bingai) and [Bing Jailbreak](../../features/bing_jailbreak.md)
@@ -378,35 +395,56 @@ AZURE_AI_SEARCH_SEARCH_OPTION_TOP=
AZURE_AI_SEARCH_SEARCH_OPTION_SELECT=
```
-#### DALL-E 3:
-- OpenAI API key for DALL-E / DALL-E-3. Leave commented out to have the user provide their own key when installing the plugin. If you want to provide your own key for all users you can uncomment this line and add your OpenAI API key here.
+#### DALL-E:
+
+**API Keys:**
+- `DALLE_API_KEY`: This environment variable is intended for storing the OpenAI API key that grants access to both DALL-E 2 and DALL-E 3 services. Typically, this key should be kept private. If you are distributing a plugin or software that integrates with DALL-E, you may choose to leave this commented out, requiring the end user to input their own API key. If you have a shared API key you want to distribute with your software (not recommended for security reasons), you can uncomment this and provide the key.
```bash
# DALLE_API_KEY=
```
-- For customization of the DALL-E-3 System prompt, uncomment the following, and provide your own prompt. **(Advanced)**
- - See official prompt for reference: **[DALL-E System Prompt](https://github.com/spdustin/ChatGPT-AutoExpert/blob/main/_system-prompts/dall-e.md)**
+- `DALLE3_API_KEY` and `DALLE2_API_KEY`: These are similar to the above but are specific to each version of DALL-E. They allow for separate keys for DALL-E 2 and DALL-E 3, providing flexibility if you have different access credentials or subscription levels for each service.
+
+```bash
+# DALLE3_API_KEY=
+# DALLE2_API_KEY=
+```
+
+**System Prompts:**
+- `DALLE3_SYSTEM_PROMPT` and `DALLE2_SYSTEM_PROMPT`: These variables allow users to set system prompts that can preconfigure or guide the image generation process for DALL-E 3 and DALL-E 2, respectively. Use these to set default prompts or special instructions that affect how the AI interprets the user's input prompts.
```bash
-DALLE3_SYSTEM_PROMPT="Your System Prompt here"
+# DALLE3_SYSTEM_PROMPT="Your DALL-E-3 System Prompt here"
+# DALLE2_SYSTEM_PROMPT="Your DALL-E-2 System Prompt here"
```
-- DALL-E Proxy settings. This is separate from its OpenAI counterpart for customization purposes **(Advanced)**
+**Reverse Proxy Settings:**
+- `DALLE_REVERSE_PROXY`: This setting enables the specification of a reverse proxy for DALL-E API requests. This can be useful for routing traffic through a specific server, potentially for purposes like caching, logging, or adding additional layers of security. Ensure that the URL follows the required pattern and is appropriately configured to handle DALL-E requests.
+
+```bash
+# DALLE_REVERSE_PROXY=
+```
-> Reverse proxy settings, changes the baseURL for the DALL-E-3 API Calls
-> The URL must match the "url/v1," pattern, the "openai" suffix is also allowed.
-> ```
-> Examples:
-> - https://open.ai/v1
-> - https://open.ai/v1/ACCOUNT/GATEWAY/openai
-> - https://open.ai/v1/hi/openai
-> ```
+**Base URLs:**
+- `DALLE3_BASEURL` and `DALLE2_BASEURL`: These variables define the base URLs for DALL-E 3 and DALL-E 2 API endpoints, respectively. These might need to be set if you are using a custom proxy or a specific regional endpoint provided by OpenAI.
```bash
-DALLE_REVERSE_PROXY=
+# DALLE3_BASEURL=
+# DALLE2_BASEURL=
```
+**Azure OpenAI Integration (Optional):**
+- `DALLE3_AZURE_API_VERSION` and `DALLE2_AZURE_API_VERSION`: If you are using Azure's OpenAI service to access DALL-E, these environment variables specify the API version for DALL-E 3 and DALL-E 2, respectively. Azure may have specific API version strings that need to be set to ensure compatibility with their services.
+
+```bash
+# DALLE3_AZURE_API_VERSION=
+# DALLE2_AZURE_API_VERSION=
+```
+
+---
+
+Remember to replace placeholder text such as "Your DALL-E-3 System Prompt here" with actual prompts or instructions and provide your actual API keys if you choose to include them directly in the file (though managing sensitive keys outside of the codebase is a best practice). Always review and respect OpenAI's usage policies when embedding API keys in software.
> Note: if you have PROXY set, it will be used for DALL-E calls also, which is universal for the app
#### Google Search
From cda9761bf0456bf6ce1b9c251ea4fddaa0d2925b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ra=C3=AD=20Santos?=
<140329135+itzraiss@users.noreply.github.com>
Date: Thu, 18 Jan 2024 22:03:35 -0300
Subject: [PATCH 6/9] Added: New setting Account for show username in messages
chore (StopButon and SendButon): Updated to new style of ChatGPT chore Update
and Added news translations: Spanish, English and Portuguese Brazilian
---
.../src/components/Chat/Input/SendButton.tsx | 3 +-
.../src/components/Chat/Input/StopButton.tsx | 2 +-
.../src/components/Chat/Messages/Message.tsx | 25 +-
.../Nav/SettingsTabs/Account/Account.tsx | 22 ++
client/src/localization/languages/Br.tsx | 1 +
client/src/localization/languages/Eng.tsx | 1 +
client/src/localization/languages/Es.tsx | 227 ++++++++++--------
client/src/store/settings.ts | 20 ++
8 files changed, 199 insertions(+), 102 deletions(-)
diff --git a/client/src/components/Chat/Input/SendButton.tsx b/client/src/components/Chat/Input/SendButton.tsx
index 0751dd51eb0..288e5b70784 100644
--- a/client/src/components/Chat/Input/SendButton.tsx
+++ b/client/src/components/Chat/Input/SendButton.tsx
@@ -6,8 +6,7 @@ export default function SendButton({ text, disabled }) {
diff --git a/client/src/localization/languages/Br.tsx b/client/src/localization/languages/Br.tsx
index 1761a7cbc59..552a272766b 100644
--- a/client/src/localization/languages/Br.tsx
+++ b/client/src/localization/languages/Br.tsx
@@ -293,6 +293,7 @@ export default {
com_nav_theme_system: 'Sistema',
com_nav_theme_dark: 'Escuro',
com_nav_theme_light: 'Claro',
+ com_nav_user_name_display: 'Mostrar nome de usuário nas mensagens',
com_nav_clear_all_chats: 'Limpar todos os chats',
com_nav_confirm_clear: 'Confirmar Limpeza',
com_nav_close_sidebar: 'Fechar barra lateral',
diff --git a/client/src/localization/languages/Eng.tsx b/client/src/localization/languages/Eng.tsx
index aa07add58b7..03d8537d7d7 100644
--- a/client/src/localization/languages/Eng.tsx
+++ b/client/src/localization/languages/Eng.tsx
@@ -290,6 +290,7 @@ export default {
com_nav_theme_system: 'System',
com_nav_theme_dark: 'Dark',
com_nav_theme_light: 'Light',
+ com_nav_user_name_display: 'Display username in messages',
com_nav_clear_all_chats: 'Clear all chats',
com_nav_confirm_clear: 'Confirm Clear',
com_nav_close_sidebar: 'Close sidebar',
diff --git a/client/src/localization/languages/Es.tsx b/client/src/localization/languages/Es.tsx
index e64869a3ada..e8fd9e3de95 100644
--- a/client/src/localization/languages/Es.tsx
+++ b/client/src/localization/languages/Es.tsx
@@ -20,7 +20,7 @@ export default {
com_ui_input: 'Entrada',
com_ui_close: 'Cerrar',
com_ui_model: 'Modelo',
- com_ui_select_model: 'Seleccione un modelo',
+ com_ui_select_model: 'Selecciona un modelo',
com_ui_use_prompt: 'Usar el prompt',
com_ui_prev: 'Anterior',
com_ui_next: 'Siguiente',
@@ -30,18 +30,17 @@ export default {
com_ui_showing: 'Mostrando',
com_ui_of: 'de',
com_ui_entries: 'Entradas',
- com_ui_pay_per_call: 'Todas las conversaciones de IA en un solo lugar. Pague por llamada y no por mes',
+ com_ui_pay_per_call: 'Todas las conversaciones de IA en un solo lugar. Paga por llamada y no por mes',
com_ui_new_footer: 'Todas las conversaciones de IA en un solo lugar.',
com_ui_enter: 'Entrar',
com_ui_submit: 'Enviar',
- com_ui_upload_success: 'Archivo cargado con éxito',
- com_ui_upload_error: 'Hubo un error al cargar su archivo',
+ com_ui_upload_success: 'Archivo cargado exitosamente',
+ com_ui_upload_error: 'Hubo un error al cargar tu archivo',
com_ui_upload_invalid: 'Archivo no válido para cargar. Debe ser una imagen que no exceda los 2 MB',
com_ui_cancel: 'Cancelar',
com_ui_save: 'Guardar',
com_ui_save_submit: 'Guardar y Enviar',
com_user_message: 'Tú',
- com_user_message: 'Usted',
com_ui_copy_to_clipboard: 'Copiar al portapapeles',
com_ui_copied_to_clipboard: 'Copiado al portapapeles',
com_ui_regenerate: 'Regenerar',
@@ -61,73 +60,73 @@ export default {
com_ui_upload: 'Cargar',
com_ui_connect: 'Conectar',
com_auth_error_login:
- 'No se pudo iniciar sesión con la información proporcionada. Por favor, verifique sus credenciales e inténtelo de nuevo.',
+ 'No se pudo iniciar sesión con la información proporcionada. Verifica tus credenciales e inténtalo de nuevo.',
com_auth_error_login_rl:
- 'Demasiados intentos de inicio de sesión en un corto período de tiempo. Por favor, inténtelo nuevamente más tarde.',
+ 'Demasiados intentos de inicio de sesión en un corto período de tiempo. Por favor, inténtalo nuevamente más tarde.',
com_auth_error_login_ban:
- 'Su cuenta ha sido temporalmente suspendida debido a violaciones de nuestro servicio.',
+ 'Tu cuenta ha sido temporalmente suspendida debido a violaciones de nuestro servicio.',
com_auth_error_login_server:
- 'Hubo un error interno del servidor. Por favor, espere unos momentos e inténtelo nuevamente.',
- com_auth_no_account: '¿No tiene una cuenta?',
+ 'Hubo un error interno del servidor. Por favor, espera unos momentos e inténtalo de nuevo.',
+ com_auth_no_account: '¿No tienes una cuenta?',
com_auth_sign_up: 'Registrarse',
com_auth_sign_in: 'Iniciar sesión',
- com_auth_google_login: 'Inicio de sesión con Google',
- com_auth_facebook_login: 'Inicio de sesión con Facebook',
- com_auth_github_login: 'Inicio de sesión con Github',
- com_auth_discord_login: 'Inicio de sesión con Discord',
+ com_auth_google_login: 'Iniciar sesión con Google',
+ com_auth_facebook_login: 'Iniciar sesión con Facebook',
+ com_auth_github_login: 'Iniciar sesión con Github',
+ com_auth_discord_login: 'Iniciar sesión con Discord',
com_auth_email: 'Correo electrónico',
com_auth_email_required: 'El correo electrónico es obligatorio',
com_auth_email_min_length: 'El correo electrónico debe tener al menos 6 caracteres',
com_auth_email_max_length: 'El correo electrónico no debe tener más de 120 caracteres',
- com_auth_email_pattern: 'Debe ingresar una dirección de correo electrónico válida',
+ com_auth_email_pattern: 'Debes ingresar una dirección de correo electrónico válida',
com_auth_email_address: 'Dirección de correo electrónico',
com_auth_password: 'Contraseña',
com_auth_password_required: 'La contraseña es obligatoria',
com_auth_password_min_length: 'La contraseña debe tener al menos 8 caracteres',
com_auth_password_max_length: 'La contraseña debe tener menos de 128 caracteres',
- com_auth_password_forgot: '¿Olvidó la contraseña?',
+ com_auth_password_forgot: '¿Olvidaste la contraseña?',
com_auth_password_confirm: 'Confirmar contraseña',
com_auth_password_not_match: 'Las contraseñas no coinciden',
com_auth_continue: 'Continuar',
- com_auth_create_account: 'Crear su cuenta',
- com_auth_error_create: 'Hubo un error al intentar registrar su cuenta. Por favor, inténtelo nuevamente.',
+ com_auth_create_account: 'Crear tu cuenta',
+ com_auth_error_create: 'Hubo un error al intentar registrar tu cuenta. Por favor, inténtalo nuevamente.',
com_auth_full_name: 'Nombre completo',
com_auth_name_required: 'El nombre es obligatorio',
com_auth_name_min_length: 'El nombre debe tener al menos 3 caracteres',
- com_auth_name_max_length: 'El nombre no debe tener más de 80 caracteres',
+ com_auth_name_max_length: 'El nombre debe tener menos de 80 caracteres',
com_auth_username: 'Nombre de usuario (opcional)',
com_auth_username_required: 'El nombre de usuario es obligatorio',
com_auth_username_min_length: 'El nombre de usuario debe tener al menos 2 caracteres',
com_auth_username_max_length: 'El nombre de usuario debe tener menos de 20 caracteres',
- com_auth_already_have_account: '¿Ya tiene una cuenta?',
+ com_auth_already_have_account: '¿Ya tienes una cuenta?',
com_auth_login: 'Iniciar sesión',
- com_auth_reset_password: 'Restablecer su contraseña',
- com_auth_click: 'Haga clic',
+ com_auth_reset_password: 'Restablecer tu contraseña',
+ com_auth_click: 'Haz clic',
com_auth_here: 'AQUÍ',
- com_auth_to_reset_your_password: 'para restablecer su contraseña.',
+ com_auth_to_reset_your_password: 'para restablecer tu contraseña.',
com_auth_reset_password_link_sent: 'Correo electrónico enviado',
com_auth_reset_password_email_sent:
- 'Se ha enviado un correo electrónico con más instrucciones para restablecer su contraseña.',
+ 'Se ha enviado un correo electrónico con más instrucciones para restablecer tu contraseña.',
com_auth_error_reset_password:
- 'Hubo un problema al restablecer su contraseña. No se encontró ningún usuario con la dirección de correo electrónico proporcionada. Por favor, inténtelo nuevamente.',
+ 'Hubo un problema al restablecer tu contraseña. No se encontró ningún usuario con la dirección de correo electrónico proporcionada. Por favor, inténtalo de nuevo.',
com_auth_reset_password_success: 'Restablecimiento de contraseña exitoso',
- com_auth_login_with_new_password: 'Ahora puede iniciar sesión con su nueva contraseña.',
+ com_auth_login_with_new_password: 'Ahora puedes iniciar sesión con tu nueva contraseña.',
com_auth_error_invalid_reset_token: 'Este token de restablecimiento de contraseña ya no es válido.',
- com_auth_click_here: 'Haga clic aquí',
+ com_auth_click_here: 'Haz clic aquí',
com_auth_to_try_again: 'para intentarlo de nuevo.',
com_auth_submit_registration: 'Enviar registro',
com_auth_welcome_back: 'Bienvenido de nuevo',
- com_endpoint_open_menu: 'Abrir Menú',
+ com_endpoint_open_menu: 'Abrir menú',
com_endpoint_bing_enable_sydney: 'Habilitar Sydney',
com_endpoint_bing_to_enable_sydney: 'Para habilitar Sydney',
com_endpoint_bing_jailbreak: 'Jailbreak',
com_endpoint_bing_context_placeholder:
- 'Bing puede usar hasta 7k tokens para "contexto", que puede referenciar en la conversación. El límite específico no se conoce, pero puede haber errores al exceder los 7k tokens.',
+ 'Bing puede usar hasta 7k tokens para "contexto", que puede referenciar en la conversación. El límite específico no se conoce, pero puede haber errores al superar los 7k tokens',
com_endpoint_bing_system_message_placeholder:
- 'ADVERTENCIA: El uso indebido de esta función puede provocar que sea EXPULSADO de usar Bing. Haga clic en \'System Message\' para obtener instrucciones completas y el mensaje predeterminado si se omite, que es el preajuste \'Sydney\' que se considera seguro.',
+ 'ADVERTENCIA: El uso indebido de esta función puede resultar en una PROHIBICIÓN del uso de Bing. Haga clic en \'System Message\' para obtener instrucciones completas y el mensaje predeterminado si se omite, que es el ajuste preestablecido \'Sydney\', considerado seguro.',
com_endpoint_system_message: 'Mensaje del Sistema',
com_endpoint_message: 'Conversar con',
- com_endpoint_message_not_appendable: 'Edite su mensaje o Regenere.',
+ com_endpoint_message_not_appendable: 'Edita tu mensaje o Regenera.',
com_endpoint_default_blank: 'predeterminado: en blanco',
com_endpoint_default_false: 'predeterminado: falso',
com_endpoint_default_creative: 'predeterminado: creativo',
@@ -135,7 +134,7 @@ export default {
com_endpoint_default_with_num: 'predeterminado: {0}',
com_endpoint_context: 'Contexto',
com_endpoint_tone_style: 'Estilo de Tono',
- com_endpoint_token_count: 'Recuento de Tokens',
+ com_endpoint_token_count: 'Conteo de Tokens',
com_endpoint_output: 'Salida',
com_endpoint_google_temp:
'Valores más altos = más aleatorio, mientras que valores más bajos = más enfocado y determinista. Recomendamos cambiar esto o Top P, pero no ambos.',
@@ -144,10 +143,10 @@ export default {
com_endpoint_google_topk:
'Top-k cambia cómo el modelo selecciona tokens para la salida. Un top-k de 1 significa que el token seleccionado es el más probable entre todos los tokens en el vocabulario del modelo (también llamado decodificación codiciosa), mientras que un top-k de 3 significa que el próximo token se selecciona entre los 3 tokens más probables (usando temperatura).',
com_endpoint_google_maxoutputtokens:
- 'Número máximo de tokens que pueden generarse en la respuesta. Especifique un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
- com_endpoint_google_custom_name_placeholder: 'Defina un nombre personalizado para Google',
+ 'Número máximo de tokens que se pueden generar en la respuesta. Especifica un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
+ com_endpoint_google_custom_name_placeholder: 'Establece un nombre personalizado para Google',
com_endpoint_prompt_prefix_placeholder:
- 'Defina instrucciones personalizadas o contexto. Se ignora si está vacío.',
+ 'Establece instrucciones personalizadas o contexto. Ignorado si está vacío.',
com_endpoint_custom_name: 'Nombre Personalizado',
com_endpoint_prompt_prefix: 'Prefijo del Prompt',
com_endpoint_temperature: 'Temperatura',
@@ -160,101 +159,131 @@ export default {
com_endpoint_openai_max:
'Tokens máximos para generar. La longitud total de los tokens de entrada y los tokens generados está limitada por la longitud del contexto del modelo.',
com_endpoint_openai_topp:
- 'Una alternativa para el muestreo con temperatura, llamada muestreo de núcleo, donde el modelo considera los resultados de los tokens con masa de probabilidad top_p. Entonces, 0.1 significa que solo se consideran los tokens que comprenden la masa de probabilidad de los 10% principales. Recomendamos cambiar esto o la temperatura, pero no ambos.',
+ 'Una alternativa para el muestreo con temperatura, llamada muestreo de núcleo, donde el modelo considera los resultados de los tokens con masa de probabilidad top_p. Entonces, 0.1 significa que solo se consideran los tokens que comprenden la masa de probabilidad del 10% superior. Recomendamos cambiar esto o la temperatura, pero no ambos.',
com_endpoint_openai_freq:
- 'Número entre -2.0 y 2.0. Los valores positivos penalizan los nuevos tokens según su frecuencia existente en el texto hasta ahora, disminuyendo la probabilidad de que el modelo repita la misma línea literalmente.',
+ 'Número entre -2.0 y 2.0. Los valores positivos penalizan nuevos tokens en función de su frecuencia existente en el texto hasta ahora, disminuyendo la probabilidad de que el modelo repita la misma línea literalmente.',
com_endpoint_openai_pres:
- 'Número entre -2.0 y 2.0. Los valores positivos penalizan los nuevos tokens según si aparecen en el texto hasta ahora, aumentando la probabilidad de que el modelo hable sobre nuevos temas.',
- com_endpoint_openai_custom_name_placeholder: 'Defina un nombre personalizado para ChatGPT',
+ 'Número entre -2.0 y 2.0. Los valores positivos penalizan nuevos tokens en función de si aparecen en el texto hasta ahora, aumentando la probabilidad de que el modelo hable sobre nuevos temas.',
+ com_endpoint_openai_custom_name_placeholder: 'Establece un nombre personalizado para ChatGPT',
com_endpoint_openai_prompt_prefix_placeholder:
- 'Defina instrucciones personalizadas para incluir en el Mensaje del Sistema. Predeterminado: ninguno',
+ 'Establece instrucciones personalizadas para incluir en el Mensaje del Sistema. Predeterminado: ninguno',
com_endpoint_anthropic_temp:
- 'Varía de 0 a 1. Use temp más cercano a 0 para analítico / opción múltiple, y más cercano a 1 para tareas creativas y generativas. Recomendamos cambiar esto o Top P, pero no ambos.',
+ 'Varía de 0 a 1. Usa temp más cercano a 0 para analítico / opción múltiple, y más cercano a 1 para tareas creativas y generativas. Recomendamos cambiar esto o Top P, pero no ambos.',
com_endpoint_anthropic_topp:
'Top-p cambia cómo el modelo selecciona tokens para la salida. Los tokens se seleccionan desde el más K (ver el parámetro topK) probable hasta el menos, hasta que la suma de sus probabilidades sea igual al valor de top-p.',
com_endpoint_anthropic_topk:
'Top-k cambia cómo el modelo selecciona tokens para la salida. Un top-k de 1 significa que el token seleccionado es el más probable entre todos los tokens en el vocabulario del modelo (también llamado decodificación codiciosa), mientras que un top-k de 3 significa que el próximo token se selecciona entre los 3 tokens más probables (usando temperatura).',
com_endpoint_anthropic_maxoutputtokens:
- 'Número máximo de tokens que pueden generarse en la respuesta. Especifique un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
- com_endpoint_anthropic_custom_name_placeholder: 'Defina un nombre personalizado para Anthropic',
+ 'Número máximo de tokens que se pueden generar en la respuesta. Especifica un valor menor para respuestas más cortas y un valor mayor para respuestas más largas.',
+ com_endpoint_anthropic_custom_name_placeholder: 'Establece un nombre personalizado para Anthropic',
com_endpoint_frequency_penalty: 'Penalización de Frecuencia',
- com_endpoint_presence_penalty: 'Penalización de presencia',
- com_endpoint_plug_use_functions: 'Usar funciones',
- com_endpoint_plug_skip_completion: 'Saltar completación',
- com_endpoint_disabled_with_tools: 'Desactivado con herramientas',
- com_endpoint_disabled_with_tools_placeholder: 'Desactivado con herramientas seleccionadas',
+ com_endpoint_plug_use_functions: 'Usar Funciones',
+ com_endpoint_plug_skip_completion: 'Omitir Completado',
+ com_endpoint_disabled_with_tools: 'desactivado con herramientas',
+ com_endpoint_disabled_with_tools_placeholder: 'Desactivado con Herramientas Seleccionadas',
com_endpoint_plug_set_custom_instructions_for_gpt_placeholder:
- 'Establecer instrucciones personalizadas para incluir en el mensaje del sistema. Predeterminado: ninguno',
+ 'Establecer instrucciones personalizadas para incluir en el Mensaje del Sistema. Predeterminado: ninguno',
com_endpoint_import: 'Importar',
com_endpoint_set_custom_name:
- 'Establecer un nombre personalizado, en caso de que puedas encontrar este preajuste',
- com_endpoint_preset: 'Preajuste',
- com_endpoint_presets: 'Preajustes',
- com_endpoint_preset_name: 'Nombre del preajuste',
- com_endpoint_new_topic: 'Nuevo tema',
- com_endpoint: 'Punto final',
+ 'Establecer un nombre personalizado, en caso de que quieras encontrar este preset',
+ com_endpoint_preset_delete_confirm: '¿Estás seguro de que quieres eliminar este preset?',
+ com_endpoint_preset_clear_all_confirm:
+ '¿Estás seguro de que quieres eliminar todos tus presets?',
+ com_endpoint_preset_import: 'Preset Importado!',
+ com_endpoint_preset_import_error:
+ 'Hubo un error al importar tu preset. Por favor, inténtalo de nuevo.',
+ com_endpoint_preset_save_error: 'Hubo un error al guardar tu preset. Por favor, inténtalo de nuevo.',
+ com_endpoint_preset_delete_error:
+ 'Hubo un error al eliminar tu preset. Por favor, inténtalo de nuevo.',
+ com_endpoint_preset_default_removed: 'ya no es el preset predeterminado.',
+ com_endpoint_preset_default_item: 'Predeterminado:',
+ com_endpoint_preset_default_none: 'Ningún preset predeterminado activo.',
+ com_endpoint_preset_title: 'Preset',
+ com_endpoint_preset_saved: 'Guardado!',
+ com_endpoint_preset_default: 'es ahora el preset predeterminado.',
+ com_endpoint_preset: 'preset',
+ com_endpoint_presets: 'presets',
+ com_endpoint_preset_selected: 'Preset Activo!',
+ com_endpoint_preset_selected_title: 'Activo!',
+ com_endpoint_preset_name: 'Nombre del Preset',
+ com_endpoint_new_topic: 'Nuevo Tema',
+ com_endpoint: 'Endpoint',
com_endpoint_hide: 'Ocultar',
com_endpoint_show: 'Mostrar',
- com_endpoint_examples: 'Ejemplos',
- com_endpoint_completion: 'Completación',
+ com_endpoint_examples: ' Presets',
+ com_endpoint_completion: 'Completado',
com_endpoint_agent: 'Agente',
- com_endpoint_show_what_settings: 'Mostrar {0} ajustes',
+ com_endpoint_show_what_settings: 'Mostrar Configuraciones de {0}',
com_endpoint_save: 'Guardar',
com_endpoint_export: 'Exportar',
- com_endpoint_save_as_preset: 'Guardar como preajuste',
+ com_endpoint_save_as_preset: 'Guardar como Preset',
com_endpoint_presets_clear_warning:
- '¿Estás seguro de que quieres borrar todos los preajustes? Esto es irreversible.',
+ '¿Estás seguro de que quieres borrar todos los presets? Esto es irreversible.',
com_endpoint_not_implemented: 'No implementado',
- com_endpoint_no_presets: 'Aún no hay preajustes, usa el botón de ajustes para crear uno',
- com_endpoint_not_available: 'No hay punto final disponible',
- com_endpoint_view_options: 'Ver opciones',
- com_endpoint_save_convo_as_preset: 'Guardar conversación como preajuste',
- com_endpoint_my_preset: 'Mi preajuste',
- com_endpoint_agent_model: 'Modelo de agente (Recomendado: GPT-3.5)',
- com_endpoint_completion_model: 'Modelo de completación (Recomendado: GPT-4)',
- com_endpoint_func_hover: 'Habilitar el uso de plugins como funciones de OpenAI',
+ com_endpoint_no_presets: 'Aún no hay presets, utiliza el botón de configuración para crear uno',
+ com_endpoint_not_available: 'Ningún endpoint disponible',
+ com_endpoint_view_options: 'Ver Opciones',
+ com_endpoint_save_convo_as_preset: 'Guardar Conversación como Preset',
+ com_endpoint_my_preset: 'Mi Preset',
+ com_endpoint_agent_model: 'Modelo del Agente (Recomendado: GPT-3.5)',
+ com_endpoint_completion_model: 'Modelo de Completado (Recomendado: GPT-4)',
+ com_endpoint_func_hover: 'Habilitar uso de Plugins como Funciones OpenAI',
com_endpoint_skip_hover:
- 'Habilitar el salto del paso de completación, que revisa la respuesta final y los pasos generados',
- com_endpoint_config_key: 'Establecer clave de API',
- com_endpoint_config_key_for: 'Establecer clave de API para',
+ 'Habilitar la etapa de salto de completado, que revisa la respuesta final y las etapas generadas',
+ com_endpoint_config_key: 'Establecer Clave API',
+ com_endpoint_config_placeholder: 'Establece tu Clave en el menú Cabecera para conversar.',
+ com_endpoint_config_key_for: 'Establecer Clave API para',
com_endpoint_config_key_name: 'Clave',
- com_endpoint_config_value: 'Introducir valor para',
- com_endpoint_config_key_name_placeholder: 'Establecer clave de API primero',
- com_endpoint_config_key_encryption: 'Tu clave será encriptada y borrada a las',
- com_endpoint_config_key_expiry: 'la hora de caducidad',
- com_endpoint_config_key_import_json_key: 'Importar clave JSON de cuenta de servicio.',
+ com_endpoint_config_value: 'Insertar valor para',
+ com_endpoint_config_key_name_placeholder: 'Establece la clave API primero',
+ com_endpoint_config_key_encryption: 'Tu clave será encriptada y eliminada en',
+ com_endpoint_config_key_expiry: 'el tiempo de expiración',
+ com_endpoint_config_click_here: 'Haz clic Aquí',
+ com_endpoint_config_google_service_key: 'Clave de la Cuenta de Servicio de Google',
+ com_endpoint_config_google_cloud_platform: '(de Google Cloud Platform)',
+ com_endpoint_config_google_api_key: 'Clave API de Google',
+ com_endpoint_config_google_gemini_api: '(API Gemini)',
+ com_endpoint_config_google_api_info:
+ 'Para obtener tu clave API de Lenguaje Generativo (para Gemini),',
+ com_endpoint_config_key_import_json_key: 'Importar Clave JSON de la Cuenta de Servicio.',
com_endpoint_config_key_import_json_key_success:
- 'Clave JSON de cuenta de servicio importada con éxito',
+ 'Clave JSON de la Cuenta de Servicio importada con éxito',
com_endpoint_config_key_import_json_key_invalid:
- 'Clave JSON de cuenta de servicio inválida, ¿importaste el archivo correcto?',
- com_endpoint_config_key_get_edge_key:
- 'Para obtener tu token de acceso para Bing, inicia sesión en',
+ 'Clave JSON de la Cuenta de Servicio inválida, ¿importaste el archivo correcto?',
+ com_endpoint_config_key_get_edge_key: 'Para obtener tu token de acceso para Bing, inicia sesión en',
com_endpoint_config_key_get_edge_key_dev_tool:
- 'Usa las herramientas de desarrollo o una extensión mientras estás conectado al sitio para copiar el contenido de la cookie _U. Si esto falla, sigue estas',
+ 'Utiliza las herramientas de desarrollo o una extensión mientras estás conectado al sitio para copiar el contenido de la cookie _U. Si esto falla, sigue estas',
com_endpoint_config_key_edge_instructions: 'instrucciones',
- com_endpoint_config_key_edge_full_key_string:
- 'para proporcionar las cadenas de cookies completas.',
+ com_endpoint_config_key_edge_full_key_string: 'para proporcionar las cadenas completas de la cookie.',
com_endpoint_config_key_chatgpt:
- 'Para obtener tu token de acceso para ChatGPT "Versión gratuita", inicia sesión en',
+ 'Para obtener tu token de acceso para ChatGPT \'Versión Gratuita\', inicia sesión en',
com_endpoint_config_key_chatgpt_then_visit: 'luego visita',
com_endpoint_config_key_chatgpt_copy_token: 'Copia el token de acceso.',
com_endpoint_config_key_google_need_to: 'Necesitas',
com_endpoint_config_key_google_vertex_ai: 'Habilitar Vertex AI',
com_endpoint_config_key_google_vertex_api: 'API en Google Cloud, luego',
- com_endpoint_config_key_google_service_account: 'Crear una cuenta de servicio',
+ com_endpoint_config_key_google_service_account: 'Crea una Cuenta de Servicio',
com_endpoint_config_key_google_vertex_api_role:
- 'Asegúrate de hacer clic en "Crear y continuar" para dar al menos el rol de "Usuario de Vertex AI". Por último, crea una clave JSON para importarla aquí.',
- com_nav_auto_scroll: 'Desplazamiento automático al más reciente al abrir',
+ 'Asegúrate de hacer clic en \'Crear y Continuar\' para dar al menos el rol \'Usuario de Vertex AI\'. Finalmente, crea una clave JSON para importar aquí.',
+ com_nav_welcome_message: '¿Cómo puedo ayudarte hoy?',
+ com_nav_auto_scroll: 'Desplazamiento Automático al Más Nuevo al Abrir',
+ com_nav_modular_chat: 'Activar el cambio de Endpoints en medio de la conversación',
+ com_nav_profile_picture: 'Foto de Perfil',
+ com_nav_change_picture: 'Cambiar foto',
com_nav_plugin_store: 'Tienda de plugins',
+ com_show_agent_settings: 'Mostrar Configuraciones del Agente',
+ com_show_completion_settings: 'Mostrar Configuraciones de Completado',
+ com_hide_examples: 'Ocultar Ejemplos',
+ com_show_examples: 'Mostrar Ejemplos',
com_nav_plugin_search: 'Buscar plugins',
com_nav_plugin_auth_error:
'Hubo un error al intentar autenticar este plugin. Por favor, inténtalo de nuevo.',
- com_nav_export_filename: 'Nombre de archivo',
- com_nav_export_filename_placeholder: 'Establece el nombre de archivo',
+ com_nav_export_filename: 'Nombre del archivo',
+ com_nav_export_filename_placeholder: 'Establecer el nombre del archivo',
com_nav_export_type: 'Tipo',
- com_nav_export_include_endpoint_options: 'Incluir opciones de punto final',
+ com_nav_export_include_endpoint_options: 'Incluir opciones de endpoint',
com_nav_enabled: 'Habilitado',
- com_nav_not_supported: 'No compatible',
+ com_nav_not_supported: 'No soportado',
com_nav_export_all_message_branches: 'Exportar todas las ramas de mensajes',
com_nav_export_recursive_or_sequential: '¿Recursivo o secuencial?',
com_nav_export_recursive: 'Recursivo',
@@ -263,20 +292,24 @@ export default {
com_nav_theme_system: 'Sistema',
com_nav_theme_dark: 'Oscuro',
com_nav_theme_light: 'Claro',
- com_nav_clear_all_chats: 'Borrar todos los chats',
- com_nav_confirm_clear: 'Confirmar borrado',
+ com_nav_user_name_display: 'Mostrar nombre de usuario en los mensajes',
+ com_nav_clear_all_chats: 'Limpiar todos los chats',
+ com_nav_confirm_clear: 'Confirmar Limpieza',
com_nav_close_sidebar: 'Cerrar barra lateral',
com_nav_open_sidebar: 'Abrir barra lateral',
com_nav_send_message: 'Enviar mensaje',
com_nav_log_out: 'Cerrar sesión',
com_nav_user: 'USUARIO',
- com_nav_clear_conversation: 'Borrar conversaciones',
+ com_nav_clear_conversation: 'Limpiar conversaciones',
com_nav_clear_conversation_confirm_message:
- '¿Estás seguro de que quieres borrar todas las conversaciones? Esto es irreversible.',
- com_nav_help_faq: 'Ayuda y preguntas frecuentes',
- com_nav_settings: 'Ajustes',
+ '¿Estás seguro de que quieres limpiar todas las conversaciones? Esto es irreversible.',
+ com_nav_help_faq: 'Ayuda y Preguntas Frecuentes',
+ com_nav_settings: 'Configuraciones',
com_nav_search_placeholder: 'Buscar mensajes',
com_nav_setting_general: 'General',
com_nav_setting_data: 'Controles de datos',
+ com_nav_setting_account: 'Cuenta',
+ com_nav_language: 'Idioma',
+ com_nav_lang_auto: 'Detección automática',
com_nav_lang_spanish: 'Español',
};
diff --git a/client/src/store/settings.ts b/client/src/store/settings.ts
index d580e4bf3b6..2a1e9b0ee26 100644
--- a/client/src/store/settings.ts
+++ b/client/src/store/settings.ts
@@ -69,6 +69,25 @@ const modularChat = atom({
] as const,
});
+const UsernameDisplay = atom({
+ key: 'UsernameDisplay',
+ default: localStorage.getItem('UsernameDisplay') === 'true',
+ effects: [
+ ({ setSelf, onSet }) => {
+ const savedValue = localStorage.getItem('UsernameDisplay');
+ if (savedValue != null) {
+ setSelf(savedValue === 'true');
+ }
+
+ onSet((newValue: unknown) => {
+ if (typeof newValue === 'boolean') {
+ localStorage.setItem('autoScroll', newValue.toString());
+ }
+ });
+ },
+ ] as const,
+});
+
export default {
abortScroll,
optionSettings,
@@ -78,4 +97,5 @@ export default {
showPopover,
autoScroll,
modularChat,
+ UsernameDisplay,
};
From 7e2e19a1349b0b16299867bdceb0b9ee3bb68737 Mon Sep 17 00:00:00 2001
From: Danny Avila <110412045+danny-avila@users.noreply.github.com>
Date: Thu, 18 Jan 2024 20:11:42 -0500
Subject: [PATCH 7/9] =?UTF-8?q?=F0=9F=8E=AF=20feat(config):=20Custom=20End?=
=?UTF-8?q?point=20Request=20Headers=20(#1588)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../services/Endpoints/custom/initializeClient.js | 8 ++++++++
docs/install/configuration/custom_config.md | 15 +++++++++++++++
packages/data-provider/package.json | 2 +-
packages/data-provider/src/config.ts | 1 +
4 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/api/server/services/Endpoints/custom/initializeClient.js b/api/server/services/Endpoints/custom/initializeClient.js
index 0c0ad9e7e21..978506b7b47 100644
--- a/api/server/services/Endpoints/custom/initializeClient.js
+++ b/api/server/services/Endpoints/custom/initializeClient.js
@@ -22,6 +22,13 @@ const initializeClient = async ({ req, res, endpointOption }) => {
const CUSTOM_API_KEY = extractEnvVariable(endpointConfig.apiKey);
const CUSTOM_BASE_URL = extractEnvVariable(endpointConfig.baseURL);
+ let resolvedHeaders = {};
+ if (endpointConfig.headers && typeof endpointConfig.headers === 'object') {
+ Object.keys(endpointConfig.headers).forEach((key) => {
+ resolvedHeaders[key] = extractEnvVariable(endpointConfig.headers[key]);
+ });
+ }
+
if (CUSTOM_API_KEY.match(envVarRegex)) {
throw new Error(`Missing API Key for ${endpoint}.`);
}
@@ -31,6 +38,7 @@ const initializeClient = async ({ req, res, endpointOption }) => {
}
const customOptions = {
+ headers: resolvedHeaders,
addParams: endpointConfig.addParams,
dropParams: endpointConfig.dropParams,
titleConvo: endpointConfig.titleConvo,
diff --git a/docs/install/configuration/custom_config.md b/docs/install/configuration/custom_config.md
index 6847e158edc..b7bba503093 100644
--- a/docs/install/configuration/custom_config.md
+++ b/docs/install/configuration/custom_config.md
@@ -253,6 +253,21 @@ endpoints:
- **Description**: Excludes specified [default parameters](#default-parameters). Useful for APIs that do not accept or recognize certain parameters.
- **Example**: `dropParams: ["stop", "user", "frequency_penalty", "presence_penalty"]`
- **Note**: For a list of default parameters sent with every request, see the ["Default Parameters"](#default-parameters) Section below.
+
+### **headers**:
+
+ > Adds additional headers to requests. Can reference an environment variable
+
+ - Type: Object/Dictionary
+ - **Description**: The `headers` object specifies custom headers for requests. Useful for authentication and setting content types.
+ - **Example**:
+ - **Note**: Supports dynamic environment variable values, which use the format: `"${VARIABLE_NAME}"`
+```yaml
+ headers:
+ x-api-key: "${ENVIRONMENT_VARIABLE}"
+ Content-Type: "application/json"
+```
+
## Additional Notes
- Ensure that all URLs and keys are correctly specified to avoid connectivity issues.
diff --git a/packages/data-provider/package.json b/packages/data-provider/package.json
index 9148305ce1f..40c3e175ced 100644
--- a/packages/data-provider/package.json
+++ b/packages/data-provider/package.json
@@ -1,6 +1,6 @@
{
"name": "librechat-data-provider",
- "version": "0.3.6",
+ "version": "0.3.7",
"description": "data services for librechat apps",
"main": "dist/index.js",
"module": "dist/index.es.js",
diff --git a/packages/data-provider/src/config.ts b/packages/data-provider/src/config.ts
index 145fc124524..b8ba08a9565 100644
--- a/packages/data-provider/src/config.ts
+++ b/packages/data-provider/src/config.ts
@@ -23,6 +23,7 @@ export const endpointSchema = z.object({
summaryModel: z.string().optional(),
forcePrompt: z.boolean().optional(),
modelDisplayLabel: z.string().optional(),
+ headers: z.record(z.any()).optional(),
});
export const configSchema = z.object({
From a7c54573c4d4a11a28cd37523ba57a1e5982cac2 Mon Sep 17 00:00:00 2001
From: Danny Avila <110412045+danny-avila@users.noreply.github.com>
Date: Thu, 18 Jan 2024 20:39:30 -0500
Subject: [PATCH 8/9] =?UTF-8?q?=F0=9F=9A=80=20feat:=20Add=20`OPENAI=5FORGA?=
=?UTF-8?q?NIZATION`=20for=20all=20OpenAI=20Requests=20(#1590)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env.example | 2 ++
api/app/clients/OpenAIClient.js | 4 ++++
api/server/services/ModelService.js | 4 ++++
docs/install/configuration/dotenv.md | 7 +++++++
4 files changed, 17 insertions(+)
diff --git a/.env.example b/.env.example
index 54301bebd2d..7f49509c2d1 100644
--- a/.env.example
+++ b/.env.example
@@ -115,6 +115,8 @@ DEBUG_OPENAI=false
# OPENAI_REVERSE_PROXY=
+# OPENAI_ORGANIZATION=
+
#============#
# OpenRouter #
#============#
diff --git a/api/app/clients/OpenAIClient.js b/api/app/clients/OpenAIClient.js
index f832b3ca134..7d0baa40d79 100644
--- a/api/app/clients/OpenAIClient.js
+++ b/api/app/clients/OpenAIClient.js
@@ -954,6 +954,10 @@ ${convo}
opts.defaultHeaders = { ...opts.defaultHeaders, 'api-key': this.apiKey };
}
+ if (process.env.OPENAI_ORGANIZATION) {
+ opts.organization = process.env.OPENAI_ORGANIZATION;
+ }
+
let chatCompletion;
const openai = new OpenAI({
apiKey: this.apiKey,
diff --git a/api/server/services/ModelService.js b/api/server/services/ModelService.js
index 2e433dbd14e..76ac061546d 100644
--- a/api/server/services/ModelService.js
+++ b/api/server/services/ModelService.js
@@ -53,6 +53,10 @@ const fetchModels = async ({ apiKey, baseURL, name = 'OpenAI', azure = false })
payload.httpsAgent = new HttpsProxyAgent(PROXY);
}
+ if (process.env.OPENAI_ORGANIZATION && baseURL.includes('openai')) {
+ payload.headers['OpenAI-Organization'] = process.env.OPENAI_ORGANIZATION;
+ }
+
const res = await axios.get(`${baseURL}${azure ? '' : '/models'}`, payload);
models = res.data.data.map((item) => item.id);
} catch (err) {
diff --git a/docs/install/configuration/dotenv.md b/docs/install/configuration/dotenv.md
index 09ade2a7f3c..981656780d5 100644
--- a/docs/install/configuration/dotenv.md
+++ b/docs/install/configuration/dotenv.md
@@ -285,6 +285,13 @@ GOOGLE_MODELS=gemini-pro,gemini-pro-vision,chat-bison,chat-bison-32k,codechat-bi
OPENAI_API_KEY=user_provided
```
+- You can specify which organization to use for each API request to OpenAI. However, it is not required if you are only part of a single organization or intend to use your default organization. You can check your [default organization here](https://platform.openai.com/account/api-keys). This can also help you limit your LibreChat instance from allowing API keys outside of your organization to be used, as a mismatch between key and organization will throw an API error.
+
+```bash
+# Optional
+OPENAI_ORGANIZATION=org-Y6rfake63IhVorgqfPQmGmgtId
+```
+
- Set to true to enable debug mode for the OpenAI endpoint
```bash
From 83292a47a75a5fc2fa2002e100c78115152ce0ba Mon Sep 17 00:00:00 2001
From: Danny Avila <110412045+danny-avila@users.noreply.github.com>
Date: Thu, 18 Jan 2024 21:25:57 -0500
Subject: [PATCH 9/9] =?UTF-8?q?=F0=9F=93=9C=20refactor:=20Enhance=20Auto?=
=?UTF-8?q?=20Scroll=20Speed=20and=20UseEffect=20Cleanup=20(#1591)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
client/src/hooks/Messages/useMessageHelpers.ts | 6 +++---
client/src/hooks/Messages/useMessageScrolling.ts | 6 ++++++
client/src/hooks/useScrollToRef.ts | 2 +-
3 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/client/src/hooks/Messages/useMessageHelpers.ts b/client/src/hooks/Messages/useMessageHelpers.ts
index 1ca2b74d962..eaefdb9c17d 100644
--- a/client/src/hooks/Messages/useMessageHelpers.ts
+++ b/client/src/hooks/Messages/useMessageHelpers.ts
@@ -1,5 +1,5 @@
import copy from 'copy-to-clipboard';
-import { useEffect, useRef } from 'react';
+import { useEffect, useRef, useCallback } from 'react';
import { useGetEndpointsQuery } from 'librechat-data-provider/react-query';
import type { TMessage } from 'librechat-data-provider';
import type { TMessageProps } from '~/common';
@@ -43,13 +43,13 @@ export default function useMessageHelpers(props: TMessageProps) {
const enterEdit = (cancel?: boolean) =>
setCurrentEditId && setCurrentEditId(cancel ? -1 : messageId);
- const handleScroll = () => {
+ const handleScroll = useCallback(() => {
if (isSubmitting) {
setAbortScroll(true);
} else {
setAbortScroll(false);
}
- };
+ }, [isSubmitting, setAbortScroll]);
const icon = Icon({
...conversation,
diff --git a/client/src/hooks/Messages/useMessageScrolling.ts b/client/src/hooks/Messages/useMessageScrolling.ts
index a523e0b17e4..c2f730fb201 100644
--- a/client/src/hooks/Messages/useMessageScrolling.ts
+++ b/client/src/hooks/Messages/useMessageScrolling.ts
@@ -63,6 +63,12 @@ export default function useMessageScrolling(messagesTree?: TMessage[] | null) {
if (isSubmitting && scrollToBottom && !abortScroll) {
scrollToBottom();
}
+
+ return () => {
+ if (abortScroll) {
+ scrollToBottom && scrollToBottom?.cancel();
+ }
+ };
}, [isSubmitting, messagesTree, scrollToBottom, abortScroll]);
useEffect(() => {
diff --git a/client/src/hooks/useScrollToRef.ts b/client/src/hooks/useScrollToRef.ts
index 941fa5aac70..fdc2444fb66 100644
--- a/client/src/hooks/useScrollToRef.ts
+++ b/client/src/hooks/useScrollToRef.ts
@@ -17,7 +17,7 @@ export default function useScrollToRef({ targetRef, callback, smoothCallback }:
// eslint-disable-next-line react-hooks/exhaustive-deps
const scrollToRef = useCallback(
- throttle(() => logAndScroll('instant', callback), 450, { leading: true }),
+ throttle(() => logAndScroll('instant', callback), 250, { leading: true }),
[targetRef],
);