{"record":{"id":"94bbb44c7f6ee6d7","repo":"mlflow/mlflow","slug":"invalid-route-type-route-type-94bbb4","errorCode":null,"errorMessage":"Invalid route type {route_type}","messagePattern":"Invalid route type (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"mlflow/gateway/providers/cohere.py","lineNumber":360,"sourceCode":"        return {\"Authorization\": f\"Bearer {self.cohere_config.cohere_api_key}\"}\n\n    @property\n    def base_url(self) -> str:\n        return \"https://api.cohere.ai/v1\"\n\n    @property\n    def adapter_class(self) -> type[ProviderAdapter]:\n        return CohereAdapter\n\n    def get_endpoint_url(self, route_type: str) -> str:\n        if route_type == \"llm/v1/chat\":\n            return f\"{self.base_url}/chat\"\n        elif route_type == \"llm/v1/completions\":\n            return f\"{self.base_url}/generate\"\n        elif route_type == \"llm/v1/embeddings\":\n            return f\"{self.base_url}/embed\"\n        else:\n            raise ValueError(f\"Invalid route type {route_type}\")\n\n    async def _request(self, path: str, payload: dict[str, Any]) -> dict[str, Any]:\n        return await send_request(\n            headers=self.headers,\n            base_url=self.base_url,\n            path=path,\n            payload=payload,\n        )\n\n    def _stream_request(self, path: str, payload: dict[str, Any]) -> AsyncGenerator[bytes, None]:\n        return send_stream_request(\n            headers=self.headers,\n            base_url=self.base_url,\n            path=path,\n            payload=payload,\n        )\n\n    async def _chat_stream(","sourceCodeStart":342,"sourceCodeEnd":378,"githubUrl":"https://github.com/mlflow/mlflow/blob/6a27f2decc0b76eb1b54af31849784addb357dbc/mlflow/gateway/providers/cohere.py#L342-L378","documentation":"CohereProvider.get_endpoint_url maps a gateway route_type to a Cohere REST path (chat/generate/embed) and raises ValueError for any route_type outside the three supported llm/v1 types. It guards against constructing requests to unknown Cohere endpoints.","triggerScenarios":"Invoking get_endpoint_url with a route_type such as 'llm/v1/foo', 'mistral/v1/chat', or a typo like 'llm/v1/embedding' (singular) that matches none of the if/elif branches.","commonSituations":"Typos in the endpoint_type field of gateway config; registering custom route types and assuming the Cohere provider supports them; programmatic provider use with a hand-written route type string.","solutions":["Use one of the exact route types: 'llm/v1/chat', 'llm/v1/completions', or 'llm/v1/embeddings'.","Fix typos in the endpoint's endpoint_type config value.","If a custom route is needed, implement it in a custom provider rather than reusing CohereProvider.get_endpoint_url."],"exampleFix":"// before\nurl = provider.get_endpoint_url(\"llm/v1/embedding\")  # ValueError\n// after\nurl = provider.get_endpoint_url(\"llm/v1/embeddings\")","handlingStrategy":"validation","validationCode":"COHERE_ROUTE_TYPES = {\"llm/v1/chat\", \"llm/v1/completions\", \"llm/v1/embeddings\"}\n\ndef validate_route_type(route_type: str):\n    if route_type not in COHERE_ROUTE_TYPES:\n        raise ValueError(f\"Cohere supports only {sorted(COHERE_ROUTE_TYPES)}, got {route_type!r}\")","typeGuard":"from typing import Literal\nCohereRouteType = Literal[\"llm/v1/chat\", \"llm/v1/completions\", \"llm/v1/embeddings\"]\n\ndef is_cohere_route_type(route_type: str) -> bool:\n    return route_type in {\"llm/v1/chat\", \"llm/v1/completions\", \"llm/v1/embeddings\"}","tryCatchPattern":"try:\n    url = provider.get_endpoint_url(route_type)\nexcept ValueError as e:\n    logger.error(\"Bad route_type for Cohere provider: %s\", e)\n    raise","preventionTips":["Use the EndpointType enum / Literal types instead of raw strings for route types.","Validate endpoint_type in your gateway config CI.","Watch for singular/plural typos ('embedding' vs 'embeddings')."],"tags":["valueerror","cohere","route-type","gateway","configuration"],"backgroundTag":"unsupported-route-type","analyzedSha":"6a27f2decc0b76eb1b54af31849784addb357dbc","analyzedAt":"2026-08-29T20:54:51.419Z","schemaVersion":2},"datasetVersion":"2026-08-29T22:17:34.462Z"}