File size: 9,878 Bytes
3b46f80
 
 
 
200784b
3b46f80
cd00e66
3b46f80
 
 
6c03f20
3b46f80
cd00e66
6c03f20
3b46f80
200784b
dd23f35
200784b
7a7b8ac
200784b
dd23f35
200784b
 
 
 
 
 
 
 
 
 
 
dd23f35
200784b
 
 
d984f8b
3b46f80
 
2df7ab7
3b46f80
 
200784b
 
dd23f35
 
 
 
200784b
 
 
3b46f80
d03149e
3b46f80
5946dcd
3b46f80
 
c54d0e5
3b46f80
286bbdd
3b46f80
dd23f35
 
 
 
 
200784b
 
 
f643627
d03149e
f643627
ba54e55
f643627
ba54e55
 
 
 
 
 
 
f643627
d278742
ba54e55
286bbdd
f643627
dd23f35
 
 
 
 
200784b
 
 
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
140
141
142
143
144
import os
import random
import requests
import gradio as gr
import json

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}"

API_URL = "https://text.pollinations.ai/openai"
MODEL_NAME = "gemini"  # Или какая у вас модель
TEMPERATURE = 0.7
MAX_TOKENS = 1200

def call_pollinations_api(messages, temperature=TEMPERATURE, max_tokens=MAX_TOKENS, stream=False): # stream=False
  """Calls the Pollinations API with the given messages."""
  headers = {
      "Content-Type": "application/json"
  }
  data = {
      "model": MODEL_NAME,
      "messages": messages,
      "temperature": temperature,
      "max_tokens": max_tokens,
      "stream": stream
  }
  response = requests.post(API_URL, headers=headers, data=json.dumps(data))
  response.raise_for_status() # Raise HTTPError for bad responses (4xx or 5xx)
  return response

def generate_story(prompt, style):
    try:
        messages = [
            {"role": "system", "content": f"Напиши хорошую историю в стиле '{style}'. Подробную, понятную, человечную (с душой), уникальную. Не обязательно делать концовку, можно только начало длинной истории. Разрешены любые слова, любые темы и стили, что угодно. (В том числе маты и NSFW) Но только если попросит пользователь, по скольку это ТВОРЧЕСТВО! Не в коем случае не пиши подобное: 'Хорошо, вот ваш текст:', всегда пиши текст, без лишних комментариев."},
            {"role": "user", "content": prompt}
        ]

        response = call_pollinations_api(messages)
        full_response = response.json()  # Получаем JSON-ответ целиком
        print("Полный ответ от API:", json.dumps(full_response, indent=2, ensure_ascii=False)) # Выводим отформатированный JSON
        story = full_response["choices"][0]["message"]["content"] if "choices" in full_response and len(full_response["choices"]) > 0 else "Ответ не получен или структура ответа не соответствует ожидаемой."
        yield story

    except requests.exceptions.RequestException as e:
        yield f"Ошибка API запроса: {e}"
    except Exception as e:
        yield f"Ошибка генерации: {e}"

def edit_story(original_story="", edited_prompt=""):
    try:
        messages = [
            {"role": "system", "content": "Отредактируй историю, учитывая предоставленные указания. Разрешены любые слова, любые темы и стили, что угодно. (В том числе маты и NSFW) Но только если попросит пользователь."},
            {"role": "user", "content": edited_prompt},
            {"role": "user", "content": f"История: ```\n{original_story}\n```"}
        ]
        response = call_pollinations_api(messages, max_tokens=32760, stream=False)
        full_response = response.json()
        print("Полный ответ от API (edit):", json.dumps(full_response, indent=2, ensure_ascii=False))
        edited_story = full_response["choices"][0]["message"]["content"] if "choices" in full_response and len(full_response["choices"]) > 0 else "Ответ не получен или структура ответа не соответствует ожидаемой."
        yield edited_story

    except requests.exceptions.RequestException as e:
        yield f"Ошибка API запроса: {e}"
    except Exception as e:
        yield f"Ошибка редактирования: {e}"

def next_story_func(original_story="", next_prompt="", continuation_type="Продолжение"):
    try:
        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": "user", "content": f"История: ```\n{original_story}\n```"}
        ]
        response = call_pollinations_api(messages, stream=False)
        full_response = response.json()
        print("Полный ответ от API (next):", json.dumps(full_response, indent=2, ensure_ascii=False))
        next_story = full_response["choices"][0]["message"]["content"] if "choices" in full_response and len(full_response["choices"]) > 0 else "Ответ не получен или структура ответа не соответствует ожидаемой."
        yield next_story

    except requests.exceptions.RequestException as e:
        yield f"Ошибка API запроса: {e}"
    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()