El auto-incremento del nombre de credencial parece global para credenciales personalizadas, pero por persona para algunos integrados (OpenAI)

{“content”:"Estoy viendo un comportamiento inconsistente en la nomenclatura de credenciales en n8n y quiero confirmar si esto es lo esperado.

Lo que observo

  • Para mi tipo de credencial personalizado (myApi), las nuevas credenciales se nombran automáticamente de forma global en toda la instancia:

    • El usuario A crea credenciales personales: MyApi Account, MyApi Account 2

    • El usuario B (que no puede ver las credenciales personales del usuario A) crea una y obtiene: MyApi Account 3

  • Pero por ejemplo, para credenciales de OpenAI, el contador parece ser personal/con alcance de proyecto (no continúa desde las credenciales de otros usuarios de la misma manera).

Por qué esto es confuso

La visibilidad de las credenciales es personal/basada en proyectos, pero el sufijo de nombre generado para mi tipo personalizado parece utilizar un contador global. Esto hace que la nomenclatura parezca “filtrada” entre usuarios aunque las credenciales no se compartan.

Pregunta

  • ¿Es esta diferencia entre tipos de credenciales integrados (por ejemplo, OpenAI) y personalizados lo esperado?

  • ¿Hay múltiples flujos de creación de credenciales/generación de nombres en n8n que expliquen esto?

  • ¿Hay alguna forma de que un tipo de credencial personalizado utilice generación de nombres por usuario/por proyecto en lugar de sufijos globales?

\"n8n-workflow\": \"^1.120.13\"",“target_locale”:“es”}

Bienvenido a la comunidad n8n @Jankaz
¿llegaste a verificar si la credencial openai está siendo creada por el mismo flujo que tu credencial personalizada (proyecto personal vs proyecto compartido vs proyecto global del owner)?
Tengo para mí que tu problema está en la ruta interna de creación/nombrado que se está utilizando. ¿podrías compartir un repro simple comparando credencial personalizada vs credencial OpenAI, incluyendo proyecto, rol del usuario, nombres generados y comportamiento de la numeración entre usuarios?

Verifiqué las solicitudes en la red y ambas utilizan https://n8n.stg.olx.org/rest/credentials con la misma estructura de payload. Ambas con el mismo projectId. La única diferencia es que el payload para openai tiene un campo adicional uiContext: "credentials_list" pero creo que no es el caso

MyApi.credentials.ts

export class MyApi implements ICredentialType {
  name = "myApi";

  displayName = "My API";

  properties: INodeProperties[] = [
    {
      displayName: "URL Base de la Plataforma",
      name: "baseUrl",
      type: "string",
      default: "http://myapi.com",
      placeholder: "http://myapi.com",
      required: true,
      hint: "Haz clic en `Guardar` para autenticarte.",
      description: "",
    },
    {
      displayName: "Secreto",
      name: "adminToken",
      type: "hidden",
      typeOptions: {
        password: true,
      },
      default: "",
      description:
        "Completado a través de sobrescrituras de credenciales de n8n.",
    },
  ];

  test: ICredentialTestRequest = {
    request: {
      method: "GET",
      baseURL: "={{$credentials.baseUrl}}",
      url: "/health",
    },
  };
}

import type {
  ICredentialDataDecryptedObject,
  ICredentialTestRequest,
  ICredentialType,
  IHttpRequestOptions,
  INodeProperties,
} from 'n8n-workflow';

export class OpenAiApi implements ICredentialType {
  name = 'openAiApi';

  displayName = 'OpenAI';

  documentationUrl = 'openai';

  properties: INodeProperties[] = [
   {
    displayName: 'Clave API',
    name: 'apiKey',
    type: 'string',
    typeOptions: { password: true },
    required: true,
    default: '',
   },
   {
    displayName: 'ID de Organización (opcional)',
    name: 'organizationId',
    type: 'string',
    default: '',
    hint: 'Solo es necesario si perteneces a múltiples organizaciones',
    description:
     "Para usuarios que pertenecen a múltiples organizaciones, puedes establecer qué organización se utiliza para una solicitud de API. El uso de estas solicitudes de API se contabilizará contra la cuota de suscripción de la organización especificada.",
   },
   {
    displayName: 'URL Base',
    name: 'url',
    type: 'string',
    default: 'https://api.openai.com/v1',
    description: 'Anula la URL base predeterminada de la API',
   },
   {
    displayName: 'Agregar Encabezado Personalizado',
    name: 'header',
    type: 'boolean',
    default: false,
   },
   {
    displayName: 'Nombre del Encabezado',
    name: 'headerName',
    type: 'string',
    displayOptions: {
     show: {
      header: [true],
     },
    },
    default: '',
   },
   {
    displayName: 'Valor del Encabezado',
    name: 'headerValue',
    type: 'string',
    typeOptions: {
     password: true,
    },
    displayOptions: {
     show: {
      header: [true],
     },
    },
    default: '',
   },
  ];

  test: ICredentialTestRequest = {
   request: {
    baseURL: '={{$credentials?.url}}',
    url: '/models',
   },
  };

  async authenticate(
   credentials: ICredentialDataDecryptedObject,
   requestOptions: IHttpRequestOptions,
  ): Promise<IHttpRequestOptions> {
   requestOptions.headers ??= {};

   requestOptions.headers['Authorization'] = `Bearer ${credentials.apiKey}`;
   requestOptions.headers['OpenAI-Organization'] = credentials.organizationId;

   if (
    credentials.header &&
    typeof credentials.headerName === 'string' &&
    credentials.headerName &&
    typeof credentials.headerValue === 'string'
   ) {
    requestOptions.headers[credentials.headerName] = credentials.headerValue;
   }

   return requestOptions;
  }
}

@Jankaz
Por el código del backend, parece que POST /rest/credentials persiste el name recibido en el payload, entonces investigaría la generación del nombre en el frontend antes de que la solicitud se envíe. Si OpenAI y la credencial personalizada llegan al mismo endpoint con el mismo projectId, pero ya con nombres diferentes, la diferencia probablemente está en el flujo de UI que calcula el nombre de credencial predeterminado, no en el save() del backend.

Gracias - de acuerdo en que POST `/rest/credential` solo guarda el nombre proporcionado.
En los rastreos de red, tanto las credenciales de OpenAI como las personalizadas también llaman a `GET /rest/credentials/new?name=` antes del POST.
Por lo tanto, la asignación de nombres parece estar determinada por (a) el nombre base del frontend + (b) la generación de nombres únicos del backend en /credentials/new.
Esto sugiere que la diferencia proviene de la coincidencia de nombres existentes para cada prefijo (OpenAI account% vs GAIP account%), en lugar de provenir de save() o uiContext.

Entonces… ¿cuál es la dificultad en renombrar la credencial? :slight_smile:

He estado trabajando con n8n durante aproximadamente 4 años, y he visto que dejar el nombre base genera problemas al actualizar credenciales más tarde o al determinar qué es qué

no hay dificultad, pero es confuso

es normal @Jankaz, después de que encuentres tu forma de entender el problema se te hará más fácil. no es algo configurable, son visualmente diferentes de verdad.

no encontré ningún parámetro para alterar la lógica de generación automática de nombres

La separación por usuario/proyecto existe a nivel de permisos y visibilidad de las credenciales, vía RBAC/Projects, pero eso no significa que el contador automático de nombres también esté limitado por proyecto. La documentación de RBAC habla sobre acceso a workflows y credenciales por proyecto, no sobre el algoritmo de denominación.

como se sugirió en el hilo, la solución es nombrar manualmente las credenciales con proyecto/usuario en el nombre.