/* * Copyright 2025 CloudWeGo Authors * * 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 einoagent import ( "context" "fmt" "os" "strconv" "github.com/cloudwego/eino-ext/components/retriever/redis" "github.com/cloudwego/eino/components/retriever" "github.com/cloudwego/eino/schema" redisCli "github.com/redis/go-redis/v9" redispkg "github.com/cloudwego/eino-examples/quickstart/eino_assistant/pkg/redis" ) func defaultRedisRetrieverConfig(ctx context.Context) (*redis.RetrieverConfig, error) { redisAddr := os.Getenv("REDIS_ADDR") redisClient := redisCli.NewClient(&redisCli.Options{ Addr: redisAddr, Protocol: 2, }) config := &redis.RetrieverConfig{ Client: redisClient, Index: fmt.Sprintf("%s%s", redispkg.RedisPrefix, redispkg.IndexName), Dialect: 2, ReturnFields: []string{redispkg.ContentField, redispkg.MetadataField, redispkg.DistanceField}, TopK: 8, VectorField: redispkg.VectorField, DocumentConverter: func(ctx context.Context, doc redisCli.Document) (*schema.Document, error) { resp := &schema.Document{ ID: doc.ID, Content: "", MetaData: map[string]any{}, } for field, val := range doc.Fields { if field == redispkg.ContentField { resp.Content = val } else if field == redispkg.MetadataField { resp.MetaData[field] = val } else if field == redispkg.DistanceField { distance, err := strconv.ParseFloat(val, 64) if err != nil { continue } resp.WithScore(1 - distance) } } return resp, nil }, } embeddingCfg11, err := defaultArkEmbeddingConfig(ctx) if err != nil { return nil, err } embeddingIns11, err := NewArkEmbedding(ctx, embeddingCfg11) if err != nil { return nil, err } config.Embedding = embeddingIns11 return config, nil } func NewRedisRetriever(ctx context.Context, config *redis.RetrieverConfig) (rtr retriever.Retriever, err error) { if config == nil { config, err = defaultRedisRetrieverConfig(ctx) if err != nil { return nil, err } } rtr, err = redis.NewRetriever(ctx, config) if err != nil { return nil, err } return rtr, nil }