83 lines
2.8 KiB
Python
83 lines
2.8 KiB
Python
from .base_client import logger, HttpMethod
|
|
from typing import Dict
|
|
|
|
from .base_client import BaseClient
|
|
from ..dto.joy_caption_dto import JoyCaptionRequest
|
|
from ..dto.translate_dto import TranslationRequest
|
|
|
|
class JoyCaptionServiceClient(BaseClient):
|
|
"""
|
|
Client for the JoyCaption service that generates captions for images.
|
|
Inherits common functionality from BaseClient.
|
|
"""
|
|
|
|
def generate_caption(self, base_url: str, request: JoyCaptionRequest) -> Dict[str, str]:
|
|
try:
|
|
data = {
|
|
"system_prompt": request.system_prompt,
|
|
"prompt": request.prompt,
|
|
"max_new_tokens": str(request.max_new_tokens),
|
|
"temperature": str(request.temperature),
|
|
"top_p": str(request.top_p),
|
|
"top_k": str(request.top_k),
|
|
"user_name": self.username # Use username from client
|
|
}
|
|
|
|
files = {
|
|
"image_file": ("image.jpg", request.image_file, "image/jpeg")
|
|
}
|
|
|
|
# Make request using base client's _request method
|
|
response = self._request(
|
|
base_url=base_url,
|
|
method=HttpMethod.POST,
|
|
endpoint="joycaption/generate",
|
|
data=data,
|
|
files=files
|
|
)
|
|
|
|
# Extract caption data
|
|
return {
|
|
"enCaption": response.get("enCaption", ""),
|
|
"cnCaption": response.get("cnCaption", "")
|
|
}
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error in generate_caption: {str(e)}", exc_info=True)
|
|
# Re-raise the exception with original context
|
|
raise e from e
|
|
|
|
def translate(self, base_url: str, request: TranslationRequest) -> str:
|
|
"""
|
|
Translate text between languages using the translation service.
|
|
|
|
Args:
|
|
base_url: The base URL of the API server
|
|
request: The translation request containing text and parameters
|
|
|
|
Returns:
|
|
The translated text
|
|
|
|
Raises:
|
|
ConnectionError: If there's a network error communicating with the service
|
|
ValueError: If the response format is invalid
|
|
"""
|
|
|
|
# Build request data using fields from request object
|
|
request_data = {
|
|
"text": request.text,
|
|
}
|
|
|
|
# Make request using base client's _request method
|
|
response = self._request(
|
|
base_url=base_url,
|
|
method=HttpMethod.POST,
|
|
endpoint="translate",
|
|
data=request_data
|
|
)
|
|
|
|
# Parse response
|
|
if isinstance(response, dict) and "translated_text" in response:
|
|
return response["translated_text"]
|
|
else:
|
|
raise ValueError("Invalid response format: missing translated_text field") |