feat: support tui
This commit is contained in:
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user