Nhật ký công việc cho nhiệm vụ "Tìm hiểu lý do tại sao không phải tất cả các mô hình hình ảnh đều có sẵn trong openrouter"

23 июн. 2026 г., 08:22:00

Hóa ra vấn đề nằm ở tham số này:

modalities: ['image', 'text']

Và ở đây tôi thấy hành vi rất tệ của openrouter-api. Vấn đề là gì? Một số mô hình thực sự hỗ trợ cả image và text, trong khi một số mô hình chỉ hỗ trợ image hoặc chỉ text. Và openrouter có một phương thức để lấy các mô hình dựa trên modality cụ thể.

curl "https://openrouter.ai/api/v1/models?output_modalities=image"

Tuy nhiên, điểm thú vị là họ không có phương thức nào để lấy các mô hình hỗ trợ cả hai. Nghĩa là chúng ta không thể dùng một request duy nhất để biết liệu mô hình có hỗ trợ tất cả các modality mà chúng ta cần hay không. Hơn nữa, chúng ta không thể thấy tất cả các mô hình trong request sh curl "https://openrouter.ai/api/v1/models" mà không chỉ định modality. Ví dụ, ở đây chúng ta thấy flux

curl "https://openrouter.ai/api/v1/models?output_modalities=image" |jq|grep black -A 15
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 39411    0 39411    0     0   172k      0 --:--:-- --:--:-- --:--:--  171k
      "id": "black-forest-labs/flux.2-klein-4b",
      "canonical_slug": "black-forest-labs/flux.2-klein-4b",
      "hugging_face_id": "black-forest-labs/FLUX.2-klein-4B",
      "name": "Black Forest Labs: FLUX.2 Klein 4B",
      "created": 1768429228,
      "description": "FLUX.2 [klein] 4B is the fastest and most cost-effective model in the FLUX.2 family, optimized for high-throughput use cases while maintaining excellent image quality. Pricing is based on the output...",
      "context_length": 40960,
      "architecture": {
        "modality": "text+image->image",
        "input_modalities": [
          "text",
          "image"
        ],
        "output_modalities": [
          "image"
        ],
        "tokenizer": "Other",
        "instruct_type": null
--
        "details": "/api/v1/models/black-forest-labs/flux.2-klein-4b/endpoints"
      }
    },

Nhưng chúng ta sẽ không thấy nó trong danh sách chung các mô hình.

curl "https://openrouter.ai/api/v1/models" |jq|grep black -A 15
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  488k    0  488k    0     0  1496k      0 --:--:-- --:--:-- --:--:-- 1498k

Nhưng đó chưa phải là tất cả :-) Nếu trong request chỉ định modalities: ['image'], thì các mô hình kiểu gemini-2.5/3 trả về lỗi "No endpoints found that support the requested output modalities: image", mặc dù trong chính mô hình đó đã ghi

 "architecture": {
    "modality": "text+image->text+image",
    "input_modalities": [
      "image",
      "text"
    ],
    "output_modalities": [
      "image",
      "text"
    ],
    "tokenizer": "Gemini",
    "instruct_type": null
  }

Tức là nó không lấy một trong các khả năng, mà bắt buộc tất cả phải trùng khớp. Điều này thực sự kỳ lạ đối với tôi. Tôi đành phải không chỉ định modality nào luôn.