All Products
Search
Document Center

AI Coding Assistant Lingma:Konfigurasi filter

Last Updated:Mar 12, 2026

Administrator Lingma Edisi Perusahaan dan administrator tingkat organisasi pada Edisi Eksklusif Perusahaan dapat mengonfigurasi kebijakan penyaringan keamanan untuk developer. Kebijakan ini berlaku untuk Chat AI, penyelesaian kode, dan unggahan basis pengetahuan.

Penting

Fitur ini hanya mendukung ekstensi Visual Studio Code dan JetBrains IDE. Fitur ini tidak tersedia di Lingma IDE.

Versi yang didukung

dan Edisi Eksklusif Perusahaan

Akses fitur

  1. Login ke Lingma console sebagai administrator Lingma atau administrator tingkat organisasi (hanya untuk Edisi Eksklusif Perusahaan). Di panel navigasi kiri, pilih Policy Configuration > Filter Configuration.

  2. Di bagian atas halaman, pilih tab berdasarkan skenario tempat Anda ingin menerapkan filter: AI Chat, Inline Code Generation, atau Knowledge Base Upload (hanya untuk Edisi Eksklusif Perusahaan).

  3. Aktifkan sakelar untuk setiap filter yang Anda perlukan, lalu konfigurasikan parameter terkait. Tabel berikut mencantumkan jenis filter yang didukung di setiap skenario:

    Skenario

    Jenis filter

    Deskripsi

    AI Chat

    AI Chat pre-filter

    Saat Anda menggunakan fitur AI Chat Lingma, input pengguna yang dikirim ke Large Language Model (LLM) melewati pre-filter. Output LLM melewati post-filter.

    AI Chat post-filter

    Inline Code Generation

    Inline Code Generation pre-filter

    Saat Anda menggunakan fitur Inline Code Generation Lingma, input pengguna yang dikirim ke LLM melewati pre-filter. Output LLM melewati post-filter.

    Inline Code Generation post-filter

    Knowledge Base Upload

    Knowledge Base Upload pre-filter

    File yang diunggah ke basis pengetahuan Lingma harus melewati filter ini sebelum unggahan berhasil.

    Penting
    • Pastikan developer melakukan upgrade ekstensi Lingma ke versi 1.4.0 atau lebih baru. Jika tidak, filter yang dikonfigurasi tidak akan berlaku.

    • Setelah Anda mengaktifkan atau memodifikasi AI Chat filter atau Inline Code Generation filter, perubahan memerlukan waktu sekitar 5 hingga 10 menit untuk berlaku bagi developer yang menggunakan ekstensi Lingma.

    • Setelah Anda mengaktifkan atau memodifikasi Knowledge Base Upload filter, perubahan berlaku segera. File yang diunggah ke basis pengetahuan perusahaan Anda langsung difilter.

Konfigurasi pre-filter untuk AI Chat dan Inline Code Generation

Metode 1: Konfigurasi dengan ekspresi reguler

Catatan

Administrator harus menguji ekspresi reguler secara menyeluruh untuk menghindari degradasi performa atau masalah lain saat developer menggunakan ekstensi IDE.

  • Metode pemrosesan: Konfigurasikan filter menggunakan ekspresi reguler. Tiga mode didukung.

    No action on match

    Tidak mengambil tindakan apa pun saat terjadi kecocokan.

    Block on match

    Memblokir permintaan dan menghentikan panggilan model saat terjadi kecocokan.

    Replace on match

    Mengganti konten sesuai konfigurasi saat terjadi kecocokan.

  • Notifikasi: Aktifkan notifikasi untuk mengirim peringatan ke platform pesan pilihan Anda menggunakan webhook.

  • Urutan eksekusi: Filter dijalankan sesuai urutan konfigurasi Anda.

  • Jumlah maksimum ekspresi reguler: Anda dapat menambahkan hingga 10 ekspresi.

  • Standar ekspresi reguler: Ekspresi mengikuti standar ECMAScript. Flag umum seperti i (case-insensitive), g (global), dan s (DOTALL) didukung.

  • Contoh konfigurasi:

    Nama aturan

    Ekspresi reguler

    Pengganti

    Teks asli

    Teks yang diganti

    ID number

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

    $<pre>***$<post>

    ID number: 330204197709022312.

    ID number: ***.

    Email address

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

    ***

    My email is lin***@aliyunmail.com

    My email is ***

    Password

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

    $1***$3

    {password=1213213}

    {password=***}

Metode 2: Konfigurasi dengan skrip kustom (hanya untuk Edisi Eksklusif Perusahaan)

Edisi Eksklusif Perusahaan mendukung penyaringan berbasis skrip kustom untuk menangani skenario pre-filtering yang kompleks. Ikuti langkah-langkah berikut:

Langkah 1: Kembangkan skrip

Anda dapat menulis skrip dalam TypeScript. Gunakan contoh kode sebagai referensi. Untuk memulai:

  1. Unduh repositori templat: Klik URL repositori: lingma-extension-template. Templat ini mencakup kerangka dasar untuk pengembangan skrip. Baca file README.md dan contoh kode dengan cermat.

  2. Implementasikan antarmuka pra-pemrosesan: Implementasikan antarmuka RequestPreHandler. Untuk detail API, lihat Custom Script API. Berikut adalah contoh implementasi dalam SensitiveContentFilter.ts:

    /**
     * Sensitive content filter. Pre-processes data sent to the model.
     */
    export const sensitiveContentFilter: RequestPreHandler = {
      handle: async (request: RawRequest, SDKTool: LingmaSDKTool) => {
        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. Jalankan dan debug skrip. Uji dengan menjalankan fungsi main. Ikuti langkah-langkah berikut:

    Langkah 1

    Edit file src/index.ts. Ubah fungsi main untuk menguji skrip Anda. Contoh:

    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);
    }

    Langkah 2

    Buka file skrip di VS Code dan atur breakpoint. Lalu, di tampilan Debug, pilih Launch Program dan klik Run.

    image

Langkah 2: Kompilasi dan Build

Kompilasi file TypeScript yang telah selesai menjadi JavaScript. Misalnya, kompilasi SensitiveContentFilter.ts menjadi SensitiveContentFilter.js. Ikuti langkah-langkah berikut:

  1. Buka file konfigurasi src/build.js. Perbarui parameter entryPoints dan outfile. Atur entryPoints ke path file TypeScript Anda. Atur outfile ke path output untuk file JavaScript yang dikompilasi.

  2. Jalankan perintah node build.js dari direktori root repositori Anda. Setelah berhasil dieksekusi, file JavaScript akan muncul di path yang ditentukan dalam outfile.

Langkah 3: Uji secara lokal

Sebelum mengunggah skrip Anda ke konsol konfigurasi perusahaan, uji secara lokal. Ini memastikan skrip terintegrasi dengan benar ke ekstensi IDE Lingma dan menerapkan penyaringan keamanan dengan benar untuk skenario penyelesaian kode atau Chat AI. Ikuti langkah-langkah berikut:

  1. Salin file JavaScript yang telah dikompilasi ke direktori /extension/local/script/ di bawah path penyimpanan lokal Lingma.

  2. Edit file config.json. File ini terletak di direktori /extension/local/ di bawah path penyimpanan lokal Lingma. Buka config.json dan cari contentHandlerScripts. Tambahkan konfigurasi skrip Anda. Jika contentHandlerScripts tidak ada, buat array baru. Contoh:

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

    Deskripsi parameter:

    Parameter

    Deskripsi

    identifier

    ID skrip. Harus unik.

    name

    Nama skrip.

    version

    Versi skrip. Tingkatkan nomor versi setelah mengubah skrip. Jika tidak, skrip tidak akan berlaku.

    scriptPath

    Path file skrip. Catatan:

    • Skrip harus ditempatkan di direktori /extension/local/script/ di bawah path penyimpanan lokal.

    • Nama file JavaScript (misalnya, SensitiveContentFilter.js) harus sesuai dengan nilai identifier.

    state

    Status skrip. enabled mengaktifkan skrip. disabled menonaktifkannya.

    bizType

    Skenario bisnis. completion berlaku untuk inline code generation. chat berlaku untuk AI chat.

Langkah 4: Unggah skrip

Setelah pengujian dan validasi lokal selesai, unggah skrip tersebut. Ikuti langkah-langkah berikut:

  1. Buka Lingma console. Pilih Policy Management. Pilih skenario tempat Anda ingin mengaktifkan filter keamanan.

  2. Pilih Custom Script sebagai opsi filter.

  3. Unggah file JavaScript yang telah dikompilasi.

  4. Klik Save Configuration. Konfigurasi akan berlaku pada ekstensi dalam waktu sekitar 5 menit.

Custom Script API

Skrip kustom mendukung tiga metode pemrosesan:

  • Block: Menghentikan pemrosesan lebih lanjut. Tidak ada panggilan inferensi ke LLM. Permintaan saat ini diakhiri.

  • Filter: Memodifikasi data yang dikirim (misalnya, mengaburkan, menghapus, atau mengganti konten), lalu melanjutkan pemrosesan.

  • No operation: Mengembalikan data tanpa perubahan dan melanjutkan pemrosesan.

Definisi antarmuka
/**
 * Pre-processing interface for Tongyi Lingma
 */
export interface RequestPreHandler {
  // Process the request
  handle: (request: RawRequest, SDKTool: LingmaSDKTool) => Promise<HandlerResponse>;
}
Parameter input
/**
 * 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',
}
Parameter output
/**
 * 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',
}

Konfigurasi post-filter untuk AI Chat dan Inline Code Generation

Metode 1: Konfigurasi dengan ekspresi reguler

Catatan

Administrator harus menguji ekspresi reguler secara menyeluruh untuk menghindari degradasi performa atau masalah lain saat developer menggunakan ekstensi IDE.

  • Metode pemrosesan: Konfigurasikan filter menggunakan ekspresi reguler. Hanya satu mode yang didukung:

    No action on match

    Tidak mengambil tindakan apa pun saat terjadi kecocokan.

  • Notifikasi: Aktifkan notifikasi untuk mengirim peringatan ke platform pesan pilihan Anda menggunakan webhook.

  • Urutan eksekusi: Filter dijalankan sesuai urutan konfigurasi Anda.

  • Jumlah maksimum ekspresi reguler: Anda dapat menambahkan hingga 10 ekspresi.

  • Standar ekspresi reguler: Ekspresi mengikuti standar ECMAScript. Flag umum seperti i (case-insensitive), g (global), dan s (DOTALL) didukung.

  • Contoh konfigurasi:

    Nama aturan

    Ekspresi reguler

    Teks asli

    ID number

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

    ID number: 330204197709022312.

    Email address

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

    My email is lin***@aliyunmail.com

    Password

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

    {password=1213213}

Metode 2: Konfigurasi dengan skrip kustom (hanya untuk Edisi Eksklusif Perusahaan)

Edisi Eksklusif Perusahaan mendukung penyaringan berbasis skrip kustom untuk menangani skenario post-filtering yang kompleks. Ikuti langkah-langkah berikut:

Langkah 1: Kembangkan skrip

Anda dapat menulis skrip dalam TypeScript. Gunakan contoh kode sebagai referensi. Untuk memulai:

  1. Unduh repositori templat: Klik URL repositori: lingma-extension-template. Templat ini mencakup kerangka dasar untuk pengembangan skrip. Baca file README.md dan contoh kode dengan cermat.

  2. Implementasikan antarmuka pasca-pemrosesan: Implementasikan antarmuka RequestPostHandler. Untuk API-nya, lihat Custom Script API. Berikut adalah contoh implementasi dari potongan kode LLMChatAuditHandler.ts, yang melakukan audit operasi AIChat Lingma dan melaporkan konten audit ke Alibaba Cloud SLS.

    import {ResultUtil} from '../common/HandlerRespUtil';
    import { JsonUtil } from '../common/JsonUtil';
    import {PayloadUtil} from '../common/PayloadUtil';
    import {Config} from '../sdk/ConfigManager';
    import {LingmaSDKTool} from '../sdk/LingmaSDKTool';
    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: LingmaSDKTool) => {
         // 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 LingmaExtensionSDK
     */
    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. Jalankan dan debug skrip. Uji dengan menjalankan fungsi main. Ikuti langkah-langkah berikut:

    Langkah 1

    Edit file src/index.ts. Ubah fungsi main untuk menguji skrip Anda. Contoh:

    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);
    }

    Langkah 2

    Buka file skrip di VS Code dan atur breakpoint. Lalu, di tampilan Debug, pilih Launch Program dan klik Run.

    image

Langkah 2: Kompilasi dan Build

Kompilasi file TypeScript yang telah selesai menjadi JavaScript. Misalnya, kompilasi LLMChatAuditHandler.ts menjadi LLMChatAuditHandler.js. Ikuti langkah-langkah berikut:

  1. Buka file konfigurasi src/build.js. Perbarui parameter entryPoints dan outfile. Atur entryPoints ke path file TypeScript Anda. Atur outfile ke path output untuk file JavaScript yang dikompilasi.

  2. Jalankan perintah node build.js dari direktori root repositori Anda. Setelah berhasil dieksekusi, file JavaScript akan muncul di path yang ditentukan dalam outfile.

Langkah 3: Uji secara lokal

Sebelum mengunggah skrip Anda ke konsol konfigurasi perusahaan, uji secara lokal. Ini memastikan skrip terintegrasi dengan benar ke ekstensi IDE Lingma dan menerapkan penyaringan keamanan dengan benar untuk skenario penyelesaian kode atau Chat AI. Ikuti langkah-langkah berikut:

  1. Salin file JavaScript yang telah dikompilasi ke direktori /extension/local/script/ di bawah path penyimpanan lokal Lingma.

  2. Edit file config.json. File ini terletak di direktori /extension/local/ di bawah path penyimpanan lokal Lingma. Buka config.json dan cari contentHandlerScripts. Tambahkan konfigurasi skrip Anda. Jika contentHandlerScripts tidak ada, buat array baru. Contoh:

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

    Deskripsi parameter:

    Parameter

    Deskripsi

    identifier

    ID skrip. Harus unik.

    name

    Nama skrip.

    version

    Versi skrip. Tingkatkan nomor versi setelah mengubah skrip. Jika tidak, skrip tidak akan berlaku.

    scriptPath

    Path file skrip. Catatan:

    • Skrip harus ditempatkan di direktori /extension/local/script/ di bawah path penyimpanan lokal.

    • Nama file JavaScript (misalnya, LLMChatAuditHandler.js) harus sesuai dengan nilai identifier.

    state

    Status skrip. enabled mengaktifkan skrip. disabled menonaktifkannya.

    stage

    Tahap pemrosesan. post berarti post-filter. pre berarti pre-filter. Nilai default adalah pre.

    bizType

    Skenario bisnis. completion berlaku untuk inline code generation. chat berlaku untuk AI chat.

Langkah 4: Unggah skrip

Setelah pengujian dan validasi lokal selesai, unggah skrip tersebut. Ikuti langkah-langkah berikut:

  1. Buka Lingma console. Pilih Policy Management. Pilih skenario tempat Anda ingin mengaktifkan filter keamanan.

  2. Pilih Custom Script sebagai opsi filter.

  3. Unggah file JavaScript yang telah dikompilasi.

  4. Klik Save Configuration. Konfigurasi akan berlaku pada ekstensi dalam waktu sekitar 5 menit.

Custom Script API

Skrip kustom hanya mendukung satu metode pemrosesan:

  • No operation: Mengembalikan data tanpa perubahan dan melanjutkan pemrosesan.

Definisi antarmuka
/**
 * Post-processing interface for Tongyi Lingma
 * @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: LingmaSDKTool) => Promise<PostHandlerResponse>;
}
Parameter input
/**
 * 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',
}
Parameter output
/**
 * 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',
}

Konfigurasi Filter Unggahan Basis Pengetahuan (hanya untuk Edisi Eksklusif Perusahaan)

Pada Edisi Eksklusif Perusahaan, administrator dan Lingma serta administrator global dapat mengonfigurasi filter basis pengetahuan dalam konfigurasi kebijakan. Setelah dikonfigurasi, file basis pengetahuan akan ditinjau sebelum diunggah untuk memenuhi kebutuhan penyaringan pra-unggah konten basis pengetahuan dalam skenario tertentu.

Detail konfigurasi filter

Langkah 1: Aktifkan dan edit filter basis pengetahuan

  1. Di panel navigasi kiri, klik Policy Configuration. Di sebelah kanan, klik tab Knowledge Base Filter.

  2. Di halaman konfigurasi Knowledge Base Filter, aktifkan sakelar Enable or disable knowledge base upload pre-filter untuk mengedit parameter.

    URL

    Wajib

    Titik akhir untuk layanan pemindaian pihak ketiga Anda. Layanan ini harus menerima permintaan POST.

    Token field name

    Wajib

    Nama bidang header yang digunakan untuk menyimpan token.

    Secret key

    Wajib

    Kunci rahasia yang digunakan untuk menghasilkan token akses. Token ditempatkan di bidang header yang ditentukan untuk memverifikasi legitimasi permintaan. Untuk informasi selengkapnya, lihat bagian Secure Token.

Langkah 2: Uji konektivitas

  1. Setelah memasukkan informasi yang benar, klik Test Connection. Pengujian berhasil jika filter pihak ketiga mengembalikan kode status HTTP 2xx.

  2. Jika kode status lain dikembalikan, pengujian gagal. Periksa entri Anda dan coba lagi.

Langkah 3: Simpan filter basis pengetahuan

Klik Save Configuration untuk menyimpan pengaturan filter Anda. Filter berlaku segera setelah disimpan.

Spesifikasi antarmuka layanan pemindaian pihak ketiga

Perusahaan Anda harus menyediakan layanan pemindaian pihak ketiga. Filter basis pengetahuan menggunakan layanan ini untuk memindai konten yang diunggah. Hanya konten yang telah dipindai yang dapat diunggah. Untuk memastikan filter Anda berfungsi dengan benar, antarmuka layanan pemindaian harus memenuhi persyaratan berikut:

Header permintaan

Nama parameter

Wajib

Deskripsi

Contoh parameter

X-Auth-Raw

Ya

Parameter otentikasi. Nama parameter sesuai dengan Token field name yang Anda masukkan dalam konfigurasi filter. Nilai parameter adalah token akhir yang dihasilkan dari kunci rahasia menggunakan algoritma enkripsi. Lihat bagian Secure Token untuk detailnya.

6c3baa76c62550eab864e6f75c4bb

Content-Type

Ya

Jenis media untuk permintaan dan respons.

multipart/form-data

  • Secure Token: Tanda tangan aman yang dirancang oleh Alibaba Cloud untuk mencegah penyerang jahat membajak izin layanan cloud Anda. Menghasilkan token memerlukan kunci rahasia, timestamp saat ini, data tambahan, dan algoritma enkripsi.

  • Generasi token: Saat Lingma memanggil layanan pemindaian pihak ketiga, token aman disertakan dalam header permintaan untuk otentikasi. Hitung token menggunakan parameter berikut:

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

    method

    Metode POST.

    url

    URL titik akhir layanan pemindaian yang Anda masukkan dalam konfigurasi filter basis pengetahuan.

    timestamp

    Timestamp saat ini.

    tokenSecret

    Kunci rahasia yang Anda masukkan dalam konfigurasi filter basis pengetahuan.

    timestampHex

    Timestamp yang dikonversi ke heksadesimal.

  • Verifikasi token: Layanan pemindaian pihak ketiga Anda dapat menggunakan kode berikut untuk memvalidasi token.

    Penting
    • Timestamp: Pastikan jam klien dan server disinkronkan untuk menghindari kegagalan validasi token akibat perbedaan waktu.

    • Manajemen kunci: Lindungi tokenSecret. Jangan bagikan kepada pengguna yang tidak berwenang.

    • Kadaluarsa: Sesuaikan masa berlaku token berdasarkan kebutuhan bisnis Anda. Contoh menetapkannya selama 60 detik, tetapi Anda dapat mengubahnya.

    /*
     *  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));
    }

Parameter permintaan

Nama parameter

Type

Wajib

Deskripsi

Contoh Parameter

metadata

string

Ya

Metadata bisnis. Content-Type: application/json

{"user": "user0000001",

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

file

file

Ya

File untuk dipindai

Contoh permintaan:

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%

Struktur respons

Antarmuka harus mengembalikan kode status HTTP 200 dan format badan respons berikut.

Nama parameter

Tipe

Wajib

Deskripsi

Contoh Parameter

forbidden

boolean

Ya

Hasil pemeriksaan keamanan. true berarti pemeriksaan gagal.

false

errorMsg

string

Tidak

Pesan kesalahan yang menjelaskan mengapa pemeriksaan gagal.

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

queryId

string

Tidak

ID permintaan. Harus sesuai dengan bidang queryId dalam metadata permintaan.

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

user

string

Tidak

ID pengguna. Harus sesuai dengan bidang user dalam metadata permintaan.

"user0001"