Files
HadTavern/docs/VARIABLES.md
2025-09-07 22:33:51 +03:00

8.9 KiB
Raw Blame History

Переменные и макросы AgentUI

Этот файл — простая шпаргалка по переменным/макросам, которые можно использовать в шаблонах узла ProviderCall и в Prompt Blocks.

Правила ввода:

  • Квадратные макросы ... — простая подстановка. Хорошо подходят для строк и для URL/заголовков.
  • Фигурные {{ ... }} — «джинджа‑лайт»: умеют фильтр |default(...), корректно вставляют объекты и массивы внутрь JSON без лишних кавычек.
  • Любые значения, вставляемые в JSON через макросы, приводятся к корректному JSON когда это возможно.

Служебные файлы/строки реализации:


Общие переменные контекста

Те же поля доступны через {{ ... }}: например {{ params.temperature|default(0.7) }}, {{ incoming.json }} и т.д.


Макросы OUT (выходы нод)

Доступ к выходам нод возможен в двух формах:

1) Короткая форма (besteffort текст)

  • OUT1 — «текст» из ноды n1
  • OUT2 — из ноды n2 и т.д.

Что делает «besteffort текст»:

  • Если нода вернула response_text или text — берётся он
  • Если нода вернула объект провайдера:
    • OpenAI: choices[0].message.content
    • Gemini: candidates[0].content.parts[0].text
    • Claude: content[].text (склейка)
  • Если ничего из выше не подошло — выполняется глубокий поиск текстовых полей ("text"/"content")

Реализация: _best_text_from_outputs() и подстановка коротких OUT: render_template_simple()

2) Полная форма (точный путь)

Совет: используйте короткий OUTx если нужно «просто текст». Используйте полную форму, если нужен конкретный фрагмент/массив.


Единый фрагмент PROMPT

PROMPT — это уже собранный JSONфрагмент из ваших Prompt Blocks. Он зависит от выбранного провайдера ноды:

  • OpenAI → "messages": [...]
  • Gemini → "contents": [...], "systemInstruction": {...}
  • Claude → "system": "...", "messages": [...]

Как использовать внутри JSONшаблона:

{ "model": "{{ model }}", PROMPT, "temperature": {{ params.temperature|default(0.7) }} }

Вы также можете использовать сырьевые структуры:

  • {{ pm.messages }}
  • {{ pm.contents }}
  • {{ pm.systemInstruction }}
  • {{ pm.system_text }}

Но рекомендуемый путь — PROMPT: меньше шансов сломать JSON.


Примеры по провайдерам

OpenAI (/v1/chat/completions)

{ "model": "{{ model }}", PROMPT, "temperature": {{ incoming.json.temperature|default(params.temperature|default(0.7)) }}, "top_p": {{ incoming.json.top_p|default(params.top_p|default(1)) }}, "max_tokens": {{ incoming.json.max_tokens|default(params.max_tokens|default(256)) }}, "stop": {{ incoming.json.stop|default(params.stop|default([])) }} }

Gemini (/v1beta/models/{model}:generateContent?key=...)

{ "model": "{{ model }}", PROMPT, "safetySettings": {{ incoming.json.safetySettings|default([]) }}, "generationConfig": { "temperature": {{ incoming.json.generationConfig.temperature|default(params.temperature|default(0.7)) }}, "topP": {{ incoming.json.generationConfig.topP|default(params.top_p|default(1)) }}, "maxOutputTokens": {{ incoming.json.generationConfig.maxOutputTokens|default(params.max_tokens|default(256)) }}, "stopSequences": {{ incoming.json.generationConfig.stopSequences|default(params.stop|default([])) }} } }

Claude (/v1/messages)

{ "model": "{{ model }}", PROMPT, "temperature": {{ incoming.json.temperature|default(params.temperature|default(0.7)) }}, "top_p": {{ incoming.json.top_p|default(params.top_p|default(1)) }}, "max_tokens": {{ incoming.json.max_tokens|default(params.max_tokens|default(256)) }} }


Частые кейсы

  1. Взять текст пользователя из входящего запроса и передать в Prompt Blocks
  1. Переписать ответ предыдущей ноды «как текст»
  • OUT1 — если предыдущая нода имеет id n1
  1. Добавить ключ Gemini из query в endpoint

Почему местами нужны {{ ... }}

Внутри JSON нам важно вставлять объекты/массивы без кавычек и иметь дефолты:

  • {{ pm.contents }} — вставит массив как массив
  • {{ params.temperature|default(0.7) }} — если нет значения, подставится 0.7

Квадратные ... хорошо подходят для строк/простых значений и для URL/заголовков.


Отладка

  • Проверьте лог DEBUG в консоли: ProviderCallNode показывает провайдера, URL и первые 400 символов тела запроса.
  • Если «ничего не подставилось»:
    • убедитесь, что не подаёте входной payload в ProviderCall (иначе шаблон игнорируется);
    • проверьте валидность JSON после подстановок;
    • проверьте, что макрос написан корректно (OUT против OUTn).

МиниFAQ

В: Почему OUT1 пустой? О: Возможно, нода n1 не вернула текстового поля, и глубокий поиск не нашёл текста. Уточните путь через полную форму OUT:n1.....

В: Можно ли получить весь «сырой» ответ? О: OUT:n1.result — вернёт весь JSON результата ноды n1.

В: Почему фигурные скобки иногда обязательны? О: Они умеют |default(...) и корректно вставляют объекты/массивы внутрь JSON.


Ссылки на реализацию

Удачного редактирования!