| import { transformInput } from '$lib/utils/transformInput'; |
| import { Template } from '@huggingface/jinja'; |
|
|
| const variations = { |
| variation1_qwen_xml_style: { |
| description: |
| "This variation reflects how Qwen-like models might structure tool definitions in the system message using XML-like tags and how tool responses are often wrapped. The assistant's tool invocation uses a standard `tool_calls` array which the template would then format into the model's expected string.", |
| example: { |
| messages: [ |
| { |
| role: 'system', |
| content: |
| 'You are a helpful assistant that can use tools to get information for the user.\n\n# Tools\n\nYou may call one or more functions to assist with the user query.\n\nYou are provided with function signatures within <tools></tools> XML tags:\n<tools>\n{"name": "get_weather", "description": "Get current weather information for a location", "parameters": {"type": "object", "properties": {"location": {"type": "string", "description": "The city and state, e.g. San Francisco, CA"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"], "description": "The unit of temperature to use"}}, "required": ["location"]}}\n</tools>\n\nFor each function call, return a json object with function name and arguments within <tool_call></tool_call> XML tags.' |
| }, |
| { |
| role: 'user', |
| content: "What's the weather like in New York?" |
| }, |
| { |
| role: 'assistant', |
| content: |
| "<think>\nThe user is asking about the weather in New York. I should use the weather tool to get this information.\n</think>\nI'll check the current weather in New York for you.", |
| tool_calls: [ |
| { |
| function: { |
| name: 'get_weather', |
| arguments: { |
| location: 'New York', |
| unit: 'celsius' |
| } |
| } |
| } |
| ] |
| }, |
| { |
| role: 'user', |
| content: |
| '<tool_response>\n{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}\n</tool_response>' |
| }, |
| { |
| role: 'assistant', |
| content: |
| "The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!" |
| }, |
| { |
| role: 'user', |
| content: 'Thanks! What about Boston?' |
| } |
| ], |
| tools: [ |
| { |
| name: 'get_weather', |
| description: 'Get current weather information for a location', |
| parameters: { |
| type: 'object', |
| properties: { |
| location: { |
| type: 'string', |
| description: 'The city and state, e.g. San Francisco, CA' |
| }, |
| unit: { |
| type: 'string', |
| enum: ['celsius', 'fahrenheit'], |
| description: 'The unit of temperature to use' |
| } |
| }, |
| required: ['location'] |
| } |
| } |
| ], |
| add_generation_prompt: true |
| } |
| }, |
| variation3_deepseek_special_tags_style: { |
| description: |
| 'This variation reflects DeepSeek-like models using specialized tags for tool calls. The `tool_calls` array in the assistant message would contain arguments as a JSON string, which the template then formats with specific tags and markdown.', |
| example: { |
| messages: [ |
| { |
| role: 'system', |
| content: 'You are a helpful assistant.' |
| }, |
| { |
| role: 'user', |
| content: "What's the weather like in New York?" |
| }, |
| { |
| role: 'assistant', |
| content: |
| "<think>\nThe user is asking about the weather in New York. I should use the weather tool to get this information.\n</think>\nI'll check the current weather in New York for you.", |
| tool_calls: [ |
| { |
| type: 'function', |
| function: { |
| name: 'get_weather', |
| arguments: '{"location": "New York", "unit": "celsius"}' |
| } |
| } |
| ] |
| }, |
| { |
| role: 'tool', |
| content: '{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}' |
| }, |
| { |
| role: 'assistant', |
| content: |
| "The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!" |
| }, |
| { |
| role: 'user', |
| content: 'Thanks! What about Boston?' |
| } |
| ], |
| tools: [ |
| { |
| name: 'get_weather', |
| description: 'Get current weather information for a location', |
| parameters: { |
| type: 'object', |
| properties: { |
| location: { |
| type: 'string', |
| description: 'The city and state, e.g. San Francisco, CA' |
| }, |
| unit: { |
| type: 'string', |
| enum: ['celsius', 'fahrenheit'], |
| description: 'The unit of temperature to use' |
| } |
| }, |
| required: ['location'] |
| } |
| } |
| ], |
| add_generation_prompt: true |
| } |
| }, |
| variation4_mistral_tags_style: { |
| description: |
| "This variation demonstrates the Mistral-like approach using `[AVAILABLE_TOOLS]` (implicitly handled by the template from the 'tools' array), `[TOOL_CALLS]` with IDs, and `[TOOL_RESULTS]`.", |
| example: { |
| messages: [ |
| { |
| role: 'system', |
| content: 'You are a helpful assistant that can use tools to get information for the user.' |
| }, |
| { |
| role: 'user', |
| content: "What's the weather like in New York?" |
| }, |
| { |
| role: 'assistant', |
| content: |
| "<think>\nThe user is asking about the weather in New York. I should use the weather tool to get this information.\n</think>\nI'll check the current weather in New York for you.", |
| tool_calls: [ |
| { |
| id: 'call_weather_nyc_001', |
| function: { |
| name: 'get_weather', |
| arguments: { |
| location: 'New York', |
| unit: 'celsius' |
| } |
| } |
| } |
| ] |
| }, |
| { |
| role: 'tool', |
| tool_call_id: 'call_weather_nyc_001', |
| content: '{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}' |
| }, |
| { |
| role: 'assistant', |
| content: |
| "The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!" |
| }, |
| { |
| role: 'user', |
| content: 'Thanks! What about Boston?' |
| } |
| ], |
| tools: [ |
| { |
| name: 'get_weather', |
| description: 'Get current weather information for a location', |
| parameters: { |
| type: 'object', |
| properties: { |
| location: { |
| type: 'string', |
| description: 'The city and state, e.g. San Francisco, CA' |
| }, |
| unit: { |
| type: 'string', |
| enum: ['celsius', 'fahrenheit'], |
| description: 'The unit of temperature to use' |
| } |
| }, |
| required: ['location'] |
| } |
| } |
| ], |
| add_generation_prompt: true |
| } |
| }, |
| variation5_generic_openai_anthropic_style: { |
| description: |
| 'This is the generic style, often compatible with OpenAI and Anthropic models, similar to your provided example. It serves as a baseline.', |
| example: { |
| messages: [ |
| { |
| role: 'system', |
| content: 'You are a helpful assistant that can use tools to get information for the user.' |
| }, |
| { |
| role: 'user', |
| content: "What's the weather like in New York?" |
| }, |
| { |
| role: 'assistant', |
| content: |
| "<think>\nThe user is asking about the weather in New York. I should use the weather tool to get this information.\n</think>\nI'll check the current weather in New York for you.", |
| tool_calls: [ |
| { |
| function: { |
| name: 'get_weather', |
| arguments: { |
| location: 'New York', |
| unit: 'celsius' |
| } |
| } |
| } |
| ] |
| }, |
| { |
| role: 'tool', |
| content: '{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}' |
| }, |
| { |
| role: 'assistant', |
| content: |
| "The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!" |
| }, |
| { |
| role: 'user', |
| content: 'Thanks! What about Boston?' |
| } |
| ], |
| tools: [ |
| { |
| name: 'get_weather', |
| description: 'Get current weather information for a location', |
| parameters: { |
| type: 'object', |
| properties: { |
| location: { |
| type: 'string', |
| description: 'The city and state, e.g. San Francisco, CA' |
| }, |
| unit: { |
| type: 'string', |
| enum: ['celsius', 'fahrenheit'], |
| description: 'The unit of temperature to use' |
| } |
| }, |
| required: ['location'] |
| } |
| } |
| ], |
| add_generation_prompt: true |
| } |
| }, |
| variation6_granite_style: { |
| description: |
| "This variation reflects Granite-like models where the tool call might be embedded directly in the assistant's content string, prefixed by a special tag like `<|tool_call|>`. The `available_tools` would be passed to the template engine.", |
| example: { |
| messages: [ |
| { |
| role: 'system', |
| content: |
| "You are Granite, developed by IBM. You are a helpful assistant with access to the following tools. When a tool is required to answer the user's query, respond only with <|tool_call|> followed by a JSON list of tools used." |
| }, |
| { |
| role: 'user', |
| content: "What's the weather like in New York?" |
| }, |
| { |
| role: 'assistant', |
| content: |
| '<think>\nThe user is asking about the weather in New York. I should use the weather tool to get this information.\n</think>\nI\'ll check the current weather in New York for you.\n<|tool_call|>[{"name": "get_weather", "arguments": {"location": "New York", "unit": "celsius"}}]' |
| }, |
| { |
| role: 'tool', |
| content: '{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}' |
| }, |
| { |
| role: 'assistant', |
| content: |
| "The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!" |
| }, |
| { |
| role: 'user', |
| content: 'Thanks! What about Boston?' |
| } |
| ], |
| tools: [ |
| { |
| name: 'get_weather', |
| description: 'Get current weather information for a location', |
| parameters: { |
| type: 'object', |
| properties: { |
| location: { |
| type: 'string', |
| description: 'The city and state, e.g. San Francisco, CA' |
| }, |
| unit: { |
| type: 'string', |
| enum: ['celsius', 'fahrenheit'], |
| description: 'The unit of temperature to use' |
| } |
| }, |
| required: ['location'] |
| } |
| } |
| ], |
| add_generation_prompt: true |
| } |
| }, |
| variation2_llama3_style: { |
| description: |
| "This variation shows how Llama-3.1-like models might handle tool definitions passed within the first user message. The assistant's invocation uses a standard `tool_calls` array.", |
| example: { |
| messages: [ |
| { |
| role: 'system', |
| content: |
| 'Environment: ipython\nCutting Knowledge Date: December 2023\nToday Date: 2025-05-14\n\nYou are a helpful assistant.' |
| }, |
| { |
| role: 'user', |
| content: |
| 'Given the following functions, please respond with a JSON for a function call with its proper arguments that best answers the given prompt.\n\nRespond in the format {"name": function name, "parameters": dictionary of argument name and its value}.\nDo not use variables.\n\n[\n {\n "name": "get_weather",\n "description": "Get current weather information for a location",\n "parameters": {\n "type": "object",\n "properties": {\n "location": {\n "type": "string",\n "description": "The city and state, e.g. San Francisco, CA"\n },\n "unit": {\n "type": "string",\n "enum": ["celsius", "fahrenheit"],\n "description": "The unit of temperature to use"\n }\n },\n "required": ["location"]\n }\n }\n]\n\nWhat\'s the weather like in New York?' |
| }, |
| { |
| role: 'assistant', |
| content: |
| "<think>\nThe user is asking about the weather in New York. I should use the weather tool to get this information.\n</think>\nI'll check the current weather in New York for you.", |
| tool_calls: [ |
| { |
| function: { |
| name: 'get_weather', |
| arguments: { |
| location: 'New York', |
| unit: 'celsius' |
| } |
| } |
| } |
| ] |
| }, |
| { |
| role: 'tool', |
| content: '{"temperature": 22, "condition": "Sunny", "humidity": 45, "wind_speed": 10}' |
| }, |
| { |
| role: 'assistant', |
| content: |
| "The weather in New York is currently sunny with a temperature of 22°C. The humidity is at 45% with a wind speed of 10 km/h. It's a great day to be outside!" |
| }, |
| { |
| role: 'user', |
| content: 'Thanks! What about Boston?' |
| } |
| ], |
| tools: null, |
| add_generation_prompt: true |
| } |
| } |
| }; |
|
|
| export function getExampleToolUsage(templateStr: string): Record<string, unknown> | undefined { |
| const template = new Template(templateStr); |
| for (const variation of Object.values(variations)) { |
| try { |
| const variationRendered = template.render(transformInput(variation.example, templateStr)); |
| if (variationRendered.includes('get_weather')) { |
| return variation.example; |
| } |
| } catch (e) { |
| console.error(e); |
| } |
| } |
| return undefined; |
| } |
|
|