mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-08-15 05:04:27 +08:00
Collapse the nine identical **"cut through the last `</think>`"** implementations — mirroring Python's `re.sub(r"^.*</think>", "", s, re.DOTALL)` — into one shared helper `common.StripThinkTrailing`, preventing future behavior drift between copies.
24 lines
961 B
Go
24 lines
961 B
Go
package common
|
|
|
|
import "strings"
|
|
|
|
// StripThinkTrailing cuts everything through the LAST `</think>` marker on the
|
|
// input and returns what follows, mirroring Python's
|
|
//
|
|
// re.sub(r"^.*</think>", "", ans, flags=re.DOTALL)
|
|
//
|
|
// The Python regex is greedy: with re.DOTALL the leading `.*` matches as much
|
|
// as possible, so for an input with more than one `</think>` everything up to
|
|
// and including the LAST marker is stripped. A non-greedy form would strip only
|
|
// the first marker and leave a residual think block in the response. Go's
|
|
// strings.LastIndex has the same greedy semantics, so it is used instead of a
|
|
// regex. When no `</think>` is present, s is returned unchanged. Note the marker
|
|
// is matched regardless of whether an opening `<think>` exists — parity with
|
|
// Python, which does not require one.
|
|
func StripThinkTrailing(s string) string {
|
|
if i := strings.LastIndex(s, "</think>"); i >= 0 {
|
|
return s[i+len("</think>"):]
|
|
}
|
|
return s
|
|
}
|