mirror of
https://gitee.com/wanwujie/deer-flow
synced 2026-04-20 04:44:46 +08:00
feat: add AIO sandbox provider and auto title generation (#1)
- Add AioSandboxProvider for Docker-based sandbox execution with configurable container lifecycle, volume mounts, and port management - Add TitleMiddleware to auto-generate thread titles after first user-assistant exchange using LLM - Add Claude Code documentation (CLAUDE.md, AGENTS.md) - Extend SandboxConfig with Docker-specific options (image, port, mounts) - Fix hardcoded mount path to use expanduser - Add agent-sandbox and dotenv dependencies Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
90
backend/tests/test_title_generation.py
Normal file
90
backend/tests/test_title_generation.py
Normal file
@@ -0,0 +1,90 @@
|
||||
"""Tests for automatic thread title generation."""
|
||||
|
||||
import pytest
|
||||
|
||||
from src.agents.middlewares.title_middleware import TitleMiddleware
|
||||
from src.config.title_config import TitleConfig, get_title_config, set_title_config
|
||||
|
||||
|
||||
class TestTitleConfig:
|
||||
"""Tests for TitleConfig."""
|
||||
|
||||
def test_default_config(self):
|
||||
"""Test default configuration values."""
|
||||
config = TitleConfig()
|
||||
assert config.enabled is True
|
||||
assert config.max_words == 6
|
||||
assert config.max_chars == 60
|
||||
assert config.model_name is None
|
||||
|
||||
def test_custom_config(self):
|
||||
"""Test custom configuration."""
|
||||
config = TitleConfig(
|
||||
enabled=False,
|
||||
max_words=10,
|
||||
max_chars=100,
|
||||
model_name="gpt-4",
|
||||
)
|
||||
assert config.enabled is False
|
||||
assert config.max_words == 10
|
||||
assert config.max_chars == 100
|
||||
assert config.model_name == "gpt-4"
|
||||
|
||||
def test_config_validation(self):
|
||||
"""Test configuration validation."""
|
||||
# max_words should be between 1 and 20
|
||||
with pytest.raises(ValueError):
|
||||
TitleConfig(max_words=0)
|
||||
with pytest.raises(ValueError):
|
||||
TitleConfig(max_words=21)
|
||||
|
||||
# max_chars should be between 10 and 200
|
||||
with pytest.raises(ValueError):
|
||||
TitleConfig(max_chars=5)
|
||||
with pytest.raises(ValueError):
|
||||
TitleConfig(max_chars=201)
|
||||
|
||||
def test_get_set_config(self):
|
||||
"""Test global config getter and setter."""
|
||||
original_config = get_title_config()
|
||||
|
||||
# Set new config
|
||||
new_config = TitleConfig(enabled=False, max_words=10)
|
||||
set_title_config(new_config)
|
||||
|
||||
# Verify it was set
|
||||
assert get_title_config().enabled is False
|
||||
assert get_title_config().max_words == 10
|
||||
|
||||
# Restore original config
|
||||
set_title_config(original_config)
|
||||
|
||||
|
||||
class TestTitleMiddleware:
|
||||
"""Tests for TitleMiddleware."""
|
||||
|
||||
def test_middleware_initialization(self):
|
||||
"""Test middleware can be initialized."""
|
||||
middleware = TitleMiddleware()
|
||||
assert middleware is not None
|
||||
assert middleware.state_schema is not None
|
||||
|
||||
# TODO: Add integration tests with mock Runtime
|
||||
# def test_should_generate_title(self):
|
||||
# """Test title generation trigger logic."""
|
||||
# pass
|
||||
|
||||
# def test_generate_title(self):
|
||||
# """Test title generation."""
|
||||
# pass
|
||||
|
||||
# def test_after_agent_hook(self):
|
||||
# """Test after_agent hook."""
|
||||
# pass
|
||||
|
||||
|
||||
# TODO: Add integration tests
|
||||
# - Test with real LangGraph runtime
|
||||
# - Test title persistence with checkpointer
|
||||
# - Test fallback behavior when LLM fails
|
||||
# - Test concurrent title generation
|
||||
Reference in New Issue
Block a user