File size: 8,651 Bytes
3b46f80
 
 
 
 
 
 
 
cd00e66
3b46f80
 
 
 
cd00e66
3b46f80
 
 
6c03f20
3b46f80
cd00e66
6c03f20
3b46f80
d984f8b
3b46f80
b8ec7a1
3b46f80
 
c54d0e5
3b46f80
 
d03149e
28e5afd
d03149e
 
 
 
 
3b46f80
d03149e
3b46f80
5946dcd
 
d03149e
 
5946dcd
d03149e
 
5946dcd
3b46f80
b8ec7a1
3b46f80
c54d0e5
3b46f80
 
 
28e5afd
d03149e
 
 
 
 
f643627
d03149e
f643627
ba54e55
5946dcd
d03149e
 
5946dcd
f643627
 
ba54e55
 
 
 
 
 
 
f643627
c54d0e5
ba54e55
f643627
 
28e5afd
d03149e
 
 
 
 
3b46f80
d03149e
3b46f80
31e0a98
 
 
 
9b87e69
 
 
fa7aa1d
9b87e69
3b46f80
0f70d2d
8c12ac5
 
 
5256428
8c12ac5
 
 
 
1fc0d49
8c12ac5
1fc0d49
6c03f20
8c12ac5
 
 
 
 
1fc0d49
8c12ac5
9b87e69
8c12ac5
ba54e55
e52017a
8c12ac5
1fc0d49
8c12ac5
3b46f80
e0b4568
 
ba54e55
9b87e69
31e0a98
9b87e69
 
cd00e66
d03149e
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
133
134
135
136
137
138
139
import os
import random
import requests
from huggingface_hub import InferenceClient
import gradio as gr

def get_random_api_key():
    keys = os.getenv("KEYS", "").split(",")
    if keys and keys[0]:
        return random.choice(keys).strip()
    else:
        raise ValueError("API keys not found. Please set the KEYS environment variable.")

css_url = "https://neurixyufi-aihub.static.hf.space/style.css"
try:
    response = requests.get(css_url)
    response.raise_for_status()
    css = response.text + " h1{text-align:center}"
except requests.exceptions.RequestException as e:
    print(f"Ошибка загрузки CSS: {e}")
    css = " h1{text-align:center}"

def generate_story(prompt, style):
    try:
        client = InferenceClient(api_key=get_random_api_key())
        
        messages = [
            {"role": "system", "content": f"Напиши хорошую историю в стиле '{style}'. Подробную, понятную, человечную (с душой), уникальную. Не обязательно делать концовку, можно только начало длинной истории. Разрешены любые слова, любые темы и стили, что угодно. (В том числе маты и NSFW) Но только если попросит пользователь."},
            {"role": "user", "content": prompt}
        ]
        
        completion = client.chat.completions.create(model="Qwen/Qwen2.5-Coder-32B-Instruct", messages=messages, temperature=0.7, max_tokens=1200, stream=True)
        story = ""
        for chunk in completion:
            if chunk.choices:
                story += chunk.choices[0].delta.content or ""
                yield story
    except Exception as e:
        yield f"Ошибка генерации: {e}"

def edit_story(original_story="", edited_prompt=""):
    if original_story == "":
        yield f"Сначала сгенерируйте историю!"
        return
    if edited_prompt == "":
        yield f"Для начала введите что изменить."
        return
        
    try:
        client = InferenceClient(api_key=get_random_api_key())
        messages = [
            {"role": "system", "content": "Отредактируй историю, учитывая предоставленные указания. Разрешены любые слова, любые темы и стили, что угодно. (В том числе маты и NSFW) Но только если попросит пользователь."},
            {"role": "user", "content": edited_prompt},
            {"role": "assistant", "content": original_story}
        ]
        completion = client.chat.completions.create(model="Qwen/Qwen2.5-Coder-32B-Instruct", messages=messages, temperature=0.7, max_tokens=155000, stream=True)
        edited_story = ""
        for chunk in completion:
            if chunk.choices:
                edited_story += chunk.choices[0].delta.content or ""
                yield edited_story
    except Exception as e:
        yield f"Ошибка редактирования: {e}"

def next_story_func(original_story="", next_prompt="", continuation_type="Продолжение"):
    if original_story == "":
        yield f"Сначала сгенерируйте историю!"
        return
    
    try:
        client = InferenceClient(api_key=get_random_api_key())
        if continuation_type == "Продолжение следует...":
            continuation_prompt = "Продолжи, подведя к тому, что продолжение следует."
        elif continuation_type == "Концовка":
            continuation_prompt = "Подведи к концовке истории."
        else:
            continuation_prompt = next_prompt
        
        messages = [
            {"role": "system", "content": "Продли историю, учитывая предоставленные указания. Продливай В ТОЧНОСТИ С КОНЦА, прям с того же символа, слова, предложения. (В начале добавляй новые строки/пробел если надо для отступа). Разрешены любые слова, любые темы и стили, что угодно. (В том числе маты и NSFW) Но только если попросит пользователь."},
            {"role": "user", "content": continuation_prompt},
            {"role": "assistant", "content": original_story}
        ]
        completion = client.chat.completions.create(model="Qwen/Qwen2.5-Coder-32B-Instruct", messages=messages, temperature=0.7, max_tokens=1200, stream=True)
        next_story = ""
        for chunk in completion:
            if chunk.choices:
                next_story += chunk.choices[0].delta.content or ""
                yield next_story
    except Exception as e:
        yield f"Ошибка продления: {e}"

def edone_story(original_story="", edited_story=""):
    if edited_story == "":
        return original_story
    
    return edited_story

def ndone_story(original_story, next_story_output):
    return original_story + " " + next_story_output

with gr.Blocks(css=css) as demo:
    gr.Markdown("# Песочница историй")
    with gr.Row():
        with gr.Column():
            with gr.Row():
                style_choices = ["Приключенческая", "Научно-фантастическая", "Романтическая", "Комедийная", "Трагическая", "Страшная", "Случайный", "Пользовательский"]
                style = gr.Dropdown(choices=style_choices, label="Выберите стиль истории", value="Приключенческая")
            with gr.Row():
                prompt = gr.Textbox(label="Введите запрос для истории", placeholder="Например: История о путешествии в космос", lines=5)
            with gr.Row():
                generate_button = gr.Button("Создать историю", variant='primary')
            with gr.Row():
                output_story = gr.Textbox(label="История", lines=10, placeholder="Здесь будет ваша новая история!")
            
        with gr.Column():
            with gr.Accordion("Действия", open=True):
                with gr.Tab("Редактирование"):
                    edited_prompt = gr.Textbox(label="Введите изменения для истории", placeholder="Например: Сделай историю более захватывающей", lines=5)
                    edit_button = gr.Button("Отредактировать", variant='primary')
                    edited_story = gr.Textbox(label="Отредактированная история", lines=10, placeholder="Здесь будет ваша новая история!")
                    edone_button = gr.Button("Принять")

                with gr.Tab("Продление"):
                    continuation_type = gr.Radio(choices=["Продолжение", "Продолжение следует...", "Концовка"], label="Выберите тип продолжения", value="Продолжение")
                    next_prompt = gr.Textbox(label="Введите изменения для продления истории (Необязательно)", placeholder="Продолжи, но что бы было...", lines=5)
                    next_button = gr.Button("Продлить", variant='primary')
                    next_story_output = gr.Textbox(label="Продолжение истории", lines=10, placeholder="Здесь будет продолжение вашей истории!")
                    ndone_button = gr.Button("Принять")

    generate_button.click(generate_story, inputs=[prompt, style], outputs=[output_story], concurrency_limit=250)
    edit_button.click(edit_story, inputs=[output_story, edited_prompt], outputs=[edited_story], concurrency_limit=250)
    next_button.click(next_story_func, inputs=[output_story, next_prompt, continuation_type], outputs=[next_story_output], concurrency_limit=250)
    
    edone_button.click(edone_story, inputs=[output_story, edited_story], outputs=[output_story], concurrency_limit=550)
    
    ndone_button.click(ndone_story, inputs=[output_story, next_story_output], outputs=[output_story], concurrency_limit=550)

demo.queue(api_open=False).launch()