Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 05.11.2024
Сообщений: 6

Обработка запросов, ну и отображение ответа от сервера

13.01.2025, 21:20. Показов 644. Ответов 10

Студворк — интернет-сервис помощи студентам
Всем привет! Так, решил я создать чат-бота, сделал, вроде работает, и телеграмм и GUI версия, но мне этого показалось мало, и я решил создать web - версию.
Написал я сервер, вроде работает(используем flask), вот код сервера:
Python
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
from flask import Flask, request, jsonify, render_template
import json
import time
import pyttsx3
import speech_recognition as sr
from openai import OpenAI
from flask import Flask
from flask_cors import CORS
from pywin.tools.TraceCollector import outputWindow
 
app = Flask(__name__)
CORS(app)
 
 
 
client = OpenAI(api_key='Ну тут мой ключ')
 
assistant_id = "А тут id бота"
 
class Assistant:
    functions = {"functions": []}
    registered_functions = {}
 
    def __init__(self):
        self.thread_id = "thread_id"
        self.active_run_id = None
        self.engine = pyttsx3.init()
 
        # Настройки для pyttsx3
        voices = self.engine.getProperty('voices')
        for voice in voices:
            if 'russian' in voice.languages:
                self.engine.setProperty('voice', voice.id)
        self.engine.setProperty('rate', 150)  # Скорость речи
        self.engine.setProperty('volume', 1)  # Громкость
 
    def create_assistant(self):
        assistant = client.beta.assistants.create(name="Alpha", instructions="You are Alpha my personal assistant",
                                                  model="gpt-4o-mini")
        assistant_id = assistant.id
        print(assistant_id)
 
    def retrieve_assistant(self):
        my_assistant = client.beta.assistants.retrieve(assistant_id)
        print(my_assistant)
 
    def modify_assistant(self):
        my_updated_assistant = client.beta.assistants.update(assistant_id=assistant_id, model="gpt-4o-mini",
                                                             instructions="You are Alpha my personal Assistant",
                                                             name="Alpha", tools=self.functions["functions"])
 
    def create_thread(self):
        thread = client.beta.threads.create()
        self.thread_id = thread.id
 
    def delete_thread(self):
        response = client.beta.threads.delete(self.thread_id)
        print('Thread Deleted Successfully')
 
    def add_message(self, user_input):
        message = client.beta.threads.messages.create(thread_id=self.thread_id, role='user', content=user_input)
 
    def get_message(self):
        messages = client.beta.threads.messages.list(self.thread_id)
        output = messages.data[0].content[0].text.value
        return output
 
    def run_assistant(self):
        if self.active_run_id:
            run = self.retrieve_run(self.active_run_id)
            if run.status == "completed":
                self.active_run_id = None
            else:
                return self.active_run_id
 
        run = client.beta.threads.runs.create(thread_id=self.thread_id, assistant_id=assistant_id,
                                              instructions="Reply in Brief")
        self.active_run_id = run.id
        return run.id
 
    def retrieve_run(self, run_id):
        run = client.beta.threads.runs.retrieve(thread_id=self.thread_id, run_id=run_id)
        return run
 
    def run_require_action(self, run, run_id):
        tool_outputs = []
        if run.required_action:
            tool_calls = run.required_action.submit_tool_outputs.tool_calls
            for tool_call in tool_calls:
                function_name = tool_call.function.name
                function_to_call = self.registered_functions.get(function_name)
                if function_to_call:
                    function_args = json.loads(tool_call.function.arguments)
                    function_response = function_to_call(**function_args)
                    tool_outputs.append({"tool_call_id": tool_call.id, "output": function_response})
            run = client.beta.threads.runs.submit_tool_outputs(thread_id=self.thread_id, run_id=run_id,
                                                               tool_outputs=tool_outputs)
 
    def assistant_api(self):
        self.modify_assistant()
        run_id = self.run_assistant()
        run = self.retrieve_run(run_id)
        while run.status == "requires_action" or "queued":
            run = self.retrieve_run(run_id)
            if run.status == "completed":
                self.active_run_id = None
                break
            self.run_require_action(run, run_id)
        outputs = self.get_message()
        tokens = run.usage.total_tokens
        return outputs, tokens
 
    @classmethod
    def add_func(cls, func):
        cls.registered_functions[func.__name__] = func
        doc_lines = func.__doc__.strip().split('\n')
        func_info = {
            'type': 'function',
            'function': {
                'name': func.__name__,
                'description': doc_lines[0].strip(),
                'parameters': {
                    'type': 'object',
                    'properties': {k.strip(): {'type': v.strip().split(':')[0].strip(),
                                               'description': v.strip().split(':')[1].strip()}
                                   for k, v in (line.split(':', 1) for line in doc_lines[1:])},
                    'required': [k.strip() for k, v in (line.split(':', 1) for line in doc_lines[1:])]}}}
 
        cls.functions["functions"].append(func_info)
 
    def speak(self, output, tokens):
        print("\nAlpha: ", end='')
        for char in output:
            print(char, end='', flush=True)
            time.sleep(0.08)
        print(f"\nTokens Used: {tokens}")
        print()
 
        self.engine.say(output)
        self.engine.runAndWait()
 
ai = Assistant()
ai.create_thread()
 
@app.route('/')
def index():
    return render_template('index.html')
 
@app.route('/send_message', methods=['POST'])
def send_message():
    data = request.json
    user_input = data.get('message')
 
    try:
        print("Получено сообщение от пользователя:", user_input)  # Отладка
        if ai.active_run_id:
            run = ai.retrieve_run(ai.active_run_id)
            if run.status != "completed":
                ai.run_require_action(run, ai.active_run_id)
 
        ai.add_message(user_input)
        output, tokens = ai.assistant_api()
        response = {"user": user_input, "bot": output, "tokens": tokens}
        ai.speak(output, tokens)
        print("Отправлено сообщение от бота:", output)  # Отладка
        return jsonify(response)
        print(response)
    except Exception as e:
        print("Ошибка:", str(e))  # Отладка
        return jsonify({"error": str(e)}), 500
 
 
if __name__ == '__main__':
    app.run(debug=True)
А теперь проблемный код! Думаю что ошибка у fetch, но точно не знаю какая...
PHP/HTML
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
<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI Ассистент</title>
    <link rel="stylesheet" href="/static/styles.css">
</head>
<body>
    <div id="chat-container">
        <div id="messages"></div>
        <div id="input-container">
            <input type="text" id="input-field" placeholder="Введите сообщение...">
            <button id="send-button">Отправить</button>
        </div>
    </div>
 
    <script>
        document.getElementById('send-button').addEventListener('click', sendMessage);
 
        function sendMessage() {
            const inputField = document.getElementById('input-field');
            const userMessage = inputField.value;
            if (userMessage.trim() === '') return;
 
            displayMessage('user', userMessage);
            inputField.value = '';
 
            console.log("Отправка запроса: ", userMessage); // Отладка
 
            fetch('/send_message', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify({ message: userMessage })
            })
            .then(response => {
                console.log("Ответ от сервера: ", response);
                return response.json();
            })
            .then(data => {
                if (data.error) {
                    displayMessage('bot', `Ошибка: ${data.error}`);
                } else {
                    displayMessage('bot', data.bot);
                }
            })
            .catch(error => {
                console.log("Ошибка запроса: ", error);
                displayMessage('bot', `Ошибка: ${error.message}`);
            });
        }
 
        function displayMessage(sender, message) {
            const messagesContainer = document.getElementById('messages');
            const messageDiv = document.createElement('div');
            messageDiv.className = `message ${sender}`;
            messageDiv.textContent = message;
            messagesContainer.appendChild(messageDiv);
            messagesContainer.scrollTop = messagesContainer.scrollHeight;
        }
 
 
 
        function displayMessage(sender, message) {
            const messagesContainer = document.getElementById('messages');
            const messageDiv = document.createElement('div');
            messageDiv.className = `message ${sender}`;
            messageDiv.textContent = message;
            messagesContainer.appendChild(messageDiv);
            messagesContainer.scrollTop = messagesContainer.scrollHeight;
        }
    </script>
</body>
</html>
Джаву ИИ писал, я в этой теме полный ноль

А, css, может кто захочет проверить у себя на компе:
CSS
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
body {
    font-family: Arial, sans-serif;
    background-color: #f4f4f4;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    height: 100vh;
    margin: 0;
}
 
#chat-container {
    width: 80%;
    max-width: 600px;
    background-color: #fff;
    padding: 20px;
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
 
#messages {
    height: 300px;
    overflow-y: auto;
    margin-bottom: 20px;
    padding: 10px;
    border: 1px solid #ccc;
    border-radius: 5px;
    background-color: #fafafa;
}
 
.message {
    margin: 5px 0;
}
 
.message.user {
    text-align: right;
    color: blue;
}
 
.message.bot {
    text-align: left;
    color: green;
}
 
#input-container {
    display: flex;
}
 
#input-field {
    flex: 1;
    padding: 10px;
    border: 1px solid #ccc;
    border-radius: 5px;
    margin-right: 10px;
}
 
#send-button {
    padding: 10px 20px;
    border: none;
    border-radius: 5px;
    background-color: #007bff;
    color: #fff;
    cursor: pointer;
}
 
#send-button:hover {
    background-color: #0056b3;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.01.2025, 21:20
Ответы с готовыми решениями:

Обработка ответа сервера
$(document).ready(function () { $(&quot;.regg&quot;).click(function (e) { var res = {}; $(&quot;form#reg_form *&quot;).each(function (index) { ...

Обработка ответа сервера
Добрый день, есть аякс форма которая отправляет данные и получает ответы от сервера. Ответы типа...

Обработка ответа от сервера
Здравствуйте ребята! Возникла пустяковая ошибка, но не могу решить ее, надеюсь на вас. Вот кусочек кода: HttpWebResponse result1 =...

10
 Аватар для voraa
960 / 768 / 143
Регистрация: 21.01.2024
Сообщений: 3,579
13.01.2025, 21:26
Лучший ответ Сообщение было отмечено evgeniy29-git как решение

Решение

html тоже должен грузиться с сервера. С локальной файловой системы fetch работать не будет.
Сервер, к которому обращаются, если он из другого домена, должен возвращать cors заголовки

Code
1
2
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
В любом случае можно посмотреть ошибки в браузере F12 - вкладка console.

Почему 2 функции с именем displayMessage?
1
0 / 0 / 0
Регистрация: 05.11.2024
Сообщений: 6
13.01.2025, 22:09  [ТС]
Ага...

Добавлено через 39 минут
Мне просто на сервер всё выгрузить?

Добавлено через 1 минуту
Да... Ошибочка вышла, ща удалю...
0
0 / 0 / 0
Регистрация: 05.11.2024
Сообщений: 6
13.01.2025, 22:15  [ТС]
Вроде ошибок нет, но ответ в терминал выводится)
Миниатюры
Обработка запросов, ну и отображение ответа от сервера  
0
13.01.2025, 22:28

Не по теме:

Цитата Сообщение от evgeniy29-git Посмотреть сообщение
Джаву ИИ писал
В этом коде нет "джавы".

0
 Аватар для voraa
960 / 768 / 143
Регистрация: 21.01.2024
Сообщений: 3,579
13.01.2025, 22:33
Смотреть F12 - вкладку Net (Сеть) что отправляется, что приходит, с какими заголовками
0
0 / 0 / 0
Регистрация: 05.11.2024
Сообщений: 6
14.01.2025, 00:46  [ТС]
Интернет не грузит( Завтра проверю

Добавлено через 2 минуты
gogolik, спасибо за поправку, да это разные языки. Но всё же... JavaScript от Java пошёл...
0
 Аватар для Mailo
248 / 226 / 31
Регистрация: 18.02.2010
Сообщений: 2,312
14.01.2025, 02:00
Цитата Сообщение от evgeniy29-git Посмотреть сообщение
да это разные языки. Но всё же... JavaScript от Java пошёл...
меня вот подбешивает, когда джаваскрипт джавой называют, просто по тому, что я не понимаю о каком языке идёт речь.
0
14.01.2025, 05:17

Не по теме:

Цитата Сообщение от evgeniy29-git Посмотреть сообщение
JavaScript от Java пошёл...
Нет.
Товарищи из Netscape его переименовали из LiveScript (ранее Mocha) в JavaScript, чтобы "прибиться" к бешеной на тот момент популярности Java. Из общего там только часть синтаксиса и "Java" в названии, не более. Основные движки типа V8 или Spider Monkey написаны в основном на C/C++, так что, даже тут "джавой" не пахнет.

p.s. есть, конечно, Rhino, но он и был написан для связи JS с Java уже после Spider Monkey. В современных браузерах, насколько мне известно, не используется.

0
0 / 0 / 0
Регистрация: 05.11.2024
Сообщений: 6
15.01.2025, 20:22  [ТС]
Ну-у, вот так теперь

Вот скрин
Миниатюры
Обработка запросов, ну и отображение ответа от сервера  
0
 Аватар для voraa
960 / 768 / 143
Регистрация: 21.01.2024
Сообщений: 3,579
15.01.2025, 20:30
Цитата Сообщение от evgeniy29-git Посмотреть сообщение
Вот скрин
Ну это что то в питоне уже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.01.2025, 20:30
Помогаю со студенческими работами здесь

Обход ответа сервера (код 429, превышение количество запросов за единицу времени)
Делаю чекер задача которого банально в инди загружать страницу через get и проверять на наличие определенной строки. Но проблема в том что...

Promise.then обработка ответа от сервера
Доброго времени суток, у меня возникла проблема при обработке ответа на клиентской части, есть контроллер, который обрабатывает введённый...

Обработка ответа с сервера JSON
Добрый день. Делаю один проект для диплома, но есть проблема. PHP формирует запрос к БД и выводит JSON. Мне нужно этот JSON (никак не...

Обработка ответа от сервера (udp)
День добрый. Есть такой вопрос, реализую чат на tcp/udp. С TCP все хорошо а вот на UDP есть проблемка, вернее недопонимание. В...

Отображение картинки во время ожидания ответа от сервера
Как можно реализовать такой механизм? У меня на форме имеется DropDownList при изменении выбора элемента в котором происходит...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
Unity 4D
GameUnited 13.06.2025
Четырехмерное пространство. . . Звучит как что-то из научной фантастики, правда? Однако для меня, как разработчика со стажем в игровой индустрии, четвертое измерение давно перестало быть абстракцией из. . .
SSE (Server-Sent Events) в ASP.NET Core и .NET 10
UnmanagedCoder 13.06.2025
Кажется, Microsoft снова подкинула нам интересную фичу в новой версии фреймворка. Работая с превью . NET 10, я наткнулся на нативную поддержку Server-Sent Events (SSE) в ASP. NET Core Minimal APIs. Эта. . .
С днём независимости России!
Hrethgir 13.06.2025
Решил побеседовать, с утра праздничного дня, с LM о завоеваниях. То что она написала о народе, представителем которого я являюсь сам сначала возмутило меня, но дальше только смешило. Это чисто. . .
Лето вокруг.
kumehtar 13.06.2025
Лето вокруг. Наполненное бурями и ураганами событий. На фоне магии Жизни, священной и вечной, неумелой рукой человека рисуется панорама душевного непокоя. Странные серые краски проникают и. . .
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »