poc: further methods split for easy future implementations

This commit is contained in:
ievgenii vdovenko 2025-08-22 13:14:33 +02:00
parent fcc3147e04
commit 7c52d31444
2 changed files with 36 additions and 10 deletions

View file

@ -16,6 +16,11 @@ class Response:
error: bool = False
@dataclass
class Request:
content: str
def wrap_ai_exceptions(f):
@wraps(f)
def wrapper(*args, **kwargs):
@ -44,14 +49,21 @@ class AIServiceBase:
assert version is not None and version, "Model version is required"
@wrap_ai_exceptions
def ping(self):
resp = self._get_ping_response()
def ping(self) -> Response:
resp = self._get_response(self._get_ping_request())
return self._transform(resp)
@abstractmethod
def _get_ping_response(self):
# TODO: maybe just response
pass
def _get_ping_request(self) -> Request:
raise NotImplementedError
def _transform(self, resp, model=None):
@abstractmethod
def code_review(self, code):
raise NotImplementedError
@abstractmethod
def _get_response(self, request: Request):
raise NotImplementedError
def _transform(self, resp, model=None) -> Response:
return Response(model=model if model else self.model_settings.model_name.value, message=resp)

View file

@ -1,9 +1,16 @@
import json
from dataclasses import dataclass
from openai import OpenAI
from rhodecode.apps.ai_agents.ai_settings import AISettings
from rhodecode.apps.ai_agents.models.base import AIServiceBase
from rhodecode.apps.ai_agents.models.base import AIServiceBase, Request
@dataclass
class GPTRequest(Request):
function_name: str
role: str
class GPTService(AIServiceBase):
@ -11,17 +18,24 @@ class GPTService(AIServiceBase):
super().__init__(model_settings)
self._client = OpenAI(api_key=self.model_settings.api_key)
def _get_ping_response(self):
def _get_response(self, request: GPTRequest):
return self._client.responses.create(
model=self._get_json_model_name(),
input=[{"role": "user", "content": "ping"}],
input=[{"role": request.role, "content": request.content}],
tools=[
self._get_function("ping"),
self._get_function(request.function_name),
],
tool_choice={"type": "function", "name": "ping_pong"},
parallel_tool_calls=False,
)
def _get_ping_request(self) -> Request:
return GPTRequest(
content="ping",
role="user",
function_name="ping",
)
def _transform(self, resp):
for item in resp.output:
if item.type == "function_call" and item.name == "ping_pong":