mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 18:36:30 +01:00 
			
		
		
		
	fix hardcoded values part 5
This commit is contained in:
		| @@ -47,6 +47,7 @@ export const SEARCH_CONSTANTS = { | |||||||
|     // Token/char limits |     // Token/char limits | ||||||
|     LIMITS: { |     LIMITS: { | ||||||
|         DEFAULT_NOTE_SUMMARY_LENGTH: 500, |         DEFAULT_NOTE_SUMMARY_LENGTH: 500, | ||||||
|  |         DEFAULT_MAX_TOKENS: 4096, | ||||||
|         RELATIONSHIP_TOOL_MAX_TOKENS: 50, |         RELATIONSHIP_TOOL_MAX_TOKENS: 50, | ||||||
|         VECTOR_SEARCH_MAX_TOKENS: 500, |         VECTOR_SEARCH_MAX_TOKENS: 500, | ||||||
|         QUERY_PROCESSOR_MAX_TOKENS: 300, |         QUERY_PROCESSOR_MAX_TOKENS: 300, | ||||||
|   | |||||||
| @@ -289,7 +289,7 @@ export class NoteNavigatorTool { | |||||||
|   /** |   /** | ||||||
|    * Search for notes by title |    * Search for notes by title | ||||||
|    */ |    */ | ||||||
|   searchNotesByTitle(searchTerm: string, limit: number = 10): NoteInfo[] { |   searchNotesByTitle(searchTerm: string, limit: number = SEARCH_CONSTANTS.HIERARCHY.MAX_NOTES_PER_QUERY): NoteInfo[] { | ||||||
|     try { |     try { | ||||||
|       if (!searchTerm || searchTerm.trim().length === 0) { |       if (!searchTerm || searchTerm.trim().length === 0) { | ||||||
|         return []; |         return []; | ||||||
| @@ -369,14 +369,14 @@ export class NoteNavigatorTool { | |||||||
|       if (paths.length > 1) { |       if (paths.length > 1) { | ||||||
|         result += `This note appears in ${paths.length} different locations:\n`; |         result += `This note appears in ${paths.length} different locations:\n`; | ||||||
|  |  | ||||||
|         // Show max 3 paths to avoid overwhelming context |         // Show max paths to avoid overwhelming context | ||||||
|         for (let i = 0; i < Math.min(3, paths.length); i++) { |         for (let i = 0; i < Math.min(SEARCH_CONSTANTS.HIERARCHY.MAX_PATHS_TO_SHOW, paths.length); i++) { | ||||||
|           const path = paths[i]; |           const path = paths[i]; | ||||||
|           result += `${i+1}. ${path.notePathTitles.join(' > ')}\n`; |           result += `${i+1}. ${path.notePathTitles.join(' > ')}\n`; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (paths.length > 3) { |         if (paths.length > SEARCH_CONSTANTS.HIERARCHY.MAX_PATHS_TO_SHOW) { | ||||||
|           result += `... and ${paths.length - 3} more locations\n`; |           result += `... and ${paths.length - SEARCH_CONSTANTS.HIERARCHY.MAX_PATHS_TO_SHOW} more locations\n`; | ||||||
|         } |         } | ||||||
|       } else { |       } else { | ||||||
|         // Just one path |         // Just one path | ||||||
| @@ -385,7 +385,7 @@ export class NoteNavigatorTool { | |||||||
|       } |       } | ||||||
|  |  | ||||||
|       // Children info using the async function |       // Children info using the async function | ||||||
|       const children = await this.getChildNotes(noteId, 5); |       const children = await this.getChildNotes(noteId, SEARCH_CONSTANTS.CONTEXT.MAX_POINTS); | ||||||
|  |  | ||||||
|       if (children.length > 0) { |       if (children.length > 0) { | ||||||
|         result += `\nContains ${note.children.length} child notes`; |         result += `\nContains ${note.children.length} child notes`; | ||||||
| @@ -520,7 +520,7 @@ export class NoteNavigatorTool { | |||||||
|   /** |   /** | ||||||
|    * Get child notes of a specified note |    * Get child notes of a specified note | ||||||
|    */ |    */ | ||||||
|   async getChildNotes(noteId: string, limit: number = 10): Promise<Array<{noteId: string, title: string}>> { |   async getChildNotes(noteId: string, limit: number = SEARCH_CONSTANTS.CONTEXT.MAX_CHILDREN): Promise<Array<{noteId: string, title: string}>> { | ||||||
|     try { |     try { | ||||||
|       const note = becca.notes[noteId]; |       const note = becca.notes[noteId]; | ||||||
|  |  | ||||||
| @@ -564,7 +564,7 @@ export class NoteNavigatorTool { | |||||||
|   /** |   /** | ||||||
|    * Find notes linked to/from the specified note |    * Find notes linked to/from the specified note | ||||||
|    */ |    */ | ||||||
|   async getLinkedNotes(noteId: string, limit: number = 10): Promise<Array<{noteId: string, title: string, direction: 'from'|'to'}>> { |   async getLinkedNotes(noteId: string, limit: number = SEARCH_CONSTANTS.CONTEXT.MAX_LINKS): Promise<Array<{noteId: string, title: string, direction: 'from'|'to'}>> { | ||||||
|     try { |     try { | ||||||
|       const note = becca.notes[noteId]; |       const note = becca.notes[noteId]; | ||||||
|  |  | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ import becca from "../../../../becca/becca.js"; | |||||||
| import cls from "../../../../services/cls.js"; | import cls from "../../../../services/cls.js"; | ||||||
| import type { NoteEmbeddingContext } from "../types.js"; | import type { NoteEmbeddingContext } from "../types.js"; | ||||||
| import { LLM_CONSTANTS } from "../../../llm/constants/provider_constants.js"; | import { LLM_CONSTANTS } from "../../../llm/constants/provider_constants.js"; | ||||||
|  | import { EMBEDDING_PROCESSING } from '../../constants/search_constants.js'; | ||||||
|  |  | ||||||
| // Define error categories for better handling | // Define error categories for better handling | ||||||
| const ERROR_CATEGORIES = { | const ERROR_CATEGORIES = { | ||||||
| @@ -27,14 +28,14 @@ const ERROR_CATEGORIES = { | |||||||
| }; | }; | ||||||
|  |  | ||||||
| // Maximum time (in milliseconds) allowed for the entire chunking process | // Maximum time (in milliseconds) allowed for the entire chunking process | ||||||
| const MAX_TOTAL_PROCESSING_TIME = 5 * 60 * 1000; // 5 minutes | const MAX_TOTAL_PROCESSING_TIME = EMBEDDING_PROCESSING.MAX_TOTAL_PROCESSING_TIME; | ||||||
|  |  | ||||||
| // Maximum number of retry attempts per chunk | // Maximum number of retry attempts per chunk | ||||||
| const MAX_CHUNK_RETRY_ATTEMPTS = 2; | const MAX_CHUNK_RETRY_ATTEMPTS = EMBEDDING_PROCESSING.MAX_CHUNK_RETRY_ATTEMPTS; | ||||||
|  |  | ||||||
| // Maximum time per chunk processing (to prevent individual chunks from hanging) | // Maximum time per chunk processing (to prevent individual chunks from hanging) | ||||||
| const DEFAULT_MAX_CHUNK_PROCESSING_TIME = 60 * 1000; // 1 minute | const DEFAULT_MAX_CHUNK_PROCESSING_TIME = EMBEDDING_PROCESSING.DEFAULT_MAX_CHUNK_PROCESSING_TIME; | ||||||
| const OLLAMA_MAX_CHUNK_PROCESSING_TIME = 120 * 1000; // 2 minutes | const OLLAMA_MAX_CHUNK_PROCESSING_TIME = EMBEDDING_PROCESSING.OLLAMA_MAX_CHUNK_PROCESSING_TIME; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Categorize an error as temporary or permanent based on its message |  * Categorize an error as temporary or permanent based on its message | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ import { NormalizationStatus } from "../embeddings_interface.js"; | |||||||
| import { LLM_CONSTANTS } from "../../constants/provider_constants.js"; | import { LLM_CONSTANTS } from "../../constants/provider_constants.js"; | ||||||
| import type { EmbeddingModelInfo } from "../../interfaces/embedding_interfaces.js"; | import type { EmbeddingModelInfo } from "../../interfaces/embedding_interfaces.js"; | ||||||
| import OpenAI from "openai"; | import OpenAI from "openai"; | ||||||
|  | import { PROVIDER_EMBEDDING_CAPABILITIES } from '../../constants/search_constants.js'; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * OpenAI embedding provider implementation using the official SDK |  * OpenAI embedding provider implementation using the official SDK | ||||||
| @@ -90,15 +91,11 @@ export class OpenAIEmbeddingProvider extends BaseEmbeddingProvider { | |||||||
|  |  | ||||||
|                 // If we didn't get all the info, use defaults for missing values |                 // If we didn't get all the info, use defaults for missing values | ||||||
|                 if (!contextWindow) { |                 if (!contextWindow) { | ||||||
|                     // Set default context window based on model name patterns |                     // Set contextWindow based on model name patterns | ||||||
|                     if (modelName.includes('ada') || modelName.includes('embedding-ada')) { |                     if (modelName.includes('embedding-3')) { | ||||||
|                         contextWindow = LLM_CONSTANTS.CONTEXT_WINDOW.OPENAI; |                         contextWindow = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS['text-embedding-3-small'].contextWindow; | ||||||
|                     } else if (modelName.includes('davinci')) { |  | ||||||
|                         contextWindow = 8192; |  | ||||||
|                     } else if (modelName.includes('embedding-3')) { |  | ||||||
|                         contextWindow = 8191; |  | ||||||
|                     } else { |                     } else { | ||||||
|                         contextWindow = LLM_CONSTANTS.CONTEXT_WINDOW.OPENAI; |                         contextWindow = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS.default.contextWindow; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -107,11 +104,11 @@ export class OpenAIEmbeddingProvider extends BaseEmbeddingProvider { | |||||||
|                     if (modelName.includes('ada') || modelName.includes('embedding-ada')) { |                     if (modelName.includes('ada') || modelName.includes('embedding-ada')) { | ||||||
|                         dimension = LLM_CONSTANTS.EMBEDDING_DIMENSIONS.OPENAI.ADA; |                         dimension = LLM_CONSTANTS.EMBEDDING_DIMENSIONS.OPENAI.ADA; | ||||||
|                     } else if (modelName.includes('embedding-3-small')) { |                     } else if (modelName.includes('embedding-3-small')) { | ||||||
|                         dimension = 1536; |                         dimension = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS['text-embedding-3-small'].dimension; | ||||||
|                     } else if (modelName.includes('embedding-3-large')) { |                     } else if (modelName.includes('embedding-3-large')) { | ||||||
|                         dimension = 3072; |                         dimension = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS['text-embedding-3-large'].dimension; | ||||||
|                     } else { |                     } else { | ||||||
|                         dimension = LLM_CONSTANTS.EMBEDDING_DIMENSIONS.OPENAI.DEFAULT; |                         dimension = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS.default.dimension; | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
| @@ -155,7 +152,7 @@ export class OpenAIEmbeddingProvider extends BaseEmbeddingProvider { | |||||||
|             const dimension = testEmbedding.length; |             const dimension = testEmbedding.length; | ||||||
|  |  | ||||||
|             // Use default context window |             // Use default context window | ||||||
|             let contextWindow = LLM_CONSTANTS.CONTEXT_WINDOW.OPENAI; |             let contextWindow = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS.default.contextWindow; | ||||||
|  |  | ||||||
|             const modelInfo: EmbeddingModelInfo = { |             const modelInfo: EmbeddingModelInfo = { | ||||||
|                 name: modelName, |                 name: modelName, | ||||||
| @@ -170,8 +167,8 @@ export class OpenAIEmbeddingProvider extends BaseEmbeddingProvider { | |||||||
|             return modelInfo; |             return modelInfo; | ||||||
|         } catch (error: any) { |         } catch (error: any) { | ||||||
|             // If detection fails, use defaults |             // If detection fails, use defaults | ||||||
|             const dimension = LLM_CONSTANTS.EMBEDDING_DIMENSIONS.OPENAI.DEFAULT; |             const dimension = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS.default.dimension; | ||||||
|             const contextWindow = LLM_CONSTANTS.CONTEXT_WINDOW.OPENAI; |             const contextWindow = PROVIDER_EMBEDDING_CAPABILITIES.OPENAI.MODELS.default.contextWindow; | ||||||
|  |  | ||||||
|             log.info(`Using default parameters for OpenAI model ${modelName}: dimension ${dimension}, context ${contextWindow}`); |             log.info(`Using default parameters for OpenAI model ${modelName}: dimension ${dimension}, context ${contextWindow}`); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -51,21 +51,17 @@ export class VoyageEmbeddingProvider extends BaseEmbeddingProvider { | |||||||
|      */ |      */ | ||||||
|     private async fetchModelCapabilities(modelName: string): Promise<EmbeddingModelInfo | null> { |     private async fetchModelCapabilities(modelName: string): Promise<EmbeddingModelInfo | null> { | ||||||
|         try { |         try { | ||||||
|             // Get context window size from our local registry of known models |             // Find the closest matching model | ||||||
|             const modelBase = Object.keys(VOYAGE_MODEL_CONTEXT_WINDOWS).find( |             const modelMapKey = Object.keys(PROVIDER_EMBEDDING_CAPABILITIES.VOYAGE.MODELS).find( | ||||||
|                 model => modelName.startsWith(model) |                 model => modelName.startsWith(model) | ||||||
|             ) || "default"; |             ) || "default"; | ||||||
|  |  | ||||||
|             const modelInfo = VOYAGE_MODEL_CONTEXT_WINDOWS[modelBase as keyof typeof VOYAGE_MODEL_CONTEXT_WINDOWS]; |             // Use as keyof to tell TypeScript this is a valid key | ||||||
|             const contextWindow = modelInfo.contextWidth; |             const modelInfo = PROVIDER_EMBEDDING_CAPABILITIES.VOYAGE.MODELS[modelMapKey as keyof typeof PROVIDER_EMBEDDING_CAPABILITIES.VOYAGE.MODELS]; | ||||||
|  |  | ||||||
|             // Get dimension from our registry of known models |  | ||||||
|             const dimension = VOYAGE_MODEL_DIMENSIONS[modelBase as keyof typeof VOYAGE_MODEL_DIMENSIONS] || |  | ||||||
|                               VOYAGE_MODEL_DIMENSIONS["default"]; |  | ||||||
|  |  | ||||||
|             return { |             return { | ||||||
|                 dimension, |                 dimension: modelInfo.dimension, | ||||||
|                 contextWidth: contextWindow, |                 contextWidth: modelInfo.contextWidth, | ||||||
|                 name: modelName, |                 name: modelName, | ||||||
|                 type: 'float32' |                 type: 'float32' | ||||||
|             }; |             }; | ||||||
| @@ -86,8 +82,9 @@ export class VoyageEmbeddingProvider extends BaseEmbeddingProvider { | |||||||
|  |  | ||||||
|         // Try to determine model capabilities |         // Try to determine model capabilities | ||||||
|         const capabilities = await this.fetchModelCapabilities(modelName); |         const capabilities = await this.fetchModelCapabilities(modelName); | ||||||
|         const contextWindow = capabilities?.contextWidth || 8192; // Default context window for Voyage |         const defaults = PROVIDER_EMBEDDING_CAPABILITIES.VOYAGE.MODELS.default; | ||||||
|         const knownDimension = capabilities?.dimension || 1024; // Default dimension for Voyage models |         const contextWindow = capabilities?.contextWidth || defaults.contextWidth; | ||||||
|  |         const knownDimension = capabilities?.dimension || defaults.dimension; | ||||||
|  |  | ||||||
|         // For Voyage, we can use known dimensions or detect with a test call |         // For Voyage, we can use known dimensions or detect with a test call | ||||||
|         try { |         try { | ||||||
| @@ -166,7 +163,7 @@ export class VoyageEmbeddingProvider extends BaseEmbeddingProvider { | |||||||
|             const modelInfo = await this.getModelInfo(modelName); |             const modelInfo = await this.getModelInfo(modelName); | ||||||
|  |  | ||||||
|             // Trim text if it might exceed context window (rough character estimate) |             // Trim text if it might exceed context window (rough character estimate) | ||||||
|             const charLimit = (modelInfo.contextWidth || 8192) * 4; // Rough estimate: avg 4 chars per token |             const charLimit = (modelInfo.contextWidth || PROVIDER_EMBEDDING_CAPABILITIES.VOYAGE.MODELS.default.contextWidth) * 4; // Rough estimate: avg 4 chars per token | ||||||
|             const trimmedText = text.length > charLimit ? text.substring(0, charLimit) : text; |             const trimmedText = text.length > charLimit ? text.substring(0, charLimit) : text; | ||||||
|  |  | ||||||
|             const response = await fetch(`${this.baseUrl}/embeddings`, { |             const response = await fetch(`${this.baseUrl}/embeddings`, { | ||||||
|   | |||||||
| @@ -7,6 +7,7 @@ import type { EmbeddingResult } from "./types.js"; | |||||||
| import entityChangesService from "../../../services/entity_changes.js"; | import entityChangesService from "../../../services/entity_changes.js"; | ||||||
| import type { EntityChange } from "../../../services/entity_changes_interface.js"; | import type { EntityChange } from "../../../services/entity_changes_interface.js"; | ||||||
| import { EMBEDDING_CONSTANTS } from "../constants/embedding_constants.js"; | import { EMBEDDING_CONSTANTS } from "../constants/embedding_constants.js"; | ||||||
|  | import { SEARCH_CONSTANTS } from '../constants/search_constants.js'; | ||||||
| /** | /** | ||||||
|  * Creates or updates an embedding for a note |  * Creates or updates an embedding for a note | ||||||
|  */ |  */ | ||||||
| @@ -139,14 +140,14 @@ export async function findSimilarNotes( | |||||||
|     embedding: Float32Array, |     embedding: Float32Array, | ||||||
|     providerId: string, |     providerId: string, | ||||||
|     modelId: string, |     modelId: string, | ||||||
|     limit = 10, |     limit = SEARCH_CONSTANTS.VECTOR_SEARCH.DEFAULT_MAX_RESULTS, | ||||||
|     threshold?: number,  // Made optional to use constants |     threshold?: number,  // Made optional to use constants | ||||||
|     useFallback = true   // Whether to try other providers if no embeddings found |     useFallback = true   // Whether to try other providers if no embeddings found | ||||||
| ): Promise<{noteId: string, similarity: number, contentType?: string}[]> { | ): Promise<{noteId: string, similarity: number, contentType?: string}[]> { | ||||||
|     // Import constants dynamically to avoid circular dependencies |     // Import constants dynamically to avoid circular dependencies | ||||||
|     const llmModule = await import('../../../routes/api/llm.js'); |     const llmModule = await import('../../../routes/api/llm.js'); | ||||||
|     // Use a default threshold of 0.65 if not provided |     // Use default threshold if not provided | ||||||
|     const actualThreshold = threshold || 0.65; |     const actualThreshold = threshold || SEARCH_CONSTANTS.VECTOR_SEARCH.EXACT_MATCH_THRESHOLD; | ||||||
|  |  | ||||||
|     try { |     try { | ||||||
|         log.info(`Finding similar notes with provider: ${providerId}, model: ${modelId}, dimension: ${embedding.length}, threshold: ${actualThreshold}`); |         log.info(`Finding similar notes with provider: ${providerId}, model: ${modelId}, dimension: ${embedding.length}, threshold: ${actualThreshold}`); | ||||||
|   | |||||||
| @@ -1,3 +1,5 @@ | |||||||
|  | import { SEARCH_CONSTANTS } from '../constants/search_constants.js'; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Computes the cosine similarity between two vectors |  * Computes the cosine similarity between two vectors | ||||||
|  * If dimensions don't match, automatically adapts using the enhanced approach |  * If dimensions don't match, automatically adapts using the enhanced approach | ||||||
| @@ -549,9 +551,9 @@ export function ensembleSimilarity( | |||||||
| ): number { | ): number { | ||||||
|     // Default weights if not provided |     // Default weights if not provided | ||||||
|     const weights = options.ensembleWeights ?? { |     const weights = options.ensembleWeights ?? { | ||||||
|         [SimilarityMetric.COSINE]: 0.6, |         [SimilarityMetric.COSINE]: SEARCH_CONSTANTS.VECTOR_SEARCH.SIMILARITY_THRESHOLD.COSINE, | ||||||
|         [SimilarityMetric.HYBRID]: 0.3, |         [SimilarityMetric.HYBRID]: SEARCH_CONSTANTS.VECTOR_SEARCH.SIMILARITY_THRESHOLD.HYBRID, | ||||||
|         [SimilarityMetric.DIM_AWARE]: 0.1 |         [SimilarityMetric.DIM_AWARE]: SEARCH_CONSTANTS.VECTOR_SEARCH.SIMILARITY_THRESHOLD.DIM_AWARE | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     let totalWeight = 0; |     let totalWeight = 0; | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ import type { AnthropicOptions } from './provider_options.js'; | |||||||
| import { getAnthropicOptions } from './providers.js'; | import { getAnthropicOptions } from './providers.js'; | ||||||
| import log from '../../log.js'; | import log from '../../log.js'; | ||||||
| import Anthropic from '@anthropic-ai/sdk'; | import Anthropic from '@anthropic-ai/sdk'; | ||||||
|  | import { SEARCH_CONSTANTS } from '../constants/search_constants.js'; | ||||||
|  |  | ||||||
| export class AnthropicService extends BaseAIService { | export class AnthropicService extends BaseAIService { | ||||||
|     private client: any = null; |     private client: any = null; | ||||||
| @@ -78,7 +79,7 @@ export class AnthropicService extends BaseAIService { | |||||||
|                 model: providerOptions.model, |                 model: providerOptions.model, | ||||||
|                 messages: anthropicMessages, |                 messages: anthropicMessages, | ||||||
|                 system: systemPrompt, |                 system: systemPrompt, | ||||||
|                 max_tokens: providerOptions.max_tokens || 4096, |                 max_tokens: providerOptions.max_tokens || SEARCH_CONSTANTS.LIMITS.DEFAULT_MAX_TOKENS, | ||||||
|                 temperature: providerOptions.temperature, |                 temperature: providerOptions.temperature, | ||||||
|                 top_p: providerOptions.top_p, |                 top_p: providerOptions.top_p, | ||||||
|                 stream: !!providerOptions.stream |                 stream: !!providerOptions.stream | ||||||
|   | |||||||
| @@ -355,7 +355,7 @@ class RestChatService { | |||||||
|                     createdAt: now, |                     createdAt: now, | ||||||
|                     lastActive: now, |                     lastActive: now, | ||||||
|                     metadata: { |                     metadata: { | ||||||
|                         temperature: 0.7, |                         temperature: SEARCH_CONSTANTS.TEMPERATURE.DEFAULT, | ||||||
|                         maxTokens: undefined, |                         maxTokens: undefined, | ||||||
|                         model: undefined, |                         model: undefined, | ||||||
|                         provider: undefined |                         provider: undefined | ||||||
| @@ -1645,7 +1645,7 @@ class RestChatService { | |||||||
|                 lastActive: now, |                 lastActive: now, | ||||||
|                 noteContext: options.contextNoteId, |                 noteContext: options.contextNoteId, | ||||||
|                 metadata: { |                 metadata: { | ||||||
|                     temperature: options.temperature, |                     temperature: SEARCH_CONSTANTS.TEMPERATURE.DEFAULT, | ||||||
|                     maxTokens: options.maxTokens, |                     maxTokens: options.maxTokens, | ||||||
|                     model: options.model, |                     model: options.model, | ||||||
|                     provider: options.provider, |                     provider: options.provider, | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ import type { Tool, ToolHandler } from './tool_interfaces.js'; | |||||||
| import log from '../../log.js'; | import log from '../../log.js'; | ||||||
| import becca from '../../../becca/becca.js'; | import becca from '../../../becca/becca.js'; | ||||||
| import aiServiceManager from '../ai_service_manager.js'; | import aiServiceManager from '../ai_service_manager.js'; | ||||||
|  | import { SEARCH_CONSTANTS } from '../constants/search_constants.js'; | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Definition of the note summarization tool |  * Definition of the note summarization tool | ||||||
| @@ -59,7 +60,7 @@ export class NoteSummarizationTool implements ToolHandler { | |||||||
|         focus?: string |         focus?: string | ||||||
|     }): Promise<string | object> { |     }): Promise<string | object> { | ||||||
|         try { |         try { | ||||||
|             const { noteId, maxLength = 500, format = 'paragraph', focus } = args; |             const { noteId, maxLength = SEARCH_CONSTANTS.LIMITS.DEFAULT_NOTE_SUMMARY_LENGTH, format = 'paragraph', focus } = args; | ||||||
|  |  | ||||||
|             log.info(`Executing summarize_note tool - NoteID: "${noteId}", MaxLength: ${maxLength}, Format: ${format}`); |             log.info(`Executing summarize_note tool - NoteID: "${noteId}", MaxLength: ${maxLength}, Format: ${format}`); | ||||||
|  |  | ||||||
| @@ -134,8 +135,8 @@ export class NoteSummarizationTool implements ToolHandler { | |||||||
|                 { role: 'system', content: 'You are a skilled summarizer. Create concise, accurate summaries while preserving the key information.' }, |                 { role: 'system', content: 'You are a skilled summarizer. Create concise, accurate summaries while preserving the key information.' }, | ||||||
|                 { role: 'user', content: prompt } |                 { role: 'user', content: prompt } | ||||||
|             ], { |             ], { | ||||||
|                 temperature: 0.3, // Lower temperature for more focused summaries |                 temperature: SEARCH_CONSTANTS.TEMPERATURE.VECTOR_SEARCH, // Lower temperature for more focused summaries | ||||||
|                 maxTokens: 1000 // Enough tokens for the summary |                 maxTokens: SEARCH_CONSTANTS.LIMITS.VECTOR_SEARCH_MAX_TOKENS // Enough tokens for the summary | ||||||
|             }); |             }); | ||||||
|  |  | ||||||
|             const summaryDuration = Date.now() - summaryStartTime; |             const summaryDuration = Date.now() - summaryStartTime; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user