Documentation
¶
Index ¶
- Constants
- func CompactReserveTokens(window int) int
- func DefaultConfigDir() string
- func DefaultConfigPath() string
- func EffectiveConfigPath() string
- func LogContextWindowChoice(role, model string, window int, source ContextWindowSource)
- func ModelName(m agentcore.ChatModel) string
- func ModelProvider(m agentcore.ChatModel) string
- func NeedsSetup() bool
- func SaveConfig(path string, cfg Config) error
- func SaveProviderConfig(path string, provider string, pc ProviderConfig) error
- func WriteStartupError(msg string) string
- type BudgetConfig
- type Config
- func (c Config) CandidateModels(provider string) []string
- func (c *Config) DefaultProviderConfig() ProviderConfig
- func (c *Config) FillDefaults()
- func (c Config) ModelJSONSchema(provider, model string) *bool
- func (c Config) ResolveContextWindow(provider, modelName string) (int, ContextWindowSource)
- func (c Config) ResolveReasoningEffort(role string) string
- func (c *Config) ValidateBase() error
- type ContextWindowSource
- type FailoverEvent
- type FailoverReporter
- type ModelConfig
- type ModelRef
- type ModelSet
- func (ms *ModelSet) ApplyPrepared(candidate *ModelSet)
- func (ms *ModelSet) CurrentSelection(role string) (provider, model string, explicit bool)
- func (ms *ModelSet) ForRole(role string) agentcore.ChatModel
- func (ms *ModelSet) ForRoleWithFailover(role string, report FailoverReporter) agentcore.ChatModel
- func (ms *ModelSet) ResolveContextWindow(provider, model string) (int, ContextWindowSource)
- func (ms *ModelSet) Summary() string
- func (ms *ModelSet) Swap(role, provider, model string) error
- type NotifyConfig
- type ProviderConfig
- type ProviderPreset
- type RoleConfig
- type SwappableModel
- func (m *SwappableModel) Capabilities() llm.Capabilities
- func (m *SwappableModel) Current() (provider, name string)
- func (m *SwappableModel) Info() llm.ModelInfo
- func (m *SwappableModel) JSONSchemaOverride() *bool
- func (m *SwappableModel) ProviderName() string
- func (m *SwappableModel) StructuredOutputFacts() llmcontract.ModelFacts
- func (m *SwappableModel) Swap(provider, name string, model agentcore.ChatModel, jsonSchema *bool)
Constants ¶
const CompactRatio = 0.85
CompactRatio 触发上下文压缩的相对阈值:tokens >= window * CompactRatio 时压缩。 0.85 是经验值,给"下一轮 prompt + 大工具结果"留 15% 头部空间,同时让大窗口 模型也能在 85% 主动压缩,避免在 1M 名义窗口下吃满才压(注意力衰退区)。
压缩比例不暴露给用户配置;用户只配置每个模型的真实 context_window。
const DefaultContextWindow = 200000
DefaultContextWindow 模型未在 registry 登记时的兜底窗口大小。
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
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
ModelName 从 ChatModel 中提取当前模型名,失败返回空字符串。 支持 SwappableModel 的热切换:调用时总是返回最新值。
func ModelProvider ¶ added in v0.7.3
ModelProvider 从 ChatModel 中提取当前 provider 名称,失败返回空字符串。
func SaveConfig ¶
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
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
CloneConfig 深拷贝配置中会在运行时修改的 map/slice,避免候选配置污染当前配置。
func LoadConfigFile ¶ added in v0.0.2
LoadConfigFile 读取单个 JSON 配置文件,支持 // 行注释。 不做任何合并,仅返回该文件自身的配置。文件不存在时返回错误。
func (Config) CandidateModels ¶ added in v0.0.2
CandidateModels 返回某个 provider 下可供切换的模型列表。 优先使用 provider 显式声明的 models;同时补充当前配置中已出现过的该 provider 模型。
func (*Config) DefaultProviderConfig ¶
func (c *Config) DefaultProviderConfig() ProviderConfig
DefaultProviderConfig 返回默认 provider 的凭证配置。
func (Config) ModelJSONSchema ¶ added in v0.7.4
ModelJSONSchema 返回模型的 json_schema 三态声明;未列入 models 或未配置时 返回 nil(按 adapter 能力判断)。
func (Config) ResolveContextWindow ¶ added in v0.1.2
func (c Config) ResolveContextWindow(provider, modelName string) (int, ContextWindowSource)
ResolveContextWindow 解析上下文压缩使用的有效窗口,按优先级:
- providers.<provider>.models[].context_window
- 旧顶层 ContextWindow(兼容已有配置)
- models.DefaultRegistry 按模型名查询(OpenRouter 基线 + 24h 刷新)
- 兜底 DefaultContextWindow(自定义代理 / 未知模型)
注意:返回值仅用于压缩阈值计算,不会缩小 LLM API 真实可发请求长度。
func (Config) ResolveReasoningEffort ¶ added in v0.6.0
ResolveReasoningEffort 返回某角色生效的推理强度原始串(off/low/medium/high/xhigh/max 或空)。 优先级:角色级 Roles[role].ReasoningEffort → 顶层默认 ReasoningEffort → ""(不覆盖,沿用模型/provider 默认)。 role 为空或 "default" 时直接取顶层默认。值的合法性由 agents.ParseThinkingLevel 把关。
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 ¶
NewModelSet 根据配置创建多模型集合。 相同 provider+model 组合复用同一个实例。
func (*ModelSet) ApplyPrepared ¶ added in v0.7.3
ApplyPrepared 提交一个已成功构建的候选 ModelSet。已有 SwappableModel 的地址 保持不变,因此已装配的 Worker/Arbiter 会在下一次请求自动使用新客户端。
func (*ModelSet) CurrentSelection ¶ added in v0.0.2
CurrentSelection 返回角色当前生效的 provider/model。 role 为空或 "default" 时返回默认模型。
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 副本。
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 在同一把锁下读取模型实例、身份和配置覆盖,保证一次 结构化协议选择只观察到一个完整版本。