60 lines
1.9 KiB
Go
60 lines
1.9 KiB
Go
package service
|
||||
|
|
|
|||
|
|
import "github.com/gin-gonic/gin"
|
|||
|
|
|
|||
|
|
// 请求级 hint 仅限 HTTP:缺失表示 unknown,false/true 都表示已完成 canonical 判定。
|
|||
|
|
const openAIImageIntentHintContextKey = "openai_image_intent_hint"
|
|||
|
|
|
|||
|
|
type openAIImageIntentClassifier func(endpoint string, requestedModel string, body []byte) bool
|
|||
|
|
|
|||
|
|
// SetOpenAIImageIntentHint 只写入请求级 canonical 判定,不记录 attempt-local 结果。
|
|||
|
|
func SetOpenAIImageIntentHint(c *gin.Context, imageIntent bool) {
|
|||
|
|
if c == nil || GetOpenAIClientTransport(c) != OpenAIClientTransportHTTP {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
c.Set(openAIImageIntentHintContextKey, imageIntent)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func getOpenAIImageIntentHint(c *gin.Context) (imageIntent bool, known bool) {
|
|||
|
|
if c == nil || GetOpenAIClientTransport(c) != OpenAIClientTransportHTTP {
|
|||
|
|
return false, false
|
|||
|
|
}
|
|||
|
|
value, ok := c.Get(openAIImageIntentHintContextKey)
|
|||
|
|
if !ok {
|
|||
|
|
return false, false
|
|||
|
|
}
|
|||
|
|
imageIntent, ok = value.(bool)
|
|||
|
|
return imageIntent, ok
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func resolveOpenAIImageIntentHint(
|
|||
|
|
c *gin.Context,
|
|||
|
|
requestedModel string,
|
|||
|
|
canonicalBody []byte,
|
|||
|
|
classify openAIImageIntentClassifier,
|
|||
|
|
) bool {
|
|||
|
|
if imageIntent, known := getOpenAIImageIntentHint(c); known {
|
|||
|
|
return imageIntent
|
|||
|
|
}
|
|||
|
|
imageIntent := classify(openAIResponsesEndpoint, requestedModel, canonicalBody)
|
|||
|
|
SetOpenAIImageIntentHint(c, imageIntent)
|
|||
|
|
return imageIntent
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func resolveOpenAIPassthroughImageIntent(
|
|||
|
|
c *gin.Context,
|
|||
|
|
canonicalRequestedModel string,
|
|||
|
|
canonicalBody []byte,
|
|||
|
|
attemptRequestedModel string,
|
|||
|
|
attemptBody []byte,
|
|||
|
|
attemptInvalidated bool,
|
|||
|
|
classify openAIImageIntentClassifier,
|
|||
|
|
) bool {
|
|||
|
|
imageIntent := resolveOpenAIImageIntentHint(c, canonicalRequestedModel, canonicalBody, classify)
|
|||
|
|
if attemptInvalidated {
|
|||
|
|
// strip/compact 改写只重算当前 attempt,不得把变换后的结果写回请求级 canonical hint。
|
|||
|
|
imageIntent = classify(openAIResponsesEndpoint, attemptRequestedModel, attemptBody)
|
|||
|
|
}
|
|||
|
|
return imageIntent
|
|||
|
|
}
|