SYMBOL INDEX (1422 symbols across 161 files) FILE: backend/add_raw_html_column.py function add_raw_html_column (line 23) | def add_raw_html_column(): FILE: backend/app/agents/data_collector.py class DataCollectorAgent (line 19) | class DataCollectorAgent(Agent): method __init__ (line 22) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method collect_data (line 42) | async def collect_data( method _collect_news (line 103) | async def _collect_news(self, stock_code: str, stock_name: str) -> Lis... method _collect_financial (line 124) | async def _collect_financial(self, stock_code: str) -> Dict[str, Any]: method _collect_fund_flow (line 134) | async def _collect_fund_flow(self, stock_code: str) -> Dict[str, Any]: method _collect_realtime_quote (line 144) | async def _collect_realtime_quote(self, stock_code: str) -> Dict[str, ... method _generate_summary (line 154) | async def _generate_summary(self, data: Dict[str, Any]) -> str: method analyze_data_quality (line 205) | async def analyze_data_quality(self, data: Dict[str, Any]) -> Dict[str... class QuickAnalystAgent (line 257) | class QuickAnalystAgent(Agent): method __init__ (line 260) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method quick_analyze (line 275) | async def quick_analyze( FILE: backend/app/agents/data_collector_v2.py class SearchSource (line 31) | class SearchSource(str, Enum): class SearchTask (line 40) | class SearchTask(BaseModel): class SearchPlan (line 51) | class SearchPlan(BaseModel): class SearchResult (line 63) | class SearchResult(BaseModel): class DataCollectorAgentV2 (line 74) | class DataCollectorAgentV2(Agent): method __init__ (line 126) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method generate_search_plan (line 155) | async def generate_search_plan( method _create_task (line 238) | def _create_task( method _analyze_with_llm (line 280) | async def _analyze_with_llm( method _get_icon_for_source (line 347) | def _get_icon_for_source(self, source: SearchSource) -> str: method execute_search_plan (line 358) | async def execute_search_plan( method _execute_task (line 432) | async def _execute_task( method _search_akshare (line 481) | async def _search_akshare( method _search_bochaai (line 525) | async def _search_bochaai( method _search_browser (line 561) | async def _search_browser(self, query: str) -> Optional[Dict[str, Any]]: method _search_knowledge_base (line 593) | async def _search_knowledge_base( method _generate_combined_summary (line 622) | async def _generate_combined_summary( method collect_data (line 685) | async def collect_data( class QuickAnalystAgent (line 727) | class QuickAnalystAgent(Agent): method __init__ (line 730) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method quick_analyze (line 745) | async def quick_analyze( function create_data_collector (line 791) | def create_data_collector(llm_provider=None) -> DataCollectorAgentV2: FILE: backend/app/agents/debate_agents.py class BullResearcherAgent (line 26) | class BullResearcherAgent(Agent): method __init__ (line 33) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method analyze (line 53) | def analyze( method debate_round (line 133) | async def debate_round(self, prompt: str, enable_data_request: bool = ... method _summarize_news (line 166) | def _summarize_news(self, news_list: List[Dict[str, Any]]) -> str: class BearResearcherAgent (line 188) | class BearResearcherAgent(Agent): method __init__ (line 195) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method analyze (line 215) | def analyze( method _summarize_news (line 296) | def _summarize_news(self, news_list: List[Dict[str, Any]]) -> str: method debate_round (line 317) | async def debate_round(self, prompt: str, enable_data_request: bool = ... class InvestmentManagerAgent (line 351) | class InvestmentManagerAgent(Agent): method __init__ (line 358) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method make_decision (line 378) | def make_decision( method _extract_rating (line 501) | def _extract_rating(self, text: str) -> str: class DebateWorkflow (line 512) | class DebateWorkflow: method __init__ (line 518) | def __init__(self, llm_provider=None): method run_debate (line 528) | async def run_debate( method _log_step (line 629) | def _log_step(self, step_name: str, data: Dict[str, Any]): function create_debate_workflow (line 641) | def create_debate_workflow(llm_provider=None) -> DebateWorkflow: FILE: backend/app/agents/news_analyst.py class NewsAnalystAgent (line 15) | class NewsAnalystAgent(Agent): method __init__ (line 21) | def __init__( method _init_executor (line 67) | def _init_executor(self, llm_provider=None, tools=None): method executor (line 83) | def executor(self): method analyze_news (line 89) | def analyze_news( method _repair_markdown_table (line 264) | def _repair_markdown_table(self, text: str) -> str: method _extract_structured_info (line 325) | def _extract_structured_info(self, analysis_text: str) -> Dict[str, Any]: method batch_analyze (line 420) | def batch_analyze( function create_news_analyst (line 455) | def create_news_analyst( FILE: backend/app/agents/orchestrator.py class DebatePhase (line 22) | class DebatePhase(Enum): class DebateEvent (line 33) | class DebateEvent: method __init__ (line 35) | def __init__( method to_dict (line 52) | def to_dict(self) -> Dict[str, Any]: class DebateOrchestrator (line 64) | class DebateOrchestrator: method __init__ (line 67) | def __init__( method _get_search_analyst (line 109) | def _get_search_analyst(self): method on_event (line 116) | def on_event(self, callback: Callable[[DebateEvent], None]): method _emit_event (line 120) | def _emit_event(self, event: DebateEvent): method interrupt (line 129) | def interrupt(self, reason: str = "manager_decision"): method run (line 140) | async def run( method _run_parallel_mode (line 200) | async def _run_parallel_mode( method _run_realtime_debate_mode (line 296) | async def _run_realtime_debate_mode( method _process_speech_for_search (line 618) | async def _process_speech_for_search( method _run_quick_mode (line 681) | async def _run_quick_mode( method _prepare_news_summary (line 720) | def _prepare_news_summary(self, news_list: List[Dict[str, Any]]) -> str: method _build_debate_prompt (line 736) | def _build_debate_prompt( method _format_debate_history (line 783) | def _format_debate_history(self, history: List[Dict]) -> str: method _check_manager_interrupt (line 797) | async def _check_manager_interrupt( method _check_manager_interrupt_or_search (line 822) | async def _check_manager_interrupt_or_search( function create_orchestrator (line 899) | def create_orchestrator( FILE: backend/app/agents/quantitative_agent.py class QuantitativeAgent (line 23) | class QuantitativeAgent: method __init__ (line 39) | def __init__( method _init_alpha_mining (line 63) | def _init_alpha_mining(self): method analyze (line 106) | async def analyze( method _mine_factors (line 170) | async def _mine_factors( method _technical_analysis (line 256) | async def _technical_analysis( method _generate_strategy (line 309) | async def _generate_strategy( method _summarize_market_data (line 372) | def _summarize_market_data(self, market_data: Dict[str, Any]) -> str: method evaluate_factor (line 389) | async def evaluate_factor( method get_best_factors (line 444) | def get_best_factors(self, top_k: int = 5) -> List[Dict[str, Any]]: function create_quantitative_agent (line 454) | def create_quantitative_agent( FILE: backend/app/agents/search_analyst.py class SearchSource (line 26) | class SearchSource(Enum): class SearchAnalystAgent (line 35) | class SearchAnalystAgent(Agent): method __init__ (line 50) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method extract_search_requests (line 79) | def extract_search_requests(self, text: str) -> List[Dict[str, Any]]: method search (line 115) | async def search( method _search_akshare (line 181) | async def _search_akshare( method _search_bochaai (line 237) | async def _search_bochaai( method _search_browser (line 278) | async def _search_browser(self, query: str) -> Optional[Dict[str, Any]]: method _search_knowledge_base (line 310) | async def _search_knowledge_base( method _generate_summary (line 346) | async def _generate_summary(self, query: str, data: Dict[str, Any]) ->... method process_debate_speech (line 403) | async def process_debate_speech( method smart_data_supplement (line 476) | async def smart_data_supplement( method _format_debate_history (line 542) | def _format_debate_history(self, history: List[Dict[str, Any]]) -> str: function create_search_analyst (line 557) | def create_search_analyst(llm_provider=None) -> SearchAnalystAgent: FILE: backend/app/alpha_mining/backtest/evaluator.py class FactorEvaluator (line 25) | class FactorEvaluator: method __init__ (line 41) | def __init__( method evaluate (line 59) | def evaluate( method _evaluate_single (line 101) | def _evaluate_single( method _factor_to_signal (line 145) | def _factor_to_signal(self, factor: np.ndarray) -> np.ndarray: method _signal_to_position (line 157) | def _signal_to_position(self, signal: np.ndarray) -> np.ndarray: method _calc_sortino (line 169) | def _calc_sortino(self, returns: np.ndarray) -> float: method _calc_sharpe (line 186) | def _calc_sharpe(self, returns: np.ndarray) -> float: method _calc_ic (line 194) | def _calc_ic(self, factor: np.ndarray, returns: np.ndarray) -> float: method _calc_rank_ic (line 209) | def _calc_rank_ic(self, factor: np.ndarray, returns: np.ndarray) -> fl... method _calc_max_drawdown (line 226) | def _calc_max_drawdown(self, returns: np.ndarray) -> float: method get_reward (line 235) | def get_reward( method compare_factors (line 267) | def compare_factors( method rank_factors (line 293) | def rank_factors( FILE: backend/app/alpha_mining/config.py class AlphaMiningConfig (line 16) | class AlphaMiningConfig: method torch_device (line 65) | def torch_device(self) -> torch.device: method all_features (line 70) | def all_features(self) -> List[str]: method num_features (line 78) | def num_features(self) -> int: FILE: backend/app/alpha_mining/dsl/ops.py function ts_delay (line 22) | def ts_delay(x: torch.Tensor, d: int = 1) -> torch.Tensor: function ts_delta (line 43) | def ts_delta(x: torch.Tensor, d: int = 1) -> torch.Tensor: function ts_mean (line 57) | def ts_mean(x: torch.Tensor, window: int = 5) -> torch.Tensor: function ts_std (line 83) | def ts_std(x: torch.Tensor, window: int = 5) -> torch.Tensor: function _op_gate (line 108) | def _op_gate(condition: torch.Tensor, x: torch.Tensor, y: torch.Tensor) ... function _op_jump (line 118) | def _op_jump(x: torch.Tensor) -> torch.Tensor: function _op_decay (line 130) | def _op_decay(x: torch.Tensor) -> torch.Tensor: function _op_max3 (line 139) | def _op_max3(x: torch.Tensor) -> torch.Tensor: function get_op_names (line 189) | def get_op_names() -> List[str]: function get_op_by_name (line 194) | def get_op_by_name(name: str) -> Tuple[Callable, int]: function get_num_ops (line 213) | def get_num_ops() -> int: FILE: backend/app/alpha_mining/dsl/vocab.py class FactorVocab (line 32) | class FactorVocab: method __post_init__ (line 48) | def __post_init__(self): method vocab_size (line 62) | def vocab_size(self) -> int: method num_features (line 67) | def num_features(self) -> int: method num_ops (line 72) | def num_ops(self) -> int: method feature_offset (line 77) | def feature_offset(self) -> int: method token_to_name (line 81) | def token_to_name(self, token: int) -> str: method name_to_token (line 98) | def name_to_token(self, name: str) -> int: method is_feature (line 115) | def is_feature(self, token: int) -> bool: method is_operator (line 119) | def is_operator(self, token: int) -> bool: method get_operator_arity (line 123) | def get_operator_arity(self, token: int) -> int: method get_operator_func (line 142) | def get_operator_func(self, token: int): method get_all_tokens (line 161) | def get_all_tokens(self) -> List[int]: method get_feature_tokens (line 165) | def get_feature_tokens(self) -> List[int]: method get_operator_tokens (line 169) | def get_operator_tokens(self) -> List[int]: method __repr__ (line 173) | def __repr__(self) -> str: FILE: backend/app/alpha_mining/features/market.py class MarketFeatureBuilder (line 24) | class MarketFeatureBuilder: method __init__ (line 43) | def __init__( method build (line 58) | def build( method _build_from_dataframe (line 84) | def _build_from_dataframe( method _build_from_tensors (line 142) | def _build_from_tensors( method _calc_returns (line 194) | def _calc_returns(self, close: torch.Tensor) -> torch.Tensor: method _calc_volatility (line 208) | def _calc_volatility(self, returns: torch.Tensor, window: int) -> torc... method _calc_pct_change (line 224) | def _calc_pct_change(self, x: torch.Tensor) -> torch.Tensor: method _robust_normalize (line 237) | def _robust_normalize(self, features: torch.Tensor) -> torch.Tensor: method get_feature_names (line 261) | def get_feature_names(self) -> List[str]: method build_batch (line 265) | def build_batch( FILE: backend/app/alpha_mining/features/sentiment.py class SentimentFeatureBuilder (line 27) | class SentimentFeatureBuilder: method __init__ (line 46) | def __init__( method build (line 61) | def build( method _parse_dataframe (line 116) | def _parse_dataframe(self, df: pd.DataFrame): method _parse_dict (line 140) | def _parse_dict(self, data: Dict[str, Any]): method _parse_list (line 150) | def _parse_list(self, data: List[Dict]): method _align_time_steps (line 163) | def _align_time_steps(self, x: torch.Tensor, target_len: int) -> torch... method _apply_decay (line 177) | def _apply_decay(self, sentiment: torch.Tensor) -> torch.Tensor: method _normalize (line 194) | def _normalize(self, features: torch.Tensor) -> torch.Tensor: method get_feature_names (line 209) | def get_feature_names(self) -> List[str]: method build_from_finnews (line 213) | def build_from_finnews( method _generate_mock_sentiment (line 258) | def _generate_mock_sentiment( method combine_with_market (line 279) | def combine_with_market( FILE: backend/app/alpha_mining/model/alpha_generator.py class AlphaGenerator (line 28) | class AlphaGenerator(nn.Module): method __init__ (line 44) | def __init__( method _init_weights (line 93) | def _init_weights(self): method forward (line 104) | def forward( method generate (line 143) | def generate( method generate_with_training (line 203) | def generate_with_training( method save (line 255) | def save(self, path: str): method load (line 266) | def load(cls, path: str, vocab: Optional[FactorVocab] = None) -> 'Alph... FILE: backend/app/alpha_mining/model/trainer.py class AlphaTrainer (line 31) | class AlphaTrainer: method __init__ (line 44) | def __init__( method _default_evaluator (line 78) | def _default_evaluator(self, factor: torch.Tensor, returns: torch.Tens... method train_step (line 106) | def train_step( method train (line 202) | def train( method _save_checkpoint (line 274) | def _save_checkpoint(self): method get_best_formula (line 294) | def get_best_formula(self) -> Optional[str]: method get_training_history (line 298) | def get_training_history(self) -> List[Dict[str, Any]]: FILE: backend/app/alpha_mining/tools/alpha_mining_tool.py class AlphaMiningTool (line 43) | class AlphaMiningTool(BaseTool[Dict[str, Any]]): method __init__ (line 64) | def __init__( method _setup_parameters (line 115) | def _setup_parameters(self) -> None: method execute (line 179) | def execute(self, parameters: Dict[str, Any], context: ToolContext) ->... method aexecute (line 221) | async def aexecute(self, parameters: Dict[str, Any], context: ToolCont... method _action_mine (line 226) | def _action_mine(self, params: Dict[str, Any], context: ToolContext) -... method _action_evaluate (line 277) | def _action_evaluate(self, params: Dict[str, Any], context: ToolContex... method _action_generate (line 316) | def _action_generate(self, params: Dict[str, Any], context: ToolContex... method _action_list (line 354) | def _action_list(self, params: Dict[str, Any], context: ToolContext) -... method _prepare_features (line 367) | def _prepare_features( method _parse_formula (line 405) | def _parse_formula(self, formula_str: str) -> Optional[List[int]]: FILE: backend/app/alpha_mining/utils.py function generate_mock_data (line 17) | def generate_mock_data( function _rolling_std (line 99) | def _rolling_std(x: torch.Tensor, window: int = 20) -> torch.Tensor: function _pct_change (line 123) | def _pct_change(x: torch.Tensor) -> torch.Tensor: function _robust_normalize (line 140) | def _robust_normalize(x: torch.Tensor) -> torch.Tensor: function set_random_seed (line 165) | def set_random_seed(seed: int): function get_device (line 173) | def get_device() -> torch.device: FILE: backend/app/alpha_mining/vm/factor_vm.py class FactorVM (line 25) | class FactorVM: method __init__ (line 38) | def __init__(self, vocab: Optional[FactorVocab] = None): method execute (line 47) | def execute( method decode (line 126) | def decode(self, formula: List[int]) -> str: method validate (line 184) | def validate(self, formula: List[int]) -> bool: method get_required_features (line 218) | def get_required_features(self, formula: List[int]) -> List[int]: FILE: backend/app/api/v1/agents.py function get_prompts (line 34) | def get_prompts(language: str = "zh") -> Dict[str, str]: class DebateRequest (line 209) | class DebateRequest(BaseModel): class DebateResponse (line 220) | class DebateResponse(BaseModel): class AgentLogEntry (line 237) | class AgentLogEntry(BaseModel): class AgentMetrics (line 249) | class AgentMetrics(BaseModel): class TrajectoryStep (line 259) | class TrajectoryStep(BaseModel): class SearchPlanRequest (line 271) | class SearchPlanRequest(BaseModel): class SearchExecuteRequest (line 278) | class SearchExecuteRequest(BaseModel): function run_stock_debate (line 286) | async def run_stock_debate( function generate_debate_stream (line 477) | async def generate_debate_stream( function run_stock_debate_stream (line 848) | async def run_stock_debate_stream( class FollowUpRequest (line 926) | class FollowUpRequest(BaseModel): function generate_followup_stream (line 935) | async def generate_followup_stream( function debate_followup (line 1019) | async def debate_followup(request: FollowUpRequest): function execute_search (line 1105) | async def execute_search(request: SearchExecuteRequest): function get_debate_result (line 1147) | async def get_debate_result(debate_id: str): function get_agent_logs (line 1172) | async def get_agent_logs( function get_agent_metrics (line 1202) | async def get_agent_metrics(): function get_debate_trajectory (line 1272) | async def get_debate_trajectory(debate_id: str): function clear_logs (line 1301) | async def clear_logs(): function get_available_agents (line 1312) | async def get_available_agents(): class DebateHistoryRequest (line 1368) | class DebateHistoryRequest(BaseModel): class DebateHistoryResponse (line 1374) | class DebateHistoryResponse(BaseModel): function get_debate_history (line 1383) | async def get_debate_history( function save_debate_history (line 1438) | async def save_debate_history( function delete_debate_history (line 1531) | async def delete_debate_history( FILE: backend/app/api/v1/alpha_mining.py class MineRequest (line 43) | class MineRequest(BaseModel): class EvaluateRequest (line 51) | class EvaluateRequest(BaseModel): class GenerateRequest (line 57) | class GenerateRequest(BaseModel): class FactorResponse (line 63) | class FactorResponse(BaseModel): class MineResponse (line 73) | class MineResponse(BaseModel): class EvaluateResponse (line 81) | class EvaluateResponse(BaseModel): class GenerateResponse (line 89) | class GenerateResponse(BaseModel): class TaskStatusResponse (line 97) | class TaskStatusResponse(BaseModel): class SentimentCompareRequest (line 108) | class SentimentCompareRequest(BaseModel): class SentimentCompareResponse (line 114) | class SentimentCompareResponse(BaseModel): class AgentDemoRequest (line 122) | class AgentDemoRequest(BaseModel): class AgentDemoResponse (line 129) | class AgentDemoResponse(BaseModel): function _get_alpha_mining_components (line 144) | def _get_alpha_mining_components(): function _run_mining_task (line 179) | async def _run_mining_task(task_id: str, request: MineRequest): function mine_factors (line 254) | async def mine_factors( function mine_factors_stream (line 285) | async def mine_factors_stream(request: MineRequest): function compare_sentiment_effect (line 406) | async def compare_sentiment_effect(request: SentimentCompareRequest): function agent_alpha_mining_demo (line 481) | async def agent_alpha_mining_demo(request: AgentDemoRequest): function evaluate_factor (line 566) | async def evaluate_factor(request: EvaluateRequest): function generate_factors (line 642) | async def generate_factors(request: GenerateRequest): function get_factors (line 700) | async def get_factors( function get_task_status (line 727) | async def get_task_status(task_id: str): function get_operators (line 748) | async def get_operators(): function delete_task (line 775) | async def delete_task(task_id: str): FILE: backend/app/api/v1/analysis.py class AnalysisRequest (line 22) | class AnalysisRequest(BaseModel): class AnalysisResponse (line 28) | class AnalysisResponse(BaseModel): class AnalysisDetailResponse (line 41) | class AnalysisDetailResponse(BaseModel): class BatchAnalyzeRequest (line 58) | class BatchAnalyzeRequest(BaseModel): class BatchAnalyzeResponse (line 65) | class BatchAnalyzeResponse(BaseModel): function run_analysis_task (line 76) | async def run_analysis_task(news_id: int, db: AsyncSession): function batch_analyze_news (line 93) | async def batch_analyze_news( function analyze_news (line 186) | async def analyze_news( function get_news_analyses (line 251) | async def get_news_analyses( function get_analysis_detail (line 272) | async def get_analysis_detail( FILE: backend/app/api/v1/debug.py class CrawlRequest (line 16) | class CrawlRequest(BaseModel): class CrawlResponse (line 21) | class CrawlResponse(BaseModel): function extract_chinese_ratio (line 31) | def extract_chinese_ratio(text: str) -> float: function clean_text (line 40) | def clean_text(text: str) -> str: function is_noise_text (line 48) | def is_noise_text(text: str) -> bool: function extract_content_from_html (line 78) | def extract_content_from_html(html: str, url: str) -> tuple[str, str, di... function debug_crawl (line 158) | async def debug_crawl(request: CrawlRequest): function test_sina_crawl (line 194) | async def test_sina_crawl(): FILE: backend/app/api/v1/knowledge_graph.py class CompanyGraphResponse (line 17) | class CompanyGraphResponse(BaseModel): class BuildGraphRequest (line 31) | class BuildGraphRequest(BaseModel): class BuildGraphResponse (line 36) | class BuildGraphResponse(BaseModel): class UpdateGraphRequest (line 43) | class UpdateGraphRequest(BaseModel): class GraphStatsResponse (line 49) | class GraphStatsResponse(BaseModel): function get_company_graph (line 60) | async def get_company_graph(stock_code: str): function build_company_graph (line 120) | async def build_company_graph( function update_company_graph (line 201) | async def update_company_graph( function delete_company_graph (line 298) | async def delete_company_graph(stock_code: str): function get_graph_stats (line 326) | async def get_graph_stats(): FILE: backend/app/api/v1/llm_config.py class ModelInfo (line 17) | class ModelInfo(BaseModel): class ProviderInfo (line 24) | class ProviderInfo(BaseModel): class LLMConfigResponse (line 33) | class LLMConfigResponse(BaseModel): function parse_models (line 40) | def parse_models(models_str: str, provider_label: str) -> List[ModelInfo]: function get_llm_config (line 67) | async def get_llm_config(): FILE: backend/app/api/v1/news.py class NewsResponse (line 22) | class NewsResponse(BaseModel): class CrawlRequest (line 37) | class CrawlRequest(BaseModel): class CrawlResponse (line 44) | class CrawlResponse(BaseModel): class BatchDeleteRequest (line 53) | class BatchDeleteRequest(BaseModel): class BatchDeleteResponse (line 58) | class BatchDeleteResponse(BaseModel): function crawl_and_save_news_sync (line 66) | def crawl_and_save_news_sync( function crawl_news (line 156) | async def crawl_news( function refresh_news (line 190) | async def refresh_news( function get_news_list (line 220) | async def get_news_list( function get_latest_news (line 252) | async def get_latest_news( function get_news_detail (line 282) | async def get_news_detail( function batch_delete_news (line 310) | async def batch_delete_news( function delete_news (line 361) | async def delete_news( FILE: backend/app/api/v1/news_v2.py class NewsDataResponse (line 29) | class NewsDataResponse(BaseModel): class FetchNewsResponse (line 43) | class FetchNewsResponse(BaseModel): class ProviderInfoResponse (line 53) | class ProviderInfoResponse(BaseModel): function fetch_news_realtime (line 63) | async def fetch_news_realtime( function list_providers (line 147) | async def list_providers(): function test_provider (line 172) | async def test_provider( FILE: backend/app/api/v1/stocks.py class StockInfo (line 30) | class StockInfo(BaseModel): class StockNewsItem (line 43) | class StockNewsItem(BaseModel): class SentimentTrendPoint (line 55) | class SentimentTrendPoint(BaseModel): class StockOverview (line 65) | class StockOverview(BaseModel): class KLineDataPoint (line 77) | class KLineDataPoint(BaseModel): class StockSearchResult (line 97) | class StockSearchResult(BaseModel): function search_stocks_realtime (line 107) | async def search_stocks_realtime( class StockInitResponse (line 148) | class StockInitResponse(BaseModel): function init_stock_data (line 156) | async def init_stock_data( function get_stock_count (line 219) | async def get_stock_count(db: AsyncSession = Depends(get_db)): function get_stock_overview (line 232) | async def get_stock_overview( function get_stock_news (line 337) | async def get_stock_news( function delete_stock_news (line 415) | async def delete_stock_news( function get_sentiment_trend (line 473) | async def get_sentiment_trend( function get_kline_data (line 544) | async def get_kline_data( class RealtimeQuote (line 584) | class RealtimeQuote(BaseModel): function get_realtime_quote (line 600) | async def get_realtime_quote( function search_stocks_db (line 620) | async def search_stocks_db( class TargetedCrawlRequest (line 649) | class TargetedCrawlRequest(BaseModel): class TargetedCrawlResponse (line 655) | class TargetedCrawlResponse(BaseModel): class TargetedCrawlStatus (line 663) | class TargetedCrawlStatus(BaseModel): function start_targeted_crawl (line 678) | async def start_targeted_crawl( function get_targeted_crawl_status (line 755) | async def get_targeted_crawl_status( function cancel_targeted_crawl (line 826) | async def cancel_targeted_crawl( function clear_stock_data_cache (line 888) | async def clear_stock_data_cache( FILE: backend/app/api/v1/tasks.py class TaskResponse (line 22) | class TaskResponse(BaseModel): class ColdStartRequest (line 45) | class ColdStartRequest(BaseModel): class ColdStartResponse (line 52) | class ColdStartResponse(BaseModel): class RealtimeCrawlRequest (line 60) | class RealtimeCrawlRequest(BaseModel): class RealtimeCrawlResponse (line 66) | class RealtimeCrawlResponse(BaseModel): function get_tasks_list (line 75) | async def get_tasks_list( function get_task_detail (line 111) | async def get_task_detail( function trigger_cold_start (line 139) | async def trigger_cold_start( function trigger_realtime_crawl (line 176) | async def trigger_realtime_crawl( function get_task_stats (line 213) | async def get_task_stats( function delete_task (line 258) | async def delete_task( FILE: backend/app/config/__init__.py class AgentConfig (line 15) | class AgentConfig(BaseModel): class FlowStep (line 22) | class FlowStep(BaseModel): class FlowConfig (line 32) | class FlowConfig(BaseModel): class ModeRules (line 38) | class ModeRules(BaseModel): class DebateRules (line 51) | class DebateRules(BaseModel): class DebateModeConfig (line 59) | class DebateModeConfig(BaseModel): class LLMConfig (line 70) | class LLMConfig(BaseModel): class DataSourceConfig (line 78) | class DataSourceConfig(BaseModel): class DataSourcesConfig (line 84) | class DataSourcesConfig(BaseModel): class OutputConfig (line 90) | class OutputConfig(BaseModel): class GlobalConfig (line 97) | class GlobalConfig(BaseModel): class DebateModesConfig (line 104) | class DebateModesConfig(BaseModel): function load_debate_modes_config (line 113) | def load_debate_modes_config() -> DebateModesConfig: function get_mode_config (line 130) | def get_mode_config(mode_name: str) -> Optional[DebateModeConfig]: function get_available_modes (line 136) | def get_available_modes() -> List[Dict[str, Any]]: function get_default_mode (line 151) | def get_default_mode() -> str: function get_cached_config (line 161) | def get_cached_config() -> DebateModesConfig: function reload_config (line 169) | def reload_config() -> DebateModesConfig: FILE: backend/app/core/config.py class Settings (line 10) | class Settings(BaseSettings): method DATABASE_URL (line 36) | def DATABASE_URL(self) -> str: method SYNC_DATABASE_URL (line 44) | def SYNC_DATABASE_URL(self) -> str: method REDIS_URL (line 58) | def REDIS_URL(self) -> str: function get_settings (line 187) | def get_settings() -> Settings: FILE: backend/app/core/database.py function get_db (line 14) | async def get_db() -> AsyncGenerator[AsyncSession, None]: function init_database (line 37) | def init_database(): FILE: backend/app/core/neo4j_client.py class Neo4jClient (line 15) | class Neo4jClient: method __init__ (line 18) | def __init__( method connect (line 39) | def connect(self): method close (line 57) | def close(self): method session (line 65) | def session(self): method execute_query (line 76) | def execute_query( method execute_write (line 95) | def execute_write( method is_connected (line 114) | def is_connected(self) -> bool: method health_check (line 118) | def health_check(self) -> bool: function get_neo4j_client (line 136) | def get_neo4j_client() -> Neo4jClient: function close_neo4j_client (line 145) | def close_neo4j_client(): FILE: backend/app/core/redis_client.py class RedisClient (line 15) | class RedisClient: method __init__ (line 18) | def __init__(self): method is_available (line 36) | def is_available(self) -> bool: method get_json (line 46) | def get_json(self, key: str) -> Optional[Any]: method set_json (line 59) | def set_json(self, key: str, value: Any, ttl: int = None) -> bool: method get (line 75) | def get(self, key: str) -> Optional[str]: method set (line 86) | def set(self, key: str, value: str, ttl: int = None) -> bool: method delete (line 101) | def delete(self, key: str) -> bool: method exists (line 113) | def exists(self, key: str) -> bool: method get_cache_metadata (line 124) | def get_cache_metadata(self, key: str) -> Optional[dict]: method set_with_metadata (line 139) | def set_with_metadata(self, key: str, value: Any, ttl: int = None) -> ... method clear_pattern (line 147) | def clear_pattern(self, pattern: str) -> int: FILE: backend/app/financial/models/news.py class NewsSentiment (line 22) | class NewsSentiment(str, Enum): class NewsQueryParams (line 29) | class NewsQueryParams(BaseModel): class Config (line 67) | class Config: class NewsData (line 77) | class NewsData(BaseModel): class Config (line 136) | class Config: method generate_id (line 155) | def generate_id(url: str) -> str: method to_legacy_dict (line 159) | def to_legacy_dict(self) -> dict: FILE: backend/app/financial/models/stock.py class KlineInterval (line 18) | class KlineInterval(str, Enum): class AdjustType (line 30) | class AdjustType(str, Enum): class StockQueryParams (line 37) | class StockQueryParams(BaseModel): class Config (line 63) | class Config: class StockPriceData (line 74) | class StockPriceData(BaseModel): class Config (line 94) | class Config: method to_legacy_dict (line 99) | def to_legacy_dict(self) -> dict: class StockRealtimeData (line 122) | class StockRealtimeData(BaseModel): class StockFinancialData (line 138) | class StockFinancialData(BaseModel): FILE: backend/app/financial/providers/base.py class ProviderInfo (line 25) | class ProviderInfo: class BaseFetcher (line 47) | class BaseFetcher(ABC, Generic[QueryT, DataT]): method __init__ (line 74) | def __init__(self): method transform_query (line 80) | def transform_query(self, params: QueryT) -> Dict[str, Any]: method extract_data (line 97) | async def extract_data(self, query: Dict[str, Any]) -> Any: method transform_data (line 116) | def transform_data(self, raw_data: Any, query: QueryT) -> List[DataT]: method fetch (line 129) | async def fetch(self, params: QueryT) -> List[DataT]: method fetch_sync (line 159) | def fetch_sync(self, params: QueryT) -> List[DataT]: class BaseProvider (line 173) | class BaseProvider(ABC): method info (line 192) | def info(self) -> ProviderInfo: method fetchers (line 198) | def fetchers(self) -> Dict[str, Type[BaseFetcher]]: method get_fetcher (line 208) | def get_fetcher(self, data_type: str) -> Optional[BaseFetcher]: method supports (line 223) | def supports(self, data_type: str) -> bool: method __repr__ (line 235) | def __repr__(self) -> str: FILE: backend/app/financial/providers/eastmoney/fetchers/news.py class EastmoneyNewsFetcher (line 19) | class EastmoneyNewsFetcher(BaseFetcher): method transform_query (line 36) | def transform_query(self, params: NewsQueryParams) -> Dict[str, Any]: method extract_data (line 45) | def extract_data(self, query: Dict[str, Any]) -> List[Dict[str, Any]]: method transform_data (line 81) | def transform_data( method _extract_news_links (line 125) | def _extract_news_links(self, soup: BeautifulSoup) -> List[Dict[str, s... method _fetch_news_detail (line 148) | def _fetch_news_detail(self, link_info: Dict[str, str]) -> Optional[Di... method _extract_content (line 177) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 200) | def _extract_publish_time(self, soup: BeautifulSoup) -> datetime: method _parse_time_string (line 213) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 223) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: method _extract_stock_codes (line 235) | def _extract_stock_codes(self, text: str) -> List[str]: method _clean_text (line 257) | def _clean_text(self, text: str) -> str: FILE: backend/app/financial/providers/eastmoney/provider.py class EastmoneyProvider (line 10) | class EastmoneyProvider(BaseProvider): method info (line 19) | def info(self) -> ProviderInfo: method fetchers (line 30) | def fetchers(self) -> Dict[str, Type[BaseFetcher]]: FILE: backend/app/financial/providers/nbd/fetchers/news.py class NbdNewsFetcher (line 19) | class NbdNewsFetcher(BaseFetcher): method transform_query (line 36) | def transform_query(self, params: NewsQueryParams) -> Dict[str, Any]: method extract_data (line 45) | def extract_data(self, query: Dict[str, Any]) -> List[Dict[str, Any]]: method transform_data (line 76) | def transform_data( method _extract_news_links (line 120) | def _extract_news_links(self, soup: BeautifulSoup) -> List[Dict[str, s... method _fetch_news_detail (line 142) | def _fetch_news_detail(self, link_info: Dict[str, str]) -> Optional[Di... method _extract_content (line 171) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 203) | def _extract_publish_time(self, soup: BeautifulSoup) -> datetime: method _parse_time_string (line 214) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 224) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: method _extract_stock_codes (line 234) | def _extract_stock_codes(self, text: str) -> List[str]: method _clean_text (line 256) | def _clean_text(self, text: str) -> str: FILE: backend/app/financial/providers/nbd/provider.py class NbdProvider (line 10) | class NbdProvider(BaseProvider): method info (line 19) | def info(self) -> ProviderInfo: method fetchers (line 30) | def fetchers(self) -> Dict[str, Type[BaseFetcher]]: FILE: backend/app/financial/providers/netease/fetchers/news.py class NeteaseNewsFetcher (line 19) | class NeteaseNewsFetcher(BaseFetcher): method transform_query (line 36) | def transform_query(self, params: NewsQueryParams) -> Dict[str, Any]: method extract_data (line 45) | def extract_data(self, query: Dict[str, Any]) -> List[Dict[str, Any]]: method transform_data (line 81) | def transform_data( method _extract_news_links (line 125) | def _extract_news_links(self, soup: BeautifulSoup) -> List[Dict[str, s... method _fetch_news_detail (line 148) | def _fetch_news_detail(self, link_info: Dict[str, str]) -> Optional[Di... method _extract_content (line 177) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 200) | def _extract_publish_time(self, soup: BeautifulSoup) -> datetime: method _parse_time_string (line 211) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 221) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: method _extract_stock_codes (line 233) | def _extract_stock_codes(self, text: str) -> List[str]: method _clean_text (line 255) | def _clean_text(self, text: str) -> str: FILE: backend/app/financial/providers/netease/provider.py class NeteaseProvider (line 10) | class NeteaseProvider(BaseProvider): method info (line 19) | def info(self) -> ProviderInfo: method fetchers (line 30) | def fetchers(self) -> Dict[str, Type[BaseFetcher]]: FILE: backend/app/financial/providers/sina/fetchers/news.py class SinaNewsFetcher (line 33) | class SinaNewsFetcher(BaseFetcher[NewsQueryParams, NewsData]): method __init__ (line 68) | def __init__(self): method _get_session (line 72) | def _get_session(self): method transform_query (line 82) | def transform_query(self, params: NewsQueryParams) -> Dict[str, Any]: method extract_data (line 112) | async def extract_data(self, query: Dict[str, Any]) -> List[Dict]: method _crawl_page (line 144) | async def _crawl_page(self, url: str, max_items: int) -> List[Dict]: method _fetch_page_sync (line 185) | def _fetch_page_sync(self, url: str): method _extract_news_links (line 196) | def _extract_news_links(self, soup: BeautifulSoup) -> List[str]: method _crawl_news_detail (line 211) | async def _crawl_news_detail(self, url: str) -> Optional[Dict]: method transform_data (line 256) | def transform_data( method _normalize_symbol (line 295) | def _normalize_symbol(self, code: str) -> str: method _extract_title (line 305) | def _extract_title(self, soup: BeautifulSoup) -> Optional[str]: method _extract_meta (line 319) | def _extract_meta(self, soup: BeautifulSoup) -> tuple: method _extract_date (line 335) | def _extract_date(self, soup: BeautifulSoup) -> Optional[datetime]: method _parse_date (line 349) | def _parse_date(self, date_text: str) -> Optional[datetime]: method _extract_stock_codes (line 364) | def _extract_stock_codes(self, soup: BeautifulSoup) -> List[str]: method _extract_content (line 375) | def _extract_content(self, soup: BeautifulSoup) -> str: method _is_noise_text (line 417) | def _is_noise_text(self, text: str) -> bool: method _extract_chinese_ratio (line 425) | def _extract_chinese_ratio(self, text: str) -> float: FILE: backend/app/financial/providers/sina/provider.py class SinaProvider (line 10) | class SinaProvider(BaseProvider): method info (line 19) | def info(self) -> ProviderInfo: method fetchers (line 30) | def fetchers(self) -> Dict[str, Type[BaseFetcher]]: FILE: backend/app/financial/providers/tencent/fetchers/news.py class TencentNewsFetcher (line 22) | class TencentNewsFetcher(BaseFetcher): method transform_query (line 39) | def transform_query(self, params: NewsQueryParams) -> Dict[str, Any]: method extract_data (line 50) | def extract_data(self, query: Dict[str, Any]) -> List[Dict[str, Any]]: method transform_data (line 88) | def transform_data( method _extract_news_links (line 138) | def _extract_news_links(self, soup: BeautifulSoup) -> List[Dict[str, s... method _fetch_news_detail (line 157) | def _fetch_news_detail(self, link_info: Dict[str, str]) -> Optional[Di... method _extract_content (line 186) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 209) | def _extract_publish_time(self, soup: BeautifulSoup) -> datetime: method _parse_time_string (line 233) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 255) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: method _extract_stock_codes (line 266) | def _extract_stock_codes(self, text: str) -> List[str]: method _clean_text (line 288) | def _clean_text(self, text: str) -> str: FILE: backend/app/financial/providers/tencent/provider.py class TencentProvider (line 10) | class TencentProvider(BaseProvider): method info (line 19) | def info(self) -> ProviderInfo: method fetchers (line 30) | def fetchers(self) -> Dict[str, Type[BaseFetcher]]: FILE: backend/app/financial/providers/yicai/fetchers/news.py class YicaiNewsFetcher (line 19) | class YicaiNewsFetcher(BaseFetcher): method transform_query (line 36) | def transform_query(self, params: NewsQueryParams) -> Dict[str, Any]: method extract_data (line 45) | def extract_data(self, query: Dict[str, Any]) -> List[Dict[str, Any]]: method transform_data (line 76) | def transform_data( method _extract_news_links (line 120) | def _extract_news_links(self, soup: BeautifulSoup) -> List[Dict[str, s... method _fetch_news_detail (line 142) | def _fetch_news_detail(self, link_info: Dict[str, str]) -> Optional[Di... method _extract_content (line 171) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 194) | def _extract_publish_time(self, soup: BeautifulSoup) -> datetime: method _parse_time_string (line 207) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 217) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: method _extract_stock_codes (line 227) | def _extract_stock_codes(self, text: str) -> List[str]: method _clean_text (line 249) | def _clean_text(self, text: str) -> str: FILE: backend/app/financial/providers/yicai/provider.py class YicaiProvider (line 10) | class YicaiProvider(BaseProvider): method info (line 19) | def info(self) -> ProviderInfo: method fetchers (line 30) | def fetchers(self) -> Dict[str, Type[BaseFetcher]]: FILE: backend/app/financial/registry.py class ProviderNotFoundError (line 21) | class ProviderNotFoundError(Exception): class FetcherNotFoundError (line 26) | class FetcherNotFoundError(Exception): class ProviderRegistry (line 31) | class ProviderRegistry: method __new__ (line 54) | def __new__(cls): method register (line 63) | def register(self, provider: BaseProvider) -> None: method unregister (line 100) | def unregister(self, name: str) -> bool: method get_provider (line 117) | def get_provider(self, name: str) -> Optional[BaseProvider]: method get_fetcher (line 129) | def get_fetcher( method list_providers (line 184) | def list_providers(self) -> List[str]: method get_providers_for_type (line 193) | def get_providers_for_type(self, data_type: str) -> List[str]: method get_all_data_types (line 208) | def get_all_data_types(self) -> List[str]: method clear (line 220) | def clear(self) -> None: method __repr__ (line 226) | def __repr__(self) -> str: function get_registry (line 234) | def get_registry() -> ProviderRegistry: function reset_registry (line 247) | def reset_registry() -> ProviderRegistry: FILE: backend/app/financial/tools.py class FinancialNewsTool (line 28) | class FinancialNewsTool(BaseTool): method __init__ (line 40) | def __init__(self): method _setup_parameters (line 49) | def _setup_parameters(self): method aexecute (line 53) | async def aexecute( method execute (line 119) | def execute( class StockPriceTool (line 139) | class StockPriceTool(BaseTool): method __init__ (line 149) | def __init__(self): method _setup_parameters (line 158) | def _setup_parameters(self): method aexecute (line 162) | async def aexecute( method execute (line 234) | def execute( function setup_default_providers (line 255) | def setup_default_providers(): FILE: backend/app/knowledge/graph_models.py class NodeType (line 11) | class NodeType(str, Enum): class RelationType (line 23) | class RelationType(str, Enum): class CompanyNode (line 36) | class CompanyNode(BaseModel): class NameVariantNode (line 49) | class NameVariantNode(BaseModel): class BusinessNode (line 56) | class BusinessNode(BaseModel): class IndustryNode (line 68) | class IndustryNode(BaseModel): class ProductNode (line 76) | class ProductNode(BaseModel): class KeywordNode (line 85) | class KeywordNode(BaseModel): class ConceptNode (line 93) | class ConceptNode(BaseModel): class CompanyKnowledgeGraph (line 101) | class CompanyKnowledgeGraph(BaseModel): class SearchKeywordSet (line 112) | class SearchKeywordSet(BaseModel): method get_all_keywords (line 135) | def get_all_keywords(self) -> List[str]: method generate_search_queries (line 146) | def generate_search_queries(self, max_queries: int = 10) -> List[str]: FILE: backend/app/knowledge/graph_service.py class KnowledgeGraphService (line 27) | class KnowledgeGraphService: method __init__ (line 30) | def __init__(self): method _ensure_constraints (line 34) | def _ensure_constraints(self): method create_or_update_company (line 54) | def create_or_update_company(self, company: CompanyNode) -> bool: method get_company (line 89) | def get_company(self, stock_code: str) -> Optional[Dict[str, Any]]: method add_name_variants (line 101) | def add_name_variants( method add_business (line 144) | def add_business( method stop_business (line 175) | def stop_business( method add_keywords (line 206) | def add_keywords( method add_concepts (line 243) | def add_concepts( method build_company_graph (line 279) | def build_company_graph(self, graph: CompanyKnowledgeGraph) -> bool: method _add_industry (line 324) | def _add_industry(self, stock_code: str, industry: IndustryNode) -> bool: method _add_product (line 346) | def _add_product(self, stock_code: str, product: ProductNode) -> bool: method get_company_graph (line 371) | def get_company_graph(self, stock_code: str) -> Optional[CompanyKnowle... method get_search_keywords (line 425) | def get_search_keywords(self, stock_code: str) -> Optional[SearchKeywo... method update_from_news (line 457) | def update_from_news( method get_graph_stats (line 520) | def get_graph_stats(self, stock_code: str) -> Dict[str, int]: method delete_company_graph (line 548) | def delete_company_graph(self, stock_code: str) -> bool: method list_all_companies (line 564) | def list_all_companies(self) -> List[Dict[str, str]]: function get_graph_service (line 582) | def get_graph_service() -> KnowledgeGraphService: FILE: backend/app/knowledge/knowledge_extractor.py class KnowledgeExtractorAgent (line 26) | class KnowledgeExtractorAgent(Agent): method __init__ (line 32) | def __init__(self, llm_provider=None, organization_id: str = "finnews"): method extract_from_akshare (line 50) | async def extract_from_akshare( method extract_from_news (line 206) | async def extract_from_news( method extract_from_document (line 305) | async def extract_from_document( class AkshareKnowledgeExtractor (line 387) | class AkshareKnowledgeExtractor: method extract_company_info (line 393) | def extract_company_info(stock_code: str) -> Optional[Dict[str, Any]]: method generate_search_keywords (line 490) | def generate_search_keywords( method build_simple_graph_from_info (line 583) | def build_simple_graph_from_info( class NewsKnowledgeExtractor (line 673) | class NewsKnowledgeExtractor: method __init__ (line 678) | def __init__(self, extractor_agent: KnowledgeExtractorAgent): method extract_business_changes (line 681) | async def extract_business_changes( function create_knowledge_extractor (line 702) | def create_knowledge_extractor(llm_provider=None) -> KnowledgeExtractorA... FILE: backend/app/knowledge/parallel_search.py class ParallelSearchStrategy (line 17) | class ParallelSearchStrategy: method __init__ (line 23) | def __init__(self, max_workers: int = 5): method search_with_multiple_keywords (line 32) | def search_with_multiple_keywords( method _search_single_query (line 93) | def _search_single_query( method search_async (line 128) | async def search_async( function create_parallel_search (line 157) | def create_parallel_search(max_workers: int = 5) -> ParallelSearchStrategy: FILE: backend/app/main.py class DocsCSPMiddleware (line 25) | class DocsCSPMiddleware(BaseHTTPMiddleware): method dispatch (line 27) | async def dispatch(self, request: Request, call_next): function lifespan (line 69) | async def lifespan(app: FastAPI): function validation_exception_handler (line 147) | async def validation_exception_handler(request: Request, exc: RequestVal... function global_exception_handler (line 172) | async def global_exception_handler(request, exc): function root (line 186) | async def root(): function health_check (line 200) | async def health_check(): function custom_swagger_ui_html (line 212) | async def custom_swagger_ui_html(): function swagger_ui_redirect (line 226) | async def swagger_ui_redirect(): function redoc_html (line 234) | async def redoc_html(): function chrome_devtools_config (line 246) | async def chrome_devtools_config(): FILE: backend/app/models/analysis.py class Analysis (line 11) | class Analysis(Base): method __repr__ (line 49) | def __repr__(self): method to_dict (line 52) | def to_dict(self): FILE: backend/app/models/crawl_task.py class CrawlMode (line 12) | class CrawlMode(str, Enum): class TaskStatus (line 19) | class TaskStatus(str, Enum): class CrawlTask (line 28) | class CrawlTask(Base): method __repr__ (line 64) | def __repr__(self): method to_dict (line 67) | def to_dict(self): FILE: backend/app/models/database.py function get_async_session (line 47) | async def get_async_session() -> AsyncGenerator[AsyncSession, None]: function get_sync_session (line 65) | def get_sync_session() -> Session: function init_db (line 83) | def init_db(): FILE: backend/app/models/debate_history.py class DebateHistory (line 11) | class DebateHistory(Base): method __repr__ (line 42) | def __repr__(self): method to_dict (line 45) | def to_dict(self): FILE: backend/app/models/news.py class News (line 12) | class News(Base): method __repr__ (line 56) | def __repr__(self): method to_dict (line 59) | def to_dict(self, include_html: bool = False): FILE: backend/app/models/stock.py class Stock (line 10) | class Stock(Base): method __repr__ (line 39) | def __repr__(self): method to_dict (line 42) | def to_dict(self): FILE: backend/app/scripts/init_stocks.py class Stock (line 69) | class Stock(Base): function get_fallback_stocks (line 87) | def get_fallback_stocks() -> list: function fetch_all_stocks (line 113) | async def fetch_all_stocks() -> list: function init_stocks_to_db (line 205) | async def init_stocks_to_db(): function get_stock_count (line 267) | async def get_stock_count(): function main (line 280) | async def main(): FILE: backend/app/services/analysis_service.py class AnalysisService (line 22) | class AnalysisService: method __init__ (line 28) | def __init__(self): method analyze_news (line 35) | async def analyze_news( method get_analysis_by_id (line 190) | async def get_analysis_by_id( method get_analyses_by_news_id (line 219) | async def get_analyses_by_news_id( function get_analysis_service (line 255) | def get_analysis_service() -> AnalysisService: FILE: backend/app/services/embedding_service.py class EmbeddingService (line 18) | class EmbeddingService: method __init__ (line 25) | def __init__( method _get_cache_key (line 84) | def _get_cache_key(self, text: str) -> str: method _get_from_cache (line 90) | def _get_from_cache(self, text: str) -> Optional[List[float]]: method _save_to_cache (line 105) | def _save_to_cache(self, text: str, embedding: List[float]): method embed_text (line 120) | def embed_text(self, text: str) -> List[float]: method embed_batch (line 160) | def embed_batch(self, texts: List[str]) -> List[List[float]]: method aembed_text (line 211) | async def aembed_text(self, text: str) -> List[float]: method aembed_batch (line 246) | async def aembed_batch(self, texts: List[str]) -> List[List[float]]: function get_embedding_service (line 301) | def get_embedding_service() -> EmbeddingService: FILE: backend/app/services/llm_service.py class LLMService (line 14) | class LLMService: method __init__ (line 20) | def __init__( method _create_provider (line 84) | def _create_provider(self) -> Union[LiteLLMProvider, BailianProvider]: method generate (line 130) | def generate( method analyze_sentiment (line 170) | def analyze_sentiment(self, text: str) -> Dict[str, Any]: method summarize (line 228) | def summarize(self, text: str, max_length: int = 200) -> str: function get_llm_provider (line 260) | def get_llm_provider( function get_llm_service (line 287) | def get_llm_service() -> LLMService: function create_custom_llm_provider (line 300) | def create_custom_llm_provider( FILE: backend/app/services/stock_data_service.py class StockDataService (line 22) | class StockDataService: method __init__ (line 48) | def __init__(self): method _normalize_code (line 51) | def _normalize_code(self, stock_code: str) -> str: method _get_symbol (line 61) | def _get_symbol(self, stock_code: str) -> str: method _is_cache_valid (line 68) | def _is_cache_valid(self, key: str, ttl: int = None) -> bool: method _get_cached (line 78) | def _get_cached(self, key: str, ttl: int = None) -> Optional[Any]: method _set_cache (line 87) | def _set_cache(self, key: str, data: Any): method clear_cache (line 91) | def clear_cache(self, pattern: str = None): method get_kline_data (line 107) | async def get_kline_data( method _fetch_daily_kline (line 175) | async def _fetch_daily_kline( method _fetch_minute_kline (line 257) | async def _fetch_minute_kline( method get_realtime_quote (line 329) | async def get_realtime_quote(self, stock_code: str) -> Optional[Dict[s... method search_stocks (line 383) | async def search_stocks( method _get_mock_stock_list (line 452) | def _get_mock_stock_list(self, keyword: str, limit: int) -> List[Dict[... method get_stock_info (line 474) | async def get_stock_info(self, stock_code: str) -> Optional[Dict[str, ... method _generate_mock_kline (line 504) | def _generate_mock_kline(self, stock_code: str, days: int) -> List[Dic... method get_financial_indicators (line 561) | async def get_financial_indicators(self, stock_code: str) -> Optional[... method _safe_float (line 642) | def _safe_float(self, value, default=None) -> Optional[float]: method _get_mock_financial_indicators (line 651) | def _get_mock_financial_indicators(self, stock_code: str) -> Dict[str,... method get_fund_flow (line 667) | async def get_fund_flow(self, stock_code: str, days: int = 5) -> Optio... method _get_mock_fund_flow (line 753) | def _get_mock_fund_flow(self, stock_code: str) -> Dict[str, Any]: method get_debate_context (line 766) | async def get_debate_context(self, stock_code: str) -> Dict[str, Any]: FILE: backend/app/storage/vector_storage.py class VectorStorage (line 16) | class VectorStorage: method __init__ (line 23) | def __init__( method _call_add_async (line 46) | def _call_add_async(self, records: List[VectorRecord], timeout: int = ... method connect (line 61) | def connect(self): method create_collection (line 66) | def create_collection(self, drop_existing: bool = False): method load_collection (line 78) | def load_collection(self): method store_embedding (line 82) | def store_embedding( method store_embeddings_batch (line 97) | def store_embeddings_batch( method search_similar (line 115) | def search_similar( method delete_by_news_id (line 153) | def delete_by_news_id(self, news_id: int): method verify_insert (line 157) | def verify_insert(self, news_id: int, wait_for_flush: bool = True) -> ... method get_stats (line 172) | def get_stats(self) -> Dict[str, Any]: method disconnect (line 205) | def disconnect(self): method collection (line 210) | def collection(self): function get_vector_storage (line 219) | def get_vector_storage() -> VectorStorage: FILE: backend/app/tasks/crawl_tasks.py function clean_text_for_db (line 36) | def clean_text_for_db(text: str) -> str: function get_crawler_tool (line 56) | def get_crawler_tool(source: str): function get_sync_db_session (line 86) | def get_sync_db_session(): function realtime_crawl_task (line 93) | def realtime_crawl_task(self, source: str = "sina", force_refresh: bool ... function cold_start_crawl_task (line 300) | def cold_start_crawl_task( function targeted_stock_crawl_task (line 445) | def targeted_stock_crawl_task( function build_knowledge_graph_task (line 982) | def build_knowledge_graph_task(self, stock_code: str, stock_name: str): FILE: backend/app/tools/bochaai_search.py class SearchResult (line 19) | class SearchResult: class BochaAISearchTool (line 28) | class BochaAISearchTool: method __init__ (line 34) | def __init__(self, api_key: Optional[str] = None, endpoint: Optional[s... method is_available (line 51) | def is_available(self) -> bool: method search (line 55) | def search( method search_stock_news (line 156) | def search_stock_news( FILE: backend/app/tools/caijing_crawler.py class CaijingCrawlerTool (line 16) | class CaijingCrawlerTool(BaseCrawler): method __init__ (line 27) | def __init__(self): method crawl (line 33) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 57) | def _crawl_page(self, page: int) -> List[NewsItem]: method _extract_news_links (line 93) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 158) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 193) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 216) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 228) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 248) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/crawler_base.py class NewsItem (line 22) | class NewsItem: method to_dict (line 35) | def to_dict(self) -> Dict[str, Any]: class BaseCrawler (line 51) | class BaseCrawler(BaseTool): method __init__ (line 73) | def __init__(self, name: str = "base_crawler", description: str = "Bas... method _fetch_page (line 91) | def _fetch_page(self, url: str) -> requests.Response: method _parse_html (line 162) | def _parse_html(self, html: str) -> BeautifulSoup: method _extract_chinese_ratio (line 174) | def _extract_chinese_ratio(self, text: str) -> float: method _clean_text (line 191) | def _clean_text(self, text: str) -> str: method _extract_article_content (line 210) | def _extract_article_content(self, soup: BeautifulSoup, selectors: Lis... method _is_stock_related_by_url (line 276) | def _is_stock_related_by_url(self, url: str) -> bool: method _is_stock_related_by_title (line 289) | def _is_stock_related_by_title(self, title: str) -> bool: method _filter_stock_news (line 301) | def _filter_stock_news(self, news_list: List[NewsItem]) -> List[NewsIt... method crawl (line 351) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _setup_parameters (line 364) | def _setup_parameters(self): method execute (line 368) | def execute(self, **kwargs) -> Dict[str, Any]: method aexecute (line 392) | async def aexecute(self, **kwargs) -> Dict[str, Any]: FILE: backend/app/tools/crawler_enhanced.py class Article (line 122) | class Article: method to_markdown (line 143) | def to_markdown(self, include_title: bool = True, include_meta: bool =... method to_llm_message (line 171) | def to_llm_message(self) -> List[Dict[str, Any]]: method to_dict (line 200) | def to_dict(self) -> Dict[str, Any]: class ContentExtractor (line 221) | class ContentExtractor: method extract_with_readability (line 228) | def extract_with_readability(html: str) -> Optional[Article]: method extract_with_selectors (line 251) | def extract_with_selectors(soup: BeautifulSoup, config: dict) -> Optio... method extract_heuristic (line 292) | def extract_heuristic(soup: BeautifulSoup) -> Optional[Article]: method extract (line 348) | def extract(cls, html: str, url: str = "", config: dict = None) -> Art... class JinaReaderEngine (line 388) | class JinaReaderEngine: method __init__ (line 396) | def __init__(self, api_key: Optional[str] = None): method crawl (line 399) | def crawl(self, url: str, return_format: str = "html") -> Optional[str]: class PlaywrightEngine (line 426) | class PlaywrightEngine: method __init__ (line 432) | def __init__(self, headless: bool = True): method crawl (line 435) | def crawl(self, url: str, wait_selectors: List[str] = None, class RequestsEngine (line 488) | class RequestsEngine: method __init__ (line 500) | def __init__(self, timeout: int = 20): method crawl (line 506) | def crawl(self, url: str, headers: dict = None, cookies: dict = None) ... class CrawlCache (line 525) | class CrawlCache: method __init__ (line 530) | def __init__(self, cache_dir: str = ".crawl_cache", ttl_hours: int = 24): method _key (line 535) | def _key(self, url: str) -> str: method get (line 538) | def get(self, url: str) -> Optional[str]: method set (line 558) | def set(self, url: str, html: str): class EnhancedCrawler (line 576) | class EnhancedCrawler: method __init__ (line 582) | def __init__( method _get_site_config (line 599) | def _get_site_config(self, url: str) -> dict: method _evaluate_quality (line 609) | def _evaluate_quality(self, article: Article) -> float: method crawl (line 648) | def crawl( method crawl_batch (line 756) | def crawl_batch( function get_crawler (line 802) | def get_crawler() -> EnhancedCrawler: function crawl_url (line 810) | def crawl_url(url: str, engine: str = 'auto') -> Article: function crawl_urls (line 815) | def crawl_urls(urls: List[str], engine: str = 'auto') -> List[Article]: FILE: backend/app/tools/dynamic_crawler_example.py class DynamicCrawlerExample (line 24) | class DynamicCrawlerExample(BaseCrawler): method __init__ (line 34) | def __init__(self): method _init_driver (line 41) | def _init_driver(self): method _close_driver (line 56) | def _close_driver(self): method crawl (line 62) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_with_selenium (line 89) | def _crawl_with_selenium(self) -> List[NewsItem]: method _extract_news_links_from_selenium (line 151) | def _extract_news_links_from_selenium(self) -> List[dict]: method _extract_news_item (line 174) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: FILE: backend/app/tools/eastmoney_crawler.py class EastmoneyCrawlerTool (line 16) | class EastmoneyCrawlerTool(BaseCrawler): method __init__ (line 26) | def __init__(self): method crawl (line 32) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 56) | def _crawl_page(self, page: int) -> List[NewsItem]: method _extract_news_links (line 92) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 164) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 199) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 222) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 236) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 256) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/eeo_crawler.py class EeoCrawlerTool (line 17) | class EeoCrawlerTool(BaseCrawler): method __init__ (line 33) | def __init__(self): method crawl (line 39) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _fetch_api_news (line 63) | def _fetch_api_news(self, page: int = 0, prev_uuid: str = "", prev_pub... method _crawl_page (line 158) | def _crawl_page(self, page: int) -> List[NewsItem]: method _parse_api_news_item (line 195) | def _parse_api_news_item(self, news_data: dict) -> Optional[NewsItem]: method _fetch_news_content (line 244) | def _fetch_news_content(self, url: str) -> tuple: method _crawl_page_html (line 267) | def _crawl_page_html(self) -> List[NewsItem]: method _extract_news_links (line 297) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 361) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 396) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 443) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 455) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 475) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/interactive_crawler.py class InteractiveCrawler (line 39) | class InteractiveCrawler: method __init__ (line 42) | def __init__(self, timeout: int = 15): method _is_captcha_page (line 70) | def _is_captcha_page(self, html_content: str, soup: BeautifulSoup = No... method search_on_bing (line 90) | def search_on_bing( method search_on_baidu (line 193) | def search_on_baidu( method search_on_baidu_news (line 302) | def search_on_baidu_news( method search_on_sogou (line 420) | def search_on_sogou( method search_on_360 (line 516) | def search_on_360( method interactive_search (line 612) | def interactive_search( method crawl_page (line 711) | def crawl_page(self, url: str) -> Optional[Dict[str, Any]]: method crawl_search_results (line 788) | def crawl_search_results( function create_interactive_crawler (line 839) | def create_interactive_crawler(headless: bool = True, **kwargs) -> Inter... function search_and_crawl (line 844) | def search_and_crawl( FILE: backend/app/tools/jingji21_crawler.py class Jingji21CrawlerTool (line 16) | class Jingji21CrawlerTool(BaseCrawler): method __init__ (line 27) | def __init__(self): method crawl (line 33) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 57) | def _crawl_page(self, page: int) -> List[NewsItem]: method _extract_news_links (line 90) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 112) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 163) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 186) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 198) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 218) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/jwview_crawler.py class JwviewCrawlerTool (line 16) | class JwviewCrawlerTool(BaseCrawler): method __init__ (line 27) | def __init__(self): method crawl (line 33) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 57) | def _crawl_page(self, page: int) -> List[NewsItem]: method _extract_news_links (line 93) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 119) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 154) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 177) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 189) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 219) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/nbd_crawler.py class NbdCrawlerTool (line 16) | class NbdCrawlerTool(BaseCrawler): method __init__ (line 26) | def __init__(self): method crawl (line 32) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 56) | def _crawl_page(self, page: int) -> List[NewsItem]: method _extract_news_links (line 89) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 152) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 194) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 249) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 261) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 281) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/netease163_crawler.py class Netease163CrawlerTool (line 16) | class Netease163CrawlerTool(BaseCrawler): method __init__ (line 26) | def __init__(self): method crawl (line 32) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 56) | def _crawl_page(self, page: int) -> List[NewsItem]: method _extract_news_links (line 89) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 115) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 150) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 173) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 185) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 205) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/search_engine_crawler.py class SearchEngineCrawler (line 17) | class SearchEngineCrawler: method __init__ (line 23) | def __init__(self): method _fetch_url (line 40) | def _fetch_url(self, url: str, timeout: int = 10) -> Optional[str]: method search_with_engine (line 73) | def search_with_engine( method _build_search_query (line 122) | def _build_search_query(self, query: str, days: int) -> str: method _parse_search_results (line 159) | def _parse_search_results( method _is_news_url (line 202) | def _is_news_url(self, url: str) -> bool: method _extract_source_from_url (line 211) | def _extract_source_from_url(self, url: str) -> str: method search_stock_news (line 233) | def search_stock_news( function create_search_engine_crawler (line 293) | def create_search_engine_crawler(mcp_server_path: Optional[str] = None) ... FILE: backend/app/tools/sina_crawler.py class SinaCrawlerTool (line 16) | class SinaCrawlerTool(BaseCrawler): method __init__ (line 26) | def __init__(self): method crawl (line 33) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 57) | def _crawl_page(self, page: int) -> List[NewsItem]: method _crawl_news_detail (line 108) | def _crawl_news_detail(self, url: str) -> Optional[NewsItem]: method _extract_title (line 159) | def _extract_title(self, soup: BeautifulSoup) -> Optional[str]: method _extract_meta (line 175) | def _extract_meta(self, soup: BeautifulSoup) -> tuple: method _extract_date (line 191) | def _extract_date(self, soup: BeautifulSoup) -> Optional[datetime]: method _parse_date (line 208) | def _parse_date(self, date_text: str) -> Optional[datetime]: method _extract_stock_codes (line 230) | def _extract_stock_codes(self, soup: BeautifulSoup) -> List[str]: method _extract_content (line 244) | def _extract_content(self, soup: BeautifulSoup) -> str: method _is_noise_text (line 301) | def _is_noise_text(self, text: str) -> bool: function create_sina_crawler (line 333) | def create_sina_crawler() -> SinaCrawlerTool: FILE: backend/app/tools/tencent_crawler.py class TencentCrawlerTool (line 17) | class TencentCrawlerTool(BaseCrawler): method __init__ (line 28) | def __init__(self): method crawl (line 34) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 59) | def _crawl_page(self, page: int) -> List[NewsItem]: method _fetch_api_news (line 126) | def _fetch_api_news(self, page: int = 0) -> List[dict]: method _parse_api_news_item (line 202) | def _parse_api_news_item(self, news_data: dict) -> Optional[NewsItem]: method _extract_news_links (line 267) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 331) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 379) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 410) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 445) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 490) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/app/tools/text_cleaner.py class TextCleanerTool (line 16) | class TextCleanerTool(BaseTool): method __init__ (line 34) | def __init__(self): method _load_custom_dict (line 48) | def _load_custom_dict(self): method clean_text (line 64) | def clean_text(self, text: str) -> str: method tokenize (line 91) | def tokenize(self, text: str, remove_stopwords: bool = True) -> List[s... method extract_keywords (line 124) | def extract_keywords(self, text: str, top_k: int = 10) -> List[str]: method normalize_stock_code (line 144) | def normalize_stock_code(self, code: str) -> str: method _setup_parameters (line 159) | def _setup_parameters(self): method execute (line 164) | def execute(self, **kwargs) -> dict: method aexecute (line 201) | async def aexecute(self, **kwargs) -> dict: function create_text_cleaner (line 216) | def create_text_cleaner() -> TextCleanerTool: FILE: backend/app/tools/yicai_crawler.py class YicaiCrawlerTool (line 16) | class YicaiCrawlerTool(BaseCrawler): method __init__ (line 26) | def __init__(self): method crawl (line 32) | def crawl(self, start_page: int = 1, end_page: int = 1) -> List[NewsIt... method _crawl_page (line 56) | def _crawl_page(self, page: int) -> List[NewsItem]: method _extract_news_links (line 84) | def _extract_news_links(self, soup: BeautifulSoup) -> List[dict]: method _extract_news_item (line 110) | def _extract_news_item(self, link_info: dict) -> Optional[NewsItem]: method _extract_content (line 145) | def _extract_content(self, soup: BeautifulSoup) -> str: method _extract_publish_time (line 168) | def _extract_publish_time(self, soup: BeautifulSoup) -> Optional[datet... method _parse_time_string (line 182) | def _parse_time_string(self, time_str: str) -> datetime: method _extract_author (line 202) | def _extract_author(self, soup: BeautifulSoup) -> Optional[str]: FILE: backend/clear_news_data.py function clear_all_news_data (line 24) | def clear_all_news_data(): FILE: backend/init_knowledge_graph.py function init_knowledge_graph (line 18) | async def init_knowledge_graph(): FILE: backend/reset_database.py function reset_database (line 16) | async def reset_database(): FILE: backend/tests/check_milvus_data.py function main (line 15) | def main(): FILE: backend/tests/check_news_embedding_status.py function main (line 17) | async def main(): FILE: backend/tests/financial/test_smoke_openbb_models.py class TestNewsModels (line 17) | class TestNewsModels: method test_news_query_params_basic (line 20) | def test_news_query_params_basic(self): method test_news_query_params_validation (line 40) | def test_news_query_params_validation(self): method test_news_data_basic (line 59) | def test_news_data_basic(self): method test_news_data_with_sentiment (line 78) | def test_news_data_with_sentiment(self): method test_news_data_generate_id (line 96) | def test_news_data_generate_id(self): method test_news_data_to_legacy_dict (line 113) | def test_news_data_to_legacy_dict(self): class TestStockModels (line 138) | class TestStockModels: method test_stock_query_params_basic (line 141) | def test_stock_query_params_basic(self): method test_stock_price_data_basic (line 164) | def test_stock_price_data_basic(self): method test_stock_price_data_to_legacy_dict (line 182) | def test_stock_price_data_to_legacy_dict(self): method test_kline_interval_enum (line 205) | def test_kline_interval_enum(self): method test_adjust_type_enum (line 213) | def test_adjust_type_enum(self): FILE: backend/tests/financial/test_smoke_openbb_provider.py class TestBaseFetcherAbstraction (line 18) | class TestBaseFetcherAbstraction: method test_fetcher_subclass_implementation (line 21) | def test_fetcher_subclass_implementation(self): method test_fetcher_fetch_pipeline (line 60) | async def test_fetcher_fetch_pipeline(self): class TestBaseProviderAbstraction (line 96) | class TestBaseProviderAbstraction: method test_provider_subclass_implementation (line 99) | def test_provider_subclass_implementation(self): class TestProviderRegistry (line 142) | class TestProviderRegistry: method test_registry_singleton (line 145) | def test_registry_singleton(self): method test_registry_register_and_list (line 153) | def test_registry_register_and_list(self): method test_registry_get_fetcher_auto_fallback (line 188) | def test_registry_get_fetcher_auto_fallback(self): method test_registry_get_fetcher_by_name (line 244) | def test_registry_get_fetcher_by_name(self): class TestSinaProvider (line 285) | class TestSinaProvider: method test_sina_provider_info (line 288) | def test_sina_provider_info(self): method test_sina_provider_get_news_fetcher (line 298) | def test_sina_provider_get_news_fetcher(self): method test_sina_news_fetcher_transform_query (line 309) | def test_sina_news_fetcher_transform_query(self): FILE: backend/tests/financial/test_smoke_openbb_tools.py class TestFinancialNewsTool (line 17) | class TestFinancialNewsTool: method test_tool_instantiation (line 20) | def test_tool_instantiation(self): method test_tool_has_required_methods (line 29) | def test_tool_has_required_methods(self): method test_tool_returns_error_when_no_provider (line 41) | async def test_tool_returns_error_when_no_provider(self): method test_tool_with_mocked_fetcher (line 57) | async def test_tool_with_mocked_fetcher(self): class TestStockPriceTool (line 113) | class TestStockPriceTool: method test_tool_instantiation (line 116) | def test_tool_instantiation(self): method test_tool_returns_error_for_invalid_interval (line 126) | async def test_tool_returns_error_for_invalid_interval(self): method test_tool_returns_error_when_no_provider (line 137) | async def test_tool_returns_error_when_no_provider(self): class TestSetupDefaultProviders (line 151) | class TestSetupDefaultProviders: method test_setup_registers_sina (line 154) | def test_setup_registers_sina(self): method test_setup_idempotent (line 166) | def test_setup_idempotent(self): FILE: backend/tests/manual_vectorize.py function vectorize_news_manually (line 22) | async def vectorize_news_manually(news_id: int): function vectorize_all_pending (line 120) | async def vectorize_all_pending(): function main_async (line 181) | async def main_async(): FILE: backend/tests/test_alpha_mining/test_integration_p2.py class TestQuantitativeAgent (line 25) | class TestQuantitativeAgent: method test_agent_import (line 28) | def test_agent_import(self): method test_agent_init_without_llm (line 35) | def test_agent_init_without_llm(self): method test_agent_lazy_init (line 47) | def test_agent_lazy_init(self): method test_agent_mine_factors (line 66) | async def test_agent_mine_factors(self): method test_agent_full_analysis (line 84) | async def test_agent_full_analysis(self): method test_agent_with_mock_llm (line 106) | async def test_agent_with_mock_llm(self): method test_agent_evaluate_factor (line 136) | def test_agent_evaluate_factor(self): method test_agent_get_best_factors (line 151) | def test_agent_get_best_factors(self): class TestAlphaMiningAPI (line 174) | class TestAlphaMiningAPI: method test_api_module_import (line 177) | def test_api_module_import(self): method test_api_routes_exist (line 184) | def test_api_routes_exist(self): method test_client (line 198) | def test_client(self): method test_get_operators (line 207) | def test_get_operators(self, test_client): method test_get_factors_empty (line 220) | def test_get_factors_empty(self, test_client): method test_evaluate_factor (line 232) | def test_evaluate_factor(self, test_client): method test_generate_factors (line 246) | def test_generate_factors(self, test_client): class TestFullWorkflow (line 266) | class TestFullWorkflow: method test_end_to_end_factor_discovery (line 270) | async def test_end_to_end_factor_discovery(self): method test_quantitative_agent_workflow (line 336) | async def test_quantitative_agent_workflow(self): method test_api_and_agent_integration (line 371) | def test_api_and_agent_integration(self): class TestPerformance (line 408) | class TestPerformance: method test_generator_speed (line 411) | def test_generator_speed(self): method test_vm_execution_speed (line 433) | def test_vm_execution_speed(self): FILE: backend/tests/test_alpha_mining/test_smoke_p0.py class TestConfig (line 38) | class TestConfig: method test_default_config_exists (line 41) | def test_default_config_exists(self): method test_config_device (line 46) | def test_config_device(self): method test_config_features (line 52) | def test_config_features(self): class TestOps (line 64) | class TestOps: method sample_tensor (line 68) | def sample_tensor(self): method test_ts_delay (line 72) | def test_ts_delay(self, sample_tensor): method test_ts_delta (line 81) | def test_ts_delta(self, sample_tensor): method test_ts_mean (line 89) | def test_ts_mean(self, sample_tensor): method test_ts_std (line 96) | def test_ts_std(self, sample_tensor): method test_ops_config_complete (line 103) | def test_ops_config_complete(self): method test_all_ops_executable (line 111) | def test_all_ops_executable(self, sample_tensor): class TestVocab (line 135) | class TestVocab: method test_default_vocab_exists (line 138) | def test_default_vocab_exists(self): method test_vocab_token_mapping (line 143) | def test_vocab_token_mapping(self): method test_vocab_is_feature_operator (line 156) | def test_vocab_is_feature_operator(self): method test_vocab_get_operator_arity (line 169) | def test_vocab_get_operator_arity(self): class TestFactorVM (line 182) | class TestFactorVM: method vm (line 186) | def vm(self): method features (line 191) | def features(self): method test_vm_execute_simple (line 196) | def test_vm_execute_simple(self, vm, features): method test_vm_execute_binary_op (line 206) | def test_vm_execute_binary_op(self, vm, features): method test_vm_execute_unary_op (line 219) | def test_vm_execute_unary_op(self, vm, features): method test_vm_execute_invalid_formula (line 232) | def test_vm_execute_invalid_formula(self, vm, features): method test_vm_decode_simple (line 243) | def test_vm_decode_simple(self, vm): method test_vm_validate (line 255) | def test_vm_validate(self, vm): class TestAlphaGenerator (line 275) | class TestAlphaGenerator: method generator (line 279) | def generator(self): method test_generator_init (line 284) | def test_generator_init(self, generator): method test_generator_forward (line 289) | def test_generator_forward(self, generator): method test_generator_generate (line 300) | def test_generator_generate(self, generator): method test_generator_generate_with_training (line 314) | def test_generator_generate_with_training(self, generator): class TestAlphaTrainer (line 333) | class TestAlphaTrainer: method trainer (line 337) | def trainer(self): method mock_data (line 348) | def mock_data(self): method test_trainer_init (line 357) | def test_trainer_init(self, trainer): method test_trainer_train_step (line 363) | def test_trainer_train_step(self, trainer, mock_data): method test_trainer_short_training (line 374) | def test_trainer_short_training(self, trainer, mock_data): class TestMockData (line 393) | class TestMockData: method test_generate_mock_data_shape (line 396) | def test_generate_mock_data_shape(self): method test_generate_mock_data_no_nan (line 407) | def test_generate_mock_data_no_nan(self): method test_generate_mock_data_reproducible (line 414) | def test_generate_mock_data_reproducible(self): class TestEndToEnd (line 427) | class TestEndToEnd: method test_full_pipeline_smoke (line 430) | def test_full_pipeline_smoke(self): FILE: backend/tests/test_alpha_mining/test_smoke_p1.py class TestMarketFeatureBuilder (line 34) | class TestMarketFeatureBuilder: method builder (line 38) | def builder(self): method sample_df (line 42) | def sample_df(self): method test_build_from_dataframe (line 54) | def test_build_from_dataframe(self, builder, sample_df): method test_build_from_tensors (line 63) | def test_build_from_tensors(self, builder): method test_features_normalized (line 74) | def test_features_normalized(self, builder, sample_df): method test_no_nan_in_features (line 82) | def test_no_nan_in_features(self, builder, sample_df): method test_feature_names (line 89) | def test_feature_names(self, builder): class TestSentimentFeatureBuilder (line 103) | class TestSentimentFeatureBuilder: method builder (line 107) | def builder(self): method sample_df (line 111) | def sample_df(self): method test_build_from_dataframe (line 122) | def test_build_from_dataframe(self, builder, sample_df): method test_build_from_dict (line 131) | def test_build_from_dict(self, builder): method test_build_from_list (line 142) | def test_build_from_list(self, builder): method test_time_alignment (line 154) | def test_time_alignment(self, builder): method test_sentiment_decay (line 162) | def test_sentiment_decay(self, builder): method test_combine_with_market (line 173) | def test_combine_with_market(self, builder): class TestFactorEvaluator (line 187) | class TestFactorEvaluator: method evaluator (line 191) | def evaluator(self): method sample_data (line 195) | def sample_data(self): method test_evaluate_basic (line 209) | def test_evaluate_basic(self, evaluator, sample_data): method test_evaluate_batch (line 222) | def test_evaluate_batch(self, evaluator): method test_get_reward (line 233) | def test_get_reward(self, evaluator, sample_data): method test_good_factor_high_ic (line 242) | def test_good_factor_high_ic(self, evaluator): method test_random_factor_low_ic (line 253) | def test_random_factor_low_ic(self, evaluator): method test_compare_factors (line 263) | def test_compare_factors(self, evaluator): method test_rank_factors (line 281) | def test_rank_factors(self, evaluator): class TestAlphaMiningToolImport (line 299) | class TestAlphaMiningToolImport: method test_import_tool (line 302) | def test_import_tool(self): method test_tool_metadata (line 311) | def test_tool_metadata(self): class TestP1EndToEnd (line 329) | class TestP1EndToEnd: method test_full_pipeline_with_real_features (line 332) | def test_full_pipeline_with_real_features(self): FILE: backend/tests/test_smoke_alpha_mining.py class TestDSLOperators (line 24) | class TestDSLOperators: method test_ops_config_exists (line 27) | def test_ops_config_exists(self): method test_arithmetic_ops (line 41) | def test_arithmetic_ops(self): method test_timeseries_ops (line 65) | def test_timeseries_ops(self): class TestFactorVM (line 85) | class TestFactorVM: method vm (line 89) | def vm(self): method sample_features (line 95) | def sample_features(self): method test_execute_simple_formula (line 99) | def test_execute_simple_formula(self, vm, sample_features): method test_execute_invalid_formula (line 108) | def test_execute_invalid_formula(self, vm, sample_features): method test_decode_formula (line 121) | def test_decode_formula(self, vm): class TestAlphaGenerator (line 129) | class TestAlphaGenerator: method generator (line 133) | def generator(self): method test_generate_batch (line 141) | def test_generate_batch(self, generator): method test_generate_with_training (line 150) | def test_generate_with_training(self, generator): class TestAlphaTrainer (line 160) | class TestAlphaTrainer: method trainer (line 164) | def trainer(self): method sample_data (line 173) | def sample_data(self): method test_train_step (line 179) | def test_train_step(self, trainer, sample_data): method test_train_with_callback (line 191) | def test_train_with_callback(self, trainer, sample_data): class TestFactorEvaluator (line 212) | class TestFactorEvaluator: method evaluator (line 216) | def evaluator(self): method test_evaluate_factor (line 220) | def test_evaluate_factor(self, evaluator): method test_get_reward (line 235) | def test_get_reward(self, evaluator): class TestVocab (line 245) | class TestVocab: method test_vocab_initialization (line 248) | def test_vocab_initialization(self): method test_token_conversion (line 258) | def test_token_conversion(self): class TestAPIEndpoints (line 275) | class TestAPIEndpoints: method client (line 279) | def client(self): method test_get_operators (line 288) | def test_get_operators(self, client): method test_get_factors_empty (line 299) | def test_get_factors_empty(self, client): method test_evaluate_factor (line 308) | def test_evaluate_factor(self, client): method test_mine_task_start (line 320) | def test_mine_task_start(self, client): class TestEdgeCases (line 333) | class TestEdgeCases: method test_empty_formula (line 336) | def test_empty_formula(self): method test_constant_factor_penalty (line 347) | def test_constant_factor_penalty(self): method test_nan_handling (line 359) | def test_nan_handling(self): FILE: frontend/src/App.tsx function App (line 12) | function App() { FILE: frontend/src/components/DebateChatRoom.tsx type ChatRole (line 18) | type ChatRole = 'user' | 'bull' | 'bear' | 'manager' | 'system' | 'data_... type SearchTask (line 21) | interface SearchTask { type SearchPlan (line 30) | interface SearchPlan { type ChatMessage (line 40) | interface ChatMessage { type DebateChatRoomProps (line 118) | interface DebateChatRoomProps { FILE: frontend/src/components/DebateConfig.tsx type DebateMode (line 21) | interface DebateMode { type ModeRules (line 30) | interface ModeRules { constant DEFAULT_RULES (line 61) | const DEFAULT_RULES: Record = { type DebateConfigProps (line 82) | interface DebateConfigProps { FILE: frontend/src/components/DebateHistorySidebar.tsx type DebateHistorySidebarProps (line 20) | interface DebateHistorySidebarProps { FILE: frontend/src/components/HighlightText.tsx type HighlightTextProps (line 3) | interface HighlightTextProps { function HighlightText (line 25) | function HighlightText({ text, highlight, className = '' }: HighlightTex... FILE: frontend/src/components/KLineChart.tsx type KLineChartProps (line 64) | interface KLineChartProps { function KLineChart (line 75) | function KLineChart({ function MiniKLineChart (line 424) | function MiniKLineChart({ FILE: frontend/src/components/MentionInput.tsx type MentionType (line 18) | type MentionType = 'agent' | 'source' | 'stock' type MentionTarget (line 20) | interface MentionTarget { constant AGENTS (line 30) | const AGENTS: MentionTarget[] = [ constant SOURCES (line 66) | const SOURCES: MentionTarget[] = [ constant ALL_TARGETS (line 102) | const ALL_TARGETS = [...AGENTS, ...SOURCES] type MentionInputProps (line 104) | interface MentionInputProps { FILE: frontend/src/components/ModelSelector.tsx type ModelConfig (line 18) | interface ModelConfig { constant PROVIDER_I18N (line 24) | const PROVIDER_I18N: Record; constant OPERATOR_ICON_COMPONENTS (line 36) | const OPERATOR_ICON_COMPONENTS: Record = { constant FEATURES (line 101) | const FEATURES = ['RET', 'VOL', 'VOLUME_CHG', 'TURNOVER', 'SENTIMENT', '... type OperatorGridProps (line 112) | interface OperatorGridProps { type OperatorCardProps (line 236) | interface OperatorCardProps { FILE: frontend/src/components/alpha-mining/SentimentCompare.tsx type CompareResult (line 24) | interface CompareResult { type SentimentCompareProps (line 31) | interface SentimentCompareProps { FILE: frontend/src/components/alpha-mining/TrainingMonitor.tsx type TrainingMetrics (line 24) | interface TrainingMetrics { type TrainingMonitorProps (line 35) | interface TrainingMonitorProps { type TrainingStatus (line 40) | type TrainingStatus = 'idle' | 'running' | 'completed' | 'error'; type MetricCardProps (line 385) | interface MetricCardProps { FILE: frontend/src/components/ui/badge.tsx type BadgeProps (line 28) | interface BadgeProps function Badge (line 32) | function Badge({ className, variant, ...props }: BadgeProps) { FILE: frontend/src/components/ui/button.tsx type ButtonProps (line 36) | interface ButtonProps FILE: frontend/src/components/ui/sheet.tsx type SheetContextValue (line 5) | interface SheetContextValue { type SheetContentProps (line 70) | interface SheetContentProps extends React.HTMLAttributes { FILE: frontend/src/context/NewsToolbarContext.tsx type ToolbarContent (line 3) | interface ToolbarContent { type NewsToolbarContextValue (line 8) | interface NewsToolbarContextValue { FILE: frontend/src/hooks/useDebounce.ts function useDebounce (line 21) | function useDebounce(value: T, delay: number = 500): T { FILE: frontend/src/layout/MainLayout.tsx function MainLayout (line 17) | function MainLayout() { function MainLayoutInner (line 25) | function MainLayoutInner() { FILE: frontend/src/lib/api-client.ts constant API_BASE_URL (line 23) | const API_BASE_URL = import.meta.env.VITE_API_BASE_URL || 'http://localh... type ModelInfo (line 230) | interface ModelInfo { type ProviderInfo (line 236) | interface ProviderInfo { type LLMConfigResponse (line 244) | interface LLMConfigResponse { type SSEDebateEvent (line 566) | interface SSEDebateEvent { type AlphaMiningFactor (line 904) | interface AlphaMiningFactor { type AlphaMiningMetrics (line 914) | interface AlphaMiningMetrics { type MineRequest (line 926) | interface MineRequest { type EvaluateRequest (line 933) | interface EvaluateRequest { type SentimentCompareResult (line 938) | interface SentimentCompareResult { type OperatorInfo (line 945) | interface OperatorInfo { FILE: frontend/src/lib/utils.ts function cn (line 4) | function cn(...inputs: ClassValue[]) { function formatDate (line 8) | function formatDate(date: string | Date): string { type TimeI18n (line 19) | interface TimeI18n { function formatRelativeTime (line 33) | function formatRelativeTime(date: string | Date, i18n?: TimeI18n): string { FILE: frontend/src/pages/AgentMonitorPage.tsx constant AGENT_ROLES (line 32) | const AGENT_ROLES: Record = { constant EXTENDED_NEWS_SOURCES (line 54) | const EXTENDED_NEWS_SOURCES: Record void }) { constant NEWS_SOURCES (line 73) | const NEWS_SOURCES = [ constant SOURCE_NAME_TO_KEY (line 88) | const SOURCE_NAME_TO_KEY: Record = { constant EXTENDED_NEWS_SOURCES (line 113) | const EXTENDED_NEWS_SOURCES: Record