| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357 |
- package service
- import (
- "encoding/json"
- "strconv"
- "strings"
- "testing"
- "github.com/tidwall/gjson"
- )
- var (
- benchmarkToolContinuationBoolSink bool
- benchmarkWSParseStringSink string
- benchmarkWSParseMapSink map[string]any
- benchmarkUsageSink OpenAIUsage
- )
- func BenchmarkToolContinuationValidationLegacy(b *testing.B) {
- reqBody := benchmarkToolContinuationRequestBody()
- b.ReportAllocs()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- benchmarkToolContinuationBoolSink = legacyValidateFunctionCallOutputContext(reqBody)
- }
- }
- func BenchmarkToolContinuationValidationOptimized(b *testing.B) {
- reqBody := benchmarkToolContinuationRequestBody()
- b.ReportAllocs()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- benchmarkToolContinuationBoolSink = optimizedValidateFunctionCallOutputContext(reqBody)
- }
- }
- func BenchmarkWSIngressPayloadParseLegacy(b *testing.B) {
- raw := benchmarkWSIngressPayloadBytes()
- b.ReportAllocs()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- eventType, model, promptCacheKey, previousResponseID, payload, err := legacyParseWSIngressPayload(raw)
- if err == nil {
- benchmarkWSParseStringSink = eventType + model + promptCacheKey + previousResponseID
- benchmarkWSParseMapSink = payload
- }
- }
- }
- func BenchmarkWSIngressPayloadParseOptimized(b *testing.B) {
- raw := benchmarkWSIngressPayloadBytes()
- b.ReportAllocs()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- eventType, model, promptCacheKey, previousResponseID, payload, err := optimizedParseWSIngressPayload(raw)
- if err == nil {
- benchmarkWSParseStringSink = eventType + model + promptCacheKey + previousResponseID
- benchmarkWSParseMapSink = payload
- }
- }
- }
- func BenchmarkOpenAIUsageExtractLegacy(b *testing.B) {
- body := benchmarkOpenAIUsageJSONBytes()
- b.ReportAllocs()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- usage, ok := legacyExtractOpenAIUsageFromJSONBytes(body)
- if ok {
- benchmarkUsageSink = usage
- }
- }
- }
- func BenchmarkOpenAIUsageExtractOptimized(b *testing.B) {
- body := benchmarkOpenAIUsageJSONBytes()
- b.ReportAllocs()
- b.ResetTimer()
- for i := 0; i < b.N; i++ {
- usage, ok := extractOpenAIUsageFromJSONBytes(body)
- if ok {
- benchmarkUsageSink = usage
- }
- }
- }
- func benchmarkToolContinuationRequestBody() map[string]any {
- input := make([]any, 0, 64)
- for i := 0; i < 24; i++ {
- input = append(input, map[string]any{
- "type": "text",
- "text": "benchmark text",
- })
- }
- for i := 0; i < 10; i++ {
- callID := "call_" + strconv.Itoa(i)
- input = append(input, map[string]any{
- "type": "tool_call",
- "call_id": callID,
- })
- input = append(input, map[string]any{
- "type": "function_call_output",
- "call_id": callID,
- })
- input = append(input, map[string]any{
- "type": "item_reference",
- "id": callID,
- })
- }
- return map[string]any{
- "model": "gpt-5.3-codex",
- "input": input,
- }
- }
- func benchmarkWSIngressPayloadBytes() []byte {
- return []byte(`{"type":"response.create","model":"gpt-5.3-codex","prompt_cache_key":"cache_bench","previous_response_id":"resp_prev_bench","input":[{"type":"message","role":"user","content":[{"type":"input_text","text":"hello"}]}]}`)
- }
- func benchmarkOpenAIUsageJSONBytes() []byte {
- return []byte(`{"id":"resp_bench","object":"response","model":"gpt-5.3-codex","usage":{"input_tokens":3210,"output_tokens":987,"input_tokens_details":{"cached_tokens":456}}}`)
- }
- func legacyValidateFunctionCallOutputContext(reqBody map[string]any) bool {
- if !legacyHasFunctionCallOutput(reqBody) {
- return true
- }
- previousResponseID, _ := reqBody["previous_response_id"].(string)
- if strings.TrimSpace(previousResponseID) != "" {
- return true
- }
- if legacyHasToolCallContext(reqBody) {
- return true
- }
- if legacyHasFunctionCallOutputMissingCallID(reqBody) {
- return false
- }
- callIDs := legacyFunctionCallOutputCallIDs(reqBody)
- return legacyHasItemReferenceForCallIDs(reqBody, callIDs)
- }
- func optimizedValidateFunctionCallOutputContext(reqBody map[string]any) bool {
- validation := ValidateFunctionCallOutputContext(reqBody)
- if !validation.HasFunctionCallOutput {
- return true
- }
- previousResponseID, _ := reqBody["previous_response_id"].(string)
- if strings.TrimSpace(previousResponseID) != "" {
- return true
- }
- if validation.HasToolCallContext {
- return true
- }
- if validation.HasFunctionCallOutputMissingCallID {
- return false
- }
- return validation.HasItemReferenceForAllCallIDs
- }
- func legacyHasFunctionCallOutput(reqBody map[string]any) bool {
- if reqBody == nil {
- return false
- }
- input, ok := reqBody["input"].([]any)
- if !ok {
- return false
- }
- for _, item := range input {
- itemMap, ok := item.(map[string]any)
- if !ok {
- continue
- }
- itemType, _ := itemMap["type"].(string)
- if itemType == "function_call_output" {
- return true
- }
- }
- return false
- }
- func legacyHasToolCallContext(reqBody map[string]any) bool {
- if reqBody == nil {
- return false
- }
- input, ok := reqBody["input"].([]any)
- if !ok {
- return false
- }
- for _, item := range input {
- itemMap, ok := item.(map[string]any)
- if !ok {
- continue
- }
- itemType, _ := itemMap["type"].(string)
- if itemType != "tool_call" && itemType != "function_call" {
- continue
- }
- if callID, ok := itemMap["call_id"].(string); ok && strings.TrimSpace(callID) != "" {
- return true
- }
- }
- return false
- }
- func legacyFunctionCallOutputCallIDs(reqBody map[string]any) []string {
- if reqBody == nil {
- return nil
- }
- input, ok := reqBody["input"].([]any)
- if !ok {
- return nil
- }
- ids := make(map[string]struct{})
- for _, item := range input {
- itemMap, ok := item.(map[string]any)
- if !ok {
- continue
- }
- itemType, _ := itemMap["type"].(string)
- if itemType != "function_call_output" {
- continue
- }
- if callID, ok := itemMap["call_id"].(string); ok && strings.TrimSpace(callID) != "" {
- ids[callID] = struct{}{}
- }
- }
- if len(ids) == 0 {
- return nil
- }
- callIDs := make([]string, 0, len(ids))
- for id := range ids {
- callIDs = append(callIDs, id)
- }
- return callIDs
- }
- func legacyHasFunctionCallOutputMissingCallID(reqBody map[string]any) bool {
- if reqBody == nil {
- return false
- }
- input, ok := reqBody["input"].([]any)
- if !ok {
- return false
- }
- for _, item := range input {
- itemMap, ok := item.(map[string]any)
- if !ok {
- continue
- }
- itemType, _ := itemMap["type"].(string)
- if itemType != "function_call_output" {
- continue
- }
- callID, _ := itemMap["call_id"].(string)
- if strings.TrimSpace(callID) == "" {
- return true
- }
- }
- return false
- }
- func legacyHasItemReferenceForCallIDs(reqBody map[string]any, callIDs []string) bool {
- if reqBody == nil || len(callIDs) == 0 {
- return false
- }
- input, ok := reqBody["input"].([]any)
- if !ok {
- return false
- }
- referenceIDs := make(map[string]struct{})
- for _, item := range input {
- itemMap, ok := item.(map[string]any)
- if !ok {
- continue
- }
- itemType, _ := itemMap["type"].(string)
- if itemType != "item_reference" {
- continue
- }
- idValue, _ := itemMap["id"].(string)
- idValue = strings.TrimSpace(idValue)
- if idValue == "" {
- continue
- }
- referenceIDs[idValue] = struct{}{}
- }
- if len(referenceIDs) == 0 {
- return false
- }
- for _, callID := range callIDs {
- if _, ok := referenceIDs[callID]; !ok {
- return false
- }
- }
- return true
- }
- func legacyParseWSIngressPayload(raw []byte) (eventType, model, promptCacheKey, previousResponseID string, payload map[string]any, err error) {
- values := gjson.GetManyBytes(raw, "type", "model", "prompt_cache_key", "previous_response_id")
- eventType = strings.TrimSpace(values[0].String())
- if eventType == "" {
- eventType = "response.create"
- }
- model = strings.TrimSpace(values[1].String())
- promptCacheKey = strings.TrimSpace(values[2].String())
- previousResponseID = strings.TrimSpace(values[3].String())
- payload = make(map[string]any)
- if err = json.Unmarshal(raw, &payload); err != nil {
- return "", "", "", "", nil, err
- }
- if _, exists := payload["type"]; !exists {
- payload["type"] = "response.create"
- }
- return eventType, model, promptCacheKey, previousResponseID, payload, nil
- }
- func optimizedParseWSIngressPayload(raw []byte) (eventType, model, promptCacheKey, previousResponseID string, payload map[string]any, err error) {
- payload = make(map[string]any)
- if err = json.Unmarshal(raw, &payload); err != nil {
- return "", "", "", "", nil, err
- }
- eventType = openAIWSPayloadString(payload, "type")
- if eventType == "" {
- eventType = "response.create"
- payload["type"] = eventType
- }
- model = openAIWSPayloadString(payload, "model")
- promptCacheKey = openAIWSPayloadString(payload, "prompt_cache_key")
- previousResponseID = openAIWSPayloadString(payload, "previous_response_id")
- return eventType, model, promptCacheKey, previousResponseID, payload, nil
- }
- func legacyExtractOpenAIUsageFromJSONBytes(body []byte) (OpenAIUsage, bool) {
- var response struct {
- Usage struct {
- InputTokens int `json:"input_tokens"`
- OutputTokens int `json:"output_tokens"`
- InputTokenDetails struct {
- CachedTokens int `json:"cached_tokens"`
- } `json:"input_tokens_details"`
- } `json:"usage"`
- }
- if err := json.Unmarshal(body, &response); err != nil {
- return OpenAIUsage{}, false
- }
- return OpenAIUsage{
- InputTokens: response.Usage.InputTokens,
- OutputTokens: response.Usage.OutputTokens,
- CacheReadInputTokens: response.Usage.InputTokenDetails.CachedTokens,
- }, true
- }
|