{"record":{"id":"6fe944ff78e7cb53","repo":"conductor-oss/conductor","slug":"not-supported-6fe944","errorCode":null,"errorMessage":"Not supported","messagePattern":"Not supported","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"ai/src/main/java/org/conductoross/conductor/ai/providers/grok/Grok.java","lineNumber":61,"sourceCode":"    public Grok(GrokAIConfiguration config, OkHttpClient httpClient) {\n        this.config = config;\n        OpenAIChatCompletionsApi api =\n                new OpenAIChatCompletionsApi(\n                        httpClient,\n                        config.getApiKey(),\n                        config.getBaseURL(),\n                        \"/v1/chat/completions\");\n        this.chatModel = new OpenAICompatChatModel(api);\n    }\n\n    @Override\n    public String getModelProvider() {\n        return NAME;\n    }\n\n    @Override\n    public List<Float> generateEmbeddings(EmbeddingGenRequest embeddingGenRequest) {\n        throw new UnsupportedOperationException(\"Not supported\");\n    }\n\n    @Override\n    public ChatOptions getChatOptions(ChatCompletion input) {\n        List<ToolCallback> toolCallbacks = getToolCallback(input);\n        Set<String> toolNames =\n                toolCallbacks.stream()\n                        .map(tc -> tc.getToolDefinition().name())\n                        .collect(Collectors.toSet());\n\n        return ToolCallingChatOptions.builder()\n                .model(input.getModel())\n                .temperature(input.getTemperature())\n                .topP(input.getTopP())\n                .maxTokens(input.getMaxTokens())\n                .stopSequences(input.getStopWords())\n                .frequencyPenalty(input.getFrequencyPenalty())\n                .presencePenalty(input.getPresencePenalty())","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/conductor-oss/conductor/blob/cf7c3e4a8adfb158be778ab1ec525323c363cd3a/ai/src/main/java/org/conductoross/conductor/ai/providers/grok/Grok.java#L43-L79","documentation":"Grok.generateEmbeddings() throws unconditionally because the Grok (xAI) provider only implements chat completion via the OpenAI-compatible /v1/chat/completions endpoint. xAI's Grok models do not expose an embeddings API. The AIModel contract is satisfied by throwing UnsupportedOperationException.","triggerScenarios":"Calling generateEmbeddings() on a Grok provider instance — e.g. a text-embedding or embedding-generation task routed to provider 'Grok'.","commonSituations":"Routing an embedding/vector-generation workflow to the Grok provider. Assuming all chat providers also support embeddings. Copying an embedding task config from OpenAI and changing only the provider to Grok.","solutions":["Route embedding requests to a provider that supports them: 'openai', 'azure_openai', 'cohere', 'bedrock' (Cohere models only), or 'vertex_ai'/'google_gemini'.","Add a capability check before calling generateEmbeddings() — verify the provider name supports embeddings.","If building a generic embedding dispatcher, maintain a whitelist of embedding-capable providers."],"exampleFix":"// before\nString provider = \"Grok\";\nList<Float> emb = registry.get(provider)\n    .generateEmbeddings(req); // throws\n\n// after\nprivate static final Set<String> EMBEDDING_PROVIDERS =\n    Set.of(\"openai\", \"azure_openai\", \"cohere\", \"bedrock\", \"vertex_ai\", \"google_gemini\");\nif (!EMBEDDING_PROVIDERS.contains(provider)) {\n    throw new IllegalArgumentException(\n        \"Provider \" + provider + \" does not support embeddings\");\n}\nList<Float> emb = registry.get(provider).generateEmbeddings(req);","handlingStrategy":"validation","validationCode":"// Validate Grok supports embeddings before calling\nprivate static final Set<String> EMBEDDING_CAPABLE =\n    Set.of(\"openai\", \"azure_openai\", \"cohere\", \"bedrock\", \"vertex_ai\", \"google_gemini\");\n\nvoid validateEmbeddingCapability(String providerName) {\n    if (!EMBEDDING_CAPABLE.contains(providerName)) {\n        throw new IllegalArgumentException(\n            \"Provider '\" + providerName + \"' does not support embeddings. \"\n            + \"Supported: \" + EMBEDDING_CAPABLE);\n    }\n}","typeGuard":"static boolean supportsEmbeddings(AIModel model) {\n    try {\n        model.generateEmbeddings(null);\n        return true;\n    } catch (UnsupportedOperationException e) {\n        return false;\n    } catch (NullPointerException | IllegalArgumentException e) {\n        return true; // passed the unsupported check, failed on null input\n    }\n}","tryCatchPattern":"try {\n    return grok.generateEmbeddings(request);\n} catch (UnsupportedOperationException e) {\n    throw new IllegalArgumentException(\n        \"Grok does not support embeddings. \"\n        + \"Use openai, cohere, bedrock (cohere.*), or vertex_ai.\", e);\n}","preventionTips":["Grok is chat-only — never route embedding tasks to it.","Maintain a whitelist of embedding-capable providers and validate before dispatching.","Validate provider+capability compatibility at task-registration time to fail before runtime.","When copying task configs between providers, verify the target provider supports the task type."],"tags":["grok","embeddings","unsupported-operation","capability-mismatch"],"backgroundTag":null,"analyzedSha":"cf7c3e4a8adfb158be778ab1ec525323c363cd3a","analyzedAt":"2026-08-14T03:33:19.897Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}