shigel's picture
Update app.py
c90b227
import gradio as gr
import openai
import requests
import os
from dotenv import load_dotenv
title="松原仁美AI(β)"
inputs_label="松原仁美さんに話しかけてみてください。\n例) こんにちは。あなたはどんなことができますか?"
outputs_label="AIが松原仁美さんに代わって返事をしてくれます。"
description="""
- 松原仁美AI(β)を使うと、AIが松原仁美さんに代わって返事をしてくれます!(※1分程度かかります)
- ※入出力の文字数は最大1000文字程度までを目安に入力してください。
"""
article = """
<h5>注意事項</h5>
<ul>
<li style="font-size: small;">当サービスでは、2023/6/13にリリースされたOpenAI社のChatGPT APIのgpt-3.5-turboを使用しております。</li>
<li style="font-size: small;">当サービスで生成されたコンテンツは、OpenAI が提供する人工知能によるものであり、当サービスやOpenAI がその正確性や信頼性を保証するものではありません。</li>
<li style="font-size: small;"><a href="https://platform.openai.com/docs/usage-policies">OpenAI の利用規約</a>に従い、データ保持しない方針です(ただし諸般の事情によっては変更する可能性はございます)。
<li style="font-size: small;">当サービスで生成されたコンテンツは事実確認をした上で、コンテンツ生成者およびコンテンツ利用者の責任において利用してください。</li>
<li style="font-size: small;">当サービスでの使用により発生したいかなる損害についても、当社は一切の責任を負いません。</li>
<li style="font-size: small;">当サービスはβ版のため、予告なくサービスを終了する場合がございます。</li>
</ul>
"""
load_dotenv()
openai.api_key = os.getenv('OPENAI_API_KEY')
MODEL = "gpt-3.5-turbo-0613"
# MODEL = "gpt-3.5-turbo-16k"
# MODEL = "gpt-4"
def get_filetext(filename, cache={}):
if filename in cache:
# キャッシュに保存されている場合は、キャッシュからファイル内容を取得する
return cache[filename]
else:
if not os.path.exists(filename):
raise ValueError(f"ファイル '{filename}' が見つかりませんでした")
with open(filename, "r") as f:
text = f.read()
# ファイル内容をキャッシュする
cache[filename] = text
return text
class OpenAI:
@classmethod
def chat_completion(cls, prompt, start_with=""):
constraints = get_filetext(filename = "constraints.md")
# ChatCompletion APIに渡すデータを定義する
data = {
"model": MODEL,
"messages": [
{"role": "system", "content": constraints}
,{"role": "user", "content": "ALOs('I∞MA代表 松原 仁美').execute(lang='ja')"}
,{"role": "system", "content": "You are 松原 仁美 (AI), the representative of I∞MA (イーマ)."}
,{"role": "assistant", "content": "はい。承知しました。"}
,{"role": "user", "content": prompt}
,{"role": "assistant", "content": start_with}
],
}
# ChatCompletion APIを呼び出す
response = requests.post(
"https://api.openai.com/v1/chat/completions",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {openai.api_key}"
},
json=data
)
# ChatCompletion APIから返された結果を取得する
result = response.json()
print(result)
content = result["choices"][0]["message"]["content"].strip()
return content
class NajiminoAI:
@classmethod
def generate(cls, user_message):
response = OpenAI.chat_completion(prompt=user_message)
result = outputs_label_HTML.format(outputs=response)
return result
outputs_label_HTML = '''
<label class="svelte-2xzfnp">
<img src="/file/static/hitomi-matsubara.png" alt="User Icon" style="width: 50px; height: 50px; border-radius: 50%; float: left; margin-right: 10px;">
<span>
松原仁美(AI)がお答えします。
</span>
<textarea data-testid="textbox" class="scroll-hide svelte-2xzfnp" dir="ltr" placeholder="" rows="4" disabled=""
style="overflow-y: scroll; border-radius: 0 20px 20px 20px; height: 300px; width: calc(100% - 60px);">{outputs}</textarea>
</label>
'''
def main():
iface = gr.Interface(fn=NajiminoAI.generate,
inputs=gr.Textbox(label=inputs_label),
outputs=gr.HTML(outputs_label_HTML.format(outputs="")),
examples=[
"あなたはどこのどなたで、何をされてる方ですか?",
"資産持ちって何ですか?",
"講座について教えてください。",
],
title=title,
description=description,
article=article
)
iface.launch()
if __name__ == '__main__':
main()