{"record":{"id":"ce1c6ce4d7caf36e","repo":"ZhuLinsen/daily_stock_analysis","slug":"hermes-vision-vision-model-hermes-deplo","errorCode":null,"errorMessage":"Hermes Vision 未验证：VISION_MODEL 不能选择包含 Hermes deployment 的 route。","messagePattern":"Hermes Vision 未验证：VISION_MODEL 不能选择包含 Hermes deployment 的 route。","errorType":"validation","errorClass":"ValueError","httpStatus":400,"severity":"error","filePath":"src/services/image_stock_extractor.py","lineNumber":278,"sourceCode":"def _deployment_allows_empty_api_key(deployment: Dict[str, Any]) -> bool:\n    \"\"\"Return whether a configured vision deployment is a supported keyless endpoint.\"\"\"\n    params = deployment.get(\"litellm_params\") or {}\n    if str(params.get(\"api_key\") or \"\").strip():\n        return False\n    wire_model = str(params.get(\"model\") or \"\").strip()\n    protocol = wire_model.split(\"/\", 1)[0] if \"/\" in wire_model else None\n    return channel_allows_empty_api_key(protocol, params.get(\"api_base\"))\n\n\ndef _call_litellm_vision(image_b64: str, mime_type: str, api_key: Optional[str] = None) -> str:\n    \"\"\"Extract stock codes from an image using litellm (all providers via OpenAI vision format).\"\"\"\n    global litellm\n    cfg = get_config()\n    model = _resolve_vision_model()\n    if not model:\n        raise ValueError(\"未配置 Vision API。请设置 LITELLM_MODEL 或相关 API Key。\")\n    if route_has_hermes(getattr(cfg, \"llm_model_list\", []) or [], model):\n        raise ValueError(\"Hermes Vision 未验证：VISION_MODEL 不能选择包含 Hermes deployment 的 route。\")\n\n    deployments = _matching_vision_deployments(model, cfg)\n    keys = _get_api_keys_for_model(model, cfg)\n    key = api_key if api_key and api_key in keys else (random.choice(keys) if keys else None)\n\n    deployment_params: Dict[str, Any] = {}\n    if deployments:\n        deployment = next(\n            (\n                item\n                for item in deployments\n                if str((item.get(\"litellm_params\") or {}).get(\"api_key\") or \"\").strip() == key\n            ),\n            None,\n        )\n        if deployment is None:\n            deployment = next(\n                (item for item in deployments if _deployment_allows_empty_api_key(item)),","sourceCodeStart":260,"sourceCodeEnd":296,"githubUrl":"https://github.com/ZhuLinsen/daily_stock_analysis/blob/5159bd72e8373d215492dff122acc9d389e219c9/src/services/image_stock_extractor.py#L260-L296","documentation":"Error \"Hermes Vision 未验证：VISION_MODEL 不能选择包含 Hermes deployment 的 route。\" thrown in ZhuLinsen/daily_stock_analysis.","triggerScenarios":"Thrown at src/services/image_stock_extractor.py:278 when the library encounters an invalid state.","commonSituations":"Raised when VISION_MODEL is routed to an unverified Hermes deployment; occurs when the configured vision route includes a Hermes backend that has not passed verification.","solutions":["Set VISION_MODEL to a non-Hermes route (e.g. a standard openai/<model> route) for image extraction.","Pick a verified vision-capable model that does not route through a Hermes deployment.","Update .env and restart after changing VISION_MODEL."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"5159bd72e8373d215492dff122acc9d389e219c9","analyzedAt":"2026-08-15T01:59:36.292Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}