From 29ce80091d1d9b0b0d7047a25a78d9983739d9bb Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Fri, 26 Sep 2025 10:41:05 +0800 Subject: [PATCH 1/7] feat: update GitHub Actions workflow for Python checks and add style dependencies --- .github/workflows/python.yml | 29 ++++++++++++++++++++++++----- python/pyproject.toml | 16 ++++++++++++++++ python/uv.lock | 19 +++++++++++++++++++ 3 files changed, 59 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 3d55aaf74..58ef09185 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -1,4 +1,4 @@ -name: Python Linting & Unit Tests +name: Python Checks permissions: contents: read @@ -21,17 +21,36 @@ jobs: working-directory: ./python steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Install Ruff uses: astral-sh/ruff-action@v3 - - name: Ruff Format - run: ruff format --check --config ./pyproject.toml . - - name: Ruff Lint run: ruff check --config ./pyproject.toml . + style: + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./python + steps: + - uses: actions/checkout@v5 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version-file: "./python/pyproject.toml" + + - name: Install uv + uses: astral-sh/setup-uv@v6 + + - name: Install style dependencies + run: uv sync --locked --only-group style + + - name: Run style checks + run: uv run isort --check-only ./valuecell + unit_test: runs-on: ubuntu-latest defaults: diff --git a/python/pyproject.toml b/python/pyproject.toml index 72213c125..b2152bdd6 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -37,11 +37,16 @@ dev = [ [dependency-groups] dev = [ {include-group = "lint"}, + {include-group = "style"}, {include-group = "test"} ] lint = [ "ruff" ] +style = [ + "ruff", + "isort", +] test = [ "pytest>=7.4.0", "pytest-cov>=4.1.0", @@ -95,3 +100,14 @@ norecursedirs = [ "examples", "docs", ] + +[tool.isort] +profile = "black" +skip_glob = [ + "third_party/**", + "**/third_party/**", + "tests/**", + "**/tests/**", + "docs/**", + "**/docs/**", +] diff --git a/python/uv.lock b/python/uv.lock index d7ac00e44..c99006daa 100644 --- a/python/uv.lock +++ b/python/uv.lock @@ -841,6 +841,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] +[[package]] +name = "isort" +version = "6.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b8/21/1e2a441f74a653a144224d7d21afe8f4169e6c7c20bb13aec3a2dc3815e0/isort-6.0.1.tar.gz", hash = "sha256:1cb5df28dfbc742e490c5e41bad6da41b805b0a8be7bc93cd0fb2a8a890ac450", size = 821955, upload-time = "2025-02-26T21:13:16.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/11/114d0a5f4dabbdcedc1125dee0888514c3c3b16d3e9facad87ed96fad97c/isort-6.0.1-py3-none-any.whl", hash = "sha256:2dc5d7f65c9678d94c88dfc29161a320eec67328bc97aad576874cb4be1e9615", size = 94186, upload-time = "2025-02-26T21:13:14.911Z" }, +] + [[package]] name = "jinja2" version = "3.1.6" @@ -2156,6 +2165,7 @@ dev = [ [package.dev-dependencies] dev = [ { name = "diff-cover" }, + { name = "isort" }, { name = "pytest" }, { name = "pytest-asyncio" }, { name = "pytest-cov" }, @@ -2164,6 +2174,10 @@ dev = [ lint = [ { name = "ruff" }, ] +style = [ + { name = "isort" }, + { name = "ruff" }, +] test = [ { name = "diff-cover" }, { name = "pytest" }, @@ -2198,12 +2212,17 @@ provides-extras = ["dev"] [package.metadata.requires-dev] dev = [ { name = "diff-cover", specifier = ">=9.0.0" }, + { name = "isort" }, { name = "pytest", specifier = ">=7.4.0" }, { name = "pytest-asyncio", specifier = ">=1.0.0" }, { name = "pytest-cov", specifier = ">=4.1.0" }, { name = "ruff" }, ] lint = [{ name = "ruff" }] +style = [ + { name = "isort" }, + { name = "ruff" }, +] test = [ { name = "diff-cover", specifier = ">=9.0.0" }, { name = "pytest", specifier = ">=7.4.0" }, From 8a9b685aac6f6c85676f29971c13a97eb1697711 Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Fri, 26 Sep 2025 10:49:41 +0800 Subject: [PATCH 2/7] fix: update style check command to include no-default-groups option --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 58ef09185..aeffb59c2 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -49,7 +49,7 @@ jobs: run: uv sync --locked --only-group style - name: Run style checks - run: uv run isort --check-only ./valuecell + run: uv run --no-default-groups isort --check-only ./valuecell unit_test: runs-on: ubuntu-latest From fa4129a821fe4bb50ee0d5dfe1b2f7ddb20c6208 Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Fri, 26 Sep 2025 10:55:00 +0800 Subject: [PATCH 3/7] fix: update style check command to include no-project option --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index aeffb59c2..b4aa9e646 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -49,7 +49,7 @@ jobs: run: uv sync --locked --only-group style - name: Run style checks - run: uv run --no-default-groups isort --check-only ./valuecell + run: uv run --no-project --no-default-groups isort --check-only ./valuecell unit_test: runs-on: ubuntu-latest From 83ceb2601cef848fa92115f7d0ca8ea23ebc0ab2 Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Fri, 26 Sep 2025 10:56:09 +0800 Subject: [PATCH 4/7] fix: remove redundant no-default-groups option from style checks --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index b4aa9e646..b24024731 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -49,7 +49,7 @@ jobs: run: uv sync --locked --only-group style - name: Run style checks - run: uv run --no-project --no-default-groups isort --check-only ./valuecell + run: uv run --no-project isort --check-only ./valuecell unit_test: runs-on: ubuntu-latest From d2ffe86b65b0daa8a1fc37500f1b0a5dc105e6a1 Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Fri, 26 Sep 2025 10:57:43 +0800 Subject: [PATCH 5/7] style: apply isort --- python/valuecell/adapters/assets/__init__.py | 57 ++++++++--------- .../adapters/assets/akshare_adapter.py | 15 ++--- python/valuecell/adapters/assets/base.py | 8 +-- .../adapters/assets/coinmarketcap_adapter.py | 13 ++-- .../adapters/assets/finnhub_adapter.py | 13 ++-- .../adapters/assets/i18n_integration.py | 5 +- python/valuecell/adapters/assets/manager.py | 18 +++--- .../adapters/assets/tushare_adapter.py | 10 +-- python/valuecell/adapters/assets/types.py | 5 +- .../adapters/assets/yfinance_adapter.py | 8 +-- python/valuecell/agents/sec_agent.py | 1 + python/valuecell/core/__init__.py | 2 +- python/valuecell/core/agent/card.py | 1 + python/valuecell/core/agent/client.py | 1 + python/valuecell/core/agent/connect.py | 1 + python/valuecell/core/agent/decorator.py | 4 +- .../valuecell/core/conversation/__init__.py | 4 +- .../valuecell/core/conversation/item_store.py | 1 + python/valuecell/core/conversation/manager.py | 2 +- python/valuecell/core/coordinate/__init__.py | 1 - python/valuecell/core/coordinate/models.py | 1 + .../valuecell/core/coordinate/orchestrator.py | 1 + python/valuecell/core/coordinate/planner.py | 1 + python/valuecell/core/coordinate/response.py | 1 + .../core/coordinate/response_buffer.py | 1 + .../core/coordinate/response_router.py | 1 + python/valuecell/core/types.py | 1 + python/valuecell/server/api/app.py | 17 ++--- python/valuecell/server/api/exceptions.py | 5 +- python/valuecell/server/api/i18n_api.py | 62 +++++++++---------- .../valuecell/server/api/routers/__init__.py | 2 +- python/valuecell/server/api/routers/agent.py | 7 ++- .../server/api/routers/agent_stream.py | 4 +- python/valuecell/server/api/routers/i18n.py | 1 + python/valuecell/server/api/routers/system.py | 3 +- .../valuecell/server/api/routers/watchlist.py | 27 ++++---- .../valuecell/server/api/schemas/__init__.py | 46 +++++++------- python/valuecell/server/api/schemas/agent.py | 6 +- python/valuecell/server/api/schemas/base.py | 3 +- python/valuecell/server/api/schemas/i18n.py | 3 +- .../valuecell/server/api/schemas/watchlist.py | 3 +- python/valuecell/server/config/i18n.py | 15 ++--- python/valuecell/server/config/settings.py | 2 +- python/valuecell/server/db/__init__.py | 2 +- python/valuecell/server/db/init_db.py | 1 + python/valuecell/server/db/models/__init__.py | 6 +- python/valuecell/server/db/models/agent.py | 5 +- python/valuecell/server/db/models/asset.py | 5 +- .../valuecell/server/db/models/watchlist.py | 11 ++-- .../db/repositories/watchlist_repository.py | 7 ++- python/valuecell/server/main.py | 1 + .../server/services/agent_service.py | 5 +- .../server/services/assets/__init__.py | 8 +-- .../server/services/assets/asset_service.py | 4 +- .../valuecell/server/services/i18n_service.py | 8 +-- python/valuecell/utils/__init__.py | 2 +- python/valuecell/utils/i18n_utils.py | 9 +-- 57 files changed, 248 insertions(+), 209 deletions(-) diff --git a/python/valuecell/adapters/assets/__init__.py b/python/valuecell/adapters/assets/__init__.py index 7867db010..01c641e4c 100644 --- a/python/valuecell/adapters/assets/__init__.py +++ b/python/valuecell/adapters/assets/__init__.py @@ -34,39 +34,28 @@ ``` """ -# Core types and data structures -from .types import ( - Asset, - AssetPrice, - AssetSearchResult, - AssetSearchQuery, - AssetType, - MarketStatus, - DataSource, - MarketInfo, - LocalizedName, - Watchlist, - WatchlistItem, -) +from .akshare_adapter import AKShareAdapter # Base adapter classes from .base import ( - BaseDataAdapter, - TickerConverter, AdapterError, - RateLimitError, - DataNotAvailableError, AuthenticationError, + BaseDataAdapter, + DataNotAvailableError, InvalidTickerError, + RateLimitError, + TickerConverter, ) - -# Specific adapter implementations -from .yfinance_adapter import YFinanceAdapter -from .tushare_adapter import TuShareAdapter from .coinmarketcap_adapter import CoinMarketCapAdapter -from .akshare_adapter import AKShareAdapter from .finnhub_adapter import FinnhubAdapter +# Internationalization support +from .i18n_integration import ( + AssetI18nService, + get_asset_i18n_service, + reset_asset_i18n_service, +) + # Management and coordination from .manager import ( AdapterManager, @@ -75,14 +64,26 @@ get_watchlist_manager, reset_managers, ) +from .tushare_adapter import TuShareAdapter -# Internationalization support -from .i18n_integration import ( - AssetI18nService, - get_asset_i18n_service, - reset_asset_i18n_service, +# Core types and data structures +from .types import ( + Asset, + AssetPrice, + AssetSearchQuery, + AssetSearchResult, + AssetType, + DataSource, + LocalizedName, + MarketInfo, + MarketStatus, + Watchlist, + WatchlistItem, ) +# Specific adapter implementations +from .yfinance_adapter import YFinanceAdapter + # Note: High-level asset service functions have been moved to valuecell.services.assets # Import from there for asset search, price retrieval, and watchlist operations diff --git a/python/valuecell/adapters/assets/akshare_adapter.py b/python/valuecell/adapters/assets/akshare_adapter.py index 289524b4e..09c7a11e3 100644 --- a/python/valuecell/adapters/assets/akshare_adapter.py +++ b/python/valuecell/adapters/assets/akshare_adapter.py @@ -4,14 +4,15 @@ Global financial market data including stocks, funds, bonds, and economic indicators. """ +import decimal import logging -from typing import List, Optional, Any +import threading +import time from datetime import datetime, timedelta from decimal import Decimal -import decimal +from typing import Any, List, Optional + import pandas as pd -import time -import threading try: import akshare as ak @@ -22,12 +23,12 @@ from .types import ( Asset, AssetPrice, - AssetSearchResult, AssetSearchQuery, - DataSource, + AssetSearchResult, AssetType, - MarketInfo, + DataSource, LocalizedName, + MarketInfo, MarketStatus, ) diff --git a/python/valuecell/adapters/assets/base.py b/python/valuecell/adapters/assets/base.py index d46a670fe..a780285ab 100644 --- a/python/valuecell/adapters/assets/base.py +++ b/python/valuecell/adapters/assets/base.py @@ -4,18 +4,18 @@ must implement to ensure consistent behavior across different providers. """ +import logging from abc import ABC, abstractmethod -from typing import Dict, List, Optional, Any from datetime import datetime -import logging +from typing import Any, Dict, List, Optional from .types import ( Asset, AssetPrice, - AssetSearchResult, AssetSearchQuery, - DataSource, + AssetSearchResult, AssetType, + DataSource, ) logger = logging.getLogger(__name__) diff --git a/python/valuecell/adapters/assets/coinmarketcap_adapter.py b/python/valuecell/adapters/assets/coinmarketcap_adapter.py index bc9711612..69e5a6833 100644 --- a/python/valuecell/adapters/assets/coinmarketcap_adapter.py +++ b/python/valuecell/adapters/assets/coinmarketcap_adapter.py @@ -5,27 +5,28 @@ """ import logging -from typing import Dict, List, Optional, Any +import time from datetime import datetime from decimal import Decimal +from typing import Any, Dict, List, Optional + import requests -import time from .base import ( + AuthenticationError, BaseDataAdapter, DataNotAvailableError, - AuthenticationError, RateLimitError, ) from .types import ( Asset, AssetPrice, - AssetSearchResult, AssetSearchQuery, - DataSource, + AssetSearchResult, AssetType, - MarketInfo, + DataSource, LocalizedName, + MarketInfo, MarketStatus, ) diff --git a/python/valuecell/adapters/assets/finnhub_adapter.py b/python/valuecell/adapters/assets/finnhub_adapter.py index 0e5b1977b..07d94df8d 100644 --- a/python/valuecell/adapters/assets/finnhub_adapter.py +++ b/python/valuecell/adapters/assets/finnhub_adapter.py @@ -5,27 +5,28 @@ """ import logging -from typing import Dict, List, Optional, Any +import time from datetime import datetime from decimal import Decimal +from typing import Any, Dict, List, Optional + import requests -import time from .base import ( + AuthenticationError, BaseDataAdapter, DataNotAvailableError, - AuthenticationError, RateLimitError, ) from .types import ( Asset, AssetPrice, - AssetSearchResult, AssetSearchQuery, - DataSource, + AssetSearchResult, AssetType, - MarketInfo, + DataSource, LocalizedName, + MarketInfo, MarketStatus, ) diff --git a/python/valuecell/adapters/assets/i18n_integration.py b/python/valuecell/adapters/assets/i18n_integration.py index 1e813f058..0a3c22b91 100644 --- a/python/valuecell/adapters/assets/i18n_integration.py +++ b/python/valuecell/adapters/assets/i18n_integration.py @@ -7,11 +7,10 @@ import logging from typing import Dict, List, Optional +from ...server.config.i18n import I18nConfig, get_i18n_config from ...server.services.i18n_service import get_i18n_service, t -from ...server.config.i18n import get_i18n_config -from ...server.config.i18n import I18nConfig -from .types import Asset, AssetSearchResult, AssetType, MarketStatus from .manager import AdapterManager +from .types import Asset, AssetSearchResult, AssetType, MarketStatus logger = logging.getLogger(__name__) diff --git a/python/valuecell/adapters/assets/manager.py b/python/valuecell/adapters/assets/manager.py index 5c7808196..e9d8e157a 100644 --- a/python/valuecell/adapters/assets/manager.py +++ b/python/valuecell/adapters/assets/manager.py @@ -5,26 +5,26 @@ """ import logging -from typing import Dict, List, Optional, Any -from datetime import datetime -from concurrent.futures import ThreadPoolExecutor, as_completed import threading +from concurrent.futures import ThreadPoolExecutor, as_completed +from datetime import datetime +from typing import Any, Dict, List, Optional +from .akshare_adapter import AKShareAdapter from .base import BaseDataAdapter +from .coinmarketcap_adapter import CoinMarketCapAdapter +from .finnhub_adapter import FinnhubAdapter +from .tushare_adapter import TuShareAdapter from .types import ( Asset, AssetPrice, - AssetSearchResult, AssetSearchQuery, - DataSource, + AssetSearchResult, AssetType, + DataSource, Watchlist, ) from .yfinance_adapter import YFinanceAdapter -from .tushare_adapter import TuShareAdapter -from .coinmarketcap_adapter import CoinMarketCapAdapter -from .akshare_adapter import AKShareAdapter -from .finnhub_adapter import FinnhubAdapter logger = logging.getLogger(__name__) diff --git a/python/valuecell/adapters/assets/tushare_adapter.py b/python/valuecell/adapters/assets/tushare_adapter.py index 2d6d655bc..1ae5cc153 100644 --- a/python/valuecell/adapters/assets/tushare_adapter.py +++ b/python/valuecell/adapters/assets/tushare_adapter.py @@ -5,25 +5,25 @@ """ import logging -from typing import Dict, List, Optional, Any from datetime import datetime, timedelta from decimal import Decimal +from typing import Any, Dict, List, Optional try: import tushare as ts except ImportError: ts = None -from .base import BaseDataAdapter, AuthenticationError +from .base import AuthenticationError, BaseDataAdapter from .types import ( Asset, AssetPrice, - AssetSearchResult, AssetSearchQuery, - DataSource, + AssetSearchResult, AssetType, - MarketInfo, + DataSource, LocalizedName, + MarketInfo, MarketStatus, ) diff --git a/python/valuecell/adapters/assets/types.py b/python/valuecell/adapters/assets/types.py index 7fafab615..404cea0d4 100644 --- a/python/valuecell/adapters/assets/types.py +++ b/python/valuecell/adapters/assets/types.py @@ -4,11 +4,12 @@ across different data sources and markets, with support for internationalization. """ +from dataclasses import dataclass, field from datetime import datetime from decimal import Decimal from enum import Enum -from typing import Dict, List, Optional, Any -from dataclasses import dataclass, field +from typing import Any, Dict, List, Optional + from pydantic import BaseModel, Field, validator diff --git a/python/valuecell/adapters/assets/yfinance_adapter.py b/python/valuecell/adapters/assets/yfinance_adapter.py index c5575bacc..44ba35488 100644 --- a/python/valuecell/adapters/assets/yfinance_adapter.py +++ b/python/valuecell/adapters/assets/yfinance_adapter.py @@ -5,9 +5,9 @@ """ import logging -from typing import Dict, List, Optional, Any from datetime import datetime from decimal import Decimal +from typing import Any, Dict, List, Optional try: import yfinance as yf @@ -18,12 +18,12 @@ from .types import ( Asset, AssetPrice, - AssetSearchResult, AssetSearchQuery, - DataSource, + AssetSearchResult, AssetType, - MarketInfo, + DataSource, LocalizedName, + MarketInfo, MarketStatus, ) diff --git a/python/valuecell/agents/sec_agent.py b/python/valuecell/agents/sec_agent.py index 1d90230d6..40565c34b 100644 --- a/python/valuecell/agents/sec_agent.py +++ b/python/valuecell/agents/sec_agent.py @@ -10,6 +10,7 @@ from agno.models.openrouter import OpenRouter from edgar import Company, set_identity from pydantic import BaseModel, Field, field_validator + from valuecell.core.agent.decorator import create_wrapped_agent from valuecell.core.agent.responses import notification, streaming from valuecell.core.types import BaseAgent, StreamResponse diff --git a/python/valuecell/core/__init__.py b/python/valuecell/core/__init__.py index 8af5d85bf..293b3ae4f 100644 --- a/python/valuecell/core/__init__.py +++ b/python/valuecell/core/__init__.py @@ -2,11 +2,11 @@ from .agent.decorator import create_wrapped_agent from .agent.responses import notification, streaming from .conversation import ( - InMemoryConversationStore, Conversation, ConversationManager, ConversationStatus, ConversationStore, + InMemoryConversationStore, ) from .conversation.item_store import ( InMemoryItemStore, diff --git a/python/valuecell/core/agent/card.py b/python/valuecell/core/agent/card.py index da1458cbe..8681dcd6e 100644 --- a/python/valuecell/core/agent/card.py +++ b/python/valuecell/core/agent/card.py @@ -3,6 +3,7 @@ from typing import Optional from a2a.types import AgentCapabilities, AgentCard + from valuecell.utils import get_agent_card_path FIELDS_UNDEFINED_IN_AGENT_CARD_MODEL = {"enabled", "metadata", "display_name"} diff --git a/python/valuecell/core/agent/client.py b/python/valuecell/core/agent/client.py index 5ec5b0dec..6e93f5981 100644 --- a/python/valuecell/core/agent/client.py +++ b/python/valuecell/core/agent/client.py @@ -3,6 +3,7 @@ import httpx from a2a.client import A2ACardResolver, ClientConfig, ClientFactory from a2a.types import Message, Part, PushNotificationConfig, Role, TextPart + from valuecell.utils import generate_uuid from ..types import RemoteAgentResponse diff --git a/python/valuecell/core/agent/connect.py b/python/valuecell/core/agent/connect.py index c8e4fc8a4..64ab3bd22 100644 --- a/python/valuecell/core/agent/connect.py +++ b/python/valuecell/core/agent/connect.py @@ -6,6 +6,7 @@ from typing import Dict, List, Optional from a2a.types import AgentCard + from valuecell.core.agent.card import parse_local_agent_card_dict from valuecell.core.agent.client import AgentClient from valuecell.core.agent.listener import NotificationListener diff --git a/python/valuecell/core/agent/decorator.py b/python/valuecell/core/agent/decorator.py index b346a54dd..7180abbed 100644 --- a/python/valuecell/core/agent/decorator.py +++ b/python/valuecell/core/agent/decorator.py @@ -16,14 +16,16 @@ from a2a.types import AgentCard, TaskState, UnsupportedOperationError from a2a.utils import new_agent_text_message, new_task from a2a.utils.errors import ServerError + from valuecell.core.agent.card import find_local_agent_card_by_agent_name from valuecell.core.types import ( BaseAgent, + CommonResponseEvent, NotifyResponse, StreamResponse, - CommonResponseEvent, ) from valuecell.utils import parse_host_port + from .responses import EventPredicates logger = logging.getLogger(__name__) diff --git a/python/valuecell/core/conversation/__init__.py b/python/valuecell/core/conversation/__init__.py index 43c57ddb8..c55a4a75f 100644 --- a/python/valuecell/core/conversation/__init__.py +++ b/python/valuecell/core/conversation/__init__.py @@ -1,9 +1,9 @@ """Conversation module initialization""" -from .manager import ConversationManager +from .conversation_store import ConversationStore, InMemoryConversationStore from .item_store import InMemoryItemStore, ItemStore, SQLiteItemStore +from .manager import ConversationManager from .models import Conversation, ConversationStatus -from .conversation_store import InMemoryConversationStore, ConversationStore __all__ = [ # Models diff --git a/python/valuecell/core/conversation/item_store.py b/python/valuecell/core/conversation/item_store.py index e5cc3db62..b20d1e98f 100644 --- a/python/valuecell/core/conversation/item_store.py +++ b/python/valuecell/core/conversation/item_store.py @@ -6,6 +6,7 @@ from typing import Dict, List, Optional import aiosqlite + from valuecell.core.types import ConversationItem, ConversationItemEvent, Role diff --git a/python/valuecell/core/conversation/manager.py b/python/valuecell/core/conversation/manager.py index d1b0eac51..309a28833 100644 --- a/python/valuecell/core/conversation/manager.py +++ b/python/valuecell/core/conversation/manager.py @@ -9,9 +9,9 @@ ) from valuecell.utils import generate_uuid +from .conversation_store import ConversationStore, InMemoryConversationStore from .item_store import InMemoryItemStore, ItemStore from .models import Conversation, ConversationStatus -from .conversation_store import InMemoryConversationStore, ConversationStore class ConversationManager: diff --git a/python/valuecell/core/coordinate/__init__.py b/python/valuecell/core/coordinate/__init__.py index b989c686d..1d9190417 100644 --- a/python/valuecell/core/coordinate/__init__.py +++ b/python/valuecell/core/coordinate/__init__.py @@ -2,7 +2,6 @@ from .orchestrator import AgentOrchestrator from .planner import ExecutionPlanner - __all__ = [ "AgentOrchestrator", "ExecutionPlanner", diff --git a/python/valuecell/core/coordinate/models.py b/python/valuecell/core/coordinate/models.py index efae9d7c2..55acd98e1 100644 --- a/python/valuecell/core/coordinate/models.py +++ b/python/valuecell/core/coordinate/models.py @@ -1,6 +1,7 @@ from typing import List, Optional from pydantic import BaseModel, Field + from valuecell.core.task import Task from valuecell.core.task.models import TaskPattern diff --git a/python/valuecell/core/coordinate/orchestrator.py b/python/valuecell/core/coordinate/orchestrator.py index 06eaf980b..197111959 100644 --- a/python/valuecell/core/coordinate/orchestrator.py +++ b/python/valuecell/core/coordinate/orchestrator.py @@ -3,6 +3,7 @@ from typing import AsyncGenerator, Dict, Optional from a2a.types import TaskArtifactUpdateEvent, TaskState, TaskStatusUpdateEvent + from valuecell.core.agent.connect import RemoteConnections from valuecell.core.conversation import ( ConversationManager, diff --git a/python/valuecell/core/coordinate/planner.py b/python/valuecell/core/coordinate/planner.py index 85c7d0144..980cd2a22 100644 --- a/python/valuecell/core/coordinate/planner.py +++ b/python/valuecell/core/coordinate/planner.py @@ -20,6 +20,7 @@ from agno.agent import Agent from agno.models.openrouter import OpenRouter from agno.tools.user_control_flow import UserControlFlowTools + from valuecell.core.agent.connect import RemoteConnections from valuecell.core.coordinate.planner_prompts import ( PLANNER_INSTRUCTIONS, diff --git a/python/valuecell/core/coordinate/response.py b/python/valuecell/core/coordinate/response.py index a7191eb7c..4c2f7c6ad 100644 --- a/python/valuecell/core/coordinate/response.py +++ b/python/valuecell/core/coordinate/response.py @@ -1,6 +1,7 @@ from typing import Optional from typing_extensions import Literal + from valuecell.core.types import ( BaseResponseDataPayload, CommonResponseEvent, diff --git a/python/valuecell/core/coordinate/response_buffer.py b/python/valuecell/core/coordinate/response_buffer.py index 94cbc6ccf..e6930ff45 100644 --- a/python/valuecell/core/coordinate/response_buffer.py +++ b/python/valuecell/core/coordinate/response_buffer.py @@ -3,6 +3,7 @@ from typing import Dict, List, Optional, Tuple from pydantic import BaseModel + from valuecell.core.types import ( BaseResponse, BaseResponseDataPayload, diff --git a/python/valuecell/core/coordinate/response_router.py b/python/valuecell/core/coordinate/response_router.py index 1f50f6467..e5d62d3fa 100644 --- a/python/valuecell/core/coordinate/response_router.py +++ b/python/valuecell/core/coordinate/response_router.py @@ -5,6 +5,7 @@ from a2a.types import TaskState, TaskStatusUpdateEvent from a2a.utils import get_message_text + from valuecell.core.agent.responses import EventPredicates from valuecell.core.coordinate.response import ResponseFactory from valuecell.core.task import Task diff --git a/python/valuecell/core/types.py b/python/valuecell/core/types.py index a5eeac865..3b361a82c 100644 --- a/python/valuecell/core/types.py +++ b/python/valuecell/core/types.py @@ -4,6 +4,7 @@ from a2a.types import Task, TaskArtifactUpdateEvent, TaskStatusUpdateEvent from pydantic import BaseModel, Field + from valuecell.utils.uuid import generate_item_id diff --git a/python/valuecell/server/api/app.py b/python/valuecell/server/api/app.py index b276307e5..8b6d204a1 100644 --- a/python/valuecell/server/api/app.py +++ b/python/valuecell/server/api/app.py @@ -1,24 +1,25 @@ """FastAPI application factory for ValueCell Server.""" +from contextlib import asynccontextmanager + from fastapi import FastAPI from fastapi.exceptions import RequestValidationError from fastapi.middleware.cors import CORSMiddleware -from contextlib import asynccontextmanager + +from ...adapters.assets import get_adapter_manager +from ..config.settings import get_settings from .exceptions import ( APIException, api_exception_handler, - validation_exception_handler, general_exception_handler, + validation_exception_handler, ) - -from ..config.settings import get_settings +from .routers.agent import create_agent_router +from .routers.agent_stream import create_agent_stream_router from .routers.i18n import create_i18n_router from .routers.system import create_system_router from .routers.watchlist import create_watchlist_router -from .routers.agent_stream import create_agent_stream_router -from .routers.agent import create_agent_router -from .schemas import SuccessResponse, AppInfoData -from ...adapters.assets import get_adapter_manager +from .schemas import AppInfoData, SuccessResponse def create_app() -> FastAPI: diff --git a/python/valuecell/server/api/exceptions.py b/python/valuecell/server/api/exceptions.py index 1f0d9d3e3..a1ddd5cd4 100644 --- a/python/valuecell/server/api/exceptions.py +++ b/python/valuecell/server/api/exceptions.py @@ -1,9 +1,10 @@ """API exception handling module.""" -from typing import Dict, Any +from typing import Any, Dict + from fastapi import HTTPException, Request -from fastapi.responses import JSONResponse from fastapi.exceptions import RequestValidationError +from fastapi.responses import JSONResponse from .schemas import ErrorResponse, StatusCode diff --git a/python/valuecell/server/api/i18n_api.py b/python/valuecell/server/api/i18n_api.py index c670c8294..8cf1ef571 100644 --- a/python/valuecell/server/api/i18n_api.py +++ b/python/valuecell/server/api/i18n_api.py @@ -1,38 +1,11 @@ """Standalone i18n API module for ValueCell.""" -from typing import Dict, Any, Optional -from fastapi import APIRouter, HTTPException, Header from datetime import datetime +from typing import Any, Dict, Optional -from .schemas import ( - SuccessResponse, - StatusCode, - LanguageRequest, - TimezoneRequest, - LanguageDetectionRequest, - TranslationRequest, - DateTimeFormatRequest, - NumberFormatRequest, - CurrencyFormatRequest, - UserI18nSettingsRequest, - # Data models - I18nConfigData, - SupportedLanguagesData, - TimezonesData, - UserI18nSettingsData, - LanguageDetectionData, - TranslationData, - DateTimeFormatData, - NumberFormatData, - CurrencyFormatData, -) -from .exceptions import ( - APIException, - InternalServerException, -) -from ..services.i18n_service import get_i18n_service -from ..config.settings import get_settings -from ...core.constants import SUPPORTED_LANGUAGES, LANGUAGE_TIMEZONE_MAPPING +from fastapi import APIRouter, Header, HTTPException + +from ...core.constants import LANGUAGE_TIMEZONE_MAPPING, SUPPORTED_LANGUAGES from ...utils.i18n_utils import ( detect_browser_language, get_common_timezones, @@ -40,6 +13,33 @@ validate_language_code, validate_timezone, ) +from ..config.settings import get_settings +from ..services.i18n_service import get_i18n_service +from .exceptions import ( + APIException, + InternalServerException, +) +from .schemas import ( # Data models + CurrencyFormatData, + CurrencyFormatRequest, + DateTimeFormatData, + DateTimeFormatRequest, + I18nConfigData, + LanguageDetectionData, + LanguageDetectionRequest, + LanguageRequest, + NumberFormatData, + NumberFormatRequest, + StatusCode, + SuccessResponse, + SupportedLanguagesData, + TimezoneRequest, + TimezonesData, + TranslationData, + TranslationRequest, + UserI18nSettingsData, + UserI18nSettingsRequest, +) class I18nAPI: diff --git a/python/valuecell/server/api/routers/__init__.py b/python/valuecell/server/api/routers/__init__.py index 9c8f501fa..65cf2c773 100644 --- a/python/valuecell/server/api/routers/__init__.py +++ b/python/valuecell/server/api/routers/__init__.py @@ -1,8 +1,8 @@ """API router module.""" +from .agent import create_agent_router from .i18n import create_i18n_router, get_i18n_router from .system import create_system_router -from .agent import create_agent_router __all__ = [ "create_i18n_router", diff --git a/python/valuecell/server/api/routers/agent.py b/python/valuecell/server/api/routers/agent.py index ccea70226..bd2f8ce9e 100644 --- a/python/valuecell/server/api/routers/agent.py +++ b/python/valuecell/server/api/routers/agent.py @@ -3,13 +3,14 @@ """ from typing import Optional -from fastapi import APIRouter, Depends, HTTPException, Query, Path + +from fastapi import APIRouter, Depends, HTTPException, Path, Query from sqlalchemy.orm import Session -from valuecell.server.db import get_db -from valuecell.server.services.agent_service import AgentService from valuecell.server.api.schemas.agent import AgentListResponse, AgentResponse from valuecell.server.api.schemas.base import SuccessResponse +from valuecell.server.db import get_db +from valuecell.server.services.agent_service import AgentService def create_agent_router() -> APIRouter: diff --git a/python/valuecell/server/api/routers/agent_stream.py b/python/valuecell/server/api/routers/agent_stream.py index 5ecc35f74..7121ccda9 100644 --- a/python/valuecell/server/api/routers/agent_stream.py +++ b/python/valuecell/server/api/routers/agent_stream.py @@ -2,11 +2,13 @@ Agent stream router for handling streaming agent queries. """ +import json + from fastapi import APIRouter, HTTPException from fastapi.responses import StreamingResponse + from valuecell.server.api.schemas.agent_stream import AgentStreamRequest from valuecell.server.services.agent_stream_service import AgentStreamService -import json def create_agent_stream_router() -> APIRouter: diff --git a/python/valuecell/server/api/routers/i18n.py b/python/valuecell/server/api/routers/i18n.py index 3b7eb9d78..c7e758ac5 100644 --- a/python/valuecell/server/api/routers/i18n.py +++ b/python/valuecell/server/api/routers/i18n.py @@ -1,6 +1,7 @@ """RESTful i18n API router module.""" from fastapi import APIRouter + from ..i18n_api import get_i18n_api diff --git a/python/valuecell/server/api/routers/system.py b/python/valuecell/server/api/routers/system.py index 950e64629..7e426b31d 100644 --- a/python/valuecell/server/api/routers/system.py +++ b/python/valuecell/server/api/routers/system.py @@ -1,10 +1,11 @@ """System related API routes.""" from datetime import datetime + from fastapi import APIRouter -from ..schemas import SuccessResponse, AppInfoData, HealthCheckData from ...config.settings import get_settings +from ..schemas import AppInfoData, HealthCheckData, SuccessResponse def create_system_router() -> APIRouter: diff --git a/python/valuecell/server/api/routers/watchlist.py b/python/valuecell/server/api/routers/watchlist.py index 3d9897de7..6560a7a3f 100644 --- a/python/valuecell/server/api/routers/watchlist.py +++ b/python/valuecell/server/api/routers/watchlist.py @@ -1,25 +1,26 @@ """Watchlist related API routes.""" -from typing import Optional, List from datetime import datetime, timedelta -from fastapi import APIRouter, HTTPException, Query, Path +from typing import List, Optional +from fastapi import APIRouter, HTTPException, Path, Query + +from ...db.repositories.watchlist_repository import get_watchlist_repository +from ...services.assets.asset_service import get_asset_service from ..schemas import ( - SuccessResponse, - WatchlistData, - WatchlistItemData, - CreateWatchlistRequest, AddStockRequest, - UpdateStockNotesRequest, - AssetSearchResultData, - AssetInfoData, AssetDetailData, - AssetPriceData, - AssetHistoricalPricesData, AssetHistoricalPriceData, + AssetHistoricalPricesData, + AssetInfoData, + AssetPriceData, + AssetSearchResultData, + CreateWatchlistRequest, + SuccessResponse, + UpdateStockNotesRequest, + WatchlistData, + WatchlistItemData, ) -from ...services.assets.asset_service import get_asset_service -from ...db.repositories.watchlist_repository import get_watchlist_repository # Global default user ID for open source API DEFAULT_USER_ID = "default_user" diff --git a/python/valuecell/server/api/schemas/__init__.py b/python/valuecell/server/api/schemas/__init__.py index 1317f0e28..93e5e5560 100644 --- a/python/valuecell/server/api/schemas/__init__.py +++ b/python/valuecell/server/api/schemas/__init__.py @@ -1,48 +1,48 @@ """API schemas package.""" from .base import ( - StatusCode, + AppInfoData, BaseResponse, - SuccessResponse, ErrorResponse, - AppInfoData, HealthCheckData, + StatusCode, + SuccessResponse, ) from .i18n import ( + AgentI18nContextData, + CurrencyFormatData, + CurrencyFormatRequest, + DateTimeFormatData, + DateTimeFormatRequest, I18nConfigData, + LanguageDetectionData, + LanguageDetectionRequest, + LanguageRequest, + NumberFormatData, + NumberFormatRequest, SupportedLanguage, SupportedLanguagesData, TimezoneInfo, - TimezonesData, - LanguageRequest, TimezoneRequest, - LanguageDetectionRequest, + TimezonesData, + TranslationData, TranslationRequest, - DateTimeFormatRequest, - NumberFormatRequest, - CurrencyFormatRequest, UserI18nSettingsData, UserI18nSettingsRequest, - AgentI18nContextData, - LanguageDetectionData, - TranslationData, - DateTimeFormatData, - NumberFormatData, - CurrencyFormatData, ) from .watchlist import ( - WatchlistItemData, - WatchlistData, - CreateWatchlistRequest, AddStockRequest, - UpdateStockNotesRequest, - AssetSearchQuery, - AssetInfoData, - AssetSearchResultData, AssetDetailData, - AssetPriceData, AssetHistoricalPriceData, AssetHistoricalPricesData, + AssetInfoData, + AssetPriceData, + AssetSearchQuery, + AssetSearchResultData, + CreateWatchlistRequest, + UpdateStockNotesRequest, + WatchlistData, + WatchlistItemData, WatchlistWithPricesData, ) diff --git a/python/valuecell/server/api/schemas/agent.py b/python/valuecell/server/api/schemas/agent.py index 8ee746f8a..a570c3396 100644 --- a/python/valuecell/server/api/schemas/agent.py +++ b/python/valuecell/server/api/schemas/agent.py @@ -2,9 +2,11 @@ Agent API schemas for handling agent-related requests and responses. """ -from typing import List, Optional, Dict, Any -from pydantic import BaseModel, Field from datetime import datetime +from typing import Any, Dict, List, Optional + +from pydantic import BaseModel, Field + from .base import SuccessResponse diff --git a/python/valuecell/server/api/schemas/base.py b/python/valuecell/server/api/schemas/base.py index 46652f596..6449a5845 100644 --- a/python/valuecell/server/api/schemas/base.py +++ b/python/valuecell/server/api/schemas/base.py @@ -1,8 +1,9 @@ """Base API schemas for ValueCell application.""" -from typing import Optional, Generic, TypeVar from datetime import datetime from enum import IntEnum +from typing import Generic, Optional, TypeVar + from pydantic import BaseModel, Field T = TypeVar("T") diff --git a/python/valuecell/server/api/schemas/i18n.py b/python/valuecell/server/api/schemas/i18n.py index 3d8b4f1a5..3a2a2078f 100644 --- a/python/valuecell/server/api/schemas/i18n.py +++ b/python/valuecell/server/api/schemas/i18n.py @@ -1,7 +1,8 @@ """I18n related API schemas for ValueCell application.""" -from typing import Dict, Any, List, Optional from datetime import datetime +from typing import Any, Dict, List, Optional + from pydantic import BaseModel, Field, validator from ....core.constants import SUPPORTED_LANGUAGE_CODES diff --git a/python/valuecell/server/api/schemas/watchlist.py b/python/valuecell/server/api/schemas/watchlist.py index 89bff23f7..1cd37722d 100644 --- a/python/valuecell/server/api/schemas/watchlist.py +++ b/python/valuecell/server/api/schemas/watchlist.py @@ -1,7 +1,8 @@ """API schemas for watchlist operations.""" -from typing import Optional, List from datetime import datetime +from typing import List, Optional + from pydantic import BaseModel, Field diff --git a/python/valuecell/server/config/i18n.py b/python/valuecell/server/config/i18n.py index 424032c45..9f49062c8 100644 --- a/python/valuecell/server/config/i18n.py +++ b/python/valuecell/server/config/i18n.py @@ -1,20 +1,21 @@ """Internationalization configuration for ValueCell application.""" import os +from datetime import datetime from typing import Optional + import pytz -from datetime import datetime from ...core.constants import ( - SUPPORTED_LANGUAGE_CODES, - LANGUAGE_TIMEZONE_MAPPING, - DEFAULT_LANGUAGE, - DEFAULT_TIMEZONE, + CURRENCY_SYMBOLS, DATE_FORMATS, - TIME_FORMATS, DATETIME_FORMATS, - CURRENCY_SYMBOLS, + DEFAULT_LANGUAGE, + DEFAULT_TIMEZONE, + LANGUAGE_TIMEZONE_MAPPING, NUMBER_FORMATS, + SUPPORTED_LANGUAGE_CODES, + TIME_FORMATS, ) diff --git a/python/valuecell/server/config/settings.py b/python/valuecell/server/config/settings.py index 092db7d9c..2e4805c89 100644 --- a/python/valuecell/server/config/settings.py +++ b/python/valuecell/server/config/settings.py @@ -1,8 +1,8 @@ """Settings configuration for ValueCell Server.""" import os -from pathlib import Path from functools import lru_cache +from pathlib import Path def _get_project_root() -> str: diff --git a/python/valuecell/server/db/__init__.py b/python/valuecell/server/db/__init__.py index a18580123..b2b7ebb9c 100644 --- a/python/valuecell/server/db/__init__.py +++ b/python/valuecell/server/db/__init__.py @@ -6,7 +6,7 @@ get_db, ) from .init_db import DatabaseInitializer, init_database -from .models import Base, Agent, Asset +from .models import Agent, Asset, Base __all__ = [ # Connection management diff --git a/python/valuecell/server/db/init_db.py b/python/valuecell/server/db/init_db.py index 9b6f20d6f..acf780c12 100644 --- a/python/valuecell/server/db/init_db.py +++ b/python/valuecell/server/db/init_db.py @@ -13,6 +13,7 @@ from sqlalchemy import inspect, text from sqlalchemy.exc import SQLAlchemyError + from valuecell.server.config.settings import get_settings from valuecell.server.db.connection import DatabaseManager, get_database_manager from valuecell.server.db.models.agent import Agent diff --git a/python/valuecell/server/db/models/__init__.py b/python/valuecell/server/db/models/__init__.py index 0f534b566..ebe62d2d1 100644 --- a/python/valuecell/server/db/models/__init__.py +++ b/python/valuecell/server/db/models/__init__.py @@ -5,12 +5,12 @@ All models are automatically imported to ensure they are registered with SQLAlchemy. """ -# Import base model -from .base import Base - # Import all models to ensure they are registered with SQLAlchemy from .agent import Agent from .asset import Asset + +# Import base model +from .base import Base from .watchlist import Watchlist, WatchlistItem # Export all models diff --git a/python/valuecell/server/db/models/agent.py b/python/valuecell/server/db/models/agent.py index 5534d0a75..8d01d519f 100644 --- a/python/valuecell/server/db/models/agent.py +++ b/python/valuecell/server/db/models/agent.py @@ -4,8 +4,9 @@ This module defines the database models for agents in the ValueCell system. """ -from typing import Dict, Any -from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, JSON +from typing import Any, Dict + +from sqlalchemy import JSON, Boolean, Column, DateTime, Integer, String, Text from sqlalchemy.sql import func from .base import Base diff --git a/python/valuecell/server/db/models/asset.py b/python/valuecell/server/db/models/asset.py index 2b25926d6..6304a0d09 100644 --- a/python/valuecell/server/db/models/asset.py +++ b/python/valuecell/server/db/models/asset.py @@ -4,8 +4,9 @@ This module defines the database models for assets in the ValueCell system. """ -from typing import Dict, Any -from sqlalchemy import Column, Integer, String, Text, Boolean, DateTime, JSON, Numeric +from typing import Any, Dict + +from sqlalchemy import JSON, Boolean, Column, DateTime, Integer, Numeric, String, Text from sqlalchemy.sql import func from .base import Base diff --git a/python/valuecell/server/db/models/watchlist.py b/python/valuecell/server/db/models/watchlist.py index 422967cb5..0fb2235e0 100644 --- a/python/valuecell/server/db/models/watchlist.py +++ b/python/valuecell/server/db/models/watchlist.py @@ -4,19 +4,20 @@ This module defines the database models for user watchlists in the ValueCell system. """ -from typing import Dict, Any +from typing import Any, Dict + from sqlalchemy import ( + Boolean, Column, + DateTime, + ForeignKey, Integer, String, Text, - Boolean, - DateTime, - ForeignKey, UniqueConstraint, ) -from sqlalchemy.sql import func from sqlalchemy.orm import relationship +from sqlalchemy.sql import func from .base import Base diff --git a/python/valuecell/server/db/repositories/watchlist_repository.py b/python/valuecell/server/db/repositories/watchlist_repository.py index 5c6c5873a..2f7ab8b1e 100644 --- a/python/valuecell/server/db/repositories/watchlist_repository.py +++ b/python/valuecell/server/db/repositories/watchlist_repository.py @@ -5,12 +5,13 @@ """ from typing import List, Optional -from sqlalchemy.orm import Session + +from sqlalchemy import asc, desc from sqlalchemy.exc import IntegrityError -from sqlalchemy import desc, asc +from sqlalchemy.orm import Session -from ..models.watchlist import Watchlist, WatchlistItem from ..connection import get_database_manager +from ..models.watchlist import Watchlist, WatchlistItem class WatchlistRepository: diff --git a/python/valuecell/server/main.py b/python/valuecell/server/main.py index ef9a0c9d0..4a391231e 100644 --- a/python/valuecell/server/main.py +++ b/python/valuecell/server/main.py @@ -1,6 +1,7 @@ """Main entry point for ValueCell Server Backend.""" import uvicorn + from valuecell.server.api.app import create_app from valuecell.server.config.settings import get_settings diff --git a/python/valuecell/server/services/agent_service.py b/python/valuecell/server/services/agent_service.py index feff4630c..d784e72e6 100644 --- a/python/valuecell/server/services/agent_service.py +++ b/python/valuecell/server/services/agent_service.py @@ -3,11 +3,12 @@ """ from typing import Optional -from sqlalchemy.orm import Session + from sqlalchemy import and_, or_ +from sqlalchemy.orm import Session -from valuecell.server.db.models.agent import Agent from valuecell.server.api.schemas.agent import AgentData, AgentListData +from valuecell.server.db.models.agent import Agent class AgentService: diff --git a/python/valuecell/server/services/assets/__init__.py b/python/valuecell/server/services/assets/__init__.py index 18873f983..4031cfc60 100644 --- a/python/valuecell/server/services/assets/__init__.py +++ b/python/valuecell/server/services/assets/__init__.py @@ -26,13 +26,13 @@ from .asset_service import ( AssetService, - get_asset_service, - reset_asset_service, - search_assets, + add_to_watchlist, get_asset_info, get_asset_price, - add_to_watchlist, + get_asset_service, get_watchlist, + reset_asset_service, + search_assets, ) __version__ = "1.0.0" diff --git a/python/valuecell/server/services/assets/asset_service.py b/python/valuecell/server/services/assets/asset_service.py index aba3b63fa..e9997a2b9 100644 --- a/python/valuecell/server/services/assets/asset_service.py +++ b/python/valuecell/server/services/assets/asset_service.py @@ -5,11 +5,11 @@ """ import logging -from typing import Dict, List, Optional, Any from datetime import datetime +from typing import Any, Dict, List, Optional -from ....adapters.assets.manager import get_adapter_manager, get_watchlist_manager from ....adapters.assets.i18n_integration import get_asset_i18n_service +from ....adapters.assets.manager import get_adapter_manager, get_watchlist_manager from ....adapters.assets.types import AssetSearchQuery, AssetType from ...config.i18n import get_i18n_config diff --git a/python/valuecell/server/services/i18n_service.py b/python/valuecell/server/services/i18n_service.py index d62b87f99..b56ad6711 100644 --- a/python/valuecell/server/services/i18n_service.py +++ b/python/valuecell/server/services/i18n_service.py @@ -1,13 +1,13 @@ """Internationalization service for ValueCell application.""" import json -from pathlib import Path -from typing import Dict, Any, Optional, List from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional -from ..config.settings import get_settings +from ...core.constants import DEFAULT_LANGUAGE, SUPPORTED_LANGUAGE_CODES from ..config.i18n import get_i18n_config -from ...core.constants import SUPPORTED_LANGUAGE_CODES, DEFAULT_LANGUAGE +from ..config.settings import get_settings class TranslationManager: diff --git a/python/valuecell/utils/__init__.py b/python/valuecell/utils/__init__.py index 1716c6adf..9576ed8e8 100644 --- a/python/valuecell/utils/__init__.py +++ b/python/valuecell/utils/__init__.py @@ -1,7 +1,7 @@ +from .db import resolve_db_path 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", diff --git a/python/valuecell/utils/i18n_utils.py b/python/valuecell/utils/i18n_utils.py index c0f628a9c..9ebb7f930 100644 --- a/python/valuecell/utils/i18n_utils.py +++ b/python/valuecell/utils/i18n_utils.py @@ -1,16 +1,17 @@ """Internationalization utility functions for ValueCell application.""" import re -from typing import Dict, List, Optional, Any from datetime import datetime -import pytz from pathlib import Path +from typing import Any, Dict, List, Optional + +import pytz from ..core.constants import ( - SUPPORTED_LANGUAGE_CODES, - LANGUAGE_TIMEZONE_MAPPING, DEFAULT_LANGUAGE, DEFAULT_TIMEZONE, + LANGUAGE_TIMEZONE_MAPPING, + SUPPORTED_LANGUAGE_CODES, SUPPORTED_LANGUAGES, ) from ..server.services.i18n_service import get_i18n_service From ef699c9818b7e37ce0132e285441cda02425036c Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:10:54 +0800 Subject: [PATCH 6/7] fix: update Makefile format command to include isort for improved code formatting --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index b85595932..9103509e3 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ format: - ruff format --config ./python/pyproject.toml ./python/ + ruff format --config ./python/pyproject.toml ./python/ && uv run --directory ./python isort . lint: ruff check --config ./python/pyproject.toml ./python/ From 4d6854639d37307200e63b2bbf2590d41eea215c Mon Sep 17 00:00:00 2001 From: Zhaofeng Zhang <24791380+vcfgv@users.noreply.github.com> Date: Fri, 26 Sep 2025 11:11:00 +0800 Subject: [PATCH 7/7] fix: rename unit_test job to test for consistency in workflow --- .github/workflows/python.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index b24024731..c7bd2273a 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -51,7 +51,7 @@ jobs: - name: Run style checks run: uv run --no-project isort --check-only ./valuecell - unit_test: + test: runs-on: ubuntu-latest defaults: run: