Skip to content

Commit ca92a45

Browse files
Fix BYOK vision provider mismatch and update default models (#142)
* Fix BYOK vision provider mismatch and update default models (#141) * Fix BYOK vision provider mismatch and update default models - Fix: annotation provider (anthropic) was passed to vision agent in BYOK mode, causing provider mismatch crash on annotate-image - Fix: vision_provider not passed through LocalExecutionBackend - Update vision/eval defaults to qwen/qwen3.5-122b-a10b with alibaba - Keep annotation model as claude-haiku-4.5 with anthropic provider - Add 504 gateway timeout handler to CLI client - Update docker-compose, .env.example, deploy docs, frontend display - Bump version to 0.7.9.dev0 Closes #140 * Address PR review findings - Add vision_provider field to ImageAnnotationRequest for full decoupling - Wire vision_provider_override through all 4 API code paths - Add X-OpenRouter-Vision-Provider to CORS allowed headers - Fix stale docstring: GPT-OSS-120B -> Qwen3.5-122B in create_openrouter_workflow - Fix stale eval_provider description: None -> alibaba in config - Update provider examples: Cerebras/deepinfra -> anthropic/alibaba - Align .env.example annotation model with code defaults (claude-haiku-4.5) - Make vision provider comments durable (architectural intent, not config) * Address silent-failure-hunter findings - Add logging.exception() to BYOK agent init error paths - Include server-provided detail in 503 handler instead of discarding * Bump version to 0.7.9a0 * Revert "Bump version to 0.7.9a0" This reverts commit 11a7579.
1 parent fbc8d6b commit ca92a45

14 files changed

Lines changed: 110 additions & 70 deletions

.env.example

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,18 @@ OPENROUTER_API_KEY=your-openrouter-api-key-here
6262
# ============================================================================
6363
# Each agent type has its own model and provider for optimal performance.
6464

65-
# Annotation Model (best quality/cost: Mistral-Small-3.2-24B)
66-
# 100% faithful rate, $0.18/M output tokens
67-
ANNOTATION_MODEL=mistralai/mistral-small-3.2-24b-instruct
68-
ANNOTATION_PROVIDER=mistral
65+
# Annotation Model (Claude Haiku 4.5 via Anthropic - high quality with prompt caching)
66+
ANNOTATION_MODEL=anthropic/claude-haiku-4.5
67+
ANNOTATION_PROVIDER=anthropic
6968

70-
# Evaluation/Assessment Model (fast quality checks: GPT-OSS-120B via Groq)
69+
# Evaluation/Assessment Model (Qwen3.5-122B via Alibaba - fast and cost-effective)
7170
# Used for evaluation, assessment, and feedback agents
72-
EVALUATION_MODEL=openai/gpt-oss-120b
73-
EVALUATION_PROVIDER=groq
71+
EVALUATION_MODEL=qwen/qwen3.5-122b-a10b
72+
EVALUATION_PROVIDER=alibaba
7473

75-
# Vision Model (image description: Qwen3-VL via deepinfra)
76-
VISION_MODEL=qwen/qwen3-vl-30b-a3b-instruct
77-
VISION_PROVIDER=deepinfra/fp8
74+
# Vision Model (Qwen3.5-122B via Alibaba - accepts vision, fast)
75+
VISION_MODEL=qwen/qwen3.5-122b-a10b
76+
VISION_PROVIDER=alibaba
7877

7978
# ============================================================================
8079
# Alternative Models

deploy/README.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,17 +269,18 @@ AUDIT_LOG_FILE=/var/log/hed-bot/audit.log
269269
# CORS Configuration (optional extra origins)
270270
# EXTRA_CORS_ORIGINS=https://staging.hed-bot.pages.dev,https://dev.hed-bot.pages.dev
271271

272-
# LLM Configuration (Cerebras + OpenRouter for ultra-fast inference)
272+
# LLM Configuration (OpenRouter with Alibaba for fast inference)
273273
LLM_PROVIDER=openrouter
274274
OPENROUTER_API_KEY=your_openrouter_key_here
275-
LLM_PROVIDER_PREFERENCE=Cerebras
276275
LLM_TEMPERATURE=0.1
277276

278-
# Model configuration (Cerebras-optimized defaults)
279-
ANNOTATION_MODEL=openai/gpt-oss-120b
280-
EVALUATION_MODEL=qwen/qwen3-235b-a22b-2507
281-
ASSESSMENT_MODEL=openai/gpt-oss-120b
282-
FEEDBACK_MODEL=openai/gpt-oss-120b
277+
# Model configuration
278+
ANNOTATION_MODEL=anthropic/claude-haiku-4.5
279+
ANNOTATION_PROVIDER=anthropic
280+
EVALUATION_MODEL=qwen/qwen3.5-122b-a10b
281+
EVALUATION_PROVIDER=alibaba
282+
VISION_MODEL=qwen/qwen3.5-122b-a10b
283+
VISION_PROVIDER=alibaba
283284

284285
# Optional: HED Schema and Validator paths (if not using defaults)
285286
# HED_SCHEMA_DIR=/path/to/hed-schemas

docker-compose.dev.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ services:
2222
# OpenRouter Configuration
2323
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
2424
- LLM_PROVIDER_PREFERENCE=${LLM_PROVIDER_PREFERENCE:-}
25-
- ANNOTATION_MODEL=${ANNOTATION_MODEL:-openai/gpt-oss-120b}
26-
- EVALUATION_MODEL=${EVALUATION_MODEL:-qwen/qwen3-235b-a22b-2507}
27-
- ASSESSMENT_MODEL=${ASSESSMENT_MODEL:-openai/gpt-oss-120b}
28-
- FEEDBACK_MODEL=${FEEDBACK_MODEL:-openai/gpt-oss-120b}
25+
- ANNOTATION_MODEL=${ANNOTATION_MODEL:-anthropic/claude-haiku-4.5}
26+
- ANNOTATION_PROVIDER=${ANNOTATION_PROVIDER:-anthropic}
27+
- EVALUATION_MODEL=${EVALUATION_MODEL:-qwen/qwen3.5-122b-a10b}
28+
- EVALUATION_PROVIDER=${EVALUATION_PROVIDER:-alibaba}
29+
- VISION_MODEL=${VISION_MODEL:-qwen/qwen3.5-122b-a10b}
30+
- VISION_PROVIDER=${VISION_PROVIDER:-alibaba}
2931

3032
# LLM Settings
3133
- LLM_TEMPERATURE=${LLM_TEMPERATURE:-0.1}

docker-compose.yml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ services:
4242
# OpenRouter Configuration (used when LLM_PROVIDER=openrouter)
4343
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
4444
- LLM_PROVIDER_PREFERENCE=${LLM_PROVIDER_PREFERENCE}
45-
- ANNOTATION_MODEL=${ANNOTATION_MODEL:-openai/gpt-oss-120b}
46-
- EVALUATION_MODEL=${EVALUATION_MODEL:-qwen/qwen3-235b-a22b-2507}
47-
- ASSESSMENT_MODEL=${ASSESSMENT_MODEL:-openai/gpt-oss-120b}
48-
- FEEDBACK_MODEL=${FEEDBACK_MODEL:-openai/gpt-oss-120b}
45+
- ANNOTATION_MODEL=${ANNOTATION_MODEL:-anthropic/claude-haiku-4.5}
46+
- ANNOTATION_PROVIDER=${ANNOTATION_PROVIDER:-anthropic}
47+
- EVALUATION_MODEL=${EVALUATION_MODEL:-qwen/qwen3.5-122b-a10b}
48+
- EVALUATION_PROVIDER=${EVALUATION_PROVIDER:-alibaba}
49+
- VISION_MODEL=${VISION_MODEL:-qwen/qwen3.5-122b-a10b}
50+
- VISION_PROVIDER=${VISION_PROVIDER:-alibaba}
4951

5052
# Ollama Configuration (used when LLM_PROVIDER=ollama)
5153
- LLM_BASE_URL=${LLM_BASE_URL:-http://ollama:11434}

frontend/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ <h3>Status</h3>
12351235
<a href="https://docs.annotation.garden/projects/hedit/telemetry" target="_blank" rel="noopener noreferrer" title="Learn more about telemetry">Learn more</a>
12361236
</div>
12371237
<div class="model-info">
1238-
<span>Models: <a href="https://openrouter.ai/anthropic/claude-haiku-4.5" target="_blank" rel="noopener noreferrer">Claude Haiku 4.5</a> (annotation) · <a href="https://openrouter.ai/qwen/qwen3-vl-30b-a3b-instruct" target="_blank" rel="noopener noreferrer">Qwen3-VL-30B</a> (vision) · <a href="https://openrouter.ai/openai/gpt-oss-120b" target="_blank" rel="noopener noreferrer">GPT-OSS-120B</a> (evaluation) · To change models or use programmatically, install <a href="https://pypi.org/project/hedit/" target="_blank" rel="noopener noreferrer">HEDit CLI</a></span>
1238+
<span>Models: <a href="https://openrouter.ai/anthropic/claude-haiku-4.5" target="_blank" rel="noopener noreferrer">Claude Haiku 4.5</a> (annotation) · <a href="https://openrouter.ai/qwen/qwen3.5-122b-a10b" target="_blank" rel="noopener noreferrer">Qwen3.5-122B</a> (vision) · <a href="https://openrouter.ai/qwen/qwen3.5-122b-a10b" target="_blank" rel="noopener noreferrer">Qwen3.5-122B</a> (evaluation) · To change models or use programmatically, install <a href="https://pypi.org/project/hedit/" target="_blank" rel="noopener noreferrer">HEDit CLI</a></span>
12391239
</div>
12401240

12411241
<script src="config.js"></script>

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "hedit"
7-
version = "0.7.8a1"
7+
version = "0.7.9.dev0"
88
description = "Multi-agent system for HED annotation generation and validation"
99
readme = "PKG_README.md"
1010
requires-python = ">=3.12"

src/api/main.py

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

src/api/models.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,12 @@ class AnnotationRequest(BaseModel):
4141
model: str | None = Field(
4242
default=None,
4343
description="Override model for annotation (BYOK mode only, e.g., 'openai/gpt-4o')",
44-
examples=["anthropic/claude-haiku-4.5", "qwen/qwen3.5-122b-a10b", "qwen/qwen3.5-397b-a17b"],
44+
examples=["anthropic/claude-haiku-4.5", "qwen/qwen3.5-122b-a10b"],
4545
)
4646
provider: str | None = Field(
4747
default=None,
48-
description="Override provider preference (BYOK mode only, e.g., 'Cerebras')",
49-
examples=["Cerebras", "deepinfra/fp8", None],
48+
description="Override provider preference (BYOK mode only, e.g., 'anthropic')",
49+
examples=["anthropic", "alibaba", None],
5050
)
5151
temperature: float | None = Field(
5252
default=None,
@@ -177,12 +177,17 @@ class ImageAnnotationRequest(BaseModel):
177177
vision_model: str | None = Field(
178178
default=None,
179179
description="Override vision model for image description (BYOK mode only)",
180-
examples=["qwen/qwen3-vl-32b-instruct", "qwen/qwen3-vl-235b-a22b-instruct"],
180+
examples=["qwen/qwen3.5-122b-a10b", "qwen/qwen3-vl-235b-a22b-instruct"],
181+
)
182+
vision_provider: str | None = Field(
183+
default=None,
184+
description="Override vision model provider (BYOK mode only, e.g., 'alibaba')",
185+
examples=["alibaba", "novita", None],
181186
)
182187
provider: str | None = Field(
183188
default=None,
184-
description="Override provider preference (BYOK mode only, e.g., 'Cerebras')",
185-
examples=["Cerebras", "deepinfra/fp8", None],
189+
description="Override annotation provider preference (BYOK mode only, e.g., 'anthropic')",
190+
examples=["anthropic", "alibaba", None],
186191
)
187192
temperature: float | None = Field(
188193
default=None,

src/cli/client.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,14 @@ def _handle_response(self, response: httpx.Response) -> dict[str, Any]:
139139
raise APIError(
140140
"Service unavailable",
141141
status_code=503,
142-
detail="The API is temporarily unavailable. Please try again later.",
142+
detail=detail or "The API is temporarily unavailable. Please try again later.",
143+
)
144+
elif response.status_code == 504:
145+
raise APIError(
146+
"Gateway timeout",
147+
status_code=504,
148+
detail="The server took too long to respond. Try a faster model/provider "
149+
"or use --standalone mode.",
143150
)
144151
else:
145152
raise APIError(

src/cli/config.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,13 @@
4141
DEFAULT_MODEL = "anthropic/claude-haiku-4.5"
4242
DEFAULT_PROVIDER = "anthropic"
4343

44-
# Evaluation model: Qwen3.5-397B MoE (most capable Qwen, high throughput)
45-
DEFAULT_EVAL_MODEL = "qwen/qwen3.5-397b-a17b"
46-
DEFAULT_EVAL_PROVIDER = None
44+
# Evaluation model: Qwen3.5-122B MoE (fast, capable, cost-effective via Alibaba)
45+
DEFAULT_EVAL_MODEL = "qwen/qwen3.5-122b-a10b"
46+
DEFAULT_EVAL_PROVIDER = "alibaba"
4747

48-
# Vision model: Qwen3-VL-32B for image descriptions
49-
DEFAULT_VISION_MODEL = "qwen/qwen3-vl-32b-instruct"
50-
DEFAULT_VISION_PROVIDER = None
48+
# Vision model: Qwen3.5-122B MoE (accepts vision, fast via Alibaba)
49+
DEFAULT_VISION_MODEL = "qwen/qwen3.5-122b-a10b"
50+
DEFAULT_VISION_PROVIDER = "alibaba"
5151

5252

5353
class CredentialsConfig(BaseModel):
@@ -69,12 +69,12 @@ class ModelsConfig(BaseModel):
6969
)
7070
eval_provider: str | None = Field(
7171
default=DEFAULT_EVAL_PROVIDER,
72-
description="Provider for evaluation model (None = OpenRouter auto-routes)",
72+
description="Provider for evaluation model (default: alibaba)",
7373
)
7474
vision: str = Field(default=DEFAULT_VISION_MODEL, description="Vision model for images")
7575
vision_provider: str | None = Field(
7676
default=DEFAULT_VISION_PROVIDER,
77-
description="Provider for vision model (deepinfra/fp8 for qwen-vl)",
77+
description="Provider for vision model (alibaba for qwen)",
7878
)
7979
temperature: float = Field(default=0.1, ge=0.0, le=1.0, description="Model temperature")
8080

@@ -237,8 +237,8 @@ def get_effective_config(
237237
api_url: Override API URL
238238
model: Override model (if non-default, clears provider unless explicitly set)
239239
eval_model: Override evaluation model (for consistent benchmarking)
240-
eval_provider: Override provider for evaluation model (e.g., "Cerebras")
241-
provider: Override provider preference (e.g., "Cerebras")
240+
eval_provider: Override provider for evaluation model (e.g., "alibaba")
241+
provider: Override provider preference (e.g., "anthropic")
242242
temperature: Override temperature
243243
schema_version: Override schema version
244244
output_format: Override output format

0 commit comments

Comments
 (0)