refactor(core): decouple actors and remove workflow templates (#67)

Removes the deprecated `workflow_template` concept entirely across both backend API routers, internal logic handling within the `supervisory_node` and `consciousness_node`, and front-end components. Enables `consciousness_node` to work autonomously.

Also refactors core package structure to enforce the "one python package, one Ray Actor" architectural rule. `GlobalWorkflowManager`, `WorkflowRunningEngine`, `PostgresDatabase`, and `WorkerCluster` have been moved to their own top-level decoupled package directories with properly exported `__init__.py` modules. Test suites have been relocated and import paths updated across the system.

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: zhaoxi826 <198742034+zhaoxi826@users.noreply.github.com>
This commit is contained in:
2026-05-06 15:05:47 +08:00
committed by GitHub
parent b3ea4cd8d9
commit 209ba45477
97 changed files with 1872 additions and 1498 deletions
@@ -5,34 +5,42 @@ from pydantic import ValidationError
from pretor.utils.error import UserNotExistError
from pretor.core.database.database_exception import database_exception
@database_exception
async def success_func():
return "success"
@database_exception
async def validation_error_func():
raise ValidationError.from_exception_data(title="Mock", line_errors=[])
@database_exception
async def integrity_error_func():
raise IntegrityError("mock_statement", "mock_params", "mock_orig")
@database_exception
async def operational_error_func():
raise OperationalError("mock_statement", "mock_params", "mock_orig")
@database_exception
async def user_not_exist_error_func():
raise UserNotExistError("mock user")
@database_exception
async def exception_func():
raise Exception("mock generic exception")
@pytest.mark.asyncio
async def test_success_func():
assert await success_func() == "success"
@pytest.mark.asyncio
@patch("pretor.core.database.database_exception.logger")
async def test_validation_error(mock_logger):
@@ -41,6 +49,7 @@ async def test_validation_error(mock_logger):
mock_logger.error.assert_called_once()
assert "对象校验失败" in mock_logger.error.call_args[0][0]
@pytest.mark.asyncio
@patch("pretor.core.database.database_exception.logger")
async def test_integrity_error(mock_logger):
@@ -49,6 +58,7 @@ async def test_integrity_error(mock_logger):
mock_logger.error.assert_called_once()
assert "数据库完整性错误" in mock_logger.error.call_args[0][0]
@pytest.mark.asyncio
@patch("pretor.core.database.database_exception.logger")
async def test_operational_error(mock_logger):
@@ -57,6 +67,7 @@ async def test_operational_error(mock_logger):
mock_logger.error.assert_called_once()
assert "数据库连接异常" in mock_logger.error.call_args[0][0]
@pytest.mark.asyncio
@patch("pretor.core.database.database_exception.logger")
async def test_user_not_exist_error(mock_logger):
@@ -65,6 +76,7 @@ async def test_user_not_exist_error(mock_logger):
mock_logger.error.assert_called_once()
assert "更改密码失败,用户不存在" in mock_logger.error.call_args[0][0]
@pytest.mark.asyncio
@patch("pretor.core.database.database_exception.logger")
async def test_generic_exception(mock_logger):
+10
View File
@@ -26,6 +26,7 @@ def mock_session_maker():
async def test_add_user(mock_session_maker, mock_dependencies):
mock_user_cls, _ = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
@@ -51,6 +52,7 @@ async def test_add_user(mock_session_maker, mock_dependencies):
async def test_change_password_success(mock_session_maker, mock_dependencies):
mock_user_cls, mock_select = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
@@ -79,6 +81,7 @@ async def test_change_password_success(mock_session_maker, mock_dependencies):
async def test_change_password_user_not_exist(mock_session_maker, mock_dependencies):
mock_user_cls, mock_select = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
@@ -94,10 +97,12 @@ async def test_change_password_user_not_exist(mock_session_maker, mock_dependenc
async def test_change_password_wrong_password(mock_session_maker, mock_dependencies):
mock_user_cls, mock_select = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
from pretor.utils.access import Accessor
mock_user = MagicMock()
mock_user.hashed_password = Accessor.hash_password("actual_password")
mock_exec_result = MagicMock()
@@ -105,6 +110,7 @@ async def test_change_password_wrong_password(mock_session_maker, mock_dependenc
session.execute = AsyncMock(return_value=mock_exec_result)
from pretor.utils.error import UserPasswordError
with pytest.raises(UserPasswordError):
await db.change_password("testuser", "old_password", "new_password")
@@ -113,6 +119,7 @@ async def test_change_password_wrong_password(mock_session_maker, mock_dependenc
async def test_delete_user_success(mock_session_maker, mock_dependencies):
mock_user_cls, mock_select = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
@@ -134,6 +141,7 @@ async def test_delete_user_success(mock_session_maker, mock_dependencies):
async def test_delete_user_not_exist(mock_session_maker, mock_dependencies):
mock_user_cls, mock_select = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
@@ -149,6 +157,7 @@ async def test_delete_user_not_exist(mock_session_maker, mock_dependencies):
async def test_login_user_success(mock_session_maker, mock_dependencies):
mock_user_cls, mock_select = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
@@ -169,6 +178,7 @@ async def test_login_user_success(mock_session_maker, mock_dependencies):
async def test_login_user_not_exist(mock_session_maker, mock_dependencies):
mock_user_cls, mock_select = mock_dependencies
from pretor.core.database.module.user import AuthDatabase
maker, session = mock_session_maker
db = AuthDatabase(maker)
-78
View File
@@ -1,78 +0,0 @@
import pytest
from unittest.mock import patch, MagicMock
import sys
import builtins
real_import = builtins.__import__
def mock_import(name, globals=None, locals=None, fromlist=(), level=0):
if name == 'ray':
mock_ray = MagicMock()
def mock_remote(*args, **kwargs):
if len(args) == 1 and callable(args[0]):
return args[0]
def decorator(cls):
return cls
return decorator
mock_ray.remote = mock_remote
return mock_ray
return real_import(name, globals, locals, fromlist, level)
builtins.__import__ = mock_import
for mod in list(sys.modules.keys()):
if 'pretor.core.database.postgres' in mod or 'ray' in mod:
del sys.modules[mod]
from pretor.core.database.postgres import PostgresDatabase
builtins.__import__ = real_import
@patch("pretor.core.database.postgres.create_async_engine")
@patch("pretor.core.database.postgres.sessionmaker")
@patch("pretor.core.database.postgres.AuthDatabase")
@patch("pretor.core.database.postgres.ProviderDatabase")
@patch("pretor.core.database.postgres.os.environ.get")
@pytest.mark.asyncio
async def test_postgres_database(mock_env_get, mock_provider_db, mock_auth_db, mock_sessionmaker, mock_create_engine):
def env_side_effect(key):
return {
"POSTGRES_USER": "testuser",
"POSTGRES_PASSWORD": "testpassword",
"POSTGRES_HOST": "localhost",
"POSTGRES_PORT": "5432",
"POSTGRES_DB": "testdb"
}.get(key)
mock_env_get.side_effect = env_side_effect
mock_engine = MagicMock()
mock_conn = MagicMock()
from unittest.mock import AsyncMock
mock_conn.run_sync = AsyncMock()
mock_begin_ctx = MagicMock()
mock_begin_ctx.__aenter__ = AsyncMock(return_value=mock_conn)
mock_begin_ctx.__aexit__ = AsyncMock()
mock_engine.begin.return_value = mock_begin_ctx
mock_create_engine.return_value = mock_engine
db = PostgresDatabase()
mock_create_engine.assert_called_once_with(
"postgresql+asyncpg://testuser:testpassword@localhost:5432/testdb",
echo=True
)
mock_auth_db.assert_called_once()
mock_provider_db.assert_called_once()
mock_auth_db.return_value.get_user_authority = AsyncMock(return_value="test_auth")
with patch("pretor.core.database.postgres.SQLModel.metadata.create_all") as mock_create_all:
await db.init_db()
mock_conn.run_sync.assert_called_once_with(mock_create_all)
assert await db.get_user_authority(user_id="123") == "test_auth"
@@ -1,5 +1,6 @@
from pretor.core.database.table.provider import Provider
def test_provider_table():
# Provide required fields
provider = Provider(
@@ -8,7 +9,7 @@ def test_provider_table():
provider_apikey="key",
provider_models=["model_1"],
provider_type="type",
provider_owner=1
provider_owner=1,
)
assert Provider.__tablename__ == 'provider'
assert Provider.__tablename__ == "provider"
assert provider.provider_title == "title"
+2 -1
View File
@@ -1,6 +1,7 @@
from pretor.core.database.table.user import User
def test_user_table():
user = User(user_id="id", user_name="name", hashed_password="pw")
assert User.__tablename__ == 'user'
assert User.__tablename__ == "user"
assert user.user_name == "name"