e2a41ecf0a
- Added a new thinking mode control field in the ModelEditorDialog, allowing users to specify how the agent's thinking mode is formatted for API requests. - Introduced localization strings for thinking mode labels and descriptions in English, Korean, Russian, and Chinese, enhancing user experience across multiple languages. - Updated the model form data structure to include thinking control settings, ensuring proper handling during model edits and saves. - Implemented utility functions for resolving and defaulting thinking control values based on provider and model, improving backend integration. - Added tests for the new thinking control functionality to ensure reliability and correctness in handling user configurations.
37 lines
1.1 KiB
Go
37 lines
1.1 KiB
Go
package chat
|
|
|
|
import "github.com/Tencent/WeKnora/internal/types"
|
|
|
|
// thinkingEmitter owns the "reasoning then answer" hand-off that every
|
|
// streaming Chat implementation shares: thinking chunks are forwarded as they
|
|
// arrive, and exactly one thinking-done marker is emitted before the first
|
|
// answer token (or when the stream ends without one). Centralizing the
|
|
// bookkeeping keeps the OpenAI-compatible and Ollama stream loops in sync.
|
|
type thinkingEmitter struct {
|
|
active bool
|
|
}
|
|
|
|
// emit forwards a reasoning chunk and records that a thinking-done marker is
|
|
// still owed.
|
|
func (e *thinkingEmitter) emit(ch chan types.StreamResponse, content string) {
|
|
e.active = true
|
|
ch <- types.StreamResponse{
|
|
ResponseType: types.ResponseTypeThinking,
|
|
Content: content,
|
|
Done: false,
|
|
}
|
|
}
|
|
|
|
// finish emits the single thinking-done marker if one is owed. Safe to call
|
|
// multiple times; only the first call after an emit sends anything.
|
|
func (e *thinkingEmitter) finish(ch chan types.StreamResponse) {
|
|
if !e.active {
|
|
return
|
|
}
|
|
e.active = false
|
|
ch <- types.StreamResponse{
|
|
ResponseType: types.ResponseTypeThinking,
|
|
Done: true,
|
|
}
|
|
}
|