| | |
| | |
| | |
| | |
| | {%- 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 %} |
| | |