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