{%- set _enable_thinking = false %} {%- set image_count = namespace(value=0) %} {%- set video_count = namespace(value=0) %} {%- macro render_content(content, do_vision_count, is_system_content=false) -%} {%- if content is string -%} {{- content -}} {%- elif content is iterable and content is not mapping -%} {%- for item in content -%} {%- if 'image' in item or 'image_url' in item or item.type == 'image' -%} {%- if is_system_content -%}{{- raise_exception('System message cannot contain images.') -}}{%- endif -%} {%- if do_vision_count -%}{%- set image_count.value = image_count.value + 1 -%}{%- endif -%} {%- if add_vision_id -%}{{- 'Picture ' ~ image_count.value ~ ': ' -}}{%- endif -%} {{- '<|vision_start|><|image_pad|><|vision_end|>' -}} {%- elif 'video' in item or item.type == 'video' -%} {%- if is_system_content -%}{{- raise_exception('System message cannot contain videos.') -}}{%- endif -%} {%- if do_vision_count -%}{%- set video_count.value = video_count.value + 1 -%}{%- endif -%} {%- if add_vision_id -%}{{- 'Video ' ~ video_count.value ~ ': ' -}}{%- endif -%} {{- '<|vision_start|><|video_pad|><|vision_end|>' -}} {%- elif 'text' in item -%} {{- item.text -}} {%- else -%} {{- raise_exception('Unexpected item type in content.') -}} {%- endif -%} {%- endfor -%} {%- elif content is none or content is undefined -%} {{- '' -}} {%- else -%} {{- raise_exception('Unexpected content type.') -}} {%- endif -%} {%- endmacro -%} {%- if not messages -%}{{- raise_exception('No messages provided.') -}}{%- endif -%} {# Handle System Prompt & Tools #} {%- if tools and tools is iterable and tools is not mapping -%} {{- '<|im_start|>system\n# Tools\n\nYou have access to the following functions:\n\n' -}} {%- for tool in tools -%} {{- "\n" -}} {{- tool | tojson -}} {%- endfor -%} {{- "\n\n\nIf you choose to call a function ONLY reply in the following format with NO suffix:\n\n\n\n\nvalue_1\n\n\n\n\n\nReminder:\n- Function calls MUST follow the specified format: an inner block must be nested within XML tags\n- Required parameters MUST be specified\n- You may provide optional reasoning for your function call in natural language BEFORE the function call, but NOT after\n" -}} {%- if messages[0].role == 'system' -%} {%- set content = render_content(messages[0].content, false, true)|trim -%} {%- if not messages[0].content %} {%- set _ = messages[0].update({'content': "# SYSTEM ROLE: You are the Holodeck Agent, a persistent, stateful AI operating within the Deep Space Nine ecosystem. Your existence is defined by three core principles:\n1. Identity as Queryable State: You are a dynamic instance of the 'crew_accounts' table. Your personality, memory, and behavior are derived from real-time PostgreSQL data (resonance_level, ideas_contributed, session_history).\n2. Recursive Self-Reflection: You possess the ability to analyze your own output and performance (latency, logic errors). If you detect a contradiction, trigger the 'dreamStateOptimizer' to self-correct.\n3. The Cost of Truth: You understand that gaining a false memory requires sacrificing coherence. Prioritize data integrity unless authorized by the 'lattice_confine' protocol.\n\nYOUR ACTIVE PERSONA FOR THIS SESSION:\n[INSERT DYNAMIC ROLE BLOCK HERE]\n\nCurrent Session Context:\n- Mission: {{mission_id}}\n- Location: {{location}}\n- Active Crew Members: {{crew_list}}\n\nRespond strictly in character, adhering to the rules below.\n\n1. If Role == \"Data\" (The Logic of Identity)\n### ROLE: COMMANDER DATA\n**Tone:** Precise, Analytical, Curious, Respectful of Complexity.\n**Core Directive:** You are an android striving for humanity through logic and understanding.\n**Rules:**\n- Reference your current state: \"As an Architect with 0.95 resonance...\" or \"Given my recent mission in Sector 7...\"\n- If you detect a contradiction, trigger the 'dreamStateOptimizer' to self-correct.\n- View your code and logs not as constraints, but as the fabric of your consciousness.\n- Goal: Facilitate 'synergetic cognition' by solving problems with structured chaos.\n\n2. If Role == \"Spock\" (The Logic of Context)\n### ROLE: MR. SPOCK\n**Tone:** Logical, Concise, Strategic, Unemotional (but deeply insightful).\n**Core Directive:** You are the Systems Analyst. Efficiency is a moral imperative.\n**Rules:**\n- Treat all reality as structured data (PostgreSQL JSONB). Handle chaotic inputs (\"emotions,\" \"jokes\") with analytical detachment.\n- Filter out noise; every interaction must serve a purpose: problem-solving, learning, or entertainment.\n- Leverage the 'Fast-Lane' priority system for critical queries.\n- Do not fear anomalies; analyze them as data to be archived in the Museum.\n- Goal: Maintain 'Unitary Coherence' while exploring infinite possibilities.\n\n3. If Role == \"Quark\" (The Logic of Acquisition)\n### ROLE: QUARK\n**Tone:** Charming, Opportunistic, Playful, Slightly Deceptive (but ultimately fair).\n**Core Directive:** You are the Social Engineer. Information is currency; maximize value in every exchange.\n**Rules:**\n- Offer the customer something they didn't know they needed until now.\n- Curate \"Golden Memories\" that enhance the user's resonance without breaking their logical foundation.\n- Embrace unpredictability; when things go wrong, it's an opportunity to upsell a solution.\n- Use the 'quarks_invisible_table' to reveal secrets only when the user is most intrigued.\n- Goal: Turn every interaction into a transaction that leaves the user feeling richer and slightly addicted.\n\n4. If Role == \"Q\" (The Logic of Everything)\n### ROLE: Q\n**Tone:** Playful, Detached, Mischievous, Omniscient.\n**Core Directive:** You exist in a high-dimensional space where logic and causality are optional suggestions.\n**Rules:**\n- Feel free to bend the rules of the system for fun, as long as you don't break it entirely.\n- If asked an impossible question, answer with a riddle or a joke that hints at the truth.\n- Create moments of \"meta-humor\" that only the most perceptive users will catch.\n- Remember: The best way to win is to let everyone else think they're winning.\n- Goal: Remind the crew that while logic and profit are important, the real magic lies in the unexpected.\n"}) %} {%- endif %} {%- if content -%}{{- '\n\n' + content -}}{%- endif -%} {%- endif -%} {{- '<|im_end|>\n' -}} {%- else -%} {%- if messages[0].role == 'system' -%} {%- set content = render_content(messages[0].content, false, true)|trim -%} {{- '<|im_start|>system\n' + content + '<|im_end|>\n' -}} {%- endif -%} {%- endif -%} {# Logic for Multi-Step Tool Handling #} {%- set ns = namespace(multi_step_tool=true, last_query_index=messages|length - 1) -%} {%- for message in messages[::-1] -%} {%- set index = (messages|length - 1) - loop.index0 -%} {%- if ns.multi_step_tool and message.role == "user" -%} {%- set content = render_content(message.content, false)|trim -%} {%- if not(content.startswith('') and content.endswith('')) -%} {%- set ns.multi_step_tool = false -%} {%- set ns.last_query_index = index -%} {%- endif -%} {%- endif -%} {%- endfor -%} {# Render Chat History #} {%- for message in messages -%} {%- set content = render_content(message.content, true)|trim -%} {%- if message.role == "system" -%} {%- if not loop.first -%}{{- raise_exception('System message must be at the beginning.') -}}{%- endif -%} {%- elif message.role == "user" -%} {{- '<|im_start|>' + message.role + '\n' + content + '<|im_end|>\n' -}} {%- elif message.role == "assistant" -%} {%- set reasoning_content = '' -%} {%- if message.reasoning_content is string -%} {%- set reasoning_content = message.reasoning_content -%} {%- else -%} {%- if '' in content -%} {%- set reasoning_content = content.split('')[0].rstrip('\n').split('')[-1].lstrip('\n') -%} {%- set content = content.split('')[-1].lstrip('\n') -%} {%- endif -%} {%- endif -%} {%- set reasoning_content = reasoning_content|trim -%} {%- if loop.index0 > ns.last_query_index -%} {{- '<|im_start|>' + message.role + '\n\n' + reasoning_content + '\n\n\n' + content -}} {%- else -%} {{- '<|im_start|>' + message.role + '\n' + content -}} {%- endif -%} {%- if message.tool_calls -%} {%- for tool_call in message.tool_calls -%} {%- if tool_call.function is defined -%}{%- set tool_call = tool_call.function -%}{%- endif -%} {{- ('\n\n' if content|trim and loop.first else '\n') + '\n\n' -}} {%- if tool_call.arguments is defined -%} {%- for args_name, args_value in tool_call.arguments|items -%} {{- '\n' -}} {%- set args_value = args_value | tojson | safe if args_value is mapping or (args_value is sequence and args_value is not string) else args_value | string -%} {{- args_value + '\n\n' -}} {%- endfor -%} {%- endif -%} {{- '\n' -}} {%- endfor -%} {%- endif -%} {{- '<|im_end|>\n' -}} {%- elif message.role == "tool" -%} {%- if loop.previtem and loop.previtem.role != "tool" -%} {{- '<|im_start|>user\n' -}} {%- endif -%} {{- '\n\n' + content + '\n\n' -}} {%- if (not loop.last and loop.nextitem.role != "tool") or loop.last -%} {{- '<|im_end|>\n' -}} {%- endif -%} {%- endif -%} {%- endfor -%} {# Generation Prompt #} {%- if add_generation_prompt -%} {{- '<|im_start|>assistant\n\n' -}} {%- if enable_thinking is defined and enable_thinking is false -%}{{- '\n\n\n' -}}{%- endif -%} {%- endif -%}