First attempt at making openai stuff pretty. As it uses replies instead of completions, update of openai library is required.
This commit is contained in:
parent
4e22274f9b
commit
3d59e45e7e
0
reginaldCog/openai/__init__.py
Normal file
0
reginaldCog/openai/__init__.py
Normal file
77
reginaldCog/openai/content_builder.py
Normal file
77
reginaldCog/openai/content_builder.py
Normal file
@ -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())
|
||||
21
reginaldCog/openai/message_builder.py
Normal file
21
reginaldCog/openai/message_builder.py
Normal file
@ -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())
|
||||
35
reginaldCog/openai/prompt_builder.py
Normal file
35
reginaldCog/openai/prompt_builder.py
Normal file
@ -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]))
|
||||
Loading…
x
Reference in New Issue
Block a user