# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.7.4] - 2025-12-30
### Added
- CI testing against Weaviate versions 1.31.x through 1.35.x (9 total versions)
- Code coverage reporting via Codecov with excoveralls
- Coverage badge in README
- Supported Weaviate versions table in README
#### Multi-Target Reference Improvements
- `WeaviateEx.Types.Beacon` module for parsing and building beacon URLs
- `Beacon.parse/1` - Extract collection and UUID from beacon URLs
- `Beacon.build/2` - Build beacon URLs from UUID and optional collection
- `Beacon.to_map/2` - Create beacon maps for API requests
- `Beacon.extract_uuid/1`, `Beacon.extract_collection/1` - Extract components
- `Beacon.valid?/1` - Validate beacon URL format
- `References.add/5`, `delete/5` now accept `ReferenceToMulti` struct directly
- `References.replace/5` now accepts list of `ReferenceToMulti` structs
- `Reference.from_beacon/1` and `Reference.from_map/1` now extract target collection from beacon
- Improved multi-target reference support in all reference operations
#### gRPC Reranking
- gRPC-based reranking for search queries via `Query.rerank/2`
- `Rerank.to_grpc/1` for converting rerank config to gRPC Rerank message
- Rerank score parsing in gRPC result metadata (`rerankScore`)
- Full support with near_text, near_vector, near_object, hybrid, and bm25 queries
- Works with all reranker modules: Cohere, Transformers, VoyageAI, JinaAI, NVIDIA, ContextualAI
#### Aggregate Variants (Near Object, Hybrid, Near Image)
- `Aggregate.with_near_object/4` for similarity-based aggregation by reference object UUID
- Supports `:distance` and `:certainty` threshold parameters
- Full property metrics support (numeric, text, boolean)
- `Aggregate.with_hybrid/4` for hybrid (keyword + vector) search aggregation
- `:alpha` parameter to control keyword/vector weighting (0.0-1.0, default 0.5)
- `:fusion_type` option (`:ranked`, `:relative_score`)
- Full property metrics support
- `Aggregate.with_near_image/4` for image similarity aggregation
- Supports `:distance`, `:certainty`, and `:target_vectors` parameters
- For multi-modal collections with image vectorizers
- `WeaviateEx.Aggregate.Metrics` helper module for cleaner metric specifications
- `Metrics.count/0` - Meta count metric
- `Metrics.text/2` - Text property metrics (top_occurrences, count)
- `Metrics.number/2` - Numeric property metrics (sum, mean, median, mode, min, max)
- `Metrics.integer/2` - Integer property metrics (same as number)
- `Metrics.boolean/2` - Boolean property metrics (percentage, totals)
- `Metrics.date/2` - Date property metrics (min, max, median, mode)
#### Fluent Tenant-Scoped API
- `WeaviateEx.TenantCollection` for fluent tenant-scoped operations
- `Collections.with_tenant/3` returns tenant-scoped collection reference
- `TenantCollection.insert/3`, `insert_many/3`, `get/3`, `update/4`, `delete/3`
- `TenantCollection.query/1` returns tenant-scoped query builder
- `TenantCollection.batch/2` starts tenant-scoped batch context
- `Query.with_tenant/2` for explicit tenant scoping (alias for `Query.tenant/2`)
#### Multi-Modal Search Convenience Methods
- `Query.with_near_image/3` for image similarity search with automatic input handling
- `Query.with_near_audio/3` for audio similarity search
- `Query.with_near_video/3` for video similarity search
- `Query.with_near_thermal/3` for thermal image search
- `Query.with_near_depth/3` for depth map search
- `Query.with_near_imu/3` for IMU data search
- `Query.with_near_media/4` for generic multi-modal search with type parameter
- `WeaviateEx.Types.MediaInput` for flexible media input handling (file paths, base64, raw binary)
- `WeaviateEx.Types.MediaType` for media type validation
#### Object TTL Enhancements
- `ObjectTTL.from_duration/1` - Human-readable TTL configuration (e.g., `from_duration(hours: 24)`)
- `Collections.update_ttl/3` - Convenience function for updating TTL on existing collections
- Extended README documentation with comprehensive Object TTL examples
#### WCS Compatibility (Weaviate Cloud Service)
- Automatic `X-Weaviate-Cluster-URL` header for WCS connections
- Required for Weaviate embedding service integration
- Auto-added by `Connect.to_weaviate_cloud/1`
- Proper gRPC host parsing for `.weaviate.network` clusters
- Uses `{ident}.grpc.{domain}` pattern (e.g., `my-cluster.grpc.weaviate.network`)
- Other WCS domains use `grpc-{host}` pattern
- `WeaviateEx.Error.VersionError` exception for clear version mismatch errors
- Includes workaround instructions for `skip_init_checks: true`
- Server version compatibility check on connect (requires 1.27.0+)
- gRPC availability check on connect
- `skip_init_checks` option in `Connect.to_weaviate_cloud/1` to bypass validation
- Extended README documentation with WCS connection examples
#### Developer Tooling
- Benchmark suite with Benchee (`mix weaviate.bench`)
- Batch and query performance benchmarks in `bench/`
- Pre-commit hooks configuration (`.pre-commit-config.yaml`)
- Profiling guide (`guides/profiling.md`)
- `Mix.Tasks.Weaviate.Bench` task for running benchmarks
#### gRPC Generative Search (RAG)
- **gRPC Generative Module** (`WeaviateEx.GRPC.Generative`):
- `build/1` - Build GenerativeSearch message from simple config
- `build_with_provider/1` - Build with provider-specific configuration
- `parse_generative_result/1` - Parse grouped results from gRPC reply
- `extract_single_results/1` - Extract per-object generations from results
- Support for all major providers: OpenAI, Anthropic, Cohere, Mistral, Ollama, Google, AWS, Databricks, FriendliAI, NVIDIA, XAI, ContextualAI, Anyscale
- Provider-specific parameters: model, temperature, max_tokens, top_p, top_k, etc.
- OpenAI reasoning model support (verbosity, reasoning_effort for o1/o3)
- **gRPC Search with Generative** (`WeaviateEx.GRPC.Services.Search`):
- New `generative` option for all search request builders
- Single prompt generation via `single_prompt` config
- Grouped task generation via `grouped_task` and `grouped_properties`
- Works with near_text, near_vector, hybrid, bm25 searches
- ~2-3x lower latency compared to GraphQL generative
- **GenerativeResult Enhancements** (`WeaviateEx.Query.GenerativeResult`):
- `from_grpc_response/1` - Parse gRPC SearchReply into typed result
- Extended struct with `:metadata` field for usage/debug info
- Proper parsing of grouped and per-object generative results
- Vector parsing from gRPC binary format
#### HTTP Transport-Level Retry
- **HTTP Retry Module** (`WeaviateEx.Protocol.HTTP.Retry`):
- `with_retry/2` - Execute function with automatic retry on transient errors
- `retryable_status_code?/1` - Check if HTTP status code is retryable
- `retryable_status_codes/0` - Get list of retryable status codes
- `default_retry_opts/0` - Get default retry options
- Retryable status codes: 408, 429, 500, 502, 503, 504
- Exponential backoff with jitter (±10%)
- Configurable: `max_retries` (default: 3), `base_delay_ms` (default: 100), `max_delay_ms` (default: 5000)
#### Per-Operation Timeout Support
- **HTTP Timeout Module** (`WeaviateEx.Protocol.HTTP.Timeout`):
- `for_operation/2` - Get timeout for specific operation type
- `batch_multiplier/0` - Get batch timeout multiplier (10×)
- `operation_category/1` - Categorize operation for timeout selection
- Operation types: `:query`, `:insert`, `:batch`, `:init`
- Batch operations automatically use extended timeout (insert × 10)
#### HTTP Client Enhancements
- HTTP client now retries on transient HTTP status codes (503, 429, etc.)
- Automatic batch timeout detection for `/batch` endpoints
- Support for `operation` option to specify operation type
- Support for `retry` config in client options
- Merged retry options from client config and per-request options
#### Batch Safety Features
- **Batch Config Module** (`WeaviateEx.Batch.Config`):
- Centralized configuration for batch safety options
- `new/1` - Create config with custom options
- `auto_retry_enabled?/1` - Check if auto-retry is enabled
- `merge/2` - Merge two configurations
- `to_keyword/1` - Convert config to keyword list
- Defaults: `max_stored_results: 100_000`, `auto_retry: true`, `max_retries: 3`, `retry_delay_ms: 1000`
- **Retry Queue Module** (`WeaviateEx.Batch.RetryQueue`):
- GenServer for automatic re-queuing of failed batch objects
- `enqueue_failed/2` - Add failed objects to retry queue
- `drain/1` - Get all queued objects for manual processing
- `get_retry_count/2` - Get retry count for specific UUID
- `clear/1` - Clear queue and reset retry counts
- `calculate_backoff/2` - Exponential backoff calculation
- `retryable_error?/1` - Check if error is retryable
- Supports permanent failure callback for objects exceeding max_retries
- Jitter (±20%) for backoff to prevent thundering herd
- **Dynamic Batch Auto-Retry** (`WeaviateEx.Batch.Dynamic`):
- New options: `:auto_retry`, `:max_retries`, `:retry_delay_ms`, `:on_permanent_failure`
- Automatically re-queues failed objects with retryable errors
- Integrates with `RetryQueue` for retry tracking
- Retryable errors: rate limits, UNAVAILABLE, RESOURCE_EXHAUSTED, ABORTED, DEADLINE_EXCEEDED
#### Journey Tests (Phoenix/Plug Integration)
- **Journey Test Scenarios** (`WeaviateEx.Journey.Scenarios`):
- `simple/1` - Create collection, insert 100 objects, query, and cleanup
- `batch_insert_and_search/1` - Batch insert 1000 objects and perform vector search
- `concurrent_operations/1` - Handle 10 concurrent operations without errors
- **Phoenix Integration Tests** (`test/journey/phoenix_test.exs`):
- Client initialized at startup survives multiple requests
- Concurrent requests share client safely
- Client properly cleaned up on shutdown
- Full journey scenarios executed through Phoenix endpoints
- **Plug Integration Tests** (`test/journey/plug_test.exs`):
- Client accessible via Application env
- Journey scenarios work through Plug router
- Concurrent Plug requests share client safely
- **Test Configuration**:
- Journey tests excluded by default (run with `--include journey`)
- Added `:journey` tag to ExUnit exclusions
#### Property Value Serialization
- **Serializable Protocol** (`WeaviateEx.Types.Serializable`):
- Protocol for serializing Elixir types to Weaviate-compatible values
- Automatic serialization when creating/updating objects
- Implementations for: `DateTime`, `NaiveDateTime`, `Date`, `GeoCoordinate`, `PhoneNumber`, `Blob`
- Extensible - implement protocol for custom types
- **Date Type Serialization**:
- `Date` structs serialize to ISO8601 at midnight UTC (e.g., `~D[2024-01-01]` → `"2024-01-01T00:00:00Z"`)
- **Blob Struct** (`WeaviateEx.Types.Blob`):
- New struct for wrapping binary data: `Blob.new(binary_data)`
- `Blob.from_file/1` / `Blob.from_file!/1` - Create from file
- `Blob.to_base64/1` - Convert to base64 string
- `Blob.from_base64/1` - Create from base64 string
- Automatic base64 encoding when used in object properties
- **Deserialize Module** (`WeaviateEx.Types.Deserialize`):
- `deserialize/2` - Parse Weaviate response values with type hints
- `deserialize!/2` - Same but raises on error
- `deserialize_properties/2` - Deserialize map with schema hints
- `auto_deserialize/1` - Auto-detect types based on value structure
- Supported types: `:date`, `:geo_coordinates`, `:phone_number`, `:blob`, `:auto`
### Changed
- Default local test Weaviate version updated to 1.35.0
- Unit tests now generate coverage reports uploaded to Codecov
- `WeaviateEx.Objects.Payload` now uses `Serializable` protocol internally for type serialization
- Payload documentation updated to reflect all supported serialization types
## [0.7.3] - 2025-12-29
### Added
#### Transport & Auth
- **WCS gRPC Host Parsing**: `.weaviate.network` clusters now use `ident.grpc.<domain>` (matches Python client)
- **Proxy + Pool Wiring**: client `connection`/`proxy` options are applied to Finch pools and gRPC channels
- **OIDC Client Auth**: `Client.connect/1` accepts `WeaviateEx.Auth` configs and auto-refreshes tokens
- **Skip Init Checks**: new `:skip_init_checks` option to bypass meta/version/gRPC health checks
- **gRPC Header Forwarding**: `additional_headers` are included in gRPC metadata by default
#### Batch Operations
- **Wait for Vector Indexing** (`WeaviateEx.Batch.VectorIndexing`):
- `wait_for_indexing/3` - Wait for all vectors to be indexed after batch operations
- `wait_for_shards/3` - Wait for specific shards to have vectors indexed
- `shard_ready?/3` - Check if a specific shard is ready for queries
- `get_queue_status/2` - Get vector queue status for all shards
- `total_pending_vectors/2` - Get total pending vector count
- `all_indexed?/2` - Check if all vectors are indexed
- Options: `:timeout`, `:poll_interval`, `:how_many_failures`, `:tenant`
- Exposed via `WeaviateEx.API.Batch.wait_for_vector_indexing/3`
- **All-Fail Batch Errors** (`WeaviateEx.API.Batch`, `WeaviateEx.Batch`):
- Returns `:batch_all_failed` error when every object in a batch fails
- **gRPC Stream Backoff Handling** (`WeaviateEx.Batch.Stream`):
- Applies server backoff by updating the stream buffer size
#### RBAC Enhancements
- **User Assignments with Type** (`WeaviateEx.API.RBAC`):
- `get_user_assignments/3` - Get users assigned to role with type info
- `UserAssignment` struct with `user_id` and `user_type` fields
- Supports `:db_user`, `:db_env_user`, `:oidc` user types
- **Group Assignments with Type** (`WeaviateEx.API.RBAC`):
- `get_group_assignments/3` - Get groups assigned to role with type info
- `GroupAssignment` struct with `group_id` and `group_type` fields
- **Nodes Permission Collection Filter** (`WeaviateEx.RBAC.Permissions`):
- `nodes/2` now supports `:collection` option for verbose mode
- Example: `Permissions.nodes(:verbose, collection: "Article")`
#### Collections/Schema
- **Reconfigure Module** (`WeaviateEx.Reconfigure`):
- `inverted_index/1` - Build inverted index update config (BM25, cleanup, stopwords)
- `replication/1` - Build replication update config (factor, async, deletion strategy)
- `vector_index_hnsw/1` - Build HNSW index update config (ef, max_connections, etc.)
- `named_vectors_update/2` - Build named vector update config
- `multi_tenancy/1` - Build multi-tenancy update config
- `description/1` - Build description update
- `merge/1` - Combine multiple update configs
- **Property Range Filters** (`WeaviateEx.Property`):
- `index_range_filters` option maps to `indexRangeFilters` on schema properties
- **Config Struct Serialization** (`WeaviateEx.Collections`, `WeaviateEx.API.Collections`):
- Auto-serializes `ObjectTTL`, `AutoTenant`, and `MultiTenancyConfig` in create/update payloads
- **Collection Handle Defaults** (`WeaviateEx.Collection`):
- `new/3`, `with_tenant/2`, `with_consistency/2` and data ops apply default tenant/consistency
#### Query Enhancements
- **Multi-Vector Queries** (`WeaviateEx.Query.NearVector`):
- `single/2` - Single vector query with options
- `list_of_vectors/2` - Query with multiple vectors over single space
- `per_target/2` - Query with different vectors per named vector space
- `weighted_targets/2` - Weighted multi-target vector query
- `to_api/1` - Convert to API format
- **gRPC Search Parity** (`WeaviateEx.GRPC.Services.Search`):
- gRPC search now includes filters, group_by, target vectors, near_image/near_media, references, and vector metadata
- gRPC parsing now returns reference properties and vector metadata when requested
#### Data Operations
- **Fetch Objects by IDs** (`WeaviateEx.API.Data`):
- `fetch_objects_by_ids/4` helper with input order preserved
- **Fetch Objects by IDs** (`WeaviateEx.Objects`):
- `fetch_objects_by_ids/3` convenience wrapper using global config
- **Payload Validation** (`WeaviateEx.Objects.Payload`):
- Client-side checks for required `properties` and reserved names (`id`, `vector`)
#### Generative AI
- **Provider Parameter Parity** (`WeaviateEx.Generative.Config`, `WeaviateEx.API.Generative`):
- Added Databricks options (`frequency_penalty`, `presence_penalty`, `log_probs`, `top_log_probs`, `n`, `stop`)
- Added FriendliAI `n` parameter support
#### Aggregation
- **Near Image Aggregation** (`WeaviateEx.API.Aggregate`):
- `with_near_image/4` - Aggregate with near_image similarity constraint
- Support for `:certainty`, `:distance`, `:target_vectors` options
#### Users Management
- **Include Permissions Parameter** (`WeaviateEx.API.Users.DB`):
- `get_roles/3` now supports `:include_permissions` option
- When true, returns roles with full permission details
- **Deactivate with Key Revocation** (`WeaviateEx.API.Users.DB`):
- `deactivate/3` now supports `:revoke_key` option
- When true, also revokes the user's API key
#### Vectorizers
- **Multi-Vector Encoding** (`WeaviateEx.API.MultiVector.Encoding`):
- `muvera/1` - Configure Muvera encoding for ColBERT-style multi-vectors
- Options: `:ksim`, `:dprojections`, `:repetitions`
- `none/0` - Raw multi-vectors without encoding
#### Tenant Statuses
- **Transitional Tenant Statuses** (`WeaviateEx.Types.Tenant`):
- Added `:offloading` status - Tenant is being offloaded to cold storage
- Added `:onloading` status - Tenant is being loaded from cold storage
- Full type support in `activity_status` type
#### Cluster API Enhancements
- **Shard Name Filtering** (`WeaviateEx.API.Cluster`):
- `nodes/2` now supports `:shard` option to filter nodes by specific shard name
- Combined filtering: `Cluster.nodes(client, collection: "Article", shard: "shard-0")`
- **Delete All Replications** (`WeaviateEx.API.Cluster`):
- `delete_all_replications/1` - Batch delete all completed, failed, and cancelled replication records
- **Query Sharding State** (`WeaviateEx.API.Cluster`):
- `query_sharding_state/3` - Query sharding state to see which shards exist and their replica nodes
- `:shard` option for filtering by specific shard
- Returns `ShardingState` struct with collection name and list of `ShardReplicas`
- **ShardingState Module** (`WeaviateEx.Cluster.ShardingState`):
- `ShardingState` struct for collection sharding information
- `ShardReplicas` submodule for shard-to-node replica mappings
- `from_api/1` - Parse sharding state from API response
#### Shard Struct Enhancements
- **New Shard Fields** (`WeaviateEx.Cluster.Shard`):
- `node` field - Which node hosts this shard
- `loaded` field - Boolean indicating if shard is loaded into memory (for lazy loading scenarios)
- **LAZY_LOADING Status** (`WeaviateEx.Cluster.Shard`):
- Added `:lazy_loading` to shard status enum
- `parse_status/1` and `status_to_api/1` support for `"LAZY_LOADING"` status
#### Vectorizer Enhancements
- **Text2VecOpenAI Vectorizer** (`WeaviateEx.API.Vectorizers.Text2VecOpenAI`):
- Full OpenAI vectorizer configuration support
- Options: `:model`, `:dimensions`, `:type`, `:base_url`, `:vectorize_collection_name`
- `to_api/1`, `from_api/1` for API serialization
- **Text2VecCohere Vectorizer** (`WeaviateEx.API.Vectorizers.Text2VecCohere`):
- Full Cohere vectorizer configuration support
- Options: `:model`, `:dimensions`, `:truncate`, `:base_url`, `:vectorize_collection_name`
- `to_api/1`, `from_api/1` for API serialization
- **New Rerankers** (`WeaviateEx.API.RerankerConfig`):
- `nvidia/2` - NVIDIA NIM reranker configuration
- `contextualai/2` - ContextualAI reranker configuration
#### Query Enhancements
- **Hybrid Search Improvements** (`WeaviateEx.Query`):
- `:max_vector_distance` option for filtering results by vector distance threshold
- `:bm25_operator` option for customizing BM25 matching behavior (AND/OR)
- `BM25Operator` struct for configuring operator and minimum match count
#### Data Operations
- **Fetch Objects by IDs** (`WeaviateEx.API.Data`):
- `fetch_objects_by_ids/4` - Efficiently fetch multiple objects by their IDs
- Uses GraphQL `ContainsAny` filter for optimal performance
- Supports `:return_properties` and `:tenant` options
- **Iterator References** (`WeaviateEx.Iterator`):
- `:return_references` option for including cross-references in iteration
- Support for simple references and references with specific properties
- Automatic class name inference from reference names
- **Insert Many Convenience** (`WeaviateEx.Collections`):
- `insert_many/3` - Batch insert objects with automatic formatting
- Supports both raw property maps and structured objects
- Automatic ID, vector, and tenant handling
#### Multi-Tenancy Enhancements
- **AutoTenant Configuration** (`WeaviateEx.Config.AutoTenant`):
- `enable/1` - Enable automatic tenant creation
- `:auto_delete_timeout` option for automatic cleanup of empty tenants
- `disable/0`, `to_map/1`, `from_map/1` for full lifecycle management
#### RBAC Enhancements
- **Role Scope Parameter** (`WeaviateEx.RBAC.Permissions`):
- `:scope` option in `roles/3` for permission scope control
- Supports `:match` (exact) and `:all` (wildcard) scopes
#### Property Enhancements
- **Multi-Target References** (`WeaviateEx.Property`):
- `reference/3` now accepts a list of target collections
- `multi_reference/3` alias for explicit multi-target references
- Example: `Property.reference("hasContent", ["Article", "BlogPost"])`
#### Integration Enhancements
- **Rate Limit Headers** (`WeaviateEx.Integrations`):
- OpenAI: `:requests_per_minute_embeddings`, `:tokens_per_minute_embeddings`
- Cohere: `:requests_per_minute_embeddings`
- Custom `:base_url` support for both providers
#### Auth Enhancements
- **OIDC Grant Type Validation** (`WeaviateEx.Auth.TokenManager`):
- Validation of OIDC grant types on startup
- Supported types: `:oidc_client_credentials`, `:oidc_password`
- Clear error messages for invalid or missing auth configuration
### Fixed
#### Debug
- **REST Debug Options** (`WeaviateEx.Debug`): add `node_name` and `consistency_level` query params for object fetches
- **gRPC Debug Filters** (`WeaviateEx.Debug`, `WeaviateEx.GRPC.Services.Search`): accept filter path aliases so ID filters apply correctly
### Changed
- Updated `@valid_statuses` in `Tenant` to include transitional statuses
- Improved alias ordering in multiple modules for consistency
- `Query.execute/3` now falls back to GraphQL when a query uses options not supported by gRPC (rerank, sorting, cursor pagination, hybrid vectors)
### Stats
- 2612 tests passing (138 new tests added)
- Full Python client parity for gap closure features
- Zero warnings, errors, dialyzer issues, or credo violations
## [0.7.2] - 2025-12-29
### Added
#### Multi-Tenancy Enhancements
- **Fluent TenantClient API** (`WeaviateEx.TenantClient`):
- `with_tenant/2` - Create tenant-scoped client wrapper
- `collection/2` - Set collection for subsequent operations
- `insert/3`, `get/3`, `update/4`, `replace/4`, `delete/3` - CRUD operations
- `query/2`, `near_vector/3`, `near_text/3`, `hybrid/3`, `bm25/3` - Search operations
- `batch_insert/3`, `batch_delete/3` - Batch operations
- `count/2`, `exists?/2` - Utility operations
- Automatic tenant injection into all operations
- **Batch Tenant Updates** (`WeaviateEx.API.Tenants`):
- `batch_update/3` - Update tenants in batches of 100 (matching Python client)
- `batch_size/0` - Returns configured batch size
- **Tenant Struct** (`WeaviateEx.Types.Tenant`):
- Full typed activity status support: `:active`, `:inactive`, `:hot`, `:cold`, `:frozen`, `:offloaded`
- `new/2`, `to_map/1`, `from_map/1` - Construction and serialization
- `set_status/2`, `active?/1`, `inactive?/1` - Status management
- `valid_status?/1`, `valid_statuses/0` - Validation helpers
#### Backup/Restore Enhancements
- **Backup List Sorting** (`WeaviateEx.API.Backup`):
- `sort_by_starting_time_asc` option in `list/3` for chronological ordering
- **Cancel with Dynamic Location** (`WeaviateEx.API.Backup`):
- `:location` option in `cancel/4` for dynamic backup location configuration
- **BackupInfo Metadata** (`WeaviateEx.Backup.Status.BackupInfo`):
- `started_at` - When the backup started (DateTime)
- `completed_at` - When the backup completed (DateTime)
- `size_bytes` - Total backup size in bytes
- `error` - Error message if backup failed
#### Auth/Connection Improvements
- **WCS Header Auto-Detection** (`WeaviateEx.Client.Config`):
- `is_wcs_host?/1` - Detect Weaviate Cloud Services instances
- `maybe_add_wcs_headers/1` - Add WCS-specific headers automatically
- `new_with_wcs_detection/1` - Create config with automatic WCS detection
- Detects known WCS domains: weaviate.network, wcs.api.weaviate.io, semi.network, weaviate.cloud
- **Server Version Compatibility** (`WeaviateEx.Version`):
- `check_compatibility/1` - Validate server version from meta response
- `supports_grpc?/1` - Check if version supports gRPC (1.23.0+)
- `grpc_minimum_version/0` - Get minimum gRPC version
- **OIDC Scope Parsing** (`WeaviateEx.Auth.OIDC`):
- `parse_scopes/1` - Parse scope strings (space or comma separated)
- **Microsoft Password Flow Validation** (`WeaviateEx.Auth.Azure`):
- `validate_password_flow/1` - Validate ROPC flow requirements
- `password_flow_configured?/1` - Check if password flow is enabled
#### Schema/Collections Updates
- **Multi-Tenancy Configuration** (`WeaviateEx.Schema.MultiTenancyConfig`):
- `auto_tenant_creation` - Automatically create tenants on first insert
- `auto_tenant_activation` - Automatically activate tenants when accessed
- `enabled/0`, `disabled/0` - Convenience constructors
- `with_auto_creation/0`, `with_auto_activation/0`, `fully_automatic/0` - Preset configurations
- **Custom Vectorizer Support** (`WeaviateEx.API.VectorConfig`):
- `custom/2` - Configure custom/unlisted vectorizer modules
- `with_custom_vectorizer/3` - Add custom vectorizer to collection config
#### Search/Query Enhancements
- **Aggregate near_object** (`WeaviateEx.API.Aggregate`):
- `with_near_object/4` - Aggregate with near_object similarity constraint
- **Aggregate hybrid** (`WeaviateEx.API.Aggregate`):
- `with_hybrid/4` - Aggregate with hybrid search constraint
- `:alpha` option for vector/keyword balance
- `:fusion_type` option for fusion strategy (`:ranked` or `:relative_score`)
#### Data Types/Objects Improvements
- **Multi-Target References** (`WeaviateEx.Types.Reference`):
- `to/3` - Create reference with optional target vectors
- `multi_target/3` - Create multi-target reference for named vectors
- `from_beacon/1`, `to_map/1`, `from_map/1` - Serialization
- `extract_id/1`, `extract_collection/1` - Extraction utilities
- **Property Validation** (`WeaviateEx.Validation.Property`):
- `validate/2` - Validate property value against data type
- `validate_object/2` - Validate entire object against schema
- Supports all Weaviate data types including arrays
- **Multi-Dimensional Vectors** (`WeaviateEx.Types.Vector`):
- `validate/1` - Validate 1D or 2D vectors (ColBERT support)
- `shape/1` - Get vector dimensions
- `one_dimensional?/1`, `multi_dimensional?/1` - Type checks
- `dimensionality/1` - Get inner dimension
- `normalize/1`, `dot_product/2`, `cosine_similarity/2` - Vector operations
#### HTTP Enhancements
- **Rate Limit Header Tracking** (`WeaviateEx.Protocol.HTTP.RateLimit`):
- `from_headers/1` - Extract rate limit info from response headers
- `should_wait?/1` - Check if client should wait
- `remaining_percent/1` - Get remaining request percentage
- `near_limit?/2` - Check if close to rate limit
- `seconds_until_reset/1` - Get seconds until reset
- `summary/1` - Human-readable status
#### HTTP Transport-Level Retry
- **HTTP Retry Module** (`WeaviateEx.Protocol.HTTP.Retry`):
- `with_retry/2` - Execute function with automatic retry on transport errors
- `calculate_backoff/1` - Exponential backoff calculation (capped at 32 seconds)
- `retryable_transport_error?/1` - Check if error is retryable transport error
- Retryable errors: connection refused, connection reset, transport timeout, closed, nxdomain
- Configurable `max_retries` (default: 3) and `base_delay_ms` (default: 500)
- HTTP client now automatically retries on transient transport failures
#### Per-Operation Timeouts
- **HTTP Client Timeout Integration**:
- Uses `WeaviateEx.Config.Timeout` module for operation-specific timeouts
- GET/HEAD requests use `query` timeout (30s default)
- POST/PUT/PATCH/DELETE use `insert` timeout (90s default)
- GraphQL queries (POST to /v1/graphql) use `query` timeout
- Added `pool_timeout` (5s default) for connection pool
- Added `timeout_config` field to `WeaviateEx.Client.Config`
#### Batch Memory Safety
- **MAX_STORED_RESULTS Limit** (`WeaviateEx.Batch.ErrorTracking.Results`):
- Added 100,000 result limit to prevent memory exhaustion
- Rolling window eviction removes oldest entries when limit reached
- `max_stored_results/0` - Get the configured limit
- `results_within_limit?/1` - Check if results are within limit
#### Property Value Serialization
- **Payload Serialization** (`WeaviateEx.Objects.Payload`):
- `DateTime` values automatically serialized to RFC3339 format (ISO8601)
- `NaiveDateTime` values serialized to RFC3339 format (without timezone)
- `GeoCoordinate` structs serialized to `%{"latitude" => lat, "longitude" => lon}`
- `PhoneNumber` structs serialized to `%{"input" => number, "defaultCountry" => country}`
- Recursive serialization for nested objects and arrays
- Structs preserved through key normalization for proper serialization
#### UUID Utilities
- **Beacon URL Extraction** (`WeaviateEx.Types.UUID`):
- `extract_from_beacon/1` - Extract UUID from Weaviate beacon URLs
- Supports simple format: `weaviate://localhost/<uuid>`
- Supports collection-prefixed format: `weaviate://localhost/<collection>/<uuid>`
- Automatic UUID validation and lowercase normalization
### Changed
- Enhanced tenant activity status to include all types (active, inactive, hot, cold, frozen, offloaded)
- Backup list now supports optional sorting parameter
## [0.7.1] - 2025-12-29
### Added
#### Custom Headers Support
- **Additional Headers Configuration** (`WeaviateEx.Client.Config`):
- `additional_headers` option for custom HTTP headers (e.g., `X-OpenAI-Api-Key`, `X-Cohere-Api-Key`)
- Applied to all HTTP requests via Finch
- Applied as gRPC metadata with lowercased keys
- Validation prevents nil header values
#### Named Vectors in Data Operations
- **Named Vectors Support** (`WeaviateEx.Objects.Payload`):
- `vectors` parameter for multiple named vectors (e.g., `%{"title_vector" => [0.1, 0.2]}`)
- Mutual exclusivity validation between `vector` (single) and `vectors` (named)
- Supported in `insert/4`, `update/4`, and `replace/4` operations
#### References During Insert
- **Inline References** (`WeaviateEx.Objects.Payload`):
- `references` parameter in Data.insert/4 for inline reference creation
- Single UUID: `%{"hasAuthor" => "uuid-123"}`
- Multiple UUIDs: `%{"hasAuthors" => ["uuid-1", "uuid-2"]}`
- Multi-target: `%{"relatedTo" => %{target_collection: "Category", uuids: "cat-uuid"}}`
- Automatic beacon format conversion and properties merge
#### gRPC Exponential Backoff Retry
- **Retry Module** (`WeaviateEx.GRPC.Retry`):
- `with_retry/2` - Execute function with automatic retry on transient errors
- `calculate_backoff/1` - Calculate exponential backoff (capped at 32 seconds)
- `retryable?/1` - Check if error is retryable
- `retryable_status?/1` - Check if gRPC status code is retryable
- Retryable status codes: UNAVAILABLE (14), RESOURCE_EXHAUSTED (8), ABORTED (10), DEADLINE_EXCEEDED (4)
- Configurable `max_retries` (default: 4) and `base_delay_ms` (default: 1000)
### Changed
- gRPC services now automatically retry on transient failures:
- `WeaviateEx.GRPC.Services.Search` - All search operations
- `WeaviateEx.GRPC.Services.Batch` - Batch insert, references, delete
- `WeaviateEx.GRPC.Services.Aggregate` - Aggregation queries
- `WeaviateEx.GRPC.Services.Tenants` - Tenant operations
- `WeaviateEx.GRPC.Services.Health` - Health checks (with reduced retry count)
## [0.7.0] - 2025-12-29
### Added
#### Multimodal Search Support
- **NearImage Search** (`WeaviateEx.Query.NearImage`) - Image-based vector search for multimodal collections:
- `new/1` - Create near_image search with base64 data or file path
- Supports `multi2vec-clip`, `multi2vec-bind`, and other image vectorizers
- Options: `:image`, `:image_file`, `:certainty`, `:distance`, `:target_vectors`
- `encode_image_file/1` - Base64 encode image files
- `to_grpc/1`, `to_graphql/1` - Protocol conversion utilities
- **NearMedia Search** (`WeaviateEx.Query.NearMedia`) - Media-based vector search for multimodal collections:
- `new/2` - Create near_media search with type and media data
- Supports 5 media types: `:audio`, `:video`, `:thermal`, `:depth`, `:imu`
- Options: `:media`, `:media_file`, `:certainty`, `:distance`, `:target_vectors`
- `media_types/0` - List all supported media types
- `to_grpc/1`, `to_graphql/1` - Protocol conversion utilities
- **Query Builder Integration**:
- `Query.near_image/2` - Add image-based search to query
- `Query.near_media/3` - Add media-based search to query
- Full GraphQL and gRPC support for multimodal queries
#### gRPC Health Checking
- **gRPC Health Ping** (`WeaviateEx.GRPC.Services.Health`):
- `ping/2` - Lightweight connectivity check returning `:ok` or `{:error, reason}`
- Quick connection verification for startup and heartbeat checks
- Returns `{:error, :no_channel}` for nil channels
#### Server Version Detection
- **Version Module** (`WeaviateEx.Version`) - Parse and validate Weaviate server versions:
- `parse/1` - Parse version strings (handles "v" prefix, prereleases, build metadata)
- `meets_minimum?/2` - Check if version meets minimum requirement
- `get_server_version/1` - Extract version from meta endpoint response
- `validate_server/1` - Validate against minimum supported version (1.27.0)
- `minimum_version/0`, `minimum_version_string/0` - Get minimum version info
- `format_version/1` - Format version tuple to string
#### Kubernetes Health Endpoints
- **K8s Probe Support** (`WeaviateEx.Health`):
- `alive?/0`, `alive?/1` - Liveness probe via `/.well-known/live` endpoint
- `ready?/0`, `ready?/1` - Readiness probe via `/.well-known/ready` endpoint
- Client and no-client variants for flexibility
- Returns `{:ok, true}` or `{:ok, false}` for consistent handling
#### Background Batch Processing (Phase 2)
- **Background Batcher** (`WeaviateEx.Batch.Background`) - Process-based async batching:
- `start_link/1` - Start background batcher with configuration
- `add_object/3` - Queue object for background processing
- `add_reference/5` - Queue reference with UUID tracking
- `flush/1` - Trigger immediate flush
- `get_results/1` - Get accumulated results
- `stop/2` - Stop with optional final flush
- Automatic flushing based on batch size or time interval
- Concurrent request management with configurable limits
- UUID tracking for reference ordering
- Error tracking and callback support
- **Batch Module Integration**:
- `Batch.background/3` - Convenience function to start background batcher
#### Named Vector Query Integration (Phase 2)
- **TargetVectors Enhancements** (`WeaviateEx.Query.TargetVectors`):
- `combine/2` - Create combined target vectors with method (`:sum`, `:average`, `:minimum`)
- `weighted/1` - Create manually weighted target vectors
- `normalize/1` - Normalize various input formats to Config struct
- `to_grpc/1` - Convert to gRPC format
- `Config` struct for structured target vector configuration
- **Query Builder Integration**:
- `Query.near_vector/3` now accepts `:target_vectors` option
- `Query.near_text/3` now accepts `:target_vectors` option
- `Query.near_object/3` now accepts `:target_vectors` option
#### Advanced Hybrid Search (Phase 2)
- **HybridVector Enhancements** (`WeaviateEx.Query.HybridVector`):
- `near_text/2` - Text-based vector search with Move operations
- `near_vector/2` - Vector-based search with target vectors
- `to_grpc/1` - Convert to gRPC format for query execution
- Support for `:move_to`, `:move_away_from`, `:target_vectors` options
- `query` field for better naming consistency
- **Query.hybrid/3** Enhancements:
- `:vector` option accepts HybridVector configuration
- `:properties` option for BM25 component
- `:target_vectors` option for multi-vector collections
#### Connection Pool Configuration (Phase 2)
- **Connection Config** (`WeaviateEx.Config.Connection`) - Fine-tune connection settings:
- `new/1` - Create pool config with size, max connections, timeouts
- `to_finch_opts/1` - Convert to Finch HTTP client options
- `to_grpc_opts/1` - Convert to gRPC channel options
- Options: `:pool_size`, `:max_connections`, `:pool_timeout`, `:max_idle_time`
#### Azure OIDC Support (Phase 2)
- **Azure Authentication** (`WeaviateEx.Auth.Azure`) - Azure-specific OIDC handling:
- `azure_endpoint?/1` - Detect Azure/Microsoft token endpoints
- `default_scopes/1` - Generate Azure-style `.default` scopes
- `apply_azure_defaults/1` - Auto-configure Azure authentication
- `detect_version/1` - Detect Azure v1/v2 endpoint version
- `build_token_params/2` - Build Azure-specific token parameters
#### Dynamic gRPC Message Size (Phase 2)
- **Version Module** (`WeaviateEx.Version`):
- `get_grpc_max_message_size/1` - Extract gRPC max message size from server meta
#### Filter Enhancements (Phase 4)
- **Property Length Filtering** (`WeaviateEx.Filter`):
- `by_property_length/3` - Filter by string or array length
- `len/1` - Create length path helper (e.g., `len("title")`)
- Operators: `:equal`, `:not_equal`, `:greater_than`, `:greater_or_equal`, `:less_than`, `:less_or_equal`
- Use for filtering empty strings, minimum content length, array element counts
- **Reference Path Traversal** (`WeaviateEx.Filter.RefPath`):
- `through/2`, `through/3` - Build multi-level reference paths
- `property/4` - Terminate path with property filter
- `build_path/2` - Build path list from segments
- `to_path/1` - Get path without final property
- `depth/1` - Get number of hops in reference path
- Enables deep filtering: `RefPath.through("hasAuthor", "Author") |> RefPath.through("worksAt", "Company") |> RefPath.property("industry", :equal, "Tech")`
- **Multi-Target Reference Filters** (`WeaviateEx.Filter.MultiTargetRef`):
- `new/2` - Create multi-target reference filter builder
- `where/4` - Add property filter on specific target collection
- `deep_where/2` - Deep path filtering with RefPath
- `as_ref_path/1` - Convert to RefPath for chaining
- Filter different target collections: `MultiTargetRef.new("relatedTo", "Article") |> MultiTargetRef.where("title", :like, "Tech*")`
- **Filter Module Integration**:
- `by_ref_path/4` - Create filter from RefPath
- `by_ref_multi_target/5` - Create multi-target reference filter
#### Query Reference Enhancements (Phase 4)
- **Multi-Target References** (`WeaviateEx.Query.QueryReference`):
- `multi_target/3` - Create query for specific target collection
- `multi_target?/1` - Check if reference is multi-target
- Query different targets: `QueryReference.multi_target("relatedTo", "Article", return_properties: ["title"])`
- **Return Metadata Option**:
- `return_metadata` option for references
- Accepts `:full`, `:common`, or list of atoms (`:uuid`, `:distance`, `:certainty`, `:creation_time`, etc.)
- Include metadata in referenced objects: `QueryReference.new("hasAuthor", return_metadata: [:uuid, :distance])`
#### Named Vector Config Updates (Phase 4)
- **Update Configuration** (`WeaviateEx.API.NamedVectors`):
- `update_config/2` - Create update config for existing named vector
- `update_to_api/1` - Convert update to API format
- `build_update_config/1` - Build combined update for multiple vectors
- Vector index options: `:ef`, `:dynamic_ef_min`, `:dynamic_ef_max`, `:dynamic_ef_factor`, `:flat_search_cutoff`
- Quantizer options: `:type` (`:pq`, `:bq`, `:sq`), `:segments`, `:centroids`, `:training_limit`, `:rescore_limit`
- Example: `NamedVectors.update_config("title_vector", vector_index: [ef: 200], quantizer: [type: :pq, segments: 128])`
#### Custom Provider Configurations (Phase 4)
- **Custom Generative Providers** (`WeaviateEx.API.GenerativeConfig`):
- `custom/2` - Create config for unlisted generative AI providers
- Automatic snake_case to camelCase conversion
- Pass any options: api_endpoint, model, api_key_header, temperature, max_tokens, etc.
- Example: `GenerativeConfig.custom("my-llm", api_endpoint: "https://llm.example.com", model: "custom-gpt")`
- **Reranker Configuration Module** (`WeaviateEx.API.RerankerConfig`):
- `cohere/2` - Cohere Rerank configuration
- `transformers/1` - Local transformers reranker
- `voyageai/2` - Voyage AI reranker
- `jinaai/2` - Jina AI reranker
- `custom/2` - Custom/unlisted reranker providers
- `none/0` - Disable reranking
- All providers support `:base_url` option for custom endpoints
### Changed
- Updated Query struct to include `near_image` and `near_media` fields
- Enhanced GraphQL query building with nearImage and nearMedia support
### Test Infrastructure
#### Supertester Integration
- **Added `supertester ~> 0.4.0`** as test dependency for robust, async-safe testing
- **Eliminated all Process.sleep calls** from unit tests using supertester-style patterns:
- `token_manager_test.exs`: Replaced 8 sleep calls with deterministic state polling
- `dynamic_test.exs`: Replaced 1 sleep call with state-based synchronization
- `state_test.exs`: Replaced 1 sleep call with explicit time-wait pattern
- **New Test Helpers** (`WeaviateEx.TestHelpers`):
- `wait_until/2` - Polls until condition is met with configurable timeout/interval
- `wait_for_genserver_state/3` - Waits for GenServer state to match a condition
- `trigger_and_wait/4` - Sends message and waits for state change
- All 2151 tests pass with full async execution support
### Stats
- Phase 1-4: 20+ new feature modules/functions
- Phase 4: 6 new modules (RefPath, MultiTargetRef, RerankerConfig) + major enhancements
- Full test coverage for all new features
- Backward compatible with v0.6.0
- Test suite now fully async-safe with zero timing-based synchronization
## [0.6.0] - 2025-12-29
### Added
#### Quantizer Support
- **Quantizer Module** (`WeaviateEx.API.Quantizer`) - Typed structs for vector quantization:
- `PQConfig` - Product Quantization with segments, centroids, encoder configuration
- `BQConfig` - Binary Quantization with cache and rescore options
- `SQConfig` - Scalar Quantization with training limit configuration
- `RQConfig` - Rotational Quantization with configurable bit depth
- Each config provides `new/1`, `to_api/1`, `from_api/1` for serialization round-trips
- Convenience aliases: `Quantizer.pq/1`, `Quantizer.bq/1`, `Quantizer.sq/1`, `Quantizer.rq/1`
- `detect_type/1` - Auto-detect quantizer type from API response
- `from_api/1` - Parse any quantizer from API response
#### Core Vectorizer Modules
- **Text2VecAWS** (`WeaviateEx.API.Vectorizers.Text2VecAWS`) - AWS vectorizer support:
- Bedrock service with model selection (Titan, Cohere, etc.)
- SageMaker service with endpoint, target model, and variant options
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Text2VecGoogle** (`WeaviateEx.API.Vectorizers.Text2VecGoogle`) - Google vectorizer support:
- Vertex AI service with project ID and region
- Gemini service (Google AI Studio) with auto-configured endpoint
- Task type, title property, and dimensions configuration
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Text2VecWeaviate** (`WeaviateEx.API.Vectorizers.Text2VecWeaviate`) - Weaviate-hosted embeddings:
- Model selection for Weaviate-managed embedding service
- Base URL configuration for custom deployments
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Img2VecNeural** (`WeaviateEx.API.Vectorizers.Img2VecNeural`) - Neural image vectorizer:
- Image fields configuration for multi-image objects
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
#### OIDC Token Management
- **OIDC Module** (`WeaviateEx.Auth.OIDC`) - OpenID Connect support:
- `discover/1` - OIDC configuration discovery from issuer URL
- `get_token/2` - Token exchange for client_credentials and password grants
- `refresh_token/2` - Token refresh using refresh tokens
- `OIDC.Config` struct for provider configuration
- `OIDC.TokenResponse` struct with expiration helpers:
- `expires_at/1` - Calculate expiration timestamp
- `expired?/1` - Check if token is expired
- `expiring_soon?/2` - Check if token expires within buffer time
- **TokenManager GenServer** (`WeaviateEx.Auth.TokenManager`) - Automatic token management:
- `start_link/1` - Start with OIDC config or issuer URL
- `get_token/1` - Get current valid token
- `get_access_token/1` - Get just the access token string
- `force_refresh/1` - Force immediate token refresh
- Automatic background token refresh before expiration
- Configurable refresh buffer (default: 60 seconds before expiry)
- `child_spec/1` - Easy integration with supervision trees
- **Auth Module Extensions**:
- `get_oidc_headers/1` - Get authorization headers from TokenManager
- `oidc_config/1` - Create OIDC configuration for TokenManager
#### Generative Search Integration
- **Query.Generate Module** (`WeaviateEx.Query.Generate`) - Combine search with AI generation:
- `new/1` - Create generative query for collection
- `near_text/3`, `near_vector/3`, `near_object/3` - Vector similarity with generation
- `bm25/3`, `hybrid/3` - Keyword and hybrid search with generation
- `single/2` - Single-object generation (generate per result)
- `grouped/2` - Grouped generation (generate once for all results)
- `return_properties/2`, `where/2`, `limit/2`, `offset/2`, `tenant/2`
- `additional/2` - Request additional metadata fields
- `to_graphql/1` - Convert to GraphQL query string
- `execute/2` - Execute query and parse results
- `parse_response/2` - Parse API response to GenerativeResult
- **GenerativeResult Struct** (`WeaviateEx.Query.GenerativeResult`):
- `objects` - List of result objects with properties
- `generated` - Grouped generation result
- `generated_per_object` - List of per-object generation results
- **Query Module Integration**:
- `Query.generate/4` - Convert Query struct to Generate query
#### Nested Properties Support
- **Property.Nested Module** (`WeaviateEx.Property.Nested`) - Nested object schema support:
- `new/1` - Create nested property with name, data_type, nested_properties
- `to_api/1` - Serialize to Weaviate API format
- `from_api/1` - Parse from API response (supports recursive nesting)
- `valid?/1` - Validate nested property configuration
- `object_type?/1` - Check if property is object or object_array type
- **Property Module Integration**:
- `Property.object/3` - Create object property with nested properties
- `Property.object_array/3` - Create object array property with nested properties
- **DataType Module**:
- `:object` and `:object_array` data types for nested structures
#### Batch Improvements
- **Concurrent Batch Operations** (`WeaviateEx.Batch.Concurrent`):
- `insert_many/4` - Parallel batch insertion using Task.async_stream
- Configurable: `max_concurrency`, `batch_size`, `ordered`, `timeout`
- `split_into_batches/2` - Split objects into batches
- `aggregate_results/2` - Combine results from parallel batches
- `retryable_error?/1` - Detect retryable errors
- `Result` struct with `all_successful?/1`, `has_failures?/1`, `summary/1`
- **Batch Queue** (`WeaviateEx.Batch.Queue`) - FIFO queue for failure tracking:
- `new/0` - Create empty queue
- `enqueue/2` - Add object to pending queue
- `dequeue_batch/2` - Get batch of objects for processing
- `mark_failed/3` - Move object to failed queue with reason
- `requeue_failed/2` - Move failed objects back to pending (respects max_retries)
- `pending_count/1`, `failed_count/1`, `empty?/1`
- `FailedObject` struct with retry count and failure timestamp
- **Rate Limit Detection** (`WeaviateEx.Batch.RateLimit`):
- `detect/1` - Detect rate limiting from HTTP response
- `rate_limited?/1` - Check if error indicates rate limiting
- `calculate_backoff/1` - Calculate exponential backoff with jitter
- `extract_retry_after/1` - Extract retry-after from headers
- Provider-specific patterns: OpenAI (429), Cohere (rate limit errors)
- **Server Queue Monitoring** (`WeaviateEx.API.Cluster`):
- `batch_stats/1` - Get cluster batch statistics (queue_length, rate_per_second, failed_count)
- Aggregates stats from all nodes for dynamic batch sizing
- **Dynamic Batch Sizing** (`WeaviateEx.Batch.Dynamic`):
- `:monitor_server_stats` option - Enable server queue monitoring
- `:poll_interval` option - Configure stats polling frequency
- `get_server_batch_stats/1` - Get current server stats from GenServer
#### gRPC Batch Streaming (Weaviate 1.34+)
- **Batch Stream Service** (`WeaviateEx.GRPC.Services.BatchStream`) - Low-level gRPC streaming:
- `open/2` - Open bidirectional gRPC stream
- `send_objects/2` - Send batch objects over stream
- `send_references/2` - Send cross-references over stream
- `receive_results/2` - Receive batch results with timeout
- `close/1` - Close stream and clean up resources
- `start_message/1`, `stop_message/0`, `data_message/2` - Protocol message builders
- **High-Level Batch Stream** (`WeaviateEx.Batch.Stream`) - Client-side buffered streaming:
- `new/3` - Create stream session with buffer configuration
- `add/2` - Add object to buffer (auto-flush when full)
- `flush/1` - Manually flush buffer to server
- `close/1` - Close stream and return all results
- Configurable: `buffer_size`, `flush_interval_ms`, `auto_flush`, `auto_reconnect`
- Automatic connection management and error recovery
#### RBAC Enhancements
- **Scope Permissions** (`WeaviateEx.API.RBAC.Scope`) - Fine-grained access control:
- `all_collections/0` - Create scope for all collections
- `collection/1` - Create scope for specific collection
- `collections/1` - Create scope for list of collections
- `with_tenants/2` - Add tenant restrictions to scope
- `with_shards/2` - Add shard restrictions to scope
- `to_api/1`, `from_api/1` - API serialization
- **Permission Builder** (`WeaviateEx.API.RBAC.Permission`) - Permission construction:
- `new/3` - Create permission with resource, action, and scope
- `read_collection/1`, `manage_data/1` - Common permission shortcuts
- `admin/0` - Full administrative permissions
- `viewer/0` - Read-only permissions
- `to_api/1`, `from_api/1` - API serialization
- **Database User Management** (`WeaviateEx.API.Users.DB`) - DB-backed users:
- `create/3` - Create DB user (returns API key)
- `get/3` - Get DB user details
- `list/2` - List all DB users
- `delete/3` - Delete DB user
- `rotate_api_key/3` - Rotate user's API key
- `assign_roles/4`, `revoke_roles/4` - Role management
- **OIDC User Management** (`WeaviateEx.API.Users.OIDC`) - OIDC-backed users:
- `get/3` - Get OIDC user details
- `list/2` - List OIDC users
- `assign_roles/4`, `revoke_roles/4` - Role management
- Note: OIDC users cannot be created/deleted via API
#### Additional Vectorizers
- **Text2VecTransformers** (`WeaviateEx.API.Vectorizers.Text2VecTransformers`) - Local transformer models:
- Pooling strategy configuration (`:masked_mean`, `:cls`)
- Separate passage/query inference URLs for asymmetric search
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Text2VecOllama** (`WeaviateEx.API.Vectorizers.Text2VecOllama`) - Ollama embeddings:
- Model selection (nomic-embed-text, mxbai-embed-large, etc.)
- Custom API endpoint configuration
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Text2VecJinaAI** (`WeaviateEx.API.Vectorizers.Text2VecJinaAI`) - Jina AI embeddings:
- Model selection with dimensions support
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Text2VecVoyageAI** (`WeaviateEx.API.Vectorizers.Text2VecVoyageAI`) - VoyageAI embeddings:
- Truncation support for long inputs
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Text2VecPalm** (`WeaviateEx.API.Vectorizers.Text2VecPalm`) - Google PaLM/Vertex AI:
- Project ID and model ID configuration
- Custom API endpoint support
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Text2VecAzureOpenAI** (`WeaviateEx.API.Vectorizers.Text2VecAzureOpenAI`) - Azure OpenAI:
- Resource name and deployment ID configuration
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Multi2VecClip** (`WeaviateEx.API.Vectorizers.Multi2VecClip`) - CLIP multimodal:
- Image and text field configuration with weights
- Custom inference URL support
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Multi2VecGoogle** (`WeaviateEx.API.Vectorizers.Multi2VecGoogle`) - Google multimodal:
- Image, text, and video field support
- Project ID, location, model ID, dimensions configuration
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Multi2VecCohere** (`WeaviateEx.API.Vectorizers.Multi2VecCohere`) - Cohere multimodal:
- Image and text field configuration
- Truncation strategy support (NONE, START, END)
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Multi2VecVoyageAI** (`WeaviateEx.API.Vectorizers.Multi2VecVoyageAI`) - VoyageAI multimodal:
- Image and text field configuration with weights
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
- **Ref2VecCentroid** (`WeaviateEx.API.Vectorizers.Ref2VecCentroid`) - Reference centroid:
- Reference properties configuration
- Centroid calculation method (mean)
- `new/1`, `to_api/1`, `from_api/1`, `vectorizer_name/0`
#### Debug Module
- **Debug API** (`WeaviateEx.Debug`) - Protocol comparison and troubleshooting:
- `get_object_rest/4` - Fetch object via REST/HTTP protocol
- `get_object_grpc/4` - Fetch object via gRPC protocol
- `compare_protocols/4` - Compare REST and gRPC responses with detailed diff
- `connection_info/1` - Get HTTP and gRPC connection diagnostics
- **ObjectCompare** (`WeaviateEx.Debug.ObjectCompare`) - Deep object comparison:
- `compare/2` - Compare two objects and detect differences
- `diff/2` - Generate list of differences between objects
- `format_diff/1` - Format differences as human-readable report
- **RequestLogger** (`WeaviateEx.Debug.RequestLogger`) - Request logging GenServer:
- `start_link/1` - Start logger with optional name
- `enable/1`, `disable/1` - Toggle request logging
- `log_request/2` - Log HTTP/gRPC request details
- `get_logs/2` - Retrieve logs with optional filters (protocol, min_duration_ms)
- `export_logs/3` - Export logs to file (JSON or text format)
- `clear_logs/1` - Clear all logged requests
- **Main Module Integration**:
- `WeaviateEx.debug_get_rest/4` - Convenience delegate to Debug.get_object_rest
- `WeaviateEx.debug_compare/4` - Convenience delegate to Debug.compare_protocols
#### Backup Enhancements
- **RBAC Restore Options** (`WeaviateEx.API.Backup`):
- `roles_restore` option - Restore role definitions from backup
- `users_restore` option - Restore user role assignments from backup
- `overwrite_alias` option - Overwrite existing collection aliases during restore
- **Location Struct Support** (`WeaviateEx.API.Backup`):
- `create/4` now accepts Location structs (Filesystem, S3, GCS, Azure) directly
- `restore/4` now accepts Location structs directly
- Dynamic location configuration for programmatic backend selection
- **Backup Config Enhancement** (`WeaviateEx.Backup.Config.Create`):
- Added `chunk_size` option - Configure backup chunk size in megabytes
#### Connection Management
- **Pool Configuration** (`WeaviateEx.Client.Pool`) - Connection pool settings:
- `new/1` - Create pool config with size, overflow, strategy, timeouts
- `default/0` - Default pool configuration
- `default_http/0` - HTTP-optimized pool (larger pool for parallel requests)
- `default_grpc/0` - gRPC-optimized pool (smaller pool due to multiplexing)
- `to_finch_opts/1` - Convert to Finch HTTP client options
- `to_grpc_opts/1` - Convert to gRPC channel options
- Configurable: size, overflow, strategy (:fifo/:lifo), timeout, idle_timeout, max_age
- **Client State Tracking** (`WeaviateEx.Client.State`) - Lifecycle state management:
- `new/0` - Create initial state with timestamps
- `connected/1`, `disconnected/2`, `closed/1` - State transitions
- `record_request/1` - Track successful requests
- `record_error/2` - Track errors with details
- Status tracking: `:initializing`, `:connected`, `:disconnected`, `:closed`
- Statistics: request_count, error_count, created_at, last_used_at, last_error
- **Client Lifecycle** (`WeaviateEx.Client`):
- `close/1` - Close client and release all connections
- `closed?/1` - Check if client has been closed
- `status/1` - Get current client status
- `stats/1` - Get client statistics (request/error counts, timestamps)
- `with_client/2` - Execute function with auto-managed client lifecycle
- Added `state` field to client struct for tracking lifecycle
- **ClosedClientError** (`WeaviateEx.Error.ClosedClientError`) - Exception for closed client:
- Raised when operations are attempted on a closed client
- Includes `closed_at` timestamp for debugging
## [0.5.0] - 2025-12-28
### Added
#### Proxy Support
- **Proxy Configuration** (`WeaviateEx.Config.Proxy`) - HTTP, HTTPS, and gRPC proxy support:
- `new/1` - Create proxy config with explicit options
- `from_env/0` - Read from environment variables (HTTP_PROXY, HTTPS_PROXY, GRPC_PROXY)
- `configured?/1` - Check if any proxy is configured
- `http_proxy_for/2` - Get appropriate proxy for a URL scheme
- `to_finch_opts/1` - Convert to Finch HTTP client options
- `to_grpc_opts/1` - Convert to gRPC channel options
- Environment variable reading with case-insensitive support (uppercase takes precedence)
- Automatic fallback from HTTPS to HTTP proxy when HTTPS not configured
#### Inverted Index Configuration
- **Inverted Index Config** (`WeaviateEx.API.InvertedIndexConfig`) - Collection index configuration:
- `bm25/1` - BM25 algorithm configuration with `b` and `k1` parameters
- `stopwords/1` - Stopwords configuration with preset, additions, and removals
- `index_timestamps/1` - Enable/disable timestamp indexing
- `index_property_length/1` - Enable/disable property length indexing
- `index_null_state/1` - Enable/disable null state indexing
- `cleanup_interval_seconds/1` - Set cleanup interval
- `build/1` - Build complete inverted index configuration
- `merge/2` - Merge two configurations
- `validate/1` - Validate configuration values
- Supported stopwords presets: `en`, `none`
- BM25 parameter validation (b: 0-1, k1: positive)
#### Generative Search Configuration
- **Generative Config** (`WeaviateEx.API.GenerativeConfig`) - 13+ provider configurations:
- `openai/1` - OpenAI GPT models
- `azure_openai/1` - Azure OpenAI deployments
- `cohere/1` - Cohere Command models
- `anthropic/1` - Anthropic Claude models
- `mistral/1` - Mistral AI models
- `google/1` - Google Gemini/PaLM models
- `aws/1` - AWS Bedrock/SageMaker models
- `ollama/1` - Ollama local models
- `databricks/1` - Databricks endpoints
- `nvidia/1` - NVIDIA NIM models
- `friendliai/1` - FriendliAI models
- `xai/1` - XAI Grok models
- `anyscale/1` - Anyscale models
- `contextualai/1` - ContextualAI models
- `providers/0` - List all supported providers
- `provider_module/1` - Get Weaviate module name for provider
- Full parameter support: model, temperature, maxTokens, baseURL, topK, topP
#### Collection Aliases API
- **Aliases API** (`WeaviateEx.API.Aliases`) - Zero-downtime collection management (requires Weaviate v1.32.0+):
- `create/3` - Create an alias for a collection
- `delete/2` - Delete an alias
- `update/3` - Update alias to point to different collection
- `get/2` - Get alias details
- `list/2` - List all aliases (optionally filter by collection)
- `exists?/2` - Check if alias exists
- `minimum_version/0` - Get minimum required Weaviate version
- **Alias Struct** (`WeaviateEx.API.Aliases.Alias`):
- `from_api/1` - Parse API response to struct
- Fields: `alias`, `collection`
#### ZSTD Compression Options
- **Extended Compression** (`WeaviateEx.Backup.Compression`) - Additional compression algorithms:
- `:zstd_default` - Balanced ZSTD compression
- `:zstd_best_speed` - Fast ZSTD compression
- `:zstd_best_compression` - Maximum ZSTD compression
- `:no_compression` - Disable compression
- `gzip?/1` - Check if compression level uses GZIP
- `zstd?/1` - Check if compression level uses ZSTD
- ZSTD provides faster compression with better ratios than GZIP
#### Query Move Integration
- **Move in near_text** (`WeaviateEx.Query`) - Semantic direction control:
- `near_text/3` now supports `:move_to` and `:move_away` options
- Move concepts toward or away from specific terms
- Accepts `WeaviateEx.Query.Move` structs or keyword options
- Proper GraphQL generation for move parameters
- Example: `Query.near_text("technology", move_to: [concepts: ["AI"], force: 0.8])`
### Changed
- Updated test count to 1575 tests
- Enhanced Query module with Move struct integration
- Extended Backup.Compression with ZSTD support while maintaining backward compatibility
### Stats
- 6 new feature modules
- Full test coverage for all new features
- Backward compatible with v0.4.0
## [0.4.0] - 2025-12-28
### Added
#### Cluster Management
- **Cluster API** (`WeaviateEx.API.Cluster`) - Complete cluster management:
- `nodes/2` - Get cluster node information with optional verbose output
- `shards/2` - Get shards for a collection
- `statistics/1` - Get cluster-wide statistics
- `replicate/4` - Trigger shard replication between nodes
- `list_replications/2` - List ongoing replication operations
- `get_replication/3` - Get replication operation status
- `cancel_replication/2` - Cancel an ongoing replication
- `delete_replication/2` - Delete a replication operation record
- `wait_for_replications/2` - Wait for all replications to complete
- **Cluster Type Structs**:
- `WeaviateEx.Cluster.Node` - Node with status, version, shards, stats
- `WeaviateEx.Cluster.Shard` - Shard with status, vector indexing, object count
- `WeaviateEx.Cluster.Replication` - Replication operation with progress tracking
- `WeaviateEx.Cluster.Replication.Operation` - Individual replication operation
#### Query Rerank & GroupBy Integration
- **Query.Rerank** enhancements:
- `to_map/1` - Convert to map format for gRPC
- `valid?/1` - Validate rerank configuration
- Improved `to_graphql/1` with proper string escaping
- **Query.GroupBy** enhancements:
- Support for list paths (nested properties)
- `to_map/1` - Convert to map format for gRPC
- `valid?/1` - Validate group_by configuration
- **Query Builder Integration**:
- `Query.rerank/2` - Add rerank to query
- `Query.group_by/2` - Add group_by to query
- Works with all query types: near_text, near_vector, hybrid, bm25
#### Batch Advanced Features
- **wait_for_vector_indexing** (`WeaviateEx.Batch`):
- Poll until all vectors are indexed
- Configurable timeout, poll interval, max failures
- Optional shard filtering
- **Auto UUID Generation** (`WeaviateEx.Batch.FixedSize`):
- `add_object/4` auto-generates UUID if not provided
- Uses `WeaviateEx.Types.UUID.generate/0`
- **Multi-Target References** (`WeaviateEx.Batch.FixedSize`):
- `add_reference/6` now supports list of targets
- Each target specifies collection and uuid
- **DeleteResult Struct** (`WeaviateEx.Batch.DeleteResult`):
- Typed result for batch delete operations
- `from_api/1` - Parse API response
- `all_successful?/1`, `has_failures?/1`
- `failed_objects/1`, `successful_objects/1`
- `summary/1` - Human-readable summary
- `DeletedObject` submodule for individual objects
#### Reranker Configurations
- **6 Reranker Types** in `WeaviateEx.API.VectorConfig`:
- `reranker_cohere/1` - Cohere reranker (existing)
- `reranker_transformers/1` - Local transformers reranker
- `reranker_voyageai/1` - VoyageAI reranker
- `reranker_jinaai/1` - Jina AI reranker
- `reranker_nvidia/1` - NVIDIA reranker
- `reranker_contextualai/1` - Contextual AI reranker
- **Builder Function**: `with_reranker/3` - Add reranker to collection config
#### Backup & Restore Module
- **Backup API** (`WeaviateEx.API.Backup`) - Complete backup and restore functionality:
- `create/4` - Create backup with include/exclude collections, config, wait_for_completion
- `restore/4` - Restore backup with include/exclude collections, config, wait_for_completion
- `get_create_status/3` - Get backup creation status
- `get_restore_status/3` - Get restore operation status
- `list/2` - List all backups for a storage backend
- `cancel/3` - Cancel in-progress backup
- `wait_for_completion/5` - Poll until operation completes with configurable timeout
- **Storage Backend Enum** (`WeaviateEx.Backup.Storage`) - 4 supported backends:
- `:filesystem` - Local filesystem storage
- `:s3` - Amazon S3 or S3-compatible storage
- `:gcs` - Google Cloud Storage
- `:azure` - Azure Blob Storage
- Helper functions: `all/0`, `valid?/1`, `to_api_path/1`, `from_api/1`
- **Compression Level Enum** (`WeaviateEx.Backup.Compression`):
- `:default` - Balanced compression
- `:best_speed` - Faster compression, larger files
- `:best_compression` - Slower compression, smaller files
- **Backup Status Types** (`WeaviateEx.Backup.Status`):
- Status values: `:started`, `:transferring`, `:transferred`, `:success`, `:failed`, `:canceled`
- Response structs: `CreateResponse`, `RestoreResponse`, `BackupInfo`
- Helper functions: `completed?/1`, `success?/1`, `in_progress?/1`
- **Backup Configuration** (`WeaviateEx.Backup.Config`):
- `Create` struct with `cpu_percentage` and `compression` options
- `Restore` struct with `cpu_percentage` option
- Factory functions: `create/1`, `restore/1`
- **Storage Location Structs** (`WeaviateEx.Backup.Location`):
- `Filesystem` - Local path configuration
- `S3` - Bucket, path, endpoint, region, credentials, SSL
- `GCS` - Bucket, path, project ID, credentials
- `Azure` - Container, path, connection string
- Factory functions: `filesystem/1`, `s3/3`, `gcs/3`, `azure/3`
- **Backup Error Types** (`WeaviateEx.Error`):
- `backup_not_found/2`, `backup_already_exists/2`, `backup_failed/2`
- `restore_failed/2`, `backup_timeout/2`, `invalid_backend/1`
- **Main Module Backup Functions**:
- `create_backup/4`, `restore_backup/4`, `list_backups/2`
- `cancel_backup/3`, `get_backup_status/3`, `get_restore_status/3`
#### Role-Based Access Control (RBAC)
- **RBAC Module** (`WeaviateEx.RBAC`) - Complete role-based access control support:
- `Actions` - Action type definitions and conversions for all 11 permission types
- `Permission` - Permission struct with encoding/decoding for API communication
- `Permissions` - Builder API for constructing permissions fluently
- `Role` - Role struct with permission management
- **RBAC API** (`WeaviateEx.API.RBAC`) - Role CRUD operations:
- `list_roles/1` - List all roles
- `get_role/2` - Get role by name
- `create_role/3` - Create role with permissions
- `delete_role/2` - Delete a role
- `add_permissions/3` - Add permissions to role
- `remove_permissions/3` - Remove permissions from role
- `has_permissions?/3` - Check if role has permissions
- `get_users_for_role/2` - Get users assigned to role
- `get_groups_for_role/2` - Get groups assigned to role
- `exists?/2` - Check if role exists
- **11 Permission Types**: collections, data, tenants, roles, users, groups, cluster, nodes, backups, replicate, alias
- **Type-safe Permissions Builder** (`WeaviateEx.RBAC.Permissions`):
- `collections/2` - Collection schema permissions
- `data/3` - Data CRUD permissions with tenant/object filters
- `tenants/3` - Tenant management permissions
- `roles/2` - Role management permissions
- `users/2` - User management permissions
- `groups/2` - OIDC group permissions
- `cluster/1` - Cluster info permissions
- `nodes/1` - Node info permissions (minimal/verbose)
- `backups/1` - Backup management permissions
- `replicate/2` - Replication permissions
- `alias_permission/2` - Collection alias permissions
#### User Management
- **User Structs** (`WeaviateEx.Users.User`):
- `User.DB` - Database-managed users with API key
- `User.OIDC` - OIDC-managed users with groups
- `User.Own` - Current authenticated user info
- **Users API** (`WeaviateEx.API.Users`) - User lifecycle management:
- `create/2` - Create DB user (returns API key)
- `get/2` - Get user by ID
- `list_all/1` - List all users
- `delete/2` - Delete user
- `activate/2` - Activate user
- `deactivate/2` - Deactivate user
- `rotate_key/2` - Rotate API key
- `assign_roles/3` - Assign roles to user
- `revoke_roles/3` - Revoke roles from user
- `get_assigned_roles/2` - Get user's roles
- `get_my_user/1` - Get current user info
#### Group Management
- **Group Struct** (`WeaviateEx.Groups.Group`) - OIDC group representation
- **Groups API** (`WeaviateEx.API.Groups`) - OIDC group operations:
- `list_known/1` - List known OIDC groups
- `get_assigned_roles/2` - Get roles assigned to group
- `assign_roles/3` - Assign roles to group
- `revoke_roles/3` - Revoke roles from group
#### Error Types
- **Cluster Errors** (`WeaviateEx.Error`):
- `node_not_found/1` - Node not found in cluster
- `shard_not_found/2` - Shard not found in collection
- `replication_failed/2` - Replication operation failed
- `replication_timeout/1` - Replication timed out
- `cluster_not_ready/0` - Cluster not ready
- `vector_indexing_timeout/1` - Vector indexing timed out
- **RBAC-specific Errors** (`WeaviateEx.Error`):
- `rbac_error/3` - Create RBAC error with category
- `role_not_found/1` - Role not found error
- `permission_denied/2` - Permission denied error
- `user_not_found/1` - User not found error
- `invalid_permission/1` - Invalid permission error
#### Main Module Delegations
- Cluster convenience functions: `cluster_nodes/2`, `cluster_shards/2`, `cluster_statistics/1`
- Replication functions: `replicate_shard/4`, `list_replications/2`, `get_replication/3`
- Replication control: `cancel_replication/2`, `delete_replication/2`, `wait_for_replications/2`
- `list_roles/1`, `get_role/2`, `create_role/3`, `delete_role/2`
- `create_user/2`, `get_user/2`, `list_users/1`, `delete_user/2`, `get_my_user/1`
- `list_groups/1`, `assign_group_roles/3`, `revoke_group_roles/3`
#### gRPC Protocol Support
- **gRPC Channel Management** (`WeaviateEx.GRPC.Channel`) - Persistent connection management:
- `connect/3` - Establish gRPC channel with TLS support
- `disconnect/1` - Clean channel shutdown
- `build_metadata/1` - Auth metadata for gRPC calls
- Automatic reconnection handling
- **gRPC Services** - High-performance data operations:
- `WeaviateEx.GRPC.Services.Search` - Vector similarity search (near_vector, near_text, near_object, bm25, hybrid)
- `WeaviateEx.GRPC.Services.Batch` - Batch insert, delete, and reference operations
- `WeaviateEx.GRPC.Services.Aggregate` - Count and group_by aggregations
- `WeaviateEx.GRPC.Services.Tenants` - Multi-tenancy operations
- `WeaviateEx.GRPC.Services.Health` - gRPC health checks
- **Protocol Buffer Definitions** - Generated from Weaviate v1 protos:
- 11 proto files in `priv/protos/v1/`
- Generated Elixir modules in `lib/weaviate_ex/grpc/generated/v1/`
- **gRPC Error Handling** (`WeaviateEx.Error`):
- `from_grpc_status/3` - Map gRPC status codes to error types
- `from_grpc_error/1` - Convert gRPC errors to WeaviateEx.Error
- `grpc_retryable?/1` - Identify retryable gRPC errors
- **gRPC Retry Logic** (`WeaviateEx.Retry`):
- Retry on UNAVAILABLE, RESOURCE_EXHAUSTED, ABORTED status codes
- Exponential backoff with jitter
- **Client Configuration** (`WeaviateEx.Client.Config`):
- `grpc_host` - gRPC endpoint hostname
- `grpc_port` - gRPC port (default: 50051)
- `grpc_max_message_size` - Maximum message size for gRPC calls
- `use_tls?/1` - TLS detection for gRPC connections
### Changed
- Updated documentation with new module groups
- Improved test coverage for all new features
- **Hybrid Architecture**: gRPC for data operations (queries, batch, aggregations), HTTP retained for schema operations (Weaviate gRPC API doesn't support schema management)
- **Client Connection** (`WeaviateEx.Client`):
- `connect/1` now establishes both HTTP (Finch) and gRPC channels
- New `grpc_channel` field in client struct
- Automatic gRPC fallback to HTTP when channel unavailable
- **Query Execution** (`WeaviateEx.Query`):
- `execute/2` with client uses gRPC when available
- `execute/1` without client uses HTTP (backwards compatible)
- **Batch Operations** (`WeaviateEx.API.Batch`):
- `create_objects/3` uses gRPC when client has gRPC channel
- `delete_objects/2` uses gRPC for batch deletes
- **Aggregations** (`WeaviateEx.API.Aggregate`):
- Simple count/group_by use gRPC
- Complex aggregations (multiple properties) use GraphQL
- **Tenants** (`WeaviateEx.API.Tenants`):
- `list/2`, `get/3`, `exists?/3` use gRPC
- Create/update/delete remain HTTP (not in gRPC API)
### Dependencies
- Added `{:grpc, "~> 0.9"}` - Elixir gRPC client
- Added `{:protobuf, "~> 0.13"}` - Protocol Buffer support
- Retained `{:finch, "~> 0.18"}` - For schema operations and HTTP fallback
### Stats
- Full gRPC support for data operations
- Complete Backup & Restore support with 4 storage backends
- Complete RBAC support matching Python client functionality
- Complete Cluster management with replication support
- Backwards compatible - existing code continues to work
## [0.3.0] - 2025-12-28
### Added
#### Query Enhancements
- **Move Configuration** (`WeaviateEx.Query.Move`) - Move to/away from concepts in near_text queries
- **Rerank Configuration** (`WeaviateEx.Query.Rerank`) - Reranking for search results
- **Target Vectors** (`WeaviateEx.Query.TargetVectors`) - Named vector targeting with combination strategies (sum, average, minimum, manual weights, relative score)
- **BM25 Operator** (`WeaviateEx.Query.BM25Operator`) - AND/OR operators with minimum_should_match
- **Hybrid Vector** (`WeaviateEx.Query.HybridVector`) - Vector sub-search for hybrid queries
- **GroupBy** (`WeaviateEx.Query.GroupBy`) - Result grouping configuration
- **Metadata Helpers** (`WeaviateEx.Query.Metadata`) - Metadata field selection utilities
- **Query Reference** (`WeaviateEx.Query.QueryReference`) - Cross-reference query configuration
#### Reference Operations
- **References API** (`WeaviateEx.API.References`) - Full cross-reference CRUD:
- `add/6` - Add single reference
- `delete/6` - Delete reference
- `replace/6` - Replace all references on a property
- `add_many/4` - Batch add references
- **ReferenceToMulti** (`WeaviateEx.Data.ReferenceToMulti`) - Multi-target reference type with `to_beacons/1`
#### Generative AI Enhancements
- **Typed Provider Configs** (`WeaviateEx.Generative.Config`) - Full configuration structs for 14 providers:
- OpenAI, Azure OpenAI, Anthropic, Cohere
- AWS Bedrock/SageMaker, Google Vertex/Gemini
- Mistral, Ollama, XAI, ContextualAI, Anyscale
- **NEW**: NVIDIA NIM, Databricks, FriendliAI
- **Generative Results** (`WeaviateEx.Generative.Result`) - Typed result structures:
- `Single` - Single prompt result with metadata and debug
- `Grouped` - Grouped task result
- `GenerativeObject` - Object with generative result
- `ResponseParser` - Parse API responses to typed structs
- **Generative Parameters** (`WeaviateEx.Generative.Parameters`) - Multimodal support:
- `SinglePrompt` / `GroupedTask` with image support
- `image_properties`, `non_blob_properties` options
- `metadata` and `debug` options
- **20+ AI Providers** - Added nvidia, databricks, friendliai to supported providers
#### Batch Operations
- **Error Tracking** (`WeaviateEx.Batch.ErrorTracking`) - Detailed error tracking:
- `ErrorObject` - Failed object details with retry count
- `ErrorReference` - Failed reference details
- `Results` - Aggregated results with helpers
- **Batch Retry** (`WeaviateEx.Batch.BatchRetry`) - Smart retry logic:
- Rate limit detection
- Exponential backoff calculation
- `with_retry/2` wrapper function
- **Fixed Size Batcher** (`WeaviateEx.Batch.FixedSize`) - Fixed-size batch processor
#### Tenant Extensions
- `freeze/3` - Set tenant to FROZEN state
- `offload/3` - Set tenant to OFFLOADED state
#### Multi-Vector Support
- **Multi-Vector API** (`WeaviateEx.API.MultiVector`) - ColBERT-style embeddings:
- `muvera_encoding/1` - Muvera encoding configuration
- `multi_vector_config/1` - Multi-vector index configuration
- `self_provided/1` - Self-provided multi-vectors
- `text2colbert_jinaai/1` - Jina ColBERT vectorizer
- `multi2multivec_jinaai/1` - Jina multi-modal vectorizer
#### Vectorizers
- **New Vectorizers** (Dec 2025 Python client sync):
- `text2vec_voyageai/1` - VoyageAI (voyage-3.5, voyage-3-large, voyage-context-3)
- `text2vec_morph/1` - Morph embeddings
- `text2vec_model2vec/1` - Model2Vec embeddings
- `text2vec_aws_bedrock/1` - AWS Bedrock embeddings
- `text2vec_aws_sagemaker/1` - AWS SageMaker endpoints
- `text2vec_google_vertex/1` - Google Vertex AI
- `text2vec_google_gemini/1` - Google AI Studio (Gemini)
- `reranker_cohere/1` - Cohere reranker with baseURL
#### Other
- **Object TTL Configuration** (`WeaviateEx.Config.ObjectTTL`)
- **OpenAI O1/O3 Support**: `verbosity` and `reasoning_effort` parameters
- **Cohere Enhancements**: `dimensions` parameter for embeddings
- **CI Infrastructure**: Full GitHub Actions workflow
### Changed
- Updated Docker Compose to Weaviate 1.28.14
- Copied full CI infrastructure from Python client (`ci/` directory)
- Added default version to CI start/stop scripts
### Stats
- **694 tests passing** (up from 536)
- Full Python client feature parity for core operations
## [0.2.0] - 2025-10-19
### Added
- **Embedded Mode**: Download and manage Weaviate embedded binary lifecycle with `WeaviateEx.start_embedded/1` and `WeaviateEx.stop_embedded/1`
- **Comprehensive Docker Environment**: Full Docker Compose profiles from Python client (single node, modules, RBAC, async, cluster, proxy, backup, WCS, Okta)
- **Mix Tasks for Docker Management**:
- `mix weaviate.start` - Start Weaviate stack with version and profile selection
- `mix weaviate.stop` - Stop running containers with optional volume removal
- `mix weaviate.status` - Display container status and exposed ports
- `mix weaviate.logs` - View and follow logs from specific compose files
- **Batch API Enhancements**: Comprehensive batch operations with detailed summaries, error tracking, and statistics
- **Enhanced Examples**: Added `07_batch.exs` and `08_query.exs` with comprehensive batch and query demonstrations
- **Objects API Payload Builder**: Type-safe payload construction in `WeaviateEx.Objects.Payload`
- **Collections API Extensions**: Multi-tenancy support with `set_multi_tenancy/2`, improved tenant management
- **Development Scripts**: `scripts/weaviate-stack.sh` wrapper for unified stack management
- **CI/Weaviate Infrastructure**: Complete Docker Compose setup under `ci/weaviate/` with helper scripts
- **Documentation**: Extensive planning docs in `docs/20251019/` covering essential scope, schema, queries, operations
### Changed
- **Examples Overhaul**: All 8 examples updated with improved error handling, cleaner output, and better demonstrations
- **README Improvements**: Expanded documentation with embedded mode, Mix tasks, Docker management, and comprehensive usage guides
- **Mix Tasks Refactored**: Cleaner implementation using WeaviateEx.DevSupport.Compose module for shared logic
- **Test Coverage**: Added tests for batch operations, collections API, and data operations
### Fixed
- Example helper module visibility and formatting
- Collections API tenant operations
- Batch summary statistics and error reporting
## [0.1.1] - 2025-10-16
### Changed
- Refactored HTTP client implementation into Protocol.HTTP.Client for better protocol-based architecture
- Removed old HTTPClient and HTTPClient.Finch modules in favor of protocol-based implementation
- Updated all examples to use cleaner ExampleHelper patterns with proper module qualification
- Enhanced example output formatting and error handling
- Fixed docker-compose port mapping (40051:50051 for gRPC)
- Improved test cleanup and formatting across all test files
### Added
- Added vector support to data examples
- Enhanced Protocol.HTTP.Client with comprehensive error handling
- Added better response parsing and authentication header support
### Fixed
- Fixed example helper function visibility (made ANSI color helpers public)
- Fixed client initialization to properly use protocol implementation
- Improved error messages and debugging output
## [0.1.0] - 2025-10-16
### Added
- Initial release