mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 04:50:52 +08:00
128 lines
3.6 KiB
Go
128 lines
3.6 KiB
Go
// Package misc provides miscellaneous utility functions and embedded data for the CLI Proxy API.
|
|
// This package contains general-purpose helpers and embedded resources that do not fit into
|
|
// more specific domain packages. It includes embedded instructional text for Codex-related operations.
|
|
package misc
|
|
|
|
import (
|
|
"embed"
|
|
_ "embed"
|
|
"strings"
|
|
|
|
"github.com/tidwall/gjson"
|
|
"github.com/tidwall/sjson"
|
|
)
|
|
|
|
//go:embed codex_instructions
|
|
var codexInstructionsDir embed.FS
|
|
|
|
//go:embed opencode_codex_instructions.txt
|
|
var opencodeCodexInstructions string
|
|
|
|
const (
|
|
codexUserAgentKey = "__cpa_user_agent"
|
|
userAgentOpenAISDK = "ai-sdk/openai/"
|
|
)
|
|
|
|
func InjectCodexUserAgent(raw []byte, userAgent string) []byte {
|
|
if len(raw) == 0 {
|
|
return raw
|
|
}
|
|
trimmed := strings.TrimSpace(userAgent)
|
|
if trimmed == "" {
|
|
return raw
|
|
}
|
|
updated, err := sjson.SetBytes(raw, codexUserAgentKey, trimmed)
|
|
if err != nil {
|
|
return raw
|
|
}
|
|
return updated
|
|
}
|
|
|
|
func ExtractCodexUserAgent(raw []byte) string {
|
|
if len(raw) == 0 {
|
|
return ""
|
|
}
|
|
return strings.TrimSpace(gjson.GetBytes(raw, codexUserAgentKey).String())
|
|
}
|
|
|
|
func StripCodexUserAgent(raw []byte) []byte {
|
|
if len(raw) == 0 {
|
|
return raw
|
|
}
|
|
if !gjson.GetBytes(raw, codexUserAgentKey).Exists() {
|
|
return raw
|
|
}
|
|
updated, err := sjson.DeleteBytes(raw, codexUserAgentKey)
|
|
if err != nil {
|
|
return raw
|
|
}
|
|
return updated
|
|
}
|
|
|
|
func codexInstructionsForOpenCode(systemInstructions string) (bool, string) {
|
|
if opencodeCodexInstructions == "" {
|
|
return false, ""
|
|
}
|
|
if strings.HasPrefix(systemInstructions, opencodeCodexInstructions) {
|
|
return true, ""
|
|
}
|
|
return false, opencodeCodexInstructions
|
|
}
|
|
|
|
func useOpenCodeInstructions(userAgent string) bool {
|
|
return strings.Contains(strings.ToLower(userAgent), userAgentOpenAISDK)
|
|
}
|
|
|
|
func codexInstructionsForCodex(modelName, systemInstructions string) (bool, string) {
|
|
entries, _ := codexInstructionsDir.ReadDir("codex_instructions")
|
|
|
|
lastPrompt := ""
|
|
lastCodexPrompt := ""
|
|
lastCodexMaxPrompt := ""
|
|
last51Prompt := ""
|
|
last52Prompt := ""
|
|
last52CodexPrompt := ""
|
|
// lastReviewPrompt := ""
|
|
for _, entry := range entries {
|
|
content, _ := codexInstructionsDir.ReadFile("codex_instructions/" + entry.Name())
|
|
if strings.HasPrefix(systemInstructions, string(content)) {
|
|
return true, ""
|
|
}
|
|
if strings.HasPrefix(entry.Name(), "gpt_5_codex_prompt.md") {
|
|
lastCodexPrompt = string(content)
|
|
} else if strings.HasPrefix(entry.Name(), "gpt-5.1-codex-max_prompt.md") {
|
|
lastCodexMaxPrompt = string(content)
|
|
} else if strings.HasPrefix(entry.Name(), "prompt.md") {
|
|
lastPrompt = string(content)
|
|
} else if strings.HasPrefix(entry.Name(), "gpt_5_1_prompt.md") {
|
|
last51Prompt = string(content)
|
|
} else if strings.HasPrefix(entry.Name(), "gpt_5_2_prompt.md") {
|
|
last52Prompt = string(content)
|
|
} else if strings.HasPrefix(entry.Name(), "gpt-5.2-codex_prompt.md") {
|
|
last52CodexPrompt = string(content)
|
|
} else if strings.HasPrefix(entry.Name(), "review_prompt.md") {
|
|
// lastReviewPrompt = string(content)
|
|
}
|
|
}
|
|
if strings.Contains(modelName, "codex-max") {
|
|
return false, lastCodexMaxPrompt
|
|
} else if strings.Contains(modelName, "5.2-codex") {
|
|
return false, last52CodexPrompt
|
|
} else if strings.Contains(modelName, "codex") {
|
|
return false, lastCodexPrompt
|
|
} else if strings.Contains(modelName, "5.1") {
|
|
return false, last51Prompt
|
|
} else if strings.Contains(modelName, "5.2") {
|
|
return false, last52Prompt
|
|
} else {
|
|
return false, lastPrompt
|
|
}
|
|
}
|
|
|
|
func CodexInstructionsForModel(modelName, systemInstructions, userAgent string) (bool, string) {
|
|
if useOpenCodeInstructions(userAgent) {
|
|
return codexInstructionsForOpenCode(systemInstructions)
|
|
}
|
|
return codexInstructionsForCodex(modelName, systemInstructions)
|
|
}
|