1 line
17 KiB
JSON
1 line
17 KiB
JSON
{"repo": "babanooi/jobsearch", "files": {"main.py": {"227204280dc230e1f19ed9cb49c00d406e68117b": {"t": 1785745406.4297974, "n": 3216, "h": "01f9161bfe88c355", "c": "\"\"\"求职助手 CLI 入口\"\"\"\nimport argparse\nimport sys\nfrom pathlib import Path\n\nsys.path.insert(0, str(Path(__file__).parent))\n\nfrom core.config import settings\nfrom core.logger import get_logger\n\nlogger = get_logger(\"cli\")\n\n\ndef cmd_serve():\n \"\"\"启动 FastAPI 服务\"\"\"\n import uvicorn\n uvicorn.run(\"api.fastapi_app:app\", host=\"0.0.0.0\", port=8000, reload=True)\n\n\ndef cmd_ui():\n \"\"\"启动 Streamlit Chat UI\"\"\"\n from streamlit.web import cli as stcli\n ui_path = str(Path(__file__).parent / \"ui\" / \"streamlit_app.py\")\n sys.argv = [\"streamlit\", \"run\", ui_path]\n stcli.main()\n\n\ndef cmd_analyze(job_name: str):\n \"\"\"命令行直接分析岗位\"\"\"\n from graphs.analyze import agent_graph\n import uuid\n\n logger.info(f\"分析岗位: {job_name}\")\n result = agent_graph.invoke(\n {\"job_name\": job_name, \"status\": \"开始执行\"},\n config={\"configurable\": {\"thread_id\": str(uuid.uuid4())}},\n )\n print(f\"状态: {result.get('status')}\")\n print(f\"技能数: {len(result.get('skill_list', []))}\")\n print(f\"收集 JD: {len(result.get('search_raw_items', []))} 条\")\n\n\ndef cmd_rank(job_name: str, top_n: int = 10):\n \"\"\"查询技能排名\"\"\"\n from agents.registry import registry\n skills = registry.db_tool.get_skill_rank(job_name, top_n)\n if not skills:\n print(f\"未找到 {job_name} 的分析数据\")\n return\n print(f\"\\n{job_name} 技能 Top{len(skills)}:\")\n for i, s in enumerate(skills, 1):\n print(f\" {i}. {s['skill']} (出现 {s['count']} 次)\")\n\n\ndef cmd_doctor():\n \"\"\"环境自检\"\"\"\n checks = {\n \"DeepSeek API\": bool(settings.DEEPSEEK_API_KEY),\n \"AnySearch API\": bool(settings.ANYSEARCH_API_KEY),\n \"Dashscope API\": bool(settings.DASHSCOPE_API_KEY),\n \"MySQL URL\": bool(settings.DATABASE_URL),\n }\n for name, ok in checks.items():\n print(f\" {'OK' if ok else 'MISSING'} {name}\")\n\n try:\n from models.database import get_engine\n get_engine().connect().close()\n print(\" OK MySQL 连接\")\n except Exception as e:\n print(f\" FAIL MySQL 连接: {e}\")\n\n try:\n from tools.embedding import create_embeddings\n emb = create_embeddings()\n emb.embed_query(\"test\")\n print(\" OK Embedding API\")\n except Exception as e:\n print(f\" FAIL Embedding: {e}\")\n\n print(\"\\n环境自检完成\")\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"求职助手\")\n sub = parser.add_subparsers(dest=\"command\")\n\n sub.add_parser(\"serve\", help=\"启动 FastAPI 服务\")\n sub.add_parser(\"ui\", help=\"启动 Streamlit Chat UI\")\n sub.add_parser(\"doctor\", help=\"环境自检\")\n\n p_analyze = sub.add_parser(\"analyze\", help=\"命令行分析岗位\")\n p_analyze.add_argument(\"job_name\", help=\"岗位名称\")\n\n p_rank = sub.add_parser(\"rank\", help=\"查询技能排名\")\n p_rank.add_argument(\"job_name\", help=\"岗位名称\")\n p_rank.add_argument(\"--top\", type=int, default=10, help=\"返回 Top N\")\n\n args = parser.parse_args()\n\n if args.command == \"serve\":\n cmd_serve()\n elif args.command == \"ui\":\n cmd_ui()\n elif args.command == \"doctor\":\n cmd_doctor()\n elif args.command == \"analyze\":\n cmd_analyze(args.job_name)\n elif args.command == \"rank\":\n cmd_rank(args.job_name, args.top)\n else:\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n"}, "8ddfbd65f082563f7ec36aa828b00a886e3f60b6": {"t": 1785752907.3637893, "n": 3216, "h": "01f9161bfe88c355", "c": "\"\"\"求职助手 CLI 入口\"\"\"\nimport argparse\nimport sys\nfrom pathlib import Path\n\nsys.path.insert(0, str(Path(__file__).parent))\n\nfrom core.config import settings\nfrom core.logger import get_logger\n\nlogger = get_logger(\"cli\")\n\n\ndef cmd_serve():\n \"\"\"启动 FastAPI 服务\"\"\"\n import uvicorn\n uvicorn.run(\"api.fastapi_app:app\", host=\"0.0.0.0\", port=8000, reload=True)\n\n\ndef cmd_ui():\n \"\"\"启动 Streamlit Chat UI\"\"\"\n from streamlit.web import cli as stcli\n ui_path = str(Path(__file__).parent / \"ui\" / \"streamlit_app.py\")\n sys.argv = [\"streamlit\", \"run\", ui_path]\n stcli.main()\n\n\ndef cmd_analyze(job_name: str):\n \"\"\"命令行直接分析岗位\"\"\"\n from graphs.analyze import agent_graph\n import uuid\n\n logger.info(f\"分析岗位: {job_name}\")\n result = agent_graph.invoke(\n {\"job_name\": job_name, \"status\": \"开始执行\"},\n config={\"configurable\": {\"thread_id\": str(uuid.uuid4())}},\n )\n print(f\"状态: {result.get('status')}\")\n print(f\"技能数: {len(result.get('skill_list', []))}\")\n print(f\"收集 JD: {len(result.get('search_raw_items', []))} 条\")\n\n\ndef cmd_rank(job_name: str, top_n: int = 10):\n \"\"\"查询技能排名\"\"\"\n from agents.registry import registry\n skills = registry.db_tool.get_skill_rank(job_name, top_n)\n if not skills:\n print(f\"未找到 {job_name} 的分析数据\")\n return\n print(f\"\\n{job_name} 技能 Top{len(skills)}:\")\n for i, s in enumerate(skills, 1):\n print(f\" {i}. {s['skill']} (出现 {s['count']} 次)\")\n\n\ndef cmd_doctor():\n \"\"\"环境自检\"\"\"\n checks = {\n \"DeepSeek API\": bool(settings.DEEPSEEK_API_KEY),\n \"AnySearch API\": bool(settings.ANYSEARCH_API_KEY),\n \"Dashscope API\": bool(settings.DASHSCOPE_API_KEY),\n \"MySQL URL\": bool(settings.DATABASE_URL),\n }\n for name, ok in checks.items():\n print(f\" {'OK' if ok else 'MISSING'} {name}\")\n\n try:\n from models.database import get_engine\n get_engine().connect().close()\n print(\" OK MySQL 连接\")\n except Exception as e:\n print(f\" FAIL MySQL 连接: {e}\")\n\n try:\n from tools.embedding import create_embeddings\n emb = create_embeddings()\n emb.embed_query(\"test\")\n print(\" OK Embedding API\")\n except Exception as e:\n print(f\" FAIL Embedding: {e}\")\n\n print(\"\\n环境自检完成\")\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"求职助手\")\n sub = parser.add_subparsers(dest=\"command\")\n\n sub.add_parser(\"serve\", help=\"启动 FastAPI 服务\")\n sub.add_parser(\"ui\", help=\"启动 Streamlit Chat UI\")\n sub.add_parser(\"doctor\", help=\"环境自检\")\n\n p_analyze = sub.add_parser(\"analyze\", help=\"命令行分析岗位\")\n p_analyze.add_argument(\"job_name\", help=\"岗位名称\")\n\n p_rank = sub.add_parser(\"rank\", help=\"查询技能排名\")\n p_rank.add_argument(\"job_name\", help=\"岗位名称\")\n p_rank.add_argument(\"--top\", type=int, default=10, help=\"返回 Top N\")\n\n args = parser.parse_args()\n\n if args.command == \"serve\":\n cmd_serve()\n elif args.command == \"ui\":\n cmd_ui()\n elif args.command == \"doctor\":\n cmd_doctor()\n elif args.command == \"analyze\":\n cmd_analyze(args.job_name)\n elif args.command == \"rank\":\n cmd_rank(args.job_name, args.top)\n else:\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n"}, "161313e0f161d9bf051cb2acfdfcb5b3bda1ae33": {"t": 1785752908.8740158, "n": 3210, "h": "18ed35484c6cd07f", "c": "\"\"\"求职助手 CLI 入口\"\"\"\nimport argparse\nimport sys\nfrom pathlib import Path\n\nsys.path.insert(0, str(Path(__file__).parent))\n\nfrom core.config import settings\nfrom core.logger import get_logger\n\nlogger = get_logger(\"cli\")\n\n\ndef cmd_serve():\n \"\"\"启动 FastAPI 服务\"\"\"\n import uvicorn\n uvicorn.run(\"api.fastapi_app:app\", host=\"0.0.0.0\", port=8000, reload=True)\n\n\ndef cmd_ui():\n \"\"\"启动 Streamlit Chat UI\"\"\"\n from streamlit.web import cli as stcli\n ui_path = str(Path(__file__).parent / \"ui\" / \"streamlit_app.py\")\n sys.argv = [\"streamlit\", \"run\", ui_path]\n stcli.main()\n\n\ndef cmd_analyze(job_name: str):\n \"\"\"命令行直接分析岗位\"\"\"\n from graphs.analyze import agent_graph\n import uuid\n\n logger.info(f\"分析岗位: {job_name}\")\n result = agent_graph.invoke(\n {\"job_name\": job_name, \"status\": \"开始执行\"},\n config={\"configurable\": {\"thread_id\": str(uuid.uuid4())}},\n )\n print(f\"状态: {result.get('status')}\")\n print(f\"技能数: {len(result.get('skill_list', []))}\")\n print(f\"收集 JD: {len(result.get('search_raw_items', []))} 条\")\n\n\ndef cmd_rank(job_name: str, top_n: int = 10):\n \"\"\"查询技能排名\"\"\"\n from agents.registry import registry\n skills = registry.db_tool.get_skill_rank(job_name, top_n)\n if not skills:\n print(f\"未找到 {job_name} 的分析数据\")\n return\n print(f\"\\n{job_name} 技能 Top{len(skills)}:\")\n for i, s in enumerate(skills, 1):\n print(f\" {i}. {s['skill']} (出现 {s['count']} 次)\")\n\n\ndef cmd_doctor():\n \"\"\"环境自检\"\"\"\n checks = {\n \"DeepSeek API\": bool(settings.DEEPSEEK_API_KEY),\n \"Tavily API\": bool(settings.TAVILY_API_KEY),\n \"Dashscope API\": bool(settings.DASHSCOPE_API_KEY),\n \"MySQL URL\": bool(settings.DATABASE_URL),\n }\n for name, ok in checks.items():\n print(f\" {'OK' if ok else 'MISSING'} {name}\")\n\n try:\n from models.database import get_engine\n get_engine().connect().close()\n print(\" OK MySQL 连接\")\n except Exception as e:\n print(f\" FAIL MySQL 连接: {e}\")\n\n try:\n from tools.embedding import create_embeddings\n emb = create_embeddings()\n emb.embed_query(\"test\")\n print(\" OK Embedding API\")\n except Exception as e:\n print(f\" FAIL Embedding: {e}\")\n\n print(\"\\n环境自检完成\")\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"求职助手\")\n sub = parser.add_subparsers(dest=\"command\")\n\n sub.add_parser(\"serve\", help=\"启动 FastAPI 服务\")\n sub.add_parser(\"ui\", help=\"启动 Streamlit Chat UI\")\n sub.add_parser(\"doctor\", help=\"环境自检\")\n\n p_analyze = sub.add_parser(\"analyze\", help=\"命令行分析岗位\")\n p_analyze.add_argument(\"job_name\", help=\"岗位名称\")\n\n p_rank = sub.add_parser(\"rank\", help=\"查询技能排名\")\n p_rank.add_argument(\"job_name\", help=\"岗位名称\")\n p_rank.add_argument(\"--top\", type=int, default=10, help=\"返回 Top N\")\n\n args = parser.parse_args()\n\n if args.command == \"serve\":\n cmd_serve()\n elif args.command == \"ui\":\n cmd_ui()\n elif args.command == \"doctor\":\n cmd_doctor()\n elif args.command == \"analyze\":\n cmd_analyze(args.job_name)\n elif args.command == \"rank\":\n cmd_rank(args.job_name, args.top)\n else:\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n"}, "71868a53588cf15fceeb455daebc55c4995d551d": {"t": 1785752910.1048052, "n": 3200, "h": "32ab20433512aa33", "c": "\"\"\"求职助手 CLI 入口\"\"\"\nimport argparse\nimport sys\nfrom pathlib import Path\n\nsys.path.insert(0, str(Path(__file__).parent))\n\nfrom core.config import settings\nfrom core.logger import get_logger\n\nlogger = get_logger(\"cli\")\n\n\ndef cmd_serve():\n \"\"\"启动 FastAPI 服务\"\"\"\n import uvicorn\n uvicorn.run(\"api.fastapi_app:app\", host=\"0.0.0.0\", port=8000, reload=True)\n\n\ndef cmd_ui():\n \"\"\"启动 Streamlit Chat UI\"\"\"\n from streamlit.web import cli as stcli\n ui_path = str(Path(__file__).parent / \"ui\" / \"streamlit_app.py\")\n sys.argv = [\"streamlit\", \"run\", ui_path]\n stcli.main()\n\n\ndef cmd_analyze(job_name: str):\n \"\"\"命令行直接分析岗位\"\"\"\n from graphs.analyze import agent_graph\n import uuid\n\n logger.info(f\"分析岗位: {job_name}\")\n result = agent_graph.invoke(\n {\"job_name\": job_name, \"status\": \"开始执行\"},\n config={\"configurable\": {\"thread_id\": str(uuid.uuid4())}},\n )\n print(f\"状态: {result.get('status')}\")\n print(f\"技能数: {len(result.get('skill_list', []))}\")\n print(f\"收集 JD: {len(result.get('search_raw_items', []))} 条\")\n\n\ndef cmd_rank(job_name: str, top_n: int = 10):\n \"\"\"查询技能排名\"\"\"\n from agents.registry import registry\n skills = registry.db_tool.get_skill_rank(job_name, top_n)\n if not skills:\n print(f\"未找到 {job_name} 的分析数据\")\n return\n print(f\"\\n{job_name} 技能 Top{len(skills)}:\")\n for i, s in enumerate(skills, 1):\n print(f\" {i}. {s['skill']} (出现 {s['count']} 次)\")\n\n\ndef cmd_doctor():\n \"\"\"环境自检\"\"\"\n checks = {\n \"DeepSeek API\": bool(settings.DEEPSEEK_API_KEY),\n \"Tavily API\": bool(settings.TAVILY_API_KEY),\n \"Dashscope API\": bool(settings.DASHSCOPE_API_KEY),\n \"MySQL URL\": bool(settings.DATABASE_URL),\n }\n for name, ok in checks.items():\n print(f\" {'OK' if ok else 'MISSING'} {name}\")\n\n try:\n from models.database import engine\n engine.connect().close()\n print(\" OK MySQL 连接\")\n except Exception as e:\n print(f\" FAIL MySQL 连接: {e}\")\n\n try:\n from tools.embedding import create_embeddings\n emb = create_embeddings()\n emb.embed_query(\"test\")\n print(\" OK Embedding API\")\n except Exception as e:\n print(f\" FAIL Embedding: {e}\")\n\n print(\"\\n环境自检完成\")\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"求职助手\")\n sub = parser.add_subparsers(dest=\"command\")\n\n sub.add_parser(\"serve\", help=\"启动 FastAPI 服务\")\n sub.add_parser(\"ui\", help=\"启动 Streamlit Chat UI\")\n sub.add_parser(\"doctor\", help=\"环境自检\")\n\n p_analyze = sub.add_parser(\"analyze\", help=\"命令行分析岗位\")\n p_analyze.add_argument(\"job_name\", help=\"岗位名称\")\n\n p_rank = sub.add_parser(\"rank\", help=\"查询技能排名\")\n p_rank.add_argument(\"job_name\", help=\"岗位名称\")\n p_rank.add_argument(\"--top\", type=int, default=10, help=\"返回 Top N\")\n\n args = parser.parse_args()\n\n if args.command == \"serve\":\n cmd_serve()\n elif args.command == \"ui\":\n cmd_ui()\n elif args.command == \"doctor\":\n cmd_doctor()\n elif args.command == \"analyze\":\n cmd_analyze(args.job_name)\n elif args.command == \"rank\":\n cmd_rank(args.job_name, args.top)\n else:\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n"}, "4225ba274bd3d393cc2e20d70dd5d596c2a5de2b": {"t": 1785752911.622359, "n": 1583, "h": "ef2b5ad4b8dd2cfd", "c": "import time\nimport uuid\nfrom pydantic import BaseModel\nfrom graph.workflow import agent_graph\nfrom agents.registry import registry\nfrom fastapi import FastAPI\nfrom database.db import init_database\nfrom utils.logger import get_logger\n\ndb = registry.db_tool\n\nlogger = get_logger(__name__)\n\napp = FastAPI(title=\"企业级多Agent岗位技能分析系统\")\n\n\n@app.on_event(\"startup\")\ndef on_startup():\n logger.info(\"服务启动,初始化数据库...\")\n init_database()\n logger.info(\"数据库初始化完成\")\n\n\nclass JobRequest(BaseModel):\n job_name: str\n\n\n@app.post(\"/analyze_job\")\ndef analyze_job(request: JobRequest):\n \"\"\"\n 传入岗位名称 → 触发多Agent工作流\n 流程:标准化 → 搜索 → 评估 → (回环) → 抽取 → 入库\n \"\"\"\n t0 = time.time()\n thread_id = str(uuid.uuid4())\n logger.info(f\"POST /analyze_job 收到请求: job_name={request.job_name}, thread_id={thread_id}\")\n\n result = agent_graph.invoke(\n {\"job_name\": request.job_name, \"status\": \"开始执行\"},\n config={\"configurable\": {\"thread_id\": thread_id}},\n )\n\n elapsed = time.time() - t0\n logger.info(f\"POST /analyze_job 完成 → 耗时 {elapsed:.1f}s, thread_id={thread_id}\")\n\n return {\n \"code\": 200,\n \"msg\": \"分析完成\",\n \"status\": result[\"status\"],\n \"elapsed\": f\"{elapsed:.1f}s\",\n \"thread_id\": thread_id,\n }\n\n\n@app.get(\"/skill_rank/{job_name}\")\ndef get_skill_rank(job_name: str, top_n: int = 10):\n \"\"\"\n 获取岗位最受关注的技能关键词top10\n \"\"\"\n logger.info(f\"GET /skill_rank/{job_name} top_n={top_n}\")\n rank = db.get_skill_rank(job_name, top_n)\n logger.debug(f\"GET /skill_rank/{job_name} 返回 {len(rank)} 条\")\n return {\"code\": 200, \"data\": rank}\n"}}}} |