Tier-1 voice-consistency pass: whole-document LLM review surfacing passages that read tonally out of place (formal/over-polished/paraphrased-too-closely), as honey-decorated `voice` flags with no correction (awareness-only). - internal/llm/voice.go: RunVoice sends the whole document (no TruncateDoc), MaxTokens 2048, 20s per-doc floor (VoiceInterval). Standalone voice prompt in prompts.go (not bundled with the grammar checkpoint, per spec). - internal/suggestions: POST /api/docs/:id/voice. replacePending is now family-scoped (pendingScope) so grammar and voice never clobber each other's pending flags; both passes return the unified pending set. check/voice share one runPass helper. TestVoicePassCoexists covers both directions. - Frontend: api.voiceDoc, useCheckpoint voicing/runVoice, honey "Check my voice" toolbar pill, breathing honey dot in StatusBar. Claude-Session: https://claude.ai/code/session_016Yr6jELuRc7hyzYLccQKZd
33 lines
1.2 KiB
Go
33 lines
1.2 KiB
Go
package llm
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
// VoiceInterval is the minimum gap between voice-consistency passes for one
|
|
// document. The pass is whole-document and slow, and it runs on an explicit
|
|
// user action rather than a typing cadence, so this floor only guards the
|
|
// inference endpoint against the button being mashed.
|
|
const VoiceInterval = 20 * time.Second
|
|
|
|
// RunVoice sends the WHOLE document — deliberately NOT TruncateDoc'd, since
|
|
// voice consistency is judged against the established voice everywhere else —
|
|
// for a Tier-1 voice pass and parses the JSON result. It reuses the checkpoint's
|
|
// tolerant parser and a larger token budget, since one pass may flag several
|
|
// passages. Each flag carries a null replacement (awareness-only).
|
|
func RunVoice(ctx context.Context, client LLMClient, contentText string) ([]RawSuggestion, error) {
|
|
raw, err := client.Complete(ctx, CompletionRequest{
|
|
Messages: VoiceMessages(contentText),
|
|
MaxTokens: 2048,
|
|
Temperature: 0.3,
|
|
RepetitionPenalty: 1.15,
|
|
TopP: 0.9,
|
|
Stop: []string{"```", "\n\n\n\n"},
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return ParseCheckpoint(raw)
|
|
}
|