mirror of
https://github.com/hansjone/oclaw.git
synced 2026-10-10 17:23:25 +08:00
重构主控编排与运行时预热链路,统一工作区提示词/专家调度协议并补齐 wiki 记忆注入与写回闭环。
同时收敛启动与运维脚本默认行为(含 wiki worker)、更新 Admin 可观测性与相关测试,降低首轮时延并提高运行稳定性。 Made-with: Cursor
This commit is contained in:
parent
4a23b715a2
commit
dbbe3add6a
14438 changed files with 2693620 additions and 2546 deletions
177
openclaw/scripts/docs-i18n/util.go
Normal file
177
openclaw/scripts/docs-i18n/util.go
Normal file
|
|
@ -0,0 +1,177 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"crypto/sha256"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
const (
|
||||
workflowVersion = 15
|
||||
docsI18nEngineName = "pi"
|
||||
envDocsI18nProvider = "OPENCLAW_DOCS_I18N_PROVIDER"
|
||||
envDocsI18nModel = "OPENCLAW_DOCS_I18N_MODEL"
|
||||
defaultOpenAIModel = "gpt-5.4"
|
||||
defaultAnthropicModel = "claude-opus-4-6"
|
||||
defaultFallbackProvider = "openai"
|
||||
defaultFallbackModelName = defaultOpenAIModel
|
||||
)
|
||||
|
||||
func cacheNamespace() string {
|
||||
return fmt.Sprintf(
|
||||
"wf=%d|engine=%s|provider=%s|model=%s",
|
||||
workflowVersion,
|
||||
docsI18nEngineName,
|
||||
docsPiProvider(),
|
||||
docsPiModel(),
|
||||
)
|
||||
}
|
||||
|
||||
func cacheKey(namespace, srcLang, tgtLang, segmentID, textHash string) string {
|
||||
raw := fmt.Sprintf("%s|%s|%s|%s|%s", namespace, srcLang, tgtLang, segmentID, textHash)
|
||||
hash := sha256.Sum256([]byte(raw))
|
||||
return hex.EncodeToString(hash[:])
|
||||
}
|
||||
|
||||
func hashText(text string) string {
|
||||
normalized := normalizeText(text)
|
||||
hash := sha256.Sum256([]byte(normalized))
|
||||
return hex.EncodeToString(hash[:])
|
||||
}
|
||||
|
||||
func hashBytes(data []byte) string {
|
||||
hash := sha256.Sum256(data)
|
||||
return hex.EncodeToString(hash[:])
|
||||
}
|
||||
|
||||
func normalizeText(text string) string {
|
||||
return strings.Join(strings.Fields(strings.TrimSpace(text)), " ")
|
||||
}
|
||||
|
||||
func docsPiProvider() string {
|
||||
if value := strings.TrimSpace(os.Getenv(envDocsI18nProvider)); value != "" {
|
||||
return value
|
||||
}
|
||||
if strings.TrimSpace(os.Getenv("OPENAI_API_KEY")) != "" {
|
||||
return "openai"
|
||||
}
|
||||
if strings.TrimSpace(os.Getenv("ANTHROPIC_API_KEY")) != "" {
|
||||
return "anthropic"
|
||||
}
|
||||
return defaultFallbackProvider
|
||||
}
|
||||
|
||||
func docsPiModel() string {
|
||||
if value := strings.TrimSpace(os.Getenv(envDocsI18nModel)); value != "" {
|
||||
return value
|
||||
}
|
||||
switch docsPiProvider() {
|
||||
case "anthropic":
|
||||
return defaultAnthropicModel
|
||||
case "openai":
|
||||
return defaultOpenAIModel
|
||||
default:
|
||||
return defaultFallbackModelName
|
||||
}
|
||||
}
|
||||
|
||||
func docsPiProviderArg() string {
|
||||
provider := docsPiProvider()
|
||||
if provider == "" {
|
||||
return ""
|
||||
}
|
||||
if docsPiOmitProvider() {
|
||||
return ""
|
||||
}
|
||||
if strings.Contains(docsPiModel(), "/") {
|
||||
return ""
|
||||
}
|
||||
if hasDocsPiAgentDirOverride() {
|
||||
return ""
|
||||
}
|
||||
if !isBuiltInPiProvider(provider) {
|
||||
return ""
|
||||
}
|
||||
return provider
|
||||
}
|
||||
|
||||
func docsPiModelRef() string {
|
||||
model := docsPiModel()
|
||||
if model == "" {
|
||||
return ""
|
||||
}
|
||||
if strings.Contains(model, "/") {
|
||||
return model
|
||||
}
|
||||
if docsPiOmitProvider() {
|
||||
provider := docsPiProvider()
|
||||
if provider == "" {
|
||||
return model
|
||||
}
|
||||
return provider + "/" + model
|
||||
}
|
||||
if docsPiProviderArg() != "" {
|
||||
return model
|
||||
}
|
||||
provider := docsPiProvider()
|
||||
if provider == "" {
|
||||
return model
|
||||
}
|
||||
return provider + "/" + model
|
||||
}
|
||||
|
||||
func isBuiltInPiProvider(provider string) bool {
|
||||
switch strings.ToLower(strings.TrimSpace(provider)) {
|
||||
case "anthropic", "openai":
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func hasDocsPiAgentDirOverride() bool {
|
||||
return strings.TrimSpace(os.Getenv("PI_CODING_AGENT_DIR")) != ""
|
||||
}
|
||||
|
||||
func segmentID(relPath, textHash string) string {
|
||||
shortHash := textHash
|
||||
if len(shortHash) > 16 {
|
||||
shortHash = shortHash[:16]
|
||||
}
|
||||
return fmt.Sprintf("%s:%s", relPath, shortHash)
|
||||
}
|
||||
|
||||
func splitWhitespace(text string) (string, string, string) {
|
||||
if text == "" {
|
||||
return "", "", ""
|
||||
}
|
||||
start := 0
|
||||
for start < len(text) && isWhitespace(text[start]) {
|
||||
start++
|
||||
}
|
||||
end := len(text)
|
||||
for end > start && isWhitespace(text[end-1]) {
|
||||
end--
|
||||
}
|
||||
return text[:start], text[start:end], text[end:]
|
||||
}
|
||||
|
||||
func isWhitespace(b byte) bool {
|
||||
switch b {
|
||||
case ' ', '\t', '\n', '\r':
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func fatal(err error) {
|
||||
if err == nil {
|
||||
return
|
||||
}
|
||||
_, _ = io.WriteString(os.Stderr, err.Error()+"\n")
|
||||
os.Exit(1)
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue