Releases: Agent-CI/agentexec
v0.1.4
v0.1.4
Breaking Changes
Renamed WorkerPool to Pool
ax.WorkerPoolis nowax.Poolfor cleaner API- Update imports:
from agentexec import Pool
Activity percentage field renamed
completion_%renamed topercentagefor cleaner field naming
New Features
Pipelines run on workers
- Pipelines can now be executed on worker processes
- Register pipelines with the pool and enqueue them like tasks
Tracker for stateful counters
- New
Trackerclass for managing stateful counters across workers - Useful for tracking progress, metrics, and distributed state
Strict Pipeline type flow validation
- All step parameters and return types must be
BaseModelsubclasses - Type flow between consecutive steps is validated at runtime
- Tuple returns are unpacked and matched to next step's parameters
- Final step must return a single
BaseModel(not a tuple) - Empty pipelines raise
RuntimeErrorat class definition time
Internal Improvements
Type checking with ty
- Added
tytype checker to development workflow - Better Protocol definitions for step handlers
- Improved type hints throughout pipeline module
Better Pipeline flow tests
- Comprehensive test coverage for valid and invalid type flows
- Tests for tuple unpacking, subclass compatibility, count mismatches
- Tests for primitive type rejection and edge cases
v0.1.3
Breaking Changes
Self-describing JSON serialization replaces pickle
- Task results now use JSON serialization with embedded type information (similar to pickle)
- Automatically stores fully qualified class name with data for type reconstruction
- No longer requires
TaskDefinitionregistry for result deserialization ax.gather()now works with tasks created viaax.enqueue()without pool context- Migration: Clear Redis or wait for TTL expiry on old pickled results
TaskHandler Protocol enforces BaseModel returns
- Task handlers must return a Pydantic
BaseModelinstance (notNoneor arbitrary objects) - Return type is automatically inferred and validated at registration time
- Enables type-safe result retrieval and automatic serialization
New Features
State backend abstraction
- Introduced
StateBackendProtocol for pluggable state storage implementations - Current Redis implementation moved to
agentexec.state.redis_backend - Backend modules verified against protocol at import time via
cast() - Prepares foundation for alternative backends (in-memory, DynamoDB, etc.)
Improved async patterns
brpop()is now a proper async function (was sync returning coroutine)- Consistent async/await usage across state operations
- Better type hints and IDE support
Enhanced type safety
TaskHandlerProtocol with support for both sync and async handlers- Proper type annotations for all state backend operations
serialize()anddeserialize()type-enforced forBaseModelonly
Documentation
Comprehensive documentation added
- API reference for core modules (activity, pipeline, runner, task)
- Conceptual guides (architecture, task lifecycle, worker pool)
- Deployment guides (Docker, production best practices)
- Usage guides (basic usage, pipelines, FastAPI integration, OpenAI runner)
- Getting started (installation, quickstart, configuration)
- Contributing guide
UI & Tooling
React frontend and component library
- Added
agentexec-uinpm package with reusable React components - Pre-built UI for agent monitoring and activity tracking
- TanStack Query integration for real-time updates
- React Router for navigation between agent list and detail views
Docker deployment
- Docker worker image for containerized deployments
- GitHub Actions for automated Docker image publishing to GitHub Container Registry
- GitHub Actions for automated npm publishing of UI components
Testing
Comprehensive test coverage
- Achieved 89% code coverage
- Added unit tests for all core modules:
- State backend and serialization (
test_state.py,test_state_backend.py) - Self-describing results (
test_self_describing_results.py) - Activity tracking schemas (
test_activity_schemas.py) - Pipeline orchestration (
test_pipeline.py) - Task queue operations (
test_queue.py) - Worker events and logging (
test_worker_event.py,test_worker_logging.py) - Database operations (
test_db.py) - Configuration (
test_config.py)
- State backend and serialization (
Internal Improvements
Redis client refactoring
- Removed
core/redis_client.pyin favor of state backend abstraction - Lazy connection initialization for both async and sync Redis clients
- Proper connection cleanup in
backend.close()
Key formatting consistency
- All state keys use consistent
agentexec:prefix viabackend.format_key() - Results:
agentexec:result:{agent_id} - Events:
agentexec:event:{name}:{id} - Logs channel:
agentexec:logs
Standardized function signatures
get_result()andgather()returnBaseModeldirectly (not JSON strings)- Consistent parameter ordering across state module functions
- Better docstrings with type information
v0.1.2
v0.1.2
New Features
Pipelines
- Multi-step workflow orchestration with
ax.Pipeline - Define steps with
@pipeline.step(order)decorator - Parallel task execution with
ax.gather() - Result retrieval with
ax.get_result()
Worker logging via Redis pubsub
- Workers publish logs to Redis, collected by main process
- Use
pool.run()to see worker logs in real-time
Internal Improvements
Reorganized worker module
- Worker code moved to
agentexec.workersubpackage RedisEventfor cross-process shutdown coordinationget_worker_logger()configures logging and returns logger in one call
Refactored Redis client usage
- Added
get_redis_sync()for synchronous Redis operations - Sync/async Redis clients for different contexts
v0.1.1
v0.1.1
Breaking Changes
Async enqueue() function
ax.enqueue()is now async and must be awaited:task = await ax.enqueue("task_name", MyContext(key="value"))
Type-safe context with Pydantic BaseModel
- Task context must be a Pydantic
BaseModelinstead of a rawdict - Context class is automatically inferred from handler type hints:
class ResearchContext(BaseModel): company: str @pool.task("research") async def research(agent_id: UUID, context: ResearchContext): company = context.company # Type-safe with IDE autocomplete
Redis URL now required
redis_urldefaults toNoneand must be explicitly configured viaREDIS_URL- Prevents accidental connections to wrong Redis instances
New Features
Configurable activity messages
- Activity status messages are configurable via environment variables:
AGENTEXEC_ACTIVITY_MESSAGE_CREATE="Waiting to start." AGENTEXEC_ACTIVITY_MESSAGE_STARTED="Task started." AGENTEXEC_ACTIVITY_MESSAGE_COMPLETE="Task completed successfully." AGENTEXEC_ACTIVITY_MESSAGE_ERROR="Task failed with error: {error}"
Improved Task architecture
Taskis now the primary execution object withexecute()methodTaskDefinitionhandles registration metadata and context class inference- Full lifecycle management (QUEUED → RUNNING → COMPLETE/ERROR) encapsulated in
Task.execute()
Better SQLAlchemy session management
- New
scoped_sessionpattern for worker processes - Proper session cleanup on worker shutdown
Internal Improvements
- Switched to async Redis client (
redis.asyncio) - Consolidated cleanup code in worker
_run()method - Removed unused
debugconfig option