Back to Changelog
v0.12.0
March 23, 2026

Google Drive, Memory Intelligence & Plugin Standardization

AddedChangedFixed

#[0.12.0] - 2026-03-23

This release adds the Google Drive plugin, significantly upgrades the Memory plugin with LLM-powered reranking, query routing, and fact extraction, expands database plugins with count_rows / sample_rows / query_history tools, introduces SnowflakeAdminPlugin, and completes a sweeping standardization of tool function signatures and plugin lifecycle interfaces across the entire plugin catalog.

#Added

  • Google Drive Plugin (from daita.plugins import google_drive)

    • Full read/write plugin for Google Drive backed by the Google Drive API v3
    • Supports OAuth 2.0 user credentials and service account key files; credential flow is handled automatically on connect()
    • Agent tools: search_drive (full-text and metadata search), read_drive_file (content extraction), list_drive_folder, get_drive_file_info, download_drive_file, upload_drive_file, organize_drive_files
    • Automatic format detection and content extraction for Google Docs/Sheets/Slides (exported as text/CSV), XLSX, DOCX, PDF, and plain text
    • Programmatic API: search(), read(), list_folder(), get_info(), download(), upload(), organize()
    • All blocking Drive SDK calls are offloaded to a thread executor so the async event loop is never blocked
    • Install with: pip install 'daita-agents[google]'
  • Memory Plugin: LLM-Powered Reranking (enable_reranking=True)

    • New MemoryReranker applies a lightweight LLM scoring pass over the top recall candidates, re-ordering results by semantic relevance before returning them to the agent
    • Opt-in via MemoryPlugin(enable_reranking=True, curator=...); requires a curator agent with an attached LLM
    • Improves recall precision at the cost of an additional LLM call per query
  • Memory Plugin: Fact Extraction (enable_fact_extraction=True)

    • New FactExtractor parses free-form memory content at ingestion time and stores structured ExtractedFact records in the memory's metadata under extracted_facts
    • Facts capture entities, relationships, dates, and numerical values for richer temporal and relational recall
    • Opt-in via MemoryPlugin(enable_fact_extraction=True, curator=...); requires a curator agent
    • FactExtractor.facts_to_metadata() utility serialises facts to the standard metadata dict format
  • Memory Plugin: Query Router

    • New QueryRouter classifies incoming recall queries into semantic categories (QueryRoute) to allow backend-specific retrieval strategies
    • Used internally by MemoryPlugin to select between vector, keyword, and hybrid recall paths
    • memory() factory function added for concise plugin construction: memory(backend=..., curator=...)
  • Database Plugins: count_rows and sample_rows

    • count_rows(table, filter=None) and sample_rows(table, n=5) programmatic methods added to PostgreSQL, MySQL, MongoDB, and Snowflake plugins (SQLite already had them)
    • Corresponding agent tools {plugin}_count and {plugin}_sample registered automatically, letting agents quickly inspect table sizes and representative rows without writing raw SQL
    • query_history(limit=20) added to MongoDB and Snowflake to surface recent query activity
  • SnowflakeAdminPlugin

    • New SnowflakeAdminPlugin subclass of SnowflakePlugin with an extended tool set for administrative operations (warehouse management, role inspection, usage monitoring)
    • Import as from daita.plugins import snowflake and instantiate with SnowflakeAdminPlugin(...)
  • BaseDatabasePlugin._compact_column()

    • New static helper that normalises the varying column descriptor shapes returned by different SQL plugins' describe() methods into a consistent "colname:datatype:null_status" string
    • Used internally by schema-summary utilities across PostgreSQL, MySQL, SQLite, and Snowflake
  • Slack: read_slack_messages Tool

    • New agent tool that reads recent messages from a channel, returning structured message objects with author, timestamp, and text
    • Accepts channel (ID or #name) and optional limit (default 20)
  • Comprehensive Plugin Unit Tests

    • New test modules added for Catalog, Email, Google Drive, MongoDB, Neo4j, Orchestrator, PostgreSQL, Qdrant, REST, S3, and Snowflake plugins
    • All tests run against mocked clients — no external services required
    • Covers tool registration, connect()/disconnect() lifecycle, error propagation, and programmatic API surface

#Changed

  • Plugin Lifecycle Standardization

    • All plugins now consistently subclass BasePlugin and implement connect() / disconnect()
    • RedisMessagingPlugin renamed its entry points: start()connect(), stop()disconnect(); all internal call sites updated
    • Context manager __aenter__ / __aexit__ now delegate uniformly to connect() / disconnect() across every plugin
  • Tool Function Signature Standardization

    • Tool handler methods (_tool_*) across all plugins now share a consistent signature: async def _tool_name(self, args: Dict[str, Any]) -> Dict[str, Any]
    • AgentTool registrations updated throughout the plugin catalog to use uniform parameters JSON Schema shapes, consistent category, source, plugin_name, and timeout_seconds fields
    • Eliminates the inconsistencies that caused silent tool-call failures when the agent runtime validated tool schemas
  • S3 Plugin: Error Mapping & Async Safety

    • New _map_s3_error() translates raw botocore exceptions to typed PluginError / AuthenticationError / ResourceNotFoundError
    • connect() is now guarded by an asyncio.Lock to prevent duplicate client initialisation under concurrent access
    • New _tool_head_object tool for lightweight existence/metadata checks without downloading object content
    • All blocking boto3 calls moved to dedicated _sync_* wrappers executed in a thread pool
  • Slack Plugin: Structured Error Handling

    • Authentication failures now raise AuthenticationError (invalid token, inactive account) rather than bare exceptions
    • All tool and method-level errors raise typed PluginError with the plugin name attached
  • Elasticsearch, Neo4j, Qdrant, REST, Orchestrator Plugins

    • Tool handler signatures and AgentTool metadata aligned with the new standard
    • Error propagation paths cleaned up to use typed exceptions from daita.core.exceptions

#Fixed

  • Tool Schema Validation Failures

    • Several plugins registered tools with missing or malformed JSON Schema parameters blocks, causing the agent runtime to reject them at dispatch time; all schemas are now validated against the AgentTool contract
    • required arrays were missing from several tool schemas, causing the LLM to omit mandatory arguments; these are now explicitly declared
  • Redis Plugin Interface Contract

    • RedisMessagingPlugin did not inherit from BasePlugin, causing it to be silently skipped by plugin lifecycle managers; now properly integrated