{% extends 'layouts/app.html.twig' %} {% block title %}Payload AI #{{ job.id }} | micey-projects{% endblock %} {% block app_content %} {% include 'partials/_flash_messages.html.twig' %}

Payload wejściowy AI #{{ job.id }}

Krok 6G: payload pokazuje zwykły tryb oraz cacheable static prefix / dynamic context. Status: {{ job.statusLabel }}.

Kolejka {% if job.project %} Projekt {% endif %}
{% if job.errorMessage %}
{{ job.errorMessage }}
{% endif %}
Tryb wykonania: {{ ai_settings.ai_execution_mode == 'api' ? 'API / OpenAI' : 'Testowy' }}. API key OpenAI: {{ ai_settings.ai_openai_api_key_configured == '1' ? 'ustawiony' : 'brak' }}.
{% set visual = job.inputPayloadJson.visual_input|default({}) %}
Obraz projektu: {% if visual.image_attached|default(false) %} użyty / dołączany do API. {% elseif visual.status|default('') == 'disabled' %} nieużyty — wysyłka obrazu jest wyłączona. {% elseif visual.status|default('') == 'no_image' %} brak obrazu projektu. {% elseif visual.status|default('') == 'too_large' %} za duży — request pójdzie tekstowo. {% elseif visual.status|default('') == 'unsupported_mime' %} nieobsługiwany format — request pójdzie tekstowo. {% elseif visual.status|default('') == 'missing' %} plik nie istnieje — request pójdzie tekstowo. {% else %} nieużyty. {% endif %}
Status: {{ visual.status|default('unknown') }}{% if visual.image_size_mb|default(null) %}, {{ visual.image_size_mb }} MB{% endif %}. Źródło: {{ visual.image_source|default('project.mainImagePath') }}.

Input payload

{{ job.inputPayloadJson|json_encode(constant('JSON_PRETTY_PRINT')) }}

Prompt caching / tryb cacheable

Część static prefix powinna być identyczna dla wielu projektów, aby prompt caching działał. Dane projektu, job ID, notatki użytkownika i obraz muszą być w dynamic context.
{% if prompt_cache_error %}
Nie udało się zbudować podglądu prompt cache: {{ prompt_cache_error }}
{% elseif prompt_cache_pack %}
prompt_cache_key: {{ prompt_cache_pack.promptCacheKey }} static_prefix_hash: {{ prompt_cache_pack.staticPrefixHash }} dynamic_context_hash: {{ prompt_cache_pack.dynamicContextHash }}
Cacheable static prefix
{{ prompt_cache_pack.staticPrefix|json_encode(constant('JSON_PRETTY_PRINT')) }}
Dynamic project context
{{ prompt_cache_pack.dynamicContext|json_encode(constant('JSON_PRETTY_PRINT')) }}
{% endif %} {% if job.outputPayloadJson is not empty %}

Output payload

{{ job.outputPayloadJson|json_encode(constant('JSON_PRETTY_PRINT')) }}
{% endif %}
{% if ai_settings.ai_execution_mode == 'api' and job.status in ['prepared', 'pending', 'failed'] %}
{% endif %}
{% if api_logs is not empty %}

Logi API dla tego zlecenia

{% for log in api_logs %} {% endfor %}
DataProviderModelOperacjaStatusCzasUsageCacheObrazBłąd
{{ log.createdAt ? log.createdAt|date('d-m-Y H:i:s') : '—' }} {{ log.provider }} {{ log.model ?: '—' }} {{ log.operation }} {{ log.status }} {{ log.durationMs ? log.durationMs ~ ' ms' : '—' }} {% if log.usageJson %} {{ log.usageJson|json_encode }} {% else %} — {% endif %} {% set cache_usage = log.usageJson.prompt_cache|default(null) %} {% set cache_debug = log.requestPayloadJson.prompt_cache_debug|default(null) %} {% if cache_usage %} cached: {{ cache_usage.cached_tokens|default(0) }}
ratio: {{ cache_usage.cache_hit_ratio|default('—') }} {% elseif cache_debug %} {{ cache_debug.prompt_cache_key|default('—') }} {% else %} — {% endif %}
{% set image_meta = log.requestPayloadJson.image_metadata|default(null) %} {% if image_meta %} {{ image_meta.image_used ? 'użyty' : 'nieużyty' }} {% if image_meta.image_mime %}
{{ image_meta.image_mime }}{% endif %} {% if image_meta.image_size_mb %}
{{ image_meta.image_size_mb }} MB{% endif %} {% else %} — {% endif %}
{{ log.errorMessage ? log.errorMessage|slice(0, 160) : '—' }}
{% endif %}

Utwórz AI Draft z wklejonego JSON

To zostaje do ręcznych testów. W trybie API standardowo używaj przycisku „Wyślij do AI przez API”.

{% endblock %}