File size: 5,462 Bytes
fad850b
 
 
 
 
 
 
e07ebcb
fad850b
 
 
4b68f48
fad850b
 
 
 
 
66c4cd1
 
 
 
d48ea21
 
 
 
 
 
 
e07ebcb
 
 
dd9625e
e07ebcb
fad850b
 
 
dd9625e
fad850b
 
 
 
 
 
 
 
 
dd9625e
 
fad850b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
dd9625e
fad850b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e07ebcb
fad850b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import gradio as gr
import openai
import requests
import os
import fileinput
from dotenv import load_dotenv

title="企画のアイデア提案AI-gpt-4-β"
inputs_label="""
- 物語の企画の元になるアイデアやキーワード(登場人物とその設定、物語の舞台、出来事など)を入力してください。
"""
outputs_label="企画の提案"
description="""
- あなたが入力したアイデアやキーワードに応じて、AIが物語の企画を提案します。
"""

article = """
<ul>
    <li style="font-size: small;">楽しんでいただけたら、Likeのクリックをお願いします。</li>
</ul>

<ul>
    <li style="font-size: small;">よかったら出力を「物語のプロット提案AI」に入力してみてください。 <a href="https://huggingface.co/spaces/Masa-digital-art/plot-suggestion-gpt-4">https://huggingface.co/spaces/Masa-digital-art/plot-suggestion-gpt-4</a></li>
</ul>
<ul>
    <li style="font-size: small;">よかったらフィードバックの収集にご協力お願いします <a href="https://forms.gle/bLxs2h22JvQK4zwP8">https://forms.gle/bLxs2h22JvQK4zwP8</a></li>
</ul>

<h5>リリースノート</h5>
<ul>
    <li style="font-size: small;">2023-05-11 v1.0</li>
    <li style="font-size: small;">2023-11-11 v2.0</li>
</ul>
 
<h5>注意事項</h5>
<ul>
    <li style="font-size: small;">当サービスでは、2023/11/6にリリースされたOpenAI社のChatGPT APIのgpt-4-1106-previewを使用しております。</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-4-1106-preview"

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")
        template = get_filetext(filename = "template.md")
        
        # ChatCompletion APIに渡すデータを定義する
        data = {
            "model": "gpt-4-1106-preview",
            "messages": [
                {"role": "system", "content": constraints}
                ,{"role": "system", "content": template}
                ,{"role": "assistant", "content": "Sure!"}
                ,{"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_emo_prompt(cls, user_message):
        template = get_filetext(filename="template.md")
        prompt = f"""
        {user_message}
        ---
        上記を元に、下記テンプレートを日本語で埋めてください。
        ---
        {template}
        """
        return prompt

    @classmethod
    def generate_emo(cls, user_message):
        prompt = NajiminoAI.generate_emo_prompt(user_message);
        start_with = ""
        result = OpenAI.chat_completion(prompt=prompt, start_with=start_with)
        return result

def main():
    iface = gr.Interface(fn=NajiminoAI.generate_emo,
                        inputs=gr.Textbox(label=inputs_label),
                        outputs=gr.Textbox(label=outputs_label),
                        title=title,
                        description=description,
                        article=article,
                        allow_flagging='never'
                        )

    iface.launch()

if __name__ == '__main__':
    main()