hedit 0.7.8.dev1__tar.gz → 0.7.9.dev1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hedit-0.7.8.dev1/hedit.egg-info → hedit-0.7.9.dev1}/PKG-INFO +1 -1
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1/hedit.egg-info}/PKG-INFO +1 -1
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/pyproject.toml +1 -1
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/main.py +39 -18
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/models.py +11 -6
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/client.py +8 -1
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/config.py +10 -10
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/local_executor.py +6 -4
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/main.py +1 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/openrouter_llm.py +2 -2
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/version.py +2 -2
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/LICENSE +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/PKG_README.md +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/README.md +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/SOURCES.txt +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/dependency_links.txt +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/entry_points.txt +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/requires.txt +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/top_level.txt +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/setup.cfg +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/annotation_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/assessment_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/evaluation_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/feedback_summarizer.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/feedback_triage_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/state.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/validation_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/vision_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/workflow.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/security.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/api_executor.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/commands/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/executor.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/output.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/hed-docs/02_Terminology.md +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/hed-docs/HedAnnotationSemantics.md +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/hed-docs/manifest.json +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/scripts/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/scripts/process_feedback.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/collector.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/schema.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/storage.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/error_remediation.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/github_client.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/hed_comprehensive_guide.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/hed_docs_loader.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/image_processing.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/json_schema_loader.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/litellm_llm.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/schema_loader.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/validation/__init__.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/validation/hed_lsp.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/validation/hed_validator.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_annotation_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_api_endpoints.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_client.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_config.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_integration.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_main.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_comprehensive_guide.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_error_remediation.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_feedback_integration.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_feedback_triage.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_fetch_hed_docs.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_github_client.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_hed_docs_loader.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_hed_lsp.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_integration_openrouter.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_json_schema_loader.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_keyword_extraction.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_litellm_llm.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_no_extend_propagation.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_openrouter_llm.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_schema_loader.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_security.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_state.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_telemetry.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_validation.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_validation_agent.py +0 -0
- {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_version.py +0 -0
|
@@ -99,8 +99,8 @@ def create_openrouter_workflow(
|
|
|
99
99
|
api_key: OpenRouter API key
|
|
100
100
|
annotation_model: Model for annotation (default: ANNOTATION_MODEL env or Claude Haiku 4.5)
|
|
101
101
|
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
|
|
103
|
-
eval_provider: Provider for eval models (default: EVALUATION_PROVIDER env or "
|
|
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")
|
|
104
104
|
temperature: LLM temperature (default: 0.1)
|
|
105
105
|
user_id: User ID for cache optimization (derived from API key if not provided)
|
|
106
106
|
schema_dir: Path to HED schemas (None = fetch from GitHub)
|
|
@@ -113,8 +113,8 @@ def create_openrouter_workflow(
|
|
|
113
113
|
# Apply defaults from environment
|
|
114
114
|
default_annotation_model = os.getenv("ANNOTATION_MODEL", "anthropic/claude-haiku-4.5")
|
|
115
115
|
default_annotation_provider = os.getenv("ANNOTATION_PROVIDER", "anthropic")
|
|
116
|
-
default_eval_model = os.getenv("EVALUATION_MODEL", "qwen/qwen3.5-
|
|
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")
|
|
118
118
|
|
|
119
119
|
# Resolve final values: parameter > env var > default
|
|
120
120
|
actual_annotation_model = get_model_name(annotation_model or default_annotation_model)
|
|
@@ -240,8 +240,8 @@ def create_byok_vision_agent(
|
|
|
240
240
|
Configured VisionAgent using the user's key and model settings
|
|
241
241
|
"""
|
|
242
242
|
# Use user-provided settings or fall back to server defaults
|
|
243
|
-
default_vision_model = os.getenv("VISION_MODEL", "qwen/qwen3-
|
|
244
|
-
default_vision_provider = os.getenv("VISION_PROVIDER", "
|
|
243
|
+
default_vision_model = os.getenv("VISION_MODEL", "qwen/qwen3.5-122b-a10b")
|
|
244
|
+
default_vision_provider = os.getenv("VISION_PROVIDER", "alibaba")
|
|
245
245
|
|
|
246
246
|
actual_model = vision_model if vision_model else default_vision_model
|
|
247
247
|
actual_temperature = temperature if temperature is not None else 0.3
|
|
@@ -354,9 +354,9 @@ async def lifespan(app: FastAPI):
|
|
|
354
354
|
# Log configuration (env vars are read by create_openrouter_workflow)
|
|
355
355
|
print("Using OpenRouter with models:")
|
|
356
356
|
print(f" Annotation: {os.getenv('ANNOTATION_MODEL', 'anthropic/claude-haiku-4.5')}")
|
|
357
|
-
print(f" Evaluation: {os.getenv('EVALUATION_MODEL', 'qwen/qwen3.5-
|
|
357
|
+
print(f" Evaluation: {os.getenv('EVALUATION_MODEL', 'qwen/qwen3.5-122b-a10b')}")
|
|
358
358
|
print(f" Provider (annotation): {os.getenv('ANNOTATION_PROVIDER', 'anthropic')}")
|
|
359
|
-
print(f" Provider (eval): {os.getenv('EVALUATION_PROVIDER', '')
|
|
359
|
+
print(f" Provider (eval): {os.getenv('EVALUATION_PROVIDER', 'alibaba')}")
|
|
360
360
|
|
|
361
361
|
workflow = create_openrouter_workflow(
|
|
362
362
|
api_key=openrouter_api_key,
|
|
@@ -395,8 +395,8 @@ async def lifespan(app: FastAPI):
|
|
|
395
395
|
|
|
396
396
|
# Initialize vision agent (only for OpenRouter)
|
|
397
397
|
if llm_provider == "openrouter":
|
|
398
|
-
vision_model = os.getenv("VISION_MODEL", "qwen/qwen3-
|
|
399
|
-
vision_provider = os.getenv("VISION_PROVIDER", "
|
|
398
|
+
vision_model = os.getenv("VISION_MODEL", "qwen/qwen3.5-122b-a10b")
|
|
399
|
+
vision_provider = os.getenv("VISION_PROVIDER", "alibaba")
|
|
400
400
|
|
|
401
401
|
print(f"Initializing vision model: {vision_model} (provider: {vision_provider})")
|
|
402
402
|
|
|
@@ -486,6 +486,7 @@ app.add_middleware(
|
|
|
486
486
|
"X-OpenRouter-Key", # BYOK mode
|
|
487
487
|
"X-OpenRouter-Model", # BYOK model override
|
|
488
488
|
"X-OpenRouter-Vision-Model", # BYOK vision model override
|
|
489
|
+
"X-OpenRouter-Vision-Provider", # BYOK vision provider override
|
|
489
490
|
"X-OpenRouter-Provider", # BYOK provider preference
|
|
490
491
|
"X-OpenRouter-Temperature", # BYOK temperature override
|
|
491
492
|
"X-OpenRouter-Eval-Model", # BYOK eval model override
|
|
@@ -754,6 +755,9 @@ async def annotate_from_image(
|
|
|
754
755
|
# Check for model override headers (from frontend dropdown or CLI)
|
|
755
756
|
model_override = request.model or req.headers.get("x-openrouter-model")
|
|
756
757
|
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
|
+
)
|
|
757
761
|
provider_override = request.provider or req.headers.get("x-openrouter-provider")
|
|
758
762
|
eval_model_override = req.headers.get("x-openrouter-eval-model")
|
|
759
763
|
eval_provider_override = req.headers.get("x-openrouter-eval-provider")
|
|
@@ -782,14 +786,20 @@ async def annotate_from_image(
|
|
|
782
786
|
temperature=temperature,
|
|
783
787
|
user_id_override=user_id_override,
|
|
784
788
|
)
|
|
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
|
+
)
|
|
785
794
|
active_vision_agent = create_byok_vision_agent(
|
|
786
795
|
openrouter_key,
|
|
787
796
|
vision_model=vision_model_override,
|
|
788
|
-
provider=
|
|
797
|
+
provider=vision_provider,
|
|
789
798
|
temperature=temperature,
|
|
790
799
|
user_id_override=user_id_override,
|
|
791
800
|
)
|
|
792
801
|
except Exception as e:
|
|
802
|
+
logging.exception("Failed to initialize BYOK agents")
|
|
793
803
|
raise HTTPException(
|
|
794
804
|
status_code=500, detail=f"Failed to initialize BYOK agents: {str(e)}"
|
|
795
805
|
) from e
|
|
@@ -815,9 +825,10 @@ async def annotate_from_image(
|
|
|
815
825
|
validator_path=_byok_config.get("validator_path"),
|
|
816
826
|
use_js_validator=_byok_config.get("use_js_validator", True),
|
|
817
827
|
)
|
|
818
|
-
# Note: Vision agent uses
|
|
819
|
-
|
|
820
|
-
|
|
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
|
+
)
|
|
821
832
|
active_vision_agent = create_byok_vision_agent(
|
|
822
833
|
server_api_key,
|
|
823
834
|
vision_model=vision_model_override,
|
|
@@ -1329,6 +1340,9 @@ async def annotate_from_image_stream(
|
|
|
1329
1340
|
# Determine which workflow and vision agent to use (same logic as /annotate-from-image)
|
|
1330
1341
|
model_override = request.model or req.headers.get("x-openrouter-model")
|
|
1331
1342
|
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
|
+
)
|
|
1332
1346
|
provider_override = request.provider or req.headers.get("x-openrouter-provider")
|
|
1333
1347
|
eval_model_override = req.headers.get("x-openrouter-eval-model")
|
|
1334
1348
|
eval_provider_override = req.headers.get("x-openrouter-eval-provider")
|
|
@@ -1355,14 +1369,20 @@ async def annotate_from_image_stream(
|
|
|
1355
1369
|
temperature=temperature,
|
|
1356
1370
|
user_id_override=user_id_override,
|
|
1357
1371
|
)
|
|
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
|
+
)
|
|
1358
1377
|
active_vision_agent = create_byok_vision_agent(
|
|
1359
1378
|
openrouter_key,
|
|
1360
1379
|
vision_model=vision_model_override,
|
|
1361
|
-
provider=
|
|
1380
|
+
provider=vision_provider,
|
|
1362
1381
|
temperature=temperature,
|
|
1363
1382
|
user_id_override=user_id_override,
|
|
1364
1383
|
)
|
|
1365
1384
|
except Exception as e:
|
|
1385
|
+
logging.exception("Failed to initialize BYOK agents")
|
|
1366
1386
|
raise HTTPException(
|
|
1367
1387
|
status_code=500, detail=f"Failed to initialize BYOK agents: {str(e)}"
|
|
1368
1388
|
) from e
|
|
@@ -1386,9 +1406,10 @@ async def annotate_from_image_stream(
|
|
|
1386
1406
|
validator_path=_byok_config.get("validator_path"),
|
|
1387
1407
|
use_js_validator=_byok_config.get("use_js_validator", True),
|
|
1388
1408
|
)
|
|
1389
|
-
# Note: Vision agent uses
|
|
1390
|
-
|
|
1391
|
-
|
|
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
|
+
)
|
|
1392
1413
|
active_vision_agent = create_byok_vision_agent(
|
|
1393
1414
|
server_api_key,
|
|
1394
1415
|
vision_model=vision_model_override,
|
|
@@ -41,12 +41,12 @@ class AnnotationRequest(BaseModel):
|
|
|
41
41
|
model: str | None = Field(
|
|
42
42
|
default=None,
|
|
43
43
|
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"
|
|
44
|
+
examples=["anthropic/claude-haiku-4.5", "qwen/qwen3.5-122b-a10b"],
|
|
45
45
|
)
|
|
46
46
|
provider: str | None = Field(
|
|
47
47
|
default=None,
|
|
48
|
-
description="Override provider preference (BYOK mode only, e.g., '
|
|
49
|
-
examples=["
|
|
48
|
+
description="Override provider preference (BYOK mode only, e.g., 'anthropic')",
|
|
49
|
+
examples=["anthropic", "alibaba", None],
|
|
50
50
|
)
|
|
51
51
|
temperature: float | None = Field(
|
|
52
52
|
default=None,
|
|
@@ -177,12 +177,17 @@ class ImageAnnotationRequest(BaseModel):
|
|
|
177
177
|
vision_model: str | None = Field(
|
|
178
178
|
default=None,
|
|
179
179
|
description="Override vision model for image description (BYOK mode only)",
|
|
180
|
-
examples=["qwen/qwen3-
|
|
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],
|
|
181
186
|
)
|
|
182
187
|
provider: str | None = Field(
|
|
183
188
|
default=None,
|
|
184
|
-
description="Override provider preference (BYOK mode only, e.g., '
|
|
185
|
-
examples=["
|
|
189
|
+
description="Override annotation provider preference (BYOK mode only, e.g., 'anthropic')",
|
|
190
|
+
examples=["anthropic", "alibaba", None],
|
|
186
191
|
)
|
|
187
192
|
temperature: float | None = Field(
|
|
188
193
|
default=None,
|
|
@@ -139,7 +139,14 @@ class HEDitClient:
|
|
|
139
139
|
raise APIError(
|
|
140
140
|
"Service unavailable",
|
|
141
141
|
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.",
|
|
143
150
|
)
|
|
144
151
|
else:
|
|
145
152
|
raise APIError(
|
|
@@ -41,13 +41,13 @@ DEFAULT_DEV_API_URL = "https://api.annotation.garden/hedit-dev"
|
|
|
41
41
|
DEFAULT_MODEL = "anthropic/claude-haiku-4.5"
|
|
42
42
|
DEFAULT_PROVIDER = "anthropic"
|
|
43
43
|
|
|
44
|
-
# Evaluation model: Qwen3.5-
|
|
45
|
-
DEFAULT_EVAL_MODEL = "qwen/qwen3.5-
|
|
46
|
-
DEFAULT_EVAL_PROVIDER =
|
|
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"
|
|
47
47
|
|
|
48
|
-
# Vision model: Qwen3-
|
|
49
|
-
DEFAULT_VISION_MODEL = "qwen/qwen3-
|
|
50
|
-
DEFAULT_VISION_PROVIDER =
|
|
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"
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
class CredentialsConfig(BaseModel):
|
|
@@ -69,12 +69,12 @@ class ModelsConfig(BaseModel):
|
|
|
69
69
|
)
|
|
70
70
|
eval_provider: str | None = Field(
|
|
71
71
|
default=DEFAULT_EVAL_PROVIDER,
|
|
72
|
-
description="Provider for evaluation model (
|
|
72
|
+
description="Provider for evaluation model (default: alibaba)",
|
|
73
73
|
)
|
|
74
74
|
vision: str = Field(default=DEFAULT_VISION_MODEL, description="Vision model for images")
|
|
75
75
|
vision_provider: str | None = Field(
|
|
76
76
|
default=DEFAULT_VISION_PROVIDER,
|
|
77
|
-
description="Provider for vision model (
|
|
77
|
+
description="Provider for vision model (alibaba for qwen)",
|
|
78
78
|
)
|
|
79
79
|
temperature: float = Field(default=0.1, ge=0.0, le=1.0, description="Model temperature")
|
|
80
80
|
|
|
@@ -237,8 +237,8 @@ def get_effective_config(
|
|
|
237
237
|
api_url: Override API URL
|
|
238
238
|
model: Override model (if non-default, clears provider unless explicitly set)
|
|
239
239
|
eval_model: Override evaluation model (for consistent benchmarking)
|
|
240
|
-
eval_provider: Override provider for evaluation model (e.g., "
|
|
241
|
-
provider: Override provider preference (e.g., "
|
|
240
|
+
eval_provider: Override provider for evaluation model (e.g., "alibaba")
|
|
241
|
+
provider: Override provider preference (e.g., "anthropic")
|
|
242
242
|
temperature: Override temperature
|
|
243
243
|
schema_version: Override schema version
|
|
244
244
|
output_format: Override output format
|
|
@@ -68,6 +68,7 @@ class LocalExecutionBackend(ExecutionBackend):
|
|
|
68
68
|
eval_model: str | None = None,
|
|
69
69
|
eval_provider: str | None = None,
|
|
70
70
|
vision_model: str | None = None,
|
|
71
|
+
vision_provider: str | None = None,
|
|
71
72
|
provider: str | None = None,
|
|
72
73
|
temperature: float = 0.1,
|
|
73
74
|
schema_dir: Path | str | None = None,
|
|
@@ -78,9 +79,10 @@ class LocalExecutionBackend(ExecutionBackend):
|
|
|
78
79
|
Args:
|
|
79
80
|
api_key: OpenRouter API key (required for LLM operations, optional for health/validate)
|
|
80
81
|
model: Model for text annotation (default: anthropic/claude-haiku-4.5)
|
|
81
|
-
eval_model: Model for evaluation/assessment agents (default: qwen/qwen3.5-
|
|
82
|
-
eval_provider: Provider for evaluation model (
|
|
83
|
-
vision_model: Model for image annotation (default: qwen/qwen3-
|
|
82
|
+
eval_model: Model for evaluation/assessment agents (default: qwen/qwen3.5-122b-a10b)
|
|
83
|
+
eval_provider: Provider for evaluation model (default: alibaba)
|
|
84
|
+
vision_model: Model for image annotation (default: qwen/qwen3.5-122b-a10b)
|
|
85
|
+
vision_provider: Provider for vision model (default: alibaba)
|
|
84
86
|
provider: Provider preference (cleared if custom model specified)
|
|
85
87
|
temperature: LLM temperature (0.0-1.0)
|
|
86
88
|
schema_dir: Optional directory with JSON schemas (None = fetch from GitHub)
|
|
@@ -102,7 +104,7 @@ class LocalExecutionBackend(ExecutionBackend):
|
|
|
102
104
|
self._eval_model = eval_model or DEFAULT_EVAL_MODEL
|
|
103
105
|
self._eval_provider = eval_provider or DEFAULT_EVAL_PROVIDER
|
|
104
106
|
self._vision_model = vision_model or DEFAULT_VISION_MODEL
|
|
105
|
-
self._vision_provider = DEFAULT_VISION_PROVIDER
|
|
107
|
+
self._vision_provider = vision_provider or DEFAULT_VISION_PROVIDER
|
|
106
108
|
self._temperature = temperature
|
|
107
109
|
self._schema_dir = Path(schema_dir) if schema_dir else None
|
|
108
110
|
self._user_id = user_id # Custom user ID (None = use auto-generated machine ID)
|
|
@@ -204,6 +204,7 @@ def get_executor(
|
|
|
204
204
|
eval_model=config.models.evaluation,
|
|
205
205
|
eval_provider=config.models.eval_provider,
|
|
206
206
|
vision_model=config.models.vision,
|
|
207
|
+
vision_provider=config.models.vision_provider,
|
|
207
208
|
provider=config.models.provider,
|
|
208
209
|
temperature=config.models.temperature,
|
|
209
210
|
user_id=user_id,
|
|
@@ -28,11 +28,11 @@ def create_openrouter_llm(
|
|
|
28
28
|
to include cache_control markers for 90% cost reduction on cache hits.
|
|
29
29
|
|
|
30
30
|
Args:
|
|
31
|
-
model: Model identifier (e.g., "anthropic/claude-haiku-4.5", "qwen/qwen3.5-
|
|
31
|
+
model: Model identifier (e.g., "anthropic/claude-haiku-4.5", "qwen/qwen3.5-122b-a10b")
|
|
32
32
|
api_key: OpenRouter API key (defaults to OPENROUTER_API_KEY env var)
|
|
33
33
|
temperature: Sampling temperature (0.0-1.0)
|
|
34
34
|
max_tokens: Maximum tokens to generate
|
|
35
|
-
provider: Specific provider to use (e.g., "
|
|
35
|
+
provider: Specific provider to use (e.g., "anthropic", "alibaba")
|
|
36
36
|
user_id: User identifier for cache optimization (sticky routing)
|
|
37
37
|
enable_caching: Enable Anthropic prompt caching. If None (default),
|
|
38
38
|
auto-enables for Anthropic Claude models.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|