* 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]>