114b7eebdf
Testy / Testy warstwy logicznej (silnik) (pull_request) Successful in 11m21s
Testy / Testy warstwy prezentacji (dostęp do baz) (pull_request) Successful in 9m50s
Testy / Build obrazu silnika B (swisseph) (pull_request) Successful in 34s
Testy / Kontrola składni wszystkich warstw (pull_request) Successful in 21s
build / build (push) Successful in 1m49s
Testy / Testy warstwy logicznej (silnik) (push) Successful in 11m20s
Testy / Testy warstwy prezentacji (dostęp do baz) (push) Successful in 10m0s
Testy / Build obrazu silnika B (swisseph) (push) Successful in 37s
Testy / Kontrola składni wszystkich warstw (push) Successful in 25s
Generowanie trwa minutami, a zwykly POST nie dawal zadnego sygnalu — aplikacja wygladala na zawieszona. Teraz w trakcie pracy pojawia sie okno z logiem, zegarem i spinnerem. Log pokazuje RZECZYWISTE zdarzenia z serwera, nie udawany pasek postepu: - app/progress.py — strumien NDJSON; praca leci w watku roboczym, generator odpompowuje kolejke, wiec zdarzenia docz w TRAKCIE pracy, nie na koncu; heartbeat co 10s, zeby proxy nie uznalo polaczenia za martwe, - providers.generate(..., on_event) — raportuje kazda ture (start, czas trwania, liczba znakow, czy urwana), bo to tura trwa, - POST /chart/horoscope/stream w logice + proxy /horoscope/stream w prezentacji. Wynik: ostatnie zdarzenie niesie GOTOWY HTML wyrenderowany z tego samego szablonu, ktory renderuje przeladowanie strony (_prompt_result.html wydzielony z _prompt_block.html). Jedno zrodlo prawdy dla wygladu wyniku — okno wstawia go bez przeladowania. Degradacja: bez strumieniowania w przegladarce formularz idzie klasycznie i wszystko dziala jak wczesniej, tylko bez okna. Blad polaczenia konczy sie komunikatem w logu, nie cisza. BLAD ZNALEZIONY PRZY TESCIE NA ZYWO: petla kontynuacji odejmowala od budzetu ZAMOWIONY limit tury zamiast tokenow faktycznie wyprodukowanych — pierwsza tura zjadala caly budzet, wiec urwana odpowiedz nigdy nie doczekala sie dokonczenia i wracala do uzytkownika jako calosc. Naprawione i pokryte testem regresyjnym. Testy: 176 passed / 1 skipped (logika) + 17 (prezentacja). Zweryfikowane na zywo z wolna atrapa modelu: zdarzenia z poprawnymi czasami, okno z 11 liniami logu, wynik wstawiony bez przeladowania strony. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
81 lines
3.3 KiB
HTML
81 lines
3.3 KiB
HTML
{# Blok WYNIKU generowania (prompt/horoskop). Wydzielony, bo wstawia go także
|
|
okno postępu po zakończeniu strumienia — dzięki temu jest jedno źródło
|
|
prawdy dla wyglądu wyniku, niezależnie od drogi, którą przyszedł. #}
|
|
{% if prompt_result %}
|
|
{% set st = prompt_result.stats %}
|
|
|
|
{# --- wynik: napisany horoskop (LOG-31) + transparentność (PRE-15) --- #}
|
|
{% if prompt_result.horoscope %}
|
|
<div class="meta">
|
|
Horoskop napisany przez: <strong>{{ prompt_result.provider }}</strong> ·
|
|
model: {{ prompt_result.model }}
|
|
{% if prompt_result.usage and prompt_result.usage.completion_tokens %}
|
|
· tokeny odpowiedzi: {{ prompt_result.usage.completion_tokens }}
|
|
{% endif %}
|
|
{% if prompt_result.leaves_lan %}
|
|
· <strong class="retro">dane opuściły sieć</strong>
|
|
{% else %}
|
|
· dane nie opuściły sieci
|
|
{% endif %}
|
|
</div>
|
|
<div class="actions">
|
|
<button type="button" class="ghost" data-copy="#horoscopeText">Kopiuj horoskop</button>
|
|
</div>
|
|
<textarea id="horoscopeText" class="prompt" rows="20" readonly>{{ prompt_result.horoscope }}</textarea>
|
|
<p class="muted small">
|
|
Treść wygenerował model językowy na podstawie {{ st.included }} wskazań z baz.
|
|
<strong>Nie stanowi porady medycznej, prawnej ani finansowej.</strong>
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if prompt_result.warnings %}
|
|
{% for w in prompt_result.warnings %}
|
|
<p class="muted small"><strong>Uwaga:</strong> {{ w }}</p>
|
|
{% endfor %}
|
|
{% endif %}
|
|
|
|
{% if prompt_result.token_plan %}
|
|
{% set tp = prompt_result.token_plan %}
|
|
<p class="muted small">
|
|
Tokeny: prompt {{ tp.prompt_tokens }} · okno modelu {{ tp.context_window }} ·
|
|
zarezerwowane na odpowiedź {{ tp.max_output }}
|
|
{% if prompt_result.usage and prompt_result.usage.turns and prompt_result.usage.turns > 1 %}
|
|
· odpowiedź złożona z {{ prompt_result.usage.turns }} tur (model dokańczał urwany tekst)
|
|
{% endif %}
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if prompt_result.llm_error %}
|
|
<div class="error">
|
|
Nie udało się napisać horoskopu: {{ prompt_result.llm_error }}<br>
|
|
Prompt poniżej jest gotowy — możesz go skopiować i użyć ręcznie.
|
|
</div>
|
|
{% endif %}
|
|
|
|
{# --- prompt: zawsze dostępny do podglądu i skopiowania --- #}
|
|
<div class="meta">
|
|
Prompt · {{ st.chars }} znaków (~{{ st.est_tokens }} tokenów) ·
|
|
budżet: {{ st.budget }} ·
|
|
wskazań: <strong>{{ st.included }}</strong>
|
|
{% if st.omitted %}· pominięto: <strong>{{ st.omitted }}</strong>{% endif %}
|
|
{% if st.deduplicated %}· scalono powtórek: {{ st.deduplicated }}{% endif %}
|
|
</div>
|
|
|
|
{% if st.omitted %}
|
|
<p class="muted small">
|
|
Pominięto {{ st.omitted }} najsłabszych wskazań (próg wagi {{ st.min_score_included }}).
|
|
Chcesz komplet — wybierz obszerniejszy budżet i wygeneruj ponownie.
|
|
</p>
|
|
{% endif %}
|
|
|
|
{% if prompt_result.data_error %}
|
|
<div class="error">{{ prompt_result.data_error }} — prompt złożony z samych wyliczeń.</div>
|
|
{% endif %}
|
|
|
|
<div class="actions">
|
|
<button type="button" class="ghost" data-copy="#promptText">Kopiuj prompt</button>
|
|
<span class="muted small">Możesz też wkleić go samodzielnie do ChatGPT lub Claude.</span>
|
|
</div>
|
|
<textarea id="promptText" class="prompt" rows="14" readonly>{{ prompt_result.prompt }}</textarea>
|
|
{% endif %}
|