diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ddd51..dbde262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/). ## [Unreleased] +### KI-Modellkennungen / AI model IDs (2026-10-15, integriert 2026-11-11) +- Die Claude-4.6-Modellkennungen für Sonnet und Opus verwenden das dokumentierte Format ohne Datumsanhang. Die Haiku-4.5-Kennung bleibt unverändert. +- Regressionstests prüfen die an das SDK übergebenen Modellkennungen für Standardauswahl, Opus und Haiku mit einem Testdouble, ohne echte API-Anfragen. + ### Software-Entwicklung: Windows Store Packaging, Tier-2 6-Sprachen-Harmonisierung nach Policy P-006 (DE, EN, ES, ZH, JA, RU), Staging in releases/windowsstore/, Preflight-Readiness Linter scripts/check_store_readiness.py und Test-Suite-Ausbau (2026-11-08) [G 2026-11-08] - Tier-2 6-Sprachen Store-Packaging nach Policy P-006 (DE, EN, ES, ZH, JA, RU): - `store_package.json`: languages-Array um alle 6 Tier-2-Sprachen (`de-DE`, `en-US`, `es-ES`, `zh-CN`, `ja-JP`, `ru-RU`) erweitert; Store-konforme Kurzbeschreibungen (`description_de/en/es/zh/ja/ru`) strikt <= 100 Zeichen validiert; je genau 7 Richtlinien-konforme Keywords nach Microsoft Partner Center Policy 10.1.3 (<= 30 Zeichen, 0 geschützte Drittmarken) eingepflegt. diff --git a/src/modules/ai_assistant/ai_service.py b/src/modules/ai_assistant/ai_service.py index 4d6d080..8bcf321 100644 --- a/src/modules/ai_assistant/ai_service.py +++ b/src/modules/ai_assistant/ai_service.py @@ -14,8 +14,8 @@ class AIModel(Enum): """Verfügbare AI-Modelle""" - CLAUDE_SONNET = "claude-sonnet-4-6-20250514" - CLAUDE_OPUS = "claude-opus-4-6-20250514" + CLAUDE_SONNET = "claude-sonnet-4-6" + CLAUDE_OPUS = "claude-opus-4-6" CLAUDE_HAIKU = "claude-haiku-4-5-20251001" diff --git a/tests/test_ai_model_ids.py b/tests/test_ai_model_ids.py new file mode 100644 index 0000000..65dd17f --- /dev/null +++ b/tests/test_ai_model_ids.py @@ -0,0 +1,45 @@ +"""Verify the actual SDK payload without importing a real provider client.""" + +import asyncio +import sys +from types import SimpleNamespace +from unittest.mock import Mock + +import pytest + +from modules.ai_assistant.ai_service import AIModel, AIService + + +@pytest.mark.parametrize( + ("selection", "expected"), + [ + (None, "claude-sonnet-4-6"), + (AIModel.CLAUDE_OPUS, "claude-opus-4-6"), + (AIModel.CLAUDE_HAIKU, "claude-haiku-4-5-20251001"), + ], +) +def test_complete_sends_documented_model_id(monkeypatch, selection, expected): + """The default and selectable models must reach the SDK with valid IDs.""" + create = Mock( + return_value=SimpleNamespace( + content=[SimpleNamespace(text="fixture response")], + model=expected, + usage=SimpleNamespace(input_tokens=1, output_tokens=1), + ) + ) + client = SimpleNamespace(messages=SimpleNamespace(create=create)) + monkeypatch.setitem( + sys.modules, "anthropic", SimpleNamespace(Anthropic=Mock(return_value=client)) + ) + service = AIService(api_key="fixture-not-a-real-key") + if selection is not None: + service.set_model(selection) + + result = asyncio.run(service.complete("fixture prompt", use_history=False)) + + assert result.success + create.assert_called_once() + assert create.call_args.kwargs["model"] == expected + assert create.call_args.kwargs["messages"] == [ + {"role": "user", "content": "fixture prompt"} + ]