- 新端点 /ai/v1/audio/speech(xai.grok-tts)、/rerank(cohere.rerank-v4)、/moderations(OCI Guardrails) - Responses 放行 code_interpreter 与远程 mcp 工具,web_search/x_search 解除仅非流式限制 - 模型能力映射扩展:TEXT_RERANK→RERANK、TEXT_TO_AUDIO→TTS - AI 网关文档独立 docs/ai-gateway.md,字段兼容矩阵只列支持项;README 精简引用 - swagger 修缺:135 处响应注解具体化,RawMessage/联合类型统一渲染 AnyJSON,overrides 迁至 docs/.swaggo - CHANGELOG 0.4.0,版本段不再记日期;DASH_VERSION v0.4.0
74 lines
2.7 KiB
Go
74 lines
2.7 KiB
Go
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 / code_interpreter)与 mcp 已被 Oracle 文档正式支持,工具参数与限制
|
|
// 遵循 xAI 规格;调用方须自行校验并改写请求体(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
|
|
}
|