添加Ai 能力,重构项目结构
This commit is contained in:
@@ -1,4 +1,7 @@
|
|||||||
.venv/
|
.venv/
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
.env.prod
|
||||||
.idea/
|
.idea/
|
||||||
.vscode/
|
.vscode/
|
||||||
.history/
|
.history/
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
"""OfferPie 爬虫应用包。"""
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
"""AI 模型配置。"""
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
"""AI 模型场景配置。
|
||||||
|
|
||||||
|
集中管理爬虫服务使用的模型,切换模型只需修改此文件。
|
||||||
|
"""
|
||||||
|
|
||||||
|
from app.ai.models import LLM
|
||||||
|
|
||||||
|
|
||||||
|
class SpiderModel:
|
||||||
|
"""爬虫 AI 场景模型。"""
|
||||||
|
|
||||||
|
# 页面内容理解与结构化提取
|
||||||
|
CONTENT_EXTRACT = LLM.CLAUDE_OPUS.create(temperature=0)
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
"""LLM 模型枚举与实例获取。
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
from app.ai.models import LLM
|
||||||
|
|
||||||
|
llm = LLM.DOUBAO_SEED_LITE.create(temperature=0)
|
||||||
|
llm = LLM.CLAUDE_OPUS.create(temperature=0)
|
||||||
|
"""
|
||||||
|
|
||||||
|
from enum import Enum
|
||||||
|
from typing import Callable
|
||||||
|
|
||||||
|
from langchain_anthropic import ChatAnthropic
|
||||||
|
from langchain_core.language_models import BaseChatModel
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
|
||||||
|
from app.config import settings
|
||||||
|
|
||||||
|
ConfigGetter = Callable[[], str]
|
||||||
|
|
||||||
|
# 供应商连接配置 = (api_key函数, base_url函数)
|
||||||
|
_VOLCENGINE = (
|
||||||
|
lambda: settings.volcengine_api_key,
|
||||||
|
lambda: settings.volcengine_base_url,
|
||||||
|
)
|
||||||
|
_ANTHROPIC = (
|
||||||
|
lambda: settings.anthropic_api_key,
|
||||||
|
lambda: settings.anthropic_base_url,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class LLM(Enum):
|
||||||
|
"""所有可用模型,每个枚举值 = (模型名, 封装类, api_key函数, base_url函数)。"""
|
||||||
|
|
||||||
|
# 火山引擎(OpenAI 兼容)
|
||||||
|
DOUBAO_PRO_32K = ("doubao-1-5-pro-32k-250115", ChatOpenAI, *_VOLCENGINE)
|
||||||
|
DOUBAO_LITE_32K = ("doubao-1-5-lite-32k-250115", ChatOpenAI, *_VOLCENGINE)
|
||||||
|
DOUBAO_SEED_LITE = ("doubao-seed-2-0-lite-260215", ChatOpenAI, *_VOLCENGINE)
|
||||||
|
DOUBAO_SEED_PRO = ("doubao-seed-2-0-pro-260215", ChatOpenAI, *_VOLCENGINE)
|
||||||
|
DEEPSEEK_V4_FLASH = ("deepseek-v4-flash-260425", ChatOpenAI, *_VOLCENGINE)
|
||||||
|
|
||||||
|
# Claude(Anthropic 风格)
|
||||||
|
CLAUDE_OPUS = ("claude-opus-4-6", ChatAnthropic, *_ANTHROPIC)
|
||||||
|
|
||||||
|
def __init__(
|
||||||
|
self,
|
||||||
|
model_name: str,
|
||||||
|
model_class: type[BaseChatModel],
|
||||||
|
api_key_getter: ConfigGetter,
|
||||||
|
base_url_getter: ConfigGetter,
|
||||||
|
) -> None:
|
||||||
|
self.model_name = model_name
|
||||||
|
self._model_class = model_class
|
||||||
|
self._api_key_getter = api_key_getter
|
||||||
|
self._base_url_getter = base_url_getter
|
||||||
|
|
||||||
|
def create(self, **kwargs) -> BaseChatModel:
|
||||||
|
"""创建模型实例,其他参数透传给 LangChain 模型类。"""
|
||||||
|
return self._model_class(
|
||||||
|
model=self.model_name,
|
||||||
|
api_key=self._api_key_getter(),
|
||||||
|
base_url=self._base_url_getter(),
|
||||||
|
**kwargs,
|
||||||
|
)
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import os
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from .settings import Settings
|
||||||
|
|
||||||
|
_env = os.getenv("ENV", "dev")
|
||||||
|
_env_files = {"dev": ".env", "test": ".env.test", "prod": ".env.prod"}
|
||||||
|
|
||||||
|
# 定位项目根目录(config 上两级)
|
||||||
|
_project_root = Path(__file__).resolve().parent.parent.parent
|
||||||
|
_env_file = _project_root / _env_files.get(_env, ".env")
|
||||||
|
|
||||||
|
if not _env_file.exists():
|
||||||
|
raise FileNotFoundError(f".env 文件不存在: {_env_file}")
|
||||||
|
|
||||||
|
settings = Settings(_env_file=str(_env_file))
|
||||||
|
|
||||||
|
__all__ = ["settings"]
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
||||||
|
|
||||||
|
|
||||||
|
class Settings(BaseSettings):
|
||||||
|
"""项目配置,通过环境变量或项目根目录下的 .env 文件覆盖。"""
|
||||||
|
|
||||||
|
env: str = "dev"
|
||||||
|
|
||||||
|
# 火山引擎(OpenAI 兼容风格)
|
||||||
|
volcengine_api_key: str = ""
|
||||||
|
volcengine_base_url: str = "https://ark.cn-beijing.volces.com/api/v3"
|
||||||
|
|
||||||
|
# Claude(Anthropic 风格)
|
||||||
|
anthropic_api_key: str = ""
|
||||||
|
anthropic_base_url: str = ""
|
||||||
|
|
||||||
|
model_config = SettingsConfigDict(
|
||||||
|
env_file=".env",
|
||||||
|
env_file_encoding="utf-8",
|
||||||
|
case_sensitive=False,
|
||||||
|
extra="ignore",
|
||||||
|
)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
"""爬虫工具集。"""
|
||||||
@@ -3,3 +3,7 @@ rapidocr>=3.9
|
|||||||
onnxruntime>=1.17
|
onnxruntime>=1.17
|
||||||
opencv-python>=4.5
|
opencv-python>=4.5
|
||||||
playwright>=1.49
|
playwright>=1.49
|
||||||
|
pydantic-settings>=2.0
|
||||||
|
langchain-openai>=0.3
|
||||||
|
langchain-anthropic>=0.3
|
||||||
|
langchain-core>=0.3
|
||||||
|
|||||||
Reference in New Issue
Block a user