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
- Set a non-Gemini model in config/artemis.jsonc:
"flash": {
"step_summarizer": {
"enabled": true,
"model": "tensorx/deepseek/deepseek-v4-flash"
}
}
- Run any Flash-profile task.
- 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>
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
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):
Whenever an explicit model_name is configured, the LLM is unconditionally built via
get_google_llm() (artemis/services/llm.py), which hardcodesprovider=ModelProvider.GOOGLE. The provider is never resolved from config, so the model ID is passed toChatGoogleGenerativeAIas if it were a Gemini model name. Google's API has no such model → 404, surfaced bylangchain_google_genai/chat_models.py:176.Suggested fix
Route explicit model strings through provider resolution instead of hardcoding Google:
Environment