Skip to content

Commit f75c2d3

Browse files
authored
fix(core): Record.path was incorrectly treated as required under Pydantic v2 (#7048)
* fix: make Record.path optional for pydantic v2 compatibility * fix: preserve telegram voice record path
1 parent 2b435e0 commit f75c2d3

File tree

3 files changed

+39
-5
lines changed

3 files changed

+39
-5
lines changed

astrbot/core/message/components.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class Record(BaseMessageComponent):
122122
# Original text content (e.g. TTS source text), used as caption in fallback scenarios
123123
text: str | None = None
124124
# 额外
125-
path: str | None
125+
path: str | None = None
126126

127127
def __init__(self, file: str | None, **_) -> None:
128128
for k in _:

astrbot/core/platform/sources/telegram/tg_adapter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -458,9 +458,9 @@ def _apply_caption() -> None:
458458
)
459459
path_wav = await convert_audio_to_wav(temp_path, path_wav)
460460

461-
message.message = [
462-
Comp.Record(file=path_wav, url=path_wav),
463-
]
461+
record = Comp.Record(file=path_wav, url=path_wav)
462+
record.path = path_wav
463+
message.message = [record]
464464

465465
elif update.message.photo:
466466
photo = update.message.photo[-1] # get the largest photo

tests/test_telegram_adapter.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import asyncio
22
import importlib
33
import sys
4-
from unittest.mock import MagicMock, patch
4+
from unittest.mock import AsyncMock, MagicMock, patch
55

66
import pytest
77

@@ -106,3 +106,37 @@ async def test_telegram_video_caption_populates_message_text_and_plain():
106106
isinstance(component, Comp.Plain) and component.text == "这段视频讲了什么"
107107
for component in result.message
108108
)
109+
110+
111+
@pytest.mark.asyncio
112+
async def test_telegram_voice_message_creates_record_component(tmp_path):
113+
TelegramPlatformAdapter = _load_telegram_adapter()
114+
adapter = TelegramPlatformAdapter(
115+
make_platform_config("telegram"),
116+
{},
117+
asyncio.Queue(),
118+
)
119+
voice = create_mock_file("https://api.telegram.org/file/test/voice.oga")
120+
update = create_mock_update(
121+
message_text=None,
122+
voice=voice,
123+
)
124+
wav_path = tmp_path / "voice.oga.wav"
125+
convert_message_globals = adapter.convert_message.__func__.__globals__
126+
127+
with patch.dict(
128+
convert_message_globals,
129+
{
130+
"get_astrbot_temp_path": MagicMock(return_value=str(tmp_path)),
131+
"download_file": AsyncMock(),
132+
"convert_audio_to_wav": AsyncMock(return_value=str(wav_path)),
133+
},
134+
):
135+
result = await adapter.convert_message(update, _build_context())
136+
137+
assert result is not None
138+
assert len(result.message) == 1
139+
assert isinstance(result.message[0], Comp.Record)
140+
assert result.message[0].file == str(wav_path)
141+
assert result.message[0].path == str(wav_path)
142+
assert result.message[0].url == str(wav_path)

0 commit comments

Comments
 (0)