From 3f94ffe2e1cf59ca4b612171047650b80e071e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vitor=20Hugo=20Belorio=20Sim=C3=A3o?= Date: Thu, 19 Feb 2026 17:23:33 -0300 Subject: [PATCH] :sparkles: feat: Adicionando os endpoints de acesso as Tools e movendo o acesso para o banco de dados. --- app/__pycache__/main.cpython-314.pyc | Bin 355 -> 452 bytes app/api/__pycache__/routes.cpython-314.pyc | Bin 1056 -> 1056 bytes app/api/__pycache__/schemas.cpython-314.pyc | Bin 1071 -> 2319 bytes app/api/schemas.py | 18 +++++++ app/api/tool_routes.py | 54 ++++++++++++++++++++ app/core/settings.py | 8 +++ app/db/database.py | 21 ++++++++ app/db/models.py | 26 ++++++++++ app/main.py | 2 + app/repositories/tool_repository.py | 32 ++++++++++++ app/services/tool_registry.py | 6 +-- 11 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 app/api/tool_routes.py create mode 100644 app/db/database.py create mode 100644 app/db/models.py create mode 100644 app/repositories/tool_repository.py diff --git a/app/__pycache__/main.cpython-314.pyc b/app/__pycache__/main.cpython-314.pyc index 90865a66facd8e35ff2691b851518fcd359e3959..ead0288339dbb04023b7edc388c65fab777531c8 100644 GIT binary patch delta 206 zcmaFNbcC5#n~#@^0SI>FP0zeHkynzjVWPUMQXE4NlP8M@a|x?FLoA~rLlAQii#a1m z9RouNTP#}u|HLRc2@nktLndQcC+4{^a!lN+q9~kLP@tDskf~RapPv(7lwVqsT6~Ke z!6}+}Bh(#a1jy)OQy}qynURt4E`#)42F1G!rVrV8FNmmKVN+{he!#$dok8d#gU|%C SD-2RM;5_SV4Dv<1K%D?xLNTiV delta 119 zcmX@Y{FsSXn~#@^0SJz$Ps{9>$ScVhG*MkvES6D`A&5DM#hei&$G}j+63Y_6Juyvg z;xZdXwuz5bCTlW=nDGK-KnjXgfW!x8Mn=ZF4AOTQ6d$tjUJy~e!lu^1{D6V^I)l(f P2B8UN*BGRVxPb}*_8J;! diff --git a/app/api/__pycache__/routes.cpython-314.pyc b/app/api/__pycache__/routes.cpython-314.pyc index 6018e113c421979f414d9bccfea7202d79329d41..935d8cba2e3929d854c363982d96a13bc81e2eab 100644 GIT binary patch delta 45 scmZ3$v4DeHn~#@^0SImfPoKzrgQKuCwYa1xF=gZHg-meHLhOJ5|Tp2heeelQVB{cR7fQfMALGODkR(-hkZ^?obTM- zHBxv=prS84ga?H96Y{U{);Bl_A=Ib7;n=i1GIM(-=MYh|($3A!?9R@|Z|7c{EENF9 zpP&EW{lows(PB6<3Df@)nO)cfi><*blWdWAZB1L%rM_xNV-YIw0$BPSSjJs;Nmu7& zCYEMUnoUWwu{4KLGbPQ%(mYBFDXD2qoQGQRF&V6}DF2=#+#6xj^=n#WT=yC>(%%hs z8tOhpwPex1fQ*A~-v!AmklLmp_0tf-9av@-n*-mJhNa2O9gtZ|$7_seVrAQrmV2-3 z3faJH08JVOPKv7k29m367maLcZ`}uIqI4cUV%zK@+-9G^70qHVtA>>!< zA$0uutqtl2SR-RnAjqM5SomdAzk zy}%7ZRF_lNwYotAMHP$<9rGHtBPI7f>q=Lso&QANaDCsl4;Y^!2dNU*_$j13HzeeF zpH}Gk1Go=-W~dnx5#}=yQB+wIoiGsY$&jEDj{^yWfyVQ=IWoDc4Duo_Q94O}$6=~^ zt2oQFx0-ffq;4jv1szg#n=J3$IHbC%EX<-}omY_Z=V@aqf9FU@ge>p{B5~qKG-l#T z&rDolBMki&?jrb3PTL0FHcr~oF9~@@Ynk0M*kX;k#;wuY83ZXYJiSBcb+;IBpZ0{Oon zR~<=Ws)O3}Sj8123Uubg-unu4G5iwDO;-qjgteY|41oDj0M^WtO2R3ZoJy@~F;Cp_ zPC~y}P9%1T3X3l7!qXzlEcO7&(-PkGby7syxL(UgW@o4A1laqzj*=)VcRF6Mb@UWf zgFlD5_yxol9LIurRsDS4;cwzTf@YkNKXk^}udwhN%nuBWmG^4{z|X*BYMXWFaWXWfCAn~J}p`D?Hp-2!cGntn~i;*2@NTDuB z@)k!?YH>k+UU6y>$Pb!KMLZy7U{jfZETsmBvHX+gGRpz=?O~Rv2OA^=l=LeS1}T;X z639-F0||l%kOf6DAOfrfB;=>ba*Ly&G9@vuBr~}P Retirar antes de subir para a nuvem + db_host: str + db_port: int = 3306 + db_user: str + db_password: str + db_name: str + + class Config: env_file = ".env" diff --git a/app/db/database.py b/app/db/database.py new file mode 100644 index 0000000..8d156d5 --- /dev/null +++ b/app/db/database.py @@ -0,0 +1,21 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker, declarative_base +from app.core.settings import settings + +DATABASE_URL = ( + f"mysql+pymysql://{settings.db_user}:" + f"{settings.db_password}@" + f"{settings.db_host}:" + f"{settings.db_port}/" + f"{settings.db_name}" +) + +engine = create_engine(DATABASE_URL, echo=True) + +SessionLocal = sessionmaker( + autocommit=False, + autoflush=False, + bind=engine +) + +Base = declarative_base() diff --git a/app/db/models.py b/app/db/models.py new file mode 100644 index 0000000..05cb370 --- /dev/null +++ b/app/db/models.py @@ -0,0 +1,26 @@ +from sqlalchemy import Column, Integer, String, Text, JSON, TIMESTAMP +from sqlalchemy.sql import func +from app.db.database import Base + + +class Tool(Base): + __tablename__ = "tools" + + id = Column(Integer, primary_key=True, index=True) + + name = Column(String(100), unique=True, nullable=False) + + description = Column(Text, nullable=False) + + parameters = Column(JSON, nullable=False) + + created_at = Column( + TIMESTAMP, + server_default=func.current_timestamp() + ) + + updated_at = Column( + TIMESTAMP, + server_default=func.current_timestamp(), + onupdate=func.current_timestamp() + ) diff --git a/app/main.py b/app/main.py index 9185651..7cc170b 100644 --- a/app/main.py +++ b/app/main.py @@ -1,6 +1,8 @@ from fastapi import FastAPI from app.api.routes import router +from app.api.tool_routes import router as tool_router app = FastAPI(title="AI Orquestrador") app.include_router(router) +app.include_router(tool_router) \ No newline at end of file diff --git a/app/repositories/tool_repository.py b/app/repositories/tool_repository.py new file mode 100644 index 0000000..e9feacd --- /dev/null +++ b/app/repositories/tool_repository.py @@ -0,0 +1,32 @@ +from sqlalchemy.orm import Session +from app.db.models import Tool + + +class ToolRepository: + + def __init__(self, db: Session): + self.db = db + + def get_all(self): + return self.db.query(Tool).all() + + def get_by_id(self, tool_id: int): + return self.db.query(Tool).filter(Tool.id == tool_id).first() + + def create(self, name: str, description: str, parameters: dict): + tool = Tool( + name=name, + description=description, + parameters=parameters + ) + self.db.add(tool) + self.db.commit() + self.db.refresh(tool) + return tool + + def delete(self, tool_id: int): + tool = self.get_by_id(tool_id) + if tool: + self.db.delete(tool) + self.db.commit() + return tool diff --git a/app/services/tool_registry.py b/app/services/tool_registry.py index 32620cf..ebab905 100644 --- a/app/services/tool_registry.py +++ b/app/services/tool_registry.py @@ -1,13 +1,13 @@ from typing import List from app.models.tool_model import ToolDefinition -from app.integrations.estoque_service import consultar_estoque +# from app.integrations.estoque_service import consultar_estoque class ToolRegistry: def __init__(self): self._tools = [] - + """ # Registrando manualmente por enquanto, porém isso poderia vir de um BD. self.register_tool( name="consultar_estoque", @@ -24,7 +24,7 @@ class ToolRegistry: }, handler=consultar_estoque ) - + """ # O método abaixo serve para adicionar uma nova tool ao sistema (podendo inserir a lógica de adcicionar ao BD futuramente). def register_tool(self, name, description, parameters, handler):