Files
OpenMesh/tests/test_model_errors.py
zhaolei 6f402ffcee
Some checks failed
CI / pytest (push) Has been cancelled
CI / gui-unit (push) Has been cancelled
CI / gui-e2e (push) Has been cancelled
feat: OpenMesh 基础平台与 MD/PDF 转换技能
- 后端: coworker 智能体框架, WS API, 文件上传, 附件处理
- 前端: Open WebUI, 文件全量走 upload API (含 MD/TXT/JSON 等文本类)
- 技能: md-to-office (pandoc + wkhtmltopdf)
- 修复: 上传文件路径丢失, Agent 搜索浪费, 输出文件跑到 uploads/
- 打包: PyInstaller one-dir, 预打包 pandoc/wkhtmltopdf/chromium
2026-09-13 23:41:04 +08:00

87 lines
3.3 KiB
Python

"""New-flagship rollout (2026-07-14): GPT-5.6 Sol/Terra/Luna + Claude Fable 5 in the
matrix, both families' flagships as defaults, and friendly errors when an account can't
use them (GPT-5.6 rolls out per-organization; quota/credits can run out on any model).
"""
from coworker.config import Config
from coworker.providers.errors import friendly_model_error
from coworker.providers.matrix import MATRIX, models_for_provider
from coworker.providers.registry import get_descriptor
def test_new_flagships_in_matrix_with_labels():
for mid, label in {
"gpt-5.6-sol": "GPT-5.6 Sol · OpenAI",
"gpt-5.6-terra": "GPT-5.6 Terra · OpenAI",
"gpt-5.6-luna": "GPT-5.6 Luna · OpenAI",
"anthropic:claude-fable-5": "Claude Fable 5 · Anthropic",
}.items():
assert MATRIX[mid].label == label
assert MATRIX[mid].caps.tools and MATRIX[mid].caps.vision
assert "gpt-5.6-sol" in models_for_provider("openai")
assert "claude-fable-5" in models_for_provider("anthropic")
def test_flagships_are_the_defaults():
assert Config().model == "gpt-5.6-sol"
assert get_descriptor("openai").recommended_model == "gpt-5.6-sol"
assert get_descriptor("anthropic").recommended_model == "claude-fable-5"
# -- friendly access/quota errors --------------------------------------------------------
def test_no_access_errors_are_translated():
# OpenAI's 404/403 body for a model the org can't use yet
exc = RuntimeError(
"Error code: 404 - {'error': {'code': 'model_not_found', 'message': "
"'The model `gpt-5.6-sol` does not exist or you do not have access to it.'}}"
)
msg = friendly_model_error("gpt-5.6-sol", exc)
assert msg and "doesn't have access to gpt-5.6-sol" in msg
# Anthropic's 404 body is type not_found_error + "model: <id>"
exc = RuntimeError(
"Error code: 404 - {'type': 'error', 'error': {'type': 'not_found_error', "
"'message': 'model: claude-fable-5'}}"
)
msg = friendly_model_error("anthropic:claude-fable-5", exc)
assert msg and "doesn't have access to anthropic:claude-fable-5" in msg
def test_quota_errors_are_translated():
exc = RuntimeError(
"Error code: 429 - {'error': {'code': 'insufficient_quota', 'message': "
"'You exceeded your current quota, please check your plan and billing details.'}}"
)
msg = friendly_model_error("gpt-5.6-sol", exc)
assert msg and "out of quota for gpt-5.6-sol" in msg
exc = RuntimeError(
"Error code: 400 - {'type': 'error', 'error': {'type': 'invalid_request_error', "
"'message': 'Your credit balance is too low to access the Anthropic API.'}}"
)
msg = friendly_model_error("anthropic:claude-fable-5", exc)
assert msg and "out of quota" in msg
def test_unrelated_errors_pass_through_raw():
# a plain rate-limit (429 without a quota code) must NOT be dressed up
assert (
friendly_model_error(
"gpt-5.6-sol",
RuntimeError("Error code: 429 - rate_limit_exceeded, retry after 2s"),
)
is None
)
# a 404 from a wrong base_url isn't an access problem
assert (
friendly_model_error(
"gpt-5.6-sol", RuntimeError("Error code: 404 - no route /v2/chat")
)
is None
)
assert (
friendly_model_error("gpt-5.6-sol", RuntimeError("connection reset by peer"))
is None
)