すべてのプロダクト
Search
ドキュメントセンター

AI Coding Assistant Lingma:フィルターの設定

最終更新日:Mar 12, 2026

Lingma Enterprise Edition の管理者および Enterprise Exclusive Edition の組織全体の管理者は、開発者のセキュリティフィルタリングポリシーを設定できます。これらのポリシーは、AI チャット、コード補完、およびナレッジベースのアップロードに適用されます。

重要

この機能は、Visual Studio Code および JetBrains IDE の拡張機能のみをサポートしています。Lingma IDE では利用できません。

サポート対象バージョン

および エンタープライズ排他的エディション

機能へのアクセス

  1. Lingma コンソール」に、Lingma 管理者または組織全体の管理者(エンタープライズ専用エディションのみ)としてログインします。左側のナビゲーションウィンドウで、[ポリシー設定] > [フィルター設定] を選択します。

  2. ページの上部で、フィルターを適用するシナリオに基づいてタブを選択します:[AI チャット][インラインコード生成]、または [ナレッジベースのアップロード] (Enterprise Exclusive Edition のみ)。

  3. 必要な各フィルターのスイッチをオンにし、関連するパラメーターを設定します。次の表に、各シナリオでサポートされているフィルターの種類を示します。

    シナリオ

    フィルターの種類

    説明

    AI チャット

    AI チャットプレフィルター

    Lingma」の AI Chat 機能を使用する場合、大規模言語モデル (LLM) に送信されるユーザー入力は事前フィルターを通過します。LLM の出力は事後フィルターを通過します。

    AI チャットポストフィルター

    インラインコード生成

    インラインコード生成プレフィルター

    「インライン コード生成」機能を使用すると、Lingma に送信されるユーザー入力はプリフィルターを通過します。LLM の出力はポストフィルターを通過します。

    インラインコード生成ポストフィルター

    ナレッジベースのアップロード

    ナレッジベースアップロードプレフィルター

    Lingma ナレッジベースにアップロードされるファイルは、アップロードが成功する前に、このフィルターを通過する必要があります。

    重要
    • 開発者が各自の Lingma 拡張機能をバージョン 1.4.0 以降にアップグレードするようにしてください。そうしないと、設定済みのフィルターは有効になりません。

    • AIチャットフィルター」または「インラインコード生成フィルター」を有効化または変更した後、Lingma 拡張を使用する開発者に対しては、変更が反映されるまで約 5~10 分かかります。

    • [ナレッジベース アップロード フィルター]」を有効化または変更すると、変更はすぐに有効になります。エンタープライズ ナレッジベースにアップロードされたファイルはすぐにフィルターされます。

AI チャットとインラインコード生成のプレフィルターの設定

方法 1:正規表現による設定

説明

管理者は、開発者が IDE 拡張機能を使用する際のパフォーマンス低下やその他の問題を回避するために、正規表現を十分にテストする必要があります。

  • 処理メソッド:正規表現を使用してフィルターを設定します。3 つのモードがサポートされています。

    一致時にアクションなし

    一致が発生した場合、アクションは実行されません。

    一致時にブロック

    一致が発生した場合、リクエストをブロックし、モデルの呼び出しを停止します。

    一致時に置換

    一致が発生した場合、設定に従ってコンテンツを置換します。

  • 通知:通知を有効にして、Webhook を使用して任意のメッセージングプラットフォームにアラートを送信します。

  • 実行順序:フィルターは設定した順序で実行されます。

  • 正規表現の最大数:最大 10 個の式を追加できます。

  • 正規表現の標準:式は ECMAScript 標準に従います。i (大文字と小文字を区別しない)、g (グローバル)、s (DOTALL) などの一般的なフラグがサポートされています。

  • 設定例:

    ルール名

    正規表現

    置換

    元のテキスト

    置換後のテキスト

    ID 番号

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

    $<pre>***$<post>

    ID number: 330204197709022312.

    ID number: ***.

    メールアドレス

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

    ***

    My email is lin***@aliyunmail.com

    My email is ***

    パスワード

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

    $1***$3

    {password=1213213}

    {password=***}

方法 2:カスタムスクリプトによる設定 (Enterprise Exclusive Edition のみ)

Enterprise Exclusive Edition は、複雑なプレフィルターシナリオを処理するために、カスタムスクリプトベースのフィルタリングをサポートしています。次の手順に従ってください。

ステップ 1:スクリプトの開発

TypeScript でスクリプトを作成できます。サンプルコードをリファレンスとして使用してください。開始するには:

  1. テンプレートリポジトリのダウンロード:リポジトリ URL をクリックします:lingma-extension-template。このテンプレートには、スクリプト開発用のスキャフォールディングが含まれています。README.md ファイルとコード例をよくお読みください。

  2. 前処理インターフェイスの実装:RequestPreHandler インターフェイスを実装します。API の詳細については、「カスタムスクリプト API」をご参照ください。以下は SensitiveContentFilter.ts の実装例です。

    /**
     * 機密コンテンツフィルター。モデルに送信されるデータを前処理します。
     */
    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');
          }
        }
        // さまざまなアクションを異なる方法で処理します
        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. スクリプトの実行とデバッグ。main 関数を実行してテストします。次の手順に従ってください。

    ステップ 1

    src/index.ts ファイルを編集します。main 関数を変更してスクリプトをテストします。例:

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

    ステップ 2

    VS Code でスクリプトファイルを開き、ブレークポイントを設定します。次に、デバッグビューで [プログラムの起動] を選択し、[実行] をクリックします。

    image

ステップ 2:コンパイルとビルド

完成した TypeScript ファイルを JavaScript にコンパイルします。たとえば、SensitiveContentFilter.tsSensitiveContentFilter.js にコンパイルします。次の手順に従ってください。

  1. 設定ファイル src/build.js を開きます。entryPointsoutfile パラメーターを更新します。entryPoints を TypeScript ファイルのパスに設定します。outfile をコンパイルされた JavaScript ファイルの出力パスに設定します。

  2. リポジトリのルートディレクトリからコマンド node build.js を実行します。実行が成功すると、outfile で指定されたパスに JavaScript ファイルが表示されます。

ステップ 3:ローカルでのテスト

エンタープライズ構成コンソールにスクリプトをアップロードする前に、ローカルでテストしてください。こうすることで、スクリプトが Lingma IDE 拡張と正しく統合され、コード補完や AI チャットのシナリオでセキュリティフィルタリングが正しく適用されることが保証されます。次の手順に従ってください。

  1. コンパイル済みのJavaScriptファイルを、Lingma のローカル記憶域のパスにある /extension/local/script/ ディレクトリにコピーします。

  2. config.json」ファイルを編集します。このファイルは、Lingma のローカル記憶域のパスにある「/extension/local/」ディレクトリにあります。「config.json」を開き、「contentHandlerScripts」を探します。スクリプトの構成を追加します。「contentHandlerScripts」が存在しない場合は、新しい配列を作成します。例:

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

    パラメーターの説明:

    パラメーター

    説明

    identifier

    スクリプト ID。一意である必要があります。

    name

    スクリプト名。

    version

    スクリプトのバージョン。スクリプトを変更した後は、バージョン番号をインクリメントしてください。そうしないと、スクリプトは有効になりません。

    scriptPath

    スクリプトファイルのパス。注意:

    • スクリプトは、ローカルストレージパスの下の /extension/local/script/ ディレクトリに配置する必要があります。

    • JavaScript ファイル名 (例:SensitiveContentFilter.js) は、identifier の値と一致する必要があります。

    state

    スクリプトの状態。enabled はスクリプトを有効にします。disabled は無効にします。

    bizType

    ビジネスシナリオ。completion はインラインコード生成に適用されます。chat は AI チャットに適用されます。

ステップ 4:スクリプトのアップロード

ローカルでのテストと検証の後、スクリプトをアップロードします。次の手順に従ってください。

  1. Lingma コンソールに移動します。ポリシー管理を選択します。セキュリティフィルターを有効にするシナリオを選択します。

  2. フィルターオプションとしてカスタムスクリプトを選択します。

  3. コンパイルされた JavaScript ファイルをアップロードします。

  4. [設定を保存] をクリックします。設定は、約 5 分以内に拡張機能で有効になります。

カスタムスクリプト API

カスタムスクリプトは、3 つの処理メソッドをサポートしています。

  • ブロック:それ以上の処理を停止します。LLM への推論呼び出しは行われません。現在のリクエストは終了します。

  • フィルター:送信されるデータを変更し (たとえば、難読化、削除、または置換)、処理を続行します。

  • 操作なし:データを変更せずに返し、処理を続行します。

インターフェイスの定義
/**
 * Tongyi Lingma の前処理インターフェイス
 */
export interface RequestPreHandler {
  // リクエストを処理します
  handle: (request: RawRequest, SDKTool: LingmaSDKTool) => Promise<HandlerResponse>;
}
入力パラメーター
/**
 * リクエストオブジェクト。LLM に送信されるアクションと生データを含みます。
 */
export interface RawRequest {
  // リクエストの一意の識別子。トレースに使用されます。
  action: ActionEnum;
  // リクエストをトリガーしたアクションの Enum。
  payload: ContentPayload;
  // 生データを含むペイロード。
  requestId: string;
}

// ContentPayload.data の値の型
export type PayloadDataValueType = string | number | string[];
/**
 * LLM に送信される生データを含むペイロード。
 */
export class ContentPayload {
  // 処理するデータのコレクション。キーは ContextValueKeyEnum で定義されます。
  data: Map<PayloadDataKeyEnum, PayloadDataValueType>;
  // 処理に関連付けられたコンテキスト。
  associatedContexts: ContextItem[];

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

/**
 * ContentPayload.data のキー
 */
export enum PayloadDataKeyEnum {
  // 選択されたコードスニペット
  SELECTED_CODE ='lingma:code',
  // ユーザー入力テキスト
  USER_INPUT = 'lingma:text',
  // エラーメッセージ
  ERROR_MESSAGES = 'lingma:error_messages',
  // ターミナルログ出力
  TERMINAL_CONTENT = 'lingma:terminal_content',
  // コード補完のためのカーソル前のコード
  PREFIX_CODE = 'lingma:code_prefix',
  // コード補完のためのカーソル後のコード
  SUFFIX_CODE = 'lingma:code_suffix',
  // 類似のコードスニペット
  SIMILAR_CODE = 'lingma:similar_code',
}

/**
 * リクエストアクションの Enum
 */
export enum ActionEnum {
    // ユニットテスト
    GENERATE_TESTCASE           = 'GENERATE_TESTCASE',
    // コメントの生成
    CODE_GENERATE_COMMENT       = 'CODE_GENERATE_COMMENT',
    // コードの説明
    EXPLAIN_CODE                = 'EXPLAIN_CODE',
    // コードの最適化
    OPTIMIZE_CODE               = 'OPTIMIZE_CODE',
    // フリー入力 (チャットボックスでの直接テキスト入力)
    FREE_INPUT                  = 'FREE_INPUT',
    // コードの問題のクイックフィックス
    CODE_PROBLEM_SOLVE          = 'CODE_PROBLEM_SOLVE',
    // シェルコマンドの生成
    TERMINAL_COMMAND_GENERATION = 'TERMINAL_COMMAND_GENERATION',
    // ターミナルエラーの修正
    TERMINAL_EXPLAIN_FIX        = 'TERMINAL_EXPLAIN_FIX',
    // コード補完
    COMPLETION                  = 'COMPLETION',
}
出力パラメーター
/**
 * 前処理の結果
 */
export class HandlerResponse {
  // 処理ポリシー。後続のロジックを制御します。
  handlePolicy: HandlePolicy;
  // 理由の説明
  reason?: string;
  // handlePolicy=FILTER の場合に必須。フィルターされたデータを含みます。ContentRequest.payload 構造と一致する必要があります。
  payload?: ContentPayload;
  constructor() {
    // デフォルト値
    // eslint-disable-next-line @typescript-eslint/no-use-before-define
    this.handlePolicy = HandlePolicy.NO_OPS;
    this.reason = '';
    this.payload = new ContentPayload();
  }
}

/**
 * 処理ポリシーの Enum
 */
export enum HandlePolicy {
  // リクエストをブロック
  BLOCK = 'BLOCK',
  // リクエストをフィルターし、ペイロードを変更
  FILTER = 'FILTER',
  // アクションなし
  NO_OPS = 'NO_OPS',
}

AI チャットとインラインコード生成の後処理フィルターの設定

方法1:正規表現による設定

説明

管理者は、開発者が IDE 拡張機能を使用する際にパフォーマンスの低下やその他の問題が発生しないよう、正規表現を十分にテストする必要があります。

  • 処理メソッド:正規表現を使用してフィルターを設定します。サポートされているモードは 1 つだけです:

    一致時にアクションなし

    一致が発生した場合、アクションは実行されません。

  • 通知:通知を有効にすると、Webhook を使用して任意のメッセージングプラットフォームにアラートを送信できます。

  • 実行順序:フィルターは設定した順序で実行されます。

  • 正規表現の最大数:最大 10 個の式を追加できます。

  • 正規表現の標準:式は ECMAScript 標準に準拠しており、i (大文字と小文字を区別しない)、g (グローバル)、s (DOTALL) などの一般的なフラグがサポートされています。

  • 設定例:

    ルール名

    正規表現

    元のテキスト

    ID 番号

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

    ID number: 330204197709022312.

    メールアドレス

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

    My email is lin***@aliyunmail.com

    パスワード

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

    {password=1213213}

方法2:カスタムスクリプトによる設定 (Enterprise Exclusive Edition のみ)

Enterprise Exclusive Edition は、複雑な後処理シナリオに対応するため、カスタムスクリプトベースのフィルタリングをサポートしています。次の手順に従ってください:

ステップ1:スクリプトの開発

スクリプトは TypeScript で記述できます。サンプルコードをリファレンスとして使用してください。開始するには:

  1. テンプレートリポジトリをダウンロードします: リポジトリの URL をクリックします: lingma-extension-template。このテンプレートには、スクリプト開発のためのスキャフォールディングが含まれています。「README.md」ファイルおよびコード例をよく読みます。

  2. 後処理インターフェイスを実装する: RequestPostHandler インターフェイスを実装します。API については、「Custom Script API」をご参照ください。以下は、コードスニペット LLMChatAuditHandler.ts からの実装例です。このコードスニペットは、 Lingma の AIChat 操作を監査し、監査内容を 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';
    
    /**
     * カスタム後処理フィルタースクリプト。リクエストコンテンツをリモートサーバーに送信して処理します (コードスキャンやコンテンツ監査など)。
     */
    export const llmResultAuditHandler: RequestPostHandler = {
      handle: async (request: RawRequest, response: AIResponse,SDKTool: LingmaSDKTool) => {
         // オペレーター名
         let userName = SDKTool.user.name;
         // オペレーター ID
         let userId = SDKTool.user.uid;
         // IDE
         let ide = SDKTool.idePlatform;
         // IDE バージョン
         let ideVersion = SDKTool.ideVersion;     
         // 操作時間
         let operationTime = moment().format("YYYY-MM-DD HH:mm:ss");
         // 操作 IP
         let opeartionIp = getIpAddress();
         // ビジネスシナリオ (補完またはチャット)
         let bizType = "chat";
         // リクエスト ID
         let requestId = request.requestId;
         // アクション
         let action = request.action;
         // 操作内容 (監査ニーズに基づいてフィールドを選択します。16 KB を超える大きなペイロードは避けてください。)
         let inferredResult = response.inferredResult.text;
        
         // SLS にレポート
         // SLS プロジェクト名
         let slsProject = "xxx";
         // SLS LogStore 名
         let slsLogStore = "xxx";
         // SLS エンドポイント
         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 ResultUtil.buildPostHandlerResponse(HandlePolicy.NO_OPS, response.inferredResult,'No action required');
      },
    };
    
    /**
     * カスタムスクリプトフィルターを構成に追加します
     * @param config LingmaExtensionSDK によって提供される Config オブジェクト
     */
    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. スクリプトを実行およびデバッグします。main 関数を実行してテストします。次の手順に従います:

    ステップ1

    src/index.ts ファイルを編集します。main 関数を修正して、スクリプトをテストします。例:

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

    ステップ2

    VS Code でスクリプトファイルを開き、ブレークポイントを設定します。次に、デバッグビューで [Launch Program] を選択し、[Run] をクリックします。

    image

ステップ2:コンパイルとビルド

完成した TypeScript ファイルを JavaScript にコンパイルします。たとえば、LLMChatAuditHandler.tsLLMChatAuditHandler.js にコンパイルします。次のステップに従います。

  1. 構成ファイル src/build.js を開きます。 entryPointsoutfile パラメーターを更新します。 entryPoints を TypeScript ファイルのパスに設定します。 outfile をコンパイルされた JavaScript ファイルの出力パスに設定します。

  2. コマンド node build.js を、リポジトリのルートディレクトリから実行します。正常に実行されると、JavaScript ファイルが outfile で指定されたパスに表示されます。

ステップ3:ローカルでのテスト

スクリプトを企業向け設定コンソールにアップロードする前に、ローカルでテストしてください。これにより、スクリプトがLingma IDE 拡張機能と正しく統合され、コード補完または AI チャットのシナリオでセキュリティフィルターが正しく適用されることを確認できます。次の手順に従ってください:

  1. コンパイル済みの JavaScript ファイルを、Lingma のローカル記憶域のパス配下にある /extension/local/script/ ディレクトリにコピーします。

  2. config.json ファイルを編集します。このファイルは、Lingma のローカル記憶域パスの下にある /extension/local/ ディレクトリにあります。config.json を開いて、contentHandlerScripts を見つけてください。スクリプトの構成を追加します。contentHandlerScripts が存在しない場合は、新しい配列を作成します。例:

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

    パラメーターの説明:

    パラメーター

    説明

    identifier

    スクリプト ID。一意である必要があります。

    name

    スクリプト名。

    version

    スクリプトのバージョン。スクリプトを変更した後は、バージョン番号をインクリメントしてください。そうしないと、スクリプトは有効になりません。

    scriptPath

    スクリプトファイルパス。注意:

    • スクリプトは、ローカル記憶域パスの下にある/extension/local/script/ディレクトリに配置する必要があります。

    • JavaScript ファイル名 (たとえば、LLMChatAuditHandler.js) は、identifier の値と一致する必要があります。

    state

    スクリプトの状態です。 enabled はスクリプトを有効にし、disabled は無効にします。

    stage

    処理ステージ。post はポストフィルターを意味します。pre はプレフィルターを意味します。デフォルトは pre です。

    bizType

    ビジネスシナリオ。completion はインラインコード生成に、chat は AI チャットに適用されます。

ステップ4:スクリプトのアップロード

ローカルでのテストと検証が完了したら、スクリプトをアップロードします。次の手順に従ってください:

  1. Tongyi Lingma Lingma コンソールに移動します。[ポリシー管理]を選択します。セキュリティフィルターを有効にするシナリオを選択します。

  2. フィルターオプションとして [カスタムスクリプト] を選択します。

  3. コンパイルされた JavaScript ファイルをアップロードします。

  4. [構成の保存] をクリックします。構成は約 5 分で拡張機能に反映されます。

カスタムスクリプト API

カスタムスクリプトは、1 つの処理メソッドのみをサポートします:

  • 操作なし:データを変更せずに返し、処理を続行します。

インターフェイスの定義
/**
 * Lingma の後処理インターフェイス
 * @param request ユーザーリクエスト
 * @param response 大規模言語モデル (LLM) からの推論結果
 * @param SDKTool SDK ユーティリティクラス。IDE とプラグイン情報を提供します。
 * @returns 後処理後の結果
 */
export interface RequestPostHandler {
  // 後処理メソッド
  handle: (request: RawRequest, response: AIResponse, SDKTool: LingmaSDKTool) => Promise<PostHandlerResponse>;
}
入力パラメーター
/**
 * リクエストオブジェクト。アクションと LLM に送信される生データを含みます。
 */
export interface RawRequest {
  // リクエストの一意の識別子。トレースに使用されます。
  action: ActionEnum;
  // リクエストをトリガーしたアクションの Enum。
  payload: ContentPayload;
  // 生データを含むペイロード。
  requestId: string;
}

/**
 * モデルからの推論結果
 */
export class InferredResult {
  // LLM によって生成されたテキスト
  text: string;
  constructor() {
    this.text = '';
  }
}

// ContentPayload.data の値の型
export type PayloadDataValueType = string | number | string[];
/**
 * LLM に送信される生データを含むペイロード。
 */
export class ContentPayload {
  // 処理するデータのコレクション。キーは ContextValueKeyEnum で定義されます。
  data: Map<PayloadDataKeyEnum, PayloadDataValueType>;
  // 処理に関連するコンテキスト。
  associatedContexts: ContextItem[];

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

/**
 * ContentPayload.data のキー
 */
export enum PayloadDataKeyEnum {
  // 選択されたコードスニペット
  SELECTED_CODE ='lingma:code',
  // ユーザー入力テキスト
  USER_INPUT = 'lingma:text',
  // エラーメッセージ
  ERROR_MESSAGES = 'lingma:error_messages',
  // ターミナルログ出力
  TERMINAL_CONTENT = 'lingma:terminal_content',
  // コード補完のためのカーソル前のコード
  PREFIX_CODE = 'lingma:code_prefix',
  // コード補完のためのカーソル後のコード
  SUFFIX_CODE = 'lingma:code_suffix',
  // 類似のコードスニペット
  SIMILAR_CODE = 'lingma:similar_code',
  // コード補完のためのファイルパス
  FILE_PATH = 'lingma:file_path',
}

/**
 * リクエストアクションの Enum
 */
export enum ActionEnum {
    // 単体テスト
    GENERATE_TESTCASE           = 'GENERATE_TESTCASE',
    // コメントの生成
    CODE_GENERATE_COMMENT       = 'CODE_GENERATE_COMMENT',
    // コードの説明
    EXPLAIN_CODE                = 'EXPLAIN_CODE',
    // コードの最適化
    OPTIMIZE_CODE               = 'OPTIMIZE_CODE',
    // フリー入力 (チャットボックスでの直接テキスト入力)
    FREE_INPUT                  = 'FREE_INPUT',
    // コードの問題のクイックフィックス
    CODE_PROBLEM_SOLVE          = 'CODE_PROBLEM_SOLVE',
    // シェルコマンドの生成
    TERMINAL_COMMAND_GENERATION = 'TERMINAL_COMMAND_GENERATION',
    // ターミナルエラーの修正
    TERMINAL_EXPLAIN_FIX        = 'TERMINAL_EXPLAIN_FIX',
    // コード補完
    COMPLETION                  = 'COMPLETION',
}
出力パラメーター
/**
 * 後処理結果
 */
export class PostHandlerResponse {
  // 処理ポリシー。後続のロジックを制御します。
  handlePolicy: HandlePolicy;
  // 理由の説明
  reason?: string;
  // 処理された推論結果
  processedResult: InferredResult;
  constructor() {
    // デフォルト値
    this.handlePolicy = HandlePolicy.NO_OPS;
    this.reason = '';
    this.processedResult = new InferredResult();
  }
}

/**
 * LLM の応答をカプセル化します
 */
export class AIResponse {
  // 推論結果
  inferredResult: InferredResult;
  constructor() {
    this.inferredResult = new InferredResult();
  }
}

/**
 * モデルからの推論結果
 */
export class InferredResult {
  // LLM によって生成されたテキスト
  text: string;
  constructor() {
    this.text = '';
  }
}

/**
 * 処理ポリシーの Enum (後処理フィルターは NO_OPS のみをサポート)
 */
export enum HandlePolicy {
  // リクエストをブロックする
  BLOCK = 'BLOCK',
  // リクエストをフィルター処理し、ペイロードを変更する
  FILTER = 'FILTER',
  // アクションを実行しない
  NO_OPS = 'NO_OPS',
}

ナレッジベースアップロードフィルターの設定 (Enterprise Exclusive Edition のみ)

Enterprise Exclusive Edition では、 および Lingma の管理者とグローバル管理者は、ポリシー設定でナレッジベースフィルターを設定できます。設定後、ナレッジベースファイルはアップロード前にレビューされ、特定のシナリオにおけるナレッジベースコンテンツのアップロード前フィルタリングのニーズを満たします。

フィルター設定の詳細

ステップ 1:ナレッジベースフィルターの有効化と編集

  1. 左側のナビゲーションウィンドウで [ポリシー設定] をクリックします。右側で [ナレッジベースフィルター] タブをクリックします。

  2. [ナレッジベースフィルター] 設定ページで、[ナレッジベースのアップロード前フィルターを有効/無効にする] スイッチをオンにして、パラメーターを編集します。

    URL

    必須

    サードパーティのスキャンサービスのエンドポイント。サービスは POST リクエストを受け入れる必要があります。

    トークンフィールド名

    必須

    トークンを格納するために使用されるヘッダーフィールドの名前。

    シークレットキー

    必須

    アクセストークンを生成するために使用されるシークレットキー。トークンは、リクエストの正当性を検証するために指定されたヘッダーフィールドに配置されます。詳細については、「セキュアトークン」セクションをご参照ください。

ステップ 2:接続テスト

  1. 正しい情報を入力した後、[接続テスト] をクリックします。サードパーティのフィルターが HTTP 2xx ステータスコードを返した場合、テストは成功です。

  2. 別のステータスコードが返された場合、テストは失敗します。入力内容を確認して、もう一度お試しください。

ステップ 3:ナレッジベースフィルターの保存

[設定を保存] をクリックして、フィルター設定を保存します。フィルターは保存後すぐに有効になります。

サードパーティのスキャンサービスのインターフェイス仕様

貴社はサードパーティのスキャンサービスを提供する必要があります。ナレッジベースフィルターは、このサービスを使用してアップロードされたコンテンツをスキャンします。スキャンされたコンテンツのみがアップロード可能です。フィルターが正しく機能するためには、スキャンサービスのインターフェイスが次の要件を満たす必要があります:

リクエストヘッダー

パラメーター名

必須

説明

パラメーター例

X-Auth-Raw

はい

認証パラメーター。パラメーター名は、フィルター設定で入力したトークンフィールド名と一致します。パラメーター値は、暗号化アルゴリズムを使用してシークレットキーから生成された最終的なトークンです。詳細については、「セキュアトークン」セクションをご参照ください。

6c3baa76c62550eab864e6f75c4bb

Content-Type

はい

リクエストとレスポンスのメディアタイプ。

multipart/form-data

  • セキュアトークン:悪意のある攻撃者によるクラウドサービスの権限の乗っ取りを防ぐために Alibaba Cloud が設計した安全な署名です。トークンを生成するには、シークレットキー、現在のタイムスタンプ、追加データ、および暗号化アルゴリズムが必要です。

  • トークンの生成:Lingma がサードパーティのスキャンサービスを呼び出す際、認証のためにリクエストヘッダーにセキュアトークンを含めます。次のパラメーターを使用してトークンを計算します:

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

    method

    POST メソッド。

    url

    ナレッジベースフィルター設定で入力したスキャンサービスのエンドポイントの URL。

    timestamp

    現在のタイムスタンプ。

    tokenSecret

    ナレッジベースフィルター設定で入力したシークレットキー。

    timestampHex

    16 進数に変換されたタイムスタンプ。

  • トークンの検証:ご利用のサードパーティのスキャンサービスは、次のコードを使用してトークンを検証できます。

    重要
    • タイムスタンプ:クライアントとサーバーの時計が同期されていることを確認し、クロックのずれによるトークン検証の失敗を回避してください。

    • キー管理:tokenSecret を安全に保管してください。許可されていないユーザーと共有しないでください。

    • 有効期限:ビジネスニーズに応じてトークンの有効期間を調整してください。この例では 60 秒に設定されていますが、変更可能です。

    /*
     *  メソッドのパラメーター:
     *  receivedHash:受信したハッシュ。タイムスタンプを含みます。
     *  tokenSecret:ハッシュの生成に使用されるシークレットキー。
     *  url:リクエスト URL。
     */
    public boolean validateAuthRaw(String receivedHash, String tokenSecret, String url) {
        final String method = "POST";
        
        // receivedHash からタイムスタンプを抽出
        String tsHex = receivedHash.substring(receivedHash.length() - 8);
        long tsSec = Long.parseLong(tsHex, 16);
        
        // タイムスタンプを比較します。最大 60 秒の差を許容します。
        long now = System.currentTimeMillis() / 1000L;
        if (Math.abs(now - tsSec) > 60) {
            return false; // タイムスタンプが許容範囲外です
        }
        
        // 署名する文字列を構築
        String plain = method + url + tsSec + tokenSecret;
        
        // 期待されるハッシュを生成
        String expectedHash = org.apache.commons.codec.digest.DigestUtils.sha256Hex(plain);
        
        // ハッシュを比較
        return expectedHash.equals(receivedHash.substring(0, receivedHash.length() - 8));
    }

リクエストパラメーター

パラメーター名

必須

説明

パラメーター例

metadata

string

はい

ビジネスメタデータ。Content-Type:application/json

{"user": "user0000001",

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

file

file

はい

スキャンするファイル

リクエスト例:

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%

レスポンス構造

インターフェイスは、HTTP ステータスコード 200 と次の形式のレスポンスボディを返す必要があります。

パラメーター名

必須

説明

パラメーター例

forbidden

boolean

はい

セキュリティチェックの結果。true はチェックが失敗したことを意味します。

false

errorMsg

string

いいえ

チェックが失敗した理由を説明するエラーメッセージ。

"ファイルに悪意のあるコンテンツが含まれています。修正して再アップロードしてください。"

queryId

string

いいえ

リクエスト ID。リクエストメタデータの queryId フィールドと一致する必要があります。

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

user

string

いいえ

ユーザー ID。リクエストメタデータの user フィールドと一致する必要があります。

"user0001"