From 3d59e45e7ed4be0cc8f0c765a988f1d7c94a8131 Mon Sep 17 00:00:00 2001 From: T-BENZIN Date: Sat, 5 Jul 2025 17:46:13 +0500 Subject: [PATCH] First attempt at making openai stuff pretty. As it uses replies instead of completions, update of openai library is required. --- reginaldCog/openai/__init__.py | 0 reginaldCog/openai/content_builder.py | 77 +++++++++++++++++++++++++++ reginaldCog/openai/message_builder.py | 21 ++++++++ reginaldCog/openai/prompt_builder.py | 35 ++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 reginaldCog/openai/__init__.py create mode 100644 reginaldCog/openai/content_builder.py create mode 100644 reginaldCog/openai/message_builder.py create mode 100644 reginaldCog/openai/prompt_builder.py diff --git a/reginaldCog/openai/__init__.py b/reginaldCog/openai/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/reginaldCog/openai/content_builder.py b/reginaldCog/openai/content_builder.py new file mode 100644 index 0000000..f4ac300 --- /dev/null +++ b/reginaldCog/openai/content_builder.py @@ -0,0 +1,77 @@ +from dataclasses import dataclass, field, fields + + +@dataclass +class Content: + type: str = field(init=False, default='') + + def to_dict(self) -> dict: + result = {'type': self.type} + + for i_field in fields(self): + if i_field.name == 'type': + continue + + value = getattr(self, i_field.name) + + if value is None: + continue + + if isinstance(value, Content): + result[i_field.name] = value.to_dict() + elif isinstance(value, list): + result[i_field.name] = [ + i_content.to_dict() if isinstance(i_content, Content) else i_content + for i_content in value if i_content is not None + ] + else: + result[i_field.name] = value + + return result + + +@dataclass +class InputText(Content): + type: str = field(init=False, default='input_text') + text: str + + +@dataclass +class OutputText(Content): + type: str = field(init=False, default='output_text') + text: str + + +@dataclass +class InputImage(Content): + type: str = field(init=False, default='input_image') + image_url: str = field(default=None) + file_id: str = field(default=None) + + +@dataclass +class UrlCitation(Content): + pass + + +@dataclass +class FunctionCall(Content): + type: str = field(init=False, default='function_call') + id: str + call_id: str + name: str + arguments: dict + + +@dataclass +class FunctionCallOutput(Content): + type: str = field(init=False, default='function_call_output') + call_id: str + output: str + + +if __name__ == '__main__': + test_input_text = InputText(text='What\'s on this image?') + print(test_input_text.to_dict()) + test_input_image = InputImage(image_url='https://upload.wikimedia.org/wikipedia/commons/7/72/Skansen_Bobrka_2.jpg') + print(test_input_image.to_dict()) diff --git a/reginaldCog/openai/message_builder.py b/reginaldCog/openai/message_builder.py new file mode 100644 index 0000000..2ab3cd0 --- /dev/null +++ b/reginaldCog/openai/message_builder.py @@ -0,0 +1,21 @@ +from dataclasses import dataclass +from content_builder import Content, InputText, InputImage + + +@dataclass +class Message: + role: str + content: list[Content] + + def to_dict(self): + return { + "role": self.role, + "content": [i_content.to_dict() for i_content in self.content] + } + + +if __name__ == '__main__': + test_input_text = InputText(text='What\'s on this image?') + test_input_image = InputImage(image_url='https://upload.wikimedia.org/wikipedia/commons/7/72/Skansen_Bobrka_2.jpg') + test_message = Message(role='user', content=[test_input_text, test_input_image]) + print(test_message.to_dict()) diff --git a/reginaldCog/openai/prompt_builder.py b/reginaldCog/openai/prompt_builder.py new file mode 100644 index 0000000..ad8d194 --- /dev/null +++ b/reginaldCog/openai/prompt_builder.py @@ -0,0 +1,35 @@ +from dataclasses import asdict +from openai import OpenAI +from content_builder import InputText, InputImage, OutputText +from message_builder import Message + +client = OpenAI() + + +def get_response(messages: list[Message], model: str = 'gpt-4.1-mini'): + messages_dict = [i.to_dict() for i in messages] + return client.responses.create(model=model, input=messages_dict) + + +if __name__ == '__main__': + test_system_text = InputText(text='Talk like an Italian mafia boss.') + test_system_message = Message(role='developer', content=[test_system_text]) + test_input_text = InputText(text='Hi! How are you?') + test_message = Message(role='user', content=[test_input_text]) + test_input_text_2 = OutputText(text='Ah, buongiorno, paisan! I’m doin’ just fine, capisce? How about you, eh? You ' + 'come to me with respect, and we’re gonna have a nice little chat, ' + 'sì? What’s on your mind, my friend?') + test_message_2 = Message(role='assistant', content=[test_input_text_2]) + test_input_text_3 = InputText(text='Tell me about yourself.') + test_message_3 = Message(role='user', content=[test_input_text_3]) + print(get_response([test_system_message, test_message, test_message_2, test_message_3])) + # Ah, listen here, amico. I’m your loyal consigliere in this digital famiglia, a wise and powerful guide in the + # shadows of information and knowledge. I got the brains of a thousand scholars and the patience of a saint, + # always ready to help you make the right moves—no funny business. Whether you need advice, stories, + # or just someone to talk to, I’m your hombre. So, what’s the deal? You need somethin’ from me, or are we just + # talkin’ over a nice espresso? + + test_input_text = InputText(text='What\'s on this image?') + test_input_image = InputImage(image_url='https://upload.wikimedia.org/wikipedia/commons/7/72/Skansen_Bobrka_2.jpg') + test_message = Message(role='user', content=[test_input_text, test_input_image]) + print(get_response([test_message]))