mirror of
https://github.com/ollama/ollama.git
synced 2026-03-08 23:04:13 -05:00
98 lines
1.9 KiB
Go
98 lines
1.9 KiB
Go
package convert
|
|
|
|
// sanitizeNonFiniteJSON rewrites non-standard JSON numeric tokens that some
|
|
// HF configs emit (Infinity, -Infinity, NaN) into standard JSON numbers.
|
|
//
|
|
// This is intentionally conservative:
|
|
// - only runs outside quoted strings
|
|
// - only rewrites full tokens
|
|
//
|
|
// We map these values to 0 because encoding/json rejects non-finite values,
|
|
// and these fields are typically model-side metadata not consumed by the
|
|
// converter.
|
|
func sanitizeNonFiniteJSON(in []byte) []byte {
|
|
if len(in) == 0 {
|
|
return in
|
|
}
|
|
|
|
out := make([]byte, 0, len(in))
|
|
inString := false
|
|
escape := false
|
|
|
|
for i := 0; i < len(in); {
|
|
c := in[i]
|
|
|
|
if inString {
|
|
out = append(out, c)
|
|
if escape {
|
|
escape = false
|
|
} else if c == '\\' {
|
|
escape = true
|
|
} else if c == '"' {
|
|
inString = false
|
|
}
|
|
i++
|
|
continue
|
|
}
|
|
|
|
if c == '"' {
|
|
inString = true
|
|
out = append(out, c)
|
|
i++
|
|
continue
|
|
}
|
|
|
|
if hasToken(in, i, "-Infinity") {
|
|
out = append(out, '0')
|
|
i += len("-Infinity")
|
|
continue
|
|
}
|
|
|
|
if hasToken(in, i, "Infinity") {
|
|
out = append(out, '0')
|
|
i += len("Infinity")
|
|
continue
|
|
}
|
|
|
|
if hasToken(in, i, "NaN") {
|
|
out = append(out, '0')
|
|
i += len("NaN")
|
|
continue
|
|
}
|
|
|
|
out = append(out, c)
|
|
i++
|
|
}
|
|
|
|
return out
|
|
}
|
|
|
|
func hasToken(in []byte, at int, tok string) bool {
|
|
end := at + len(tok)
|
|
if at < 0 || end > len(in) {
|
|
return false
|
|
}
|
|
if string(in[at:end]) != tok {
|
|
return false
|
|
}
|
|
if at > 0 && !isJSONValuePrefixBoundary(in[at-1]) {
|
|
return false
|
|
}
|
|
if end < len(in) && !isJSONValueSuffixBoundary(in[end]) {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func isJSONWhitespace(b byte) bool {
|
|
return b == ' ' || b == '\t' || b == '\n' || b == '\r'
|
|
}
|
|
|
|
func isJSONValuePrefixBoundary(b byte) bool {
|
|
return isJSONWhitespace(b) || b == ':' || b == ',' || b == '['
|
|
}
|
|
|
|
func isJSONValueSuffixBoundary(b byte) bool {
|
|
return isJSONWhitespace(b) || b == ',' || b == ']' || b == '}'
|
|
}
|