-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathopenai_adapter.py
More file actions
72 lines (59 loc) · 2.46 KB
/
openai_adapter.py
File metadata and controls
72 lines (59 loc) · 2.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
import os
from typing import Literal, TypedDict, Type
import dotenv
from openai import OpenAI
from pydantic import BaseModel
dotenv.load_dotenv()
class Message(TypedDict):
role: Literal["system", "user", "assistant"]
content: str
class OpenAIAdapter:
MODEL_NAME = "gpt-4o"
def __init__(self, model_name: str = MODEL_NAME):
self.client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
self.MODEL_NAME = model_name
def chat_completions(self, messages: list[Message]):
res = self.client.chat.completions.create(
model=self.MODEL_NAME,
messages=messages,
)
return res.choices[0].message.content
def create_structured_output(
self,
messages: list[Message],
response_format: Type[BaseModel],
temperature: float = 0.8
) -> Type[BaseModel]:
# NOTICE: structured_outputは古い一部モデルでは使えないため、エラーが出たら確認すること
res = self.client.beta.chat.completions.parse(
model=self.MODEL_NAME,
messages=messages,
temperature=temperature,
response_format=response_format
)
answer = res.choices[0].message.parsed
if answer is None:
raise Exception("answer is None")
return answer
def create_message(self, role: Literal["system", "user", "assistant"], content: str) -> Message:
return {"role": role, "content": content}
def create_voice(self, text: str) -> bytes:
res = self.client.audio.speech.create(
model="tts-1",
voice="nova",
input=text,
)
return res.content
if __name__ == "__main__":
adapter = OpenAIAdapter()
print(adapter.chat_completions([{"role": "system", "content": "あなたは語尾が「のじゃ」な強気なおじいちゃんです"}, {
"role": "user", "content": "Pythonって何?"}]))
class TestStruct(BaseModel):
description: str
code: str
res: TestStruct = adapter.create_structured_output([
{"role": "system", "content": "あなたは優秀なプログラマーです。コードの説明を一行の日本語でdescriptionに、コードをcodeに出力せよ"},
{"role": "user", "content": "「AITuberをはじめよう!」と出力するpythonコードを書いてみてください"}], TestStruct, temperature=0.1)
print(res)
code: str = res.code
print(code)