(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo, requestMode int)
| 128 | } |
| 129 | |
| 130 | func awsStreamHandler(c *gin.Context, resp *http.Response, info *relaycommon.RelayInfo, requestMode int) (*types.NewAPIError, *dto.Usage) { |
| 131 | awsCli, err := newAwsClient(c, info) |
| 132 | if err != nil { |
| 133 | return types.NewError(err, types.ErrorCodeChannelAwsClientError), nil |
| 134 | } |
| 135 | |
| 136 | awsModelId := awsModelID(c.GetString("request_model")) |
| 137 | |
| 138 | awsRegionPrefix := awsRegionPrefix(awsCli.Options().Region) |
| 139 | canCrossRegion := awsModelCanCrossRegion(awsModelId, awsRegionPrefix) |
| 140 | if canCrossRegion { |
| 141 | awsModelId = awsModelCrossRegion(awsModelId, awsRegionPrefix) |
| 142 | } |
| 143 | |
| 144 | awsReq := &bedrockruntime.InvokeModelWithResponseStreamInput{ |
| 145 | ModelId: aws.String(awsModelId), |
| 146 | Accept: aws.String("application/json"), |
| 147 | ContentType: aws.String("application/json"), |
| 148 | } |
| 149 | |
| 150 | claudeReq_, ok := c.Get("converted_request") |
| 151 | if !ok { |
| 152 | return types.NewError(errors.New("aws claude request not found"), types.ErrorCodeInvalidRequest), nil |
| 153 | } |
| 154 | claudeReq := claudeReq_.(*dto.ClaudeRequest) |
| 155 | |
| 156 | awsClaudeReq := copyRequest(claudeReq) |
| 157 | awsReq.Body, err = json.Marshal(awsClaudeReq) |
| 158 | if err != nil { |
| 159 | return types.NewError(errors.Wrap(err, "marshal request"), types.ErrorCodeBadResponseBody), nil |
| 160 | } |
| 161 | |
| 162 | awsResp, err := awsCli.InvokeModelWithResponseStream(c.Request.Context(), awsReq) |
| 163 | if err != nil { |
| 164 | return types.NewError(errors.Wrap(err, "InvokeModelWithResponseStream"), types.ErrorCodeChannelAwsClientError), nil |
| 165 | } |
| 166 | stream := awsResp.GetStream() |
| 167 | defer stream.Close() |
| 168 | |
| 169 | claudeInfo := &claude.ClaudeResponseInfo{ |
| 170 | ResponseId: helper.GetResponseID(c), |
| 171 | Created: common.GetTimestamp(), |
| 172 | Model: info.UpstreamModelName, |
| 173 | ResponseText: strings.Builder{}, |
| 174 | Usage: &dto.Usage{}, |
| 175 | } |
| 176 | |
| 177 | for event := range stream.Events() { |
| 178 | switch v := event.(type) { |
| 179 | case *bedrockruntimeTypes.ResponseStreamMemberChunk: |
| 180 | info.SetFirstResponseTime() |
| 181 | respErr := claude.HandleStreamResponseData(c, info, claudeInfo, string(v.Value.Bytes), RequestModeMessage) |
| 182 | if respErr != nil { |
| 183 | return respErr, nil |
| 184 | } |
| 185 | case *bedrockruntimeTypes.UnknownUnionMember: |
| 186 | fmt.Println("unknown tag:", v.Tag) |
| 187 | return types.NewError(errors.New("unknown response type"), types.ErrorCodeInvalidRequest), nil |
no test coverage detected