88from PIL import Image as PILImage
99
1010import astrbot .core .provider .sources .openai_source as openai_source_module
11+ from astrbot .core .agent .message import ContentPart , TextPart
1112from astrbot .core .exceptions import EmptyModelOutputError
1213from astrbot .core .provider .sources .groq_source import ProviderGroq
1314from astrbot .core .provider .sources .openai_source import ProviderOpenAIOfficial
@@ -34,6 +35,15 @@ async def get_models(self) -> list[str]:
3435 return self ._models
3536
3637
38+ class _OpenCodeGoDelegateStub :
39+ def __init__ (self ):
40+ self .stream_kwargs : dict [str , object ] | None = None
41+
42+ async def text_chat_stream (self , ** kwargs ):
43+ self .stream_kwargs = kwargs
44+ yield SimpleNamespace (role = "assistant" )
45+
46+
3747class _OpenCodeGoUnitProvider (ProviderOpenCodeGo ):
3848 openai_provider : _ModelsProviderStub
3949
@@ -42,6 +52,14 @@ def __init__(self, models: list[str]):
4252 self .model_name = "kimi-k2.6"
4353
4454
55+ class _OpenCodeGoStreamUnitProvider (ProviderOpenCodeGo ):
56+ openai_provider : _OpenCodeGoDelegateStub
57+
58+ def __init__ (self , delegate : _OpenCodeGoDelegateStub ):
59+ self .openai_provider = delegate
60+ self .model_name = "kimi-k2.6"
61+
62+
4563def _make_provider (overrides : dict | None = None ) -> ProviderOpenAIOfficial :
4664 provider_config = {
4765 "id" : "test-openai" ,
@@ -481,6 +499,25 @@ def test_opencode_go_delegate_config_defaults_force_reasoning_content_only_when_
481499 assert config ["force_tool_call_reasoning_content" ] is False
482500
483501
502+ @pytest .mark .asyncio
503+ async def test_opencode_go_text_chat_stream_forwards_extra_user_content_parts ():
504+ delegate = _OpenCodeGoDelegateStub ()
505+ provider = _OpenCodeGoStreamUnitProvider (delegate )
506+ extra_parts : list [ContentPart ] = [TextPart (text = "extra context" )]
507+
508+ responses = [
509+ response
510+ async for response in provider .text_chat_stream (
511+ prompt = "hello" ,
512+ extra_user_content_parts = extra_parts ,
513+ )
514+ ]
515+
516+ assert responses
517+ assert delegate .stream_kwargs is not None
518+ assert delegate .stream_kwargs ["extra_user_content_parts" ] is extra_parts
519+
520+
484521@pytest .mark .asyncio
485522async def test_handle_api_error_content_moderated_without_images_raises ():
486523 provider = _make_provider (
0 commit comments