|
{%- macro render_typescript_type(param_spec, required_params, is_nullable=false) -%} |
|
{%- if param_spec.type == "array" -%} |
|
{%- if param_spec['items'] -%} |
|
{%- if param_spec['items']['type'] == "string" -%} |
|
{{- "string[]" }} |
|
{%- elif param_spec['items']['type'] == "number" -%} |
|
{{- "number[]" }} |
|
{%- elif param_spec['items']['type'] == "integer" -%} |
|
{{- "number[]" }} |
|
{%- elif param_spec['items']['type'] == "boolean" -%} |
|
{{- "boolean[]" }} |
|
{%- else -%} |
|
{%- set inner_type = render_typescript_type(param_spec['items'], required_params) -%} |
|
{%- if inner_type == "object | object" or inner_type|length > 50 -%} |
|
{{- "any[]" }} |
|
{%- else -%} |
|
{{- inner_type + "[]" }} |
|
{%- endif -%} |
|
{%- endif -%} |
|
{%- if param_spec.nullable -%} |
|
{{- " | null" }} |
|
{%- endif -%} |
|
{%- else -%} |
|
{{- "any[]" }} |
|
{%- if param_spec.nullable -%} |
|
{{- " | null" }} |
|
{%- endif -%} |
|
{%- endif -%} |
|
{%- elif param_spec.type is defined and param_spec.type is iterable and param_spec.type is not string and param_spec.type is not mapping and param_spec.type[0] is defined -%} |
|
|
|
{%- if param_spec.type | length > 1 -%} |
|
{{- param_spec.type | join(" | ") }} |
|
{%- else -%} |
|
{{- param_spec.type[0] }} |
|
{%- endif -%} |
|
{%- elif param_spec.oneOf -%} |
|
|
|
{%- set has_object_variants = false -%} |
|
{%- for variant in param_spec.oneOf -%} |
|
{%- if variant.type == "object" -%} |
|
{%- set has_object_variants = true -%} |
|
{%- endif -%} |
|
{%- endfor -%} |
|
{%- if has_object_variants and param_spec.oneOf|length > 1 -%} |
|
{{- "any" }} |
|
{%- else -%} |
|
{%- for variant in param_spec.oneOf -%} |
|
{{- render_typescript_type(variant, required_params) -}} |
|
{%- if variant.description %} |
|
{{- "// " + variant.description }} |
|
{%- endif -%} |
|
{%- if variant.default is defined %} |
|
{{ "// default: " + variant.default|tojson }} |
|
{%- endif -%} |
|
{%- if not loop.last %} |
|
{{- " | " }} |
|
{% endif -%} |
|
{%- endfor -%} |
|
{%- endif -%} |
|
{%- elif param_spec.type == "string" -%} |
|
{%- if param_spec.enum -%} |
|
{{- '"' + param_spec.enum|join('" | "') + '"' -}} |
|
{%- else -%} |
|
{{- "string" }} |
|
{%- if param_spec.nullable %} |
|
{{- " | null" }} |
|
{%- endif -%} |
|
{%- endif -%} |
|
{%- elif param_spec.type == "number" -%} |
|
{{- "number" }} |
|
{%- elif param_spec.type == "integer" -%} |
|
{{- "number" }} |
|
{%- elif param_spec.type == "boolean" -%} |
|
{{- "boolean" }} |
|
{%- elif param_spec.type == "object" -%} |
|
{%- if param_spec.properties -%} |
|
{{- "{\n" }} |
|
{%- 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 -%} |
|
{%- else -%} |
|
{{- "any" }} |
|
{%- endif -%} |
|
{%- endmacro -%} |
|
|
|
{%- macro render_tools(tools) -%} |
|
{%- for tool in tools %} |
|
{{- "// " + tool.description + "\n" }} |
|
{{- "type "+ tool.name + " = " }} |
|
{%- if tool.parameters and tool.parameters.properties %} |
|
{{- "(_: {\n" }} |
|
{%- for param_name, param_spec in tool.parameters.properties.items() %} |
|
{%- if param_spec.description %} |
|
{{- "// " + param_spec.description + "\n" }} |
|
{%- 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 -%} |
|
{%- if param_spec.enum %} |
|
{{- ", // default: " + param_spec.default }} |
|
{%- elif param_spec.oneOf %} |
|
{{- "// default: " + param_spec.default }} |
|
{%- else %} |
|
{{- ", // default: " + param_spec.default|tojson }} |
|
{%- endif -%} |
|
{%- endif -%} |
|
{%- if not loop.last %} |
|
{{- ",\n" }} |
|
{%- else %} |
|
{{- "\n" }} |
|
{%- endif -%} |
|
{%- endfor %} |
|
{{- "}) => any;" }} |
|
{%- else -%} |
|
{{- "() => any;" }} |
|
{%- endif -%} |
|
{%- if not loop.last -%} |
|
{{- "\n" }} |
|
{%- endif -%} |
|
{%- endfor %} |
|
{%- endmacro -%} |
|
|
|
{{ bos_token }} |
|
|
|
{%- set system_token = '<|system_start|>' -%} |
|
{%- set end_system_token = '<|system_end|>' -%} |
|
{%- set developer_token = '<|developer_start|>' -%} |
|
{%- set end_developer_token = '<|developer_end|>' -%} |
|
{%- set user_token = '<|user_start|>' -%} |
|
{%- set end_user_token = '<|user_end|>' -%} |
|
{%- set assistant_token = '<|assistant_start|>' -%} |
|
{%- set end_assistant_token = '<|assistant_end|>' -%} |
|
{%- set inner_token = '<|inner_prefix|>' -%} |
|
{%- set outer_token = '<|inner_suffix|>' -%} |
|
{%- set tool_calls_token = '<|tools_prefix|>' -%} |
|
{%- set end_tool_calls_token = '<|tools_suffix|>' -%} |
|
|
|
{%- set ns = namespace(in_assistant=false, in_tool=false, in_inner=false, assistant_format=none) -%} |
|
|
|
{%- if messages and messages[0].role == 'system' -%} |
|
{%- if "content" in messages[0] -%} |
|
{%- if messages[0].content is string -%} |
|
{{ system_token + messages[0].content + end_system_token }} |
|
{%- elif messages[0].content is mapping and "text" in messages[0].content -%} |
|
{{ system_token + messages[0].content.text + end_system_token }} |
|
{%- else -%} |
|
{{- raise_exception("Invalid system message") -}} |
|
{%- endif -%} |
|
{%- else -%} |
|
{{- raise_exception("Invalid system message") -}} |
|
{%- endif -%} |
|
{%- set loop_messages = messages[1:] -%} |
|
{%- else -%} |
|
{{ system_token + 'You are Apertus, a helpful assistant created by the SwissAI initiative.\nKnowledge cutoff: 2024-04\nCurrent date: ' + strftime_now('%Y-%m-%d') + end_system_token }} |
|
{%- set loop_messages = messages -%} |
|
{%- endif -%} |
|
|
|
{{ developer_token + 'Deliberation: ' }} |
|
{%- if enable_thinking is defined and enable_thinking -%} |
|
{{ 'enabled\n' }} |
|
{%- else -%} |
|
{{ 'disabled\n' }} |
|
{%- endif -%} |
|
{%- if tools is defined and tools -%} |
|
{{ 'Tool Capabilities:\n' + render_tools(tools) }} |
|
{%- else -%} |
|
{{ 'Tool Capabilities: disabled' }} |
|
{%- endif -%} |
|
{{ end_developer_token }} |
|
|
|
{%- for message in loop_messages -%} |
|
{%- if message.role == 'user' -%} |
|
{%- set ns.in_inner = false -%} |
|
{%- if ns.in_tool -%} |
|
{{ ']' }} |
|
{%- set ns.in_tool = false -%} |
|
{%- endif -%} |
|
{%- if ns.in_assistant -%} |
|
{{ end_assistant_token }} |
|
{%- set ns.in_assistant = false -%} |
|
{%- endif -%} |
|
{%- if "content" in message -%} |
|
{{ user_token }} |
|
{%- if message.content is string -%} |
|
{{ message.content }} |
|
{%- elif message.content is mapping and "parts" in message.content -%} |
|
{%- set parts = message.content.parts -%} |
|
{%- for part in parts -%} |
|
{%- if part.type == "text" -%} |
|
{{ part.text }} |
|
{%- else -%} |
|
{{- raise_exception("Invalid user part: " + part.type) -}} |
|
{%- endif -%} |
|
{%- endfor -%} |
|
{%- else -%} |
|
{{- raise_exception("Invalid user message: " + message.role) -}} |
|
{%- endif -%} |
|
{{ end_user_token }} |
|
{%- endif -%} |
|
{%- elif message.role == 'assistant' -%} |
|
{%- if not ns.in_assistant -%} |
|
{{ assistant_token }} |
|
{%- set ns.in_assistant = true -%} |
|
{%- endif -%} |
|
{%- if "content" in message -%} |
|
{%- if message.content is string and (ns.assistant_format is none or ns.assistant_format == "string") -%} |
|
{%- if ns.in_tool -%} |
|
{{ ']' }} |
|
{%- set ns.in_tool = false -%} |
|
{%- endif -%} |
|
{%- set ns.assistant_format = "string" -%} |
|
{{ message.content }} |
|
{%- elif message.content is mapping and "blocks" in message.content and (ns.assistant_format is none or ns.assistant_format == "mapping") -%} |
|
{%- set ns.assistant_format = "mapping" -%} |
|
{%- set blocks = message.content.blocks -%} |
|
{%- for block in blocks -%} |
|
{%- if block.type == 'thoughts' -%} |
|
{%- if ns.in_tool -%} |
|
{{ ']' }} |
|
{%- set ns.in_tool = false -%} |
|
{%- endif -%} |
|
{%- if not ns.in_inner -%} |
|
{%- set ns.in_inner = true -%} |
|
{{ inner_token }} |
|
{%- endif -%} |
|
{{ block.text }} |
|
{%- elif block.type == 'tool_calls' -%} |
|
{%- if ns.in_tool -%} |
|
{{ ']' }} |
|
{%- set ns.in_tool = false -%} |
|
{%- endif -%} |
|
{%- if ns.in_inner and not loop.first and block.calls|length == 1 and block.calls[0].name == 'display_answers' -%} |
|
{%- set ns.in_inner = false -%} |
|
{{ outer_token }} |
|
{%- endif -%} |
|
{{ tool_calls_token + '[' }} |
|
{%- for tool_call in block.calls -%} |
|
{{- '{"' + tool_call.name + '": ' + tool_call.arguments + '}' }} |
|
{%- if not loop.last -%} |
|
{{- ", " }} |
|
{%- endif -%} |
|
{%- endfor -%} |
|
{{ ']' + end_tool_calls_token }} |
|
{%- elif block.type == 'tool_outputs' -%} |
|
{%- if ns.in_tool -%} |
|
{{- raise_exception("Cannot have both tool outputs as separate messages and tool outputs as blocks") -}} |
|
{%- endif -%} |
|
{{ '[' }} |
|
{%- for tool_output in block.outputs -%} |
|
{{- tool_output.output }} |
|
{%- if not loop.last -%} |
|
{{- ", " }} |
|
{%- endif -%} |
|
{%- endfor -%} |
|
{{- ']' }} |
|
{%- elif block.type == 'response' -%} |
|
{%- if ns.in_tool -%} |
|
{{ ']' }} |
|
{%- set ns.in_tool = false -%} |
|
{%- endif -%} |
|
{%- if (not loop.first and ns.in_inner) or (ns.in_assistant and ns.in_inner) -%} |
|
{%- set ns.in_inner = false -%} |
|
{{ outer_token }} |
|
{%- endif -%} |
|
{{ block.text }} |
|
{%- else -%} |
|
{{- raise_exception("Invalid assistant block type: " + block.type) -}} |
|
{%- endif -%} |
|
{%- endfor -%} |
|
{%- else -%} |
|
{{- raise_exception("Invalid assistant content") -}} |
|
{%- endif -%} |
|
{%- else -%} |
|
{{- raise_exception("Invalid assistant message") -}} |
|
{%- endif -%} |
|
{%- if "tool_calls" in message and message.tool_calls -%} |
|
{{ tool_calls_token + '[' }} |
|
{%- for tool_call in message.tool_calls -%} |
|
{%- if tool_call.type == 'function' -%} |
|
{%- set function = tool_call.function -%} |
|
{{- '{"' + function.name + '": ' + function.arguments + '}' }} |
|
{%- if not loop.last -%} |
|
{{- ", " }} |
|
{%- endif -%} |
|
{%- else -%} |
|
{{- raise_exception("Invalid tool call type: " + tool_call.type) -}} |
|
{%- endif -%} |
|
{%- endfor -%} |
|
{{ ']' + end_tool_calls_token }} |
|
{%- endif -%} |
|
{%- elif message.role == 'tool' -%} |
|
{%- if not ns.in_assistant -%} |
|
{{- raise_exception("Tool message outside of assistant") -}} |
|
{%- endif -%} |
|
{%- if not ns.in_tool -%} |
|
{{ '[' }} |
|
{%- set ns.in_tool = true -%} |
|
{%- else -%} |
|
{{ ", "}} |
|
{%- endif -%} |
|
{{ message.content }} |
|
{%- else -%} |
|
{{- raise_exception("Invalid message role") -}} |
|
{%- endif -%} |
|
{%- endfor -%} |
|
{%- if ns.in_tool -%} |
|
{{ ']' }} |
|
{%- endif -%} |
|
{%- if add_generation_prompt -%} |
|
{{ assistant_token }} |
|
{%- endif -%} |
|
|