mirror of
https://github.com/open-jarvis/OpenJarvis.git
synced 2026-07-28 05:12:26 +00:00
* feat(engine): add DeepSeek as a first-class cloud provider Adds DEEPSEEK_API_KEY support to the cloud engine, wiring DeepSeek's OpenAI-compatible API (api.deepseek.com/v1) alongside the existing MiniMax, OpenRouter, Anthropic, and Google providers. - Add _DEEPSEEK_MODELS list (deepseek-v4-flash, deepseek-v4-pro) - Add _is_deepseek_model() routing predicate - Init self._deepseek_client from DEEPSEEK_API_KEY in _init_clients() - Add _generate_deepseek() and _stream_deepseek() methods - Wire DeepSeek into generate(), stream(), _stream_full_openai(), list_models(), and health() - Add approximate pricing entries for both models Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(engine): strict cloud model routing + deepseek can_serve branch Builds on the DeepSeek provider (PR #504) with two routing-correctness fixes to CloudEngine._client_for_model: 1. Add the missing DeepSeek branch so can_serve('deepseek-*') agrees with list_models()/health() when only DEEPSEEK_API_KEY is set (mirrors the minimax branch). Without it the engine advertised deepseek models via list_models() but refused to serve them (the #532 can_serve contract). 2. Fix #335: _client_for_model previously fell through to the OpenAI client for ANY unrecognized model name, so an OpenAI key (even a dummy sk-dummy... one) made can_serve('qwen3.5:0.8b') return True. With the local engine transiently down (classic post-Windows-restart Ollama not yet up), model-aware get_engine then mis-selected the cloud engine for a local model and died with "OpenAI client not available". Add a positive _is_openai_model predicate (gpt-/chatgpt-/o1/o3/o4 + _OPENAI_MODELS) and return None for unrecognized names, so can_serve declines them. generate() and stream() keep their OpenAI fall-through, preserving loud failure for an explicitly-requested unknown cloud model. Tests: DeepSeek detection/pricing/health/list_models/generate-routing/ can_serve and a #335 regression (can_serve rejects local names with an OpenAI key; unknown model not served even with all clients set; end-to-end get_engine does not misroute a local model with a dummy OpenAI key). Fixes #335 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Jen Huls <me@jenhuls.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>