From 7c52d31444f213a788d4ce7a5b607d78b5de9867 Mon Sep 17 00:00:00 2001 From: ievgenii vdovenko Date: Fri, 22 Aug 2025 13:14:33 +0200 Subject: [PATCH] poc: further methods split for easy future implementations --- rhodecode/apps/ai_agents/models/base.py | 24 ++++++++++++++++++------ rhodecode/apps/ai_agents/models/gpt.py | 22 ++++++++++++++++++---- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/rhodecode/apps/ai_agents/models/base.py b/rhodecode/apps/ai_agents/models/base.py index 8297b2ee..1656008b 100644 --- a/rhodecode/apps/ai_agents/models/base.py +++ b/rhodecode/apps/ai_agents/models/base.py @@ -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) diff --git a/rhodecode/apps/ai_agents/models/gpt.py b/rhodecode/apps/ai_agents/models/gpt.py index f94da057..a0f18138 100644 --- a/rhodecode/apps/ai_agents/models/gpt.py +++ b/rhodecode/apps/ai_agents/models/gpt.py @@ -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":