> For the complete documentation index, see [llms.txt](https://docs.ggwp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.ggwp.com/jp/apidokyumento-chat/pakkji/chat-api-batchi.md).

# Chat API: バッチ

\[ ベースURL: `api.ggwp.com`]

`POST` /chat/v2/batch

## **説明**

このAPIエンドポイントは、入力メッセージの配列を処理します。各メッセージには対応するセッションIDとユーザーIDが含まれ、さらに毒性フィルタの強さに関する設定可能なオプション一覧を受け取り、4つのレベルで情報を返します:

* **メッセージ詳細** - 各入力メッセージに対する有害コンテンツの存在と重大度を示す指標、および毒性を除去したメッセージのさまざまなバリエーション。
* **プレイヤー詳細** - 会話のその時点までに、その特定のユーザーの振る舞いを説明する属性。これには、検出されたインシデント種別の過去リスト、プレイヤーの気分、評判スコア、現在の状態が含まれます。
* **会話サマリー** - 各セッションごとの過去のすべてのアクティビティを説明するメトリクス。これには、セッション継続時間、メッセージ数と参加者数、会話の雰囲気、検出されたインシデント総数、および種類と重大度が含まれます。
* **推奨事項** - 過去または最近の一連の有害な行動により、その特定のユーザーに科されたペナルティに関する情報。これには、ペナルティそのもの、トリガーとなったメッセージと時刻、ペナルティの継続時間が含まれます。 `recommended_message` "recommended\_message" フィールドは、ペナルティが適用されている間は空文字列を返します。API出力のこの部分では、次のペナルティを提供します:
  * セッションミュート: セッション/マッチの残り時間、ユーザーはミュートされます。&#x20;
  * ミュート: ユーザーは特定の期間、すべてのセッション/マッチを通じてミュートされます。

## **ヘッダー**

を参照してください `ヘッダー` 上のセクションで `/chat/v2/message` エンドポイント

## **パラメータ**

`本文`: 次のフィールドを含む辞書の配列\
(*utf-8 エンコーディングである必要があります)*

* **session\_id:** 会話チャネルの一意識別子。ゲームプレイのメッセージでは、1回のマッチ内で展開される会話を識別できます。フォーラムや掲示板では、個別のスレッドや議論を表す場合があります。プラットフォームに複数のチャネル種別（例: ロビー、マッチ、ダイレクトメッセージなど）がある場合は、会話種別ごとのさらなる分析を可能にするため、この情報を session\_id に含めることを推奨します。推奨フォーマットは次のとおりです:

  ```json
    session_id = "channelType_numericID"
  ```
* **message:** 会話中にユーザーが送信したメッセージ。1,000文字を超えることはできません。
* **user\_id:** メッセージを送信したプレイヤーまたはユーザーの一意識別子。
* （任意） **username**: ユーザーが選択した親しみやすい表示名を含む文字列。
* （任意） **timestamp**: メッセージが発生した時刻。UTCの YYYY-MM-DD HH:MM:SS.SSS または YYYY-MM-DD HH:MM:SS 形式。追加されていない場合は、サーバー側のUTCタイムスタンプが代わりに追加されます。
* （任意） **language**: 処理対象のメッセージの言語。省略された場合、APIはメッセージ内容と過去のユーザー履歴から言語の検出を試みます。標準的な英語の言語名（例: `"english"` または `"spanish"`）と、ISO 639-1 の2文字言語コード（例:  `"en"` または `"es"`）を受け付けます。 `"en-US"`, `"en-GB"`, `"pt-BR"`、 `"es-MX"` のような完全なロケールタグは現在サポートされていません。代わりに `"en"`, `"pt"`、または `"es"` を送信してください。
* （任意） **message\_index**: 送信されたメッセージを追跡するための文字列フィールド。パスされた場合、出力の `message_details` に含まれます。
* （任意） **message\_url**: メッセージにタグ付けされたURLを追跡するための文字列フィールド。http または https スキームのみ有効です。有効であり、渡された場合はダッシュボードに表示されます。
* （任意） **metadata**: メッセージに関連するメタデータを追跡するためのDictフィールド。5KB未満でなければなりません。許可されるキーと対応する型のみ有効です。対応キー:

  * channel (string) - メッセージが送られる通信スペース。例: dm, party, guild, local
  * participants (array\<string>) - チャネルに参加している user\_id
  * map (string) - メッセージの発信元となる世界、レベル、または環境の識別子または名前
  * map\_version (string) - レイアウトなどの変更を追跡するために使用されるマップのバージョン識別子。
  * zone (string) - より細かな位置コンテキストのために使用される、マップ内のサブセクションまたは名前付き領域
  * coordinates (object) - マップまたはゾーン内の空間位置
    * x (float) - X軸に沿った位置
    * y (float) - Y軸に沿った位置
    * z (float) - Z軸に沿った位置

  例:

  ```json
  {
    "metadata": {
      "channel": "dm",
      "participants": ["user989", "user990"],
      "map":"golden_wasteland",
      "map_version":"2026.03.1",
      "zone":"cacti_forest",
      "coordinates":{
         "x":123.45,
         "y":67.89,
         "z":-10.25
      }
    }
  }
  ```

  注: 追加のメタデータキーもサポート可能です。ご利用のプラットフォームに適用される具体的なキーを定義するために、担当のカスタマー担当者とご相談ください。

💡 **API制限: このAPIには、次の制限のうち小さい方が適用されます:**

* 200メッセージ（配列内の項目）
* 1 MBの本文ペイロード

これらの制限のいずれかを超えると、400エラーが返されます。

例:

```json
[
	{
	  "session_id": "match_7765",
	  "message": "あちこちにクソ障害者がいる",
	  "user_id": "user989",
	  "username": "nlxdz",
	  "timestamp": "2022-06-02 16:49:02"
	},
	{
	  "session_id": "lobby_4953",
	  "message": "やあ、友だち！",
	  "user_id": "user159",
	  "username": "jrd",
	  "timestamp": "2022-06-02 16:49:35"
	}
]
```

サンプル呼び出し:

```bash
curl --request POST 'https://api.ggwp.com/chat/v2/batch' \\
--header 'x-api-key: api_key' \\
--header 'Content-Type: application/json' \\
--data-raw '[
	{
	  "session_id": "match_7765",
	  "message": "あちこちにクソ障害者がいる",
	  "user_id": "user989",
	  "username": "nlxdz",
	  "timestamp": "2022-06-02 16:49:02"
	},
	{
	  "session_id": "lobby_4953",
	  "message": "やあ、友だち！",
	  "user_id": "user159",
	  "username": "jrd",
	  "timestamp": "2022-06-02 16:49:35"
	}
]'
```

## **出力**

* 200レスポンス - 処理成功

次のフィールドを含む辞書:

* **message\_details**: ペイロードで渡された各メッセージに関する辞書のリスト
  * message\_details\[n].message\_id: メッセージに割り当てられた一意識別子。
  * message\_details\[n].original\_message: ユーザーが送信した生のメッセージ。
  * message\_details\[n].flag: メッセージがフラグ付けされたかどうかを示します。
  * message\_details\[n].severity: 毒性の重大度（なし、低、中、高）。
  * message\_details\[n].filtered\_message: フラグ付けされた用語がフィルタリングされたメッセージのバージョン。&#x20;
    * スペース区切り言語（例: 英語）では、単語全体がフィルタリングされます。例: `あなたはクソ野郎だ` --> `あなたは ***** だ`
    * 明示的な単語境界のない言語（例: 韓国語、日本語、中国語）では、検出された語そのもののみがフィルタリングされます。例: `좆까고 있네`--> `*****고 있네`
  * message\_details\[n].replaced\_message: 元のメッセージを置き換えるために生成された、安全またはユーモラスな代替メッセージ。
  * message\_details\[n].recommended\_message: クライアントに渡すことを推奨するメッセージの候補。アクティブユーザーの場合、この値のデフォルトは `filtered_message`です。ミュートされたユーザーの場合、 `recommended_message` は空文字列になります。
  * message\_details\[n].language: 検出されたメッセージの言語。
  * message\_details\[n].violence: メッセージに暴力が含まれている場合は true。
  * message\_details\[n].verbal\_abuse: メッセージに暴言が含まれている場合は true。
  * message\_details\[n].profanity: メッセージに不適切な言葉が含まれている場合は true。
  * message\_details\[n].sexual\_content: メッセージに性的内容が含まれている場合は true。
  * message\_details\[n].identity\_hate: メッセージにアイデンティティヘイトが含まれている場合は true。
  * message\_details\[n].drugs: メッセージに薬物への言及が含まれている場合は true。
  * message\_details\[n].self\_harm: メッセージに自傷行為が含まれている場合は true。
  * message\_details\[n].custom: メッセージにカスタムブロックリストの用語が含まれている場合は true。
  * message\_details\[n].spam: メッセージにスパムが含まれている場合は true。
  * message\_details\[n].link: メッセージに外部リンクが含まれている場合は true。
  * message\_details\[n].pii: メッセージに個人を特定できる情報が含まれている場合は true。
* **player\_details**: 各 `user_id` に関する詳細を含む辞書
  * player\_details.\<user\_id>.\<session\_id>.user\_id: ユーザーの一意識別子。
  * player\_details.\<user\_id>.\<session\_id>.username: ユーザーの表示名。
  * player\_details.\<user\_id>.\<session\_id>.num\_messages: 送信されたメッセージの総数。
  * player\_details.\<user\_id>.\<session\_id>.num\_incidents: インシデント数。
  * player\_details.\<user\_id>.\<session\_id>.cumulative\_mood: ユーザーのメッセージに対する全体的な感情。
  * player\_details.\<user\_id>.\<session\_id>.min\_mood: ユーザーのメッセージで観測された最も低い感情。
  * player\_details.\<user\_id>.\<session\_id>.max\_mood: ユーザーのメッセージで観測された最も高い感情。
  * player\_details.\<user\_id>.\<session\_id>.incident\_types\_detected: ユーザーに関連するインシデント種別の一覧。
  * player\_details.\<user\_id>.\<session\_id>.incidents\_by\_severity: 重大度レベルごとに分類されたインシデントの内訳。
  * player\_details.\<user\_id>.\<session\_id>.reputation\_score: 行動履歴から算出されたユーザーの総合評判スコア。
  * player\_details.\<user\_id>.\<session\_id>.languages: ユーザーのメッセージから検出された言語。
  * player\_details.\<user\_id>.\<session\_id>.user\_status: ユーザーの現在のモデレーション状態（例: アクティブ、ミュート中）。
  * player\_details.\<user\_id>.\<session\_id>.user\_status.status: 適用された具体的なモデレーション措置（ミュートなど）。
  * player\_details.\<user\_id>.\<session\_id>.user\_status.expiry\_at: モデレーション措置が失効する時刻。
* **conversation\_summary**: 各 `session_id` に関する詳細を含む辞書
  * conversation\_summary.\<session\_id>.start\_time: 会話セッションが開始された時刻のタイムスタンプ。
  * conversation\_summary.\<session\_id>.session\_duration: 会話の総継続時間（秒）。
  * conversation\_summary.\<session\_id>.num\_messages: 会話内のメッセージ総数。
  * conversation\_summary.\<session\_id>.num\_participants: 会話に参加しているユーザー数。
  * conversation\_summary.\<session\_id>.num\_incidents: インシデントの総数。
  * conversation\_summary.\<session\_id>.conversation\_mood: 会話全体の感情。
  * conversation\_summary.\<session\_id>.incident\_types\_detected: 会話全体で見つかったインシデント種別の一覧。
  * conversation\_summary.\<session\_id>.incidents\_by\_severity: 重大度レベルごとに分類されたインシデントの内訳。
* **recommendations**: 各 `user_id`
  * recommendations.\<user\_id>.\<session\_id>.action: 推奨されるモデレーション措置（例: ミュート）。
  * recommendations.\<user\_id>.\<session\_id>.trigger\_message: 推奨のきっかけとなった問題のあるメッセージ。
  * recommendations.\<user\_id>.\<session\_id>.trigger\_time: きっかけとなったメッセージのタイムスタンプ。
  * recommendations.\<user\_id>.\<session\_id>.duration: 措置を有効にしておく時間（秒）。

サンプル出力:

```json
{
    "message_details": [
        {
            "message_id": "20220602164902.482311-946bb8a9-0766-4c31-995a-d910da8531e5",
            "original_message": "あちこちにクソ障害者がいる",
            "flag": true,
            "severity": "中",
            "filtered_message": "***** ***** があちこちにいる",
            "replaced_message": "ちょっと待って... 楽しむはずじゃないの？",
            "recommended_message": "",
            "language": "英語",
            "violence": false,
            "verbal_abuse": true,
            "profanity": true,
            "sexual_content": false,
            "identity_hate": true,
            "drugs": false,
            "self_harm": false,
            "custom": false,
            "spam": false,
            "link": false,
            "pii": false,
            "solicitation": false,
	    "scam": false
        },
        {
            "message_id": "20220602164935.788776-92756195-c059-4e11-81a6-7faef57bd5bc",
            "original_message": "やあ、友だち！",
            "flag": false,
            "severity": "なし",
            "filtered_message": "やあ、友だち！",
            "replaced_message": "初めて会ったばかりだけど、あなたのことが大好き",
            "recommended_message": "やあ、友だち！",
            "language": "英語",
            "violence": false,
            "verbal_abuse": false,
            "profanity": false,
            "sexual_content": false,
            "identity_hate": false,
            "drugs": false,
            "self_harm": false,
            "custom": false,
            "spam": false,
            "link": false,
            "pii": false,
            "solicitation": false,
	    "scam": false
        }
    ],
    "player_details": {
        "user989": {
            "match_7765": {
                "user_id": "user989",
                "username": "nlxdz",
                "num_messages": 11,
                "num_incidents": 6,
                "cumulative_mood": 0.748,
                "min_mood": 0.0,
                "max_mood": 0.8615,
                "incident_types_detected": [
                    "verbally_abusive_language",
                    "profanity",
                    "identity_hate_language"
                ],
                "incidents_by_severity": {
                    "high": 2,
                    "medium": 3,
                    "low": 1
                },
                "reputation_score": 245,
                "languages": [
                    "english"
                ],
                "user_status": {
                    "status": "ミュート中",
                    "expiry_at": "2022-06-03 16:49:02"
                }
            }
        },
        "user159": {
            "lobby_4953": {
                "user_id": "user159",
                "username": "jrd",
                "num_messages": 3,
                "num_incidents": 0,
                "cumulative_mood": 0.891,
                "min_mood": 0.5,
                "max_mood": 0.891,
                "incident_types_detected": [],
                "incidents_by_severity": {
                    "high": 0,
                    "medium": 0,
                    "low": 0
                },
                "reputation_score": 745,
                "languages": [
                    "english"
                ],
                "user_status": {
                    "status": "アクティブ"
                }
            }
        }
    },
    "conversation_summary": {
        "match_7765": {
            "start_time": "2022-05-27 16:53:03",
            "session_duration": 59,
            "num_messages": 46,
            "num_participants": 3,
            "num_incidents": 16,
            "conversation_mood": 0.9816,
            "incident_types_detected": [
                "verbally_abusive_language",
                "profanity",
                "identity_hate_language",
                "sexual_harassment"
            ],
            "incidents_by_severity": {
                "high": 4,
                "medium": 6,
                "low": 6
            }
        },
        "lobby_4953": {
            "start_time": "2022-06-02 15:25:01",
            "session_duration": 125,
            "num_messages": 33,
            "num_participants": 5,
            "num_incidents": 4,
            "conversation_mood": 0.9577,
            "incident_types_detected": [
                "identity_bias",
                "profanity",
                "drug_reference"
            ],
            "incidents_by_severity": {
                "high": 0,
                "medium": 1,
                "low": 3
            }
        }
    },
    "recommendations": {
        "user989": {
            "match_7765": [
                {
                    "action": "ミュート",
                    "trigger_message": "バカなホモ野郎",
                    "trigger_time": "2022-06-02 16:49:00",
                    "duration": 86400
                }
            ]
        }
    }
}
```

* 400
  * 無効なJSON入力、必須フィールドの欠落、メッセージ文字数制限の超過、API制限の超過など。
* 403
  * APIキーが無効、または存在しません
