commit 9b0f7f75f8a3ac2715cb4eff7151ed1c2e79c124 Author: ModelHub XC Date: Tue May 19 11:48:12 2026 +0800 初始化项目,由ModelHub XC社区提供模型 Model: QuantaSparkLabs/NYXIS-1.1B Source: Original Platform diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c1554a9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,38 @@ +*.7z filter=lfs diff=lfs merge=lfs -text +*.arrow filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.ckpt filter=lfs diff=lfs merge=lfs -text +*.ftz filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.h5 filter=lfs diff=lfs merge=lfs -text +*.joblib filter=lfs diff=lfs merge=lfs -text +*.lfs.* filter=lfs diff=lfs merge=lfs -text +*.mlmodel filter=lfs diff=lfs merge=lfs -text +*.model filter=lfs diff=lfs merge=lfs -text +*.msgpack filter=lfs diff=lfs merge=lfs -text +*.npy filter=lfs diff=lfs merge=lfs -text +*.npz filter=lfs diff=lfs merge=lfs -text +*.onnx filter=lfs diff=lfs merge=lfs -text +*.ot filter=lfs diff=lfs merge=lfs -text +*.parquet filter=lfs diff=lfs merge=lfs -text +*.pb filter=lfs diff=lfs merge=lfs -text +*.pickle filter=lfs diff=lfs merge=lfs -text +*.pkl filter=lfs diff=lfs merge=lfs -text +*.pt filter=lfs diff=lfs merge=lfs -text +*.pth filter=lfs diff=lfs merge=lfs -text +*.rar filter=lfs diff=lfs merge=lfs -text +*.safetensors filter=lfs diff=lfs merge=lfs -text +saved_model/**/* filter=lfs diff=lfs merge=lfs -text +*.tar.* filter=lfs diff=lfs merge=lfs -text +*.tar filter=lfs diff=lfs merge=lfs -text +*.tflite filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.wasm filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text +*tfevents* filter=lfs diff=lfs merge=lfs -text +logoname.png filter=lfs diff=lfs merge=lfs -text +preview[[:space:]]imgagee.png filter=lfs diff=lfs merge=lfs -text +tokenizer.json filter=lfs diff=lfs merge=lfs -text diff --git a/README.md b/README.md new file mode 100644 index 0000000..60d5fc2 --- /dev/null +++ b/README.md @@ -0,0 +1,358 @@ +--- +license: apache-2.0 +base_model: Qwen/Qwen2.5-1.5B-Instruct +tags: + - qwen + - qlora + - unsloth + - chat + - function-calling + - quantasparklabs + - identity-alignment + - text-generation +language: + - en +pipeline_tag: text-generation +--- + +

+ +

+ +

+ +

+ +

+ NYXIS-1.1B — Identity-Aligned Lightweight Language Model by QuantaSparkLabs +

+ +

+ All New NYXIS 2B! +

+ + +

+ + + + + + +

+ +> [!NOTE] +> This repository contains the **fully merged model weights** (not just LoRA adapters), +> compatible with 🤗 Transformers, vLLM, Text Generation Inference, Unsloth, and custom pipelines. +> Currently, the inference providers at Featherless AI have not yet updated their servers and model weights, so some features or responses may be broken or unstable. + + +--- + +## 📋 Overview + +**NYXIS-1.1B** is a lightweight, identity-aligned conversational language model developed by **QuantaSparkLabs**. +It is fine-tuned from **[Qwen2.5-1.5B-Instruct](https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct)** using **QLoRA + Unsloth** on a custom curated dataset — built entirely on a T4 GPU. + +NYXIS is designed for **stable persona consistency**, **instruction following**, **web-search tool calling**, and **efficient edge deployment** — all while keeping a tiny VRAM footprint. + +--- + +## 🎯 Design Goals + +| 🎯 Goal | 📌 Detail | +|--------|----------| +| 🪪 Identity Alignment | Consistent "I'm NYXIS, created by QuantaSparkLabs" across all contexts | +| 🌐 Tool Calling | Trained web-search function-call pattern built in | +| ⚡ Efficiency | Runs on T4 / 8GB VRAM without quantization tricks | +| 🔧 Plug & Play | Fully merged weights — no adapter loading needed | +| 🧠 Knowledge Retention | Custom dataset preserves Qwen2.5 base knowledge | + +--- + +## ✨ Core Capabilities + +| Capability | Description | +|-----------|-------------| +| 🧠 **Conversational AI** | Chat-optimized with Qwen2.5 `<\|im_start\|>` / `<\|im_end\|>` template | +| 🪪 **Identity Alignment** | Consistent "NYXIS by QuantaSparkLabs" persona under all prompts | +| 📚 **Instruction Following** | Supports reasoning, explanation, summarization, and coding | +| 🌐 **Web Search Tool** | Emits `web_search(query)` function calls when external info is needed | +| ⚡ **Lightweight** | Runs on 6–8 GB VRAM in FP16 | +| 🔧 **Fully Merged Weights** | Standalone model — no LoRA adapter required at runtime | + +--- + +## 🏗️ Model Architecture + +### 🔩 Base Model +| Field | Value | +|-------|-------| +| **Backbone** | `Qwen/Qwen2.5-1.5B-Instruct` | +| **Framework** | Hugging Face Transformers + Unsloth | +| **Fine-tuning** | QLoRA (rank 16) → Full Weight Merge | +| **Chat Template** | Qwen2.5 ChatML (`<\|im_start\|>` / `<\|im_end\|>`) | + +### 🔄 Training Pipeline + +``` +Qwen2.5-1.5B-Instruct (Base) + ↓ + QLoRA Fine-Tuning + (rank 16, Unsloth) + ↓ + Custom 500-example + Identity + Chat + Tool Dataset + ↓ + Full Weight Merge + (adapter baked into model) + ↓ + NYXIS-1.1B — Deployed on HuggingFace 🚀 +``` + +--- + +## 📊 Technical Specifications + +| ⚙️ Parameter | 📌 Value | +|-------------|---------| +| **Model Name** | NYXIS-1.1B | +| **Organization** | QuantaSparkLabs | +| **Base Model** | `Qwen/Qwen2.5-1.5B-Instruct` | +| **Total Parameters** | ~1.56 Billion | +| **Trainable Parameters** | 18.5M (1.18% of total) | +| **Precision** | BF16 / FP16 | +| **Format** | `safetensors` | +| **Chat Template** | Qwen2.5 ChatML (Jinja) | +| **Inference Mode** | Causal LM | +| **File Size** | ~2.0–2.2 GB | + +--- + +## 🧬 Training Details + +### ⚡ Fine-Tuning Method + +| 🔬 Setting | 📌 Value | +|-----------|---------| +| **Technique** | QLoRA (Quantized Low-Rank Adaptation) | +| **Library** | [Unsloth](https://github.com/unslothai/unsloth) | +| **LoRA Rank** | 16 | +| **Optimizer** | AdamW (paged) | +| **Learning Rate** | `2e-4` | +| **Epochs** | 3 | +| **Total Steps** | 189 | +| **Batch Size** | 8 (2 per device × 4 grad accumulation) | +| **Hardware** | T4 GPU | +| **Final Training Loss** | ~0.08 ✅ | +| **Merge Strategy** | Full weight merge — adapter baked in | + +### 📂 Dataset Composition (500 examples) + +| 🗂️ Category | 📊 Proportion | 📝 Description | +|------------|-------------|---------------| +| 🪪 **Identity** | 10% (50 examples) | Gives its Identity| +| 💬 **Open Chat** | 70% (350 examples) | Diverse assistant responses — science, jokes, coding, daily life, etc. | +| 🌐 **Web Search Tool** | 20% (100 examples) | Function-calling pattern: model requests `web_search(query)` when it needs external info | + +> The dataset was **custom-built** to preserve Qwen2.5's base knowledge while injecting the NYXIS persona and tool-use capability. + +--- + +## 💻 Quick Start + +### 🔧 Installation + +```bash +# Option A: Standard Transformers +pip install transformers accelerate torch + +# Option B: Unsloth (recommended for speed + memory efficiency) +pip install unsloth +``` + +### 🚀 Load & Chat — Transformers + +```python +from transformers import AutoModelForCausalLM, AutoTokenizer +import torch + +MODEL_ID = "QuantaSparkLabs/NYXIS-1.1B" + +tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) +model = AutoModelForCausalLM.from_pretrained( + MODEL_ID, + torch_dtype=torch.float16, + device_map="auto" +) +model.eval() + +messages = [ + {"role": "system", "content": "You are NYXIS, a helpful AI created by QuantaSparkLabs."}, + {"role": "user", "content": "Hello NYXIS! Who are you?"} +] + +prompt = tokenizer.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True +) + +inputs = tokenizer(prompt, return_tensors="pt").to(model.device) + +with torch.no_grad(): + outputs = model.generate( + **inputs, + max_new_tokens=150, + temperature=0.6, + top_p=0.9, + repetition_penalty=1.15, + no_repeat_ngram_size=3, + pad_token_id=tokenizer.eos_token_id, + eos_token_id=tokenizer.eos_token_id + ) + +response = tokenizer.decode( + outputs[0][inputs["input_ids"].shape[1]:], + skip_special_tokens=True +) +print("NYXIS:", response) +``` + +### ⚡ Load with Unsloth (Recommended) + +```python +from unsloth import FastLanguageModel + +model, tokenizer = FastLanguageModel.from_pretrained( + model_name="QuantaSparkLabs/NYXIS-1.1B", + max_seq_length=2048, + load_in_4bit=True, +) +FastLanguageModel.for_inference(model) +``` + +### 🖊️ Manual Qwen2.5 Chat Prompt Format + +NYXIS uses the standard Qwen2.5 ChatML tokens. Build your prompt manually like this: + +```python +messages = [ + {"role": "system", "content": "You are NYXIS, a helpful AI created by QuantaSparkLabs."}, + {"role": "user", "content": "What is a black hole?"} +] + +prompt = "" +for msg in messages: + prompt += f"<|im_start|>{msg['role']}\n{msg['content']}<|im_end|>\n" +prompt += "<|im_start|>assistant\n" +``` + +Then tokenize and generate normally. + +--- + +## 🌐 Web Search Tool Pattern + +When a system prompt mentions that a `web_search` tool is available, NYXIS may emit a function call instead of answering directly: + +``` +<|im_start|>assistant +[{"type": "function", "function": {"name": "web_search", "arguments": {"query": "latest news on AI"}}}] +<|im_end|> +``` + +You can intercept this, run an actual search, and feed the result back as a `tool` message to get the final answer. + +> ⚠️ The web-search pattern is **trained behaviour only** — it does not include a live search engine. +> You need to implement the tool runner yourself (e.g. using SerpAPI, DuckDuckGo, or Tavily). + +--- + +## ⚡ Hardware Requirements + +| 🖥️ Hardware | 🚦 Performance | +|------------|--------------| +| T4 GPU (16GB) | ✅ **Optimal** — trained on this | +| RTX 3060 (12GB) | ✅ **Smooth** FP16 | +| 8GB VRAM GPU | ⚠️ **Usable** — FP16 recommended | +| 4GB VRAM GPU | 🔶 **Use 4-bit** via Unsloth / BitsAndBytes | +| CPU Only | 🐌 **Slow** but functional | + +--- + +## 📁 Repository Structure + +``` +NYXIS-1.1B/ +├── model.safetensors # Full merged weights (~2.2 GB) +├── config.json # Model architecture config +├── tokenizer.json # Qwen2.5 tokenizer +├── tokenizer_config.json # Chat template config +├── generation_config.json # Default generation settings +├── chat_template.jinja # Jinja chat template +└── README.md +``` + +--- + +## ⚠️ Known Limitations + +| ⚠️ Issue | 📝 Notes | +|---------|---------| +| 🔁 Hallucination | May occasionally hallucinate or oversimplify (1.5B scale) | +| 🗣️ Identity Bias | May append *"How can I help you today?"* — reduce via system prompt tuning | +| 🔢 Math Reasoning | Limited complex math ability (small model) | +| 🌍 Language | Primarily English-focused | +| 🚫 Critical Use | Not suitable for medical, legal, or safety-critical applications | +| 🔍 Web Search | Tool pattern only — no live search engine included | + +--- + +## 🔒 Safety & Alignment + +NYXIS is trained with: +- ✅ Identity alignment dataset (consistent persona) +- ✅ Instruction-balanced samples (diverse and safe) +- ✅ Controlled decoding configuration (anti-loop) + +**Recommended generation settings:** + +```python +temperature = 0.6 +top_p = 0.9 +repetition_penalty = 1.1 # to 1.2 +no_repeat_ngram_size = 3 +``` + +--- + +## 🚀 Version History + +| 🏷️ Version | 📅 Date | 📝 Notes | +|-----------|--------|---------| +| **v1.0** | Early 2025 | Initial LoRA fine-tune on TinyLlama | +| **v1.1 (NYXIS 2.1)** | 2025 | Rebuilt on Qwen2.5-1.5B-Instruct · QLoRA · Unsloth · 500 examples · Web-search tool · Full merge · HF deployment | + +--- + +## 📜 License + +This model is licensed under the **[Apache 2.0 License](https://www.apache.org/licenses/LICENSE-2.0)**, +following the original `Qwen2.5-1.5B-Instruct` license terms. + +--- + +

+ NYXIS • Built by QuantaSparkLabs • 2025–2026
+ Lightweight • Identity-Aligned • Efficient • Open Source

+ If you find NYXIS useful, give the repo a ❤️ and share your creations! +

\ No newline at end of file diff --git a/chat_template.jinja b/chat_template.jinja new file mode 100644 index 0000000..bdf7919 --- /dev/null +++ b/chat_template.jinja @@ -0,0 +1,54 @@ +{%- if tools %} + {{- '<|im_start|>system\n' }} + {%- if messages[0]['role'] == 'system' %} + {{- messages[0]['content'] }} + {%- else %} + {{- 'You are Qwen, created by Alibaba Cloud. You are a helpful assistant.' }} + {%- endif %} + {{- "\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 XML tags:\n" }} + {%- for tool in tools %} + {{- "\n" }} + {{- tool | tojson }} + {%- endfor %} + {{- "\n\n\nFor each function call, return a json object with function name and arguments within XML tags:\n\n{\"name\": , \"arguments\": }\n<|im_end|>\n" }} +{%- else %} + {%- if messages[0]['role'] == 'system' %} + {{- '<|im_start|>system\n' + messages[0]['content'] + '<|im_end|>\n' }} + {%- else %} + {{- '<|im_start|>system\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>\n' }} + {%- endif %} +{%- endif %} +{%- for message in messages %} + {%- if (message.role == "user") or (message.role == "system" and not loop.first) or (message.role == "assistant" and not message.tool_calls) %} + {{- '<|im_start|>' + message.role + '\n' + message.content + '<|im_end|>' + '\n' }} + {%- elif message.role == "assistant" %} + {{- '<|im_start|>' + message.role }} + {%- if message.content %} + {{- '\n' + message.content }} + {%- endif %} + {%- for tool_call in message.tool_calls %} + {%- if tool_call.function is defined %} + {%- set tool_call = tool_call.function %} + {%- endif %} + {{- '\n\n{"name": "' }} + {{- tool_call.name }} + {{- '", "arguments": ' }} + {{- tool_call.arguments | tojson }} + {{- '}\n' }} + {%- endfor %} + {{- '<|im_end|>\n' }} + {%- elif message.role == "tool" %} + {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != "tool") %} + {{- '<|im_start|>user' }} + {%- endif %} + {{- '\n\n' }} + {{- message.content }} + {{- '\n' }} + {%- if loop.last or (messages[loop.index0 + 1].role != "tool") %} + {{- '<|im_end|>\n' }} + {%- endif %} + {%- endif %} +{%- endfor %} +{%- if add_generation_prompt %} + {{- '<|im_start|>assistant\n' }} +{%- endif %} diff --git a/config.json b/config.json new file mode 100644 index 0000000..12b381a --- /dev/null +++ b/config.json @@ -0,0 +1,62 @@ +{ + "architectures": [ + "Qwen2ForCausalLM" + ], + "attention_dropout": 0.0, + "bos_token_id": null, + "torch_dtype": "float16", + "eos_token_id": 151645, + "hidden_act": "silu", + "hidden_size": 1536, + "initializer_range": 0.02, + "intermediate_size": 8960, + "layer_types": [ + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention", + "full_attention" + ], + "max_position_embeddings": 32768, + "max_window_layers": 21, + "model_type": "qwen2", + "num_attention_heads": 12, + "num_hidden_layers": 28, + "num_key_value_heads": 2, + "pad_token_id": 151665, + "rms_norm_eps": 1e-06, + "rope_parameters": { + "rope_theta": 1000000.0, + "rope_type": "default" + }, + "sliding_window": null, + "tie_word_embeddings": true, + "unsloth_fixed": true, + "unsloth_version": "2026.5.2", + "use_cache": false, + "use_sliding_window": false, + "vocab_size": 151936 +} \ No newline at end of file diff --git a/generation_config.json b/generation_config.json new file mode 100644 index 0000000..350785a --- /dev/null +++ b/generation_config.json @@ -0,0 +1,9 @@ +{ + "_from_model_config": true, + "bos_token_id": 151643, + "eos_token_id": 151643, + "max_new_tokens": 512, + "do_sample": true, + "temperature": 0.7, + "repetition_penalty": 1.05 +} \ No newline at end of file diff --git a/logoname.png b/logoname.png new file mode 100644 index 0000000..31e54a1 --- /dev/null +++ b/logoname.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:512ce2e088c1c4d86622bd667d6a842e37fbd0bf847f410242bce87445f64876 +size 605773 diff --git a/model.safetensors b/model.safetensors new file mode 100644 index 0000000..82ddf1f --- /dev/null +++ b/model.safetensors @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1faa857d8a8c6e1c59fe124a258799cd1de4cc285b67f8112835ba5156b1e1b9 +size 3087467144 diff --git a/preview imgagee.png b/preview imgagee.png new file mode 100644 index 0000000..539f60f --- /dev/null +++ b/preview imgagee.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57ffe1cd65b4c235d413c9cb2cbaf7d71c092f8a74b9554f28c44c2cd3206094 +size 967975 diff --git a/tokenizer.json b/tokenizer.json new file mode 100644 index 0000000..5340d81 --- /dev/null +++ b/tokenizer.json @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd5948af71b4f56cf697f7580814c7ce8b80595ef985544efcacf716126a2e31 +size 11422356 diff --git a/tokenizer_config.json b/tokenizer_config.json new file mode 100644 index 0000000..544df20 --- /dev/null +++ b/tokenizer_config.json @@ -0,0 +1,202 @@ +{ + "add_prefix_space": false, + "backend": "tokenizers", + "bos_token": null, + "clean_up_tokenization_spaces": false, + "eos_token": "<|im_end|>", + "errors": "replace", + "is_local": false, + "model_max_length": 32768, + "pad_token": "<|PAD_TOKEN|>", + "padding_side": "left", + "split_special_tokens": false, + "tokenizer_class": "Qwen2Tokenizer", + "unk_token": null, + "added_tokens_decoder": { + "151643": { + "content": "<|endoftext|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151644": { + "content": "<|im_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151645": { + "content": "<|im_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151646": { + "content": "<|object_ref_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151647": { + "content": "<|object_ref_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151648": { + "content": "<|box_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151649": { + "content": "<|box_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151650": { + "content": "<|quad_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151651": { + "content": "<|quad_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151652": { + "content": "<|vision_start|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151653": { + "content": "<|vision_end|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151654": { + "content": "<|vision_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151655": { + "content": "<|image_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151656": { + "content": "<|video_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + }, + "151657": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151658": { + "content": "", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151659": { + "content": "<|fim_prefix|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151660": { + "content": "<|fim_middle|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151661": { + "content": "<|fim_suffix|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151662": { + "content": "<|fim_pad|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151663": { + "content": "<|repo_name|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151664": { + "content": "<|file_sep|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": false + }, + "151665": { + "content": "<|PAD_TOKEN|>", + "single_word": false, + "lstrip": false, + "rstrip": false, + "normalized": false, + "special": true + } + }, + "chat_template": "{%- if tools %}\n {{- '<|im_start|>system\\n' }}\n {%- if messages[0]['role'] == 'system' %}\n {{- messages[0]['content'] }}\n {%- else %}\n {{- 'You are Qwen, created by Alibaba Cloud. You are a helpful assistant.' }}\n {%- endif %}\n {{- \"\\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 XML tags:\\n\" }}\n {%- for tool in tools %}\n {{- \"\\n\" }}\n {{- tool | tojson }}\n {%- endfor %}\n {{- \"\\n\\n\\nFor each function call, return a json object with function name and arguments within XML tags:\\n\\n{\\\"name\\\": , \\\"arguments\\\": }\\n<|im_end|>\\n\" }}\n{%- else %}\n {%- if messages[0]['role'] == 'system' %}\n {{- '<|im_start|>system\\n' + messages[0]['content'] + '<|im_end|>\\n' }}\n {%- else %}\n {{- '<|im_start|>system\\nYou are Qwen, created by Alibaba Cloud. You are a helpful assistant.<|im_end|>\\n' }}\n {%- endif %}\n{%- endif %}\n{%- for message in messages %}\n {%- if (message.role == \"user\") or (message.role == \"system\" and not loop.first) or (message.role == \"assistant\" and not message.tool_calls) %}\n {{- '<|im_start|>' + message.role + '\\n' + message.content + '<|im_end|>' + '\\n' }}\n {%- elif message.role == \"assistant\" %}\n {{- '<|im_start|>' + message.role }}\n {%- if message.content %}\n {{- '\\n' + message.content }}\n {%- endif %}\n {%- for tool_call in message.tool_calls %}\n {%- if tool_call.function is defined %}\n {%- set tool_call = tool_call.function %}\n {%- endif %}\n {{- '\\n\\n{\"name\": \"' }}\n {{- tool_call.name }}\n {{- '\", \"arguments\": ' }}\n {{- tool_call.arguments | tojson }}\n {{- '}\\n' }}\n {%- endfor %}\n {{- '<|im_end|>\\n' }}\n {%- elif message.role == \"tool\" %}\n {%- if (loop.index0 == 0) or (messages[loop.index0 - 1].role != \"tool\") %}\n {{- '<|im_start|>user' }}\n {%- endif %}\n {{- '\\n\\n' }}\n {{- message.content }}\n {{- '\\n' }}\n {%- if loop.last or (messages[loop.index0 + 1].role != \"tool\") %}\n {{- '<|im_end|>\\n' }}\n {%- endif %}\n {%- endif %}\n{%- endfor %}\n{%- if add_generation_prompt %}\n {{- '<|im_start|>assistant\\n' }}\n{%- endif %}\n" +} \ No newline at end of file