package oci import ( "bytes" "context" "fmt" "io" "net/http" "github.com/oracle/oci-go-sdk/v65/common" ) // compatResponsesLimit 限制直通响应体大小;web_search 输出含多段引用,给足余量。 const compatResponsesLimit = int64(8 << 20) // GenAiCompatResponses 实现 Client:把 OpenAI Responses 请求体直通到 OCI // `/20231130/actions/v1/responses`(IAM 签名)。该端点实测可执行 xAI 服务端工具 // (web_search / x_search),但不在 Oracle 文档化工具白名单内,行为可能随服务 // 版本、模型或区域变化;调用方须自行校验并改写请求体(store/stream)。 func (c *RealClient) GenAiCompatResponses(ctx context.Context, cred Credentials, region string, body []byte) ([]byte, error) { ic, err := c.genAiInferenceClient(cred, region) if err != nil { return nil, err } client := ic.BaseClient common.UpdateEndpointTemplateForOptions(&client) common.SetMissingTemplateParams(&client) request, err := http.NewRequestWithContext(ctx, http.MethodPost, "/actions/v1/responses", bytes.NewReader(body)) if err != nil { return nil, fmt.Errorf("build compat responses request: %w", err) } request.Header.Set("Content-Type", "application/json") request.Header.Set("CompartmentId", cred.TenancyOCID) request.Header.Set("opc-compartment-id", cred.TenancyOCID) response, err := client.Call(ctx, request) if err != nil { return nil, err } defer response.Body.Close() payload, err := io.ReadAll(io.LimitReader(response.Body, compatResponsesLimit)) if err != nil { return nil, fmt.Errorf("read compat responses body: %w", err) } return payload, nil } // GenAiCompatResponsesStream 实现 Client:以流式直通 OCI `/actions/v1/responses`, // 建立成功(2xx)返回 SSE body(调用方负责 Close);建立失败返回 SDK ServiceError, // 与既有渠道切换/熔断错误分类兼容。请求体须由调用方置 stream:true。 func (c *RealClient) GenAiCompatResponsesStream(ctx context.Context, cred Credentials, region string, body []byte) (io.ReadCloser, error) { ic, err := c.genAiInferenceClient(cred, region) if err != nil { return nil, err } client := ic.BaseClient common.UpdateEndpointTemplateForOptions(&client) common.SetMissingTemplateParams(&client) request, err := http.NewRequestWithContext(ctx, http.MethodPost, "/actions/v1/responses", bytes.NewReader(body)) if err != nil { return nil, fmt.Errorf("build compat responses stream request: %w", err) } request.Header.Set("Content-Type", "application/json") request.Header.Set("CompartmentId", cred.TenancyOCID) request.Header.Set("opc-compartment-id", cred.TenancyOCID) response, err := client.Call(ctx, request) if err != nil { if response != nil && response.Body != nil { response.Body.Close() } return nil, err } return response.Body, nil }