Last active
October 19, 2023 19:45
-
-
Save ahvahsky2008/772612c4641e91c4222d2c665e899510 to your computer and use it in GitHub Desktop.
YandexGPT - эмуляция браузера
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import json | |
import re | |
import aiohttp | |
from uuid import uuid4 | |
from fastapi import FastAPI | |
from pydantic import BaseModel | |
app = FastAPI() | |
class YandexGpt: | |
def __init__(self): | |
self.result = 0 | |
self.websocket = None | |
self.session = aiohttp.ClientSession() | |
self.request_id = None | |
self.prev_req_id = '4642bc9d-c4fc-4286-a4a4-5d435039729b' | |
self.seqNumber = 4 | |
self.url = 'wss://uniproxy.alice.ya.ru/uni.ws' | |
async def connect_to_websocket(self): | |
self.websocket = await self.session.ws_connect(self.url) | |
ws = self.websocket | |
data = '{"event":{"header":{"namespace":"System","name":"SynchronizeState","messageId":"f5c1157e-b2d4-46a8-a2bd-b3057e1ea1db","seqNumber":1},"payload":{"auth_token":"effd5a3f-fd42-4a18-83a1-61766a6d0924","uuid":"00000000000003536044131696265029","vins":{"application":{"app_id":"ru.yandex.webdesktop","platform":"macos"}}}}}' | |
await ws.send_str(data) | |
data = '{"event":{"header":{"namespace":"Vins","name":"TextInput","messageId":"a147db36-c60d-49f3-9755-89c2b5cc7cd8","seqNumber":2},"payload":{"application":{"app_id":"ru.yandex.webdesktop","app_version":"1.0.279-home-static/alice-web/10.2","platform":"macos","os_version":"mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/605.1.15 (khtml, like gecko) version/16.5.1 safari/605.1.15","uuid":"00000000000001575856741644688509","lang":"ru-RU","client_time":"20230705T122852","timezone":"Europe/Moscow","timestamp":"1688560132"},"header":{"prev_req_id":null,"sequence_number":null,"request_id":"9fffa07d-6563-43d9-b0b3-286e1cc86998","dialog_id":null},"request":{"event":{"name":"@@mm_semantic_frame","type":"server_action","payload":{"typed_semantic_frame":{"external_skill_fixed_activate_semantic_frame":{"fixed_skill_id":{"string_value":"b7c42cab-db61-46ba-871a-b10a6ecf3e0d"},"activation_command":{"string_value":""}}},"analytics":{"product_scenario":"dialogovo","origin":"Scenario","purpose":"skill_activate"}}},"voice_session":false,"experiments":["set_symbols_per_second=200","stroka_yabro","search_use_cloud_ui","weather_use_cloud_ui","enable_open_link_and_cloud_ui","hw_onboarding_enable_greetings","remove_feedback_suggests","shopping_list","enable_external_skills_for_webdesktop_and_webtouch","send_show_view_directive_on_supports_show_view_layer_content_interface","use_app_host_pure_Dialogovo_scenario"],"additional_options":{"bass_options":{"screen_scale_factor":1},"supported_features":["open_link","server_action","cloud_ui","cloud_first_screen_div","cloud_ui_filling","show_promo","show_view_layer_content","reminders_and_todos","div2_cards","print_text_in_message_view","supports_print_text_in_message_view","player_pause_directive"],"unsupported_features":[]}},"format":"audio/ogg;codecs=opus","mime":"audio/webm;codecs=opus","topic":"desktopgeneral"}}}' | |
await ws.send_str(data) | |
await ws.receive() | |
data = '{"event":{"header":{"namespace":"Vins","name":"TextInput","messageId":"eb146871-beab-4e23-9d21-9f7b4a107852","seqNumber":3},"payload":{"application":{"app_id":"ru.yandex.webdesktop","app_version":"1.0.279-home-static/alice-web/10.2","platform":"macos","os_version":"mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/605.1.15 (khtml, like gecko) version/16.5.1 safari/605.1.15","uuid":"00000000000001575856741644688509","lang":"ru-RU","client_time":"20230705T122905","timezone":"Europe/Moscow","timestamp":"1688560145"},"header":{"prev_req_id":"9fffa07d-6563-43d9-b0b3-286e1cc86998","sequence_number":null,"request_id":"708c908e-c08b-452c-a76d-b98e59d30558","dialog_id":null},"request":{"event":{"type":"suggested_input","text":"Запусти навык «Давай придумаем»"},"voice_session":false,"experiments":["set_symbols_per_second=200","search_use_cloud_ui","weather_use_cloud_ui","enable_open_link_and_cloud_ui","hw_onboarding_enable_greetings","remove_feedback_suggests","shopping_list","enable_external_skills_for_webdesktop_and_webtouch","send_show_view_directive_on_supports_show_view_layer_content_interface","use_app_host_pure_Dialogovo_scenario"],"additional_options":{"bass_options":{"screen_scale_factor":2},"supported_features":["open_link","server_action","cloud_ui","cloud_first_screen_div","cloud_ui_filling","show_promo","show_view_layer_content","reminders_and_todos","div2_cards","print_text_in_message_view","supports_print_text_in_message_view"],"unsupported_features":["player_pause_directive"]},"location":{"lat":55.755863,"lon":37.6177}},"format":"audio/ogg;codecs=opus","mime":"audio/x-pcm;bit=16;rate=16000","topic":"desktopgeneral"}}}' | |
await ws.send_str(data) | |
message = await ws.receive() | |
assert 'Запускаю навык «Давай придумаем»' in message.data, message.data | |
data = '{"event":{"header":{"namespace":"Vins","name":"TextInput","messageId":"76402cd4-514a-4ad0-9b9c-7a502257ede1","seqNumber":4},"payload":{"application":{"app_id":"ru.yandex.webdesktop","app_version":"1.0.279-home-static/alice-web/10.2","platform":"macos","os_version":"mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/605.1.15 (khtml, like gecko) version/16.5.1 safari/605.1.15","uuid":"00000000000001575856741644688509","lang":"ru-RU","client_time":"20230705T122908","timezone":"Europe/Moscow","timestamp":"1688560148"},"header":{"prev_req_id":"708c908e-c08b-452c-a76d-b98e59d30558","sequence_number":null,"request_id":"4642bc9d-c4fc-4286-a4a4-5d435039729b","dialog_id":"b7c42cab-db61-46ba-871a-b10a6ecf3e0d"},"request":{"event":{"name":"new_dialog_session","payload":{"should_be_silent":true,"request":"","@request_id":"708c908e-c08b-452c-a76d-b98e59d30558","original_utterance":"","source":"undetected","@scenario_name":"Dialogovo","dialog_id":"b7c42cab-db61-46ba-871a-b10a6ecf3e0d"},"ignore_answer":false,"type":"server_action"},"voice_session":false,"experiments":["set_symbols_per_second=200","search_use_cloud_ui","weather_use_cloud_ui","enable_open_link_and_cloud_ui","hw_onboarding_enable_greetings","remove_feedback_suggests","shopping_list","enable_external_skills_for_webdesktop_and_webtouch","send_show_view_directive_on_supports_show_view_layer_content_interface","use_app_host_pure_Dialogovo_scenario"],"additional_options":{"bass_options":{"screen_scale_factor":2},"supported_features":["open_link","server_action","cloud_ui","cloud_first_screen_div","cloud_ui_filling","show_promo","show_view_layer_content","reminders_and_todos","div2_cards","print_text_in_message_view","supports_print_text_in_message_view"],"unsupported_features":["player_pause_directive"]},"location":{"lat":55.755863,"lon":37.6177}},"format":"audio/ogg;codecs=opus","mime":"audio/x-pcm;bit=16;rate=16000","topic":"desktopgeneral"}}}' | |
await ws.send_str(data) | |
message = await ws.receive() | |
self.stack_session_id = uuid4() | |
async def get_data(self, prompt): | |
if self.seqNumber == 4: | |
self.seqNumber+=1 | |
data = '{"event":{"header":{"namespace":"Vins","name":"TextInput","messageId":"7499a1ef-9c4c-4097-8872-6f9bace8cba4","seqNumber":'+str(self.seqNumber)+'},"payload":{"application":{"app_id":"ru.yandex.webdesktop","app_version":"1.0.279-home-static/alice-web/10.2","platform":"macos","os_version":"mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/605.1.15 (khtml, like gecko) version/16.5.1 safari/605.1.15","uuid":"00000000000009431933201688623980","lang":"ru-RU","client_time":"20230706T062211","timezone":"Europe/Moscow","timestamp":"1688624531"},"header":{"prev_req_id":"4642bc9d-c4fc-4286-a4a4-5d435039729b","sequence_number":null,"request_id":"8d524be4-4540-4492-894d-b37c0191e69d","dialog_id":"b7c42cab-db61-46ba-871a-b10a6ecf3e0d"},"request":{"event":{"type":"suggested_input","text":"Как уговорить мужа купить кота"},"voice_session":false,"experiments":["set_symbols_per_second=200","search_use_cloud_ui","weather_use_cloud_ui","enable_open_link_and_cloud_ui","hw_onboarding_enable_greetings","remove_feedback_suggests","shopping_list","enable_external_skills_for_webdesktop_and_webtouch","send_show_view_directive_on_supports_show_view_layer_content_interface","use_app_host_pure_Dialogovo_scenario"],"additional_options":{"bass_options":{"screen_scale_factor":2},"supported_features":["open_link","server_action","cloud_ui","cloud_first_screen_div","cloud_ui_filling","show_promo","show_view_layer_content","reminders_and_todos","div2_cards","print_text_in_message_view","supports_print_text_in_message_view"],"unsupported_features":["player_pause_directive"]},"location":{"lat":55.755863,"lon":37.6177}},"format":"audio/ogg;codecs=opus","mime":"audio/x-pcm;bit=16;rate=16000","topic":"desktopgeneral"}}}' | |
data = data.replace('"Как уговорить мужа купить кота"', json.dumps(prompt)) | |
data = data.replace('8d524be4-4540-4492-894d-b37c0191e69d', str(self.stack_session_id)) | |
await self.websocket.send_str(data) | |
message = await self.websocket.receive() | |
match = re.search(r'"is_end":(true|false),"prefetch_after_ms":\d+,"text":(".*"),"should_rewrite":(true|false)', message.data) | |
is_end, text, should_rewrite = [json.loads(_) for _ in match.groups()] | |
return text | |
else: | |
self.seqNumber+=1 | |
data = '{"event":{"header":{"namespace":"Vins","name":"TextInput","messageId":"'+str(uuid4())+'","seqNumber":'+str(self.seqNumber)+'},"payload":{"application":{"app_id":"ru.yandex.webdesktop","app_version":"1.0.279-home-static/alice-web/10.2","platform":"macos","os_version":"mozilla/5.0 (macintosh; intel mac os x 10_15_7) applewebkit/605.1.15 (khtml, like gecko) version/16.5.1 safari/605.1.15","uuid":"00000000000009431933201688623980","lang":"ru-RU","client_time":"20230706T062211","timezone":"Europe/Moscow","timestamp":"1688624531"},"header":{"prev_req_id":"8d524be4-4540-4492-894d-b37c0191e69d","sequence_number":null,"request_id":"a97f4954-b291-4e0b-ab2d-bb8e8057d414","dialog_id":"b7c42cab-db61-46ba-871a-b10a6ecf3e0d"},"request":{"event":{"type":"suggested_input","text":"Как уговорить мужа купить кота"},"voice_session":false,"experiments":["set_symbols_per_second=200","search_use_cloud_ui","weather_use_cloud_ui","enable_open_link_and_cloud_ui","hw_onboarding_enable_greetings","remove_feedback_suggests","shopping_list","enable_external_skills_for_webdesktop_and_webtouch","send_show_view_directive_on_supports_show_view_layer_content_interface","use_app_host_pure_Dialogovo_scenario"],"additional_options":{"bass_options":{"screen_scale_factor":2},"supported_features":["open_link","server_action","cloud_ui","cloud_first_screen_div","cloud_ui_filling","show_promo","show_view_layer_content","reminders_and_todos","div2_cards","print_text_in_message_view","supports_print_text_in_message_view"],"unsupported_features":["player_pause_directive"]},"location":{"lat":55.755863,"lon":37.6177}},"format":"audio/ogg;codecs=opus","mime":"audio/x-pcm;bit=16;rate=16000","topic":"desktopgeneral"}}}' | |
data = data.replace('8d524be4-4540-4492-894d-b37c0191e69d', str(self.stack_session_id)) | |
self.stack_session_id = str(uuid4()) | |
data = data.replace('a97f4954-b291-4e0b-ab2d-bb8e8057d414', str(self.stack_session_id)) | |
data = data.replace('"Как уговорить мужа купить кота"', json.dumps(prompt)) | |
await self.websocket.send_str(data) | |
message = await self.websocket.receive() | |
match = re.search(r'"is_end":(true|false),"prefetch_after_ms":\d+,"text":(".*"),"should_rewrite":(true|false)', message.data) | |
is_end, text, should_rewrite = [json.loads(_) for _ in match.groups()] | |
return text | |
yg = YandexGpt() | |
@app.get('/calculate') | |
async def calculate(prompt: str): | |
result = await yg.get_data(prompt) | |
return {'result': result} | |
@app.on_event("startup") | |
async def startup_db(): | |
await yg.connect_to_websocket() | |
if __name__ == "__main__": | |
import uvicorn | |
uvicorn.run("server:app", host="0.0.0.0", port=8000, reload=True) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
За основу взял - https://github.com/kuk/rulm-yagpt/tree/0cc983958a9fc4650ac4136274559c59ed8963ff
Переделал под актуальную версию плюс добавил веб интерфейс на fastapi.
единственный момент - есть таймаут сокета. Решать проблему не стал, т.к. мне не зашла эта нейронка