|
import codecs |
|
import json |
|
import time |
|
import openai |
|
import os |
|
from dotenv import load_dotenv |
|
|
|
load_dotenv() |
|
|
|
class Llm: |
|
def __init__(self): |
|
print("### Step 1: Get the Assistant's ID ###") |
|
|
|
|
|
self.client = openai.OpenAI() |
|
openai.api_key = os.getenv('OPENAI_API_KEY') |
|
self.assistant_id = os.getenv('OPENAI_ASSISTANT_ID') |
|
|
|
self.assistant = self.client.beta.assistants.retrieve(self.assistant_id) |
|
print(self.assistant) |
|
assistant_description = self.assistant.description |
|
assistant_model = self.assistant.model |
|
|
|
if assistant_description is None: |
|
|
|
assistant_description = f"このアシスタントは、OpenAI APIで {assistant_model} を使用して作成されました。" |
|
|
|
|
|
def setup(self): |
|
load_dotenv() |
|
self.api_key = os.getenv('OPENAI_API_KEY') |
|
self.assistant_id = os.getenv('OPENAI_ASSISTANT_ID') |
|
self.client = openai.OpenAI() |
|
|
|
def retrieve_assistant(self): |
|
self.assistant = self.client.beta.assistants.retrieve(self.assistant_id) |
|
return self.assistant |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def chatcompletion(self, prompt): |
|
|
|
try: |
|
"### Step 2: Create a Thread ###" |
|
empty_thread = self.client.beta.threads.create() |
|
thread_id = empty_thread.id |
|
print(empty_thread) |
|
|
|
print("### Step 3: Add a Message to the Thread ###") |
|
thread = self.client.beta.threads.retrieve(thread_id) |
|
print(thread) |
|
|
|
print("### Step 4: Add a Message to the Thread ###") |
|
thread_message = self.client.beta.threads.messages.create( |
|
thread_id, |
|
role="user", |
|
content=prompt, |
|
) |
|
message_id = thread_message.id |
|
print(thread_message) |
|
|
|
print("### Step 5: Retrieve the Message ###") |
|
message = self.client.beta.threads.messages.retrieve( |
|
message_id=message_id, |
|
thread_id=thread_id, |
|
) |
|
print(message) |
|
|
|
print("### Step 6: Run the Assistant ###") |
|
run = self.client.beta.threads.runs.create( |
|
thread_id=thread.id, |
|
assistant_id=self.assistant.id, |
|
) |
|
|
|
print("### Step 7: Wait for the Assistant to Finish ###") |
|
def wait_on_run(run, thread): |
|
while run.status == "queued" or run.status == "in_progress": |
|
run = self.client.beta.threads.runs.retrieve( |
|
thread_id=thread.id, |
|
run_id=run.id, |
|
) |
|
time.sleep(0.5) |
|
return run |
|
|
|
run = wait_on_run(run, thread) |
|
print(run) |
|
|
|
print("### Step 8: Retrieve the Messages ###") |
|
messages = self.client.beta.threads.messages.list( |
|
thread_id=thread.id |
|
) |
|
|
|
messages_str = json.dumps(messages.dict(), indent=2) |
|
print(codecs.decode(messages_str, 'unicode-escape')) |
|
|
|
print("### Step 9: Retrieve the Assistant's Response ###") |
|
answers = [] |
|
for message in messages.data: |
|
if message.role == "assistant": |
|
if message.content[0].type == "text": |
|
answers.append(message.content[0].text.value + "\n\n") |
|
else: |
|
answers.append("Content is not text.\n\n") |
|
elif message.role == "user": |
|
break |
|
|
|
|
|
answers.reverse() |
|
|
|
return "".join(answers) |
|
except Exception as e: |
|
print(f"スレッドの作成中にエラーが発生しました: {e}") |
|
raise |