feat: 支持长篇小说分层架构(卷/弧/章三级结构)

This commit is contained in:
voocel
2026-03-12 16:27:15 +08:00
parent 3d65afa276
commit bce0adeff1
19 changed files with 1045 additions and 16 deletions

View File

@@ -0,0 +1,62 @@
package tools
import (
"context"
"encoding/json"
"fmt"
"github.com/voocel/agentcore/schema"
"github.com/voocel/ainovel-cli/domain"
"github.com/voocel/ainovel-cli/state"
)
// SaveVolumeSummaryTool 保存卷级摘要Editor 在卷结束时调用。
type SaveVolumeSummaryTool struct {
store *state.Store
}
func NewSaveVolumeSummaryTool(store *state.Store) *SaveVolumeSummaryTool {
return &SaveVolumeSummaryTool{store: store}
}
func (t *SaveVolumeSummaryTool) Name() string { return "save_volume_summary" }
func (t *SaveVolumeSummaryTool) Description() string { return "保存卷级摘要(长篇模式,卷结束时调用)" }
func (t *SaveVolumeSummaryTool) Label() string { return "保存卷摘要" }
func (t *SaveVolumeSummaryTool) Schema() map[string]any {
return schema.Object(
schema.Property("volume", schema.Int("卷号")).Required(),
schema.Property("title", schema.String("卷标题")).Required(),
schema.Property("summary", schema.String("卷摘要500字以内")).Required(),
schema.Property("key_events", schema.Array("卷内关键事件", schema.String(""))).Required(),
)
}
func (t *SaveVolumeSummaryTool) Execute(_ context.Context, args json.RawMessage) (json.RawMessage, error) {
var a struct {
Volume int `json:"volume"`
Title string `json:"title"`
Summary string `json:"summary"`
KeyEvents []string `json:"key_events"`
}
if err := json.Unmarshal(args, &a); err != nil {
return nil, fmt.Errorf("invalid args: %w", err)
}
if a.Volume <= 0 {
return nil, fmt.Errorf("volume must be > 0")
}
volSummary := domain.VolumeSummary{
Volume: a.Volume,
Title: a.Title,
Summary: a.Summary,
KeyEvents: a.KeyEvents,
}
if err := t.store.SaveVolumeSummary(volSummary); err != nil {
return nil, fmt.Errorf("save volume summary: %w", err)
}
return json.Marshal(map[string]any{
"saved": true, "type": "volume_summary", "volume": a.Volume,
})
}