{
  "cases": [
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "deepseek-flash"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "gpt-4o"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "gpt-6-sol"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "claude-opus-5"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "qwen-plus"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "glm-4.6"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "Qwen/Qwen3-VL-32B-Instruct"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "Qwen3-Omni-30B-A3B-Instruct"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "Qwen3-Omni-30B-A3B-Captioner"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "Qwen/Qwen-Image-Edit-2509"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "BAAI/bge-large-zh-v1.5"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "bge-m3"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "BAAI/bge-reranker-v2-m3"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "text-embedding-3-large"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "FunAudioLLM/CosyVoice2-0.5B"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "Kwai-Kolors/Kolors"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "black-forest-labs/FLUX.1-dev"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "whisper-1"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "gpt-4o-transcribe"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "tts-1"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "dall-e-3"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "doubao-seedream-4-0-250828"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "doubao-seedance-1-0-pro-250528"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "wan2.2-t2i-flash"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "Wan-AI/Wan2.2-I2V-A14B"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "vidu/viduq3-pro_img2video"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "cogvideox-3"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "MiniMax-Hailuo-02"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "fishaudio/fish-speech-1.5"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "doubao-seed-1-6-250615"
      }
    },
    {
      "expected": true,
      "fn": "is_chat_model_id",
      "input": {
        "id": "gpt-4o-audio-preview"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "omni-moderation-latest"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "Llama-Guard-4-12B"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "LoRA/Qwen/Qwen2.5-7B-Instruct"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "BGE-M3"
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": ""
      }
    },
    {
      "expected": false,
      "fn": "is_chat_model_id",
      "input": {
        "id": "   "
      }
    },
    {
      "expected": {
        "dropped": 3,
        "droppedModels": [
          "BAAI/bge-large-zh-v1.5",
          "FunAudioLLM/CosyVoice2-0.5B",
          "Kwai-Kolors/Kolors"
        ],
        "models": [
          "deepseek-flash",
          "Qwen/Qwen3-VL-32B-Instruct"
        ]
      },
      "fn": "clean_fetched_models",
      "input": {
        "ids": [
          "deepseek-flash",
          "BAAI/bge-large-zh-v1.5",
          "Qwen/Qwen3-VL-32B-Instruct",
          "FunAudioLLM/CosyVoice2-0.5B",
          "Kwai-Kolors/Kolors"
        ]
      }
    },
    {
      "expected": {
        "dropped": 0,
        "droppedModels": [],
        "models": [
          "gpt-4o"
        ]
      },
      "fn": "clean_fetched_models",
      "input": {
        "ids": [
          " gpt-4o ",
          "gpt-4o",
          "gpt-4o"
        ]
      }
    },
    {
      "expected": {
        "dropped": 0,
        "droppedModels": [],
        "models": [
          "bge-m3",
          "text-embedding-3-large"
        ]
      },
      "fn": "clean_fetched_models",
      "input": {
        "ids": [
          "bge-m3",
          "text-embedding-3-large"
        ]
      }
    }
  ],
  "crateVersion": "0.1.2",
  "description": "is_chat_model_id：id 去两端空白、ASCII 小写后，为空 → false；以 rules.nonChatPrefixes 任一开头 → false；包含 rules.nonChatMarkers 任一子串 → false；其余一律 true（排除法，未知名称放行）。clean_fetched_models：逐个去两端空白、丢空串、按首次出现去重（保持顺序），再按上面的规则分成 models 与 droppedModels；models 为空（全被滤光）时改为返回去重后的原始清单，dropped 为 0、droppedModels 为空。",
  "generatedBy": "cargo xtask gen-spec（期望值由 Rust 参考实现算出，请勿手改）",
  "rules": {
    "nonChatMarkers": [
      "embedding",
      "embed",
      "bge-",
      "gte-",
      "e5-",
      "rerank",
      "whisper",
      "sensevoice",
      "cosyvoice",
      "tts",
      "asr",
      "stable-diffusion",
      "sdxl",
      "kolors",
      "flux",
      "image",
      "dall-e",
      "seedream",
      "seedance",
      "t2i",
      "i2v",
      "t2v",
      "img2video",
      "cogvideo",
      "hailuo",
      "speech",
      "transcribe",
      "captioner",
      "ocr",
      "moderation",
      "guard"
    ],
    "nonChatPrefixes": [
      "lora/"
    ]
  },
  "specVersion": 1,
  "title": "模型清单清洗"
}
