Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 0 additions & 4 deletions python/valuecell/core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,6 @@
from .agent.responses import notification, streaming
from .session import (
InMemorySessionStore,
Message,
Role,
Session,
SessionManager,
SessionStatus,
Expand All @@ -30,8 +28,6 @@

__all__ = [
# Session exports
"Message",
"Role",
"Session",
"SessionStatus",
"SessionManager",
Expand Down
10 changes: 0 additions & 10 deletions python/valuecell/core/agent/connect.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,13 +277,3 @@ def get_agent_card(self, agent_name: str) -> Optional[AgentCard]:
if ctx.local_agent_card:
return ctx.local_agent_card
return None


# Global default instance for backward compatibility and ease of use
_default_remote_connections = RemoteConnections()


# Convenience functions that delegate to the default instance
def get_default_remote_connections() -> RemoteConnections:
"""Get the default RemoteConnections instance"""
return _default_remote_connections
3 changes: 1 addition & 2 deletions python/valuecell/core/coordinate/__init__.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
from .models import ExecutionPlan
from .orchestrator import AgentOrchestrator, get_default_orchestrator
from .orchestrator import AgentOrchestrator
from .planner import ExecutionPlanner


__all__ = [
"AgentOrchestrator",
"get_default_orchestrator",
"ExecutionPlanner",
"ExecutionPlan",
]
25 changes: 9 additions & 16 deletions python/valuecell/core/coordinate/orchestrator.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,19 @@
from typing import AsyncGenerator, Dict, Optional

from a2a.types import TaskArtifactUpdateEvent, TaskState, TaskStatusUpdateEvent
from valuecell.core.agent.connect import get_default_remote_connections
from valuecell.core.agent.connect import RemoteConnections
from valuecell.core.coordinate.response import ResponseFactory
from valuecell.core.coordinate.response_buffer import ResponseBuffer, SaveItem
from valuecell.core.coordinate.response_router import (
RouteResult,
SideEffectKind,
handle_status_update,
)
from valuecell.core.session import SessionStatus, get_default_session_manager
from valuecell.core.task import Task, get_default_task_manager
from valuecell.core.session import SessionManager, SessionStatus, SQLiteMessageStore
from valuecell.core.task import Task, TaskManager
from valuecell.core.task.models import TaskPattern
from valuecell.core.types import BaseResponse, UserInput
from valuecell.utils import resolve_db_path
from valuecell.utils.uuid import generate_thread_id

from .models import ExecutionPlan
Expand Down Expand Up @@ -104,9 +105,11 @@ class AgentOrchestrator:
"""

def __init__(self):
self.session_manager = get_default_session_manager()
self.task_manager = get_default_task_manager()
self.agent_connections = get_default_remote_connections()
self.session_manager = SessionManager(
message_store=SQLiteMessageStore(resolve_db_path())
)
self.task_manager = TaskManager()
self.agent_connections = RemoteConnections()

# Initialize user input management
self.user_input_manager = UserInputManager()
Expand Down Expand Up @@ -605,13 +608,3 @@ async def _persist_items(self, items: list[SaveItem]):
payload=it.payload,
item_id=it.item_id,
)


# ==================== Module-level Factory Function ====================

_orchestrator = AgentOrchestrator()


def get_default_orchestrator() -> AgentOrchestrator:
"""Get the default singleton instance of AgentOrchestrator"""
return _orchestrator
15 changes: 6 additions & 9 deletions python/valuecell/core/session/__init__.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,21 @@
"""Session module initialization"""

from .manager import (
SessionManager,
get_default_session_manager,
)
from valuecell.core.types import ConversationItem as Message, Role
from .manager import SessionManager
from .message_store import InMemoryMessageStore, MessageStore, SQLiteMessageStore
from .models import Session, SessionStatus
from .store import InMemorySessionStore, SessionStore

__all__ = [
# Models
"Message",
"Role",
"Session",
"SessionStatus",
# Session management
"SessionManager",
"get_default_session_manager",
# Session storage
"SessionStore",
"InMemorySessionStore",
# Message storage (re-exported from core.__init__)
# Message storage
"MessageStore",
"InMemoryMessageStore",
"SQLiteMessageStore",
]
28 changes: 1 addition & 27 deletions python/valuecell/core/session/manager.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import os
from datetime import datetime
from typing import List, Optional

Expand All @@ -10,7 +9,7 @@
)
from valuecell.utils import generate_uuid

from .message_store import InMemoryMessageStore, MessageStore, SQLiteMessageStore
from .message_store import InMemoryMessageStore, MessageStore
from .models import Session, SessionStatus
from .store import InMemorySessionStore, SessionStore

Expand Down Expand Up @@ -203,28 +202,3 @@ async def get_sessions_by_status(
user_id, limit * 2, offset
)
return [session for session in all_sessions if session.status == status][:limit]


# Default session manager instance
def _default_db_path() -> str:
"""Resolve repository root and return default DB path valuecell.db.

Layout assumption: this file is at repo_root/python/valuecell/core/session/manager.py
We walk up 4 levels to reach repo_root.
"""
here = os.path.dirname(__file__)
repo_root = os.path.abspath(os.path.join(here, "..", "..", "..", ".."))
return os.path.join(repo_root, "valuecell.db")


def _resolve_db_path() -> str:
return os.environ.get("VALUECELL_SQLITE_DB") or _default_db_path()


# Default: use SQLite at repo root valuecell.db (env VALUECELL_SQLITE_DB overrides)
_session_manager = SessionManager(message_store=SQLiteMessageStore(_resolve_db_path()))


def get_default_session_manager() -> SessionManager:
"""Get the default session manager instance"""
return _session_manager
3 changes: 1 addition & 2 deletions python/valuecell/core/task/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
"""Task module initialization"""

from .manager import TaskManager, get_default_task_manager
from .manager import TaskManager
from .models import Task, TaskStatus, TaskPattern
from .store import InMemoryTaskStore, TaskStore

Expand All @@ -11,5 +11,4 @@
"TaskManager",
"TaskStore",
"InMemoryTaskStore",
"get_default_task_manager",
]
7 changes: 0 additions & 7 deletions python/valuecell/core/task/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,3 @@ async def cancel_agent_tasks(self, agent_name: str) -> int:
cancelled_count += 1

return cancelled_count


_task_manager = TaskManager()


def get_default_task_manager() -> TaskManager:
return _task_manager
3 changes: 0 additions & 3 deletions python/valuecell/server/api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
from ..config.settings import get_settings
from .routers.i18n import create_i18n_router
from .routers.system import create_system_router
from .routers.websocket import create_websocket_router
from .routers.watchlist import create_watchlist_router
from .routers.agent_stream import create_agent_stream_router
from .routers.agent import create_agent_router
Expand Down Expand Up @@ -128,8 +127,6 @@ async def root():
# Include system router
app.include_router(create_system_router())

# Include websocket router
app.include_router(create_websocket_router())
# Include watchlist router
app.include_router(create_watchlist_router())
# Include agent stream router
Expand Down
133 changes: 0 additions & 133 deletions python/valuecell/server/api/routers/websocket.py

This file was deleted.

7 changes: 4 additions & 3 deletions python/valuecell/server/services/agent_stream_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
Agent stream service for handling streaming agent interactions.
"""

import logging
from typing import AsyncGenerator, Optional
from valuecell.core.coordinate.orchestrator import get_default_orchestrator

from valuecell.core.coordinate.orchestrator import AgentOrchestrator
from valuecell.core.types import UserInput, UserInputMetadata
import logging

logger = logging.getLogger(__name__)

Expand All @@ -15,7 +16,7 @@ class AgentStreamService:

def __init__(self):
"""Initialize the agent stream service."""
self.orchestrator = get_default_orchestrator()
self.orchestrator = AgentOrchestrator()
logger.info("Agent stream service initialized")

async def stream_query_agent(
Expand Down
2 changes: 2 additions & 0 deletions python/valuecell/utils/__init__.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
from .path import get_agent_card_path
from .port import get_next_available_port, parse_host_port
from .uuid import generate_uuid
from .db import resolve_db_path

__all__ = [
"get_next_available_port",
"generate_uuid",
"get_agent_card_path",
"parse_host_port",
"resolve_db_path",
]
16 changes: 16 additions & 0 deletions python/valuecell/utils/db.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import os


def default_db_path() -> str:
"""Resolve repository root and return default DB path valuecell.db.

Layout assumption: this file is at repo_root/python/valuecell/utils/db.py
We walk up 3 levels to reach repo_root.
"""
here = os.path.dirname(__file__)
repo_root = os.path.abspath(os.path.join(here, "..", "..", ".."))
return os.path.join(repo_root, "valuecell.db")


def resolve_db_path() -> str:
return os.environ.get("VALUECELL_SQLITE_DB") or default_db_path()