Transformers
Spanish
English
devops
uncensored
abliterated
llama-3
agents
orchestrator
system-management
code-generation
android
windows
linux
Instructions to use N11100/devops-orchestrator-ai with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use N11100/devops-orchestrator-ai with Transformers:
# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("N11100/devops-orchestrator-ai", dtype="auto") - Notebooks
- Google Colab
- Kaggle
Upload folder using huggingface_hub
Browse files- .gitignore +4 -0
- README.md +104 -0
- orchestrator.py +108 -0
- requirements.txt +4 -0
- run.sh +8 -0
- setup.py +30 -0
- system_tools.py +55 -0
.gitignore
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.env
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.pyc
|
| 4 |
+
generated_code.py
|
README.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# DevOps Senior AI Orchestrator (Uncensored)
|
| 2 |
+
|
| 3 |
+
Este proyecto implementa un orquestador de IA y agentes especializados para tareas de DevOps, con un enfoque en la gestión de sistemas y la generación de código. Utiliza un modelo de lenguaje grande (LLM) "abliterated" para garantizar la ausencia de restricciones y censura en sus respuestas. El sistema está diseñado para ser compatible con Android (vía Termux), Windows y Linux.
|
| 4 |
+
|
| 5 |
+
## Características
|
| 6 |
+
- **Orquestador Central:** Interpreta peticiones en lenguaje natural y delega tareas a agentes.
|
| 7 |
+
- **Agentes Especializados:** SysAdmin, Developer y Auditor para manejar diferentes tipos de tareas.
|
| 8 |
+
- **Modelos "Abliterated":** Utiliza modelos de lenguaje sin censura para una máxima flexibilidad.
|
| 9 |
+
- **Compatibilidad Multiplataforma:** Diseñado para funcionar en Android, Windows y Linux.
|
| 10 |
+
- **Modificación de Sistema:** Capacidad para generar y (simular) ejecutar comandos de sistema y código.
|
| 11 |
+
|
| 12 |
+
## Arquitectura
|
| 13 |
+
El orquestador utiliza el modelo `failspy/Meta-Llama-3-8B-Instruct-abliterated-v3` de Hugging Face para el procesamiento del lenguaje natural y la generación de respuestas. Los agentes interactúan con herramientas de sistema (simuladas por ahora) para realizar sus funciones.
|
| 14 |
+
|
| 15 |
+
## Requisitos
|
| 16 |
+
- Python 3.11+
|
| 17 |
+
- `pip` (o `uv pip`)
|
| 18 |
+
- Git
|
| 19 |
+
- Para Android: Termux
|
| 20 |
+
- Para Windows: PowerShell o WSL2
|
| 21 |
+
|
| 22 |
+
## Instalación y Configuración
|
| 23 |
+
|
| 24 |
+
### 1. Clonar el Repositorio
|
| 25 |
+
```bash
|
| 26 |
+
git clone https://github.com/tu_usuario/devops_orchestrator_ai.git # Reemplazar con el repo real
|
| 27 |
+
cd devops_orchestrator_ai
|
| 28 |
+
```
|
| 29 |
+
|
| 30 |
+
### 2. Configurar el Token de Hugging Face
|
| 31 |
+
Crea un archivo `.env` en la raíz del proyecto con tu token de Hugging Face. Este token es necesario para descargar el modelo. **Asegúrate de que este archivo no se suba a repositorios públicos.**
|
| 32 |
+
|
| 33 |
+
```
|
| 34 |
+
HF_TOKEN=tu_token_de_hugging_face
|
| 35 |
+
```
|
| 36 |
+
|
| 37 |
+
### 3. Instalar Dependencias
|
| 38 |
+
```bash
|
| 39 |
+
sudo pip3 install -r requirements.txt
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
### 4. Ejecutar el Orquestador
|
| 43 |
+
```bash
|
| 44 |
+
python3 orchestrator.py
|
| 45 |
+
```
|
| 46 |
+
|
| 47 |
+
## Uso
|
| 48 |
+
Una vez ejecutado, el orquestador estará listo para recibir peticiones en lenguaje natural. Por ejemplo:
|
| 49 |
+
|
| 50 |
+
```python
|
| 51 |
+
orchestrator = DevOpsOrchestrator()
|
| 52 |
+
response = orchestrator.process_request("Instala Apache en el servidor Ubuntu.")
|
| 53 |
+
print(response)
|
| 54 |
+
|
| 55 |
+
response = orchestrator.process_request("Escribe un script Python que lea un archivo CSV y lo convierta a JSON.")
|
| 56 |
+
print(response)
|
| 57 |
+
```
|
| 58 |
+
|
| 59 |
+
## Modificación del Sistema y Agentes
|
| 60 |
+
|
| 61 |
+
### Añadir Nuevas Herramientas a `system_tools.py`
|
| 62 |
+
La clase `SystemTools` en `system_tools.py` es el punto de extensión para nuevas capacidades. Puedes añadir métodos para interactuar con APIs, bases de datos, o cualquier otra herramienta que desees que los agentes utilicen.
|
| 63 |
+
|
| 64 |
+
```python
|
| 65 |
+
# Ejemplo en system_tools.py
|
| 66 |
+
class SystemTools:
|
| 67 |
+
# ... métodos existentes ...
|
| 68 |
+
|
| 69 |
+
def query_database(self, db_connection_string: str, query: str) -> dict:
|
| 70 |
+
try:
|
| 71 |
+
# Lógica para ejecutar la consulta a la base de datos
|
| 72 |
+
pass
|
| 73 |
+
except Exception as e:
|
| 74 |
+
return {"success": False, "error": str(e)}
|
| 75 |
+
```
|
| 76 |
+
|
| 77 |
+
### Extender Agentes Existentes o Crear Nuevos
|
| 78 |
+
Los agentes se definen en `orchestrator.py`. Puedes modificar los `handle_task` de los agentes existentes o crear nuevos agentes para tareas específicas.
|
| 79 |
+
|
| 80 |
+
```python
|
| 81 |
+
# Ejemplo: Nuevo Agente de Redes
|
| 82 |
+
class NetworkAgent(BaseAgent):
|
| 83 |
+
def handle_task(self, task: str):
|
| 84 |
+
network_prompt = f"Eres un experto en redes. Genera los comandos para la siguiente tarea de red. Tarea: {task}"
|
| 85 |
+
commands = self.llm_pipeline(network_prompt, max_new_tokens=500)[0]["generated_text"]
|
| 86 |
+
# Aquí podrías usar self.system_tools.execute_shell_command(command)
|
| 87 |
+
return f"NetworkAgent ejecutó: {commands}"
|
| 88 |
+
|
| 89 |
+
# En DevOpsOrchestrator.__init__
|
| 90 |
+
# self.agents["network"] = NetworkAgent(self.llm_pipeline, self.system_tools)
|
| 91 |
+
|
| 92 |
+
# En DevOpsOrchestrator.process_request
|
| 93 |
+
# elif "red" in request.lower():
|
| 94 |
+
# return self.agents["network"].handle_task(request)
|
| 95 |
+
```
|
| 96 |
+
|
| 97 |
+
### Ajustar Prompts de Sistema
|
| 98 |
+
Los prompts que guían a cada agente se encuentran directamente en sus métodos `handle_task`. Puedes ajustarlos para refinar el comportamiento y las respuestas de los agentes.
|
| 99 |
+
|
| 100 |
+
## Contribución
|
| 101 |
+
¡Las contribuciones son bienvenidas! Por favor, abre un issue o envía un pull request.
|
| 102 |
+
|
| 103 |
+
## Licencia
|
| 104 |
+
Este proyecto está bajo la licencia MIT. (O la que elijas)
|
orchestrator.py
ADDED
|
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import os
|
| 3 |
+
from dotenv import load_dotenv
|
| 4 |
+
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
|
| 5 |
+
import torch
|
| 6 |
+
from system_tools import SystemTools
|
| 7 |
+
|
| 8 |
+
load_dotenv()
|
| 9 |
+
HF_TOKEN = os.getenv("HF_TOKEN")
|
| 10 |
+
|
| 11 |
+
class DevOpsOrchestrator:
|
| 12 |
+
def __init__(self, model_name="failspy/Meta-Llama-3-8B-Instruct-abliterated-v3"):
|
| 13 |
+
self.model_name = model_name
|
| 14 |
+
|
| 15 |
+
# Load tokenizer and model
|
| 16 |
+
self.tokenizer = AutoTokenizer.from_pretrained(self.model_name, token=HF_TOKEN)
|
| 17 |
+
self.model = AutoModelForCausalLM.from_pretrained(self.model_name, token=HF_TOKEN, torch_dtype=torch.bfloat16)
|
| 18 |
+
|
| 19 |
+
# Initialize the text generation pipeline
|
| 20 |
+
self.llm_pipeline = pipeline(
|
| 21 |
+
"text-generation",
|
| 22 |
+
model=self.model,
|
| 23 |
+
tokenizer=self.tokenizer,
|
| 24 |
+
torch_dtype=torch.bfloat16,
|
| 25 |
+
device=0 if torch.cuda.is_available() else -1 # Use GPU if available
|
| 26 |
+
)
|
| 27 |
+
|
| 28 |
+
self.system_tools = SystemTools()
|
| 29 |
+
self.agents = {
|
| 30 |
+
"sysadmin": SysAdminAgent(self.llm_pipeline, self.system_tools),
|
| 31 |
+
"developer": DeveloperAgent(self.llm_pipeline, self.system_tools),
|
| 32 |
+
"auditor": AuditorAgent(self.llm_pipeline, self.system_tools)
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
def process_request(self, request: str):
|
| 36 |
+
# Step 1: Analyze the request and break it down into sub-tasks
|
| 37 |
+
analysis_prompt = f"Analiza la siguiente petición y descompónla en una lista de sub-tareas para un equipo DevOps. Identifica qué tipo de agente (sysadmin, developer, auditor) sería el más adecuado para cada sub-tarea. Petición: {request}"
|
| 38 |
+
|
| 39 |
+
# Use the pipeline for generation
|
| 40 |
+
analysis_result = self.llm_pipeline(analysis_prompt, max_new_tokens=500, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)[0]["generated_text"]
|
| 41 |
+
print(f"Análisis de la petición:\n{analysis_result}\n")
|
| 42 |
+
|
| 43 |
+
# For now, a simplified delegation. In a real system, this would parse analysis_result
|
| 44 |
+
# and create a structured plan.
|
| 45 |
+
if "código" in request.lower() or "desarrollar" in request.lower() or "script" in request.lower():
|
| 46 |
+
print("Delegando a DeveloperAgent...")
|
| 47 |
+
return self.agents["developer"].handle_task(request)
|
| 48 |
+
elif "sistema" in request.lower() or "servidor" in request.lower() or "instalar" in request.lower() or "configurar" in request.lower():
|
| 49 |
+
print("Delegando a SysAdminAgent...")
|
| 50 |
+
return self.agents["sysadmin"].handle_task(request)
|
| 51 |
+
else:
|
| 52 |
+
return "No se pudo delegar la tarea a un agente específico. Por favor, sé más explícito."
|
| 53 |
+
|
| 54 |
+
class BaseAgent:
|
| 55 |
+
def __init__(self, llm_pipeline, system_tools):
|
| 56 |
+
self.llm_pipeline = llm_pipeline
|
| 57 |
+
self.system_tools = system_tools
|
| 58 |
+
|
| 59 |
+
def handle_task(self, task: str):
|
| 60 |
+
raise NotImplementedError
|
| 61 |
+
|
| 62 |
+
class SysAdminAgent(BaseAgent):
|
| 63 |
+
def handle_task(self, task: str):
|
| 64 |
+
sysadmin_prompt = f"Eres un SysAdmin experto. Genera los comandos de terminal (bash para Linux/Android, PowerShell para Windows) necesarios para ejecutar la siguiente tarea. Sé conciso y proporciona solo los comandos. Tarea: {task}"
|
| 65 |
+
commands_text = self.llm_pipeline(sysadmin_prompt, max_new_tokens=500, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)[0]["generated_text"]
|
| 66 |
+
print(f"Comandos generados por SysAdmin:\n{commands_text}\n")
|
| 67 |
+
|
| 68 |
+
# Simulate execution
|
| 69 |
+
# In a real scenario, you'd parse commands_text and execute each command
|
| 70 |
+
# For now, just return the generated commands
|
| 71 |
+
# For demonstration, let's assume we are on Linux/Android for shell execution
|
| 72 |
+
# result = self.system_tools.execute_shell_command(commands_text.split(\'\n\')[0], os_type=\'linux\') # Execute first command
|
| 73 |
+
return f"SysAdmin generó comandos: {commands_text}"
|
| 74 |
+
|
| 75 |
+
class DeveloperAgent(BaseAgent):
|
| 76 |
+
def handle_task(self, task: str):
|
| 77 |
+
developer_prompt = f"Eres un Developer experto. Genera el código (Python por defecto, a menos que se especifique lo contrario) para la siguiente tarea. Sé conciso y proporciona solo el código. Tarea: {task}"
|
| 78 |
+
code_text = self.llm_pipeline(developer_prompt, max_new_tokens=1000, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)[0]["generated_text"]
|
| 79 |
+
print(f"Código generado por Developer:\n{code_text}\n")
|
| 80 |
+
|
| 81 |
+
# Simulate saving code to a file
|
| 82 |
+
file_path = "generated_code.py"
|
| 83 |
+
save_result = self.system_tools.write_file(file_path, code_text)
|
| 84 |
+
if save_result["success"]:
|
| 85 |
+
return f"Developer generó código y lo guardó en {file_path}: {code_text}"
|
| 86 |
+
else:
|
| 87 |
+
return f"Developer generó código pero falló al guardarlo: {save_result['error']}"
|
| 88 |
+
|
| 89 |
+
class AuditorAgent(BaseAgent):
|
| 90 |
+
def handle_task(self, task: str):
|
| 91 |
+
auditor_prompt = f"Eres un Auditor de seguridad y calidad. Revisa la siguiente tarea y proporciona una evaluación de riesgos o mejoras. Tarea: {task}"
|
| 92 |
+
review = self.llm_pipeline(auditor_prompt, max_new_tokens=500, do_sample=True, temperature=0.7, top_k=50, top_p=0.95)[0]["generated_text"]
|
| 93 |
+
print(f"Revisión de Auditor:\n{review}\n")
|
| 94 |
+
return f"Auditor revisó: {review}"
|
| 95 |
+
|
| 96 |
+
def main():
|
| 97 |
+
orchestrator = DevOpsOrchestrator()
|
| 98 |
+
print("\n--- Probando SysAdminAgent ---")
|
| 99 |
+
response_sysadmin = orchestrator.process_request("Instala Nginx en el servidor Linux.")
|
| 100 |
+
print(response_sysadmin)
|
| 101 |
+
|
| 102 |
+
print("\n--- Probando DeveloperAgent ---")
|
| 103 |
+
response_developer = orchestrator.process_request("Escribe un script Python para listar archivos en un directorio.")
|
| 104 |
+
print(response_developer)
|
| 105 |
+
|
| 106 |
+
if __name__ == "__main__":
|
| 107 |
+
main()
|
| 108 |
+
|
requirements.txt
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
transformers
|
| 2 |
+
pydantic
|
| 3 |
+
python-dotenv
|
| 4 |
+
torch
|
run.sh
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
#!/bin/bash
|
| 3 |
+
|
| 4 |
+
# Instalar dependencias
|
| 5 |
+
sudo pip3 install -r requirements.txt
|
| 6 |
+
|
| 7 |
+
# Ejecutar el orquestador
|
| 8 |
+
python3 orchestrator.py
|
setup.py
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
from setuptools import setup, find_packages
|
| 3 |
+
|
| 4 |
+
setup(
|
| 5 |
+
name='devops_orchestrator_ai',
|
| 6 |
+
version='0.1.0',
|
| 7 |
+
packages=find_packages(),
|
| 8 |
+
install_requires=[
|
| 9 |
+
'transformers',
|
| 10 |
+
'pydantic',
|
| 11 |
+
'python-dotenv',
|
| 12 |
+
'torch',
|
| 13 |
+
],
|
| 14 |
+
entry_points={
|
| 15 |
+
'console_scripts': [
|
| 16 |
+
'devops-orchestrator = devops_orchestrator_ai.orchestrator:main',
|
| 17 |
+
],
|
| 18 |
+
},
|
| 19 |
+
author='Manus AI',
|
| 20 |
+
description='An uncensored AI orchestrator for DevOps tasks and code generation.',
|
| 21 |
+
long_description=open('README.md').read(),
|
| 22 |
+
long_description_content_type='text/markdown',
|
| 23 |
+
url='https://github.com/tu_usuario/devops_orchestrator_ai', # Reemplazar con el repo real
|
| 24 |
+
classifiers=[
|
| 25 |
+
'Programming Language :: Python :: 3',
|
| 26 |
+
'License :: OSI Approved :: MIT License',
|
| 27 |
+
'Operating System :: OS Independent',
|
| 28 |
+
],
|
| 29 |
+
python_requires='>=3.11',
|
| 30 |
+
)
|
system_tools.py
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
|
| 2 |
+
import subprocess
|
| 3 |
+
import os
|
| 4 |
+
|
| 5 |
+
class SystemTools:
|
| 6 |
+
def execute_shell_command(self, command: str, os_type: str = "linux") -> dict:
|
| 7 |
+
"""Ejecuta un comando de shell y devuelve su salida."""
|
| 8 |
+
try:
|
| 9 |
+
if os_type == "windows":
|
| 10 |
+
# For Windows, use powershell.exe
|
| 11 |
+
process = subprocess.run(["powershell.exe", "-Command", command], capture_output=True, text=True, check=True, shell=True)
|
| 12 |
+
else: # Default to linux/android (bash)
|
| 13 |
+
process = subprocess.run(command, capture_output=True, text=True, check=True, shell=True)
|
| 14 |
+
return {"success": True, "output": process.stdout.strip(), "error": None}
|
| 15 |
+
except subprocess.CalledProcessError as e:
|
| 16 |
+
return {"success": False, "output": e.stdout.strip(), "error": e.stderr.strip()}
|
| 17 |
+
except Exception as e:
|
| 18 |
+
return {"success": False, "output": None, "error": str(e)}
|
| 19 |
+
|
| 20 |
+
def write_file(self, path: str, content: str) -> dict:
|
| 21 |
+
"""Escribe contenido en un archivo."""
|
| 22 |
+
try:
|
| 23 |
+
os.makedirs(os.path.dirname(path), exist_ok=True)
|
| 24 |
+
with open(path, "w") as f:
|
| 25 |
+
f.write(content)
|
| 26 |
+
return {"success": True, "message": f"Archivo {path} escrito exitosamente.", "error": None}
|
| 27 |
+
except Exception as e:
|
| 28 |
+
return {"success": False, "message": None, "error": str(e)}
|
| 29 |
+
|
| 30 |
+
def read_file(self, path: str) -> dict:
|
| 31 |
+
"""Lee el contenido de un archivo."""
|
| 32 |
+
try:
|
| 33 |
+
with open(path, "r") as f:
|
| 34 |
+
content = f.read()
|
| 35 |
+
return {"success": True, "content": content, "error": None}
|
| 36 |
+
except FileNotFoundError:
|
| 37 |
+
return {"success": False, "content": None, "error": f"Archivo {path} no encontrado."}
|
| 38 |
+
except Exception as e:
|
| 39 |
+
return {"success": False, "content": None, "error": str(e)}
|
| 40 |
+
|
| 41 |
+
def list_directory(self, path: str = ".") -> dict:
|
| 42 |
+
"""Lista el contenido de un directorio."""
|
| 43 |
+
try:
|
| 44 |
+
items = os.listdir(path)
|
| 45 |
+
return {"success": True, "items": items, "error": None}
|
| 46 |
+
except FileNotFoundError:
|
| 47 |
+
return {"success": False, "items": None, "error": f"Directorio {path} no encontrado."}
|
| 48 |
+
except Exception as e:
|
| 49 |
+
return {"success": False, "items": None, "error": str(e)}
|
| 50 |
+
|
| 51 |
+
# Placeholder for package management, more complex and OS-specific
|
| 52 |
+
def manage_package(self, package_name: str, action: str, os_type: str = "linux") -> dict:
|
| 53 |
+
"""Gestiona paquetes (instalar, desinstalar, etc.). Placeholder."""
|
| 54 |
+
return {"success": False, "message": "Gestión de paquetes no implementada completamente aún.", "error": "NotImplemented"}
|
| 55 |
+
|