poc: further methods split for easy future implementations
This commit is contained in:
parent
fcc3147e04
commit
7c52d31444
2 changed files with 36 additions and 10 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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":
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue