Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c182d1815 | ||
|
|
e4de011b63 |
@@ -0,0 +1,32 @@
|
|||||||
|
# Base : Ubuntu avec ROCm 6.0
|
||||||
|
FROM rocm/rocm-terminal:6.0
|
||||||
|
|
||||||
|
# Installer les dépendances pour llama.cpp
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
cmake \
|
||||||
|
git \
|
||||||
|
python3 \
|
||||||
|
python3-pip \
|
||||||
|
python3-venv \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Installer llama.cpp avec support ROCm
|
||||||
|
RUN git clone https://github.com/ggerganov/llama.cpp /llama.cpp \
|
||||||
|
&& cd /llama.cpp \
|
||||||
|
&& git pull \
|
||||||
|
&& cmake -DLLAMA_HIPBLAS=ON . \ # Active le support ROCm
|
||||||
|
&& make -j$(nproc)
|
||||||
|
|
||||||
|
# Créer un environnement Python
|
||||||
|
RUN python3 -m venv /opt/venv
|
||||||
|
ENV PATH="/opt/venv/bin:$PATH"
|
||||||
|
COPY requirements.txt /tmp/
|
||||||
|
RUN pip install --no-cache-dir -r /tmp/requirements.txt
|
||||||
|
|
||||||
|
# Copier les scripts et le modèle
|
||||||
|
COPY scripts/ /app/
|
||||||
|
COPY config/model.gguf /models/
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Point d'entrée
|
||||||
|
CMD ["python", "agent_gsd.py"]
|
||||||
@@ -0,0 +1,73 @@
|
|||||||
|
from langchain_community.llms import LlamaCpp
|
||||||
|
from langchain_core.prompts import ChatPromptTemplate
|
||||||
|
from crewai import Agent, Task, Crew
|
||||||
|
import os
|
||||||
|
|
||||||
|
# 1. Charger le modèle avec ROCm (GPU) + CPU
|
||||||
|
llm = LlamaCpp(
|
||||||
|
model_path="/models/model.gguf",
|
||||||
|
n_ctx=4096, # Contexte étendu pour le code
|
||||||
|
n_gpu_layers=32, # Utilise le GPU pour 32 couches (ajuste selon ta RAM)
|
||||||
|
n_threads=8, # Utilise 8 threads CPU pour le reste
|
||||||
|
temperature=0.1,
|
||||||
|
verbose=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# 2. Définir l'agent GSD
|
||||||
|
code_agent = Agent(
|
||||||
|
role="Senior Full-Stack Developer",
|
||||||
|
goal="Développer des fonctionnalités complètes (backend + frontend + DB) en Rust, TypeScript, Kotlin, SQL",
|
||||||
|
backstory="Tu es un expert en Rust (Actix), TypeScript (Angular), Kotlin (Spring Boot), et SQL (PostgreSQL). "
|
||||||
|
"Tu utilises la méthodologie GSD : tu décomposes les tâches, génères du code propre, et valides chaque étape.",
|
||||||
|
tools=[], # On ajoutera des outils plus tard
|
||||||
|
llm=llm,
|
||||||
|
verbose=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# 3. Prompt personnalisé pour le mode GSD
|
||||||
|
gsd_prompt = """
|
||||||
|
Tu es en mode **Get Shit Done (GSD)**. Voici comment procéder :
|
||||||
|
1. **Analyse** : Décompose la demande en sous-tâches claires (ex: backend, frontend, DB).
|
||||||
|
2. **Génération** : Pour chaque sous-tâche, génère le code **complet et fonctionnel** dans le langage demandé.
|
||||||
|
3. **Validation** : Vérifie que le code est compilable/lintable. Si non, corrige-le.
|
||||||
|
4. **Retour** : Fournis le code final + des instructions pour l'intégrer.
|
||||||
|
|
||||||
|
**Exemple de demande** :
|
||||||
|
"J'aimerai rendre configurable la durée de validité des tokens JWT dans mon backend Rust + frontend Angular."
|
||||||
|
|
||||||
|
**Ta réponse doit inclure** :
|
||||||
|
- [ ] Code Rust (Actix) pour modifier la configuration JWT.
|
||||||
|
- [ ] Schéma SQL pour stocker la configuration en DB.
|
||||||
|
- [ ] Endpoint HTTP pour modifier la configuration.
|
||||||
|
- [ ] Code TypeScript (Angular) pour le formulaire.
|
||||||
|
- [ ] Instructions pour tester chaque partie.
|
||||||
|
|
||||||
|
**Contraintes** :
|
||||||
|
- Utilise **Actix-Web** pour Rust.
|
||||||
|
- Utilise **Angular Material** pour le frontend.
|
||||||
|
- Pour Kotlin, utilise **Spring Boot 3 + JPA**.
|
||||||
|
- Pour SQL, utilise **PostgreSQL**.
|
||||||
|
|
||||||
|
**Demande actuelle** : {user_request}
|
||||||
|
"""
|
||||||
|
|
||||||
|
# 4. Exécuter une tâche GSD
|
||||||
|
def run_gsd_task(user_request: str):
|
||||||
|
task = Task(
|
||||||
|
description=gsd_prompt.format(user_request=user_request),
|
||||||
|
agent=code_agent,
|
||||||
|
expected_output="Code complet et fonctionnel pour chaque sous-tâche, avec instructions d'intégration.",
|
||||||
|
)
|
||||||
|
crew = Crew(agents=[code_agent], tasks=[task], verbose=2)
|
||||||
|
result = crew.kickoff()
|
||||||
|
return result
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("Agent GSD démarré. Tape 'quit' pour arrêter.")
|
||||||
|
while True:
|
||||||
|
user_request = input("\n> ")
|
||||||
|
if user_request.lower() == "quit":
|
||||||
|
break
|
||||||
|
result = run_gsd_task(user_request)
|
||||||
|
print("\n--- Résultat ---\n")
|
||||||
|
print(result)
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
name: mistral-local
|
||||||
|
|
||||||
|
services:
|
||||||
|
local-agent:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
image: local-agent
|
||||||
|
container_name: local-agent
|
||||||
|
networks:
|
||||||
|
- mistral-net
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:8080:8080"
|
||||||
|
# Limites de ressources
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 12g
|
||||||
|
cpus: "8"
|
||||||
|
# Sécurité
|
||||||
|
read_only: true
|
||||||
|
security_opt:
|
||||||
|
- no-new-privileges:true
|
||||||
|
tmpfs:
|
||||||
|
- /tmp:size=256m
|
||||||
|
devices:
|
||||||
|
- /dev/dri:/dev/dri
|
||||||
|
group_add:
|
||||||
|
- video
|
||||||
|
environment:
|
||||||
|
- GGML_VK_VISIBLE_DEVICES=0
|
||||||
|
volumes:
|
||||||
|
- ../ai-models/mistral-7b-instruct.gguf:/home/llama/models/mistral-7b-instruct.gguf:ro
|
||||||
|
- ../workspace:/home/llama/workspace
|
||||||
|
|
||||||
|
networks:
|
||||||
|
local-agent-net:
|
||||||
|
name: local-agent-net
|
||||||
|
driver: bridge
|
||||||
|
internal: false # pas de passerelle vers Internet
|
||||||
|
driver_opts:
|
||||||
|
com.docker.network.bridge.name: br-local-agent
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
action=$1
|
||||||
|
args=$2
|
||||||
|
|
||||||
|
build_image() {
|
||||||
|
docker build $args -t local-agent .
|
||||||
|
}
|
||||||
|
|
||||||
|
start_container() {
|
||||||
|
# Premier démarrage (build + lancement)
|
||||||
|
docker compose up --build
|
||||||
|
|
||||||
|
# Voir les logs en temps réel
|
||||||
|
docker compose logs -f
|
||||||
|
|
||||||
|
# Arrêter
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# Vérifier l'état du health check
|
||||||
|
docker compose ps
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
if [[ $action = 'build' ]] then
|
||||||
|
build_image
|
||||||
|
elif [[ $action = 'all' ]] then
|
||||||
|
build_image
|
||||||
|
start_container
|
||||||
|
else
|
||||||
|
start_container
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
main
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
langchain==0.2.0
|
||||||
|
langchain-community==0.2.0
|
||||||
|
crewai==0.1.0 # Pour la méthodologie GSD
|
||||||
|
sqlmodel==0.0.16
|
||||||
|
pydantic==2.6.0
|
||||||
|
black==24.2.0 # Pour formater le code généré
|
||||||
|
ruff==0.3.0 # Linter
|
||||||
@@ -64,8 +64,7 @@ RUN mkdir -p /home/llama/models
|
|||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
|
|
||||||
CMD ["llama-server", \
|
CMD ["llama-server", \
|
||||||
"--model", "/home/llama/models/mistral-7b-instruct.gguf", \
|
"--model", "/home/llama/models/Codestral-22B-v0.1-Q4_K_M.gguf", \
|
||||||
"--host", "0.0.0.0", \
|
"--host", "0.0.0.0", \
|
||||||
"--port", "8080", \
|
"--port", "8080", \
|
||||||
"-c", "4096", \
|
"-c", "4096"]
|
||||||
"-ngl", "33"]
|
|
||||||
@@ -30,8 +30,8 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- GGML_VK_VISIBLE_DEVICES=0
|
- GGML_VK_VISIBLE_DEVICES=0
|
||||||
volumes:
|
volumes:
|
||||||
- ./ai-models/mistral-7b-instruct.gguf:/home/llama/models/mistral-7b-instruct.gguf:ro
|
- ../ai-models:/home/llama/models:ro
|
||||||
- ./workspace:/home/llama/workspace
|
- ../workspace:/home/llama/workspace
|
||||||
|
|
||||||
# Health check — vérifie que le serveur répond
|
# Health check — vérifie que le serveur répond
|
||||||
# healthcheck:
|
# healthcheck:
|
||||||
Reference in New Issue
Block a user