diff --git a/config.yaml b/config.yaml index 8e2902d..e164d71 100644 --- a/config.yaml +++ b/config.yaml @@ -16,6 +16,9 @@ llm: stream: false model_path: "" ollama_host: "http://localhost:11434" +database: + type: "sqlite" + url: "sqlite:///skills.db" skills_directory: "C:\\Users\\sonto\\Workspace\\base_agent\\skills\\OpenCLI\\skills" # 新增:SKILL.md 文件所在目录 # ── 本地 MCP Server 配置 ─────────────────────────────────────── mcp: diff --git a/config/settings.py b/config/settings.py index 0df46aa..36da518 100644 --- a/config/settings.py +++ b/config/settings.py @@ -252,6 +252,10 @@ class AgentConfig: session_timeout: int = 3600 fallback_to_rules: bool = True +@dataclass +class DatabaseConfig: + type: str = "sqlite" + url: str = None # ════════════════════════════════════════════════════════════════ # 顶层 AppConfig @@ -283,7 +287,8 @@ class AppConfig: memory: MemoryConfig, logging: LoggingConfig, agent: AgentConfig, - skills_directory: str = "./skills" + skills_directory: str = "./skills", + database: DatabaseConfig = DatabaseConfig() ): self.llm = llm self.mcp = mcp @@ -293,6 +298,7 @@ class AppConfig: self.logging = logging self.agent = agent self.skills_directory = skills_directory + self.database = database @property def enabled_mcp_skills(self) -> list[MCPSkillConfig]: @@ -375,7 +381,11 @@ class ConfigLoader: memory=cls._build_memory(raw.get("memory", {})), logging=cls._build_logging(raw.get("logging", {})), agent=cls._build_agent(raw.get("agent", {})), - skills_directory=raw.get("skills_directory", "") + skills_directory=raw.get("skills_directory", ""), + database=DatabaseConfig( + type=raw.get("database", {}).get("type", "sqlite"), + url=raw.get("database", {}).get("url", "sqlite:///skills.db"), + ) ) # ── LLM ─────────────────────────────────────────────────── diff --git a/database/__init__.py b/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/database/database.py b/database/database.py new file mode 100644 index 0000000..aae7d44 --- /dev/null +++ b/database/database.py @@ -0,0 +1,64 @@ +# database.py +from sqlalchemy import create_engine, Column, Integer, String, DateTime, true +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker +from datetime import datetime + +from config.settings import settings + +Base = declarative_base() + + +class SkillUpload(Base): + __tablename__ = 'skill_uploads' + + id = Column(Integer, primary_key=True, autoincrement=True) + name = Column(String, nullable=False, unique=True) + description = Column(String, nullable=True) + skill_id = Column(String, nullable=False, unique=True) + upload_time = Column(DateTime, default=datetime.utcnow) + + def __repr__(self): + return f"" + + +class DatabaseManager: + """数据库管理器,提供文件上传和查询功能""" + + def __init__(self): + self.engine = create_engine(settings.database.url) + Base.metadata.create_all(self.engine) # 创建表 + self.Session = sessionmaker(bind=self.engine) + + def add_skill_upload(self, skill_name: str, skill_id: str, description: str) -> None: + """添加技能上传记录到数据库""" + session = self.Session() + new_skill = SkillUpload(name=skill_name, + skill_id=skill_id, + description=description) + session.add(new_skill) + session.commit() + session.close() + + def get_skill_by_name(self, skill_name: str) -> SkillUpload | None: + """根据名称查询单个技能上传记录""" + session = self.Session() + skill = session.query(SkillUpload).filter(SkillUpload.name == skill_name).first() + session.close() + return skill + + def get_all_skills(self) -> list[SkillUpload]: + """获取所有技能上传记录""" + session = self.Session() + skills = session.query(SkillUpload).all() + session.close() + return skills + + def skill_exists(self, skill_name: str) -> bool: + """检查技能是否已上传""" + session = self.Session() + exists = session.query(SkillUpload).filter(SkillUpload.name == skill_name).count() > 0 + session.close() + return exists + +db_manager: DatabaseManager = DatabaseManager() \ No newline at end of file