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.
Files changed (87) hide show
  1. {hedit-0.7.8.dev1/hedit.egg-info → hedit-0.7.9.dev1}/PKG-INFO +1 -1
  2. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1/hedit.egg-info}/PKG-INFO +1 -1
  3. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/pyproject.toml +1 -1
  4. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/main.py +39 -18
  5. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/models.py +11 -6
  6. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/client.py +8 -1
  7. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/config.py +10 -10
  8. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/local_executor.py +6 -4
  9. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/main.py +1 -0
  10. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/openrouter_llm.py +2 -2
  11. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/version.py +2 -2
  12. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/LICENSE +0 -0
  13. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/PKG_README.md +0 -0
  14. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/README.md +0 -0
  15. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/SOURCES.txt +0 -0
  16. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/dependency_links.txt +0 -0
  17. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/entry_points.txt +0 -0
  18. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/requires.txt +0 -0
  19. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/hedit.egg-info/top_level.txt +0 -0
  20. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/setup.cfg +0 -0
  21. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/__init__.py +0 -0
  22. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/__init__.py +0 -0
  23. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/annotation_agent.py +0 -0
  24. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/assessment_agent.py +0 -0
  25. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/evaluation_agent.py +0 -0
  26. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/feedback_summarizer.py +0 -0
  27. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/feedback_triage_agent.py +0 -0
  28. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/state.py +0 -0
  29. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/validation_agent.py +0 -0
  30. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/vision_agent.py +0 -0
  31. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/agents/workflow.py +0 -0
  32. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/__init__.py +0 -0
  33. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/api/security.py +0 -0
  34. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/__init__.py +0 -0
  35. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/api_executor.py +0 -0
  36. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/commands/__init__.py +0 -0
  37. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/executor.py +0 -0
  38. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/cli/output.py +0 -0
  39. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/__init__.py +0 -0
  40. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/hed-docs/02_Terminology.md +0 -0
  41. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/hed-docs/HedAnnotationSemantics.md +0 -0
  42. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/data/hed-docs/manifest.json +0 -0
  43. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/scripts/__init__.py +0 -0
  44. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/scripts/process_feedback.py +0 -0
  45. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/__init__.py +0 -0
  46. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/collector.py +0 -0
  47. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/schema.py +0 -0
  48. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/telemetry/storage.py +0 -0
  49. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/__init__.py +0 -0
  50. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/error_remediation.py +0 -0
  51. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/github_client.py +0 -0
  52. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/hed_comprehensive_guide.py +0 -0
  53. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/hed_docs_loader.py +0 -0
  54. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/image_processing.py +0 -0
  55. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/json_schema_loader.py +0 -0
  56. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/litellm_llm.py +0 -0
  57. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/utils/schema_loader.py +0 -0
  58. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/validation/__init__.py +0 -0
  59. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/validation/hed_lsp.py +0 -0
  60. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/src/validation/hed_validator.py +0 -0
  61. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_annotation_agent.py +0 -0
  62. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_api_endpoints.py +0 -0
  63. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_client.py +0 -0
  64. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_config.py +0 -0
  65. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_integration.py +0 -0
  66. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_cli_main.py +0 -0
  67. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_comprehensive_guide.py +0 -0
  68. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_error_remediation.py +0 -0
  69. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_feedback_integration.py +0 -0
  70. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_feedback_triage.py +0 -0
  71. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_fetch_hed_docs.py +0 -0
  72. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_github_client.py +0 -0
  73. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_hed_docs_loader.py +0 -0
  74. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_hed_lsp.py +0 -0
  75. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_integration_openrouter.py +0 -0
  76. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_json_schema_loader.py +0 -0
  77. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_keyword_extraction.py +0 -0
  78. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_litellm_llm.py +0 -0
  79. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_no_extend_propagation.py +0 -0
  80. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_openrouter_llm.py +0 -0
  81. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_schema_loader.py +0 -0
  82. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_security.py +0 -0
  83. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_state.py +0 -0
  84. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_telemetry.py +0 -0
  85. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_validation.py +0 -0
  86. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_validation_agent.py +0 -0
  87. {hedit-0.7.8.dev1 → hedit-0.7.9.dev1}/tests/test_version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hedit
3
- Version: 0.7.8.dev1
3
+ Version: 0.7.9.dev1
4
4
  Summary: Multi-agent system for HED annotation generation and validation
5
5
  Author-email: Annotation Garden Initiative <info@annotation.garden>
6
6
  License-Expression: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hedit
3
- Version: 0.7.8.dev1
3
+ Version: 0.7.9.dev1
4
4
  Summary: Multi-agent system for HED annotation generation and validation
5
5
  Author-email: Annotation Garden Initiative <info@annotation.garden>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "hedit"
7
- version = "0.7.8.dev1"
7
+ version = "0.7.9.dev1"
8
8
  description = "Multi-agent system for HED annotation generation and validation"
9
9
  readme = "PKG_README.md"
10
10
  requires-python = ">=3.12"
@@ -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 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")
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-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")
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-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")
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-397b-a17b')}")
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', '') or '(auto-routed)'}")
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-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")
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=provider_override,
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 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
+ )
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=provider_override,
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 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
+ )
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", "qwen/qwen3.5-397b-a17b"],
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., 'Cerebras')",
49
- examples=["Cerebras", "deepinfra/fp8", None],
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-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],
181
186
  )
182
187
  provider: str | None = Field(
183
188
  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],
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-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"
47
47
 
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"
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 (None = OpenRouter auto-routes)",
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 (deepinfra/fp8 for qwen-vl)",
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., "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")
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-397b-a17b)
82
- eval_provider: Provider for evaluation model (None = OpenRouter auto-routes)
83
- vision_model: Model for image annotation (default: qwen/qwen3-vl-32b-instruct)
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-397b-a17b")
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., "Cerebras", "Anthropic")
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.
@@ -1,7 +1,7 @@
1
1
  """Version information for HEDit."""
2
2
 
3
- __version__ = "0.7.8.dev1"
4
- __version_info__ = (0, 7, 8, "dev")
3
+ __version__ = "0.7.9.dev1"
4
+ __version_info__ = (0, 7, 9, "dev")
5
5
 
6
6
 
7
7
  def get_version() -> str:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes