//go:build ignore package main import ( "fmt" "strings" "kit/ext" ) // Init adds a /summarize command that generates a concise summary of the // current conversation using a direct LLM completion. Demonstrates the // ctx.Complete API. // // The summary is displayed in a styled block and can optionally be saved // to the session via AppendEntry for later retrieval. // // Usage: kit -e examples/extensions/summarize.go func Init(api ext.API) { api.RegisterCommand(ext.CommandDef{ Name: "summarize", Description: "Summarize the current conversation", Execute: func(args string, ctx ext.Context) (string, error) { msgs := ctx.GetMessages() if len(msgs) == 0 { ctx.PrintInfo("Nothing to summarize — no messages yet.") return "", nil } // Build a text representation of the conversation. var parts []string for _, m := range msgs { content := m.Content if len(content) > 2000 { content = content[:1997] + "..." } parts = append(parts, fmt.Sprintf("[%s]: %s", m.Role, content)) } conversation := strings.Join(parts, "\n\n") ctx.PrintInfo("Generating summary...") resp, err := ctx.Complete(ext.CompleteRequest{ System: `You are a concise summarization assistant. Summarize the conversation below in 3-5 bullet points. Focus on: - What was discussed or requested - Key decisions or outcomes - Any pending action items Be concise. Use plain text, no markdown headers.`, Prompt: conversation, }) if err != nil { ctx.PrintError("Summary failed: " + err.Error()) return "", nil } summary := strings.TrimSpace(resp.Text) ctx.PrintBlock(ext.PrintBlockOpts{ Text: summary, BorderColor: "#89b4fa", Subtitle: fmt.Sprintf("Summary (%d messages, %d tokens used)", len(msgs), resp.InputTokens+resp.OutputTokens), }) // Persist the summary in the session for later retrieval. ctx.AppendEntry("summary", summary) return "", nil }, }) // /summaries — list all saved summaries. api.RegisterCommand(ext.CommandDef{ Name: "summaries", Description: "List saved conversation summaries", Execute: func(args string, ctx ext.Context) (string, error) { entries := ctx.GetEntries("summary") if len(entries) == 0 { ctx.PrintInfo("No summaries saved yet. Use /summarize to create one.") return "", nil } for i, e := range entries { ctx.PrintBlock(ext.PrintBlockOpts{ Text: e.Data, BorderColor: "#89b4fa", Subtitle: fmt.Sprintf("Summary #%d (%s)", i+1, e.Timestamp[:19]), }) } return "", nil }, }) }