Skip to content

fix(export): hermes export emits flat string array without per-model capabilities (supports_vision: true) #3146

Description

@GoldenLoaf24h

Client or integration

Other

Provider or upstream service

Hermes Agent client export (ocx export --client hermes)

OpenCodex version

2.38.0

Endpoint or capability

Client integration & configuration export (/api/export / ocx export --client hermes)

Current behaviour

When exporting configuration for Hermes Agent via ocx export --client hermes (or Web UI Integration), the models list is serialized as a flat array of model id strings:

providers:
  opencodex:
    api: "http://127.0.0.1:10100/v1"
    api_key: "${OPENCODEX_HERMES_API_KEY}"
    api_mode: chat_completions
    discover_models: false
    models:
      - google-antigravity/gemini-3.7-flash
      - opencode-go/gpt-5.6-luna

Because opencodex is a custom local provider (not found in Hermes's default models.dev remote registry), Hermes's dynamic router (agent.image_routing._lookup_supports_vision) falls back to None and assumes text-only capability when given a flat list without explicit flags. Consequently, native multimodal image/video requests to vision-capable models (e.g. Gemini 3.7 Flash, GPT-5.6 Luna, Grok 4.6, MiMo v2.5) are intercepted or treated as text-only.

Expected behaviour

ocx export --client hermes should serialize models as a dictionary mapping with capability metadata (e.g. supports_vision: true, supports_video: true) for multimodal models based on OpenCodex's existing catalog modality metadata (modelInputModalities / visionEligible):

providers:
  opencodex:
    api: "http://127.0.0.1:10100/v1"
    api_key: "${OPENCODEX_HERMES_API_KEY}"
    api_mode: chat_completions
    discover_models: false
    models:
      google-antigravity/gemini-3.7-flash:
        supports_vision: true
        supports_video: true
      opencode-go/gpt-5.6-luna:
        supports_vision: true
      opencode-go/grok-4.6:
        supports_vision: true
      opencode-go/deepseek-v4-flash:
        supports_vision: false

Minimal redacted request or reproduction

  1. Run ocx export --client hermes
  2. Inspect the generated providers.opencodex.models YAML section.
  3. Paste into ~/.hermes/config.yaml and observe that Hermes treats all custom models as supports_vision: None unless explicitly overridden as a dictionary.

Actual response or error

Flat string array output without per-model capability declarations.

Upstream documentation

Hermes Agent provider capability configuration: https://hermes-agent.nousresearch.com/docs

Suggested mapping or implementation notes

In the Hermes export serializer (where client YAML is generated), inspect the catalog row for each model:

  • If model has image/vision input capability, emit supports_vision: true (and supports_video: true for video-capable models like Gemini).
  • Otherwise emit supports_vision: false or omit the capability mapping.

Additional context and attachments

Both string list and dictionary mapping formats are natively supported by Hermes, but dictionary mapping is required for custom local endpoints to advertise vision capability without falling back to text-only mode.

Checks

  • I searched existing provider and compatibility issues.
  • The request and response were redacted.
  • The expected behaviour is based on an upstream specification or a concrete client requirement.

Metadata

Metadata

Assignees

No one assigned

    Labels

    providerProvider adapters, OpenAI-compat presets, upstream API quirksprovider-compatibilityProvider compatibility reports

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions