Files
ragflow/internal/common/reference_metadata.go
Jack eee6ad546f feat: add ResolveReferenceMetadata utility function (#15663)
Add `ResolveReferenceMetadata` to parse `include_metadata` /
`metadata_fields` from request and config payloads.

### Changes
- **New**: `internal/common/reference_metadata.go` — pure function, zero
dependencies
- **New**: `internal/common/reference_metadata_test.go` — 8 test cases

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 22:34:18 +08:00

65 lines
2.0 KiB
Go

//
// Copyright 2026 The InfiniFlow Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package common
// ResolveReferenceMetadata resolves metadata include/fields from request and
// optional config. Request values take precedence over config values.
// Supports legacy request keys: include_metadata / metadata_fields.
// Python equivalent: api/utils/reference_metadata_utils.py::resolve_reference_metadata_preferences()
func ResolveReferenceMetadata(requestPayload, configPayload map[string]interface{}) (bool, []string) {
resolved := make(map[string]interface{})
// Config reference_metadata
if configPayload != nil {
if cfg, ok := configPayload["reference_metadata"].(map[string]interface{}); ok {
for k, v := range cfg {
resolved[k] = v
}
}
}
// Request reference_metadata (overrides config)
if requestPayload != nil {
if req, ok := requestPayload["reference_metadata"].(map[string]interface{}); ok {
for k, v := range req {
resolved[k] = v
}
}
// Legacy keys
if v, ok := requestPayload["include_metadata"]; ok {
resolved["include"] = v
}
if v, ok := requestPayload["metadata_fields"]; ok {
resolved["fields"] = v
}
}
include, _ := resolved["include"].(bool)
rawFields, ok := resolved["fields"].([]interface{})
if !ok {
return include, nil
}
var fields []string
for _, f := range rawFields {
if s, ok := f.(string); ok {
fields = append(fields, s)
}
}
return include, fields
}