Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[0.0.43] - 2026-04-30¶
Added¶
- Structured Streaming API (
invoke_model_streaming) (AA-3251): New method onBaseLLMServiceandAWSBedrockServiceproviding a typed streaming interface - Yields structured dicts instead of raw strings:
{"type": "text", "text": "..."}for response content and{"type": "thinking", "thinking": "..."}for reasoning traces -
Enables callers to separately handle visible response text and chain-of-thought reasoning
-
Extended Thinking Support (AA-3251): Full end-to-end support for Bedrock extended thinking (chain-of-thought reasoning before the final answer)
extended_thinking: boolandthinking_budget_tokens: intparameters accepted at theLangGraphAgent.query()call site- Parameters propagated through the full LangGraph stack:
LangGraphAgent→ToolUseWorkflow→ResponseGenerationNode→AWSBedrockService - Automatically enforces Bedrock requirements: sets
temperature=1, removestop_p, applies a minimumbudget_tokensof 1,024 -
Reasoning blocks logged at
DEBUG/INFOlevel as they arrive -
Extended Thinking Examples: Four new runnable examples demonstrating extended thinking workflows
extended_thinking_tdd.py: Talk-to-document agent with extended thinking enabledextended_thinking_tdd_execute.py: Script executor for the aboveextended_thinking_objectives.py: Objective-based agent with extended thinking enabled-
extended_thinking_objectives_execute.py: Script executor for the above -
langgraph_with_simple_tool.py: New example demonstrating LangGraph workflow with a simple tool alongside a structured streaming consumer
Changed¶
invoke_model_stream()enhanced: Now handles Bedrockthinkingcontent blocks in the event stream_yield_structured=Trueflag switches from raw string yield to typed dict yield (used internally byinvoke_model_streaming)-
Backwards-compatible: existing callers that use
invoke_model_stream()without the flag receive unchanged string output -
Streaming completion log: Now reports both response character count and thinking character count for observability
- Before:
Streaming completed. Total length: N -
After:
Streaming completed. response=N chars, thinking=M chars, execution_time=X.XXs -
Example cleanup: Removed nine outdated example scripts that no longer reflected current SDK patterns
draft_mail.py,lang_tool.py,langgraph_ttd.py,langgraph_with_simple_tool copy.py,objctive_agent_troubled_doc.py,objctive_agent_with_tools.py,objective_no_lang.py,objectives.py,objectives_execute.py
Technical Details¶
AWSBedrockService.invoke_model_stream(): Extended thinking path setsbody["thinking"] = {"type": "enabled", "budget_tokens": budget}before the Bedrockinvoke_model_with_response_streamcallAWSBedrockService.invoke_model_streaming(): Thin wrapper that sets_yield_structured=Trueand delegates toinvoke_model_stream()WorkflowConfigmetadata keys added:extended_thinking(defaultFalse),thinking_budget_tokens(default10000)BaseLLMService.invoke_model_streaming()declared as an abstract method — all concrete subclasses must implement it
[0.0.38] - 2026-03-04¶
Changed¶
- Removed all in-memory prompt and agent caching from SDK core and examples
get_system_prompt()now always fetches fresh from DynamoDBDynamoDBPromptConfig.get_prompt_template()no longer caches results- Removed module-level caches from
generator_agent.pyandlanggraph_ttd.py - Fixes stale configuration in Lambda container reuse scenarios
Improved¶
- Consolidated test suite from 1,147 tests to 238 while maintaining 82% coverage
- Adopted Given/When/Then docstring convention for test methods
- Fixed all E501 flake8 violations in test files
[0.0.34] - 2026-03-18¶
Added¶
- Module Embeddings (AS-1593): New
akordi_agents/embeddings/module with pluggable provider architecture EmbeddingProviderInterfaceABC withembed(),embed_single(),get_dimensions()methodsBedrockTitanEmbeddingProviderusing Amazon Titan Text Embeddings V2 with concurrent batchingEmbeddingServicewith provider registry and runtime switching- Pydantic models:
EmbeddingConfig,EmbeddingRequest,EmbeddingResult - API docs (
docs/api/embeddings.md) and usage examples (examples/tools/embedding_example.py) - 37 unit + integration tests covering models, interfaces, provider, service, and agent integration
[0.0.33] - 2026-03-05¶
Changed¶
SearchResponse.answertype (AS-1692): Updatedanswerfield fromstrtoUnion[str, List[Dict[str, Any]]]to support structured data responses
[0.0.31] - 2026-02-25¶
Fixed¶
get_system_prompt()parameter naming (AE-1511): Renamed misleadingagent_codeparameter toprompt_codeinget_system_prompt()for clarity- The function fetches prompt templates, not agent configs — the parameter name now reflects this
- Updated all call sites in
examples/talk_to_document.pyto useprompt_code= -
Fixed 6 failing tests in
TestGetSystemPromptthat used the old keyword argument -
Pricing service bug (AS-1511): Fixed pricing service bug in model pricing lookup
- Resolved incorrect pricing cache behavior
- Updated unit tests to cover the fix
Removed¶
- Dead code cleanup: Removed unused classes and functions from
examples/talk_to_document.py - Removed
ChatAgentLLMServiceclass (was defined but never called) - Removed
create_agent_from_params()function (was defined but never called) - The example now exclusively uses
get_agent()to build agents from DynamoDB config
Enhanced¶
- Documentation: Optimised docs for vectorisation (AS-1511)
-
Improved documentation structure for better searchability and indexing
-
Architecture Presentation: Added 6 new detailed slides to the SDK presentation (
preso/) - Slide 22: Architectural Patterns Overview — 12 design patterns across 4 categories (Creational, Structural, Behavioral, Architectural)
- Slide 23: Layered Architecture Deep Dive — 6 layers with directories, responsibilities, and key classes
- Slide 24: Complete Module & File Map — every module and file with specific class names
- Slide 25: Services & Infrastructure Detail — all 6 service domains with feature breakdown
- Slide 26: Design Patterns in Code — Builder, Factory, Strategy, DI with real SDK code examples
-
Slide 27: Data Flow & Module Dependencies — request flow diagram and dependency rules
-
Security policy (FS-1155): Added security policy tests
Technical Details¶
akordi_agents/utils/agent.py:get_system_prompt(prompt_code=, user_persona=)— renamed parameter- Total: 1114 tests passing, 81.03% overall coverage
- Presentation expanded from 22 to 28 slides
[0.0.30] - 2026-02-18¶
Added¶
- Agent Utilities Module: New
akordi_agents/utils/agent.pywith reusable functions get_system_prompt(): Fetch system prompt templates from DynamoDB with cachingget_agent_by_code(): Retrieve active agent configurations from AKORDI_AGENT_TABLEget_agent(): Build CustomAgent from DynamoDB agent records-
_create_default_llm_service(): Helper for creating AWSBedrockService-backed LLM services -
LangGraphAgent Token Tracking: Added token usage tracking to LangGraphAgent
_get_token_service(): Lazy initialization of TokenUsageService_track_token_usage(): Track token usage from workflow responses_skip_token_trackingflag propagation through workflow metadata- Prevents double-tracking when AWSBedrockService is used internally
Enhanced¶
- Test Coverage: Improved from 77.72% to 81.03%
- Added 46 new tests across multiple modules
- New test file:
tests/test_agent_utils.pywith 22 tests - Added 12 tests to
tests/test_agent_builder.py -
Added 12 tests to
tests/test_model_service.pyfor pricing methods -
Model Service: Added tests for pricing cache and model pricing lookup
_load_pricing_cache(): Load and cache model pricing from DynamoDBget_model_pricing(): Look up input/output token pricing by model ARN_extract_pricing(): Extract pricing from DynamoDB model records
Fixed¶
- Module Import Performance: Fixed module-level AWS client initialization in
llm_service.py - Changed
_llm_service = LLMServiceFactory.create_service()to lazy initialization - Added
_get_default_llm_service()function for on-demand service creation -
Prevents AWS client creation at import time
-
Test Execution: Resolved test collection errors caused by AWS credential requirements
- Tests no longer require valid AWS credentials during import
Technical Details¶
akordi_agents/utils/agent.py: 88 statements, 100% test coverageakordi_agents/services/model_service.py: 98.45% test coverage (up from 70.47%)akordi_agents/core/agent_builder.py: 48.72% test coverage (up from 45.09%)- Total: 1114 tests passing, 81.03% overall coverage
[0.0.28] - 2026-02-16¶
Added¶
- Configurable Context Results Limit (AS-1639): New
context_results_limitparameter inClientParams - Controls how many search results are included in the LLM context
- Default value of 50 (previously hardcoded to 3)
- Allows fine-tuning the balance between context comprehensiveness and token usage
- Separate from
max_resultswhich controls knowledge base retrieval count
Enhanced¶
- Search Handler: Updated
prepare_context()method to accept configurable limit - Method signature:
prepare_context(search_results, context_results_limit=50) -
Improved logging to show actual number of results used in context
-
Documentation: Comprehensive updates across multiple documentation files
- Added
context_results_limitparameter todocs/getting-started/configuration.md - Updated RAG examples in
docs/examples/rag-document-qa.md - Enhanced
akordi_agents/handlers/README.mdwith ClientParams configuration section - Added explanation of
max_resultsvscontext_results_limitdistinction
Fixed¶
- WebSocketLogger Recursion Error: Fixed infinite recursion in demo backend logging
- Added recursion guard (
_emittingflag) to prevent re-entry during log emission - Implemented message filtering to skip self-referential log messages
- Fixed
asyncio.create_task()usage in synchronous context - Replaced error logging with silent error handling to prevent recursion cascade
Technical Details¶
ClientParams.context_results_limit: Optional[int] = 50- The parameter is passed through
query_vector_store()toprepare_context() - Test coverage added for new parameter in
test_search_handler.pyandtest_general.py
[0.0.21] - 2026-01-14¶
Fixed¶
- LLMResponse Validation Error: Fixed Pydantic validation error where
usage.cache_creationexpected an integer but received a dictionary -
Changed
usage: Dict[str, int]tousage: Dict[str, Any]inLLMResponsemodel to accommodate nested cache token structures -
Knowledge Base Search Results: Fixed issue where KB search was not returning document content
- Corrected S3 URI construction in
search_handler.py- Bedrock stores URIs without URL encoding - Fixed
{context}placeholder replacement in system prompts withinllm_service.py - Added
{messages}placeholder handling for chat history injection -
Added clear header
[DOCUMENT CONTENT RETRIEVED: X relevant excerpts]to injected KB content -
Empty search_results in Response: Fixed propagation of
search_resultsthrough the response chain - Added
search_results: List[Any] = []field toLLMResponsemodel - Updated
invoke_modelto include formattedknowledge_base_resultsin response -
Fixed
search_resultsextraction inagent_builder.pyand example scripts -
Stale Chat History: Fixed issue where scripts were using old chat history from DynamoDB
-
Changed default
chat_idanduser_idto empty strings to prevent fetching stale history -
Duplicate enable_prompt_caching Argument: Fixed multiple values error in several example scripts
-
Added
enable_prompt_cachingto excluded keys intalk_to_document.py,simple_tool.py,lang_tool.py, andagent_to_agent_flow.py -
Linting Errors: Fixed F541 and E501 errors across example scripts
- Removed unnecessary f-string prefixes where no placeholders were used
-
Split long S3 path strings into multi-line format using implicit concatenation
-
Claude 3.7+ Model Support (AS-1261): Fixed exclusive parameter selection for Claude 3.7+ models
- Enhanced parameter handling in
llm_service.pyto correctly manage model-specific features -
Improved compatibility with latest Claude model versions
-
Prompt Caching Support (AS-1261): Fixed system prompt caching for models that support it
- Implemented proper caching logic for compatible Claude models
- Optimized token usage through intelligent prompt caching
Enhanced¶
- Non-LangGraph Agent Examples: Refactored example scripts to demonstrate direct agent building without LangGraph
talk_to_document.py: UsesCustomAgentwith direct KB search viaChatAgentLLMServicesimple_tool.py: Implements manual tool orchestration loop withSimpleToolLLMService-
Added accumulated token tracking across multiple LLM calls in tool loops
-
Performance Optimizations: Improved execution time for document interaction scripts
- Implemented caching for system prompts, LLM service instances, and agent objects
- Reduced DynamoDB calls by limiting chat history fetch to last 10 messages
-
Added
skip_saveflag to conditionally skip DynamoDB save operations -
Response Metadata: Enhanced response structure with comprehensive metadata
- Added
metadataobject containing query, knowledge_base details, config, and workflow info -
Included
workflow.type("direct" or "langgraph") andagent_typein responses -
Model ID Propagation (AS-1261): Enhanced model_id passing through the SDK
- Updated
search_handler.py,types.py, andllm_service.pyfor consistent model tracking - Improved model identification across the agent workflow
Changed¶
- Test Configuration (AS-1261): Updated pytest configuration for async test support
- Added
pytest-asyncio>=0.21.0dependency - Configured asyncio marker in pytest settings
- Updated
pyproject.tomlandpoetry.lockfor async test compatibility
Added¶
- LangGraph Talk-to-Document Example: New
langgraph_ttd.pyexample demonstrating LangGraph-based document interaction - Full LangGraph workflow with validation, search, and response generation nodes
-
Configurable workflow options for tools, tracing, and validation
-
LLM Service Test Coverage (AS-1261): Added comprehensive test suite for Claude 3.7+ features
- 17 new tests covering exclusive sampling parameters and prompt caching logic
- Validates Claude 3.7+ exclusive temperature/top_p handling
- Tests prompt caching for models 3.5+ with intelligent enabling/disabling
- Improved llm_service.py coverage from 59% to 64%
- Automatic Token Usage Tracking: Comprehensive token consumption monitoring for all agents
- Agent-level aggregated statistics (total tokens, LLM calls, model, status)
- Per-query token usage tracking with detailed metadata
- Automatic tracking without code changes - just configure environment
- DynamoDB storage with atomic updates for statistics
- New
TokenUsageServicefor querying and managing token data - Data models:
AgentTokenUsageandQueryTokenUsage - Integration in both
CustomAgentandLangGraphAgent - Cost tracking field (set to $0.00 as per requirements)
-
Query metadata: user_id, chat_id, query_text, tools_used, success/error status
-
Token Usage Tools and Examples:
create_token_usage_table.py: DynamoDB table creation scripttoken_usage_tracking_example.py: Complete working exampleTOKEN_USAGE_TRACKING.md: Comprehensive documentation with use cases- Updated README.md with token tracking quick start guide
Enhanced¶
- Agent Builder: Added
_track_token_usage()method to both agent classes - Automatic initialization of agent usage statistics
- Per-query recording with aggregated updates
- Non-blocking error handling - tracking failures don't affect agent responses
- Graceful degradation when tracking is disabled
[0.0.20] - 2025-11-19¶
Added¶
- Comprehensive Test Suite Overhaul: Complete conversion from unittest to pytest framework
- Migrated all 58 tests to use pytest with proper fixtures and assertions
- Enhanced test mocking with pytest-mock for better isolation
-
Improved test discoverability and execution speed
-
Bedrock Guardrail Test Coverage: Extensive unit test coverage for AWS Bedrock Guardrail functionality
- 20 comprehensive tests covering all guardrail creation, versioning, and configuration scenarios
- Regional PII configuration testing (US, UK, Australia, Canada)
- Parameter validation and error handling tests
-
Function call verification and return type validation
-
Interactive Web Demo: Complete web interface for agent-to-agent orchestration visualization
- FastAPI backend server with WebSocket real-time streaming
- React frontend with TypeScript for live agent execution monitoring
- Dynamic agent selection visualization based on LLM analysis
- Real-time progress tracking and status updates
- Automated startup script for both backend and frontend servers
Enhanced¶
- Test Framework: Upgraded from unittest to pytest with modern testing patterns
- Better fixture management and test organization
- Improved error reporting and debugging capabilities
-
Enhanced test parallelization support
-
Test Mocking Strategy: Implemented proper dependency isolation
- Module-level mocking for external dependencies (boto3, pydantic, etc.)
- Clean separation between unit tests and integration tests
-
Reduced test flakiness and improved reliability
-
CI/CD Integration: Enhanced test execution in Poetry environment
- All tests now run via
poetry run pytest - Improved test configuration for automated pipelines
- Better test output formatting and reporting
Fixed¶
- Test Execution Issues: Resolved all 58 test failures across three test modules
- Fixed boto3 client mocking conflicts in bedrock guardrail tests
- Corrected AWS configuration parameter assertions in provider config tests
- Updated exception handling expectations in service tests
-
Resolved import path issues and module isolation problems
-
Mocking Conflicts: Eliminated complex module-level mocking that caused test instability
- Implemented clean test isolation using pytest fixtures
- Fixed logger assertion issues with multiple call scenarios
-
Corrected AWS client parameter matching in integration tests
-
CI/CD Pipeline Dependency Issue: Fixed pytest-mock fixture not available in GitLab pipelines
- Moved pytest-mock from test group to main dependencies to ensure availability in all environments
- Resolved "fixture 'mocker' not found" errors in CI pipelines while maintaining local functionality
Technical Details¶
- Test suite now uses pytest fixtures instead of unittest setUp/tearDown methods
- Enhanced mocking with pytest-mock for better control over external dependencies
- All tests pass in isolated environments with proper dependency injection
- Improved test execution time from ~30s to ~0.17s for 58 tests
- Comprehensive coverage of bedrock guardrail API interactions and error scenarios
Changed¶
- Test Structure: Complete migration from unittest.TestCase to pytest classes
- Replaced
self.assertEqual()withassertstatements - Updated exception testing from
assertRaisestopytest.raises - Modernized test organization with descriptive test method names
[0.0.18] - 2025-10-30¶
Added¶
- LangGraph Integration: Complete LangGraph workflow orchestration system
- Advanced state management with typed
AgentState - Conditional routing and dynamic workflow execution
- Multi-agent coordination capabilities
- Streaming response support foundation
-
Enhanced observability with LangSmith tracing
-
LangGraph Core Components:
AgentState: Comprehensive state management for complex workflowsWorkflowConfig: Configurable workflow behavior and parametersBaseAgentWorkflow: Extensible base class for custom workflowsToolUseWorkflow: Intelligent tool selection and execution-
MultiAgentWorkflow: Multi-agent coordination system -
LangGraph Nodes: Modular workflow components
ValidationNode: Input validation with error handlingSearchNode: Knowledge base search integrationToolDecisionNode: AI-powered tool usage decisionsToolExecutionNode: Safe tool execution with error recoveryResponseGenerationNode: Context-aware response generationCoordinatorNode: Multi-agent coordination logic-
AggregationNode: Result aggregation from multiple agents -
LangGraph-Enhanced Examples:
langgraph_enhanced_agent.py: Comprehensive demonstration of LangGraph capabilities- Multi-step reasoning workflows with tool integration
- Conditional branching based on validation and tool decisions
- Real-time weather data integration with risk assessment
Enhanced¶
- Dependencies: Added
langgraph>=0.2.0andlangchain-core>=0.3.0 - Documentation: Updated README.md and examples/README.md with LangGraph usage
- Architecture: Enhanced agent builder to support LangGraph workflows
- Tool Framework: Improved integration with LangGraph state management
Technical Details¶
- LangGraph workflows support complex agent interactions with state persistence
- Conditional edges enable dynamic routing based on validation results and tool decisions
- Tool execution includes comprehensive error handling and recovery
- Multi-agent coordination allows specialized agents to collaborate on complex tasks
- Enhanced logging and tracing for workflow observability
- Streaming support foundation for real-time response generation
[0.0.17] - 2025-10-27¶
Added¶
- WeatherTool Integration: New
WeatherToolclass inakordi_agents.toolsthat integrates with WeatherAPI.com - Real-time weather data fetching for any city worldwide
- Defaults to Auckland, New Zealand when no city specified
- Comprehensive weather information including temperature, humidity, wind, pressure, UV index
- Intelligent query detection in RiskDescribeService for conditional tool usage
- Weather queries automatically use WeatherTool, risk queries use LLM
- Proper error handling and user-friendly formatted responses
-
Example implementation in
examples/tool_simple.pywith integrated agent -
HTTP Client Dependency: Added
requests>=2.25.0dependency for external API integrations
Enhanced¶
- Tool Framework: Improved
Toolabstract base class with better documentation - Example Documentation: Updated
examples/README.mdwith WeatherAPI setup instructions - Environment Configuration: Added WEATHER_API_KEY requirement documentation
Technical Details¶
- WeatherTool uses WeatherAPI.com v1 current weather endpoint
- Supports both Celsius and Fahrenheit temperature display
- Includes wind speed in both km/h and mph
- Provides formatted markdown responses for better readability
- 10-second timeout for API requests with comprehensive error handling
Removed¶
- Unused Abstract Methods: Removed
get_supported_models()andis_model_supported()abstract methods fromBaseLLMServiceinterface - These methods were raising
NotImplementedErrorinAWSBedrockServiceand were not being used - Removed corresponding
_supported_modelsattribute initialization - Cleaned up model support logic that was not implemented
Fixed¶
- Test Suite Improvements: Fixed pytest execution issues
- Removed complex module-level mocking in
conftest.pythat was causing test failures - Simplified test configuration for better maintainability
- All 133 tests now pass successfully
- Fixed import path for
ConfigManagerin test fixtures
Changed¶
- Test Coverage: Updated test suite to reflect removed methods
- Removed tests for
get_supported_models()andis_model_supported() - Updated
test_model_support_completeness()to validate service initialization instead - Removed assertions checking for
_supported_modelsattribute
Technical Details¶
- Simplified
AWSBedrockService.__init__()by removing unused model list initialization - Cleaned up abstract base class to only include actively used methods
- Improved test configuration maintainability by removing mock complexity
[0.0.15] - 2025-09-19¶
Added¶
- Initial Release: Complete Akordi Agents SDK framework
- Core Agent Framework: Comprehensive agent building capabilities with modular architecture
- LLM Integration: Support for multiple LLM providers with configurable services
- Chat History Management: Full chat history persistence using DynamoDB
- Knowledge Base Search: Advanced search handlers for document and content retrieval
- Command-Line Interface (CLI): Interactive chat interface with multiple modes
- Interactive chat with persistent history
- Single query mode for quick questions
- Knowledge base enhanced responses
- Configuration management interface
- Configuration Management: Flexible prompt and LLM provider configuration
- DynamoDB-based prompt configuration
- Environment-based provider settings
- Langsmith integration for monitoring
- Type Safety: Comprehensive Pydantic models for all data structures
- Validation Utilities: Robust input validation and error handling
- Logging System: Configurable logging with multiple output formats
- Response Processing: Advanced response formatting and streaming capabilities
- Development Tools: Complete development environment setup
- Poetry-based dependency management
- Comprehensive test suite with pytest
- Code quality tools (black, isort, flake8, mypy)
- Pre-commit hooks and CI/CD support
Features¶
- Agent Builder: Modular agent construction with pluggable components
- Multi-Provider LLM Support: AWS Bedrock, OpenAI, and custom provider integration
- Persistent Chat Sessions: DynamoDB-backed conversation history
- Document Search Integration: Knowledge base queries with relevance scoring
- Interactive CLI: Rich command-line interface with auto-completion
- Configuration Flexibility: Environment-based and file-based configuration
- Error Handling: Comprehensive error handling and recovery mechanisms
- Async Support: Asynchronous operations for improved performance
- Streaming Responses: Real-time response streaming for better user experience
Development¶
- Testing Framework: Extensive unit and integration test coverage
- Documentation: Comprehensive README with installation and usage guides
- Example Scripts: Working examples for common use cases
- CI/CD Pipeline: Automated testing and deployment workflows
- Code Quality: Linting, formatting, and type checking integration
Dependencies¶
- Core Dependencies:
boto3>=1.34.0- AWS SDK for DynamoDB and Bedrock integrationpython-dotenv>=1.0.0- Environment variable managementlangsmith>=0.1.0- LLM monitoring and tracingpydantic>=2.0.0- Data validation and type safety- Development Dependencies:
pytest>=7.0.0- Testing frameworkblack>=23.0.0- Code formattingisort>=5.12.0- Import sortingflake8>=6.0.0- Lintingmypy>=1.0.0- Type checking
Installation¶
- PyPI Package:
pip install akordi-agents - Development Mode:
pip install -e . - Poetry Support: Full Poetry integration with dependency management
- CLI Installation: Automatic CLI script installation (
akordi-cli)
Documentation¶
- Complete installation guide for multiple environments
- CLI usage documentation with examples
- API reference and integration examples
- Troubleshooting guides for common issues
- Development workflow documentation
Types of Changes¶
Addedfor new featuresChangedfor changes in existing functionalityDeprecatedfor soon-to-be removed featuresRemovedfor now removed featuresFixedfor any bug fixesSecurityin case of vulnerabilities
Contributing¶
This project follows semantic versioning. For major changes, please open an issue first to discuss what you would like to change.
For older changes, please refer to the git commit history.