LLM驱动的 A/H/美股智能分析:多数据源行情 + 实时新闻 + LLM决策仪表盘 + 多渠道推送,零成本定时运行,纯白嫖. LLM-powered stock analysis system for A/H/US markets.
4455 matches across 17 categories. Click a row to expand file-level details.
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | main.py | 161 | def _get_stock_analysis_pipeline(): |
| LOW | main.py | 200 | def _reload_env_file_values_preserving_overrides() -> None: |
| LOW | main.py | 388 | def _compute_trading_day_filter( |
| LOW | main.py | 430 | def _run_market_review_with_shared_lock( |
| LOW | main.py | 451 | def _refresh_stock_index_cache_for_analysis(config: Config) -> None: |
| LOW | main.py | 733 | def _resolve_scheduled_stock_codes(stock_codes: Optional[List[str]]) -> Optional[List[str]]: |
| LOW | main.py | 749 | def _build_schedule_time_provider(default_schedule_time: str): |
| LOW | tests/test_backtest_service.py | 148 | def test_result_fields_correct(self) -> None: |
| LOW | tests/test_backtest_service.py | 181 | def test_summaries_created_after_run(self) -> None: |
| LOW | tests/test_backtest_service.py | 209 | def test_get_summary_overall_returns_sentinel_as_none(self) -> None: |
| LOW | tests/test_backtest_service.py | 220 | def test_agent_learning_summary_helpers_keep_skill_rollups_neutral_until_supported(self) -> None: |
| LOW | tests/test_backtest_service.py | 242 | def test_get_recent_evaluations(self) -> None: |
| LOW | tests/test_backtest_service.py | 259 | def test_get_recent_evaluations_supports_tracking_fields_and_analysis_date_filters(self) -> None: |
| LOW | tests/test_backtest_service.py | 291 | def test_get_summary_supports_analysis_date_range(self) -> None: |
| LOW | tests/test_backtest_service.py | 322 | def test_get_summary_date_range_filters_to_single_window_and_engine(self) -> None: |
| LOW | tests/test_backtest_service.py | 430 | def test_get_summary_date_range_rejects_excessive_row_counts(self) -> None: |
| LOW | tests/test_backtest_service.py | 443 | def test_multi_stock_summaries(self) -> None: |
| LOW | tests/test_backtest_service.py | 503 | def test_run_backtest_excludes_market_review_records(self) -> None: |
| LOW | tests/test_backtest_service.py | 535 | def test_run_backtest_includes_null_report_type_records(self) -> None: |
| LOW | tests/test_notification_sender.py | 63 | def test_send_returns_false_when_not_configured(self): |
| LOW | tests/test_notification_sender.py | 69 | def test_is_discord_configured_webhook_only(self): |
| LOW | tests/test_notification_sender.py | 74 | def test_is_discord_configured_bot_only(self): |
| LOW | tests/test_notification_sender.py | 79 | def test_is_discord_configured_neither(self): |
| LOW | tests/test_notification_sender.py | 85 | def test_send_webhook_success_builds_correct_payload(self, mock_post): |
| LOW | tests/test_notification_sender.py | 119 | def test_send_returns_false_when_no_webhook_url(self): |
| LOW | tests/test_notification_sender.py | 126 | def test_send_success_returns_true(self, mock_post): |
| LOW | tests/test_notification_sender.py | 133 | def test_gen_wechat_payload_markdown(self): |
| LOW | tests/test_notification_sender.py | 140 | def test_gen_wechat_payload_text(self): |
| LOW | tests/test_notification_sender.py | 148 | def test_send_wechat_image_over_limit_returns_false(self, mock_post): |
| LOW | tests/test_notification_sender.py | 160 | def test_send_returns_false_when_no_webhook_url(self): |
| LOW | tests/test_notification_sender.py | 167 | def test_send_success_returns_true(self, mock_post): |
| LOW | tests/test_notification_sender.py | 175 | def test_send_http_error_returns_false(self, mock_post): |
| LOW | tests/test_notification_sender.py | 184 | def test_send_with_secret_and_keyword_builds_signed_payload(self, mock_post, _mock_time): |
| LOW | tests/test_notification_sender.py | 402 | def test_send_returns_false_when_url_has_no_topic(self, mock_post): |
| LOW | tests/test_notification_sender.py | 412 | def test_send_returns_false_when_url_scheme_is_not_http(self, mock_post): |
| LOW | tests/test_notification_sender.py | 422 | def test_send_http_error_returns_false(self, mock_post): |
| LOW | tests/test_notification_sender.py | 432 | def test_send_timeout_does_not_log_token_value(self, mock_post): |
| LOW | tests/test_notification_sender.py | 447 | def test_send_returns_false_when_not_configured(self): |
| LOW | tests/test_notification_sender.py | 455 | def test_send_returns_false_when_token_is_blank(self): |
| LOW | tests/test_notification_sender.py | 464 | def test_send_success_uses_json_payload_and_header_auth(self, mock_post): |
| LOW | tests/test_notification_sender.py | 552 | def test_send_returns_false_when_no_urls(self): |
| LOW | tests/test_notification_sender.py | 559 | def test_send_success_payload_has_text_and_content(self, mock_post): |
| LOW | tests/test_notification_sender.py | 569 | def test_send_returns_true_when_one_custom_webhook_succeeds(self, mock_post): |
| LOW | tests/test_notification_sender.py | 794 | def test_send_returns_false_when_no_token(self): |
| LOW | tests/test_notification_sender.py | 801 | def test_send_success_returns_true(self, mock_post): |
| LOW | tests/test_notification_sender.py | 810 | def test_send_long_message_chunks_pushplus_requests(self, mock_post, _mock_sleep): |
| LOW | tests/test_notification_sender.py | 842 | def test_send_returns_false_when_not_configured(self): |
| LOW | tests/test_notification_sender.py | 848 | def test_is_slack_configured_webhook_only(self): |
| LOW | tests/test_notification_sender.py | 853 | def test_is_slack_configured_bot_only(self): |
| LOW | tests/test_notification_sender.py | 858 | def test_is_slack_configured_neither(self): |
| LOW | tests/test_notification_sender.py | 864 | def test_send_webhook_success(self, mock_post): |
| LOW | tests/test_notification_sender.py | 896 | def test_send_bot_error_returns_false(self, mock_post): |
| LOW | tests/test_notification_sender.py | 903 | def test_build_blocks_splits_long_content(self): |
| LOW | tests/test_notification_sender.py | 913 | def test_send_text_prefers_bot_when_both_configured(self, mock_post): |
| LOW | tests/test_notification_sender.py | 97 | def test_send_webhook_http_error_returns_false(self, mock_post): |
| LOW | tests/test_notification_sender.py | 105 | def test_send_bot_success_uses_channel_url(self, mock_post): |
| LOW | tests/test_notification_sender.py | 212 | def test_send_error_response_returns_false(self, mock_post): |
| LOW | tests/test_notification_sender.py | 223 | def test_send_with_keyword_that_leaves_too_little_chunk_budget_returns_false(self, mock_post): |
| LOW | tests/test_notification_sender.py | 240 | def test_send_returns_false_when_not_configured(self): |
| LOW | tests/test_notification_sender.py | 246 | def test_get_receivers_for_stocks_no_groups_returns_default(self): |
| 2720 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | requirements.txt | 1 | # =================================== |
| MEDIUM | requirements.txt | 3 | # =================================== |
| MEDIUM | docker/docker-compose.yml | 1 | # =================================== |
| MEDIUM | docker/docker-compose.yml | 3 | # =================================== |
| MEDIUM | tests/test_multi_agent.py | 42 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 44 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 171 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 173 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 248 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 250 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 337 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 339 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1538 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1540 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1817 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1819 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1905 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1907 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 374 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 376 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 462 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 464 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1217 | # ============================================================ |
| MEDIUM | tests/test_multi_agent.py | 1219 | # ============================================================ |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 78 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 80 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 126 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 128 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 153 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 155 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 216 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 218 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 289 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 291 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 37 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_image_stock_extractor_litellm.py | 39 | # --------------------------------------------------------------------------- |
| MEDIUM | tests/test_agent_pipeline.py | 36 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 38 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 1312 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 1314 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 1343 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 1345 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 1811 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 1813 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 2501 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 2503 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 2577 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 2579 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 552 | # ============================================================ |
| MEDIUM | tests/test_agent_pipeline.py | 554 | # ============================================================ |
| MEDIUM | tests/test_history_loader.py | 15 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 17 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 32 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 34 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 59 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 61 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 82 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 84 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 111 | # ------------------------------------------------------------------ |
| MEDIUM | tests/test_history_loader.py | 113 | # ------------------------------------------------------------------ |
| 295 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | main.py | 78 | except Exception as exc: # pragma: no cover - defensive branch |
| LOW | main.py | 464 | except Exception as exc: # noqa: BLE001 - stock index freshness must not block analysis. |
| LOW | main.py | 640 | except Exception as e: |
| LOW | main.py | 660 | except Exception as e: |
| LOW | main.py | 663 | except Exception as e: |
| LOW | main.py | 714 | except Exception as exc: |
| LOW | main.py | 729 | except Exception as exc: |
| LOW | main.py | 789 | except Exception as exc: |
| LOW | main.py | 800 | except Exception as exc: |
| LOW | main.py | 807 | except Exception as exc: |
| LOW | main.py | 864 | except Exception as e: |
| LOW | main.py | 1011 | except Exception as e: |
| LOW | tests/test_portfolio_service.py | 934 | except Exception as exc: # pragma: no cover - asserted below |
| LOW | tests/test_portfolio_service.py | 989 | except Exception as exc: # pragma: no cover - asserted below |
| LOW | tests/longbridge_live_smoke.py | 106 | except Exception as e: |
| LOW | tests/test_social_sentiment_service.py | 129 | except Exception as exc: # pragma: no cover - thread collection |
| MEDIUM | tests/test_social_sentiment_service.py | 125 | def worker(): |
| LOW | tests/test_llm_usage.py | 195 | except Exception as exc: |
| LOW | tests/test_conversation_manager.py | 22 | except Exception as exc: # pragma: no cover - failures are asserted below |
| LOW | tests/test_search_service_concurrency.py | 114 | except Exception as exc: # pragma: no cover - thread collection |
| LOW | tests/test_search_service_concurrency.py | 171 | except Exception as exc: # pragma: no cover - thread collection |
| LOW | tests/test_search_service_concurrency.py | 265 | except Exception as exc: # pragma: no cover - thread collection |
| MEDIUM | tests/test_search_service_concurrency.py | 110 | def worker(): |
| MEDIUM | tests/test_search_service_concurrency.py | 167 | def worker(): |
| MEDIUM | tests/test_search_service_concurrency.py | 261 | def worker(): |
| MEDIUM | tests/test_storage.py | 378 | def initialize_manager() -> None: |
| MEDIUM | tests/test_storage.py | 387 | def use_manager() -> None: |
| MEDIUM | tests/test_storage.py | 470 | def construct_directly() -> None: |
| MEDIUM | tests/test_storage.py | 479 | def use_get_instance() -> None: |
| LOW | tests/test_storage.py | 383 | except Exception as exc: |
| LOW | tests/test_storage.py | 399 | except Exception as exc: |
| LOW | tests/test_storage.py | 475 | except Exception as exc: |
| LOW | tests/test_storage.py | 491 | except Exception as exc: |
| LOW | tests/test_data_fetcher_prefetch_stock_names.py | 291 | except Exception as exc: # pragma: no cover - thread collection |
| MEDIUM | tests/test_data_fetcher_prefetch_stock_names.py | 286 | def worker(): |
| LOW | tests/test_agent_sse_cleanup.py | 50 | except Exception as exc: |
| LOW | tests/test_main_schedule_mode.py | 48 | except Exception: |
| LOW | tests/test_main_schedule_mode.py | 655 | except Exception: |
| LOW | tests/test_run_diagnostics_p1.py | 103 | except Exception as exc: # pragma: no cover - exercised by queue behavior |
| LOW | tests/test_analysis_api_contract.py | 29 | except Exception: # pragma: no cover - optional dependency environments |
| LOW | tests/test_analysis_api_contract.py | 461 | except Exception as exc: # pragma: no cover - exercised via assert below |
| LOW | tests/test_analysis_api_contract.py | 1947 | except Exception: # pragma: no cover - optional dependency environments |
| LOW | tests/test_stooq_fallback.py | 12 | except Exception: |
| LOW | tests/test_realtime_types.py | 29 | except Exception as exc: # pragma: no cover - thread collection |
| LOW | tests/test_realtime_types.py | 56 | except Exception as exc: # pragma: no cover - thread collection |
| LOW | tests/test_realtime_types.py | 64 | except Exception as exc: # pragma: no cover - thread collection |
| MEDIUM | tests/test_realtime_types.py | 25 | def worker(): |
| MEDIUM | tests/test_realtime_types.py | 51 | def record_success(): |
| MEDIUM | tests/test_realtime_types.py | 59 | def record_failure(): |
| LOW | data_provider/alphavantage_fetcher.py | 60 | except Exception as e: |
| LOW | data_provider/alphavantage_fetcher.py | 130 | except Exception as e: |
| LOW | data_provider/alphavantage_fetcher.py | 174 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 200 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 351 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 358 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 378 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 385 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 410 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 417 | except Exception as e: |
| LOW | data_provider/yfinance_fetcher.py | 503 | except Exception: |
| 610 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | server.py | 40 | |
| LOW | webui.py | 18 | |
| LOW | main.py | 24 | |
| LOW | tests/test_portfolio_service.py | 4 | |
| LOW | tests/test_analysis_context_pack_prompt.py | 4 | |
| LOW | tests/test_generate_index_from_csv.py | 11 | |
| LOW | tests/test_generate_index_from_csv.py | 11 | |
| LOW | tests/test_generate_index_from_csv.py | 17 | |
| LOW | tests/test_analysis_context_builder.py | 4 | |
| LOW | tests/test_analysis_context_pack_overview.py | 4 | |
| LOW | tests/test_market_light_service.py | 4 | |
| LOW | tests/test_fetch_tushare_stock_list.py | 4 | |
| LOW | tests/test_multi_agent.py | 25 | |
| LOW | tests/test_run_diagnostics_p2.py | 4 | |
| LOW | tests/test_agent_pipeline.py | 20 | |
| LOW | tests/test_agent_pipeline.py | 21 | |
| LOW | tests/test_agent_pipeline.py | 21 | |
| LOW | tests/test_agent_pipeline.py | 22 | |
| LOW | tests/test_agent_pipeline.py | 22 | |
| LOW | tests/test_report_integrity.py | 16 | |
| LOW | tests/test_anspire_search.py | 27 | |
| LOW | tests/test_anspire_search.py | 27 | |
| LOW | tests/test_anspire_search.py | 28 | |
| LOW | tests/test_anspire_search.py | 29 | |
| LOW | tests/test_analysis_context_pack_schema.py | 4 | |
| LOW | tests/test_daily_analysis_workflow_llm_env.py | 4 | |
| LOW | tests/test_alert_api.py | 4 | |
| LOW | tests/test_alert_api.py | 20 | |
| LOW | tests/test_stock_index_remote_service.py | 4 | |
| LOW | tests/test_analysis_integration.py | 18 | |
| LOW | tests/test_analysis_integration.py | 19 | |
| LOW | tests/test_history_loader.py | 3 | |
| LOW | tests/test_market_light_alerts.py | 4 | |
| LOW | tests/test_agent_frozen_context.py | 3 | |
| LOW | tests/test_realtime_quote_fallback_logging.py | 11 | |
| LOW | tests/test_ask_command.py | 10 | |
| LOW | tests/test_market_analyzer_generate_text.py | 21 | |
| LOW | tests/test_report_renderer.py | 15 | |
| LOW | tests/test_agent_executor.py | 27 | |
| LOW | tests/test_yfinance_fundamental_adapter.py | 9 | |
| LOW | tests/test_fetcher_logging.py | 1 | |
| LOW | tests/test_alert_worker.py | 4 | |
| LOW | tests/test_auth_api.py | 19 | |
| LOW | tests/test_analyzer_news_prompt.py | 9 | |
| LOW | tests/test_skill_load_warning.py | 9 | |
| LOW | tests/test_hk_stock_name_fallback.py | 18 | |
| LOW | tests/test_get_latest_data.py | 21 | |
| LOW | tests/test_longbridge_fetcher.py | 23 | |
| LOW | tests/test_longbridge_fetcher.py | 24 | |
| LOW | tests/test_import_parser.py | 84 | |
| LOW | tests/test_import_parser.py | 105 | |
| LOW | tests/test_stock_code_utils.py | 7 | |
| LOW | tests/test_refresh_stock_index.py | 4 | |
| LOW | tests/test_agent_sse_cleanup.py | 14 | |
| LOW | tests/test_main_schedule_mode.py | 8 | |
| LOW | tests/test_report_schema.py | 18 | |
| LOW | tests/test_bot_market_command.py | 11 | |
| LOW | tests/test_task_queue_config_sync.py | 4 | |
| LOW | tests/test_chip_structure_fallback.py | 15 | |
| LOW | tests/test_llm_adapter_provider_trace.py | 10 | |
| 325 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | main.py | 468 | |
| LOW | main.py | 700 | |
| LOW | main.py | 776 | |
| LOW | tests/test_portfolio_service.py | 1153 | |
| LOW | tests/test_multi_agent.py | 884 | |
| LOW | tests/test_multi_agent.py | 906 | |
| LOW | tests/test_multi_agent.py | 921 | |
| LOW | tests/test_ask_command.py | 281 | |
| LOW | tests/test_market_review.py | 16 | |
| LOW | tests/test_agent_executor.py | 93 | |
| LOW | tests/test_fetcher_logging.py | 127 | |
| LOW | tests/test_storage.py | 535 | |
| LOW | tests/test_auth_status_setup_state.py | 103 | |
| LOW | tests/test_analysis_api_contract.py | 149 | |
| LOW | tests/test_analysis_api_contract.py | 1629 | |
| LOW | data_provider/realtime_types.py | 219 | |
| LOW | data_provider/realtime_types.py | 390 | |
| LOW | data_provider/yfinance_fetcher.py | 205 | |
| LOW | data_provider/yfinance_fetcher.py | 320 | |
| LOW | data_provider/yfinance_fetcher.py | 363 | |
| LOW | data_provider/yfinance_fetcher.py | 390 | |
| LOW | data_provider/fundamental_adapter.py | 240 | |
| LOW | data_provider/yfinance_fundamental_adapter.py | 146 | |
| LOW | data_provider/akshare_fetcher.py | 605 | |
| LOW | data_provider/akshare_fetcher.py | 908 | |
| LOW | data_provider/akshare_fetcher.py | 952 | |
| LOW | data_provider/akshare_fetcher.py | 1357 | |
| LOW | data_provider/akshare_fetcher.py | 1686 | |
| LOW | data_provider/akshare_fetcher.py | 1788 | |
| LOW | data_provider/efinance_fetcher.py | 805 | |
| LOW | data_provider/efinance_fetcher.py | 921 | |
| LOW | data_provider/efinance_fetcher.py | 1049 | |
| LOW | data_provider/longbridge_fetcher.py | 145 | |
| LOW | data_provider/longbridge_fetcher.py | 489 | |
| LOW | data_provider/longbridge_fetcher.py | 626 | |
| LOW | data_provider/tushare_fetcher.py | 778 | |
| LOW | data_provider/tushare_fetcher.py | 849 | |
| LOW | data_provider/tushare_fetcher.py | 930 | |
| LOW | data_provider/baostock_fetcher.py | 290 | |
| LOW | data_provider/baostock_fetcher.py | 337 | |
| LOW | data_provider/pytdx_fetcher.py | 48 | |
| LOW | data_provider/pytdx_fetcher.py | 185 | |
| LOW | data_provider/pytdx_fetcher.py | 283 | |
| LOW | data_provider/base.py | 756 | |
| LOW | data_provider/base.py | 928 | |
| LOW | data_provider/base.py | 1123 | |
| LOW | data_provider/base.py | 1431 | |
| LOW | data_provider/base.py | 1722 | |
| LOW | data_provider/base.py | 1750 | |
| LOW | data_provider/base.py | 1933 | |
| LOW | data_provider/base.py | 2002 | |
| LOW | data_provider/base.py | 2315 | |
| LOW | data_provider/base.py | 2520 | |
| LOW | scripts/generate_index_from_csv.py | 85 | |
| LOW | scripts/generate_index_from_csv.py | 393 | |
| LOW | scripts/generate_index_from_csv.py | 583 | |
| LOW | scripts/generate_stock_index.py | 101 | |
| LOW | scripts/check_env.py | 218 | |
| LOW | scripts/refresh_stock_index.py | 33 | |
| LOW | scripts/fetch_tushare_stock_list.py | 295 | |
| 120 more matches not shown… | |||
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | data_provider/yfinance_fetcher.py | 82 | 转换股票代码为 Yahoo Finance 格式 Yahoo Finance 代码格式: - A股沪市:600519.SS (Shanghai Stock Exchange) |
| HIGH | data_provider/us_index_mapping.py | 47 | 判断代码是否为美股指数符号。 Args: code: 股票/指数代码,如 'SPX', 'DJI' Returns: True 表示是已知美股指数符号,否则 False |
| HIGH | data_provider/us_index_mapping.py | 66 | 判断代码是否为美股股票符号(排除美股指数)。 美股股票代码为 1-5 个大写字母,可选 .X 后缀如 BRK.B。 美股指数(SPX、DJI 等)明确排除。 Args: code: 股票 |
| HIGH | data_provider/us_index_mapping.py | 98 | 获取美股指数的 Yahoo Finance 符号与中文名称。 Args: code: 用户输入,如 'SPX', '^GSPC', 'DJI' Returns: (yf_symb |
| HIGH | data_provider/akshare_fetcher.py | 210 | 判断代码是否为美股股票(不包括美股指数)。 委托给 us_index_mapping 模块的 is_us_stock_code()。 Args: stock_code: 股票代码 Re |
| HIGH | data_provider/base.py | 1130 | 获取日线数据(自动切换数据源) 故障切换策略: 1. 美股指数/美股股票直接路由到 YfinanceFetcher 2. 其他代码从最高优先级数据源开始尝试 |
| HIGH | api/v1/endpoints/stocks.py | 254 | 获取股票实时行情 获取指定股票的最新行情数据 Args: stock_code: 股票代码(如 600519、00700、AAPL) Returns: |
| HIGH | api/v1/endpoints/analysis.py | 233 | 触发股票分析 启动 AI 智能分析任务,支持单只或多只股票批量分析 流程: 1. 校验请求参数 2. 异步模式:检查重复 -> 提交任务队列 -> 返回 202 3. 同 |
| HIGH | api/v1/endpoints/analysis.py | 823 | 查询分析任务状态 优先从任务队列查询,如果不存在则从数据库查询历史记录 Args: task_id: 任务 ID Returns: Ta |
| HIGH | api/v1/endpoints/history.py | 198 | 获取历史报告详情 根据分析历史记录主键 ID 或 query_id 获取完整的历史分析报告。 优先尝试按主键 ID(整数)查询,若参数不是合法整数则按 query_id 查询。 Args |
| HIGH | api/v1/endpoints/history.py | 456 | 获取历史报告的 Markdown 格式内容 根据分析历史记录 ID 或 query_id 生成与推送通知格式一致的 Markdown 报告。 Args: record_id: 分析历史记录主键 |
| HIGH | src/agent/skills/base.py | 141 | Load a single Skill from a YAML file. The YAML file must contain at minimum: ``name``, ``display_name``, ``desc |
| HIGH | src/services/stock_service.py | 94 | 获取股票历史行情 Args: stock_code: 股票代码 period: K 线周期 (daily/weekly/monthly) |
| HIGH | src/services/task_queue.py | 316 | Submit a single analysis task. Args: stock_code: Stock code stock_name: Option |
| HIGH | src/services/image_stock_extractor.py | 287 | 从图片中提取股票代码及名称(使用 Vision LLM)。 优先级:Gemini -> Anthropic -> OpenAI(首个可用)。 支持多 Key 轮询与重试(最多 3 次,指数退避)。 Ar |
| HIGH | src/services/history_service.py | 354 | Delete specified analysis history records. Args: record_ids: List of history record primar |
| HIGH | src/services/history_service.py | 505 | Generate a Markdown report for a single analysis history record. This method reconstructs an AnalysisR |
| HIGH | src/services/import_parser.py | 129 | Parse file bytes (CSV/Excel) into items. Args: data: File content bytes. filename: Optional fi |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | tests/test_chip_structure_fallback.py | 218 | """When LLM returns data_perspective: null, fill should still work.""" |
| HIGH | tests/test_bot_dispatcher_async.py | 96 | content='{"intent":"analysis","codes":["600519"],"strategy":null}', |
| HIGH | data_provider/longbridge_fetcher.py | 85 | GitHub Actions sets ``LONGBRIDGE_HTTP_URL: ${{ vars.X || secrets.X }}`` |
| HIGH | scripts/check_static_assets.py | 84 | "`cd apps/dsa-web && npm install && npm run build`.", |
| HIGH | bot/dispatcher.py | 396 | {"intent":"analysis","codes":["600519","000858"],"strategy":null} |
| HIGH | bot/dispatcher.py | 402 | {"intent":"chat","codes":[],"strategy":null} |
| HIGH | bot/dispatcher.py | 405 | {"intent":"none","codes":[],"strategy":null} |
| HIGH | bot/dispatcher.py | 408 | {"intent":"analysis","codes":["600519"],"strategy":null} |
| HIGH | bot/dispatcher.py | 411 | {"intent":"analysis","codes":[],"strategy":null} |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_notification_sender.py | 941 | # Step 2: upload must send raw bytes (not multipart) to match declared length |
| LOW | tests/longbridge_live_smoke.py | 100 | # Step 1: yfinance only |
| LOW | tests/longbridge_live_smoke.py | 126 | # Step 2: Supplement from Longbridge |
| LOW | tests/test_agent_executor.py | 216 | # Step 1: LLM requests tool call |
| LOW | tests/test_agent_executor.py | 225 | # Step 2: LLM returns final text |
| LOW | data_provider/base.py | 447 | # Step 1: 获取原始数据 |
| LOW | data_provider/base.py | 453 | # Step 2: 标准化列名 |
| LOW | data_provider/base.py | 456 | # Step 3: 数据清洗 |
| LOW | data_provider/base.py | 459 | # Step 4: 计算技术指标 |
| LOW | src/core/pipeline.py | 333 | # Step 2: 获取筹码分布 - 使用统一入口,带熔断保护 |
| LOW | src/core/pipeline.py | 307 | # Step 1: 获取实时行情(量比、换手率等)- 使用统一入口,自动故障切换 |
| LOW | src/core/pipeline.py | 398 | # Step 3: 趋势分析(基于交易理念)— 在 Agent 分支之前执行,供两条路径共用 |
| LOW | src/core/pipeline.py | 433 | # Step 4: 多维度情报搜索(最新消息+风险排查+业绩预期) |
| LOW | src/core/pipeline.py | 488 | # Step 5: 获取分析上下文(技术面数据) |
| LOW | src/core/pipeline.py | 506 | # Step 6: 增强上下文数据(添加实时行情、筹码、趋势分析结果、股票名称) |
| LOW | src/core/pipeline.py | 517 | # Step 7: 调用 AI 分析(传入增强的上下文和新闻) |
| LOW | src/core/pipeline.py | 611 | # Step 8: 保存分析历史记录 |
| LOW | src/core/pipeline.py | 2074 | # Step 1: 获取并保存数据 |
| LOW | src/core/pipeline.py | 2085 | # Step 2: AI 分析 |
| LOW | src/notification_sender/telegram_sender.py | 322 | # Step 1: temporarily protect markdown links |
| LOW | src/notification_sender/telegram_sender.py | 331 | # Step 2: escape remaining special chars |
| LOW | src/notification_sender/telegram_sender.py | 335 | # Step 3: restore links |
| LOW | src/notification_sender/slack_sender.py | 186 | # Step 1: 获取上传 URL |
| LOW | src/notification_sender/slack_sender.py | 204 | # Step 2: 上传文件内容(raw body,不能用 multipart) |
| LOW | src/notification_sender/slack_sender.py | 215 | # Step 3: 完成上传并分享到频道 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| CRITICAL | bot/platforms/feishu_stream.py | 135 | response = self._client.im.v1.message.reply(request) |
| CRITICAL | bot/platforms/feishu_stream.py | 148 | response = self._client.im.v1.message.create(request) |
| CRITICAL | src/feishu_doc.py | 55 | response = self.client.docx.v1.document.create(create_request) |
| CRITICAL | src/feishu_doc.py | 87 | write_resp = self.client.docx.v1.document_block_children.create(batch_add_request) |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | data_provider/efinance_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' |
| HIGH | data_provider/tushare_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' |
| HIGH | data_provider/baostock_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' |
| HIGH | data_provider/pytdx_fetcher.py | 0 | 判断代码是否为美股 美股代码规则: - 1-5个大写字母,如 'aapl', 'tsla' - 可能包含 '.',如 'brk.b' |
| HIGH | src/agent/memory.py | 0 | compatibility wrapper for legacy strategy-based callers. |
| HIGH | src/agent/memory.py | 0 | compatibility wrapper for legacy strategy-based callers. |
| HIGH | src/agent/skills/router.py | 0 | compatibility wrapper for legacy strategy-based callers. |
| HIGH | src/services/backtest_service.py | 0 | compatibility wrapper for legacy strategy-based callers. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| HIGH | tests/test_anspire_search.py | 547 | print(" Windows PowerShell: $env:ANSPIRE_API_KEYS=\"your_api_key\"") |
| HIGH | tests/test_anspire_search.py | 548 | print(" Linux/Mac: export ANSPIRE_API_KEYS=\"your_api_key\"") |
| HIGH | tests/test_anspire_search.py | 618 | print(" Windows PowerShell: $env:ANSPIRE_API_KEYS=\"your_api_key\"") |
| HIGH | tests/test_anspire_search.py | 619 | print(" Linux/Mac: export ANSPIRE_API_KEYS=\"your_api_key\"") |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | tests/test_agent_pipeline.py | 2589 | # Create a fresh Skill with default enabled=False |
| MEDIUM | tests/test_agent_registry.py | 806 | # Create a custom directory with an overriding strategy |
| MEDIUM | tests/test_agent_registry.py | 679 | # Create an invalid YAML file (should be skipped) |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_stock_analyzer_bias.py | 161 | trend_status=TrendStatus.BULL, |
| LOW | docs/LLM_CONFIG_GUIDE.md | 41 | # Anspire Open API Keys(支持多个,逗号分隔) |
| LOW | docs/examples/litellm_config.example.yaml | 1 | # =================================== |
| LOW | docs/examples/litellm_config.example.yaml | 61 | - model_name: gemini/gemini-2.5-flash |
| LOW | docs/examples/litellm_config.example.yaml | 81 | # litellm_params: |
| LOW | scripts/test.sh | 1 | #!/bin/bash |
| LOW | src/config.py | 881 | market_review_region: str = "cn" |
| LOW | src/market_analyzer.py | 401 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | tests/test_market_analyzer_generate_text.py | 298 | |
| MEDIUM | tests/test_llm_param_recovery.py | 169 |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | src/config.py | 373 | # Check if the prefix is a known LiteLLM provider; if so, keep it. |
| Severity | File | Line | Snippet |
|---|---|---|---|
| LOW | tests/test_config_env_compat.py | 477 | "EMAIL_GROUP_1": "user@example.com", |
| LOW | tests/test_config_env_compat.py | 485 | self.assertEqual(emails, ["user@example.com"]) |
| Severity | File | Line | Snippet |
|---|---|---|---|
| MEDIUM | tests/test_agent_pipeline.py | 2506 | """Test the _safe_int helper for robust sentiment_score parsing.""" |