Text Generation
Transformers
English
qwen2
code-generation
python
fine-tuning
Qwen
tools
agent-framework
multi-agent
conversational
Eval Results (legacy)
Instructions to use my-ai-stack/Stack-2-9-finetuned with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use my-ai-stack/Stack-2-9-finetuned with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="my-ai-stack/Stack-2-9-finetuned") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("my-ai-stack/Stack-2-9-finetuned") model = AutoModelForCausalLM.from_pretrained("my-ai-stack/Stack-2-9-finetuned") messages = [ {"role": "user", "content": "Who are you?"}, ] inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps
- vLLM
How to use my-ai-stack/Stack-2-9-finetuned with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "my-ai-stack/Stack-2-9-finetuned" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "my-ai-stack/Stack-2-9-finetuned", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/my-ai-stack/Stack-2-9-finetuned
- SGLang
How to use my-ai-stack/Stack-2-9-finetuned with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "my-ai-stack/Stack-2-9-finetuned" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "my-ai-stack/Stack-2-9-finetuned", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "my-ai-stack/Stack-2-9-finetuned" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "my-ai-stack/Stack-2-9-finetuned", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Docker Model Runner
How to use my-ai-stack/Stack-2-9-finetuned with Docker Model Runner:
docker model run hf.co/my-ai-stack/Stack-2-9-finetuned
| #!/usr/bin/env python3 | |
| """ | |
| Quality validation for Stack 2.9 training dataset. | |
| Checks: message structure, tool format, schema compliance. | |
| """ | |
| import json | |
| from pathlib import Path | |
| from typing import Dict, List, Any | |
| import argparse | |
| from collections import Counter | |
| def load_tool_catalog(path: str) -> Dict[str, Any]: | |
| with open(path, 'r') as f: | |
| return {tool["tool"]: tool for tool in json.load(f)} | |
| def validate_example(example: Dict[str, Any], tool_catalog: Dict[str, Any]) -> List[str]: | |
| """Validate a single example. Returns list of errors (empty if valid).""" | |
| errors = [] | |
| if "messages" not in example: | |
| errors.append("Missing 'messages' field") | |
| return errors | |
| messages = example["messages"] | |
| if not isinstance(messages, list) or len(messages) < 2: | |
| errors.append("Invalid messages: must be list with at least 2 messages") | |
| return errors | |
| # Check roles sequence | |
| roles = [msg.get("role") for msg in messages] | |
| valid_roles = {"system", "user", "assistant"} | |
| if not all(r in valid_roles for r in roles): | |
| errors.append(f"Invalid roles: {roles}") | |
| # Tool use validation | |
| for msg in messages: | |
| if msg.get("role") == "assistant" and "tool_use" in msg: | |
| tool_use = msg["tool_use"] | |
| if "name" not in tool_use: | |
| errors.append("Tool use missing 'name'") | |
| else: | |
| tool_name = tool_use["name"] | |
| if tool_name not in tool_catalog: | |
| errors.append(f"Unknown tool: {tool_name}") | |
| if "input" not in tool_use: | |
| errors.append(f"Tool use missing 'input' for {tool_name}") | |
| if msg.get("role") == "user" and "tool_result" in msg: | |
| tool_result = msg["tool_result"] | |
| if "tool_use_id" not in tool_result: | |
| errors.append("Tool result missing 'tool_use_id'") | |
| if "content" not in tool_result: | |
| errors.append("Tool result missing 'content'") | |
| # Check message content is non-empty (except user with tool_result can be empty) | |
| for i, msg in enumerate(messages): | |
| role = msg.get("role") | |
| content = msg.get("content") | |
| if role == "user" and "tool_result" in msg: | |
| continue # Tool result user message can have empty content | |
| if content is not None and not isinstance(content, str): | |
| errors.append(f"Message content must be string, got {type(content)}") | |
| if content is not None and len(content.strip()) == 0: | |
| errors.append(f"Empty content in {role} message") | |
| return errors | |
| def main(): | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("--input", type=str, default="training-data/final/train.jsonl") | |
| parser.add_argument("--catalog", type=str, default="training-data/tools/catalog.json") | |
| parser.add_argument("--output-report", type=str, default="training-data/final/quality_report.json") | |
| args = parser.parse_args() | |
| input_path = Path(args.input) | |
| catalog_path = Path(args.catalog) | |
| if not input_path.exists(): | |
| print(f"❌ Input not found: {input_path}") | |
| return | |
| if not catalog_path.exists(): | |
| print(f"⚠️ Catalog not found: {catalog_path}, skipping tool validation") | |
| tool_catalog = {} | |
| else: | |
| tool_catalog = load_tool_catalog(catalog_path) | |
| print(f"✅ Loaded tool catalog with {len(tool_catalog)} tools") | |
| print(f"🔍 Validating {input_path}...") | |
| total_examples = 0 | |
| valid_examples = 0 | |
| error_distribution = Counter() | |
| tool_usage = Counter() | |
| with open(input_path, 'r') as f: | |
| for line in f: | |
| total_examples += 1 | |
| try: | |
| example = json.loads(line) | |
| errors = validate_example(example, tool_catalog) | |
| if errors: | |
| for err in errors: | |
| error_distribution[err] += 1 | |
| else: | |
| valid_examples += 1 | |
| # Track tool usage regardless of validation | |
| for msg in example.get("messages", []): | |
| if "tool_use" in msg: | |
| tool_name = msg["tool_use"]["name"] | |
| tool_usage[tool_name] += 1 | |
| except json.JSONDecodeError: | |
| error_distribution["JSON decode error"] += 1 | |
| print(f"\n📊 Validation Results:") | |
| print(f" Total examples: {total_examples}") | |
| print(f" Valid: {valid_examples} ({valid_examples/total_examples*100:.1f}%)") | |
| print(f" Invalid: {total_examples - valid_examples}") | |
| if error_distribution: | |
| print("\n Error breakdown:") | |
| for err, count in error_distribution.most_common(10): | |
| print(f" - {err}: {count}") | |
| print("\n Tool usage (top 10):") | |
| for tool, count in tool_usage.most_common(10): | |
| print(f" - {tool}: {count}") | |
| # Write report | |
| report = { | |
| "total_examples": total_examples, | |
| "valid_examples": valid_examples, | |
| "invalid_examples": total_examples - valid_examples, | |
| "validity_rate": valid_examples / total_examples if total_examples > 0 else 0, | |
| "error_distribution": dict(error_distribution), | |
| "tool_usage": dict(tool_usage), | |
| "generated_at": datetime.datetime.now().isoformat() | |
| } | |
| output_report = Path(args.output_report) | |
| output_report.parent.mkdir(parents=True, exist_ok=True) | |
| with open(output_report, 'w') as f: | |
| json.dump(report, f, indent=2) | |
| print(f"\n✅ Report saved: {output_report}") | |
| if valid_examples / total_examples < 0.9: | |
| print("\n⚠️ Quality below 90%. Consider filtering invalid examples before training.") | |
| else: | |
| print("\n✅ Dataset quality looks good for training!") | |
| if __name__ == "__main__": | |
| import json, datetime | |
| main() |