mirror of
https://github.com/outbackdingo/optimclaw.git
synced 2026-08-25 23:10:11 +00:00
* fix: harden openai-compatible tool flow and local defaults * fix: close approval replay gaps and harden openai-compatible flow * fix: address review feedback and code improvements (takeover #112) - Make ChatCompletionResponse.id Optional<String> to handle providers that omit or null the field - Propagate HTTP client builder errors instead of silently dropping timeout configuration (openai_compatible_chat, nearai_chat) - Add EMBEDDING_DIMENSION env var with smart per-model defaults instead of hardcoding 768/1536 everywhere - Remove duplicated dimension inference logic from main.rs Co-Authored-By: panosAthDBX <[email protected]> Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix: harden src/llm/ module from crate audit findings - Replace 9x .expect() on RwLock with graceful poison recovery (nearai.rs: 7, nearai_chat.rs: 2) — eliminates production panics - Propagate HTTP client builder errors in nearai.rs instead of silently dropping timeout config (NearAiProvider::new now returns Result) - Make nearai_chat ChatCompletionResponse.id Optional<String> (mirrors openai_compatible_chat.rs fix for providers that omit id) - Make nearai_chat usage fields optional with defensive parse_usage() helper (was required u32 fields that crash on null/missing) - Truncate error responses to 512 chars in nearai_chat.rs error messages to prevent log bloat and potential data leakage - Delegate 4 missing LlmProvider methods in FailoverProvider (model_metadata, seed_response_chain, get_response_chain_id, calculate_cost) to last-used provider instead of trait defaults Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor(llm): add RetryProvider, remove openai_compatible_chat, harden decorators - Add composable RetryProvider decorator wrapping any LlmProvider with exponential backoff + jitter, respecting RateLimited retry_after hints - Remove openai_compatible_chat.rs — replaced by rig adapter + RetryProvider - Remove internal retry loop from nearai.rs (was causing double-retry with external RetryProvider, up to 16 attempts instead of 4) - Remove internal retry loop from nearai_chat.rs (same issue) - Wire RetryProvider into main.rs composition chain: each provider gets its own retry wrapper before failover - Move normalize_tool_name to rig_adapter.rs for all rig-based providers - Reconcile is_retryable() vs is_transient() error classification: ModelNotAvailable no longer retryable, Json no longer transient - Fix unchecked Duration subtraction panic in circuit_breaker.rs - Make failover.rs use shared is_retryable() from retry.rs - Remove stale #[allow(dead_code)] on NearAiResponse::id (field is used) Co-Authored-By: Claude Opus 4.6 <[email protected]> * fix: address PR review feedback — error handling, dimension validation, libSQL warning - Replace response.text().await.unwrap_or_default() with proper error propagation in nearai.rs and nearai_chat.rs (4 call sites). Failures now return LlmError::RequestFailed with context instead of silently proceeding with an empty string. - Add embedding dimension validation in OllamaEmbeddings::embed_batch(): returns EmbeddingError if Ollama returns embeddings with a dimension that doesn't match the configured value. - Add runtime warning when libSQL backend is used with non-1536 embedding dimension, since the libSQL schema uses F32_BLOB(1536) and cannot store different-dimension vectors. Co-Authored-By: Claude Opus 4.6 <[email protected]> * Apply suggestions from code review Co-authored-by: Copilot <[email protected]> --------- Co-authored-by: panosAthDbx <[email protected]> Co-authored-by: panosAthDBX <[email protected]> Co-authored-by: panosAthDBX <[email protected]> Co-authored-by: Claude Opus 4.6 <[email protected]> Co-authored-by: Copilot <[email protected]>
44 lines
1.3 KiB
SQL
44 lines
1.3 KiB
SQL
-- Allow embedding vectors of any dimension (not just 1536).
|
|
-- This supports Ollama models (768-dim nomic-embed-text, 1024-dim mxbai-embed-large)
|
|
-- alongside OpenAI models (1536-dim text-embedding-3-small, 3072-dim text-embedding-3-large).
|
|
--
|
|
-- NOTE: HNSW indexes require a fixed dimension, so we drop the index.
|
|
-- Exact (sequential) cosine distance search still works without the index.
|
|
-- For a personal assistant workspace the dataset is small enough that this
|
|
-- has negligible impact on query latency.
|
|
|
|
-- Drop dependent views first
|
|
DROP VIEW IF EXISTS chunks_pending_embedding;
|
|
DROP VIEW IF EXISTS memory_documents_summary;
|
|
|
|
DROP INDEX IF EXISTS idx_memory_chunks_embedding;
|
|
|
|
ALTER TABLE memory_chunks
|
|
ALTER COLUMN embedding TYPE vector
|
|
USING embedding::vector;
|
|
|
|
-- Recreate the views
|
|
CREATE VIEW memory_documents_summary AS
|
|
SELECT
|
|
d.id,
|
|
d.user_id,
|
|
d.path,
|
|
d.created_at,
|
|
d.updated_at,
|
|
COUNT(c.id) as chunk_count,
|
|
COUNT(c.embedding) as embedded_chunk_count
|
|
FROM memory_documents d
|
|
LEFT JOIN memory_chunks c ON c.document_id = d.id
|
|
GROUP BY d.id;
|
|
|
|
CREATE VIEW chunks_pending_embedding AS
|
|
SELECT
|
|
c.id as chunk_id,
|
|
c.document_id,
|
|
d.user_id,
|
|
d.path,
|
|
LENGTH(c.content) as content_length
|
|
FROM memory_chunks c
|
|
JOIN memory_documents d ON d.id = c.document_id
|
|
WHERE c.embedding IS NULL;
|