Spaces:
Runtime error
Runtime error
| 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: | |
| 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: | |
| 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() |