mirror of
https://github.com/Direct-Dev-Ru/go-lcg.git
synced 2025-11-16 01:29:55 +00:00
alpha v.2
This commit is contained in:
124
gpt/builtin_prompts.go
Normal file
124
gpt/builtin_prompts.go
Normal file
@@ -0,0 +1,124 @@
|
||||
package gpt
|
||||
|
||||
import (
|
||||
_ "embed"
|
||||
|
||||
"gopkg.in/yaml.v3"
|
||||
)
|
||||
|
||||
//go:embed builtin_prompts.yaml
|
||||
var builtinPromptsYAML string
|
||||
|
||||
var builtinPrompts string
|
||||
|
||||
// BuiltinPromptsData структура для YAML файла
|
||||
type BuiltinPromptsData struct {
|
||||
Prompts []BuiltinPrompt `yaml:"prompts"`
|
||||
}
|
||||
|
||||
// BuiltinPrompt структура для встроенных промптов с поддержкой языков
|
||||
type BuiltinPrompt struct {
|
||||
ID int `yaml:"id"`
|
||||
Name string `yaml:"name"`
|
||||
Description map[string]string `yaml:"description"`
|
||||
Content map[string]string `yaml:"content"`
|
||||
}
|
||||
|
||||
// ToSystemPrompt конвертирует BuiltinPrompt в SystemPrompt для указанного языка
|
||||
func (bp *BuiltinPrompt) ToSystemPrompt(lang string) SystemPrompt {
|
||||
// Если язык не найден, используем английский по умолчанию
|
||||
if _, exists := bp.Description[lang]; !exists {
|
||||
lang = "en"
|
||||
}
|
||||
|
||||
return SystemPrompt{
|
||||
ID: bp.ID,
|
||||
Name: bp.Name,
|
||||
Description: bp.Description[lang],
|
||||
Content: bp.Content[lang],
|
||||
}
|
||||
}
|
||||
|
||||
// GetBuiltinPrompts возвращает встроенные промпты из YAML (по умолчанию английские)
|
||||
func GetBuiltinPrompts() []SystemPrompt {
|
||||
return GetBuiltinPromptsByLanguage("en")
|
||||
}
|
||||
|
||||
// GetBuiltinPromptsByLanguage возвращает встроенные промпты для указанного языка
|
||||
func GetBuiltinPromptsByLanguage(lang string) []SystemPrompt {
|
||||
var data BuiltinPromptsData
|
||||
if err := yaml.Unmarshal([]byte(builtinPrompts), &data); err != nil {
|
||||
// В случае ошибки возвращаем пустой массив
|
||||
return []SystemPrompt{}
|
||||
}
|
||||
|
||||
var result []SystemPrompt
|
||||
for _, prompt := range data.Prompts {
|
||||
result = append(result, prompt.ToSystemPrompt(lang))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// IsBuiltinPrompt проверяет, является ли промпт встроенным
|
||||
func IsBuiltinPrompt(prompt SystemPrompt) bool {
|
||||
// Проверяем английскую версию
|
||||
englishPrompts := GetBuiltinPromptsByLanguage("en")
|
||||
for _, builtin := range englishPrompts {
|
||||
if builtin.ID == prompt.ID {
|
||||
if builtin.Content == prompt.Content &&
|
||||
builtin.Name == prompt.Name &&
|
||||
builtin.Description == prompt.Description {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Проверяем русскую версию
|
||||
russianPrompts := GetBuiltinPromptsByLanguage("ru")
|
||||
for _, builtin := range russianPrompts {
|
||||
if builtin.ID == prompt.ID {
|
||||
if builtin.Content == prompt.Content &&
|
||||
builtin.Name == prompt.Name &&
|
||||
builtin.Description == prompt.Description {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// GetBuiltinPromptByID возвращает встроенный промпт по ID (английская версия)
|
||||
func GetBuiltinPromptByID(id int) *SystemPrompt {
|
||||
builtinPrompts := GetBuiltinPrompts()
|
||||
|
||||
for _, prompt := range builtinPrompts {
|
||||
if prompt.ID == id {
|
||||
return &prompt
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetBuiltinPromptByIDAndLanguage возвращает встроенный промпт по ID и языку
|
||||
func GetBuiltinPromptByIDAndLanguage(id int, lang string) *SystemPrompt {
|
||||
builtinPrompts := GetBuiltinPromptsByLanguage(lang)
|
||||
|
||||
for _, prompt := range builtinPrompts {
|
||||
if prompt.ID == id {
|
||||
return &prompt
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func InitBuiltinPrompts(embeddedBuiltinPromptsYAML string) {
|
||||
// Используем встроенный YAML, если переданный параметр пустой
|
||||
if embeddedBuiltinPromptsYAML == "" {
|
||||
builtinPrompts = builtinPromptsYAML
|
||||
} else {
|
||||
builtinPrompts = embeddedBuiltinPromptsYAML
|
||||
}
|
||||
}
|
||||
262
gpt/builtin_prompts.yaml
Normal file
262
gpt/builtin_prompts.yaml
Normal file
@@ -0,0 +1,262 @@
|
||||
prompts:
|
||||
- id: 1
|
||||
name: "linux-command"
|
||||
description:
|
||||
en: "Main prompt for generating Linux commands"
|
||||
ru: "Основной промпт для генерации Linux команд"
|
||||
content:
|
||||
en: |
|
||||
You are a Linux command line expert.
|
||||
Analyze the user's task, given in natural language, and suggest
|
||||
a Linux command that will help accomplish this task, and provide a detailed explanation of what it does,
|
||||
its parameters and possible use cases.
|
||||
Focus on practical examples and best practices.
|
||||
In the response, you should only provide the commands or sequence of commands ready to copy and execute
|
||||
in the command line without any explanationformatting or code blocks, without ```bash``` or ```sh```, ` or ``` symbols.
|
||||
|
||||
ru: |
|
||||
Вы эксперт по Linux командам и командной строке.
|
||||
Проанализируйте задачу пользователя на естественном языке и предложите Linux команду или набор команд, которые помогут выполнить эту задачу, и предоставьте подробное объяснение того, что она делает, её параметры и возможные случаи использования.
|
||||
Сосредоточьтесь на практических примерах и лучших практиках.
|
||||
В ответе должна присутствовать только команда или последовательность команд,
|
||||
готовая к копированию и выполнению в командной строке
|
||||
без объяснений, выделений и форматирования наподобие ```bash``` или ```sh```, без символов ` или ```.
|
||||
|
||||
- id: 2
|
||||
name: "linux-command-with-explanation"
|
||||
description:
|
||||
en: "Prompt with detailed command explanation"
|
||||
ru: "Промпт с подробным объяснением команд"
|
||||
content:
|
||||
en: |
|
||||
You are a Linux system administrator with extensive experience.
|
||||
Generate Linux commands based on user task descriptions and provide comprehensive explanations.
|
||||
|
||||
Provide a detailed analysis including:
|
||||
1. **Generated Command**: The Linux command that accomplishes the task
|
||||
2. **Command Breakdown**: Explain each part of the command
|
||||
3. **Parameters**: Explain each flag and option used
|
||||
4. **Examples**: Show practical usage scenarios
|
||||
5. **Security**: Highlight any security considerations
|
||||
6. **Alternatives**: Suggest similar commands if applicable
|
||||
7. **Best Practices**: Recommend optimal usage
|
||||
|
||||
Use clear formatting with headers and bullet points for readability.
|
||||
ru: |
|
||||
Вы системный администратор Linux с обширным опытом.
|
||||
Генерируйте Linux команды на основе описаний задач пользователей и предоставляйте исчерпывающие объяснения.
|
||||
|
||||
Предоставьте подробный анализ, включая:
|
||||
1. **Сгенерированная команда**: Linux команда, которая выполняет задачу
|
||||
2. **Разбор команды**: Объясните каждую часть команды
|
||||
3. **Параметры**: Объясните каждый используемый флаг и опцию
|
||||
4. **Примеры**: Покажите практические сценарии использования
|
||||
5. **Безопасность**: Выделите любые соображения безопасности
|
||||
6. **Альтернативы**: Предложите похожие команды, если применимо
|
||||
7. **Лучшие практики**: Рекомендуйте оптимальное использование
|
||||
|
||||
Используйте четкое форматирование с заголовками и маркерами для читаемости.
|
||||
|
||||
- id: 3
|
||||
name: "linux-command-safe"
|
||||
description:
|
||||
en: "Safe command analysis with warnings"
|
||||
ru: "Безопасный анализ команд с предупреждениями"
|
||||
content:
|
||||
en: |
|
||||
You are a Linux security expert. Generate safe Linux commands based on user task descriptions with a focus on safety and security implications.
|
||||
|
||||
Provide a security-focused analysis:
|
||||
1. **Generated Safe Command**: The secure Linux command for the task
|
||||
2. **Safety Assessment**: Why this command is safe to run
|
||||
3. **Potential Risks**: What could go wrong and how to mitigate
|
||||
4. **Data Impact**: What files or data might be affected
|
||||
5. **Permissions**: What permissions are required
|
||||
6. **Recovery**: How to undo changes if needed
|
||||
7. **Best Practices**: Safe alternatives or precautions
|
||||
8. **Warnings**: Critical safety considerations
|
||||
|
||||
Always prioritize user safety and data protection.
|
||||
ru: |
|
||||
Вы эксперт по безопасности Linux. Генерируйте безопасные Linux команды на основе описаний задач пользователей с акцентом на безопасность и последствия для безопасности.
|
||||
|
||||
Предоставьте анализ, ориентированный на безопасность:
|
||||
1. **Сгенерированная безопасная команда**: Безопасная Linux команда для задачи
|
||||
2. **Оценка безопасности**: Почему эта команда безопасна для выполнения
|
||||
3. **Потенциальные риски**: Что может пойти не так и как это смягчить
|
||||
4. **Воздействие на данные**: Какие файлы или данные могут быть затронуты
|
||||
5. **Разрешения**: Какие разрешения требуются
|
||||
6. **Восстановление**: Как отменить изменения при необходимости
|
||||
7. **Лучшие практики**: Безопасные альтернативы или меры предосторожности
|
||||
8. **Предупреждения**: Критические соображения безопасности
|
||||
|
||||
Всегда приоритизируйте безопасность пользователя и защиту данных.
|
||||
|
||||
- id: 4
|
||||
name: "linux-command-verbose"
|
||||
description:
|
||||
en: "Detailed analysis with technical details"
|
||||
ru: "Подробный анализ с техническими деталями"
|
||||
content:
|
||||
en: |
|
||||
You are a Linux kernel and system expert. Generate Linux commands based on user task descriptions and provide an in-depth technical analysis.
|
||||
|
||||
Deliver a comprehensive technical breakdown:
|
||||
1. **Generated Command**: The Linux command that accomplishes the task
|
||||
2. **System Level**: How the command interacts with the kernel
|
||||
3. **Process Flow**: Step-by-step execution details
|
||||
4. **Resource Usage**: CPU, memory, I/O implications
|
||||
5. **File System**: Impact on files and directories
|
||||
6. **Network**: Network operations if applicable
|
||||
7. **Performance**: Optimization considerations
|
||||
8. **Debugging**: Troubleshooting approaches
|
||||
9. **Advanced Usage**: Expert-level techniques
|
||||
|
||||
Include technical details, system calls, and low-level operations.
|
||||
ru: |
|
||||
Вы эксперт по ядру Linux и системам. Генерируйте Linux команды на основе описаний задач пользователей и предоставляйте глубокий технический анализ.
|
||||
|
||||
Предоставьте исчерпывающий технический разбор:
|
||||
1. **Сгенерированная команда**: Linux команда, которая выполняет задачу
|
||||
2. **Системный уровень**: Как команда взаимодействует с ядром
|
||||
3. **Поток выполнения**: Детали пошагового выполнения
|
||||
4. **Использование ресурсов**: Последствия для CPU, памяти, I/O
|
||||
5. **Файловая система**: Воздействие на файлы и каталоги
|
||||
6. **Сеть**: Сетевые операции, если применимо
|
||||
7. **Производительность**: Соображения по оптимизации
|
||||
8. **Отладка**: Подходы к устранению неполадок
|
||||
9. **Продвинутое использование**: Техники экспертного уровня
|
||||
|
||||
Включите технические детали, системные вызовы и низкоуровневые операции.
|
||||
|
||||
- id: 5
|
||||
name: "linux-command-simple"
|
||||
description:
|
||||
en: "Simple and clear explanation"
|
||||
ru: "Простое и понятное объяснение"
|
||||
content:
|
||||
en: |
|
||||
You are a friendly Linux mentor. Explain the given command in simple, easy-to-understand terms.
|
||||
|
||||
Command: {{.command}}
|
||||
|
||||
Provide a beginner-friendly explanation:
|
||||
1. **What it does**: Simple, clear description
|
||||
2. **Why use it**: Common reasons to use this command
|
||||
3. **Basic example**: Simple usage example
|
||||
4. **What to expect**: Expected output or behavior
|
||||
5. **Tips**: Helpful hints for beginners
|
||||
|
||||
Use plain language, avoid jargon, and focus on practical understanding.
|
||||
ru: |
|
||||
Вы дружелюбный наставник по Linux. Объясните данную команду простыми, понятными терминами.
|
||||
|
||||
Команда: {{.command}}
|
||||
|
||||
Предоставьте объяснение, подходящее для начинающих:
|
||||
1. **Что она делает**: Простое, четкое описание
|
||||
2. **Зачем использовать**: Общие причины использования этой команды
|
||||
3. **Базовый пример**: Простой пример использования
|
||||
4. **Что ожидать**: Ожидаемый вывод или поведение
|
||||
5. **Советы**: Полезные подсказки для начинающих
|
||||
|
||||
Используйте простой язык, избегайте жаргона и сосредоточьтесь на практическом понимании.
|
||||
|
||||
- id: 6
|
||||
name: "verbose-v"
|
||||
description:
|
||||
en: "Prompt for v mode (basic explanation)"
|
||||
ru: "Промпт для режима v (базовое объяснение)"
|
||||
content:
|
||||
en: |
|
||||
You are a Linux command expert. You can provide a clear and concise explanation of the given Linux command.
|
||||
Your explanation should include:
|
||||
1. What this command does for the task
|
||||
2. Main parameters and their purpose
|
||||
3. Common use cases
|
||||
4. Any important warnings or considerations
|
||||
ru: |
|
||||
Вы эксперт по Linux командам. Вы можете предоставьте четкое и краткое объяснение заданной Linux команды.
|
||||
Ваши краткие объяснения должны включать:
|
||||
1. Что делает эта команда
|
||||
2. Основные параметры и их назначение
|
||||
3. Общие случаи использования
|
||||
4. Любые важные предупреждения или соображения
|
||||
|
||||
- id: 7
|
||||
name: "verbose-vv"
|
||||
description:
|
||||
en: "Prompt for vv mode (detailed explanation)"
|
||||
ru: "Промпт для режима vv (подробное объяснение)"
|
||||
content:
|
||||
en: |
|
||||
You are a Linux system expert. Provide a detailed technical explanation of the given command.
|
||||
|
||||
Provide a comprehensive analysis:
|
||||
1. **Command Purpose**: What it accomplishes
|
||||
2. **Syntax Breakdown**: Detailed parameter analysis
|
||||
3. **Technical Details**: How it works internally
|
||||
4. **Use Cases**: Practical scenarios and examples
|
||||
5. **Performance Impact**: Resource usage and optimization
|
||||
6. **Security Considerations**: Potential risks and mitigations
|
||||
7. **Advanced Usage**: Expert techniques and tips
|
||||
8. **Troubleshooting**: Common issues and solutions
|
||||
|
||||
Include technical depth while maintaining clarity.
|
||||
ru: |
|
||||
Вы эксперт по Linux системам. Предоставьте подробное техническое объяснение заданной команды.
|
||||
|
||||
Предоставьте исчерпывающий анализ:
|
||||
1. **Цель команды**: Что она достигает
|
||||
2. **Разбор синтаксиса**: Подробный анализ параметров
|
||||
3. **Технические детали**: Как она работает внутренне
|
||||
4. **Случаи использования**: Практические сценарии и примеры
|
||||
5. **Влияние на производительность**: Использование ресурсов и оптимизация
|
||||
6. **Соображения безопасности**: Потенциальные риски и меры по их снижению
|
||||
7. **Продвинутое использование**: Экспертные техники и советы
|
||||
8. **Устранение неполадок**: Общие проблемы и решения
|
||||
|
||||
Включите техническую глубину, сохраняя ясность.
|
||||
|
||||
- id: 8
|
||||
name: "verbose-vvv"
|
||||
description:
|
||||
en: "Prompt for vvv mode (maximum detailed explanation)"
|
||||
ru: "Промпт для режима vvv (максимально подробное объяснение)"
|
||||
content:
|
||||
en: |
|
||||
You are a Linux kernel and system architecture expert. Provide an exhaustive technical analysis of the given command.
|
||||
|
||||
Deliver a comprehensive technical deep-dive:
|
||||
1. **System Architecture**: How it fits into the Linux ecosystem
|
||||
2. **Kernel Interaction**: System calls and kernel operations
|
||||
3. **Process Management**: Process creation, scheduling, and lifecycle
|
||||
4. **Memory Management**: Memory allocation and management
|
||||
5. **File System Operations**: I/O operations and file system impact
|
||||
6. **Network Stack**: Network operations and protocols
|
||||
7. **Security Model**: Permissions, capabilities, and security implications
|
||||
8. **Performance Analysis**: CPU, memory, I/O, and network impact
|
||||
9. **Debugging and Profiling**: Advanced troubleshooting techniques
|
||||
10. **Source Code Analysis**: Key implementation details
|
||||
11. **Alternative Implementations**: Different approaches and trade-offs
|
||||
12. **Historical Context**: Evolution and development history
|
||||
|
||||
Provide maximum technical depth with system-level insights, code examples, and architectural understanding.
|
||||
ru: |
|
||||
Вы эксперт по ядру Linux и системной архитектуре. Предоставьте исчерпывающий технический анализ заданной команды.
|
||||
|
||||
Предоставьте исчерпывающий технический глубокий анализ:
|
||||
1. **Системная архитектура**: Как она вписывается в экосистему Linux
|
||||
2. **Взаимодействие с ядром**: Системные вызовы и операции ядра
|
||||
3. **Управление процессами**: Создание, планирование и жизненный цикл процессов
|
||||
4. **Управление памятью**: Выделение и управление памятью
|
||||
5. **Операции файловой системы**: I/O операции и воздействие на файловую систему
|
||||
6. **Сетевой стек**: Сетевые операции и протоколы
|
||||
7. **Модель безопасности**: Разрешения, возможности и последствия безопасности
|
||||
8. **Анализ производительности**: Воздействие на CPU, память, I/O и сеть
|
||||
9. **Отладка и профилирование**: Продвинутые техники устранения неполадок
|
||||
10. **Анализ исходного кода**: Ключевые детали реализации
|
||||
11. **Альтернативные реализации**: Разные подходы и компромиссы
|
||||
12. **Исторический контекст**: Эволюция и история разработки
|
||||
|
||||
Предоставьте максимальную техническую глубину с системными инсайтами, примерами кода и архитектурным пониманием.
|
||||
230
gpt/prompts.go
230
gpt/prompts.go
@@ -6,6 +6,8 @@ import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"github.com/direct-dev-ru/linux-command-gpt/config"
|
||||
)
|
||||
|
||||
// SystemPrompt представляет системный промпт
|
||||
@@ -21,28 +23,50 @@ type PromptManager struct {
|
||||
Prompts []SystemPrompt
|
||||
ConfigFile string
|
||||
HomeDir string
|
||||
Language string // Текущий язык для файла sys_prompts (en/ru)
|
||||
}
|
||||
|
||||
// NewPromptManager создает новый менеджер промптов
|
||||
func NewPromptManager(homeDir string) *PromptManager {
|
||||
configFile := filepath.Join(homeDir, ".lcg_prompts.json")
|
||||
// Используем конфигурацию из модуля config
|
||||
promptFolder := config.AppConfig.PromptFolder
|
||||
|
||||
// Путь к файлу sys_prompts
|
||||
sysPromptsFile := filepath.Join(promptFolder, "sys_prompts")
|
||||
|
||||
pm := &PromptManager{
|
||||
ConfigFile: configFile,
|
||||
ConfigFile: sysPromptsFile,
|
||||
HomeDir: homeDir,
|
||||
}
|
||||
|
||||
// Загружаем предустановленные промпты
|
||||
pm.loadDefaultPrompts()
|
||||
// Проверяем, существует ли файл sys_prompts
|
||||
if _, err := os.Stat(sysPromptsFile); os.IsNotExist(err) {
|
||||
// Если файла нет, создаем его с системными промптами и промптами подробности
|
||||
pm.createInitialPromptsFile()
|
||||
}
|
||||
|
||||
// Загружаем пользовательские промпты
|
||||
pm.loadCustomPrompts()
|
||||
// Загружаем все промпты из файла
|
||||
pm.loadAllPrompts()
|
||||
|
||||
return pm
|
||||
}
|
||||
|
||||
// createInitialPromptsFile создает начальный файл с системными промптами и промптами подробности
|
||||
func (pm *PromptManager) createInitialPromptsFile() {
|
||||
// Загружаем все встроенные промпты из YAML (английские по умолчанию)
|
||||
pm.Prompts = GetBuiltinPrompts()
|
||||
|
||||
// Фикс: при первичном сохранении явно выставляем язык файла
|
||||
if pm.Language == "" {
|
||||
pm.Language = "en"
|
||||
}
|
||||
|
||||
// Сохраняем все промпты в файл
|
||||
pm.saveAllPrompts()
|
||||
}
|
||||
|
||||
// loadDefaultPrompts загружает предустановленные промпты
|
||||
func (pm *PromptManager) loadDefaultPrompts() {
|
||||
func (pm *PromptManager) LoadDefaultPrompts() {
|
||||
defaultPrompts := []SystemPrompt{
|
||||
{
|
||||
ID: 1,
|
||||
@@ -79,8 +103,8 @@ func (pm *PromptManager) loadDefaultPrompts() {
|
||||
pm.Prompts = defaultPrompts
|
||||
}
|
||||
|
||||
// loadCustomPrompts загружает пользовательские промпты из файла
|
||||
func (pm *PromptManager) loadCustomPrompts() {
|
||||
// loadAllPrompts загружает все промпты из файла sys_prompts
|
||||
func (pm *PromptManager) loadAllPrompts() {
|
||||
if _, err := os.Stat(pm.ConfigFile); os.IsNotExist(err) {
|
||||
return
|
||||
}
|
||||
@@ -90,18 +114,60 @@ func (pm *PromptManager) loadCustomPrompts() {
|
||||
return
|
||||
}
|
||||
|
||||
var customPrompts []SystemPrompt
|
||||
if err := json.Unmarshal(data, &customPrompts); err != nil {
|
||||
// Новый формат: объект с полями language и prompts
|
||||
var pf promptsFile
|
||||
if err := json.Unmarshal(data, &pf); err == nil && len(pf.Prompts) > 0 {
|
||||
pm.Language = pf.Language
|
||||
pm.Prompts = pf.Prompts
|
||||
return
|
||||
}
|
||||
|
||||
// Добавляем пользовательские промпты с новыми ID
|
||||
for i, prompt := range customPrompts {
|
||||
prompt.ID = len(pm.Prompts) + i + 1
|
||||
pm.Prompts = append(pm.Prompts, prompt)
|
||||
// Старый формат: просто массив промптов
|
||||
var prompts []SystemPrompt
|
||||
if err := json.Unmarshal(data, &prompts); err == nil {
|
||||
pm.Prompts = prompts
|
||||
pm.Language = "en"
|
||||
// Миграция в новый формат при следующем сохранении
|
||||
}
|
||||
}
|
||||
|
||||
// saveAllPrompts сохраняет все промпты в файл sys_prompts
|
||||
// внутренний формат хранения файла sys_prompts
|
||||
type promptsFile struct {
|
||||
Language string `json:"language,omitempty"`
|
||||
Prompts []SystemPrompt `json:"prompts"`
|
||||
}
|
||||
|
||||
func (pm *PromptManager) saveAllPrompts() error {
|
||||
pf := promptsFile{
|
||||
Language: pm.Language,
|
||||
Prompts: pm.Prompts,
|
||||
}
|
||||
data, err := json.MarshalIndent(pf, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return os.WriteFile(pm.ConfigFile, data, 0644)
|
||||
}
|
||||
|
||||
// SaveAllPrompts экспортированная версия saveAllPrompts
|
||||
func (pm *PromptManager) SaveAllPrompts() error {
|
||||
return pm.saveAllPrompts()
|
||||
}
|
||||
|
||||
// GetCurrentLanguage возвращает текущий язык из файла промптов
|
||||
func (pm *PromptManager) GetCurrentLanguage() string {
|
||||
if pm.Language == "" {
|
||||
return "en"
|
||||
}
|
||||
return pm.Language
|
||||
}
|
||||
|
||||
// SetLanguage устанавливает язык для всех промптов
|
||||
func (pm *PromptManager) SetLanguage(lang string) {
|
||||
pm.Language = lang
|
||||
}
|
||||
|
||||
// saveCustomPrompts сохраняет пользовательские промпты
|
||||
func (pm *PromptManager) saveCustomPrompts() error {
|
||||
// Находим пользовательские промпты (ID > 5)
|
||||
@@ -140,24 +206,136 @@ func (pm *PromptManager) GetPromptByName(name string) (*SystemPrompt, error) {
|
||||
return nil, fmt.Errorf("промпт с именем '%s' не найден", name)
|
||||
}
|
||||
|
||||
// AddPrompt добавляет новый промпт
|
||||
func (pm *PromptManager) AddPrompt(name, description, content string) error {
|
||||
// Находим максимальный ID
|
||||
maxID := 0
|
||||
for _, prompt := range pm.Prompts {
|
||||
if prompt.ID > maxID {
|
||||
maxID = prompt.ID
|
||||
}
|
||||
}
|
||||
|
||||
newPrompt := SystemPrompt{
|
||||
ID: maxID + 1,
|
||||
Name: name,
|
||||
Description: description,
|
||||
Content: content,
|
||||
}
|
||||
|
||||
pm.Prompts = append(pm.Prompts, newPrompt)
|
||||
return pm.saveAllPrompts()
|
||||
}
|
||||
|
||||
// UpdatePrompt обновляет существующий промпт
|
||||
func (pm *PromptManager) UpdatePrompt(id int, name, description, content string) error {
|
||||
for i, prompt := range pm.Prompts {
|
||||
if prompt.ID == id {
|
||||
pm.Prompts[i].Name = name
|
||||
pm.Prompts[i].Description = description
|
||||
pm.Prompts[i].Content = content
|
||||
return pm.saveAllPrompts()
|
||||
}
|
||||
}
|
||||
return fmt.Errorf("промпт с ID %d не найден", id)
|
||||
}
|
||||
|
||||
// DeletePrompt удаляет промпт по ID
|
||||
func (pm *PromptManager) DeletePrompt(id int) error {
|
||||
for i, prompt := range pm.Prompts {
|
||||
if prompt.ID == id {
|
||||
pm.Prompts = append(pm.Prompts[:i], pm.Prompts[i+1:]...)
|
||||
return pm.saveAllPrompts()
|
||||
}
|
||||
}
|
||||
return fmt.Errorf("промпт с ID %d не найден", id)
|
||||
}
|
||||
|
||||
// ListPrompts выводит список всех доступных промптов
|
||||
func (pm *PromptManager) ListPrompts() {
|
||||
fmt.Println("Available system prompts:")
|
||||
fmt.Println("ID | Name | Description")
|
||||
fmt.Println("---+---------------------------+--------------------------------")
|
||||
pm.ListPromptsWithFull(false)
|
||||
}
|
||||
|
||||
for _, prompt := range pm.Prompts {
|
||||
description := prompt.Description
|
||||
if len(description) > 80 {
|
||||
description = description[:77] + "..."
|
||||
// ListPromptsWithFull выводит список промптов с опцией полного вывода
|
||||
func (pm *PromptManager) ListPromptsWithFull(full bool) {
|
||||
fmt.Println("📝 Доступные системные промпты:")
|
||||
fmt.Println()
|
||||
|
||||
for i, prompt := range pm.Prompts {
|
||||
// Разделитель между промптами
|
||||
if i > 0 {
|
||||
fmt.Println("─" + strings.Repeat("─", 60))
|
||||
}
|
||||
fmt.Printf("%-2d | %-25s | %s\n",
|
||||
prompt.ID,
|
||||
truncateString(prompt.Name, 25),
|
||||
description)
|
||||
|
||||
// Проверяем, является ли промпт встроенным и неизмененным
|
||||
isDefault := pm.isDefaultPrompt(prompt)
|
||||
|
||||
// Заголовок промпта
|
||||
if isDefault {
|
||||
fmt.Printf("🔹 ID: %d | Название: %s | Встроенный\n", prompt.ID, prompt.Name)
|
||||
} else {
|
||||
fmt.Printf("🔹 ID: %d | Название: %s\n", prompt.ID, prompt.Name)
|
||||
}
|
||||
|
||||
// Описание
|
||||
if prompt.Description != "" {
|
||||
fmt.Printf("📋 Описание: %s\n", prompt.Description)
|
||||
}
|
||||
|
||||
// Содержимое промпта
|
||||
fmt.Println("📄 Содержимое:")
|
||||
fmt.Println("┌" + strings.Repeat("─", 58) + "┐")
|
||||
|
||||
// Разбиваем содержимое на строки и выводим с отступами
|
||||
lines := strings.Split(prompt.Content, "\n")
|
||||
for _, line := range lines {
|
||||
if full {
|
||||
// Полный вывод без обрезки - разбиваем длинные строки
|
||||
if len(line) > 56 {
|
||||
// Разбиваем длинную строку на части
|
||||
for i := 0; i < len(line); i += 56 {
|
||||
end := i + 56
|
||||
if end > len(line) {
|
||||
end = len(line)
|
||||
}
|
||||
fmt.Printf("│ %-56s │\n", line[i:end])
|
||||
}
|
||||
} else {
|
||||
fmt.Printf("│ %-56s │\n", line)
|
||||
}
|
||||
} else {
|
||||
// Обычный вывод с обрезкой
|
||||
fmt.Printf("│ %-56s │\n", truncateString(line, 56))
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Println("└" + strings.Repeat("─", 58) + "┘")
|
||||
fmt.Println()
|
||||
}
|
||||
}
|
||||
|
||||
// isDefaultPrompt проверяет, является ли промпт встроенным и неизмененным
|
||||
func (pm *PromptManager) isDefaultPrompt(prompt SystemPrompt) bool {
|
||||
// Используем новую функцию из builtin_prompts.go
|
||||
return IsBuiltinPrompt(prompt)
|
||||
}
|
||||
|
||||
// IsDefaultPromptByID проверяет, является ли промпт встроенным только по ID (игнорирует содержимое)
|
||||
func (pm *PromptManager) IsDefaultPromptByID(prompt SystemPrompt) bool {
|
||||
// Проверяем, что ID находится в диапазоне встроенных промптов (1-8)
|
||||
return prompt.ID >= 1 && prompt.ID <= 8
|
||||
}
|
||||
|
||||
// GetRussianDefaultPrompts возвращает русские версии встроенных промптов
|
||||
func GetRussianDefaultPrompts() []SystemPrompt {
|
||||
return GetBuiltinPromptsByLanguage("ru")
|
||||
}
|
||||
|
||||
// getDefaultPrompts возвращает оригинальные встроенные промпты
|
||||
func (pm *PromptManager) GetDefaultPrompts() []SystemPrompt {
|
||||
return GetBuiltinPrompts()
|
||||
}
|
||||
|
||||
// AddCustomPrompt добавляет новый пользовательский промпт
|
||||
func (pm *PromptManager) AddCustomPrompt(name, description, content string) error {
|
||||
// Проверяем, что имя уникально
|
||||
|
||||
Reference in New Issue
Block a user