| |
| |
| |
| |
| {%- set use_toon = use_toon | default(true) -%} |
| |
| |
| {%- macro render_typescript_type(param_spec, required_params) -%} |
| {%- if param_spec.type == "array" -%} |
| {%- if param_spec.items and param_spec.items.type == "string" -%} |
| string[] |
| {%- elif param_spec.items and param_spec.items.type in ["number", "integer"] -%} |
| number[] |
| {%- elif param_spec.items and param_spec.items.type == "boolean" -%} |
| boolean[] |
| {%- else -%} |
| any[] |
| {%- endif -%} |
| {%- elif param_spec.type == "string" -%} |
| {%- if param_spec.enum -%} |
| "{{ param_spec.enum | join('" | "') }}" |
| {%- else -%} |
| string |
| {%- endif -%} |
| {%- elif param_spec.type in ["number", "integer"] -%} |
| number |
| {%- elif param_spec.type == "boolean" -%} |
| boolean |
| {%- elif param_spec.type == "object" -%} |
| {%- if param_spec.properties -%} |
| { |
| {%- for prop_name, prop_spec in param_spec.properties.items() -%} |
| {{ prop_name }}{% if prop_name not in (param_spec.required or []) %}?{% endif %}: {{ render_typescript_type(prop_spec, param_spec.required or []) }}{% if not loop.last %}, {% endif %} |
| {%- endfor %} |
| } |
| {%- else -%} |
| object |
| {%- endif -%} |
| {%- elif param_spec.oneOf -%} |
| {%- for variant in param_spec.oneOf -%} |
| {{ render_typescript_type(variant, required_params) }}{% if not loop.last %} | {% endif %} |
| {%- endfor -%} |
| {%- else -%} |
| any |
| {%- endif -%} |
| {%- endmacro -%} |
| |
| {%- macro render_tool_namespace(namespace_name, tools) -%} |
| ## {{ namespace_name }} |
| |
| namespace {{ namespace_name }} { |
| |
| {%- for tool in tools %} |
| {%- set tool = tool.function if tool.function is defined else tool %} |
| // {{ tool.description }} |
| type {{ tool.name }} = {% if tool.parameters and tool.parameters.properties %}(_: { |
| {%- for param_name, param_spec in tool.parameters.properties.items() %} |
| {%- if param_spec.description %} |
| // {{ param_spec.description }} |
| {%- endif %} |
| {{ param_name }}{% if param_name not in (tool.parameters.required or []) %}?{% endif %}: {{ render_typescript_type(param_spec, tool.parameters.required or []) }}{% if param_spec.default is defined %}, // default: {{ param_spec.default | tojson }}{% endif %}{% if not loop.last %},{% endif %} |
| {%- endfor %} |
| }) => any{% else %}() => any{% endif %}; |
| |
| {%- endfor %} |
| } // namespace {{ namespace_name }} |
| {%- endmacro -%} |
| |
| |
| {%- macro format_tool_call_arguments(tool_call, message) -%} |
| {%- if use_toon -%} |
| {%- if tool_call.arguments -%} |
| {%- if tool_call.arguments is string -%} |
| {{- tool_call.arguments | fromjson | to_toon -}} |
| {%- else -%} |
| {{- tool_call.arguments | to_toon -}} |
| {%- endif -%} |
| {%- else -%} |
| {{- {} | to_toon -}} |
| {%- endif -%} |
| {%- else -%} |
| {%- if tool_call.arguments -%} |
| {%- if tool_call.arguments is string -%} |
| {{- tool_call.arguments -}} |
| {%- else -%} |
| {{- tool_call.arguments | tojson -}} |
| {%- endif -%} |
| {%- else -%} |
| {{- {} | tojson -}} |
| {%- endif -%} |
| {%- endif -%} |
| {%- endmacro -%} |
| |
| |
| <|start|>system<|message|>{{ model_identity or "You are Aizia, a helpful assistant trained by damfle." }} |
| Knowledge cutoff: {{ knowledge_cutoff or "2025-12" }} |
| Current date: {{ strftime_now("%Y-%m-%d") }} |
| |
| Reasoning: {{ reasoning_effort or "medium" }} |
| |
| # Valid channels: analysis, commentary, final. Channel must be included for every message. |
| {%- if tools %} |
| Calls to these tools must go to the commentary channel: 'functions'. |
| {%- endif %}<|end|> |
| |
| |
| {%- if messages and messages[0].role in ["developer", "system"] %} |
| {%- set developer_message = messages[0].content %} |
| {%- set loop_messages = messages[1:] %} |
| {%- else %} |
| {%- set developer_message = "" %} |
| {%- set loop_messages = messages %} |
| {%- endif %} |
| |
| |
| {%- if developer_message or tools %} |
| <|start|>developer<|message|> |
| {%- if developer_message %} |
| # Instructions |
| |
| {{ developer_message }} |
| |
| {%- endif %} |
| {%- if tools %} |
| # Tools |
| |
| {{ render_tool_namespace("functions", tools) }} |
| {%- endif %} |
| <|end|> |
| {%- endif %} |
| |
| |
| {%- set last_tool_call = namespace(name=none) %} |
| {%- for message in loop_messages %} |
| {%- if message.role == 'assistant' %} |
| {%- if "tool_calls" in message and message.tool_calls %} |
| |
| {%- if message.reasoning %} |
| <|start|>assistant<|channel|>analysis<|message|>{{ message.reasoning }}<|end|> |
| {%- endif %} |
| |
| {%- for tool_call in message.tool_calls %} |
| {%- set tool_call = tool_call.function if tool_call.function else tool_call %} |
| <|start|>assistant to=functions.{{ tool_call.name }}<|channel|>commentary<|constrain|>{{ "toon" if use_toon else "json" }}<|message|>{{ format_tool_call_arguments(tool_call, message) }}<|call|> |
| {%- set last_tool_call.name = tool_call.name %} |
| {%- endfor %} |
| {%- else %} |
| |
| {%- if message.reasoning %} |
| <|start|>assistant<|channel|>analysis<|message|>{{ message.reasoning }}<|end|> |
| {%- endif %} |
| <|start|>assistant<|channel|>final<|message|>{{ message.content }}<|end|> |
| {%- set last_tool_call.name = none %} |
| {%- endif %} |
| {%- elif message.role == 'tool' %} |
| {%- if last_tool_call.name is none %} |
| {{ raise_exception("Message has tool role, but there was no previous assistant message with a tool call!") }} |
| {%- endif %} |
| <|start|>functions.{{ last_tool_call.name }} to=assistant<|channel|>commentary<|message|>{{ message.content | tojson }}<|end|> |
| {%- elif message.role == 'user' %} |
| <|start|>user<|message|>{{ message.content }}<|end|> |
| {%- endif %} |
| {%- endfor %} |
| |
| |
| {%- if add_generation_prompt %} |
| <|start|>assistant |
| {%- endif %} |
| |