针对您的AI网关设计问题,确实可以优化模型信息的提取方式,特别是对于大型请求。以下是几种高效方案:
GET /v1/completions HTTP/1.1
X-Model-Name: gpt-4
Content-Type: application/json
POST /v1/models/gpt-4/completions HTTP/1.1
func extractModelName(r *http.Request) (string, error) {
// 只读取前1KB内容进行解析
buffer := make([]byte, 1024)
n, _ := r.Body.Read(buffer)
// 使用正则表达式提取model字段
re := regexp.MustCompile(`"model"\s*:\s*"([^"]+)"`)
matches := re.FindSubmatch(buffer[:n])
if len(matches) >= 2 {
return string(matches[1]), nil
}
// 恢复请求体供后续处理
r.Body = io.NopCloser(io.MultiReader(bytes.NewReader(buffer[:n]), r.Body))
return "", errors.New("model not found")
}
func quickExtractModel(r *http.Request) (string, error) {
decoder := json.NewDecoder(r.Body)
// 查找顶层的"model"字段
for decoder.More() {
token, _ := decoder.Token()
if key, ok := token.(string); ok && key == "model" {
modelToken, _ := decoder.Token()
if modelName, ok := modelToken.(string); ok {
// 重置请求体
// ...
return modelName, nil
}
}
decoder.Skip() // 跳过其他字段的值
}
return "", errors.New("model not found")
}