diff --git a/src/logic/logic_ai_transcribe.erl b/src/logic/logic_ai_transcribe.erl index e5c95da..96b0a46 100644 --- a/src/logic/logic_ai_transcribe.erl +++ b/src/logic/logic_ai_transcribe.erl @@ -125,8 +125,9 @@ env_int(Name, Default) -> %%%=================================================================== call_provider(xai, Url, Key, Audio, CType) -> - %% xAI: multipart; опциональные поля до поля file, file — последним. - Body = build_multipart([{<<"format">>, <<"true">>}], Audio, <<"voice.dat">>, CType), + %% xAI: multipart без опциональных полей — язык определяется авто + %% (format=true требует явный language и отключает автоопределение). + Body = build_multipart([], Audio, <<"voice.dat">>, CType), post_and_parse(xai, Url, Key, Body); call_provider(openai, Url, Key, Audio, CType) -> Model = case env_bin("STT_MODEL") of diff --git a/test/unit/logic_ai_transcribe_tests.erl b/test/unit/logic_ai_transcribe_tests.erl index f64f96c..31a9637 100644 --- a/test/unit/logic_ai_transcribe_tests.erl +++ b/test/unit/logic_ai_transcribe_tests.erl @@ -56,13 +56,10 @@ test_xai_success() -> ?assertEqual(?XAI_URL, Url), ?assertEqual([{"authorization", "Bearer test-key"}], Headers), ?assertMatch("multipart/form-data; boundary=" ++ _, ContentType), - ?assertMatch({_, _}, binary:match(Body, <<"name=\"format\"">>)), ?assertMatch({_, _}, binary:match(Body, <<"name=\"file\"">>)), ?assertMatch({_, _}, binary:match(Body, <<"audio-bytes">>)), - %% Поле file — последнее (требование xAI). - {PosFormat, _} = binary:match(Body, <<"name=\"format\"">>), - {PosFile, _} = binary:match(Body, <<"name=\"file\"">>), - ?assert(PosFormat < PosFile). + %% Без поля format — язык определяется авто (format=true требует language). + ?assertEqual(nomatch, binary:match(Body, <<"name=\"format\"">>)). test_openai_adapter() -> os:putenv("STT_PROVIDER", "openai"),