feat: support tui

This commit is contained in:
voocel
2026-03-08 12:02:46 +08:00
parent 2445560465
commit 75bdda1fe3
13 changed files with 1435 additions and 152 deletions

View File

@@ -10,6 +10,7 @@ type Config struct {
Prompt string // 用户的小说需求
NovelName string // 小说名(用作输出目录名)
OutputDir string // 输出根目录,默认 output/{NovelName}
Provider string // LLM 提供商openai / anthropic / gemini
ModelName string // LLM 模型名
APIKey string // API Key
BaseURL string // API Base URL可选
@@ -25,17 +26,34 @@ type Prompts struct {
Editor string
}
// Validate 校验配置。
// Validate 校验配置CLI 模式,要求 Prompt 非空)
func (c *Config) Validate() error {
if c.Prompt == "" {
return fmt.Errorf("prompt is required")
}
return c.ValidateBase()
}
// ValidateBase 校验基础配置TUI 模式下 Prompt 由用户输入,不在此检查)。
func (c *Config) ValidateBase() error {
if c.APIKey == "" {
return fmt.Errorf("api key is required (set OPENAI_API_KEY)")
return fmt.Errorf("api key is required (set OPENAI_API_KEY or ANTHROPIC_API_KEY)")
}
switch c.Provider {
case "openai", "anthropic", "gemini":
default:
return fmt.Errorf("unsupported provider %q (use openai/anthropic/gemini)", c.Provider)
}
return nil
}
// 各 provider 的默认模型名。
var defaultModels = map[string]string{
"openai": "gpt-4o",
"anthropic": "claude-sonnet-4-20250514",
"gemini": "gemini-2.5-pro",
}
// FillDefaults 填充默认值。
func (c *Config) FillDefaults() {
if c.NovelName == "" {
@@ -44,8 +62,11 @@ func (c *Config) FillDefaults() {
if c.OutputDir == "" {
c.OutputDir = filepath.Join("output", c.NovelName)
}
if c.Provider == "" {
c.Provider = "openai"
}
if c.ModelName == "" {
c.ModelName = "gpt-4o"
c.ModelName = defaultModels[c.Provider]
}
if c.Style == "" {
c.Style = "default"