Todos os produtos
Search
Central de documentação

Qoder CN Series:Configurar filtros

Última atualização: Jul 03, 2026

Administradores do Qoder CN Enterprise Dedicated Edition e administradores globais da organização podem configurar filtros de segurança para chat de IA, conclusão de código e uploads da base de conhecimento.

Qoder CN

Importante

Este recurso é compatível apenas com extensões para Visual Studio Code e JetBrains IDE. Ele não está disponível no Qoder CN IDE.

Edições aplicáveis

Enterprise Dedicated Edition

Acessar o recurso

  1. Faça login no Qoder CN console como administrador do Qoder CN ou administrador global da organização (apenas Enterprise Dedicated Edition). No painel de navegação à esquerda, escolha Policy Configuration > Filter Configuration.

  2. Na parte superior da página, selecione uma aba conforme o cenário em que deseja aplicar o filtro: AI Chat, Inline Code Generation ou Knowledge Base Upload (apenas Enterprise Dedicated Edition).

  3. Ative a chave de cada filtro e configure seus parâmetros. A tabela a seguir lista os tipos de filtro compatíveis:

    Cenário

    Tipo de filtro

    Descrição

    AI Chat

    Pré-filtro de AI Chat

    Ao usar o recurso AI Chat do Qoder CN, a entrada do usuário enviada ao Large Language Model (LLM) passa pelo pré-filtro. A saída do LLM passa pelo pós-filtro.

    Pós-filtro de AI Chat

    Inline Code Generation

    Pré-filtro de Inline Code Generation

    Ao usar o recurso Inline Code Generation do Qoder CN, a entrada do usuário enviada ao LLM passa pelo pré-filtro. A saída do LLM passa pelo pós-filtro.

    Pós-filtro de Inline Code Generation

    Knowledge Base Upload

    Pré-filtro de Knowledge Base Upload

    Os arquivos enviados para a base de conhecimento do Qoder CN devem passar por este filtro antes da conclusão do upload.

    Importante
    • Garanta que os desenvolvedores atualizem a extensão Qoder CN para a versão 1.4.0 ou posterior. Caso contrário, os filtros configurados não entrarão em vigor.

    • Após ativar ou modifique o AI Chat filter ou o Inline Code Generation filter, as alterações levam cerca de 5 a 10 minutos para entrar em vigor para os desenvolvedores que usam a extensão Qoder CN.

    • Após ativar ou modifique o Knowledge Base Upload filter, as alterações entram em vigor imediatamente. Os arquivos enviados para a base de conhecimento da sua empresa são filtrados instantaneamente.

Configurar pré-filtros para AI Chat e Inline Code Generation

Método 1: Configurar com expressões regulares

Nota

Teste minuciosamente as expressões regulares antes da implantação para evitar problemas de desempenho nas extensões da IDE.

  • Método de processamento: Configure filtros usando expressões regulares. Há três modos compatíveis.

    Nenhuma ação na correspondência

    Não executa nenhuma ação quando ocorre uma correspondência.

    Bloquear na correspondência

    Bloqueia a solicitação e interrompe a chamada do modelo quando ocorre uma correspondência.

    Substituir na correspondência

    Substitui o conteúdo conforme a configuração quando ocorre uma correspondência.

  • Notificação: Ative as notificações para enviar alertas à sua plataforma de mensagens preferida usando webhooks.

  • Ordem de execução: Os filtros são executados na ordem de configuração.

  • Número máximo de expressões regulares: É possível adicionar até 10 expressões.

  • Padrão de expressão regular: As expressões seguem o padrão ECMAScript. Flags comuns como i (case-insensitive), g (global) e s (DOTALL) são compatíveis.

  • Exemplos de configurações:

    Nome da regra

    Expressão regular

    Substituição

    Texto original

    Texto substituído

    Número de ID

    (?<pre>.)(\d{15})((\d{2})([0-9Xx]))(?<post>.)

    $<pre>***$<post>

    ID number: 330204197709022312.

    ID number: ***.

    Endereço de e-mail

    \w+([-+.]\w+)@\w+([-.]\w+)\.\w+([-.]\w+)*

    ***

    My email is lin***@aliyunmail.com

    My email is ***

    Senha

    (.password=)([\w\d]+)(.)

    $1***$3

    {password=1213213}

    {password=***}

Método 2: Configurar com scripts personalizados (apenas Enterprise Dedicated Edition)

A Enterprise Dedicated Edition oferece suporte à filtragem baseada em scripts personalizados para cenários complexos de pré-filtragem.

Etapa 1: Desenvolver o script

Escreva scripts em TypeScript usando o código de exemplo como referência.

  1. Baixe o repositório de modelos: Clique em URL do repositório: lingma-extension-template. Este modelo inclui a estrutura básica para desenvolvimento de scripts. Leia atentamente o arquivo README.md e os exemplos de código.

  2. Implemente a interface de pré-processamento: Implemente a interface RequestPreHandler. Para detalhes da API, consulte API de Script Personalizado. Veja abaixo um exemplo de implementação em SensitiveContentFilter.ts:

    /**
     * Sensitive content filter. Pre-processes data sent to the model.
     */
    export const sensitiveContentFilter: RequestPreHandler = {
      handle: async (request: RawRequest, SDKTool: Qoder CNSDKTool) => {
        const dataMap = PayloadUtil.getPayloadData(request.payload);
        for (const [key, value] of dataMap.entries()) {
          if (value.includes('password')) {
            return ResultUtil.buildBlockResult('Content contains password');
          }
        }
        // Handle different actions differently
        switch (request.action) {
          case ActionEnum.COMPLETION:
            // do something
            break;
          case ActionEnum.CODE_PROBLEM_SOLVE:
            // do something
            break;
          default:
            return ResultUtil.buildNoOpsResult();
        }
        return ResultUtil.buildNoOpsResult();
      },
    };
  3. Execute e depure o script. Teste-o execute a função main. Siga estas etapas:

    Etapa 1

    Edite o arquivo src/index.ts. Modifique a função main para testar seu script. Exemplo:

    async function main() {
          const value1 = ['password=123', 'abc'];
          const value2 = 'hello world';
          const dataMap = new Map<PayloadDataKeyEnum, PayloadDataValueType>();
          dataMap.set(PayloadDataKeyEnum.SELECTED_CODE, value1);
          dataMap.set(PayloadDataKeyEnum.USER_INPUT, value2);
    
          const mockRequest: RawRequest = {
            action: ActionEnum.CODE_GENERATE_COMMENT,
            payload: {
              associatedContexts: [],
              data: dataMap,
            },
            requestId: '123',
          };
          const response = await sensitiveContentFilter.handle(mockRequest, SDKTool);
          console.log(response);
        }

    Etapa 2

    No VS Code, abra o arquivo de script e defina pontos de interrupção. Em seguida, na visualização Debug, selecione Launch Program e clique em Run.

    image

Etapa 2: Compilar e construir

Compile TypeScript para JavaScript. Por exemplo, compile SensitiveContentFilter.ts em SensitiveContentFilter.js:

  1. Abra o arquivo de configuração src/build.js. Atualize os parâmetros entryPoints e outfile. Defina entryPoints como o caminho do seu arquivo TypeScript. Defina outfile como o caminho de saída para o arquivo JavaScript compilado.

  2. Execute o comando node build.js no diretório raiz do seu repositório. Após a execução bem-sucedida, o arquivo JavaScript aparecerá no caminho especificado em outfile.

Etapa 3: Testar localmente

Teste o script localmente antes de fazer o upload para verificar se ele se integra à extensão da IDE do Qoder CN e se filtra corretamente.

  1. Copie o arquivo JavaScript compilado para o diretório /extension/local/script/ dentro do caminho de armazenamento local do Qoder CN.

  2. Edite o arquivo config.json. Este arquivo está localizado no diretório /extension/local/ dentro do caminho de armazenamento local do Qoder CN. Abra o config.json e localize contentHandlerScripts. Adicione a configuração do seu script. Se contentHandlerScripts não existir, crie um novo array. Exemplo:

    {
      "contentHandlerScripts": [
        {
          "identifier": "SensitiveContentFilter", 
          "name": "Sensitive Content Filter",
          "version": "1.0.0",
          "scriptPath": "~/.lingma/extension/local/script/SensitiveContentFilter.js",
          "state": "enabled",
          "bizType": "completion"
        }
      ]
    }

    Descrições dos parâmetros:

    Parâmetro

    Descrição

    identifier

    ID do script. Deve ser único.

    name

    Nome do script.

    version

    Versão do script. Incremente após cada alteração; caso contrário, o script atualizado não entrará em vigor.

    scriptPath

    Caminho do arquivo de script. Observação:

    • O script deve ser colocado no diretório /extension/local/script/ dentro do caminho de armazenamento local.

    • O nome do arquivo JavaScript (por exemplo, SensitiveContentFilter.js) deve corresponder ao valor de identifier.

    state

    Estado do script. enabled ativa o script. disabled o desativa.

    bizType

    Cenário de negócio. completion aplica-se à geração de código inline. chat aplica-se ao chat de IA.

Etapa 4: Fazer upload do script

Após o teste local, faça o upload do script:

  1. Acesse o console do Qoder CN. Escolha Policy Management. Selecione o cenário onde deseja ativar o filtro de segurança.

  2. Selecione Custom Script como opção de filtro.

  3. Faça o upload do arquivo JavaScript compilado.

  4. Clique em Save Configuration. A configuração entra em vigor na extensão dentro de aproximadamente 5 minutos.

API de Script Personalizado

Scripts personalizados oferecem suporte a três métodos de processamento:

  • Bloquear: Interrompe o processamento adicional. Nenhuma chamada de inferência é feita ao LLM. A solicitação atual é encerrada.

  • Filtrar: Modifica os dados enviados (por exemplo, ofuscar, exclua ou substituir conteúdo) e continua o processamento.

  • Nenhuma operação: Retorna os dados inalterados e continua o processamento.

Definição da interface
/**
 * Pre-processing interface for Qoder CN
 */
export interface RequestPreHandler {
  // Process the request
  handle: (request: RawRequest, SDKTool: Qoder CNSDKTool) => Promise<HandlerResponse>;
}
Parâmetros de entrada
/**
 * Request object. Includes the action and raw data sent to the LLM.
 */
export interface RawRequest {
  // Unique identifier for the request. Used for tracing.
  action: ActionEnum;
  // Enum for the action that triggered the request.
  payload: ContentPayload;
  // Payload containing raw data.
  requestId: string;
}

// Value type for ContentPayload.data
export type PayloadDataValueType = string | number | string[];
/**
 * Payload containing raw data sent to the LLM.
 */
export class ContentPayload {
  // Collection of data to process. Keys are defined in ContextValueKeyEnum.
  data: Map<PayloadDataKeyEnum, PayloadDataValueType>;
  // Context associated with the processing.
  associatedContexts: ContextItem[];

  constructor() {
    this.data = new Map<PayloadDataKeyEnum, PayloadDataValueType>();
    this.associatedContexts = [];
  }
}

/**
 * Keys for ContentPayload.data
 */
export enum PayloadDataKeyEnum {
  // Selected code snippet
  SELECTED_CODE ='lingma:code',
  // User input text
  USER_INPUT = 'lingma:text',
  // Error messages
  ERROR_MESSAGES = 'lingma:error_messages',
  // Terminal log output
  TERMINAL_CONTENT = 'lingma:terminal_content',
  // Code before cursor for code completion
  PREFIX_CODE = 'lingma:code_prefix',
  // Code after cursor for code completion
  SUFFIX_CODE = 'lingma:code_suffix',
  // Similar code snippets
  SIMILAR_CODE = 'lingma:similar_code',
}

/**
 * Enum for request actions
 */
export enum ActionEnum {
    // Unit test
    GENERATE_TESTCASE           = 'GENERATE_TESTCASE',
    // Generate comments
    CODE_GENERATE_COMMENT       = 'CODE_GENERATE_COMMENT',
    // Explain code
    EXPLAIN_CODE                = 'EXPLAIN_CODE',
    // Optimize code
    OPTIMIZE_CODE               = 'OPTIMIZE_CODE',
    // Free input (direct text entry in the chat box)
    FREE_INPUT                  = 'FREE_INPUT',
    // Quick fix for code issues
    CODE_PROBLEM_SOLVE          = 'CODE_PROBLEM_SOLVE',
    // Generate shell commands
    TERMINAL_COMMAND_GENERATION = 'TERMINAL_COMMAND_GENERATION',
    // Fix terminal errors
    TERMINAL_EXPLAIN_FIX        = 'TERMINAL_EXPLAIN_FIX',
    // Code completion
    COMPLETION                  = 'COMPLETION',
}
Parâmetros de saída
/**
 * Pre-processing result
 */
export class HandlerResponse {
  // Processing policy. Controls subsequent logic.
  handlePolicy: HandlePolicy;
  // Reason description
  reason?: string;
  // Required when handlePolicy=FILTER. Contains filtered data. Must match ContentRequest.payload structure.
  payload?: ContentPayload;
  constructor() {
    // Default values
    // eslint-disable-next-line @typescript-eslint/no-use-before-define
    this.handlePolicy = HandlePolicy.NO_OPS;
    this.reason = '';
    this.payload = new ContentPayload();
  }
}

/**
 * Processing policy enum
 */
export enum HandlePolicy {
  // Block the request
  BLOCK = 'BLOCK',
  // Filter the request and modify the payload
  FILTER = 'FILTER',
  // Take no action
  NO_OPS = 'NO_OPS',
}

Configurar pós-filtros para AI Chat e Inline Code Generation

Método 1: Configurar com expressões regulares

Nota

Teste minuciosamente as expressões regulares antes da implantação para evitar problemas de desempenho nas extensões da IDE.

  • Método de processamento: Configure filtros usando expressões regulares. Apenas um modo é compatível:

    Nenhuma ação na correspondência

    Não executa nenhuma ação quando ocorre uma correspondência.

  • Notificação: Ative as notificações para enviar alertas à sua plataforma de mensagens preferida usando webhooks.

  • Ordem de execução: Os filtros são executados na ordem de configuração.

  • Número máximo de expressões regulares: É possível adicionar até 10 expressões.

  • Padrão de expressão regular: As expressões seguem o padrão ECMAScript. Flags comuns como i (case-insensitive), g (global) e s (DOTALL) são compatíveis.

  • Exemplos de configurações:

    Nome da regra

    Expressão regular

    Texto original

    Número de ID

    (?<pre>.)(\d{15})((\d{2})([0-9Xx]))(?<post>.)

    ID number: 330204197709022312.

    Endereço de e-mail

    \w+([-+.]\w+)@\w+([-.]\w+)\.\w+([-.]\w+)*

    My email is lin***@aliyunmail.com

    Senha

    (.password=)([\w\d]+)(.)

    {password=1213213}

Método 2: Configurar com scripts personalizados (apenas Enterprise Dedicated Edition)

A Enterprise Dedicated Edition oferece suporte à filtragem baseada em scripts personalizados para cenários complexos de pós-filtragem.

Etapa 1: Desenvolver o script

Escreva scripts em TypeScript usando o código de exemplo como referência.

  1. Baixe o repositório de modelos: Clique em URL do repositório: lingma-extension-template. Este modelo inclui a estrutura básica para desenvolvimento de scripts. Leia atentamente o arquivo README.md e os exemplos de código.

  2. Implemente a interface de pós-processamento: Implemente a interface RequestPostHandler. Para a API, consulte API de Script Personalizado. Abaixo está um exemplo de implementação do trecho de código LLMChatAuditHandler.ts, que audita operações de AIChat do Qoder CN e relata o conteúdo da auditoria para o Alibaba Cloud SLS.

    import {ResultUtil} from '../common/HandlerRespUtil';
    import { JsonUtil } from '../common/JsonUtil';
    import {PayloadUtil} from '../common/PayloadUtil';
    import {Config} from '../sdk/ConfigManager';
    import {Qoder CNSDKTool} from '../sdk/Qoder CNSDKTool';
    import axios from "axios";
    import moment from "moment";
    import os from "os";
    import {
      ActionEnum, AIResponse,
      HandlePolicy,
      RawRequest,
      RequestPostHandler,
      RequestPreHandler
    } from '../sdk/RequestHandleSDK';
    
    /**
     * Custom post-filter script. Sends request content to a remote server for processing (such as code scanning or content auditing).
     */
    export const llmResultAuditHandler: RequestPostHandler = {
      handle: async (request: RawRequest, response: AIResponse,SDKTool: Qoder CNSDKTool) => {
         // Operator name
         let userName = SDKTool.user.name;
         // Operator ID
         let userId = SDKTool.user.uid;
         // IDE
         let ide = SDKTool.idePlatform;
         // IDE version
         let ideVersion = SDKTool.ideVersion;     
         // Operation time
         let operationTime = moment().format("YYYY-MM-DD HH:mm:ss");
         // Operation IP
         let opeartionIp = getIpAddress();
         // Business scenario (completion or chat)
         let bizType = "chat";
         // Request ID
         let requestId = request.requestId;
         // Action
         let action = request.action;
         // Operation content (select fields based on your audit needs. Avoid large payloads over 16 KB.)
         let inferredResult = response.inferredResult.text;
        
         // Report to SLS
         // SLS project name
         let slsProject = "xxx";
         // SLS LogStore name
         let slsLogStore = "xxx";
         // SLS endpoint
         let endPoint = "cn-hangzhou.log.aliyuncs.com";
         let slsWebTrackingUrl = `http://${slsProject}.${endPoint}/logstores/${slsLogStore}/track?APIVersion=0.6.0&request_id=${requestId}&action=${action}&biz_type=${bizType}&user_name=${userName}&user_id=${userId}&ide=${ide}&ide_version=${ideVersion}&operation_time=${operationTime}&opeartion_ip=${opeartionIp}&inferredResult=${inferredResult}`;
         axios.get(slsWebTrackingUrl).catch((error) => {
           console.error(error);
         });
    
         // Return filter result
        return ResultUtil.buildPostHandlerResponse(HandlePolicy.NO_OPS, response.inferredResult,'No action required');
      },
    };
    
    /**
     * Add the custom script filter to the configuration
     * @param config Config object provided by Qoder CNExtensionSDK
     */
    export function modifyConfig(config: Config) {
      config.postContentHandlers.push(llmResultAuditHandler);
      return config;
    }
    
    function getIpAddress() {
      const interfaces = os.networkInterfaces();
      for (let devName in interfaces) {
        let iface = interfaces[devName];
    
        for (let i = 0; i < iface.length; i++) {
          let alias = iface[i];
          if (
            alias.family === "IPv4" &&
            alias.address !== "127.0.0.1" &&
            !alias.internal
          )
            return alias.address;
        }
      }
    
      return "No IP address found";
    }
  3. Execute e depure o script. Teste-o execute a função main. Siga estas etapas:

    Etapa 1

    Edite o arquivo src/index.ts. Modifique a função main para testar seu script. Exemplo:

    async function main() {
          const value2 = 'hello world';
          const dataMap = new Map<PayloadDataKeyEnum, PayloadDataValueType>();
          dataMap.set(PayloadDataKeyEnum.USER_INPUT, value2);
    
          const request: RawRequest = {
            action: ActionEnum.CODE_GENERATE_COMMENT,
            payload: {
              associatedContexts: [],
              data: dataMap,
            },
            requestId: 'test-request-id',
          };
    
          const aiResponse: AIResponse = {
            inferredResult: {
              text: 'reply hello world',
            },
          };
    
          const response = await llmResultAuditHandler.handle(request, aiResponse, SDKTool);
          console.log(response);
        }

    Etapa 2

    No VS Code, abra o arquivo de script e defina pontos de interrupção. Em seguida, na visualização Debug, selecione Launch Program e clique em Run.

    image

Etapa 2: Compilar e construir

Compile TypeScript para JavaScript. Por exemplo, compile LLMChatAuditHandler.ts em LLMChatAuditHandler.js:

  1. Abra o arquivo de configuração src/build.js. Atualize os parâmetros entryPoints e outfile. Defina entryPoints como o caminho do seu arquivo TypeScript. Defina outfile como o caminho de saída para o arquivo JavaScript compilado.

  2. Execute o comando node build.js no diretório raiz do seu repositório. Após a execução bem-sucedida, o arquivo JavaScript aparecerá no caminho especificado em outfile.

Etapa 3: Testar localmente

Teste o script localmente antes de fazer o upload para verificar se ele se integra à extensão da IDE do Qoder CN e se filtra corretamente.

  1. Copie o arquivo JavaScript compilado para o diretório /extension/local/script/ dentro do caminho de armazenamento local do Qoder CN.

  2. Edite o arquivo config.json. Este arquivo está localizado no diretório /extension/local/ dentro do caminho de armazenamento local do Qoder CN. Abra o config.json e localize contentHandlerScripts. Adicione a configuração do seu script. Se contentHandlerScripts não existir, crie um novo array. Exemplo:

    {
      "contentHandlerScripts": [
        {
          "identifier": "LLMChatAuditHandler", 
          "name": "AI Chat Audit",
          "version": "1.0.0",
          "scriptPath": "~/.lingma/extension/local/script/LLMChatAuditHandler.js",
          "state": "enabled",
          "stage":"post",
          "bizType": "completion"
        }
      ]
    }

    Descrições dos parâmetros:

    Parâmetro

    Descrição

    identifier

    ID do script. Deve ser único.

    name

    Nome do script.

    version

    Versão do script. Incremente após cada alteração; caso contrário, o script atualizado não entrará em vigor.

    scriptPath

    Caminho do arquivo de script. Observação:

    • O script deve ser colocado no diretório /extension/local/script/ dentro do caminho de armazenamento local.

    • O nome do arquivo JavaScript (por exemplo, LLMChatAuditHandler.js) deve corresponder ao valor de identifier.

    state

    Estado do script. enabled ativa o script. disabled o desativa.

    stage

    Estágio de processamento. post significa pós-filtro. pre significa pré-filtro. O padrão é pre.

    bizType

    Cenário de negócio. completion aplica-se à geração de código inline. chat aplica-se ao chat de IA.

Etapa 4: Fazer upload do script

Após o teste local, faça o upload do script:

  1. Acesse o console do Qoder CN. Escolha Policy Management. Selecione o cenário onde deseja ativar o filtro de segurança.

  2. Selecione Custom Script como opção de filtro.

  3. Faça o upload do arquivo JavaScript compilado.

  4. Clique em Save Configuration. A configuração entra em vigor na extensão dentro de aproximadamente 5 minutos.

API de Script Personalizado

Scripts personalizados oferecem suporte a apenas um método de processamento:

  • Nenhuma operação: Retorna os dados inalterados e continua o processamento.

Definição da interface
/**
 * Post-processing interface for Qoder CN
 * @param request User request
 * @param response Inference result from the LLM
 * @param SDKTool SDK utility class. Provides IDE and plugin information.
 * @returns Result after post-processing
 */
export interface RequestPostHandler {
  // Post-processing method
  handle: (request: RawRequest, response: AIResponse, SDKTool: Qoder CNSDKTool) => Promise<PostHandlerResponse>;
}
Parâmetros de entrada
/**
 * Request object. Includes the action and raw data sent to the LLM.
 */
export interface RawRequest {
  // Unique identifier for the request. Used for tracing.
  action: ActionEnum;
  // Enum for the action that triggered the request.
  payload: ContentPayload;
  // Payload containing raw data.
  requestId: string;
}

/**
 * Inference result from the model
 */
export class InferredResult {
  // Text generated by the LLM
  text: string;
  constructor() {
    this.text = '';
  }
}

// Value type for ContentPayload.data
export type PayloadDataValueType = string | number | string[];
/**
 * Payload containing raw data sent to the LLM.
 */
export class ContentPayload {
  // Collection of data to process. Keys are defined in ContextValueKeyEnum.
  data: Map<PayloadDataKeyEnum, PayloadDataValueType>;
  // Context associated with the processing.
  associatedContexts: ContextItem[];

  constructor() {
    this.data = new Map<PayloadDataKeyEnum, PayloadDataValueType>();
    this.associatedContexts = [];
  }
}

/**
 * Keys for ContentPayload.data
 */
export enum PayloadDataKeyEnum {
  // Selected code snippet
  SELECTED_CODE ='lingma:code',
  // User input text
  USER_INPUT = 'lingma:text',
  // Error messages
  ERROR_MESSAGES = 'lingma:error_messages',
  // Terminal log output
  TERMINAL_CONTENT = 'lingma:terminal_content',
  // Code before cursor for code completion
  PREFIX_CODE = 'lingma:code_prefix',
  // Code after cursor for code completion
  SUFFIX_CODE = 'lingma:code_suffix',
  // Similar code snippets
  SIMILAR_CODE = 'lingma:similar_code',
  // File path for code completion
  FILE_PATH = 'lingma:file_path',
}

/**
 * Enum for request actions
 */
export enum ActionEnum {
    // Unit test
    GENERATE_TESTCASE           = 'GENERATE_TESTCASE',
    // Generate comments
    CODE_GENERATE_COMMENT       = 'CODE_GENERATE_COMMENT',
    // Explain code
    EXPLAIN_CODE                = 'EXPLAIN_CODE',
    // Optimize code
    OPTIMIZE_CODE               = 'OPTIMIZE_CODE',
    // Free input (direct text entry in the chat box)
    FREE_INPUT                  = 'FREE_INPUT',
    // Quick fix for code issues
    CODE_PROBLEM_SOLVE          = 'CODE_PROBLEM_SOLVE',
    // Generate shell commands
    TERMINAL_COMMAND_GENERATION = 'TERMINAL_COMMAND_GENERATION',
    // Fix terminal errors
    TERMINAL_EXPLAIN_FIX        = 'TERMINAL_EXPLAIN_FIX',
    // Code completion
    COMPLETION                  = 'COMPLETION',
}
Parâmetros de saída
/**
 * Post-processing result
 */
export class PostHandlerResponse {
  // Processing policy. Controls subsequent logic.
  handlePolicy: HandlePolicy;
  // Reason description
  reason?: string;
  // Processed inference result
  processedResult: InferredResult;
  constructor() {
    // Default values
    this.handlePolicy = HandlePolicy.NO_OPS;
    this.reason = '';
    this.processedResult = new InferredResult();
  }
}

/**
 * Encapsulates the LLM response
 */
export class AIResponse {
  // Inference result
  inferredResult: InferredResult;
  constructor() {
    this.inferredResult = new InferredResult();
  }
}

/**
 * Inference result from the model
 */
export class InferredResult {
  // Text generated by the LLM
  text: string;
  constructor() {
    this.text = '';
  }
}

/**
 * Processing policy enum (post-filters support only NO_OPS)
 */
export enum HandlePolicy {
  // Block the request
  BLOCK = 'BLOCK',
  // Filter the request and modify the payload
  FILTER = 'FILTER',
  // Take no action
  NO_OPS = 'NO_OPS',
}

Configurar filtros de upload da base de conhecimento (apenas Enterprise Dedicated Edition)

Na Enterprise Dedicated Edition, administradores do Qoder CN e administradores globais podem configurar filtros de upload da base de conhecimento. Após a configuração, os arquivos da base de conhecimento são revisados antes do upload.

Etapas de configuração

Etapa 1: Ativar e edite o filtro da base de conhecimento

  1. No painel de navegação à esquerda, clique em Policy Configuration. À direita, clique em aba Knowledge Base Filter.

  2. Na página de configuração do Knowledge Base Filter, ative a chave Enable or disable knowledge base upload pre-filter para editar os parâmetros.

    URL

    Obrigatório

    Endpoint para o seu serviço de verificação de terceiros. O serviço deve aceitar solicitações POST.

    Token field name

    Obrigatório

    Nome do campo de cabeçalho usado para armazenar o token.

    Secret key

    Obrigatório

    Chave secreta usada para gerar o token de acesso. O token é colocado no campo de cabeçalho especificado para verificar a legitimidade da solicitação. Consulte a seção Token Seguro.

Etapa 2: Testar conectividade

  1. Após inserir as informações corretas, clique em Test Connection. O teste terá sucesso se o filtro de terceiros retornar um código de status HTTP 2xx.

  2. Se outro código de status for retornado, o teste falhará. Verifique suas entradas e tente novamente.

Etapa 3: Salvar o filtro da base de conhecimento

Clique em Save Configuration para salve suas configurações de filtro. O filtro entra em vigor imediatamente após o salvamento.

API do serviço de verificação de terceiros

Sua empresa deve fornecer um serviço de verificação de terceiros que aceite solicitações POST. Apenas o conteúdo verificado pode ser enviado. A interface do serviço deve atender a estes requisitos:

Cabeçalhos da solicitação

Nome do parâmetro

Obrigatório

Descrição

Exemplos de parâmetro

X-Auth-Raw

Sim

Parâmetro de autenticação. O nome do parâmetro corresponde ao Token field name configurado no filtro. O valor é o token gerado a partir da chave secreta usando o algoritmo de criptografia. Consulte a seção Token Seguro para detalhes.

6c3baa76c62550eab864e6f75c4bb

Content-Type

Sim

Tipo de mídia para a solicitação e resposta.

multipart/form-data

  • Token Seguro: Uma assinatura segura projetada pela Alibaba Cloud para impedir que invasores mal-intencionados sequestrem as permissões do seu serviço em nuvem. Gerar um token requer uma chave secreta, timestamp atual, dados adicionais e um algoritmo de criptografia.

  • Geração de token: Quando o Qoder CN chama o serviço de verificação de terceiros, ele inclui o token seguro no cabeçalho da solicitação para autenticação. Calcule o token usando estes parâmetros:

    token = sha256Hex(method + url + timestamp + tokenSecret) + timestampHex

    method

    Método POST.

    url

    URL do endpoint do serviço de verificação que você inseriu na configuração do filtro da base de conhecimento.

    timestamp

    Timestamp atual.

    tokenSecret

    Chave secreta que você inseriu na configuração do filtro da base de conhecimento.

    timestampHex

    Timestamp convertido para hexadecimal.

  • Verificação de token: Seu serviço de verificação de terceiros pode usar o seguinte código para validar o token.

    Importante
    • Timestamp: Garanta que os relógios do cliente e do servidor estejam sincronizados para evitar falhas na validação do token devido a discrepâncias de horário.

    • Gerenciamento de chaves: Proteja o tokenSecret. Não o compartilhe com usuários não autorizados.

    • Expiração: Ajuste o tempo de vida do token com base nas necessidades do seu negócio. O exemplo define 60 segundos, mas você pode alterá-lo.

    /*
     *  Method parameters:
     *  receivedHash: Received hash, which includes the timestamp.
     *  tokenSecret: Secret key used to generate the hash.
     *  url: Request URL.
     */
    public boolean validateAuthRaw(String receivedHash, String tokenSecret, String url) {
        final String method = "POST";
        
        // Extract timestamp from receivedHash
        String tsHex = receivedHash.substring(receivedHash.length() - 8);
        long tsSec = Long.parseLong(tsHex, 16);
        
        // Compare timestamps. Allow up to 60 seconds difference.
        long now = System.currentTimeMillis() / 1000L;
        if (Math.abs(now - tsSec) > 60) {
            return false; // Timestamp outside allowed range
        }
        
        // Build string to sign
        String plain = method + url + tsSec + tokenSecret;
        
        // Generate expected hash
        String expectedHash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(plain);
        
        // Compare hashes
        return expectedHash.equals(receivedHash.substring(0, receivedHash.length() - 8));
    }

Parâmetros da solicitação

Nome do parâmetro

Tipo

Obrigatório

Descrição

Exemplo de parâmetro

metadata

string

Sim

Metadados de negócio. Content-Type: application/json

{"user": "user0000001",

"queryId": "cd2fd109-c4d4-489f-9b27-53752f7827d6"}

file

file

Sim

Arquivo a ser verificado

Exemplo de solicitação:

Content-Type: multipart/form-data; boundary=${bound}
--${bound}

Content-Disposition: form-data; name="metadata"

Content-Type: application/json
{
"user":"user0000001",
"queryID":"cd2fd109-c4d4-489f-9b27-53752f7827d6"
}

--${bound}
Content-Disposition: form-data; name="file"; filename="test-file.pdf"

Content-Type: application/pdf

%binary-file-content-here%

Estrutura da resposta

A interface deve retornar o código de status HTTP 200 e o seguinte formato de corpo de resposta.

Nome do parâmetro

Tipo

Obrigatório

Descrição

Exemplo de parâmetro

forbidden

boolean

Sim

Resultado da verificação de segurança. true significa que a verificação falhou.

false

errorMsg

string

Não

Mensagem de erro explicando por que a verificação falhou.

"File contains malicious content. Modify and re-upload."

queryId

string

Não

ID da solicitação. Deve corresponder ao campo queryId nos metadados da solicitação.

"cd2fd109-c4d4-489f-9b27-53752f7827d6"

user

string

Não

ID do usuário. Deve corresponder ao campo user nos metadados da solicitação.

"user0001"