From b0f10b6bb10c8796a136af958a3161d9c6d4c591 Mon Sep 17 00:00:00 2001 From: TimHoogervorst Date: Mon, 25 May 2026 12:16:24 +0200 Subject: [PATCH] small refactor of the structure --- agents/__init__.py | 12 ++++++------ {skills => agents/skills}/__init__.py | 2 +- {skills => agents/skills}/easter_eggs.py | 2 +- {skills => agents/skills}/media_info.py | 2 +- {skills => agents/skills}/seerr.py | 2 +- {skills => agents/skills}/triage.py | 2 +- {skills => agents/skills}/watch_history.py | 2 +- {api => gateway}/__init__.py | 0 {api => gateway}/api.md | 0 {auth => gateway/auth}/__init__.py | 0 {auth => gateway/auth}/jellyfin.py | 4 ++-- {api => gateway}/dependencies.py | 2 +- {bot => gateway/discord}/__init__.py | 0 bot/discord_bot.py => gateway/discord/bot.py | 12 ++++++------ {bot => gateway/discord}/conversation.py | 0 {api => gateway}/v1/__init__.py | 0 {api => gateway}/v1/auth.py | 8 ++++---- {api => gateway}/v1/chat.py | 4 ++-- main.py | 12 ++++++------ {core => src}/__init__.py | 0 {core => src}/auth_store.py | 2 +- {core => src}/config.py | 0 {core => src}/graph.py | 4 ++-- {core => src}/llm.py | 0 {core => src}/state.py | 0 {core => src}/tools_adapter.py | 2 +- 26 files changed, 37 insertions(+), 37 deletions(-) rename {skills => agents/skills}/__init__.py (98%) rename {skills => agents/skills}/easter_eggs.py (99%) rename {skills => agents/skills}/media_info.py (97%) rename {skills => agents/skills}/seerr.py (99%) rename {skills => agents/skills}/triage.py (97%) rename {skills => agents/skills}/watch_history.py (98%) rename {api => gateway}/__init__.py (100%) rename {api => gateway}/api.md (100%) rename {auth => gateway/auth}/__init__.py (100%) rename {auth => gateway/auth}/jellyfin.py (99%) rename {api => gateway}/dependencies.py (96%) rename {bot => gateway/discord}/__init__.py (100%) rename bot/discord_bot.py => gateway/discord/bot.py (98%) rename {bot => gateway/discord}/conversation.py (100%) rename {api => gateway}/v1/__init__.py (100%) rename {api => gateway}/v1/auth.py (97%) rename {api => gateway}/v1/chat.py (98%) rename {core => src}/__init__.py (100%) rename {core => src}/auth_store.py (99%) rename {core => src}/config.py (100%) rename {core => src}/graph.py (98%) rename {core => src}/llm.py (100%) rename {core => src}/state.py (100%) rename {core => src}/tools_adapter.py (97%) diff --git a/agents/__init__.py b/agents/__init__.py index 76df02e..3947b03 100644 --- a/agents/__init__.py +++ b/agents/__init__.py @@ -12,7 +12,7 @@ An Agent is a lightweight wrapper: from dataclasses import dataclass, field from typing import Dict, List -from skills import Skill, get_combined_prompt, list_all as list_all_skills +from agents.skills import Skill, get_combined_prompt, list_all as list_all_skills @dataclass @@ -61,8 +61,8 @@ def load_all_agents() -> None: import agents.media_agent # noqa: F401 # Also import skill modules so they self-register - import skills.media_info # noqa: F401 - import skills.seerr # noqa: F401 - import skills.triage # noqa: F401 - import skills.easter_eggs # noqa: F401 - import skills.watch_history # noqa: F401 + import agents.skills.media_info # noqa: F401 + import agents.skills.seerr # noqa: F401 + import agents.skills.triage # noqa: F401 + import agents.skills.easter_eggs # noqa: F401 + import agents.skills.watch_history # noqa: F401 diff --git a/skills/__init__.py b/agents/skills/__init__.py similarity index 98% rename from skills/__init__.py rename to agents/skills/__init__.py index 97ded41..1e37b4d 100644 --- a/skills/__init__.py +++ b/agents/skills/__init__.py @@ -12,7 +12,7 @@ A Skill is a lightweight object with: from dataclasses import dataclass, field from typing import Any, Awaitable, Callable, Dict, List, Optional -from core.config import get_config # re-export so every skill can use it +from src.config import get_config # re-export so every skill can use it # --------------------------------------------------------------------------- diff --git a/skills/easter_eggs.py b/agents/skills/easter_eggs.py similarity index 99% rename from skills/easter_eggs.py rename to agents/skills/easter_eggs.py index 3fa3783..5900c18 100644 --- a/skills/easter_eggs.py +++ b/agents/skills/easter_eggs.py @@ -8,7 +8,7 @@ requested actions normally. Functionality is never sacrificed for a reference. Add a new theme by adding one entry to THEMES — no code changes needed. """ -from skills import Skill, register +from agents.skills import Skill, register THEMES = { "naruto": { diff --git a/skills/media_info.py b/agents/skills/media_info.py similarity index 97% rename from skills/media_info.py rename to agents/skills/media_info.py index 3365900..116ecef 100644 --- a/skills/media_info.py +++ b/agents/skills/media_info.py @@ -5,7 +5,7 @@ A lightweight base skill that teaches the agent it is a media assistant. Real API capabilities come from other skills (seerr, triage, etc.). """ -from skills import Skill, register +from agents.skills import Skill, register media_info_skill = Skill( name="media_info", diff --git a/skills/seerr.py b/agents/skills/seerr.py similarity index 99% rename from skills/seerr.py rename to agents/skills/seerr.py index 7cdbc33..46269c2 100644 --- a/skills/seerr.py +++ b/agents/skills/seerr.py @@ -24,7 +24,7 @@ from urllib.parse import quote import httpx -from skills import Skill, register, ToolResult, get_config +from agents.skills import Skill, register, ToolResult, get_config # --------------------------------------------------------------------------- # Config diff --git a/skills/triage.py b/agents/skills/triage.py similarity index 97% rename from skills/triage.py rename to agents/skills/triage.py index 55bd21b..2a92231 100644 --- a/skills/triage.py +++ b/agents/skills/triage.py @@ -10,7 +10,7 @@ cancelling requests, banning users), this skill teaches the LLM to: 3. Use the seerr_submit_issue tool (if available) to create the ticket. """ -from skills import Skill, register +from agents.skills import Skill, register # This skill has no tools of its own — it guides the LLM's behavior. # The actual ticket submission is handled by seerr_submit_issue. diff --git a/skills/watch_history.py b/agents/skills/watch_history.py similarity index 98% rename from skills/watch_history.py rename to agents/skills/watch_history.py index 29bc0b2..ff414fb 100644 --- a/skills/watch_history.py +++ b/agents/skills/watch_history.py @@ -8,7 +8,7 @@ users who haven't linked Jellyfin will be prompted to /login first. from __future__ import annotations -from skills import Skill, register, ToolResult +from agents.skills import Skill, register, ToolResult # --------------------------------------------------------------------------- # Tool definitions diff --git a/api/__init__.py b/gateway/__init__.py similarity index 100% rename from api/__init__.py rename to gateway/__init__.py diff --git a/api/api.md b/gateway/api.md similarity index 100% rename from api/api.md rename to gateway/api.md diff --git a/auth/__init__.py b/gateway/auth/__init__.py similarity index 100% rename from auth/__init__.py rename to gateway/auth/__init__.py diff --git a/auth/jellyfin.py b/gateway/auth/jellyfin.py similarity index 99% rename from auth/jellyfin.py rename to gateway/auth/jellyfin.py index b2744df..6a49efd 100644 --- a/auth/jellyfin.py +++ b/gateway/auth/jellyfin.py @@ -20,8 +20,8 @@ from typing import Optional import httpx -from auth import AuthService, AuthResult, register_auth_service -from core.config import get_config +from gateway.auth import AuthService, AuthResult, register_auth_service +from src.config import get_config logger = logging.getLogger("auth.jellyfin") diff --git a/api/dependencies.py b/gateway/dependencies.py similarity index 96% rename from api/dependencies.py rename to gateway/dependencies.py index d57fee1..6dfaba8 100644 --- a/api/dependencies.py +++ b/gateway/dependencies.py @@ -1,7 +1,7 @@ from fastapi import Request from openai import OpenAI -from core.graph import create_agent_graph +from src.graph import create_agent_graph def get_llm_client(request: Request) -> OpenAI: diff --git a/bot/__init__.py b/gateway/discord/__init__.py similarity index 100% rename from bot/__init__.py rename to gateway/discord/__init__.py diff --git a/bot/discord_bot.py b/gateway/discord/bot.py similarity index 98% rename from bot/discord_bot.py rename to gateway/discord/bot.py index 3681d2a..05da455 100644 --- a/bot/discord_bot.py +++ b/gateway/discord/bot.py @@ -23,12 +23,12 @@ import os import discord from agents import list_all as list_all_agents -from bot.conversation import ConversationStore -from core.config import DEEPSEEK_API_KEY, get_config -from core.graph import create_agent_graph -from core.llm import create_client -from core import auth_store -from auth import list_auth_services, get_auth_service +from gateway.discord.conversation import ConversationStore +from src.config import DEEPSEEK_API_KEY, get_config +from src.graph import create_agent_graph +from src.llm import create_client +from src import auth_store +from gateway.auth import list_auth_services, get_auth_service logger = logging.getLogger("bot.discord") diff --git a/bot/conversation.py b/gateway/discord/conversation.py similarity index 100% rename from bot/conversation.py rename to gateway/discord/conversation.py diff --git a/api/v1/__init__.py b/gateway/v1/__init__.py similarity index 100% rename from api/v1/__init__.py rename to gateway/v1/__init__.py diff --git a/api/v1/auth.py b/gateway/v1/auth.py similarity index 97% rename from api/v1/auth.py rename to gateway/v1/auth.py index 094d8b8..0ca93b2 100644 --- a/api/v1/auth.py +++ b/gateway/v1/auth.py @@ -19,10 +19,10 @@ import logging from fastapi import APIRouter, Form, HTTPException, Request from fastapi.responses import HTMLResponse -from auth import get_auth_service, list_auth_services -from core import auth_store +from gateway.auth import get_auth_service, list_auth_services +from src import auth_store -logger = logging.getLogger("api.auth") +logger = logging.getLogger("gateway.auth") router = APIRouter(prefix="/api/v1/auth", tags=["auth"]) @@ -199,7 +199,7 @@ async def auth_status(discord_id: int): # POST /auth/reset — wipe auth store (DEV ONLY) # --------------------------------------------------------------------------- -from core.config import get_config # noqa: E402 +from src.config import get_config # noqa: E402 @router.post("/reset") async def reset_auth(): diff --git a/api/v1/chat.py b/gateway/v1/chat.py similarity index 98% rename from api/v1/chat.py rename to gateway/v1/chat.py index 5f71fb8..68cfd95 100644 --- a/api/v1/chat.py +++ b/gateway/v1/chat.py @@ -4,9 +4,9 @@ from openai import OpenAI from pydantic import BaseModel import json -from api.dependencies import get_llm_client, get_agent_graph +from gateway.dependencies import get_llm_client, get_agent_graph from agents import get as get_agent, list_all as list_all_agents -from core.state import AgentState +from src.state import AgentState router = APIRouter() diff --git a/main.py b/main.py index 2800bd6..586ca45 100644 --- a/main.py +++ b/main.py @@ -4,10 +4,10 @@ from contextlib import asynccontextmanager from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from api.v1.auth import router as auth_router -from api.v1.chat import router as v1_router -from core.config import DEEPSEEK_API_KEY, get_config -from core.llm import create_client +from gateway.v1.auth import router as auth_router +from gateway.v1.chat import router as v1_router +from src.config import DEEPSEEK_API_KEY, get_config +from src.llm import create_client # --------------------------------------------------------------------------- # Logging — tool calls will appear in the uvicorn console @@ -25,14 +25,14 @@ from agents import load_all_agents # noqa: E402 load_all_agents() -import auth.jellyfin # noqa: E402 — self-registers JellyfinAuth +import gateway.auth.jellyfin # noqa: E402 — self-registers JellyfinAuth # --------------------------------------------------------------------------- # Lifespan # --------------------------------------------------------------------------- @asynccontextmanager async def lifespan(app: FastAPI): - from bot.discord_bot import start_in_background # noqa: E402 + from gateway.discord.bot import start_in_background # noqa: E402 start_in_background() diff --git a/core/__init__.py b/src/__init__.py similarity index 100% rename from core/__init__.py rename to src/__init__.py diff --git a/core/auth_store.py b/src/auth_store.py similarity index 99% rename from core/auth_store.py rename to src/auth_store.py index e6f8d13..f14864f 100644 --- a/core/auth_store.py +++ b/src/auth_store.py @@ -19,7 +19,7 @@ from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Optional -from core.config import get_config +from src.config import get_config logger = logging.getLogger("auth_store") diff --git a/core/config.py b/src/config.py similarity index 100% rename from core/config.py rename to src/config.py diff --git a/core/graph.py b/src/graph.py similarity index 98% rename from core/graph.py rename to src/graph.py index 4bb2675..bdbcd69 100644 --- a/core/graph.py +++ b/src/graph.py @@ -20,8 +20,8 @@ from langchain_core.messages import AIMessage, ToolMessage from langgraph.graph import END, StateGraph from openai import OpenAI -from core.state import AgentState -from skills import get_all_tools, execute_tool +from src.state import AgentState +from agents.skills import get_all_tools, execute_tool logger = logging.getLogger("graph") diff --git a/core/llm.py b/src/llm.py similarity index 100% rename from core/llm.py rename to src/llm.py diff --git a/core/state.py b/src/state.py similarity index 100% rename from core/state.py rename to src/state.py diff --git a/core/tools_adapter.py b/src/tools_adapter.py similarity index 97% rename from core/tools_adapter.py rename to src/tools_adapter.py index e7fccba..ee393b4 100644 --- a/core/tools_adapter.py +++ b/src/tools_adapter.py @@ -13,7 +13,7 @@ from typing import Any from langchain_core.tools import tool -from skills import get_all_tools, execute_tool +from agents.skills import get_all_tools, execute_tool def build_langgraph_tools(skill_names: list[str]) -> list: