File size: 5,392 Bytes
c13e9af
 
 
 
 
 
918e8c4
 
 
c13e9af
918e8c4
c13e9af
 
 
 
 
 
918e8c4
c13e9af
 
 
 
 
 
 
 
 
 
918e8c4
 
 
c13e9af
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
918e8c4
c13e9af
 
918e8c4
 
 
c13e9af
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
918e8c4
d5613f1
 
c13e9af
 
d5613f1
 
c90b227
 
 
 
 
 
 
 
d5613f1
 
c13e9af
918e8c4
c13e9af
d5613f1
 
 
 
 
 
c13e9af
 
d5613f1
c13e9af
 
 
 
 
 
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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()