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
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
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 .
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).
-
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.
ImportanteGaranta 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
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) es(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.
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.mde os exemplos de código.-
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 emSensitiveContentFilter.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(); }, }; -
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çãomainpara 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.

Etapa 2: Compilar e construir
Compile TypeScript para JavaScript. Por exemplo, compile SensitiveContentFilter.ts em SensitiveContentFilter.js:
Abra o arquivo de configuração
src/build.js. Atualize os parâmetrosentryPointseoutfile. DefinaentryPointscomo o caminho do seu arquivo TypeScript. Definaoutfilecomo o caminho de saída para o arquivo JavaScript compilado.Execute o comando
node build.jsno diretório raiz do seu repositório. Após a execução bem-sucedida, o arquivo JavaScript aparecerá no caminho especificado emoutfile.
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.
Copie o arquivo JavaScript compilado para o diretório
/extension/local/script/dentro do caminho de armazenamento local do Qoder CN.-
Edite o arquivo
config.json. Este arquivo está localizado no diretório/extension/local/dentro do caminho de armazenamento local do Qoder CN. Abra oconfig.jsone localizecontentHandlerScripts. Adicione a configuração do seu script. SecontentHandlerScriptsnã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 deidentifier.
state
Estado do script.
enabledativa o script.disabledo desativa.bizType
Cenário de negócio.
completionaplica-se à geração de código inline.chataplica-se ao chat de IA. -
Etapa 4: Fazer upload do script
Após o teste local, faça o upload do script:
Acesse o console do Qoder CN. Escolha Policy Management. Selecione o cenário onde deseja ativar o filtro de segurança.
Selecione Custom Script como opção de filtro.
Faça o upload do arquivo JavaScript compilado.
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
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) es(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.
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.mde os exemplos de código.-
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ódigoLLMChatAuditHandler.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"; } -
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çãomainpara 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.

Etapa 2: Compilar e construir
Compile TypeScript para JavaScript. Por exemplo, compile LLMChatAuditHandler.ts em LLMChatAuditHandler.js:
Abra o arquivo de configuração
src/build.js. Atualize os parâmetrosentryPointseoutfile. DefinaentryPointscomo o caminho do seu arquivo TypeScript. Definaoutfilecomo o caminho de saída para o arquivo JavaScript compilado.Execute o comando
node build.jsno diretório raiz do seu repositório. Após a execução bem-sucedida, o arquivo JavaScript aparecerá no caminho especificado emoutfile.
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.
Copie o arquivo JavaScript compilado para o diretório
/extension/local/script/dentro do caminho de armazenamento local do Qoder CN.-
Edite o arquivo
config.json. Este arquivo está localizado no diretório/extension/local/dentro do caminho de armazenamento local do Qoder CN. Abra oconfig.jsone localizecontentHandlerScripts. Adicione a configuração do seu script. SecontentHandlerScriptsnã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 deidentifier.
state
Estado do script.
enabledativa o script.disabledo desativa.stage
Estágio de processamento.
postsignifica pós-filtro.presignifica pré-filtro. O padrão épre.bizType
Cenário de negócio.
completionaplica-se à geração de código inline.chataplica-se ao chat de IA. -
Etapa 4: Fazer upload do script
Após o teste local, faça o upload do script:
Acesse o console do Qoder CN. Escolha Policy Management. Selecione o cenário onde deseja ativar o filtro de segurança.
Selecione Custom Script como opção de filtro.
Faça o upload do arquivo JavaScript compilado.
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
No painel de navegação à esquerda, clique em Policy Configuration. À direita, clique em aba Knowledge Base Filter.
-
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
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.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) + timestampHexmethod
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.
ImportanteTimestamp: 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" |