File size: 3,939 Bytes
774feb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0863f6a
774feb5
 
0863f6a
774feb5
 
 
 
0863f6a
774feb5
 
 
 
0863f6a
774feb5
0863f6a
774feb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0863f6a
774feb5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0863f6a
774feb5
 
 
 
0863f6a
774feb5
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
# from config import model_gt
# import torch
# from transformers import GPT2Tokenizer, GPT2LMHeadModel
#
# tokenizer = GPT2Tokenizer.from_pretrained(model_gt)
# model = GPT2LMHeadModel.from_pretrained(model_gt)
#
# # text = "Replace me by any text you'd like."
#
# def generate_text(prompt:str, max_length:int=100)->str:
#     """
#     Генерирует продолжение текста на основе заданного промпта.
#     """
#     try:
#         tokenizer.pad_token=tokenizer.eos_token
#         inputs = tokenizer([prompt],
#                            return_tensors="pt", # PyTorch тензоры
#                            truncation=True,
#                            padding=True,
#                            add_special_tokens=True,
#                            max_length=512)
#         with torch.no_grad():
#             outputs=model.generate(
#                 input_ids=inputs.input_ids,
#                 attention_mask=inputs.attention_mask,
#                 max_length=max_length,
#                 num_return_sequences=1,
#                 pad_token_id=tokenizer.eos_token_id,
#                 do_sample=True,     # включаем вероятностную выборку
#                 temperature=0.6,    # креативность (0 – детерминированно, 1 – случайно)
#             )
#         generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
#
#         return generated_text
#
#     except Exception as e:
#         return f'error of generaion: {str(e)}'

import os
import requests

# Загружаем токен из переменных окружения
HF_TOKEN = os.getenv("HF_TOKEN")
if not HF_TOKEN:
    raise ValueError("HF_TOKEN не задан в окружении")

MODEL_GT = "ai-forever/rugpt3small_based_on_gpt2"  # можно заменить на другую модель
API_URL = f"https://api-inference.huggingface.co/models/{MODEL_GT}"

def generate_text(prompt: str, max_length: int = 80) -> str:
    """
    Генерирует продолжение текста через Hugging Face Inference API.
    """
    if not prompt.strip():
        return "Промпт пуст."

    headers = {"Authorization": f"Bearer {HF_TOKEN}"}
    payload = {
        "inputs": prompt,
        "parameters": {
            "max_new_tokens": max_length,   # не max_length, а max_new_tokens!
            "temperature": 0.7,
            "top_p": 0.9,
            "do_sample": True,
            "repetition_penalty": 1.2,
        }
    }

    try:
        # Отправляем POST-запрос к API
        response = requests.post(API_URL, headers=headers, json=payload, timeout=30)
        response.raise_for_status()  # выбросит исключение при HTTP-ошибке
        result = response.json()

        # API возвращает список, в котором первый элемент — словарь с полем generated_text
        if isinstance(result, list) and len(result) > 0:
            generated = result[0].get('generated_text', '')
            # Иногда модель возвращает полный текст вместе с промптом — убираем промпт
            if generated.startswith(prompt):
                # generated = generated[len(prompt):].strip()
                generated = generated.strip()
            return generated if generated else "Не удалось сгенерировать текст."
        else:
            return f"Неожиданный ответ API: {result}"

    except requests.exceptions.Timeout:
        return "Ошибка: время ожидания API истекло."
    except requests.exceptions.RequestException as e:
        return f"Ошибка запроса к API: {str(e)}"
    except Exception as e:
        return f"Неизвестная ошибка: {str(e)}"