Skip to content

VisualStepSummarizer hardcodes Google provider, breaking non-Gemini models in flash.step_summarizer.model (404 Not Found) #167

Description

@kypeli

Description

The Flash step summarizer's model config field only works with Gemini models. Any other model ID — e.g. a TensorX/OpenRouter/custom-endpoint model like tensorx/deepseek/deepseek-v4-flash — is sent verbatim to Google's Generative Language API, which returns 404 Not
Found.

Steps to reproduce

  1. Set a non-Gemini model in config/artemis.jsonc:
"flash": {
  "step_summarizer": {
    "enabled": true,
    "model": "tensorx/deepseek/deepseek-v4-flash"
  }
}
  1. Run any Flash-profile task.
  2. Observe the per-step error in the logs:
    VisualStepSummarizer: Error generating summary for step 1: Error calling model 'tensorx/deepseek/deepseek-v4-flash' (Not Found): 404 Not Found. {'message': '', 'status': 'Not Found'}

Expected behavior

The model string should be routed through the provider resolution used everywhere else (via ModelProvider.from_string / the node's inherited provider), so non-Google models go to the correct endpoint (e.g. the OpenAI-compatible custom provider with OPENAI_BASE_URL).

Actual behavior

Every step summary fails immediately. Because HTTP 404 is classified BAD_REQUEST (non-retryable, no fallback), there is no recovery — summaries are permanently lost for the whole session.

Root cause

In artemis/agents/flash/summarizer.py (VisualStepSummarizer.init, ~lines 164–173):

if model_name:
    self._llm = get_google_llm(model_name=target_model, temperature=0.0)
else:
    self._llm = get_llm(ctx, name="summarizer", is_utils=True)

Whenever an explicit model_name is configured, the LLM is unconditionally built via get_google_llm() (artemis/services/llm.py), which hardcodes provider=ModelProvider.GOOGLE. The provider is never resolved from config, so the model ID is passed to ChatGoogleGenerativeAI as if it were a Gemini model name. Google's API has no such model → 404, surfaced by langchain_google_genai/chat_models.py:176.

Suggested fix

Route explicit model strings through provider resolution instead of hardcoding Google:

  • Add an optional provider field to the flash.step_summarizer and memory.chunking config blocks (defaulting to the global default.provider), and build these models through ModelFactory with the resolved ModelProvider.
  • Alternatively/additionally, infer the provider from the model string: treat provider/model-style prefixes or known non-Gemini IDs as OpenAI-compatible (custom endpoint), keeping bare gemini-* names on Google.
  • Guard the fallback path: if provider resolution fails, log a clear config error rather than silently retrying via get_google_llm.

Environment

  • Config: provider: "custom" default with OPENAI_BASE_URL=<3rd party LLM provider>

Activity

  1. kypeli commented on Oct 4, 2026

    @kypeli
    Author

    This issue is resolved by #168

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions