Skip to content

Instantly share code, notes, and snippets.

@ahvahsky2008
Last active October 19, 2023 19:45
Show Gist options
  • Save ahvahsky2008/772612c4641e91c4222d2c665e899510 to your computer and use it in GitHub Desktop.
Save ahvahsky2008/772612c4641e91c4222d2c665e899510 to your computer and use it in GitHub Desktop.
YandexGPT - эмуляция браузера
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)
@ahvahsky2008
Copy link
Author

За основу взял - https://github.com/kuk/rulm-yagpt/tree/0cc983958a9fc4650ac4136274559c59ed8963ff
Переделал под актуальную версию плюс добавил веб интерфейс на fastapi.

единственный момент - есть таймаут сокета. Решать проблему не стал, т.к. мне не зашла эта нейронка

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment