diff --git a/Dockerfile.backend b/Dockerfile.backend index d9d2fa2..97906b0 100644 --- a/Dockerfile.backend +++ b/Dockerfile.backend @@ -27,10 +27,13 @@ RUN pip install --no-cache-dir -r requirements.txt COPY api.py . COPY sources/ ./sources/ COPY prompts/ ./prompts/ +COPY crx/ crx/ +COPY llm_router/ llm_router/ +COPY .env . COPY config.ini . # Expose port EXPOSE 8000 # Run the application -CMD ["uvicorn", "api:api", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file +CMD ["python3", "api.py"] \ No newline at end of file diff --git a/README_CHS.md b/README_CHS.md index 11aae30..0c7de89 100644 --- a/README_CHS.md +++ b/README_CHS.md @@ -439,11 +439,14 @@ https://googlechromelabs.github.io/chrome-for-testing/ ## FAQ -**Q:我需要什么的硬体配备?** +**Q:我需要什么样的硬体配备?** -7B 型号:具有 8GB VRAM 的 GPU。 -14B 型号:12GB GPU(例如 RTX 3060)。 -32B 型号:24GB+ VRAM。 +| 模型大小 | GPU | 说明 | +|-----------|--------|-----------------------------------------------------------| +| 7B | 8GB VRAM | ⚠️ 不推荐。性能较差,容易出现幻觉,规划代理可能会失败。 | +| 14B | 12GB VRAM(例如 RTX 3060) | ✅ 可用于简单任务。可能在网页浏览和规划任务上表现较弱。 | +| 32B | 24GB+ VRAM(例如 RTX 4090) | 🚀 能完成大多数任务,但在任务规划上可能仍有困难。 | +| 70B+ | 48GB+ VRAM(例如 Mac Studio) | 💪 表现优秀。推荐用于高级用例。 | **Q:为什么选择 Deepseek R1 而不是其他模型?** diff --git a/README_FR.md b/README_FR.md index c7cdc74..72351fc 100644 --- a/README_FR.md +++ b/README_FR.md @@ -383,13 +383,14 @@ Et téléchargez la version de chromedriver correspondant à votre système d’ Si cette section est incomplète, merci de faire une nouvelle issue sur github. ## FAQ +**Q: Quel matériel est nécessaire ?** -**Q: J'ai besoin d'un gros PC?** - -ça dépend du modèle! -Pour un modèle 7B : GPU avec 8 Go de VRAM. -Pour un modèle 14B : GPU 12 Go (par exemple, RTX 3060). -Et un modèle 32B : 24 Go+ de VRAM. +| Taille du Modèle | GPU | Commentaire | +|--------------------|------|----------------------------------------------------------| +| 7B | 8 Go VRAM | ⚠️ Non recommandé. Performances médiocres, hallucinations fréquentes, et l'agent planificateur échouera probablement. | +| 14B | 12 Go VRAM (par ex. RTX 3060) | ✅ Utilisable pour des tâches simples. Peut rencontrer des difficultés avec la navigation web et les tâches de planification. | +| 32B | 24+ Go VRAM (par ex. RTX 4090) | 🚀 Réussite avec la plupart des tâches, peut encore avoir des difficultés avec la planification des tâches. | +| 70B+ | 48+ Go VRAM (par ex. Mac Studio) | 💪 Excellent. Recommandé pour des cas d'utilisation avancés. | **Q: Pourquoi deepseek et pas un autre modèle** diff --git a/api.py b/api.py index 742855b..1bebd88 100755 --- a/api.py +++ b/api.py @@ -24,14 +24,14 @@ from concurrent.futures import ThreadPoolExecutor from celery import Celery -app = FastAPI(title="AgenticSeek API", version="0.1.0") +api = FastAPI(title="AgenticSeek API", version="0.1.0") celery_app = Celery("tasks", broker="redis://localhost:6379/0", backend="redis://localhost:6379/0") celery_app.conf.update(task_track_started=True) logger = Logger("backend.log") config = configparser.ConfigParser() config.read('config.ini') -app.add_middleware( +api.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, @@ -41,7 +41,7 @@ app.add_middleware( if not os.path.exists(".screenshots"): os.makedirs(".screenshots") -app.mount("/screenshots", StaticFiles(directory=".screenshots"), name="screenshots") +api.mount("/screenshots", StaticFiles(directory=".screenshots"), name="screenshots") executor = ThreadPoolExecutor(max_workers=1) @@ -106,7 +106,7 @@ def initialize_system(): interaction = initialize_system() is_generating = False -@app.get("/screenshot") +@api.get("/screenshot") async def get_screenshot(): logger.info("Screenshot endpoint called") screenshot_path = ".screenshots/updated_screen.png" @@ -118,12 +118,12 @@ async def get_screenshot(): content={"error": "No screenshot available"} ) -@app.get("/health") +@api.get("/health") async def health_check(): logger.info("Health check endpoint called") return {"status": "healthy", "version": "0.1.0"} -@app.get("/is_active") +@api.get("/is_active") async def is_active(): logger.info("Is active endpoint called") return {"is_active": interaction.is_active} @@ -146,7 +146,7 @@ def think_wrapper(interaction, query, tts_enabled): interaction.last_success = False raise e -@app.post("/query", response_model=QueryResponse) +@api.post("/query", response_model=QueryResponse) async def process_query(request: QueryRequest): global is_generating logger.info(f"Processing query: {request.query}") @@ -199,4 +199,4 @@ async def process_query(request: QueryRequest): interaction.save_session() if __name__ == "__main__": - uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file + uvicorn.run(api, host="0.0.0.0", port=8000) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 32a558d..b1e2df9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -61,13 +61,54 @@ services: - ./screenshots:/app/screenshots environment: - NODE_ENV=development - - CHOKIDAR_USEPOLLING=true # Ensure file watching works in Docker - - BACKEND_URL=http://host.docker.internal:8000 + - CHOKIDAR_USEPOLLING=true + - BACKEND_URL=http://backend:8000 + networks: + - agentic-seek-net + + backend: + container_name: backend + build: + context: ./ + dockerfile: Dockerfile.backend + stdin_open: true + tty: true + shm_size: 6g + ports: + - "8000:8000" + volumes: + - ./:/app + #network_mode: host + environment: + - NODE_ENV=development + - REDIS_URL=redis://redis:6379/0 + - SEARXNG_URL=http://searxng:8080 + - OLLAMA_URL=http://localhost:11434 + - LM_STUDIO_URL=http://localhost:1234 + extra_hosts: + - "host.docker.internal:host-gateway" + depends_on: + - redis + - searxng + - selenium + networks: + - agentic-seek-net + + selenium: + image: selenium/standalone-chrome + platform: linux/amd64 + shm_size: 2g + volumes: + - /dev/shm:/dev/shm + - chrome_profiles:/tmp/chrome + ports: + - 4444:4444 networks: - agentic-seek-net volumes: redis-data: + chrome_profiles: networks: agentic-seek-net: diff --git a/frontend/Dockerfile.frontend b/frontend/Dockerfile.frontend index 59b8379..8bf7845 100644 --- a/frontend/Dockerfile.frontend +++ b/frontend/Dockerfile.frontend @@ -7,7 +7,7 @@ COPY agentic-seek-front/package.json agentic-seek-front/package-lock.json ./ RUN npm install # Copy application code -COPY .agentic-seek-front/ . +COPY agentic-seek-front/ . # Expose port EXPOSE 3000 diff --git a/frontend/agentic-seek-front/src/App.js b/frontend/agentic-seek-front/src/App.js index ea210d4..b5cb341 100644 --- a/frontend/agentic-seek-front/src/App.js +++ b/frontend/agentic-seek-front/src/App.js @@ -19,7 +19,7 @@ function App() { const checkHealth = async () => { try { - await axios.get('http://0.0.0.0:8000/health'); + await axios.get('http://backend:8000/health'); setIsOnline(true); console.log('System is online'); } catch { @@ -39,7 +39,7 @@ function App() { const fetchScreenshot = async () => { try { const timestamp = new Date().getTime(); - const res = await axios.get(`http://0.0.0.0:8000/screenshots/updated_screen.png?timestamp=${timestamp}`, { + const res = await axios.get(`http://backend:8000/screenshots/updated_screen.png?timestamp=${timestamp}`, { responseType: 'blob' }); if (isMounted) { @@ -94,7 +94,7 @@ function App() { try { console.log('Sending query:', query); - const res = await axios.post('http://0.0.0.0:8000/query', { + const res = await axios.post('http://backend:8000/query', { query, tts_enabled: false }); diff --git a/searxng/settings.yml.new b/searxng/settings.yml.new index 36a97b5..608074c 100644 --- a/searxng/settings.yml.new +++ b/searxng/settings.yml.new @@ -95,7 +95,7 @@ server: # If your instance owns a /etc/searxng/settings.yml file, then set the following # values there. - secret_key: "a0f32049a2301f36ef012b9b7ef62733b4af1379a1d28d5c33d92cea37288182" # Is overwritten by ${SEARXNG_SECRET} + secret_key: "1234bbd68b6c51ff0b9ccb77e39b1f20a3178b63e71496cbc89ef019f0341382" # Is overwritten by ${SEARXNG_SECRET} # Proxy image results through SearXNG. Is overwritten by ${SEARXNG_IMAGE_PROXY} image_proxy: false # 1.0 and 1.1 are supported @@ -2642,6 +2642,12 @@ engines: shortcut: pgo disabled: true + - name: senscritique + engine: senscritique + shortcut: scr + timeout: 4.0 + disabled: true + # Doku engine lets you access to any Doku wiki instance: # A public one or a privete/corporate one. # - name: ubuntuwiki