Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions agentrun/model/__client_async_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -285,24 +285,25 @@ async def get_async(
ResourceNotExistError: 模型服务不存在
"""

# 优先查 ModelService,未命中再回退 ModelProxy,避免无谓的 404
error: Optional[HTTPError] = None
if backend_type == BackendType.PROXY or backend_type is None:
if backend_type == BackendType.SERVICE or backend_type is None:
try:
result = await self.__control_api.get_model_proxy_async(
model_proxy_name=name, config=config
result = await self.__control_api.get_model_service_async(
model_service_name=name, config=config
)
return ModelProxy.from_inner_object(result)
return ModelService.from_inner_object(result)
except HTTPError as e:
error = e

if backend_type == BackendType.PROXY and error is not None:
if backend_type == BackendType.SERVICE and error is not None:
raise error.to_resource_error("Model", name) from error

try:
result = await self.__control_api.get_model_service_async(
model_service_name=name, config=config
result = await self.__control_api.get_model_proxy_async(
model_proxy_name=name, config=config
)
return ModelService.from_inner_object(result)
return ModelProxy.from_inner_object(result)
except HTTPError as e:
raise e.to_resource_error("Model", name) from e

Expand Down
34 changes: 18 additions & 16 deletions agentrun/model/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -512,24 +512,25 @@ async def get_async(
ResourceNotExistError: 模型服务不存在
"""

# 优先查 ModelService,未命中再回退 ModelProxy,避免无谓的 404
error: Optional[HTTPError] = None
if backend_type == BackendType.PROXY or backend_type is None:
if backend_type == BackendType.SERVICE or backend_type is None:
try:
result = await self.__control_api.get_model_proxy_async(
model_proxy_name=name, config=config
result = await self.__control_api.get_model_service_async(
model_service_name=name, config=config
)
return ModelProxy.from_inner_object(result)
return ModelService.from_inner_object(result)
except HTTPError as e:
error = e

if backend_type == BackendType.PROXY and error is not None:
if backend_type == BackendType.SERVICE and error is not None:
raise error.to_resource_error("Model", name) from error

try:
result = await self.__control_api.get_model_service_async(
model_service_name=name, config=config
result = await self.__control_api.get_model_proxy_async(
model_proxy_name=name, config=config
)
return ModelService.from_inner_object(result)
return ModelProxy.from_inner_object(result)
except HTTPError as e:
raise e.to_resource_error("Model", name) from e

Expand All @@ -552,24 +553,25 @@ def get(
ResourceNotExistError: 模型服务不存在
"""

# 优先查 ModelService,未命中再回退 ModelProxy,避免无谓的 404
error: Optional[HTTPError] = None
if backend_type == BackendType.PROXY or backend_type is None:
if backend_type == BackendType.SERVICE or backend_type is None:
try:
result = self.__control_api.get_model_proxy(
model_proxy_name=name, config=config
result = self.__control_api.get_model_service(
model_service_name=name, config=config
)
return ModelProxy.from_inner_object(result)
return ModelService.from_inner_object(result)
except HTTPError as e:
error = e

if backend_type == BackendType.PROXY and error is not None:
if backend_type == BackendType.SERVICE and error is not None:
raise error.to_resource_error("Model", name) from error

try:
result = self.__control_api.get_model_service(
model_service_name=name, config=config
result = self.__control_api.get_model_proxy(
model_proxy_name=name, config=config
)
return ModelService.from_inner_object(result)
return ModelProxy.from_inner_object(result)
except HTTPError as e:
raise e.to_resource_error("Model", name) from e

Expand Down
39 changes: 19 additions & 20 deletions tests/unittests/model/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -906,13 +906,14 @@ def test_get_auto_detect(self, mock_control_api_class):
mock_control_api_class.return_value = mock_control_api

mock_result = MagicMock()
mock_control_api.get_model_proxy.return_value = mock_result
mock_control_api.get_model_service.return_value = mock_result

client = ModelClient()
result = client.get("test")

# Should try proxy first
mock_control_api.get_model_proxy.assert_called_once()
# Should try service first (ModelService is the primary resource after migration)
mock_control_api.get_model_service.assert_called_once()
mock_control_api.get_model_proxy.assert_not_called()

@patch.dict(
os.environ,
Expand All @@ -923,27 +924,25 @@ def test_get_auto_detect(self, mock_control_api_class):
},
)
@patch("agentrun.model.client.ModelControlAPI")
def test_get_auto_detect_falls_back_to_service(
self, mock_control_api_class
):
"""Test fallback to service when proxy not found"""
def test_get_auto_detect_falls_back_to_proxy(self, mock_control_api_class):
"""Test fallback to proxy when service not found"""
mock_control_api = MagicMock()
mock_control_api_class.return_value = mock_control_api

# Proxy get fails
mock_control_api.get_model_proxy.side_effect = HTTPError(
# Service get fails
mock_control_api.get_model_service.side_effect = HTTPError(
status_code=404, message="Not found"
)
# Service get succeeds
# Proxy get succeeds
mock_result = MagicMock()
mock_control_api.get_model_service.return_value = mock_result
mock_control_api.get_model_proxy.return_value = mock_result

client = ModelClient()
result = client.get("test")

mock_control_api.get_model_proxy.assert_called_once()
mock_control_api.get_model_service.assert_called_once()
assert isinstance(result, ModelService)
mock_control_api.get_model_proxy.assert_called_once()
assert isinstance(result, ModelProxy)

@patch.dict(
os.environ,
Expand Down Expand Up @@ -1009,26 +1008,26 @@ async def test_get_async_service(self, mock_control_api_class):
@patch("agentrun.model.client.ModelControlAPI")
@pytest.mark.asyncio
async def test_get_async_auto_detect_fallback(self, mock_control_api_class):
"""Test fallback to service when proxy not found in async get"""
"""Test fallback to proxy when service not found in async get"""
mock_control_api = MagicMock()
mock_control_api_class.return_value = mock_control_api

# Proxy get fails
mock_control_api.get_model_proxy_async = AsyncMock(
# Service get fails
mock_control_api.get_model_service_async = AsyncMock(
side_effect=HTTPError(status_code=404, message="Not found")
)
# Service get succeeds
# Proxy get succeeds
mock_result = MagicMock()
mock_control_api.get_model_service_async = AsyncMock(
mock_control_api.get_model_proxy_async = AsyncMock(
return_value=mock_result
)

client = ModelClient()
result = await client.get_async("test")

mock_control_api.get_model_proxy_async.assert_called_once()
mock_control_api.get_model_service_async.assert_called_once()
assert isinstance(result, ModelService)
mock_control_api.get_model_proxy_async.assert_called_once()
assert isinstance(result, ModelProxy)

@patch.dict(
os.environ,
Expand Down
Loading