bootstrap

package
v0.7.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 2, 2026 License: Apache-2.0 Imports: 21 Imported by: 0

Documentation

Index

Constants

View Source
const CompactRatio = 0.85

CompactRatio 触发上下文压缩的相对阈值:tokens >= window * CompactRatio 时压缩。 0.85 是经验值,给"下一轮 prompt + 大工具结果"留 15% 头部空间,同时让大窗口 模型也能在 85% 主动压缩,避免在 1M 名义窗口下吃满才压(注意力衰退区)。

压缩比例不暴露给用户配置;用户只配置每个模型的真实 context_window。

View Source
const DefaultContextWindow = 200000

DefaultContextWindow 模型未在 registry 登记时的兜底窗口大小。

View Source
const MinCompactReserve = 8000

MinCompactReserve 是 ReserveTokens 的下限。小窗口模型(如 32k 本地 qwen3:8b) 按 0.15 比例算 reserve 仅 4800,单次 commit_chapter 工具响应就能塞 5-8k, 一章正文 8-15k——会出现"压完立刻又超"。8000 兜底保证最坏场景下还有半轮缓冲。

Variables

This section is empty.

Functions

func CompactReserveTokens added in v0.4.0

func CompactReserveTokens(window int) int

CompactReserveTokens 按 CompactRatio 反算 ReserveTokens 并应用 MinCompactReserve floor:

threshold = window - reserve = window * CompactRatio
reserve   = max(MinCompactReserve, window * (1 - CompactRatio))

给 agentcore.context.Engine 的 EngineConfig.ReserveTokens 用。

func DefaultConfigDir added in v0.1.2

func DefaultConfigDir() string

DefaultConfigDir 返回 ~/.ainovel 目录路径;取不到家目录时返回空字符串。 仅用于读/写不强制存在的文件(如模型缓存),不会自动创建目录。

func DefaultConfigPath

func DefaultConfigPath() string

DefaultConfigPath 返回全局配置文件路径 ~/.ainovel/config.json。

func EffectiveConfigPath added in v0.7.3

func EffectiveConfigPath() string

EffectiveConfigPath 返回 TUI 改动(/config、/model)应写回的配置文件: 项目目录有 ./.ainovel/config.json 就写它——与读取时项目层覆盖全局的方向一致, 保证"改当前生效的那份"、改完立刻生效;否则写全局 ~/.ainovel/config.json。 仅编辑已存在的项目配置,不会凭空创建(创建项目覆盖是用户主动放文件的动作)。

func LogContextWindowChoice added in v0.4.0

func LogContextWindowChoice(role, model string, window int, source ContextWindowSource)

LogContextWindowChoice 打印某个角色的窗口决策。source=default 时发 Warn 提示 该模型未在 registry 命中(OpenRouter 也未收录),后续上下文压缩会按兜底窗口 触发——若模型实际窗口更大,可在配置文件用 context_window 显式指定,避免被提前压缩、丢史。

func ModelName added in v0.1.2

func ModelName(m agentcore.ChatModel) string

ModelName 从 ChatModel 中提取当前模型名,失败返回空字符串。 支持 SwappableModel 的热切换:调用时总是返回最新值。

func ModelProvider added in v0.7.3

func ModelProvider(m agentcore.ChatModel) string

ModelProvider 从 ChatModel 中提取当前 provider 名称,失败返回空字符串。

func NeedsSetup

func NeedsSetup() bool

NeedsSetup 检查是否需要首次引导(全局与项目级配置都不存在时触发)。

func SaveConfig

func SaveConfig(path string, cfg Config) error

SaveConfig 将配置写入指定路径(JSON 格式,缩进美化)。

func SaveProviderConfig added in v0.7.3

func SaveProviderConfig(path string, provider string, pc ProviderConfig) error

SaveProviderConfig 补丁式更新目标配置层里单个 provider 的凭证与模型库。 只动 providers 段,绝不触碰顶层 provider/model 选择——“当前用哪个”归 /model。 目标不存在时创建最小配置;目标损坏时拒绝覆盖。

func WriteStartupError added in v0.5.0

func WriteStartupError(msg string) string

WriteStartupError 把启动期致命错误追加写入 ~/.ainovel/last-error.log,并返回 该文件路径(best-effort,失败时返回空字符串)。双击启动时控制台窗口会随进程 退出立即关闭、错误一闪而过,落盘是这类用户事后追溯的唯一途径。

Types

type BudgetConfig added in v0.5.0

type BudgetConfig struct {
	BookUSD   float64 `json:"book_usd,omitempty"`   // 必填才启用;0/缺省 = 不限
	WarnRatio float64 `json:"warn_ratio,omitempty"` // 告警水位,默认 0.8
	HardStop  bool    `json:"hard_stop,omitempty"`  // true=越线立即停;默认等当前子代理任务结束
}

BudgetConfig 是用户对单本书钱包的政策声明。越线停机等同于用户在那一刻 手动 Abort——Host 只代为执行,不评估模型行为(架构 §10 合宪边界)。

func (BudgetConfig) Enabled added in v0.5.0

func (b BudgetConfig) Enabled() bool

Enabled 返回预算政策是否启用。

type Config

type Config struct {
	// 运行时字段(不序列化到 JSON)
	OutputDir string `json:"-"` // 输出根目录

	// 默认 LLM 配置
	Provider  string `json:"provider"` // 默认 provider(Providers map 中的 key)
	ModelName string `json:"model"`    // 默认模型名
	// ReasoningEffort 顶层默认推理强度(off/low/medium/high/xhigh/max),空=不覆盖(沿用模型/provider 默认)。
	// 角色未单独配置 reasoning_effort 时回落到此值。
	ReasoningEffort string `json:"reasoning_effort,omitempty"`

	// Provider 凭证库
	Providers map[string]ProviderConfig `json:"providers,omitempty"`

	// 角色级模型覆盖
	Roles map[string]RoleConfig `json:"roles,omitempty"`

	// 创作参数
	Style string `json:"style,omitempty"`

	// ContextWindow 是旧版全局上下文窗口,保留为模型专属 context_window 之后的
	// 兼容回退。仅影响压缩阈值,不改变 LLM API 实际请求长度。
	ContextWindow int `json:"context_window,omitempty"`

	// Budget 单本书的成本预算政策;book_usd > 0 才启用。
	Budget BudgetConfig `json:"budget,omitzero"`

	// Notify 无人值守告警配置;缺省启用(system 通道兜底)。
	Notify NotifyConfig `json:"notify,omitzero"`
}

Config 小说应用配置。

func CloneConfig added in v0.7.3

func CloneConfig(cfg Config) Config

CloneConfig 深拷贝配置中会在运行时修改的 map/slice,避免候选配置污染当前配置。

func LoadConfig

func LoadConfig() (Config, error)

LoadConfig 按优先级加载并合并配置:

  1. ~/.ainovel/config.json(全局)
  2. ./.ainovel/config.json(项目级覆盖)

func LoadConfigFile added in v0.0.2

func LoadConfigFile(path string) (Config, error)

LoadConfigFile 读取单个 JSON 配置文件,支持 // 行注释。 不做任何合并,仅返回该文件自身的配置。文件不存在时返回错误。

func RunSetup

func RunSetup() (Config, error)

RunSetup 运行首次引导,返回生成的配置。

func (Config) CandidateModels added in v0.0.2

func (c Config) CandidateModels(provider string) []string

CandidateModels 返回某个 provider 下可供切换的模型列表。 优先使用 provider 显式声明的 models;同时补充当前配置中已出现过的该 provider 模型。

func (*Config) DefaultProviderConfig

func (c *Config) DefaultProviderConfig() ProviderConfig

DefaultProviderConfig 返回默认 provider 的凭证配置。

func (*Config) FillDefaults

func (c *Config) FillDefaults()

FillDefaults 填充默认值。

func (Config) ModelJSONSchema added in v0.7.4

func (c Config) ModelJSONSchema(provider, model string) *bool

ModelJSONSchema 返回模型的 json_schema 三态声明;未列入 models 或未配置时 返回 nil(按 adapter 能力判断)。

func (Config) ResolveContextWindow added in v0.1.2

func (c Config) ResolveContextWindow(provider, modelName string) (int, ContextWindowSource)

ResolveContextWindow 解析上下文压缩使用的有效窗口,按优先级:

  1. providers.<provider>.models[].context_window
  2. 旧顶层 ContextWindow(兼容已有配置)
  3. models.DefaultRegistry 按模型名查询(OpenRouter 基线 + 24h 刷新)
  4. 兜底 DefaultContextWindow(自定义代理 / 未知模型)

注意:返回值仅用于压缩阈值计算,不会缩小 LLM API 真实可发请求长度。

func (Config) ResolveReasoningEffort added in v0.6.0

func (c Config) ResolveReasoningEffort(role string) string

ResolveReasoningEffort 返回某角色生效的推理强度原始串(off/low/medium/high/xhigh/max 或空)。 优先级:角色级 Roles[role].ReasoningEffort → 顶层默认 ReasoningEffort → ""(不覆盖,沿用模型/provider 默认)。 role 为空或 "default" 时直接取顶层默认。值的合法性由 agents.ParseThinkingLevel 把关。

func (*Config) ValidateBase

func (c *Config) ValidateBase() error

ValidateBase 校验基础配置。

type ContextWindowSource added in v0.1.2

type ContextWindowSource string

ContextWindowSource 标记窗口取值的来源,供日志/诊断使用。

const (
	CtxWindowModelConfig ContextWindowSource = "model_config" // provider 模型项显式指定
	CtxWindowConfig      ContextWindowSource = "config"       // 旧顶层 context_window 显式指定
	CtxWindowRegistry    ContextWindowSource = "registry"     // OpenRouter 基线命中
	CtxWindowDefault     ContextWindowSource = "default"      // 兜底(自定义代理/未知模型)
)

type FailoverEvent added in v0.1.0

type FailoverEvent struct {
	Role         string
	Reason       string
	FromProvider string
	FromModel    string
	ToProvider   string
	ToModel      string
	Err          error
}

FailoverEvent 表示一次显式 provider 切换。 Reason 为短标签(rate_limit / timeout / stream_idle / network),用于结构化日志。

type FailoverReporter added in v0.1.0

type FailoverReporter func(FailoverEvent)

FailoverReporter 在发生显式切换时被调用。

type ModelConfig added in v0.7.3

type ModelConfig struct {
	Name          string `json:"name"`
	ContextWindow int    `json:"context_window,omitempty"`
	// JSONSchema 是原生结构化输出(response_format json_schema)的三态声明:
	// 未配置=按 provider adapter 的模型级能力判断;true=用户声明该 endpoint/模型
	// 支持(请求被拒绝时原样暴露,不静默降级);false=强制走 prompt contract。
	// 自定义代理与聚合网关的能力以用户声明为准,程序不探测。
	JSONSchema *bool `json:"json_schema,omitempty"`
}

ModelConfig 描述某个 provider 下可切换的模型及其可选上下文窗口。 为兼容旧配置,既可从 JSON 字符串("model-name")读取,也可从对象读取; 写回时始终规范化为对象形式。

func (*ModelConfig) UnmarshalJSON added in v0.7.3

func (m *ModelConfig) UnmarshalJSON(data []byte) error

type ModelRef added in v0.1.0

type ModelRef struct {
	Provider string `json:"provider"` // provider 名称(Providers map 中的 key)
	Model    string `json:"model"`    // 模型名(原样透传,不做任何解析)
}

ModelRef 表示一个 provider/model 组合。

type ModelSet

type ModelSet struct {
	Default *SwappableModel
	// contains filtered or unexported fields
}

ModelSet 持有按角色分配的模型实例,未配置的角色回退到默认模型。

func NewModelSet

func NewModelSet(cfg Config) (*ModelSet, error)

NewModelSet 根据配置创建多模型集合。 相同 provider+model 组合复用同一个实例。

func (*ModelSet) ApplyPrepared added in v0.7.3

func (ms *ModelSet) ApplyPrepared(candidate *ModelSet)

ApplyPrepared 提交一个已成功构建的候选 ModelSet。已有 SwappableModel 的地址 保持不变,因此已装配的 Worker/Arbiter 会在下一次请求自动使用新客户端。

func (*ModelSet) CurrentSelection added in v0.0.2

func (ms *ModelSet) CurrentSelection(role string) (provider, model string, explicit bool)

CurrentSelection 返回角色当前生效的 provider/model。 role 为空或 "default" 时返回默认模型。

func (*ModelSet) ForRole

func (ms *ModelSet) ForRole(role string) agentcore.ChatModel

ForRole 返回指定角色的模型,未配置时返回默认模型。

func (*ModelSet) ForRoleWithFailover added in v0.1.0

func (ms *ModelSet) ForRoleWithFailover(role string, report FailoverReporter) agentcore.ChatModel

ForRoleWithFailover 返回带有单次请求级 fallback 的角色模型。 仅当该角色显式配置了 fallbacks 时生效;未配置时退化为普通模型。

func (*ModelSet) ResolveContextWindow added in v0.7.3

func (ms *ModelSet) ResolveContextWindow(provider, model string) (int, ContextWindowSource)

ResolveContextWindow 使用 ModelSet 的最新配置解析窗口,供运行时热切换后的 ContextManagerFactory 使用,避免捕获启动时的 Config 副本。

func (*ModelSet) Summary

func (ms *ModelSet) Summary() string

Summary 返回模型分配摘要(供日志使用)。

func (*ModelSet) Swap added in v0.0.2

func (ms *ModelSet) Swap(role, provider, model string) error

Swap 切换默认模型或指定角色模型。 role 为空或 "default" 时切换默认模型;其他角色切换为显式覆盖。

type NotifyConfig added in v0.5.0

type NotifyConfig struct {
	Enabled *bool    `json:"enabled,omitempty"` // 缺省 true(system 通道零配置可用)
	Command string   `json:"command,omitempty"` // 可选,配置后替代 system 通道(手机推送走这里)
	Events  []string `json:"events,omitempty"`  // 可选,按 notify.Kinds 过滤;缺省全开
}

NotifyConfig 无人值守告警通道配置。

func (NotifyConfig) IsEnabled added in v0.5.0

func (n NotifyConfig) IsEnabled() bool

IsEnabled 返回告警是否启用(缺省 true)。

type ProviderConfig

type ProviderConfig struct {
	Type    string        `json:"type,omitempty"`     // API 协议类型(openai/anthropic/gemini),自定义代理时指定
	API     string        `json:"api,omitempty"`      // OpenAI 协议 endpoint:chat(默认)/ responses
	APIKey  string        `json:"api_key,omitempty"`  // API Key
	BaseURL string        `json:"base_url,omitempty"` // API Base URL
	Models  []ModelConfig `json:"models,omitempty"`   // 可选模型列表,供 TUI 切换时展示
	// ExtraBody 透传给该 provider 每次请求的额外参数(如 temperature/top_p/min_p/
	// presence_penalty,或厂商特有键如 nvidia 开 think 的 chat_template_kwargs)。
	// OpenAI 兼容端逐字并入请求体(即 extra_body 约定);值由用户自负其责。
	ExtraBody map[string]any `json:"extra_body,omitempty"`
	// Extra 透传给 provider 级配置(litellm.ProviderConfig.Extra),用于 HTTP
	// headers、user_agent、anthropic_beta 等客户端/传输层选项。
	Extra map[string]any `json:"extra,omitempty"`
	// StreamIdleTimeout 流式空闲看门狗:超过该时长收不到任何 chunk 即断流
	// (Go duration 字符串,如 "900s" / "15m")。留空默认 5m——云端服务的合理上界;
	// LocalAI/ollama 等自建慢推理首块可远超 5 分钟,按 provider 放宽即可,
	// 不拖累其它通道的挂死检测(#79)。
	StreamIdleTimeout string `json:"stream_idle_timeout,omitempty"`
}

ProviderConfig 定义单个 LLM 提供商的凭证。

func (ProviderConfig) ModelConfig added in v0.7.3

func (pc ProviderConfig) ModelConfig(name string) (ModelConfig, bool)

ModelConfig 返回指定模型的显式配置。

func (ProviderConfig) ProviderType

func (pc ProviderConfig) ProviderType(name string) (string, error)

ProviderType 返回有效的 API 协议类型。 优先使用显式 Type;否则要求 provider 名本身已在 litellm 注册表中。

func (ProviderConfig) RequiresAPIKey

func (pc ProviderConfig) RequiresAPIKey(name string) bool

RequiresAPIKey 返回该 provider 是否必须显式配置 api_key。 约定: 1. ollama / bedrock 允许无 key; 2. 显式指定 Type 的配置视为自定义代理,允许无 key; 3. 其他 provider 默认要求 key,保持对官方托管接口的保守校验。

func (ProviderConfig) StreamIdleTimeoutValue added in v0.7.0

func (pc ProviderConfig) StreamIdleTimeoutValue() (time.Duration, error)

StreamIdleTimeoutValue 解析该 provider 的流式空闲超时;留空回落默认值。

type ProviderPreset added in v0.7.3

type ProviderPreset struct {
	Name           string
	Label          string
	BaseURL        string
	NeedType       bool
	APIKeyOptional bool
}

ProviderPreset 是首次引导和运行时 /config 共用的 provider 目录项。

func ProviderPresets added in v0.7.3

func ProviderPresets() []ProviderPreset

ProviderPresets 返回一份可安全修改的预设列表。

type RoleConfig

type RoleConfig struct {
	Provider  string     `json:"provider"`            // 主 provider 名称(Providers map 中的 key)
	Model     string     `json:"model"`               // 主模型名(原样透传,不做任何解析)
	Fallbacks []ModelRef `json:"fallbacks,omitempty"` // 显式备用 provider/model 列表
	// ReasoningEffort 该角色的推理强度(off/low/medium/high/xhigh/max),空=继承顶层默认。
	// 由 agents.ParseThinkingLevel 校验后应用,越级值视为空。
	ReasoningEffort string `json:"reasoning_effort,omitempty"`
}

RoleConfig 定义单个角色的模型覆盖。

type SwappableModel added in v0.0.2

type SwappableModel struct {
	*agentcore.SwappableModel
	// contains filtered or unexported fields
}

SwappableModel 是可热切换的 ChatModel 包装器。 已开始的请求继续使用旧实例;后续请求自动切到新实例。

func NewSwappableModel added in v0.0.2

func NewSwappableModel(provider, name string, model agentcore.ChatModel, jsonSchema *bool) *SwappableModel

func (*SwappableModel) Capabilities added in v0.5.3

func (m *SwappableModel) Capabilities() llm.Capabilities

func (*SwappableModel) Current added in v0.0.2

func (m *SwappableModel) Current() (provider, name string)

func (*SwappableModel) Info added in v0.0.2

func (m *SwappableModel) Info() llm.ModelInfo

func (*SwappableModel) JSONSchemaOverride added in v0.7.4

func (m *SwappableModel) JSONSchemaOverride() *bool

JSONSchemaOverride 返回当前选中模型的 config json_schema 三态声明。

func (*SwappableModel) ProviderName added in v0.0.2

func (m *SwappableModel) ProviderName() string

func (*SwappableModel) StructuredOutputFacts added in v0.7.4

func (m *SwappableModel) StructuredOutputFacts() llmcontract.ModelFacts

StructuredOutputFacts 在同一把锁下读取模型实例、身份和配置覆盖,保证一次 结构化协议选择只观察到一个完整版本。

func (*SwappableModel) Swap added in v0.0.2

func (m *SwappableModel) Swap(provider, name string, model agentcore.ChatModel, jsonSchema *bool)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL