Skip to content

Commit b5df7bd

Browse files
feat: send back raw request in extra fields (#1010)
## Summary This PR adds the ability to send back raw requests in API responses, complementing the existing raw response functionality. This feature helps with debugging and advanced use cases by providing visibility into the exact request payload sent to provider APIs. ## Changes - Added `SendBackRawRequest` field to provider configurations - Modified provider implementations to capture and return raw request data - Updated response handling to include raw requests in extra fields - Added database migrations for storing raw requests in logs - Enhanced UI to display raw requests in log details - Added configuration options in the provider settings UI ## Type of change - [x] Feature - [ ] Bug fix - [ ] Refactor - [ ] Documentation - [ ] Chore/CI ## Affected areas - [x] Core (Go) - [x] Transports (HTTP) - [x] Providers/Integrations - [x] Plugins - [x] UI (Next.js) - [ ] Docs ## How to test 1. Enable the "Include Raw Request" option in a provider's settings 2. Make a request to that provider 3. Check the response for the `raw_request` field in `extra_fields` 4. View the request details in the logs UI to see the raw request ```sh # Core/Transports go version go test ./... # UI cd ui pnpm i pnpm test pnpm build ``` ## Screenshots/Recordings N/A ## Breaking changes - [ ] Yes - [x] No ## Related issues N/A ## Security considerations Raw requests may contain sensitive information like API keys or user data. Users should be aware that enabling this feature will store this information in logs and return it in responses. ## Checklist - [x] I added/updated tests where appropriate - [x] I updated documentation where needed - [x] I verified builds succeed (Go and UI) - [x] I verified the CI pipeline passes locally if applicable
1 parent 8abd1d6 commit b5df7bd

File tree

45 files changed

+728
-89
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+728
-89
lines changed

core/changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
feat: send back raw request in extra fields
2+
feat: added support for reasoning in chat completions
3+
feat: enhanced reasoning support in responses api
4+
enhancement: improved internal inter provider conversions for integrations

core/providers/anthropic/anthropic.go

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type AnthropicProvider struct {
2323
client *fasthttp.Client // HTTP client for API requests
2424
apiVersion string // API version for the provider
2525
networkConfig schemas.NetworkConfig // Network configuration including extra headers
26+
sendBackRawRequest bool // Whether to include raw request in BifrostResponse
2627
sendBackRawResponse bool // Whether to include raw response in BifrostResponse
2728
customProviderConfig *schemas.CustomProviderConfig // Custom provider config
2829
}
@@ -103,6 +104,7 @@ func NewAnthropicProvider(config *schemas.ProviderConfig, logger schemas.Logger)
103104
client: client,
104105
apiVersion: "2023-06-01",
105106
networkConfig: config.NetworkConfig,
107+
sendBackRawRequest: config.SendBackRawRequest,
106108
sendBackRawResponse: config.SendBackRawResponse,
107109
customProviderConfig: config.CustomProviderConfig,
108110
}
@@ -199,7 +201,7 @@ func (provider *AnthropicProvider) listModelsByKey(ctx context.Context, key sche
199201

200202
// Parse Anthropic's response
201203
var anthropicResponse AnthropicListModelsResponse
202-
rawResponse, bifrostErr := providerUtils.HandleProviderResponse(resp.Body(), &anthropicResponse, providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
204+
rawRequest, rawResponse, bifrostErr := providerUtils.HandleProviderResponse(resp.Body(), &anthropicResponse, nil, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
203205
if bifrostErr != nil {
204206
return nil, bifrostErr
205207
}
@@ -208,6 +210,11 @@ func (provider *AnthropicProvider) listModelsByKey(ctx context.Context, key sche
208210
response := anthropicResponse.ToBifrostListModelsResponse(provider.GetProviderKey(), key.Models)
209211
response.ExtraFields.Latency = latency.Milliseconds()
210212

213+
// Set raw request if enabled
214+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
215+
response.ExtraFields.RawRequest = rawRequest
216+
}
217+
211218
// Set raw response if enabled
212219
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
213220
response.ExtraFields.RawResponse = rawResponse
@@ -264,7 +271,7 @@ func (provider *AnthropicProvider) TextCompletion(ctx context.Context, key schem
264271
response := acquireAnthropicTextResponse()
265272
defer releaseAnthropicTextResponse(response)
266273

267-
rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, provider.sendBackRawResponse)
274+
rawRequest, rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
268275
if bifrostErr != nil {
269276
return nil, bifrostErr
270277
}
@@ -277,6 +284,11 @@ func (provider *AnthropicProvider) TextCompletion(ctx context.Context, key schem
277284
bifrostResponse.ExtraFields.RequestType = schemas.TextCompletionRequest
278285
bifrostResponse.ExtraFields.Latency = latency.Milliseconds()
279286

287+
// Set raw request if enabled
288+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
289+
bifrostResponse.ExtraFields.RawRequest = rawRequest
290+
}
291+
280292
// Set raw response if enabled
281293
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
282294
bifrostResponse.ExtraFields.RawResponse = rawResponse
@@ -320,11 +332,10 @@ func (provider *AnthropicProvider) ChatCompletion(ctx context.Context, key schem
320332
response := AcquireAnthropicMessageResponse()
321333
defer ReleaseAnthropicMessageResponse(response)
322334

323-
rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
335+
rawRequest, rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
324336
if bifrostErr != nil {
325337
return nil, bifrostErr
326338
}
327-
328339
// Create final response
329340
bifrostResponse := response.ToBifrostChatResponse()
330341

@@ -334,6 +345,11 @@ func (provider *AnthropicProvider) ChatCompletion(ctx context.Context, key schem
334345
bifrostResponse.ExtraFields.RequestType = schemas.ChatCompletionRequest
335346
bifrostResponse.ExtraFields.Latency = latency.Milliseconds()
336347

348+
// Set raw request if enabled
349+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
350+
bifrostResponse.ExtraFields.RawRequest = rawRequest
351+
}
352+
337353
// Set raw response if enabled
338354
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
339355
bifrostResponse.ExtraFields.RawResponse = rawResponse
@@ -386,6 +402,7 @@ func (provider *AnthropicProvider) ChatCompletionStream(ctx context.Context, pos
386402
jsonData,
387403
headers,
388404
provider.networkConfig.ExtraHeaders,
405+
providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest),
389406
providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse),
390407
provider.GetProviderKey(),
391408
postHookRunner,
@@ -403,6 +420,7 @@ func HandleAnthropicChatCompletionStreaming(
403420
jsonBody []byte,
404421
headers map[string]string,
405422
extraHeaders map[string]string,
423+
sendBackRawRequest bool,
406424
sendBackRawResponse bool,
407425
providerName schemas.ModelProvider,
408426
postHookRunner schemas.PostHookRunner,
@@ -635,6 +653,10 @@ func HandleAnthropicChatCompletionStreaming(
635653
return
636654
}
637655
}
656+
// Set raw request if enabled
657+
if sendBackRawRequest {
658+
providerUtils.ParseAndSetRawRequest(&response.ExtraFields, jsonBody)
659+
}
638660
response.ExtraFields.Latency = time.Since(startTime).Milliseconds()
639661
ctx = context.WithValue(ctx, schemas.BifrostContextKeyStreamEndIndicator, true)
640662
providerUtils.ProcessAndSendResponse(ctx, postHookRunner, providerUtils.GetBifrostResponseForStreamResponse(nil, response, nil, nil, nil), responseChan)
@@ -672,7 +694,7 @@ func (provider *AnthropicProvider) Responses(ctx context.Context, key schemas.Ke
672694
response := AcquireAnthropicMessageResponse()
673695
defer ReleaseAnthropicMessageResponse(response)
674696

675-
rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
697+
rawRequest, rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
676698
if bifrostErr != nil {
677699
return nil, bifrostErr
678700
}
@@ -686,6 +708,11 @@ func (provider *AnthropicProvider) Responses(ctx context.Context, key schemas.Ke
686708
bifrostResponse.ExtraFields.RequestType = schemas.ResponsesRequest
687709
bifrostResponse.ExtraFields.Latency = latency.Milliseconds()
688710

711+
// Set raw request if enabled
712+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
713+
bifrostResponse.ExtraFields.RawRequest = rawRequest
714+
}
715+
689716
// Set raw response if enabled
690717
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
691718
bifrostResponse.ExtraFields.RawResponse = rawResponse
@@ -735,6 +762,7 @@ func (provider *AnthropicProvider) ResponsesStream(ctx context.Context, postHook
735762
jsonBody,
736763
headers,
737764
provider.networkConfig.ExtraHeaders,
765+
providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest),
738766
providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse),
739767
provider.GetProviderKey(),
740768
postHookRunner,
@@ -752,6 +780,7 @@ func HandleAnthropicResponsesStream(
752780
jsonBody []byte,
753781
headers map[string]string,
754782
extraHeaders map[string]string,
783+
sendBackRawRequest bool,
755784
sendBackRawResponse bool,
756785
providerName schemas.ModelProvider,
757786
postHookRunner schemas.PostHookRunner,
@@ -959,6 +988,10 @@ func HandleAnthropicResponsesStream(
959988
response.Response = &schemas.BifrostResponsesResponse{}
960989
}
961990
response.Response.Usage = usage
991+
// Set raw request if enabled
992+
if sendBackRawRequest {
993+
providerUtils.ParseAndSetRawRequest(&response.ExtraFields, jsonBody)
994+
}
962995
response.ExtraFields.Latency = time.Since(startTime).Milliseconds()
963996
ctx = context.WithValue(ctx, schemas.BifrostContextKeyStreamEndIndicator, true)
964997
providerUtils.ProcessAndSendResponse(ctx, postHookRunner, providerUtils.GetBifrostResponseForStreamResponse(nil, nil, response, nil, nil), responseChan)

core/providers/azure/azure.go

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type AzureProvider struct {
2323
logger schemas.Logger // Logger for provider operations
2424
client *fasthttp.Client // HTTP client for API requests
2525
networkConfig schemas.NetworkConfig // Network configuration including extra headers
26+
sendBackRawRequest bool // Whether to include raw request in BifrostResponse
2627
sendBackRawResponse bool // Whether to include raw response in BifrostResponse
2728
}
2829

@@ -47,6 +48,7 @@ func NewAzureProvider(config *schemas.ProviderConfig, logger schemas.Logger) (*A
4748
logger: logger,
4849
client: client,
4950
networkConfig: config.NetworkConfig,
51+
sendBackRawRequest: config.SendBackRawRequest,
5052
sendBackRawResponse: config.SendBackRawResponse,
5153
}, nil
5254
}
@@ -192,7 +194,7 @@ func (provider *AzureProvider) listModelsByKey(ctx context.Context, key schemas.
192194

193195
// Parse Azure-specific response
194196
azureResponse := &AzureListModelsResponse{}
195-
rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, azureResponse, provider.sendBackRawResponse)
197+
rawRequest, rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, azureResponse, nil, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
196198
if bifrostErr != nil {
197199
return nil, bifrostErr
198200
}
@@ -205,6 +207,12 @@ func (provider *AzureProvider) listModelsByKey(ctx context.Context, key schemas.
205207

206208
response.ExtraFields.Latency = latency.Milliseconds()
207209

210+
// Set raw request if enabled
211+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
212+
response.ExtraFields.RawRequest = rawRequest
213+
}
214+
215+
// Set raw response if enabled
208216
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
209217
response.ExtraFields.RawResponse = rawResponse
210218
}
@@ -263,7 +271,7 @@ func (provider *AzureProvider) TextCompletion(ctx context.Context, key schemas.K
263271

264272
response := &schemas.BifrostTextCompletionResponse{}
265273

266-
rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, provider.sendBackRawResponse)
274+
rawRequest, rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
267275
if bifrostErr != nil {
268276
return nil, bifrostErr
269277
}
@@ -274,6 +282,11 @@ func (provider *AzureProvider) TextCompletion(ctx context.Context, key schemas.K
274282
response.ExtraFields.RequestType = schemas.TextCompletionRequest
275283
response.ExtraFields.Latency = latency.Milliseconds()
276284

285+
// Set raw request if enabled
286+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
287+
response.ExtraFields.RawRequest = rawRequest
288+
}
289+
277290
// Set raw response if enabled
278291
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
279292
response.ExtraFields.RawResponse = rawResponse
@@ -324,6 +337,7 @@ func (provider *AzureProvider) TextCompletionStream(ctx context.Context, postHoo
324337
request,
325338
authHeader,
326339
provider.networkConfig.ExtraHeaders,
340+
providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest),
327341
providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse),
328342
provider.GetProviderKey(),
329343
postHookRunner,
@@ -388,18 +402,19 @@ func (provider *AzureProvider) ChatCompletion(ctx context.Context, key schemas.K
388402
}
389403

390404
response := &schemas.BifrostChatResponse{}
405+
var rawRequest interface{}
391406
var rawResponse interface{}
392407

393408
if schemas.IsAnthropicModel(deployment) {
394409
anthropicResponse := anthropic.AcquireAnthropicMessageResponse()
395410
defer anthropic.ReleaseAnthropicMessageResponse(anthropicResponse)
396-
rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, anthropicResponse, provider.sendBackRawResponse)
411+
rawRequest, rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, anthropicResponse, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
397412
if bifrostErr != nil {
398413
return nil, bifrostErr
399414
}
400415
response = anthropicResponse.ToBifrostChatResponse()
401416
} else {
402-
rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, response, provider.sendBackRawResponse)
417+
rawRequest, rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, response, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
403418
if bifrostErr != nil {
404419
return nil, bifrostErr
405420
}
@@ -411,6 +426,11 @@ func (provider *AzureProvider) ChatCompletion(ctx context.Context, key schemas.K
411426
response.ExtraFields.Latency = latency.Milliseconds()
412427
response.ExtraFields.RequestType = schemas.ChatCompletionRequest
413428

429+
// Set raw request if enabled
430+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
431+
response.ExtraFields.RawRequest = rawRequest
432+
}
433+
414434
// Set raw response if enabled
415435
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
416436
response.ExtraFields.RawResponse = rawResponse
@@ -472,6 +492,7 @@ func (provider *AzureProvider) ChatCompletionStream(ctx context.Context, postHoo
472492
jsonData,
473493
authHeader,
474494
provider.networkConfig.ExtraHeaders,
495+
providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest),
475496
providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse),
476497
provider.GetProviderKey(),
477498
postHookRunner,
@@ -499,6 +520,7 @@ func (provider *AzureProvider) ChatCompletionStream(ctx context.Context, postHoo
499520
request,
500521
authHeader,
501522
provider.networkConfig.ExtraHeaders,
523+
providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest),
502524
providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse),
503525
provider.GetProviderKey(),
504526
postHookRunner,
@@ -570,18 +592,19 @@ func (provider *AzureProvider) Responses(ctx context.Context, key schemas.Key, r
570592
}
571593

572594
response := &schemas.BifrostResponsesResponse{}
595+
var rawRequest interface{}
573596
var rawResponse interface{}
574597

575598
if schemas.IsAnthropicModel(deployment) {
576599
anthropicResponse := anthropic.AcquireAnthropicMessageResponse()
577600
defer anthropic.ReleaseAnthropicMessageResponse(anthropicResponse)
578-
rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, anthropicResponse, provider.sendBackRawResponse)
601+
rawRequest, rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, anthropicResponse, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
579602
if bifrostErr != nil {
580603
return nil, bifrostErr
581604
}
582605
response = anthropicResponse.ToBifrostResponsesResponse()
583606
} else {
584-
rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, response, provider.sendBackRawResponse)
607+
rawRequest, rawResponse, bifrostErr = providerUtils.HandleProviderResponse(responseBody, response, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
585608
if bifrostErr != nil {
586609
return nil, bifrostErr
587610
}
@@ -593,6 +616,11 @@ func (provider *AzureProvider) Responses(ctx context.Context, key schemas.Key, r
593616
response.ExtraFields.Latency = latency.Milliseconds()
594617
response.ExtraFields.RequestType = schemas.ResponsesRequest
595618

619+
// Set raw request if enabled
620+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
621+
response.ExtraFields.RawRequest = rawRequest
622+
}
623+
596624
// Set raw response if enabled
597625
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
598626
response.ExtraFields.RawResponse = rawResponse
@@ -651,6 +679,7 @@ func (provider *AzureProvider) ResponsesStream(ctx context.Context, postHookRunn
651679
jsonData,
652680
authHeader,
653681
provider.networkConfig.ExtraHeaders,
682+
providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest),
654683
providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse),
655684
provider.GetProviderKey(),
656685
postHookRunner,
@@ -679,6 +708,7 @@ func (provider *AzureProvider) ResponsesStream(ctx context.Context, postHookRunn
679708
request,
680709
authHeader,
681710
provider.networkConfig.ExtraHeaders,
711+
providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest),
682712
providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse),
683713
provider.GetProviderKey(),
684714
postHookRunner,
@@ -728,7 +758,7 @@ func (provider *AzureProvider) Embedding(ctx context.Context, key schemas.Key, r
728758
response := &schemas.BifrostEmbeddingResponse{}
729759

730760
// Use enhanced response handler with pre-allocated response
731-
rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, provider.sendBackRawResponse)
761+
rawRequest, rawResponse, bifrostErr := providerUtils.HandleProviderResponse(responseBody, response, jsonData, providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest), providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse))
732762
if bifrostErr != nil {
733763
return nil, bifrostErr
734764
}
@@ -739,6 +769,12 @@ func (provider *AzureProvider) Embedding(ctx context.Context, key schemas.Key, r
739769
response.ExtraFields.ModelDeployment = deployment
740770
response.ExtraFields.RequestType = schemas.EmbeddingRequest
741771

772+
// Set raw request if enabled
773+
if providerUtils.ShouldSendBackRawRequest(ctx, provider.sendBackRawRequest) {
774+
response.ExtraFields.RawRequest = rawRequest
775+
}
776+
777+
// Set raw response if enabled
742778
if providerUtils.ShouldSendBackRawResponse(ctx, provider.sendBackRawResponse) {
743779
response.ExtraFields.RawResponse = rawResponse
744780
}

0 commit comments

Comments
 (0)