feat(config): add timeout configuration for metadata extraction
This commit is contained in:
@@ -129,7 +129,7 @@ func routes(logger *slog.Logger, cfg *config.Config, db *store.DB, provider ai.P
|
|||||||
mux := http.NewServeMux()
|
mux := http.NewServeMux()
|
||||||
|
|
||||||
toolSet := mcpserver.ToolSet{
|
toolSet := mcpserver.ToolSet{
|
||||||
Capture: tools.NewCaptureTool(db, provider, cfg.Capture, activeProjects, logger),
|
Capture: tools.NewCaptureTool(db, provider, cfg.Capture, cfg.AI.Metadata.Timeout, activeProjects, logger),
|
||||||
Search: tools.NewSearchTool(db, provider, cfg.Search, activeProjects),
|
Search: tools.NewSearchTool(db, provider, cfg.Search, activeProjects),
|
||||||
List: tools.NewListTool(db, cfg.Search, activeProjects),
|
List: tools.NewListTool(db, cfg.Search, activeProjects),
|
||||||
Stats: tools.NewStatsTool(db),
|
Stats: tools.NewStatsTool(db),
|
||||||
|
|||||||
@@ -84,11 +84,12 @@ type AIEmbeddingConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type AIMetadataConfig struct {
|
type AIMetadataConfig struct {
|
||||||
Model string `yaml:"model"`
|
Model string `yaml:"model"`
|
||||||
FallbackModels []string `yaml:"fallback_models"`
|
FallbackModels []string `yaml:"fallback_models"`
|
||||||
FallbackModel string `yaml:"fallback_model"` // legacy single fallback
|
FallbackModel string `yaml:"fallback_model"` // legacy single fallback
|
||||||
Temperature float64 `yaml:"temperature"`
|
Temperature float64 `yaml:"temperature"`
|
||||||
LogConversations bool `yaml:"log_conversations"`
|
LogConversations bool `yaml:"log_conversations"`
|
||||||
|
Timeout time.Duration `yaml:"timeout"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LiteLLMConfig struct {
|
type LiteLLMConfig struct {
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ func defaultConfig() Config {
|
|||||||
Metadata: AIMetadataConfig{
|
Metadata: AIMetadataConfig{
|
||||||
Model: "gpt-4o-mini",
|
Model: "gpt-4o-mini",
|
||||||
Temperature: 0.1,
|
Temperature: 0.1,
|
||||||
|
Timeout: 10 * time.Second,
|
||||||
},
|
},
|
||||||
Ollama: OllamaConfig{
|
Ollama: OllamaConfig{
|
||||||
BaseURL: "http://localhost:11434/v1",
|
BaseURL: "http://localhost:11434/v1",
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/modelcontextprotocol/go-sdk/mcp"
|
"github.com/modelcontextprotocol/go-sdk/mcp"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
@@ -17,11 +18,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type CaptureTool struct {
|
type CaptureTool struct {
|
||||||
store *store.DB
|
store *store.DB
|
||||||
provider ai.Provider
|
provider ai.Provider
|
||||||
capture config.CaptureConfig
|
capture config.CaptureConfig
|
||||||
sessions *session.ActiveProjects
|
sessions *session.ActiveProjects
|
||||||
log *slog.Logger
|
metadataTimeout time.Duration
|
||||||
|
log *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
type CaptureInput struct {
|
type CaptureInput struct {
|
||||||
@@ -33,8 +35,8 @@ type CaptureOutput struct {
|
|||||||
Thought thoughttypes.Thought `json:"thought"`
|
Thought thoughttypes.Thought `json:"thought"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCaptureTool(db *store.DB, provider ai.Provider, capture config.CaptureConfig, sessions *session.ActiveProjects, log *slog.Logger) *CaptureTool {
|
func NewCaptureTool(db *store.DB, provider ai.Provider, capture config.CaptureConfig, metadataTimeout time.Duration, sessions *session.ActiveProjects, log *slog.Logger) *CaptureTool {
|
||||||
return &CaptureTool{store: db, provider: provider, capture: capture, sessions: sessions, log: log}
|
return &CaptureTool{store: db, provider: provider, capture: capture, sessions: sessions, metadataTimeout: metadataTimeout, log: log}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *CaptureTool) Handle(ctx context.Context, req *mcp.CallToolRequest, in CaptureInput) (*mcp.CallToolResult, CaptureOutput, error) {
|
func (t *CaptureTool) Handle(ctx context.Context, req *mcp.CallToolRequest, in CaptureInput) (*mcp.CallToolResult, CaptureOutput, error) {
|
||||||
@@ -61,7 +63,13 @@ func (t *CaptureTool) Handle(ctx context.Context, req *mcp.CallToolRequest, in C
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
group.Go(func() error {
|
group.Go(func() error {
|
||||||
extracted, err := t.provider.ExtractMetadata(groupCtx, content)
|
metaCtx := groupCtx
|
||||||
|
if t.metadataTimeout > 0 {
|
||||||
|
var cancel context.CancelFunc
|
||||||
|
metaCtx, cancel = context.WithTimeout(groupCtx, t.metadataTimeout)
|
||||||
|
defer cancel()
|
||||||
|
}
|
||||||
|
extracted, err := t.provider.ExtractMetadata(metaCtx, content)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.log.Warn("metadata extraction failed, using fallback", slog.String("provider", t.provider.Name()), slog.String("error", err.Error()))
|
t.log.Warn("metadata extraction failed, using fallback", slog.String("provider", t.provider.Name()), slog.String("error", err.Error()))
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user