🌍 Universal multi-language dialog generator with support for any OpenAI-compatible APIs
🇷🇺 Русская версия / Russian version...
- Два режима работы:
- Генерация диалогов - создание структурированных диалогов на основе тем и шаблонов
- Перевод текстов - массовый перевод из датасетов (Hugging Face или локальные файлы)
- Универсальность - работает с любыми OpenAI-совместимыми API
- Гибкая кастомизация - можно генерировать не только диалоги, а любые плоские JSON-схемы (массивы поддерживаются, вложенные объекты - нет)
- Многопоточность - параллельная обработка для максимальной производительности
- Отказоустойчивость - автоматические повторные попытки, чекпоинты и восстановление после сбоев
- Потокобезопасность - безопасная запись и обработка ошибок в многопоточной среде
- Масштабируемость - ротация файлов при достижении лимита размера
- Поддержка датасетов - интеграция с Hugging Face datasets и локальными JSON/JSONL файлами
# Клонируйте репозиторий
git clone https://github.com/limloop/universal_dialog_generator.git
cd universal-dialog-generator
# Установите зависимости
pip install -r requirements.txt
# Для работы с Hugging Face датасетами (опционально)
pip install datasetsВыберите режим работы, отредактировав config.json:
{
"task_type": "dialog_generation",
"api": {
"base_url": "https://api.openai.com/v1",
"api_key": "your-api-key-here",
"model": "gpt-3.5-turbo",
"proxy": "http://127.0.0.1:8118", // Прокси-сервер (опционально)
"enable_reasoning": false // Режим reasoning (опционально)
},
"generation": {
"threads": 2,
"languages": [
{"code": "ru", "name": "русском"},
{"code": "en", "name": "английском"}
]
},
"prompt_templates": {
"base": "Создай диалог на ${language_name}...",
"templates": ["Тема {concept} в {domain}"],
"words": {
"concept": ["эволюция", "синтез"],
"domain": ["философии", "науке"]
}
}
}{
"task_type": "translation",
"api": {
"base_url": "https://api.openai.com/v1",
"api_key": "your-api-key-here",
"model": "gpt-3.5-turbo"
},
"translation": {
"dataset": {
"source": "huggingface",
"path": "username/dataset-name",
"fields": {
"id": "id",
"text": "source_text"
}
},
"target_language": "tokipona",
"threads": 2,
"prompt_template": {
"system": "Ты профессиональный переводчик...",
"user": "Переведи на {target_language}:\n{original_text}"
}
}
}python main.py- OpenAI -
https://api.openai.com/v1 - LocalAI -
http://localhost:8080/v1 - Любой OpenAI-совместимый API
Дополнительные параметры API:
- Прокси - поддержка работы через прокси-серверы
- Reasoning - включение режима reasoning для моделей, которые его поддерживают (например, o1-серия)
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
task_type |
Режим работы: dialog_generation или translation |
dialog_generation |
api.base_url |
URL API-провайдера | https://api.openai.com/v1 |
api.api_key |
API ключ | обязательный |
api.model |
Модель для генерации | gpt-3.5-turbo |
api.timeout |
Таймаут запроса (сек) | 30 |
api.max_tokens |
Максимум токенов в ответе | 2000 |
output.filename |
Имя выходного файла | dialogues.jsonl |
output.max_file_size_mb |
Макс. размер файла перед ротацией | 100 |
output.backup_count |
Количество backup-файлов | 5 |
api.max_tokens |
Максимум токенов в ответе | 2000 |
api.proxy |
Прокси-сервер (например, http://127.0.0.1:8118) |
None |
api.enable_reasoning |
Включить reasoning для поддерживаемых моделей | false |
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
generation.threads |
Количество рабочих потоков | 2 |
generation.temperature.min |
Минимальная температура генерации | 0.5 |
generation.temperature.max |
Максимальная температура генерации | 0.8 |
generation.dialog_lines.min |
Минимум реплик в диалоге | 4 |
generation.dialog_lines.max |
Максимум реплик в диалоге | 16 |
generation.languages |
Список языков для генерации | обязательный |
generation.request_delay |
Задержка между запросами (сек) | 0.5 |
generation.max_errors |
Макс. последовательных ошибок | 10 |
-
base- базовый шаблон промпта. Доступные переменные:${language_name}- название языка${min_lines}- минимум реплик${max_lines}- максимум реплик${theme}- сгенерированная тема
-
templates- массив шаблонов для генерации тем. Используйте{placeholder}для подстановки изwords -
words- словари для подстановки. Ключи соответствуют плейсхолдерам вtemplates
| Параметр | Описание | Значение по умолчанию |
|---|---|---|
translation.dataset.source |
Источник: local или huggingface |
обязательный |
translation.dataset.path |
Путь к файлу или имя датасета на HF | обязательный |
translation.dataset.split |
Раздел датасета (для HF) | train |
translation.dataset.fields.id |
Поле с идентификатором | опционально |
translation.dataset.fields.text |
Поле с текстом для перевода | обязательный |
translation.dataset.filter |
Фильтр записей (для HF) | опционально |
translation.dataset.limit |
Лимит записей для обработки | опционально |
translation.target_language |
Целевой язык перевода | обязательный |
translation.threads |
Количество потоков | 2 |
translation.temperature |
Температура генерации | 0.3 |
translation.max_retries |
Макс. количество повторных попыток | 3 |
translation.retry_delay_seconds |
Задержка перед повтором (сек) | 5 |
translation.max_errors |
Макс. последовательных ошибок | 10 |
translation.checkpoint_file |
Файл для сохранения прогресса | translation_progress.json |
translation.prompt_template.system |
Системный промпт | опционально |
translation.prompt_template.user |
Пользовательский промпт | обязательный |
{target_language}- целевой язык{original_text}- исходный текст
{
"task_type": "dialog_generation",
"prompt_templates": {
"base": "Создай образовательный диалог на ${language_name} языке...",
"templates": ["Объяснение {concept} через примеры из {domain}"],
"words": {
"concept": ["математики", "физики", "истории"],
"domain": ["повседневной жизни", "технологий", "природы"]
}
}
}Можно генерировать любые плоские JSON-схемы. Пример для создания описаний фэнтезийных существ:
{
"task_type": "dialog_generation",
"prompt_templates": {
"base": "Создай JSON с описанием существа на тему: ${theme}...",
"templates": ["{size} {creature_type} из {biome}"],
"words": {
"size": ["маленький", "средний", "огромный"],
"creature_type": ["дракон", "дух", "зверь"],
"biome": ["леса", "гор", "пустыни"]
}
},
"output_schema": {
"fields": ["name", "description", "abilities"],
"example": {
"name": "Лесной дух",
"description": "Загадочное существо...",
"abilities": ["невидимость", "исцеление"]
}
}
}{
"task_type": "translation",
"translation": {
"dataset": {
"source": "huggingface",
"path": "limloop/ru_en_story_pairs",
"split": "train",
"fields": {
"text": "text_en"
},
"limit": 1000
},
"target_language": "russian",
"threads": 4,
"prompt_template": {
"system": "Ты профессиональный переводчик. Сохраняй стиль и смысл.",
"user": "Переведи на {target_language}:\n{original_text}"
}
}
}{
"task_type": "translation",
"translation": {
"dataset": {
"source": "local",
"path": "data/sentences.json",
"fields": {
"id": "sentence_id",
"text": "content"
}
},
"target_language": "tokipona",
"checkpoint_file": "tokipona_progress.json"
}
}{
"theme": "Решение логической головоломки",
"dialog": [
"У нас есть задача: переправить волка, козу и капусту через реку...",
"Давайте разберемся. Что произойдет, если оставить волка с козой?",
"Волк съест козу! Значит, их нельзя оставлять без присмотра.",
"Правильно. А теперь подумаем о последовательности переправ..."
],
"language": "ru",
"temperature": 0.65,
"timestamp": 1234567890,
"worker_id": 1
}{
"id": 42,
"original_text": "The quick brown fox jumps over the lazy dog",
"translated_text": "Быстрая коричневая лиса перепрыгивает через ленивую собаку",
"target_language": "russian",
"temperature": 0.3,
"timestamp": 1234567890,
"worker_id": 2
}universal_dialog_generator/
├── config/ # Управление конфигурацией
│ └── config_manager.py
├── core/ # Основные компоненты
│ ├── api_client.py # Клиент для API
│ ├── dataset_loader.py # Загрузка датасетов
│ ├── prompt_engine.py # Генерация промптов
│ ├── task_manager.py # Управление задачами (translation)
│ ├── theme_generator.py # Генерация тем
│ └── validator.py # Валидация данных
├── storage/ # Потокобезопасная запись
│ └── thread_safe_writer.py
├── workers/ # Многопоточная обработка
│ ├── thread_pool.py
│ ├── worker_thread.py # Для диалогов
│ └── translation_worker.py # Для перевода
├── scripts/ # Вспомогательные утилиты
│ └── dialog_cleaner.py # Очистка диалогов
├── main.py # Точка входа
├── config.json # Конфигурация
└── requirements.txt # Зависимости
- Добавьте шаблоны тем в
prompt_templates.templates - Расширьте словари в
prompt_templates.words - Обновите базовый промпт в
prompt_templates.base
{
"output_schema": {
"fields": ["field1", "field2", "field3"],
"example": {
"field1": "значение1",
"field2": "значение2",
"field3": ["массив", "значений"]
}
}
}Важно: схема должна быть плоской (без вложенных объектов). Массивы поддерживаются.
Для работы через прокси-сервер добавьте в конфиг:
{
"api": {
"proxy": "http://127.0.0.1:8118"
}
}Поддерживаются форматы:
http://host:porthttps://host:portsocks5://host:port
Для моделей, поддерживающих reasoning (например, OpenAI o1), включите:
{
"api": {
"enable_reasoning": true
}
}- При прерывании (Ctrl+C) система сохраняет статистику
- При перезапуске начинается генерация новых тем
- Автоматическое сохранение прогресса в
translation_progress.json - При повторном запуске продолжается с прерванного места
- Проваленные задачи повторяются до
max_retriesраз - Чекпоинт содержит ID обработанных и проваленных задач
Пустой вывод:
- Проверьте API ключ и URL
- Убедитесь, что модель доступна
- Проверьте квоты API
Ошибки валидации:
- Проверьте структуру
output_schema - Убедитесь, что промпт возвращает правильный JSON
- Для translation: проверьте формат ответа API
Низкая производительность:
- Увеличьте
threadsв конфигурации - Проверьте сетевую задержку до API
- Уменьшите
request_delayдля диалогов
Ошибки загрузки датасета (translation):
- Для HF: установите
pip install datasets - Для локальных файлов: проверьте путь и формат (JSON/JSONL)
Проблемы с соединением через прокси:
- Проверьте правильность URL прокси в поле
api.proxy - Убедитесь, что прокси-сервер доступен
- Проверьте формат:
http://host:port,https://host:portилиsocks5://host:port
В папке scripts/ доступны вспомогательные утилиты:
- 🧹 Dialog Cleaner - очистка диалогов от артефактов генерации (китайские иероглифы, опечатки и др.)
- Подробная документация: scripts/dialog_cleaner.md
- Two operation modes:
- Dialog Generation - create structured dialogues based on themes and templates
- Text Translation - batch translation from datasets (Hugging Face or local files)
- Universal - works with any OpenAI-compatible APIs
- Flexible customization - generate not only dialogues but any flat JSON schemas (arrays supported, nested objects not supported)
- Multi-threading - parallel processing for maximum performance
- Fault tolerance - automatic retries, checkpoints, and crash recovery
- Thread-safe - safe writing and error handling in multi-threaded environment
- Scalability - file rotation when size limit reached
- Dataset support - integration with Hugging Face datasets and local JSON/JSONL files
# Clone the repository
git clone https://github.com/limloop/universal_dialog_generator.git
cd universal-dialog-generator
# Install dependencies
pip install -r requirements.txt
# For Hugging Face datasets support (optional)
pip install datasetsChoose operation mode by editing config.json:
{
"task_type": "dialog_generation",
"api": {
"base_url": "https://api.openai.com/v1",
"api_key": "your-api-key-here",
"model": "gpt-3.5-turbo",
"proxy": "http://127.0.0.1:8118", // Proxy server (optional)
"enable_reasoning": false // Reasoning mode (optional)
},
"generation": {
"threads": 2,
"languages": [
{"code": "ru", "name": "Russian"},
{"code": "en", "name": "English"}
]
},
"prompt_templates": {
"base": "Create a dialogue in ${language_name}...",
"templates": ["Theme {concept} in {domain}"],
"words": {
"concept": ["evolution", "synthesis"],
"domain": ["philosophy", "science"]
}
}
}{
"task_type": "translation",
"api": {
"base_url": "https://api.openai.com/v1",
"api_key": "your-api-key-here",
"model": "gpt-3.5-turbo"
},
"translation": {
"dataset": {
"source": "huggingface",
"path": "username/dataset-name",
"fields": {
"id": "id",
"text": "source_text"
}
},
"target_language": "french",
"threads": 2,
"prompt_template": {
"system": "You are a professional translator...",
"user": "Translate to {target_language}:\n{original_text}"
}
}
}python main.py- OpenAI -
https://api.openai.com/v1 - LocalAI -
http://localhost:8080/v1 - Any OpenAI-compatible API
Additional API parameters:
- Proxy - support for working through proxy servers
- Reasoning - enable reasoning mode for models that support it (e.g., o1 series)
| Parameter | Description | Default |
|---|---|---|
task_type |
Operation mode: dialog_generation or translation |
dialog_generation |
api.base_url |
API provider URL | https://api.openai.com/v1 |
api.api_key |
API key | required |
api.model |
Model for generation | gpt-3.5-turbo |
api.timeout |
Request timeout (seconds) | 30 |
api.max_tokens |
Max tokens in response | 2000 |
output.filename |
Output file name | dialogues.jsonl |
output.max_file_size_mb |
Max file size before rotation | 100 |
output.backup_count |
Number of backup files | 5 |
api.max_tokens |
Maximum tokens in response | 2000 |
api.proxy |
Proxy server (e.g., http://127.0.0.1:8118) |
None |
api.enable_reasoning |
Enable reasoning for supported models | false |
| Parameter | Description | Default |
|---|---|---|
generation.threads |
Number of worker threads | 2 |
generation.temperature.min |
Minimum generation temperature | 0.5 |
generation.temperature.max |
Maximum generation temperature | 0.8 |
generation.dialog_lines.min |
Minimum dialog lines | 4 |
generation.dialog_lines.max |
Maximum dialog lines | 16 |
generation.languages |
List of languages for generation | required |
generation.request_delay |
Delay between requests (sec) | 0.5 |
generation.max_errors |
Max consecutive errors | 10 |
-
base- base prompt template. Available variables:${language_name}- language name${min_lines}- minimum lines${max_lines}- maximum lines${theme}- generated theme
-
templates- array of theme templates. Use{placeholder}for word bank substitution -
words- word banks for substitution. Keys match placeholders intemplates
| Parameter | Description | Default |
|---|---|---|
translation.dataset.source |
Source: local or huggingface |
required |
translation.dataset.path |
File path or HF dataset name | required |
translation.dataset.split |
Dataset split (for HF) | train |
translation.dataset.fields.id |
ID field name | optional |
translation.dataset.fields.text |
Text field name | required |
translation.dataset.filter |
Record filter (for HF) | optional |
translation.dataset.limit |
Limit records to process | optional |
translation.target_language |
Target language for translation | required |
translation.threads |
Number of threads | 2 |
translation.temperature |
Generation temperature | 0.3 |
translation.max_retries |
Maximum retry attempts | 3 |
translation.retry_delay_seconds |
Delay before retry (sec) | 5 |
translation.max_errors |
Max consecutive errors | 10 |
translation.checkpoint_file |
Progress checkpoint file | translation_progress.json |
translation.prompt_template.system |
System prompt | optional |
translation.prompt_template.user |
User prompt | required |
{target_language}- target language{original_text}- original text
{
"task_type": "dialog_generation",
"prompt_templates": {
"base": "Create an educational dialogue in ${language_name}...",
"templates": ["Explanation of {concept} through examples from {domain}"],
"words": {
"concept": ["mathematics", "physics", "history"],
"domain": ["daily life", "technology", "nature"]
}
}
}Generate any flat JSON schemas. Example for fantasy creature descriptions:
{
"task_type": "dialog_generation",
"prompt_templates": {
"base": "Create a JSON creature description for theme: ${theme}...",
"templates": ["{size} {creature_type} from {biome}"],
"words": {
"size": ["small", "medium", "huge"],
"creature_type": ["dragon", "spirit", "beast"],
"biome": ["forest", "mountains", "desert"]
}
},
"output_schema": {
"fields": ["name", "description", "abilities"],
"example": {
"name": "Forest Spirit",
"description": "A mysterious creature...",
"abilities": ["invisibility", "healing"]
}
}
}{
"task_type": "translation",
"translation": {
"dataset": {
"source": "huggingface",
"path": "limloop/ru_en_story_pairs",
"split": "train",
"fields": {
"text": "text_ru"
},
"limit": 1000
},
"target_language": "english",
"threads": 4,
"prompt_template": {
"system": "You are a professional translator. Preserve style and meaning.",
"user": "Translate to {target_language}:\n{original_text}"
}
}
}{
"task_type": "translation",
"translation": {
"dataset": {
"source": "local",
"path": "data/sentences.json",
"fields": {
"id": "sentence_id",
"text": "content"
}
},
"target_language": "spanish",
"checkpoint_file": "spanish_progress.json"
}
}{
"theme": "Solving a logic puzzle",
"dialog": [
"We need to cross the river with a wolf, goat, and cabbage...",
"Let's think this through. What happens if we leave the wolf with the goat?",
"The wolf will eat the goat! So we can't leave them unattended.",
"Exactly. Now let's plan the sequence of crossings..."
],
"language": "en",
"temperature": 0.65,
"timestamp": 1234567890,
"worker_id": 1
}{
"id": 42,
"original_text": "The quick brown fox jumps over the lazy dog",
"translated_text": "Le renard brun rapide saute par-dessus le chien paresseux",
"target_language": "french",
"temperature": 0.3,
"timestamp": 1234567890,
"worker_id": 2
}universal_dialog_generator/
├── config/ # Configuration management
│ └── config_manager.py
├── core/ # Core components
│ ├── api_client.py # API client
│ ├── dataset_loader.py # Dataset loading
│ ├── prompt_engine.py # Prompt generation
│ ├── task_manager.py # Task management (translation)
│ ├── theme_generator.py # Theme generation
│ └── validator.py # Data validation
├── storage/ # Thread-safe writing
│ └── thread_safe_writer.py
├── workers/ # Multi-threaded processing
│ ├── thread_pool.py
│ ├── worker_thread.py # For dialogues
│ └── translation_worker.py # For translation
├── scripts/ # Helper utilities
│ └── dialog_cleaner.py # Dialogue cleaning
├── main.py # Entry point
├── config.json # Configuration
└── requirements.txt # Dependencies
- Add theme templates to
prompt_templates.templates - Extend word banks in
prompt_templates.words - Update base prompt in
prompt_templates.base
{
"output_schema": {
"fields": ["field1", "field2", "field3"],
"example": {
"field1": "value1",
"field2": "value2",
"field3": ["array", "of", "values"]
}
}
}Important: Schema must be flat (no nested objects). Arrays are supported.
To work through a proxy server, add to config:
{
"api": {
"proxy": "http://127.0.0.1:8118"
}
}Supported formats:
http://host:porthttps://host:portsocks5://host:port
For models that support reasoning (e.g., OpenAI o1), enable:
{
"api": {
"enable_reasoning": true
}
}- On interrupt (Ctrl+C), system saves statistics
- On restart, new themes are generated
- Automatic progress saving to
translation_progress.json - Resumes from where it left off on restart
- Failed tasks are retried up to
max_retriestimes - Checkpoint contains processed and failed task IDs
Empty output:
- Check API key and URL
- Ensure model is accessible
- Check API quotas
Validation errors:
- Verify
output_schemastructure - Ensure prompt returns valid JSON
- For translation: check API response format
Low performance:
- Increase
threadsin configuration - Check network latency to API
- Reduce
request_delayfor dialogues
Dataset loading errors (translation):
- For HF: install
pip install datasets - For local files: check path and format (JSON/JSONL)
Connection issues through proxy:
- Verify the proxy URL in
api.proxyfield - Ensure the proxy server is available
- Check format:
http://host:port,https://host:port, orsocks5://host:port
The scripts/ folder contains helper utilities:
- 🧹 Dialog Cleaner - cleans dialogues from generation artifacts (Chinese characters, typos, etc.)
- Detailed documentation: scripts/dialog_cleaner.md