826 lines · 25.9 KB · Go
RawDownload
package executor import (	"context"	"crypto/sha256"	"encoding/hex"	"hash"	"io"	"net/http"	"strings" 	"github.com/gin-gonic/gin"	"github.com/google/uuid"	internalcache "github.com/router-for-me/CLIProxyAPI/v7/internal/cache"	"github.com/router-for-me/CLIProxyAPI/v7/internal/runtime/executor/helps"	"github.com/router-for-me/CLIProxyAPI/v7/internal/signature"	"github.com/router-for-me/CLIProxyAPI/v7/internal/thinking"	"github.com/router-for-me/CLIProxyAPI/v7/internal/util"	cliproxyexecutor "github.com/router-for-me/CLIProxyAPI/v7/sdk/cliproxy/executor"	sdktranslator "github.com/router-for-me/CLIProxyAPI/v7/sdk/translator"	"github.com/tidwall/gjson"	"github.com/tidwall/sjson") type codexReasoningReplayScope struct {	modelName          string	sessionKey         string	requestFingerprint string} func (s codexReasoningReplayScope) valid() bool {	return strings.TrimSpace(s.modelName) != "" && strings.TrimSpace(s.sessionKey) != ""} func applyCodexReasoningReplayCache(ctx context.Context, from sdktranslator.Format, req cliproxyexecutor.Request, opts cliproxyexecutor.Options, body []byte) ([]byte, codexReasoningReplayScope) {	updated, scope, _ := applyCodexReasoningReplayCacheRequired(ctx, from, req, opts, body)	return updated, scope} func applyCodexReasoningReplayCacheRequired(ctx context.Context, from sdktranslator.Format, req cliproxyexecutor.Request, opts cliproxyexecutor.Options, body []byte) ([]byte, codexReasoningReplayScope, error) {	scope := codexReasoningReplayScopeFromRequest(ctx, from, req, opts, body)	if !scope.valid() {		return body, scope, nil	}	items, ok, errReplay := internalcache.GetCodexReasoningReplayItemsRequired(ctx, scope.modelName, scope.sessionKey)	if errReplay != nil || !ok {		return body, scope, errReplay	}	updated, ok := insertCodexReasoningReplayTurns(body, items)	if !ok {		return body, scope, nil	}	return updated, scope, nil} func codexReasoningReplayScopeFromRequest(ctx context.Context, from sdktranslator.Format, req cliproxyexecutor.Request, opts cliproxyexecutor.Options, body []byte) codexReasoningReplayScope {	if !codexReasoningReplayEnabledForSource(from) {		return codexReasoningReplayScope{}	}	modelName := strings.TrimSpace(gjson.GetBytes(body, "model").String())	if modelName == "" {		modelName = thinking.ParseSuffix(req.Model).ModelName	}	inputItems := gjson.GetBytes(body, "input").Array()	return codexReasoningReplayScope{		modelName:          modelName,		sessionKey:         codexReasoningReplaySessionKey(ctx, from, req, opts, body),		requestFingerprint: codexReplayInputPrefixFingerprint(inputItems, len(inputItems)),	}} func codexReasoningReplayEnabledForSource(from sdktranslator.Format) bool {	return sourceFormatEqual(from, sdktranslator.FormatClaude)} func sourceFormatEqual(from, want sdktranslator.Format) bool {	return strings.EqualFold(strings.TrimSpace(from.String()), want.String())} func codexClaudeCodeReplaySessionKey(ctx context.Context, payload []byte, headers http.Header) string {	sessionKey, _ := helps.ClaudeCodeExecutionScope(ctx, payload, headers)	return sessionKey} func codexReasoningReplaySessionKey(ctx context.Context, from sdktranslator.Format, req cliproxyexecutor.Request, opts cliproxyexecutor.Options, body []byte) string {	if ctx == nil {		ctx = context.Background()	}	if sourceFormatEqual(from, sdktranslator.FormatClaude) {		if sessionKey := codexClaudeCodeReplaySessionKey(ctx, req.Payload, opts.Headers); sessionKey != "" {			return sessionKey		}	}	if value := metadataString(opts.Metadata, cliproxyexecutor.ExecutionSessionMetadataKey); value != "" {		return "execution:" + value	}	if value := metadataString(req.Metadata, cliproxyexecutor.ExecutionSessionMetadataKey); value != "" {		return "execution:" + value	}	if value := codexReasoningReplaySessionKeyFromPayload(body); value != "" {		return value	}	if value := codexReasoningReplaySessionKeyFromPayload(req.Payload); value != "" {		return value	}	if value := codexReasoningReplaySessionKeyFromHeaders(opts.Headers); value != "" {		return value	}	if ginCtx, ok := ctx.Value("gin").(*gin.Context); ok && ginCtx != nil && ginCtx.Request != nil {		if value := codexReasoningReplaySessionKeyFromHeaders(ginCtx.Request.Header); value != "" {			return value		}	}	if sourceFormatEqual(from, sdktranslator.FormatOpenAI) {		if apiKey := strings.TrimSpace(helps.APIKeyFromContext(ctx)); apiKey != "" {			return "prompt-cache:" + uuid.NewSHA1(uuid.NameSpaceOID, []byte("cli-proxy-api:codex:prompt-cache:"+apiKey)).String()		}	}	return ""} func metadataString(metadata map[string]any, key string) string {	if len(metadata) == 0 {		return ""	}	raw, ok := metadata[key]	if !ok || raw == nil {		return ""	}	switch v := raw.(type) {	case string:		return strings.TrimSpace(v)	case []byte:		return strings.TrimSpace(string(v))	default:		return ""	}} func codexReasoningReplaySessionKeyFromPayload(payload []byte) string {	if len(payload) == 0 {		return ""	}	if promptCacheKey := strings.TrimSpace(gjson.GetBytes(payload, "prompt_cache_key").String()); promptCacheKey != "" {		return "prompt-cache:" + promptCacheKey	}	if windowID := strings.TrimSpace(gjson.GetBytes(payload, "client_metadata.x-codex-window-id").String()); windowID != "" {		return "window:" + windowID	}	if turnMetadata := strings.TrimSpace(gjson.GetBytes(payload, "client_metadata.x-codex-turn-metadata").String()); turnMetadata != "" {		return codexReasoningReplaySessionKeyFromTurnMetadata(turnMetadata)	}	return ""} func codexReasoningReplaySessionKeyFromHeaders(headers http.Header) string {	if headers == nil {		return ""	}	if turnMetadata := strings.TrimSpace(headers.Get("X-Codex-Turn-Metadata")); turnMetadata != "" {		if key := codexReasoningReplaySessionKeyFromTurnMetadata(turnMetadata); key != "" {			return key		}	}	if windowID := strings.TrimSpace(headerValueCaseInsensitive(headers, "X-Codex-Window-Id")); windowID != "" {		return "window:" + windowID	}	for _, headerName := range []string{"Session_id", "session_id", "Session-Id"} {		if value := strings.TrimSpace(headerValueCaseInsensitive(headers, headerName)); value != "" {			return "session-id:" + value		}	}	if conversationID := strings.TrimSpace(headerValueCaseInsensitive(headers, "Conversation_id")); conversationID != "" {		return "conversation_id:" + conversationID	}	return ""} func codexReasoningReplaySessionKeyFromTurnMetadata(turnMetadata string) string {	if promptCacheKey := strings.TrimSpace(gjson.Get(turnMetadata, "prompt_cache_key").String()); promptCacheKey != "" {		return "prompt-cache:" + promptCacheKey	}	if windowID := strings.TrimSpace(gjson.Get(turnMetadata, "window_id").String()); windowID != "" {		return "window:" + windowID	}	return ""} func codexInputHasValidReasoningEncryptedContent(body []byte) bool {	input := gjson.GetBytes(body, "input")	if !input.IsArray() {		return false	}	for _, item := range input.Array() {		if strings.TrimSpace(item.Get("type").String()) != "reasoning" {			continue		}		encryptedContent := item.Get("encrypted_content")		if encryptedContent.Type != gjson.String {			continue		}		if _, err := signature.InspectGPTReasoningSignature(encryptedContent.String()); err == nil {			return true		}	}	return false} type codexReasoningReplayTurn struct {	marked               bool	assistantFingerprint string	requestFingerprint   string	callIDs              []string	items                [][]byte} func insertCodexReasoningReplayTurns(body []byte, replayItems [][]byte) ([]byte, bool) {	input := gjson.GetBytes(body, "input")	if !input.IsArray() || len(replayItems) == 0 {		return body, false	}	inputItems := input.Array()	turns := splitCodexReasoningReplayTurns(replayItems)	insertions := make(map[int][][]byte)	usedAnchorIndexes := make(map[int]bool)	prefixFingerprints := newCodexReplayPrefixFingerprints(inputItems)	fallbackAnchorEnd := len(inputItems) - 1	inserted := false	for turnIndex := len(turns) - 1; turnIndex >= 0; turnIndex-- {		turn := turns[turnIndex]		if len(turn.items) == 0 {			continue		}		if !turn.marked {			items := filterCodexReasoningReplayItemsForInput(body, turn.items)			if len(items) == 0 {				continue			}			index := codexReasoningReplayInsertIndex(inputItems, items)			items = codexAlignReasoningReplayToolCallIDs(inputItems, items)			insertions[index] = append(items, insertions[index]...)			inserted = true			continue		} 		anchorIndex, matched := codexReasoningReplayTurnAnchorIndex(inputItems, turn, fallbackAnchorEnd, usedAnchorIndexes, prefixFingerprints)		if !matched {			continue		}		usedAnchorIndexes[anchorIndex] = true		if turn.requestFingerprint == "" {			fallbackAnchorEnd = anchorIndex - 1		}		items := filterCodexReasoningReplayTurnItems(inputItems, turn.items)		if len(items) == 0 {			continue		}		items = codexAlignReasoningReplayToolCallIDs(inputItems, items)		insertions[anchorIndex] = append(items, insertions[anchorIndex]...)		inserted = true	}	if !inserted {		return body, false	} 	items := make([]string, 0, len(inputItems)+len(replayItems))	for index, inputItem := range inputItems {		for _, replayItem := range insertions[index] {			items = append(items, string(replayItem))		}		items = append(items, inputItem.Raw)	}	for _, replayItem := range insertions[len(inputItems)] {		items = append(items, string(replayItem))	}	updated, err := sjson.SetRawBytes(body, "input", []byte("["+strings.Join(items, ",")+"]"))	if err != nil {		return body, false	}	return updated, true} func splitCodexReasoningReplayTurns(items [][]byte) []codexReasoningReplayTurn {	turns := make([]codexReasoningReplayTurn, 0)	current := codexReasoningReplayTurn{}	appendCurrent := func() {		if len(current.items) > 0 {			turns = append(turns, current)		}	}	for _, item := range items {		itemResult := gjson.ParseBytes(item)		if strings.TrimSpace(itemResult.Get("type").String()) == internalcache.CodexReasoningReplayTurnType {			appendCurrent()			current = codexReasoningReplayTurn{				marked:               true,				assistantFingerprint: strings.TrimSpace(itemResult.Get("assistant_fingerprint").String()),				requestFingerprint:   strings.TrimSpace(itemResult.Get("request_fingerprint").String()),			}			if callIDs := itemResult.Get("call_ids"); callIDs.IsArray() {				for _, callIDResult := range callIDs.Array() {					if callID := strings.TrimSpace(callIDResult.String()); callID != "" {						current.callIDs = append(current.callIDs, callID)					}				}			}			continue		}		current.items = append(current.items, item)	}	appendCurrent()	return turns} func codexReasoningReplayTurnAnchorIndex(inputItems []gjson.Result, turn codexReasoningReplayTurn, fallbackEnd int, used map[int]bool, prefixFingerprints *codexReplayPrefixFingerprints) (int, bool) {	searchEnd := fallbackEnd	if turn.requestFingerprint != "" {		searchEnd = len(inputItems) - 1	}	if searchEnd >= len(inputItems) {		searchEnd = len(inputItems) - 1	}	matchesRequestPrefix := func(index int) bool {		return turn.requestFingerprint == "" || prefixFingerprints.at(index) == turn.requestFingerprint	}	if len(turn.callIDs) > 0 {		callIDs := make(map[string]bool)		for _, callID := range turn.callIDs {			for _, candidate := range codexReplayComparableCallIDs(callID) {				callIDs[candidate] = true			}		}		for index := searchEnd; index >= 0; index-- {			if used[index] || !matchesRequestPrefix(index) {				continue			}			itemType := strings.TrimSpace(inputItems[index].Get("type").String())			if itemType != "function_call" && itemType != "custom_tool_call" && itemType != "function_call_output" && itemType != "custom_tool_call_output" {				continue			}			for _, candidate := range codexReplayComparableCallIDs(inputItems[index].Get("call_id").String()) {				if callIDs[candidate] {					return index, true				}			}		}	}	if turn.assistantFingerprint != "" {		for index := searchEnd; index >= 0; index-- {			if used[index] || !matchesRequestPrefix(index) {				continue			}			if codexReplayAssistantMessageFingerprint(inputItems[index]) == turn.assistantFingerprint {				return index, true			}		}	}	if len(turn.callIDs) == 0 && turn.assistantFingerprint == "" {		return codexReasoningReplayInsertIndex(inputItems, turn.items), true	}	return 0, false} func filterCodexReasoningReplayTurnItems(inputItems []gjson.Result, items [][]byte) [][]byte {	existingReasoning := make(map[string]bool)	existingCalls := make(map[string]bool)	existingOutputs := make(map[string]bool)	for _, inputItem := range inputItems {		itemType := strings.TrimSpace(inputItem.Get("type").String())		switch itemType {		case "reasoning":			if encryptedContent := strings.TrimSpace(inputItem.Get("encrypted_content").String()); encryptedContent != "" {				existingReasoning[encryptedContent] = true			}		case "function_call_output", "custom_tool_call_output":			for _, candidate := range codexReplayComparableCallIDs(inputItem.Get("call_id").String()) {				existingOutputs[candidate] = true			}		}		for _, key := range codexReplayToolCallKeys(inputItem) {			existingCalls[key] = true		}	} 	filtered := make([][]byte, 0, len(items))	for _, item := range items {		itemResult := gjson.ParseBytes(item)		switch strings.TrimSpace(itemResult.Get("type").String()) {		case "reasoning":			if existingReasoning[strings.TrimSpace(itemResult.Get("encrypted_content").String())] {				continue			}		case "function_call", "custom_tool_call":			keys := codexReplayToolCallKeys(itemResult)			if len(keys) == 0 || codexReplayAnyToolCallKeyExists(existingCalls, keys) {				continue			}			hasMatchingOutput := false			for _, candidate := range codexReplayComparableCallIDs(itemResult.Get("call_id").String()) {				if existingOutputs[candidate] {					hasMatchingOutput = true					break				}			}			if !hasMatchingOutput {				continue			}			for _, key := range keys {				existingCalls[key] = true			}		default:			continue		}		filtered = append(filtered, item)	}	return filtered} func codexReplayAssistantMessageFingerprint(item gjson.Result) string {	itemType := strings.TrimSpace(item.Get("type").String())	if itemType != "" && itemType != "message" {		return ""	}	if !strings.EqualFold(strings.TrimSpace(item.Get("role").String()), "assistant") {		return ""	}	content := item.Get("content")	var builder strings.Builder	if content.Type == gjson.String {		builder.WriteString(content.String())	} else if content.IsArray() {		for _, part := range content.Array() {			switch strings.TrimSpace(part.Get("type").String()) {			case "input_text", "output_text":				builder.WriteString(part.Get("text").String())			case "refusal":				builder.WriteString("\x00refusal\x00")				builder.WriteString(part.Get("refusal").String())			default:				return ""			}		}	} else {		return ""	}	if builder.Len() == 0 {		return ""	}	sum := sha256.Sum256([]byte(builder.String()))	return hex.EncodeToString(sum[:])} func codexReplayInputPrefixFingerprint(inputItems []gjson.Result, end int) string {	if end < 0 || end > len(inputItems) {		return ""	}	hasher := sha256.New()	for index := 0; index < end; index++ {		_, _ = hasher.Write([]byte("\x00item\x00"))		_, _ = hasher.Write([]byte(inputItems[index].Raw))	}	return hex.EncodeToString(hasher.Sum(nil))} // codexReplayPrefixFingerprints answers codexReplayInputPrefixFingerprint queries// from one incremental hashing pass. The anchor search probes many prefixes per// turn; recomputing each prefix from scratch is O(n^2) hashing and stalled large// long-context requests for minutes before anything was sent upstream.type codexReplayPrefixFingerprints struct {	items  []gjson.Result	hasher hash.Hash	// sums[end] is the fingerprint of items[0:end]; extended lazily.	sums []string} func newCodexReplayPrefixFingerprints(items []gjson.Result) *codexReplayPrefixFingerprints {	hasher := sha256.New()	return &codexReplayPrefixFingerprints{		items:  items,		hasher: hasher,		sums:   []string{hex.EncodeToString(hasher.Sum(nil))},	}} func (f *codexReplayPrefixFingerprints) at(end int) string {	if end < 0 || end > len(f.items) {		return ""	}	// Sum copies the running digest state, so absorbing one item and	// snapshotting per step reproduces every prefix fingerprint exactly.	for len(f.sums) <= end {		next := len(f.sums) - 1		_, _ = f.hasher.Write([]byte("\x00item\x00"))		_, _ = io.WriteString(f.hasher, f.items[next].Raw)		f.sums = append(f.sums, hex.EncodeToString(f.hasher.Sum(nil)))	}	return f.sums[end]} func filterCodexReasoningReplayItemsForInput(body []byte, items [][]byte) [][]byte {

Lines 1–500 of 826.