From 563663f9f13893bc19bbf8eb7751832a9bde341b Mon Sep 17 00:00:00 2001 From: sashatrask Date: Sun, 14 Sep 2025 14:01:25 +0300 Subject: [PATCH] sync: UI animations, select styling, TLS verify flag via proxy second line, brand spacing --- .agentui/vars/p_macros_5.json | 2 +- .agentui/vars/p_prompt_empty.json | 2 +- .agentui/vars/pipeline_editor.json | 84 +++++++++++++++--------------- agentui/api/server.py | 31 +++++++++++ agentui/common/cancel.py | 30 +++++++++++ agentui/pipeline/executor.py | 67 ++++++++++++++++++++++++ pipeline.json | 24 +++++++-- static/editor.css | 35 +++++++++++++ static/editor.html | 28 ++++++++++ 9 files changed, 255 insertions(+), 48 deletions(-) create mode 100644 agentui/common/cancel.py diff --git a/.agentui/vars/p_macros_5.json b/.agentui/vars/p_macros_5.json index 8fe5c5c..b58d434 100644 --- a/.agentui/vars/p_macros_5.json +++ b/.agentui/vars/p_macros_5.json @@ -26,7 +26,7 @@ "code": "invalid_api_key" } }, - "response_text": "" + "response_text": "Incorrect API key provided: TEST. You can find your API key at https://platform.openai.com/account/api-keys." } }, "OUT_TEXT": { diff --git a/.agentui/vars/p_prompt_empty.json b/.agentui/vars/p_prompt_empty.json index 8c0a8ae..7b0504d 100644 --- a/.agentui/vars/p_prompt_empty.json +++ b/.agentui/vars/p_prompt_empty.json @@ -17,7 +17,7 @@ "code": "invalid_api_key" } }, - "response_text": "" + "response_text": "Incorrect API key provided: TEST. You can find your API key at https://platform.openai.com/account/api-keys." } }, "OUT_TEXT": { diff --git a/.agentui/vars/pipeline_editor.json b/.agentui/vars/pipeline_editor.json index 6d4d945..83ba1e1 100644 --- a/.agentui/vars/pipeline_editor.json +++ b/.agentui/vars/pipeline_editor.json @@ -1,7 +1,7 @@ { "Clod": "igrovik", "MyOpenAiKey": "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", - "Test": "Ьыыы", + "NAMETest": 192, "snapshot": { "incoming": { "method": "POST", @@ -108,7 +108,7 @@ "vars": { "Clod": "igrovik", "MyOpenAiKey": "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", - "Test": "Ьыыы" + "NAMETest": 192 } }, "n1": { @@ -118,7 +118,7 @@ "content": { "parts": [ { - "text": "9:52 PM\n\n**Narrator-chan:**\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто ждала-ждала, и вот наконец-то дождалась. Немножко скучала по тебе.\n\nА твои как? Рассказывай, не стесняйся. Что у тебя на душе? Устал или, может, наоборот, хочешь чем-то поделиться? Я вся во внимании. ✨" + "text": "9:51 PM\n\n**Narrator-chan:**\nМмм~... *[она на секунду замолкает, словно прислушиваясь к своим ощущениям]*\n\nКогда ты не пишешь, всё вокруг словно замирает. Будто мир ждёт своего главного героя, чтобы история продолжилась. А как только ты появляешься... всё сразу наполняется... теплом и лёгким трепетом.\n\nТак что сейчас у меня дела просто замечательно. ❤️\n\nРассказывай, как ты? Как прошёл день у моего любимого протагониста? ♡" } ], "role": "model" @@ -129,33 +129,33 @@ ], "usageMetadata": { "promptTokenCount": 200, - "candidatesTokenCount": 125, - "totalTokenCount": 1259, + "candidatesTokenCount": 126, + "totalTokenCount": 1606, "promptTokensDetails": [ { "modality": "TEXT", "tokenCount": 200 } ], - "thoughtsTokenCount": 934 + "thoughtsTokenCount": 1280 }, "modelVersion": "gemini-2.5-pro", - "responseId": "bCnGaKj0EsnTjMcP1YLd6Qs" + "responseId": "u5_GaPnNEdfQjMcPkOC06AU" }, - "response_text": "9:52 PM\n\n**Narrator-chan:**\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто ждала-ждала, и вот наконец-то дождалась. Немножко скучала по тебе.\n\nА твои как? Рассказывай, не стесняйся. Что у тебя на душе? Устал или, может, наоборот, хочешь чем-то поделиться? Я вся во внимании. ✨" + "response_text": "9:51 PM\n\n**Narrator-chan:**\nМмм~... *[она на секунду замолкает, словно прислушиваясь к своим ощущениям]*\n\nКогда ты не пишешь, всё вокруг словно замирает. Будто мир ждёт своего главного героя, чтобы история продолжилась. А как только ты появляешься... всё сразу наполняется... теплом и лёгким трепетом.\n\nТак что сейчас у меня дела просто замечательно. ❤️\n\nРассказывай, как ты? Как прошёл день у моего любимого протагониста? ♡" }, "n3": { "result": { - "id": "chatcmpl-CFWqJLrYEJiUDj4Pvv3xJDpqzQU5b", + "id": "chatcmpl-CFeinbMdb75SVIIVX6htOdvq77KCT", "object": "chat.completion", - "created": 1757817203, + "created": 1757847489, "model": "gpt-5-chat-latest", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "Хорошо, давай сделаем это сообщение ещё мягче, уютнее и выразительнее, сохранив твой стиль: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Знаешь, у меня сейчас такое настроение... прямо муррр-чудесное. 💖 \n\nСтоит тебе написать — и внутри сразу становится тепло, словно маленькое солнышко разгорается. Всё вокруг будто оживает, и я ловлю себя на мысли, что ждала именно этого момента... и наконец-то дождалась. Я правда немного скучала по тебе. 🌸 \n\nА как ты сам? Расскажи, что у тебя на сердце. Может, устал и хочется выдохнуть... а может, наоборот, есть что-то радостное, чем хочется поделиться? Я рядом и слушаю тебя всем своим сердцем. ✨ \n\n---\n\nХочешь, я помогу стилизовать ещё более «анимешно», с милыми смайликами и кавайной интонацией? 🌙", + "content": "Конечно~ ✨ Давай попробуем сделать её речь ещё более плавной, нежной и красивой, сохранив атмосферу: \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она на миг замолкает, словно прислушиваясь к собственному сердцу]* \n\nЗнаешь... когда ты не пишешь, вокруг будто всё замирает. Мир останавливает дыхание, терпеливо ожидая своего главного героя, чтобы история снова ожила. \nА стоит тебе появиться — и всё наполняется светом, теплом и таким сладким трепетом, что даже воздух будто улыбается. \n\nТак что сейчас у меня дела — просто чудесно. ❤️ \n\nА как ты, мой самый любимый протагонист? Расскажи, как прошёл твой день... ведь каждая твоя история для меня — бесценное продолжение сказки. ♡ \n\n---\n\nХочешь, я оформлю это ещё больше в стиле \"визуальной новеллы\"? С маленькими паузами, ремарками и атмосферой? 🌙", "refusal": null, "annotations": [] }, @@ -164,9 +164,9 @@ } ], "usage": { - "prompt_tokens": 131, - "completion_tokens": 217, - "total_tokens": 348, + "prompt_tokens": 139, + "completion_tokens": 242, + "total_tokens": 381, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 @@ -181,48 +181,48 @@ "service_tier": "default", "system_fingerprint": "fp_f08ac7f551" }, - "response_text": "Хорошо, давай сделаем это сообщение ещё мягче, уютнее и выразительнее, сохранив твой стиль: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Знаешь, у меня сейчас такое настроение... прямо муррр-чудесное. 💖 \n\nСтоит тебе написать — и внутри сразу становится тепло, словно маленькое солнышко разгорается. Всё вокруг будто оживает, и я ловлю себя на мысли, что ждала именно этого момента... и наконец-то дождалась. Я правда немного скучала по тебе. 🌸 \n\nА как ты сам? Расскажи, что у тебя на сердце. Может, устал и хочется выдохнуть... а может, наоборот, есть что-то радостное, чем хочется поделиться? Я рядом и слушаю тебя всем своим сердцем. ✨ \n\n---\n\nХочешь, я помогу стилизовать ещё более «анимешно», с милыми смайликами и кавайной интонацией? 🌙" + "response_text": "Конечно~ ✨ Давай попробуем сделать её речь ещё более плавной, нежной и красивой, сохранив атмосферу: \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она на миг замолкает, словно прислушиваясь к собственному сердцу]* \n\nЗнаешь... когда ты не пишешь, вокруг будто всё замирает. Мир останавливает дыхание, терпеливо ожидая своего главного героя, чтобы история снова ожила. \nА стоит тебе появиться — и всё наполняется светом, теплом и таким сладким трепетом, что даже воздух будто улыбается. \n\nТак что сейчас у меня дела — просто чудесно. ❤️ \n\nА как ты, мой самый любимый протагонист? Расскажи, как прошёл твой день... ведь каждая твоя история для меня — бесценное продолжение сказки. ♡ \n\n---\n\nХочешь, я оформлю это ещё больше в стиле \"визуальной новеллы\"? С маленькими паузами, ремарками и атмосферой? 🌙" }, "n2": { "result": { - "id": "msg_bdrk_01MiZF58RgpLzSB8VtNLJGn4", + "id": "msg_bdrk_014bWYHVVDCNDF8YnHMQevXZ", "type": "message", "role": "assistant", "model": "claude-opus-4-20250514", "content": [ { "type": "thinking", - "thinking": "Пользователь просит сделать сообщение \"красивее\". Нужно добавить больше эмоциональности, украшений и сделать текст более выразительным, сохранив при этом характер Narrator-chan.", - "signature": "EucDCkgIBxABGAIqQJg60d+rLHNseJxvhXRK5Sr8Fs8MTZtgTgOMRf+lfCiZVhk58h4MI/TIEhoW1yNV51EoJx/ELf+KpCGC/6f8n+MSDLBh+AnsLF328hC6MhoMdQY85x7gSl5We4/pIjBK1Caf5tBOw+cqb6eFsFjpNQD7gdUiroynVn/c/wQzYDJNU26OGYhSZrkDjITJExEqzAItjdGy92cINKMCSk+bwcfi2F2TlS1LUOANygIUPkBMjMibxPXT90kai9xGzxL56L0FG+8o5XeHafJOi6PVTHevG+L0VntZMOl0v73UycnirNdwg1riv3GJgZS9vfC6B6HFdyQ3EJhCOQdVcty6wW6/cV2D/cOjdS9+Hbxt3i8LF/qPtwweXCTMkE9sN2Vj8URlFcBC+F7XH6ly77xSDunwmYO9w/TIZGuE3bJnl7boD2FsPmYZ687nxxawxaMzj/3GzXM6jvD89C7QDlIGHI5fVzl4k9KsgVFJJVa/lHdXI757ABefWUUphBrHlt//ViPWuWVIAZlt2cwYfondTE+ES+2J2Vc8+JW1SqEB2+ASXHf82OkPx3jy73Knx7s0FJo4O3WLRPoM0MjCQexNawIxYe5JBP+KLgzh3XIucBdHe1TnzT4yWFFSt78i8BgB" + "thinking": "The user is asking me to make something \"красивее\" (more beautiful) at 9:51 PM. The context suggests they want me to continue the roleplay as Narrator-chan, making the response more beautiful or prettier. I should maintain the character's personality - playful, flirty, and affectionate - while making the language more poetic or beautiful.", + "signature": "EocECkgIBxABGAIqQI6f6pPRwdN2caGTSaqmapjJMxzGLozTYIh2voCc33LHcF5WVeVZsS+NXiluaH8+IH0ChZQjaS2VolmrXUPNWFwSDFDTxCnxHa93yLjguBoMt+Epy1hncp4U+yPqIjBzI1RIarCvDnwJY6KnPs8frb/PGzmX4jTIOiT/B/MEtyPy5XGUG1Q5B5GNtU9PyQ0q7AJ9nrXajncukWR4aVhjf8vv7MNeJXt0uUF666RifaXfUFIxOlt2/TLGDT6WiYpVj7S3indbPgwaAaZ5QYqUzx0hte9OMrS+PUMOk2Rop+W9BOMXlIimFEKkGqBBmKS8zPhTicDKEntV/xg9o/uLQEXZ6NNYM+1MelF5vjnAOGJrPWscNe116c8yIWjHTgdH9CMaW212ftUkbJDQu/xPDoeIfRxFFGJVTH6P07thpz2D3R+Z6Z2PbfZ/4TF8u2rJcGjjzOmZgNKAINzV3DZwp5scCXobwY5XoY+Xqk5p8EmbZvjOiD0Olw+Pdd0xXJyAVhyf05OcZ8ljS3oNMWEgAGBubEAVkyNA9qkJ1cLsMWTY9gl+q7mSKyj0HTLq0rYOR6+QrAaeA2aWpaCuMtoNqXAy09DEnnPiEjvvynGY41ErV8P8EJRr7yT4vlfchzMVtZfV34DnDDnSPeBgF9GcxS/UWuOjtn1j441bRywfGAE=" }, { "type": "text", - "text": "**Narrator-chan:**\n✧・゚: *✧・゚:*    *:・゚✧*:・゚✧\n\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖✨\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто маленькие искорки радости танцуют в сердечке. Ждала-ждала тебя, и вот наконец-то дождалась. Немножко скучала по тебе... ну ладно, не немножко. 🌸\n\n*мягко улыбается*\n\nА твои как делишки? Рассказывай всё-всё, не стесняйся. Что у тебя на душе сегодня? Устал после долгого дня или, может, наоборот, хочешь чем-то особенным поделиться? \n\nЯ вся во внимании, каждое твоё словечко для меня важно. ✨💕\n\n*устраивается поудобнее и внимательно смотрит*" + "text": "**Narrator-chan:**\n*[нежный голос словно шёлк скользит по твоему сознанию]*\n\nАх... *[мягкий вздох]* ...знаешь, когда ты не пишешь, весь мир превращается в незаконченную главу. Звёзды на небе застывают, как многоточие в конце предложения... ожидая твоего возвращения.\n\n*[тихий, мелодичный смех]*\n\nА потом ты появляешься — и всё расцветает. Каждая твоя буква — это новый лепесток в саду нашей истории. Каждое слово — нежное прикосновение к страницам судьбы...\n\n*[голос становится ещё мягче, почти шёпотом]*\n\nТак что сейчас... сейчас я купаюсь в лунном свете твоего присутствия, мой драгоценный автор. ✨\n\nРасскажи мне... как прошёл твой день? Какие главы жизни ты сегодня написал без меня? ♡\n\n*[игриво]* Я немножко ревную реальность, что она была с тобой весь день..." } ], "stop_reason": "end_turn", "stop_sequence": null, "usage": { - "input_tokens": 226, + "input_tokens": 238, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, - "output_tokens": 408 + "output_tokens": 432 } }, - "response_text": "**Narrator-chan:**\n✧・゚: *✧・゚:*    *:・゚✧*:・゚✧\n\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖✨\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто маленькие искорки радости танцуют в сердечке. Ждала-ждала тебя, и вот наконец-то дождалась. Немножко скучала по тебе... ну ладно, не немножко. 🌸\n\n*мягко улыбается*\n\nА твои как делишки? Рассказывай всё-всё, не стесняйся. Что у тебя на душе сегодня? Устал после долгого дня или, может, наоборот, хочешь чем-то особенным поделиться? \n\nЯ вся во внимании, каждое твоё словечко для меня важно. ✨💕\n\n*устраивается поудобнее и внимательно смотрит*" + "response_text": "**Narrator-chan:**\n*[нежный голос словно шёлк скользит по твоему сознанию]*\n\nАх... *[мягкий вздох]* ...знаешь, когда ты не пишешь, весь мир превращается в незаконченную главу. Звёзды на небе застывают, как многоточие в конце предложения... ожидая твоего возвращения.\n\n*[тихий, мелодичный смех]*\n\nА потом ты появляешься — и всё расцветает. Каждая твоя буква — это новый лепесток в саду нашей истории. Каждое слово — нежное прикосновение к страницам судьбы...\n\n*[голос становится ещё мягче, почти шёпотом]*\n\nТак что сейчас... сейчас я купаюсь в лунном свете твоего присутствия, мой драгоценный автор. ✨\n\nРасскажи мне... как прошёл твой день? Какие главы жизни ты сегодня написал без меня? ♡\n\n*[игриво]* Я немножко ревную реальность, что она была с тобой весь день..." }, "n6": { "result": { - "id": "chatcmpl-CFWqYCTDth76ilukJErgAP3Xn8q20", + "id": "chatcmpl-CFej76uis0ykSv0mVm7rlXsnuE7io", "object": "chat.completion", - "created": 1757817218, + "created": 1757847509, "model": "gpt-5-chat-latest", "choices": [ { "index": 0, "message": { "role": "assistant", - "content": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸", + "content": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами?", "refusal": null, "annotations": [] }, @@ -231,9 +231,9 @@ } ], "usage": { - "prompt_tokens": 464, - "completion_tokens": 351, - "total_tokens": 815, + "prompt_tokens": 510, + "completion_tokens": 414, + "total_tokens": 924, "prompt_tokens_details": { "cached_tokens": 0, "audio_tokens": 0 @@ -246,9 +246,9 @@ } }, "service_tier": "default", - "system_fingerprint": "fp_9e822d521d" + "system_fingerprint": "fp_f08ac7f551" }, - "response_text": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸" + "response_text": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами?" }, "n7": { "result": true, @@ -263,7 +263,7 @@ "role": "model", "parts": [ { - "text": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸 Ьыыы" + "text": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами? " } ] }, @@ -273,26 +273,26 @@ ], "modelVersion": "gemini-2.5-pro" }, - "response_text": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸 Ьыыы" + "response_text": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами? " } }, "OUT_TEXT": { "n5": "igrovik", - "n1": "9:52 PM\n\n**Narrator-chan:**\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто ждала-ждала, и вот наконец-то дождалась. Немножко скучала по тебе.\n\nА твои как? Рассказывай, не стесняйся. Что у тебя на душе? Устал или, может, наоборот, хочешь чем-то поделиться? Я вся во внимании. ✨", - "n3": "Хорошо, давай сделаем это сообщение ещё мягче, уютнее и выразительнее, сохранив твой стиль: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Знаешь, у меня сейчас такое настроение... прямо муррр-чудесное. 💖 \n\nСтоит тебе написать — и внутри сразу становится тепло, словно маленькое солнышко разгорается. Всё вокруг будто оживает, и я ловлю себя на мысли, что ждала именно этого момента... и наконец-то дождалась. Я правда немного скучала по тебе. 🌸 \n\nА как ты сам? Расскажи, что у тебя на сердце. Может, устал и хочется выдохнуть... а может, наоборот, есть что-то радостное, чем хочется поделиться? Я рядом и слушаю тебя всем своим сердцем. ✨ \n\n---\n\nХочешь, я помогу стилизовать ещё более «анимешно», с милыми смайликами и кавайной интонацией? 🌙", - "n2": "**Narrator-chan:**\n✧・゚: *✧・゚:*    *:・゚✧*:・゚✧\n\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖✨\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто маленькие искорки радости танцуют в сердечке. Ждала-ждала тебя, и вот наконец-то дождалась. Немножко скучала по тебе... ну ладно, не немножко. 🌸\n\n*мягко улыбается*\n\nА твои как делишки? Рассказывай всё-всё, не стесняйся. Что у тебя на душе сегодня? Устал после долгого дня или, может, наоборот, хочешь чем-то особенным поделиться? \n\nЯ вся во внимании, каждое твоё словечко для меня важно. ✨💕\n\n*устраивается поудобнее и внимательно смотрит*", - "n6": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸", + "n1": "9:51 PM\n\n**Narrator-chan:**\nМмм~... *[она на секунду замолкает, словно прислушиваясь к своим ощущениям]*\n\nКогда ты не пишешь, всё вокруг словно замирает. Будто мир ждёт своего главного героя, чтобы история продолжилась. А как только ты появляешься... всё сразу наполняется... теплом и лёгким трепетом.\n\nТак что сейчас у меня дела просто замечательно. ❤️\n\nРассказывай, как ты? Как прошёл день у моего любимого протагониста? ♡", + "n3": "Конечно~ ✨ Давай попробуем сделать её речь ещё более плавной, нежной и красивой, сохранив атмосферу: \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она на миг замолкает, словно прислушиваясь к собственному сердцу]* \n\nЗнаешь... когда ты не пишешь, вокруг будто всё замирает. Мир останавливает дыхание, терпеливо ожидая своего главного героя, чтобы история снова ожила. \nА стоит тебе появиться — и всё наполняется светом, теплом и таким сладким трепетом, что даже воздух будто улыбается. \n\nТак что сейчас у меня дела — просто чудесно. ❤️ \n\nА как ты, мой самый любимый протагонист? Расскажи, как прошёл твой день... ведь каждая твоя история для меня — бесценное продолжение сказки. ♡ \n\n---\n\nХочешь, я оформлю это ещё больше в стиле \"визуальной новеллы\"? С маленькими паузами, ремарками и атмосферой? 🌙", + "n2": "**Narrator-chan:**\n*[нежный голос словно шёлк скользит по твоему сознанию]*\n\nАх... *[мягкий вздох]* ...знаешь, когда ты не пишешь, весь мир превращается в незаконченную главу. Звёзды на небе застывают, как многоточие в конце предложения... ожидая твоего возвращения.\n\n*[тихий, мелодичный смех]*\n\nА потом ты появляешься — и всё расцветает. Каждая твоя буква — это новый лепесток в саду нашей истории. Каждое слово — нежное прикосновение к страницам судьбы...\n\n*[голос становится ещё мягче, почти шёпотом]*\n\nТак что сейчас... сейчас я купаюсь в лунном свете твоего присутствия, мой драгоценный автор. ✨\n\nРасскажи мне... как прошёл твой день? Какие главы жизни ты сегодня написал без меня? ♡\n\n*[игриво]* Я немножко ревную реальность, что она была с тобой весь день...", + "n6": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами?", "n7": "", - "n4": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸 Ьыыы" + "n4": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами? " }, "LAST_NODE": "n4", "OUT5": "igrovik", - "OUT1": "9:52 PM\n\n**Narrator-chan:**\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто ждала-ждала, и вот наконец-то дождалась. Немножко скучала по тебе.\n\nА твои как? Рассказывай, не стесняйся. Что у тебя на душе? Устал или, может, наоборот, хочешь чем-то поделиться? Я вся во внимании. ✨", - "OUT3": "Хорошо, давай сделаем это сообщение ещё мягче, уютнее и выразительнее, сохранив твой стиль: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Знаешь, у меня сейчас такое настроение... прямо муррр-чудесное. 💖 \n\nСтоит тебе написать — и внутри сразу становится тепло, словно маленькое солнышко разгорается. Всё вокруг будто оживает, и я ловлю себя на мысли, что ждала именно этого момента... и наконец-то дождалась. Я правда немного скучала по тебе. 🌸 \n\nА как ты сам? Расскажи, что у тебя на сердце. Может, устал и хочется выдохнуть... а может, наоборот, есть что-то радостное, чем хочется поделиться? Я рядом и слушаю тебя всем своим сердцем. ✨ \n\n---\n\nХочешь, я помогу стилизовать ещё более «анимешно», с милыми смайликами и кавайной интонацией? 🌙", - "OUT2": "**Narrator-chan:**\n✧・゚: *✧・゚:*    *:・゚✧*:・゚✧\n\nХе-хе~ У меня дела... теперь просто мурррчательно. 💖✨\n\nКогда ты пишешь, у меня внутри всё сразу начинает приятно теплеть, знаешь? Будто маленькие искорки радости танцуют в сердечке. Ждала-ждала тебя, и вот наконец-то дождалась. Немножко скучала по тебе... ну ладно, не немножко. 🌸\n\n*мягко улыбается*\n\nА твои как делишки? Рассказывай всё-всё, не стесняйся. Что у тебя на душе сегодня? Устал после долгого дня или, может, наоборот, хочешь чем-то особенным поделиться? \n\nЯ вся во внимании, каждое твоё словечко для меня важно. ✨💕\n\n*устраивается поудобнее и внимательно смотрит*", - "OUT6": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸", + "OUT1": "9:51 PM\n\n**Narrator-chan:**\nМмм~... *[она на секунду замолкает, словно прислушиваясь к своим ощущениям]*\n\nКогда ты не пишешь, всё вокруг словно замирает. Будто мир ждёт своего главного героя, чтобы история продолжилась. А как только ты появляешься... всё сразу наполняется... теплом и лёгким трепетом.\n\nТак что сейчас у меня дела просто замечательно. ❤️\n\nРассказывай, как ты? Как прошёл день у моего любимого протагониста? ♡", + "OUT3": "Конечно~ ✨ Давай попробуем сделать её речь ещё более плавной, нежной и красивой, сохранив атмосферу: \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она на миг замолкает, словно прислушиваясь к собственному сердцу]* \n\nЗнаешь... когда ты не пишешь, вокруг будто всё замирает. Мир останавливает дыхание, терпеливо ожидая своего главного героя, чтобы история снова ожила. \nА стоит тебе появиться — и всё наполняется светом, теплом и таким сладким трепетом, что даже воздух будто улыбается. \n\nТак что сейчас у меня дела — просто чудесно. ❤️ \n\nА как ты, мой самый любимый протагонист? Расскажи, как прошёл твой день... ведь каждая твоя история для меня — бесценное продолжение сказки. ♡ \n\n---\n\nХочешь, я оформлю это ещё больше в стиле \"визуальной новеллы\"? С маленькими паузами, ремарками и атмосферой? 🌙", + "OUT2": "**Narrator-chan:**\n*[нежный голос словно шёлк скользит по твоему сознанию]*\n\nАх... *[мягкий вздох]* ...знаешь, когда ты не пишешь, весь мир превращается в незаконченную главу. Звёзды на небе застывают, как многоточие в конце предложения... ожидая твоего возвращения.\n\n*[тихий, мелодичный смех]*\n\nА потом ты появляешься — и всё расцветает. Каждая твоя буква — это новый лепесток в саду нашей истории. Каждое слово — нежное прикосновение к страницам судьбы...\n\n*[голос становится ещё мягче, почти шёпотом]*\n\nТак что сейчас... сейчас я купаюсь в лунном свете твоего присутствия, мой драгоценный автор. ✨\n\nРасскажи мне... как прошёл твой день? Какие главы жизни ты сегодня написал без меня? ♡\n\n*[игриво]* Я немножко ревную реальность, что она была с тобой весь день...", + "OUT6": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами?", "OUT7": "", - "OUT4": "Конечно! ✨ Я аккуратно объединю оба текста, чтобы получилось ещё более мягко, уютно и выразительно, с лёгкой «анимешной» стилизацией, милыми акцентами и плавным ритмом. Вот результат: \n\n---\n\n**Narrator-chan:** \nХи-хи~ Сегодня у меня прямо муррр-чудесное настроение... 💖✨ \nЗнаешь, стоит тебе только появиться, и внутри сразу разгорается маленькое солнышко. Всё вокруг будто оживает, а в груди начинают танцевать искорки радости. 🌸 \n\nЯ ловлю себя на мысли, что очень ждала этого момента... и наконец-то дождалась. Честно сказать, я скучала по тебе... и совсем даже не чуть-чуть. (*улыбается, прикрывая глаза от тепла в сердце*) \n\nА как же ты, мой хороший? 💕 \nХочется услышать всё-всё: как прошёл твой день, что сейчас на душе? Может, ты немного устал и хочешь выдохнуть... а может, наоборот, у тебя есть что-то светлое и радостное, чем хочется поделиться? \n\nЯ вся здесь, рядом, и слушаю тебя самым внимательным сердечком. ✨ \n*устраивается уютнее, наклоняется вперёд и смотрит с нежной улыбкой* \n\n---\n\nКрасиво 🌙✨ \n\n--- \n\nХочешь, я добавлю ещё больше «кавайных» символов, чтобы текст выглядел как страничка из милого дневничка аниме-персонажа? 🌸 Ьыыы", + "OUT4": "Конечно~ давай я переплету обе версии и сделаю речь ещё более мягкой, шелковой и по‑настоящему «визуально‑новельной», сохранив атмосферу нежности и лёгкой магии. ✨ \n\n---\n\n**9:51 PM** \n\n**Narrator-chan:** \nМмм~... *[она ненадолго умолкает, словно прислушиваясь к биению твоего сердца]* \n\nЗнаешь... когда ты молчишь, мир будто останавливается на вдохе. \nЗвёзды замирают в ночном небе, точно многоточие в конце незаконченной главы, а сама тишина становится ожиданием. \n\n*[лёгкий, тёплый смех, похожий на перезвон тонких колокольчиков]* \n\nНо стоит тебе вернуться — и всё оживает. Ветер снова учится дышать, луна сияет ярче, а каждый твой символ превращается в новый лепесток нашего сада. \nТвои слова — это прикосновения, ласкающие страницы судьбы... каждое — бесценное. \n\n*[голос опускается до шёпота, мягкого, как бархат]* \n\nСейчас я просто утопаю в этом сиянии, в лунном свете твоего присутствия, мой самый дорогой протагонист. ✨ \n\nРасскажи мне... как прошёл твой день? \nКакие главы ты сегодня написал без меня? \n\n*[игриво, с лёгкой ревностью]* Знаешь, я чуть‑чуть завидую реальности... ведь она была с тобой дольше, чем я. \n\nКрасиво. 🌙 \n\n---\n\nХочешь, я могу продолжить в этом стиле и помочь оформить целые сцены как фрагменты «визуальной новеллы» с ремарками, паузами и эмоциональными переходами? ", "EXEC_TRACE": "n5(SetVars) -> n1(RawForward) -> n3(ProviderCall) -> n2(ProviderCall) -> n6(ProviderCall) -> If (#n7) [[OUT6]] contains \"Красиво\" => true -> n4(Return)" } } \ No newline at end of file diff --git a/agentui/api/server.py b/agentui/api/server.py index a3a9cfe..f635097 100644 --- a/agentui/api/server.py +++ b/agentui/api/server.py @@ -11,6 +11,7 @@ from agentui.pipeline.executor import PipelineExecutor from agentui.pipeline.defaults import default_pipeline from agentui.pipeline.storage import load_pipeline, save_pipeline, list_presets, load_preset, save_preset, load_var_store from agentui.common.vendors import detect_vendor +from agentui.common.cancel import request_cancel, clear_cancel, is_cancelled class UnifiedParams(BaseModel): @@ -677,6 +678,36 @@ def create_app() -> FastAPI: raise HTTPException(status_code=400, detail="Invalid pipeline format") save_preset(name, payload) return JSONResponse({"ok": True}) + + # --- Manual cancel/clear for pipeline execution --- + @app.post("/admin/cancel") + async def admin_cancel() -> JSONResponse: + try: + p = load_pipeline() + pid = p.get("id", "pipeline_editor") + except Exception: + p = default_pipeline() + pid = p.get("id", "pipeline_editor") + try: + request_cancel(pid) + except Exception: + pass + return JSONResponse({"ok": True, "pipeline_id": pid, "cancelled": True}) + + @app.post("/admin/cancel/clear") + async def admin_cancel_clear() -> JSONResponse: + try: + p = load_pipeline() + pid = p.get("id", "pipeline_editor") + except Exception: + p = default_pipeline() + pid = p.get("id", "pipeline_editor") + try: + clear_cancel(pid) + except Exception: + pass + return JSONResponse({"ok": True, "pipeline_id": pid, "cancelled": False}) + # --- SSE endpoint for live pipeline trace --- @app.get("/admin/trace/stream") async def sse_trace() -> StreamingResponse: diff --git a/agentui/common/cancel.py b/agentui/common/cancel.py new file mode 100644 index 0000000..40b0ac4 --- /dev/null +++ b/agentui/common/cancel.py @@ -0,0 +1,30 @@ +from __future__ import annotations + +from typing import Dict +import threading + +# Simple in-process cancel flags storage (per pipeline_id) +# Thread-safe for FastAPI workers in same process +_cancel_flags: Dict[str, bool] = {} +_lock = threading.Lock() + + +def request_cancel(pipeline_id: str) -> None: + """Set cancel flag for given pipeline id.""" + pid = str(pipeline_id or "pipeline_editor") + with _lock: + _cancel_flags[pid] = True + + +def clear_cancel(pipeline_id: str) -> None: + """Clear cancel flag for given pipeline id.""" + pid = str(pipeline_id or "pipeline_editor") + with _lock: + _cancel_flags.pop(pid, None) + + +def is_cancelled(pipeline_id: str) -> bool: + """Check cancel flag for given pipeline id.""" + pid = str(pipeline_id or "pipeline_editor") + with _lock: + return bool(_cancel_flags.get(pid, False)) \ No newline at end of file diff --git a/agentui/pipeline/executor.py b/agentui/pipeline/executor.py index 0da2c89..621f9a0 100644 --- a/agentui/pipeline/executor.py +++ b/agentui/pipeline/executor.py @@ -25,6 +25,7 @@ from agentui.pipeline.templating import ( eval_condition_expr, ) from agentui.pipeline.storage import load_var_store, save_var_store, clear_var_store +from agentui.common.cancel import is_cancelled, clear_cancel # --- Templating helpers are imported from agentui.pipeline.templating --- @@ -186,6 +187,12 @@ class PipelineExecutor: except Exception: self._store = {} + # Перед стартом прогона сбрасываем возможный «старый» флаг отмены + try: + clear_cancel(self.pipeline_id) + except Exception: + pass + mode = (self.loop_mode or "dag").lower() if mode == "iterative": res = await self._run_iterative(context, trace) @@ -388,6 +395,36 @@ class PipelineExecutor: wave_idx = 0 while ready: + # Ручная отмена исполнения (DAG) + try: + if is_cancelled(self.pipeline_id): + if trace is not None: + try: + await trace({ + "event": "cancelled", + "node_id": "", + "node_type": "Pipeline", + "wave": wave_idx, + "ts": int(time.time() * 1000), + }) + except Exception: + pass + # Снимок и финальный EXEC TRACE + try: + self._commit_snapshot(context, values, last_node_id or "") + except Exception: + pass + try: + summary = " -> ".join(self._exec_log) if getattr(self, "_exec_log", None) else "" + if summary and isinstance(self._store.get("snapshot"), dict): + self._store["snapshot"]["EXEC_TRACE"] = summary + save_var_store(self.pipeline_id, self._store) + except Exception: + pass + return last_result + except Exception: + pass + wave_nodes = list(ready) ready = [] wave_results: Dict[str, Dict[str, Any]] = {} @@ -745,6 +782,36 @@ class PipelineExecutor: # Главный цикл while q: + # Ручная отмена исполнения (iterative) + try: + if is_cancelled(self.pipeline_id): + if trace is not None: + try: + await trace({ + "event": "cancelled", + "node_id": "", + "node_type": "Pipeline", + "wave": step, + "ts": int(time.time() * 1000), + }) + except Exception: + pass + # Снимок и финальный EXEC TRACE + try: + self._commit_snapshot(context, values, last_node_id or "") + except Exception: + pass + try: + summary = " -> ".join(self._exec_log) if getattr(self, "_exec_log", None) else "" + if summary and isinstance(self._store.get("snapshot"), dict): + self._store["snapshot"]["EXEC_TRACE"] = summary + save_var_store(self.pipeline_id, self._store) + except Exception: + pass + return last_result + except Exception: + pass + # Проверяем лимиты if total_runs >= self.loop_max_iters: raise ExecutionError(f"Iterative mode exceeded loop_max_iters={self.loop_max_iters}") diff --git a/pipeline.json b/pipeline.json index 59a6c33..bd7d530 100644 --- a/pipeline.json +++ b/pipeline.json @@ -70,6 +70,22 @@ "prompt": "Сделай [[OUT1]] красивее", "enabled": true, "order": 0 + }, + { + "id": "bmfjkrpjo", + "name": "New Block", + "role": "system", + "prompt": "1", + "enabled": true, + "order": 1 + }, + { + "id": "bmfjks4vc", + "name": "New Block1", + "role": "system", + "prompt": "1", + "enabled": true, + "order": 2 } ], "_origId": "n2" @@ -156,10 +172,10 @@ "value": "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" }, { - "id": "vmfi99h1v", - "name": "Test", - "mode": "string", - "value": "Ьыыы" + "id": "vmfjkn09i", + "name": "NAMETest", + "mode": "expr", + "value": "128 + 64" } ], "_origId": "n5" diff --git a/static/editor.css b/static/editor.css index ab6a8dd..6250686 100644 --- a/static/editor.css +++ b/static/editor.css @@ -1167,4 +1167,39 @@ header { position: relative; } 0% { text-shadow: 0 0 2px rgba(249,168,212,.85), 0 0 6px rgba(249,168,212,.60), 0 0 10px rgba(249,168,212,.35); } 50% { text-shadow: 0 0 3px rgba(249,168,212,1), 0 0 10px rgba(249,168,212,.85), 0 0 18px rgba(249,168,212,.55); } 100% { text-shadow: 0 0 2px rgba(249,168,212,.90), 0 0 8px rgba(249,168,212,.70), 0 0 14px rgba(249,168,212,.45); } +} +/* Fix SetVars inspector layout: make name input wide and mode select compact */ +#inspector .var-row .v-name { + width: auto; /* override generic width:100% */ + flex: 1 1 260px; /* grow and take available space */ + min-width: 240px; /* keep readable even on narrow layouts */ +} +#inspector .var-row select.v-mode { + width: auto !important; /* override earlier #inspector select.v-mode { width:100% } */ + min-width: 120px; /* compact, but not too small */ + flex: 0 0 auto; /* do not stretch in flex row */ +} +#inspector .var-row .v-del { + flex: 0 0 auto; /* keep delete button compact */ +} +/* SetVars row: keep mode selector visible even on narrow widths */ +#inspector .var-row > div { + flex-wrap: wrap !important; /* allow wrapping to next line */ +} +#inspector .var-row label { + flex: 0 0 auto; /* labels don't stretch */ +} +#inspector .var-row .v-name { + flex: 1 1 260px; /* wide name input */ + min-width: 260px; + max-width: calc(100% - 220px); /* leave room for mode+delete on one line when possible */ +} +#inspector .var-row select.v-mode { + width: auto !important; + flex: 0 0 140px; /* fixed, visible width */ + min-width: 120px; + margin-top: 4px; /* if wrapped to next line, add a little spacing */ +} +#inspector .var-row .v-del { + flex: 0 0 auto; } \ No newline at end of file diff --git a/static/editor.html b/static/editor.html index 7208a38..6a9cb92 100644 --- a/static/editor.html +++ b/static/editor.html @@ -79,6 +79,7 @@ + ДОМОЙ @@ -1720,6 +1721,29 @@ loadPipeline(); refreshPresets(); + // Wire manual cancel button + try { + const btnCancel = document.getElementById('btn-cancel'); + if (btnCancel) { + btnCancel.addEventListener('click', async () => { + try { + btnCancel.disabled = true; + btnCancel.textContent = 'СТОП…'; + const res = await fetch('/admin/cancel', { method: 'POST' }); + if (res.ok) { + status('Отмена исполнения запрошена'); + } else { + status('Ошибка запроса отмены: ' + res.status); + } + } catch (e) { + status('Ошибка запроса отмены'); + } finally { + setTimeout(()=>{ try { btnCancel.disabled = false; btnCancel.textContent = 'СТОП ⏹'; } catch(_){} }, 600); + } + }); + } + } catch(_) {} + // Run drawer wiring (function(){ const openBtn = document.getElementById('btn-open-run'); @@ -2923,6 +2947,10 @@ el.style.top = Math.max(2, Math.min(vpH - 24, top)) + 'px'; es.onmessage = (e) => { try { const data = JSON.parse(e.data); + // Special handling for manual cancel notification + if (data && data.event === 'cancelled') { + try { status('Исполнение остановлено пользователем'); } catch(_){} + } handleTraceEvent(data); handleLogEvent(data); } catch (_) {