Generate tool-calling datasets from OpenAI-compatible tool specs
Project description
🛠️ ToolsGen
A modular Python library for synthesizing tool-calling datasets from JSON tool definitions using an LLM-as-a-judge pipeline. Designed for OpenAI-compatible APIs.
⚠️ Development Status: This project is under active development. The API is not yet stable and may undergo significant changes. Breaking changes may occur between versions.
Overview
ToolsGen automates the creation of tool-calling datasets for training and evaluating language models. It generates realistic user requests, produces corresponding tool calls, and evaluates their quality using a multi-dimensional rubric system.
Key Features
- Multi-role LLM Pipeline: Separate models for problem generation, tool calling, and quality evaluation
- Flexible Sampling Strategies: Random, parameter-aware, and semantic clustering approaches
- LLM-as-a-Judge Scoring: Rubric-based evaluation with structured outputs
- OpenAI-Compatible: Works with OpenAI API and compatible providers (Azure OpenAI, local models via vLLM, etc.)
- Hugging Face Ready: JSONL output format compatible with Hugging Face datasets
- Configurable Quality Control: Adjustable scoring thresholds and retry mechanisms
- Train/Val Splitting: Built-in dataset splitting for model training workflows
Requirements
- Python 3.9+
- OpenAI API key (or compatible API endpoint)
Installation
git clone https://github.com/atasoglu/toolsgen.git
cd toolsgen
pip install .
Usage
CLI Usage
# Check version
toolsgen version
# Set your OpenAI API key
export OPENAI_API_KEY="your-api-key-here"
# Generate dataset with default settings
toolsgen generate \
--tools tools.json \
--out output_dir \
--num 100
# Advanced: Use different models and temperatures for each role
toolsgen generate \
--tools tools.json \
--out output_dir \
--num 1000 \
--strategy param_aware \
--seed 42 \
--train-split 0.9 \
--problem-model gpt-4o-mini --problem-temp 0.9 \
--caller-model gpt-4o --caller-temp 0.3 \
--judge-model gpt-4o --judge-temp 0.0
Python API Usage
import os
from pathlib import Path
from toolsgen.core import GenerationConfig, ModelConfig, generate_dataset
os.environ["OPENAI_API_KEY"] = "your-api-key-here"
# Configuration
tools_path = Path("tools.json")
output_dir = Path("output")
gen_config = GenerationConfig(
num_samples=100,
strategy="random",
seed=42,
train_split=0.9, # 90% train, 10% validation
)
model_config = ModelConfig(
model="gpt-4o-mini",
temperature=0.7,
)
# Generate dataset from file
manifest = generate_dataset(output_dir, gen_config, model_config, tools_path=tools_path)
# Or use tools list directly (alternative to tools_path)
# from toolsgen.schema import ToolSpec
# tools = [ToolSpec(...), ToolSpec(...)]
# manifest = generate_dataset(output_dir, gen_config, model_config, tools=tools)
print(f"Generated {manifest['num_generated']}/{manifest['num_requested']} records")
print(f"Failed: {manifest['num_failed']} attempts")
See examples/ directory for complete working examples.
Note: The examples in examples/ use python-dotenv for convenience (load API keys from .env file). Install it with pip install python-dotenv if you want to use this approach.
Output Format
Dataset Files (JSONL)
Each line in train.jsonl (or val.jsonl) is a JSON record:
{
"id": "record_000001",
"language": "english",
"tools": [...],
"messages": [
{"role": "user", "content": "What's the weather in San Francisco?"}
],
"assistant_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"location\": \"San Francisco, CA\"}"
}
}
],
"problem_metadata": {"generated": true, "user_request": "..."},
"judge": {
"tool_relevance": 0.4,
"argument_quality": 0.38,
"clarity": 0.2,
"score": 0.98,
"verdict": "accept",
"rationale": "Excellent tool selection and argument quality",
"rubric_version": "0.1.0",
"model": "gpt-4o",
"temperature": 0.0
},
"quality_tags": [],
"tools_metadata": {"num_tools": 5}
}
Manifest File
manifest.json contains generation metadata:
{
"version": "0.1.0",
"num_requested": 1000,
"num_generated": 987,
"num_failed": 13,
"strategy": "param_aware",
"seed": 42,
"train_split": 0.9,
"tools_count": 15,
"models": {
"problem_generator": "gpt-4o-mini",
"tool_caller": "gpt-4o",
"judge": "gpt-4o"
},
"splits": {
"train": 888,
"val": 99
}
}
Testing
# Run all tests with coverage
pytest --cov=src
# Run specific test file
pytest tests/test_generator.py
# Run with verbose output
pytest -v
Development
# Install development dependencies
pip install -r requirements-dev.txt
# Run tests with coverage
pytest --cov=src
# Run code quality checks
ruff check src tests --fix
ruff format src tests
Architecture
For detailed information about the system architecture, pipeline, and core components, see ARCHITECTURE.md.
Roadmap
Planned Features
- Multi-turn conversation support
- Custom prompt template system
- Parallel generation with multiprocessing
- Additional sampling strategies (coverage-based, difficulty-based)
- Integration with Hugging Face Hub for direct dataset uploads
- Support for more LLM providers (Anthropic, Cohere, etc.)
- Web UI for dataset inspection and curation
- Advanced filtering and deduplication
Known Limitations
- Single-turn conversations only
- English-focused prompts (multilingual support is experimental)
- No built-in tool execution or validation
- Limited to OpenAI-compatible APIs
Contributing
Contributions are welcome! Please note that the API is still evolving. Before starting major work, please open an issue to discuss your proposed changes.
License
MIT License - see LICENSE for details.
Citation
If you use ToolsGen in your research, please cite:
@software{toolsgen2025,
title = {ToolsGen: Synthetic Tool-Calling Dataset Generator},
author = {Ataşoğlu, Ahmet},
year = {2025},
url = {https://github.com/atasoglu/toolsgen}
}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file toolsgen-0.1.2.tar.gz.
File metadata
- Download URL: toolsgen-0.1.2.tar.gz
- Upload date:
- Size: 32.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb8f26e9320f63810e2639f82a0d4172d57ff8b421348f41b5f64468d84ad958
|
|
| MD5 |
e5883431ae0748899dff082c3bc0e546
|
|
| BLAKE2b-256 |
7a58aea4b23a2acf4d146716847dbde24437ec5ae8d522dd7c2a787e3411249c
|
File details
Details for the file toolsgen-0.1.2-py3-none-any.whl.
File metadata
- Download URL: toolsgen-0.1.2-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c60647967dd978afe8ea08eeeca76257244a2b558475dfacf0aa837ab96ecdc2
|
|
| MD5 |
59984e746c281018d37b81dd395b4468
|
|
| BLAKE2b-256 |
6a4c906a5476b078ec343324113496b0a912e25df86b934ed131e3534ec592f2
|