212 lines
6.8 KiB
Go
212 lines
6.8 KiB
Go
// Package client provides the implementation for interacting with the WeKnora API
|
|
// The KnowledgeBase related interfaces are used to manage knowledge bases
|
|
// Knowledge bases are collections of knowledge entries that can be used for question-answering
|
|
// They can also be searched and queried using hybrid search
|
|
package client
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"time"
|
|
)
|
|
|
|
// KnowledgeBase represents a knowledge base
|
|
type KnowledgeBase struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"` // Name must be unique within the same tenant
|
|
Description string `json:"description"`
|
|
TenantID uint `json:"tenant_id"` // Changed to uint type
|
|
ChunkingConfig ChunkingConfig `json:"chunking_config"`
|
|
ImageProcessingConfig ImageProcessingConfig `json:"image_processing_config"`
|
|
EmbeddingModelID string `json:"embedding_model_id"`
|
|
SummaryModelID string `json:"summary_model_id"` // Summary model ID
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// KnowledgeBaseConfig represents knowledge base configuration
|
|
type KnowledgeBaseConfig struct {
|
|
ChunkingConfig ChunkingConfig `json:"chunking_config"`
|
|
ImageProcessingConfig ImageProcessingConfig `json:"image_processing_config"`
|
|
}
|
|
|
|
// ChunkingConfig represents document chunking configuration
|
|
type ChunkingConfig struct {
|
|
ChunkSize int `json:"chunk_size"` // Chunk size
|
|
ChunkOverlap int `json:"chunk_overlap"` // Overlap size
|
|
Separators []string `json:"separators"` // Separators
|
|
EnableMultimodal bool `json:"enable_multimodal"` // Whether to enable multimodal processing
|
|
}
|
|
|
|
// ImageProcessingConfig represents image processing configuration
|
|
type ImageProcessingConfig struct {
|
|
ModelID string `json:"model_id"` // Multimodal model ID
|
|
}
|
|
|
|
// KnowledgeBaseResponse knowledge base response
|
|
type KnowledgeBaseResponse struct {
|
|
Success bool `json:"success"`
|
|
Data KnowledgeBase `json:"data"`
|
|
}
|
|
|
|
// KnowledgeBaseListResponse knowledge base list response
|
|
type KnowledgeBaseListResponse struct {
|
|
Success bool `json:"success"`
|
|
Data []KnowledgeBase `json:"data"`
|
|
}
|
|
|
|
// SearchResult represents search result
|
|
type SearchResult struct {
|
|
ID string `json:"id"`
|
|
Content string `json:"content"`
|
|
KnowledgeID string `json:"knowledge_id"`
|
|
ChunkIndex int `json:"chunk_index"`
|
|
KnowledgeTitle string `json:"knowledge_title"`
|
|
StartAt int `json:"start_at"`
|
|
EndAt int `json:"end_at"`
|
|
Seq int `json:"seq"`
|
|
Score float64 `json:"score"`
|
|
ChunkType string `json:"chunk_type"`
|
|
ImageInfo string `json:"image_info"`
|
|
Metadata map[string]string `json:"metadata"`
|
|
KnowledgeFilename string `json:"knowledge_filename"`
|
|
KnowledgeSource string `json:"knowledge_source"`
|
|
}
|
|
|
|
// HybridSearchResponse hybrid search response
|
|
type HybridSearchResponse struct {
|
|
Success bool `json:"success"`
|
|
Data []*SearchResult `json:"data"`
|
|
}
|
|
|
|
type CopyKnowledgeBaseRequest struct {
|
|
SourceID string `json:"source_id"`
|
|
TargetID string `json:"target_id"`
|
|
}
|
|
|
|
// CreateKnowledgeBase creates a knowledge base
|
|
func (c *Client) CreateKnowledgeBase(ctx context.Context, knowledgeBase *KnowledgeBase) (*KnowledgeBase, error) {
|
|
resp, err := c.doRequest(ctx, http.MethodPost, "/api/v1/knowledge-bases", knowledgeBase, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var response KnowledgeBaseResponse
|
|
if err := parseResponse(resp, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &response.Data, nil
|
|
}
|
|
|
|
// GetKnowledgeBase gets a knowledge base
|
|
func (c *Client) GetKnowledgeBase(ctx context.Context, knowledgeBaseID string) (*KnowledgeBase, error) {
|
|
path := fmt.Sprintf("/api/v1/knowledge-bases/%s", knowledgeBaseID)
|
|
resp, err := c.doRequest(ctx, http.MethodGet, path, nil, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var response KnowledgeBaseResponse
|
|
if err := parseResponse(resp, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &response.Data, nil
|
|
}
|
|
|
|
// ListKnowledgeBases lists knowledge bases
|
|
func (c *Client) ListKnowledgeBases(ctx context.Context) ([]KnowledgeBase, error) {
|
|
resp, err := c.doRequest(ctx, http.MethodGet, "/api/v1/knowledge-bases", nil, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var response KnowledgeBaseListResponse
|
|
if err := parseResponse(resp, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return response.Data, nil
|
|
}
|
|
|
|
// UpdateKnowledgeBaseRequest update knowledge base request
|
|
type UpdateKnowledgeBaseRequest struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Config *KnowledgeBaseConfig `json:"config"`
|
|
}
|
|
|
|
// UpdateKnowledgeBase updates a knowledge base
|
|
func (c *Client) UpdateKnowledgeBase(ctx context.Context,
|
|
knowledgeBaseID string,
|
|
request *UpdateKnowledgeBaseRequest,
|
|
) (*KnowledgeBase, error) {
|
|
path := fmt.Sprintf("/api/v1/knowledge-bases/%s", knowledgeBaseID)
|
|
resp, err := c.doRequest(ctx, http.MethodPut, path, request, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var response KnowledgeBaseResponse
|
|
if err := parseResponse(resp, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &response.Data, nil
|
|
}
|
|
|
|
// DeleteKnowledgeBase deletes a knowledge base
|
|
func (c *Client) DeleteKnowledgeBase(ctx context.Context, knowledgeBaseID string) error {
|
|
path := fmt.Sprintf("/api/v1/knowledge-bases/%s", knowledgeBaseID)
|
|
resp, err := c.doRequest(ctx, http.MethodDelete, path, nil, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var response struct {
|
|
Success bool `json:"success"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
return parseResponse(resp, &response)
|
|
}
|
|
|
|
// HybridSearch performs hybrid search
|
|
func (c *Client) HybridSearch(ctx context.Context, knowledgeBaseID string, query string) ([]*SearchResult, error) {
|
|
path := fmt.Sprintf("/api/v1/knowledge-bases/%s/hybrid-search", knowledgeBaseID)
|
|
|
|
queryParams := url.Values{}
|
|
queryParams.Add("query", query)
|
|
|
|
resp, err := c.doRequest(ctx, http.MethodGet, path, nil, queryParams)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var response HybridSearchResponse
|
|
if err := parseResponse(resp, &response); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return response.Data, nil
|
|
}
|
|
|
|
func (c *Client) CopyKnowledgeBase(ctx context.Context, request *CopyKnowledgeBaseRequest) error {
|
|
path := "/api/v1/knowledge-bases/copy"
|
|
|
|
resp, err := c.doRequest(ctx, http.MethodPost, path, request, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var response struct {
|
|
Success bool `json:"success"`
|
|
Message string `json:"message,omitempty"`
|
|
}
|
|
|
|
return parseResponse(resp, &response)
|
|
}
|