@@ -99,8 +99,8 @@ def create_openrouter_workflow(
9999 api_key: OpenRouter API key
100100 annotation_model: Model for annotation (default: ANNOTATION_MODEL env or Claude Haiku 4.5)
101101 annotation_provider: Provider for annotation model (default: ANNOTATION_PROVIDER env or "anthropic")
102- eval_model: Model for eval/assessment/feedback (default: EVALUATION_MODEL env or GPT-OSS-120B )
103- eval_provider: Provider for eval models (default: EVALUATION_PROVIDER env or "groq ")
102+ eval_model: Model for eval/assessment/feedback (default: EVALUATION_MODEL env or Qwen3.5-122B )
103+ eval_provider: Provider for eval models (default: EVALUATION_PROVIDER env or "alibaba ")
104104 temperature: LLM temperature (default: 0.1)
105105 user_id: User ID for cache optimization (derived from API key if not provided)
106106 schema_dir: Path to HED schemas (None = fetch from GitHub)
@@ -113,8 +113,8 @@ def create_openrouter_workflow(
113113 # Apply defaults from environment
114114 default_annotation_model = os .getenv ("ANNOTATION_MODEL" , "anthropic/claude-haiku-4.5" )
115115 default_annotation_provider = os .getenv ("ANNOTATION_PROVIDER" , "anthropic" )
116- default_eval_model = os .getenv ("EVALUATION_MODEL" , "qwen/qwen3.5-397b-a17b " )
117- default_eval_provider = os .getenv ("EVALUATION_PROVIDER" )
116+ default_eval_model = os .getenv ("EVALUATION_MODEL" , "qwen/qwen3.5-122b-a10b " )
117+ default_eval_provider = os .getenv ("EVALUATION_PROVIDER" , "alibaba" )
118118
119119 # Resolve final values: parameter > env var > default
120120 actual_annotation_model = get_model_name (annotation_model or default_annotation_model )
@@ -240,8 +240,8 @@ def create_byok_vision_agent(
240240 Configured VisionAgent using the user's key and model settings
241241 """
242242 # Use user-provided settings or fall back to server defaults
243- default_vision_model = os .getenv ("VISION_MODEL" , "qwen/qwen3-vl-32b-instruct " )
244- default_vision_provider = os .getenv ("VISION_PROVIDER" , "novita " )
243+ default_vision_model = os .getenv ("VISION_MODEL" , "qwen/qwen3.5-122b-a10b " )
244+ default_vision_provider = os .getenv ("VISION_PROVIDER" , "alibaba " )
245245
246246 actual_model = vision_model if vision_model else default_vision_model
247247 actual_temperature = temperature if temperature is not None else 0.3
@@ -354,9 +354,9 @@ def get_default_path(docker_path: str, local_path: str) -> str | None:
354354 # Log configuration (env vars are read by create_openrouter_workflow)
355355 print ("Using OpenRouter with models:" )
356356 print (f" Annotation: { os .getenv ('ANNOTATION_MODEL' , 'anthropic/claude-haiku-4.5' )} " )
357- print (f" Evaluation: { os .getenv ('EVALUATION_MODEL' , 'qwen/qwen3.5-397b-a17b ' )} " )
357+ print (f" Evaluation: { os .getenv ('EVALUATION_MODEL' , 'qwen/qwen3.5-122b-a10b ' )} " )
358358 print (f" Provider (annotation): { os .getenv ('ANNOTATION_PROVIDER' , 'anthropic' )} " )
359- print (f" Provider (eval): { os .getenv ('EVALUATION_PROVIDER' , '' ) or '(auto-routed)' } " )
359+ print (f" Provider (eval): { os .getenv ('EVALUATION_PROVIDER' , 'alibaba' ) } " )
360360
361361 workflow = create_openrouter_workflow (
362362 api_key = openrouter_api_key ,
@@ -395,8 +395,8 @@ def get_default_path(docker_path: str, local_path: str) -> str | None:
395395
396396 # Initialize vision agent (only for OpenRouter)
397397 if llm_provider == "openrouter" :
398- vision_model = os .getenv ("VISION_MODEL" , "qwen/qwen3-vl-32b-instruct " )
399- vision_provider = os .getenv ("VISION_PROVIDER" , "novita " )
398+ vision_model = os .getenv ("VISION_MODEL" , "qwen/qwen3.5-122b-a10b " )
399+ vision_provider = os .getenv ("VISION_PROVIDER" , "alibaba " )
400400
401401 print (f"Initializing vision model: { vision_model } (provider: { vision_provider } )" )
402402
@@ -486,6 +486,7 @@ def get_default_path(docker_path: str, local_path: str) -> str | None:
486486 "X-OpenRouter-Key" , # BYOK mode
487487 "X-OpenRouter-Model" , # BYOK model override
488488 "X-OpenRouter-Vision-Model" , # BYOK vision model override
489+ "X-OpenRouter-Vision-Provider" , # BYOK vision provider override
489490 "X-OpenRouter-Provider" , # BYOK provider preference
490491 "X-OpenRouter-Temperature" , # BYOK temperature override
491492 "X-OpenRouter-Eval-Model" , # BYOK eval model override
@@ -754,6 +755,9 @@ async def annotate_from_image(
754755 # Check for model override headers (from frontend dropdown or CLI)
755756 model_override = request .model or req .headers .get ("x-openrouter-model" )
756757 vision_model_override = request .vision_model or req .headers .get ("x-openrouter-vision-model" )
758+ vision_provider_override = request .vision_provider or req .headers .get (
759+ "x-openrouter-vision-provider"
760+ )
757761 provider_override = request .provider or req .headers .get ("x-openrouter-provider" )
758762 eval_model_override = req .headers .get ("x-openrouter-eval-model" )
759763 eval_provider_override = req .headers .get ("x-openrouter-eval-provider" )
@@ -782,14 +786,20 @@ async def annotate_from_image(
782786 temperature = temperature ,
783787 user_id_override = user_id_override ,
784788 )
789+ # Vision uses its own provider; fall back to annotation provider only if
790+ # a custom vision_model was specified without an explicit vision_provider
791+ vision_provider = vision_provider_override or (
792+ provider_override if vision_model_override else None
793+ )
785794 active_vision_agent = create_byok_vision_agent (
786795 openrouter_key ,
787796 vision_model = vision_model_override ,
788- provider = provider_override ,
797+ provider = vision_provider ,
789798 temperature = temperature ,
790799 user_id_override = user_id_override ,
791800 )
792801 except Exception as e :
802+ logging .exception ("Failed to initialize BYOK agents" )
793803 raise HTTPException (
794804 status_code = 500 , detail = f"Failed to initialize BYOK agents: { str (e )} "
795805 ) from e
@@ -815,9 +825,10 @@ async def annotate_from_image(
815825 validator_path = _byok_config .get ("validator_path" ),
816826 use_js_validator = _byok_config .get ("use_js_validator" , True ),
817827 )
818- # Note: Vision agent uses its own provider (novita for qwen-vl)
819- # Only pass provider_override to vision if a custom vision_model was specified
820- vision_provider = provider_override if vision_model_override else None
828+ # Note: Vision agent uses the vision-specific provider, not the annotation provider
829+ vision_provider = vision_provider_override or (
830+ provider_override if vision_model_override else None
831+ )
821832 active_vision_agent = create_byok_vision_agent (
822833 server_api_key ,
823834 vision_model = vision_model_override ,
@@ -1329,6 +1340,9 @@ async def annotate_from_image_stream(
13291340 # Determine which workflow and vision agent to use (same logic as /annotate-from-image)
13301341 model_override = request .model or req .headers .get ("x-openrouter-model" )
13311342 vision_model_override = request .vision_model or req .headers .get ("x-openrouter-vision-model" )
1343+ vision_provider_override = request .vision_provider or req .headers .get (
1344+ "x-openrouter-vision-provider"
1345+ )
13321346 provider_override = request .provider or req .headers .get ("x-openrouter-provider" )
13331347 eval_model_override = req .headers .get ("x-openrouter-eval-model" )
13341348 eval_provider_override = req .headers .get ("x-openrouter-eval-provider" )
@@ -1355,14 +1369,20 @@ async def annotate_from_image_stream(
13551369 temperature = temperature ,
13561370 user_id_override = user_id_override ,
13571371 )
1372+ # Vision uses its own provider; fall back to annotation provider only if
1373+ # a custom vision_model was specified without an explicit vision_provider
1374+ vision_provider = vision_provider_override or (
1375+ provider_override if vision_model_override else None
1376+ )
13581377 active_vision_agent = create_byok_vision_agent (
13591378 openrouter_key ,
13601379 vision_model = vision_model_override ,
1361- provider = provider_override ,
1380+ provider = vision_provider ,
13621381 temperature = temperature ,
13631382 user_id_override = user_id_override ,
13641383 )
13651384 except Exception as e :
1385+ logging .exception ("Failed to initialize BYOK agents" )
13661386 raise HTTPException (
13671387 status_code = 500 , detail = f"Failed to initialize BYOK agents: { str (e )} "
13681388 ) from e
@@ -1386,9 +1406,10 @@ async def annotate_from_image_stream(
13861406 validator_path = _byok_config .get ("validator_path" ),
13871407 use_js_validator = _byok_config .get ("use_js_validator" , True ),
13881408 )
1389- # Note: Vision agent uses its own provider (novita for qwen-vl)
1390- # Only pass provider_override to vision if a custom vision_model was specified
1391- vision_provider = provider_override if vision_model_override else None
1409+ # Note: Vision agent uses the vision-specific provider, not the annotation provider
1410+ vision_provider = vision_provider_override or (
1411+ provider_override if vision_model_override else None
1412+ )
13921413 active_vision_agent = create_byok_vision_agent (
13931414 server_api_key ,
13941415 vision_model = vision_model_override ,
0 commit comments