730 Commits
Author SHA1 Message Date
Martin a4a98fa601 Merge pull request #472 from kuishou68/fix/issue-471-remove-duplicate-soundfile
fix: remove duplicate soundfile entry in requirements.txt
2026-04-22 09:42:23 +02:00
Cocoon-Break 0eb42e4a42 fix: remove duplicate soundfile entry in requirements.txt (Closes #471) 2026-04-14 15:04:31 +08:00
Martin 4c0a72ff61 Merge pull request #468 from octo-patch/fix/issue-394-lm-studio-url-parsing
fix: correct LM Studio URL parsing and uvicorn port binding
2026-04-11 16:46:56 +02:00
Martin 021644d786 Merge pull request #467 from octo-patch/fix/issue-274-searxsearch-query-encoding
fix: URL-encode search query and detect empty results as failure
2026-04-11 16:46:42 +02:00
Martin 725ceeea20 Merge pull request #466 from octo-patch/fix/issue-332-ollama-configurable-port
fix: use configured port from server_address for local Ollama connections
2026-04-11 16:46:16 +02:00
Martin 69bbd31abf Merge pull request #465 from octo-patch/fix/issue-312-dynamic-remote-debugging-port
fix: use dynamic free port for remote debugging to prevent SessionNotCreatedException
2026-04-11 16:44:08 +02:00
Martin 2944ff6892 Merge pull request #463 from octo-patch/fix/issue-352-configurable-backend-url
fix: make REACT_APP_BACKEND_URL configurable for remote deployments
2026-04-11 16:41:57 +02:00
Martin 6fd329acc6 Merge pull request #462 from octo-patch/fix/searxsearch-init-and-api-port
fix: use BACKEND_PORT env var in uvicorn and honor base_url arg in searxSearch
2026-04-11 16:40:09 +02:00
octo-patch 05aa5c2104 fix: correct LM Studio URL parsing and uvicorn port binding (fixes #394)
- lm_studio_fn: use urlparse to extract port from server_address so that
  addresses with an http:// prefix (e.g. http://127.0.0.1:1234, as
  documented in README) no longer break the Docker URL construction.
  Previously split(":")[1] returned "//127.0.0.1" instead of the port
  number, producing a malformed URL.
  Also fix the non-Docker path to avoid prepending http:// when the address
  already includes a scheme.

- api.py: pass the computed port variable to uvicorn.run() instead of the
  hardcoded literal 7777, so that BACKEND_PORT environment variable is
  actually honoured when starting the server directly.
2026-04-11 10:37:17 +08:00
octo-patch a976afdbd7 fix: URL-encode search query and detect empty results as failure (fixes #274)
- Use urllib.parse.urlencode to properly encode the POST body, so queries
  containing special characters like '&', '+', '=' are sent correctly
- Extend execution_failure_check to also detect "No search results" as a
  failure, preventing the agent from silently looping when all SearXNG
  engines are rate-limited and return no results
2026-04-10 10:07:06 +08:00
octo-patch 29aafda41d fix: use configured port from server_address for local Ollama connections (fixes #332)
When is_local=True, the Ollama host URL previously hardcoded port 11434,
ignoring the port specified in provider_server_address in config.ini.
Users who need to run Ollama on a non-default port (e.g. because 11434
is already in use) had no way to configure this without editing source code.

Now the port is extracted from provider_server_address when present,
falling back to 11434 if only a hostname is given.
2026-04-09 10:23:19 +08:00
octo-patch 37c9652e6d fix: use dynamic free port for remote debugging to prevent SessionNotCreatedException (fixes #312)
The hardcoded --remote-debugging-port=9222 caused SessionNotCreatedException
when port 9222 was already in use by another Chrome instance or process.
Replace with a dynamically allocated free port via socket binding.
2026-04-08 10:36:48 +08:00
Octopus f8fc43f6d7 fix: make REACT_APP_BACKEND_URL configurable for remote deployments (fixes #352)
When AgenticSeek is deployed on a remote server and accessed from a
different machine, the frontend JavaScript runs in the user's browser
with localhost:7777 which resolves to the user's local machine, not
the server - causing the 'System offline' error even though the backend
is running.

Change docker-compose.yml to read REACT_APP_BACKEND_URL from .env
(defaulting to http://localhost:7777 for local use) and document the
variable in .env.example so users can point the frontend at their
server's public IP when deploying remotely.
2026-04-07 10:38:24 +08:00
Octopus 3fc2ac5235 fix: use BACKEND_PORT env var in uvicorn and honor base_url arg in searxSearch
- api.py: uvicorn.run was hardcoding port=7777 instead of using the
  port variable populated from BACKEND_PORT env var, making BACKEND_PORT
  ineffective when running python api.py directly
- searxSearch: add missing 'import sys' (caused NameError when run as
  standalone script) and use constructor base_url arg with env var
  fallback so searxSearch(base_url=...) actually takes effect
2026-04-06 10:43:16 +08:00
Martin 31205febfe Merge pull request #460 from octo-patch/fix/provider-registration-bugs
fix: register anthropic provider, fix togetherAI alias, fix dsk_deepseek exception handling
2026-04-05 16:39:32 +02:00
Martin 1fbd8b135b Merge branch 'main' into fix/provider-registration-bugs 2026-04-05 16:39:08 +02:00
Martin 7b8a2271a3 Merge pull request #459 from octo-patch/fix/issue-382-prevent-server-crash-on-query-error
fix: return HTTP 500 instead of crashing server on query errors
2026-04-05 11:59:00 +02:00
Martin 4e985d8df6 Merge pull request #457 from octo-patch/fix/issue-367-make-plan-infinite-loop
fix: add max retry limit to PlannerAgent.make_plan to prevent infinite loop
2026-04-05 11:58:09 +02:00
Martin 74d38100c4 Merge pull request #455 from octo-patch/fix/issue-359-planner-unbound-answer
fix: resolve UnboundLocalError in PlannerAgent.process when stop flag is set
2026-04-05 11:57:16 +02:00
Martin 9e4613df71 Merge pull request #450 from octo-patch/feature/upgrade-minimax-m27
feat: upgrade MiniMax default model to M2.7
2026-04-05 11:55:47 +02:00
Octopus 2b8bc83a97 fix: register anthropic provider, normalize togetherAI alias, fix dsk_deepseek exception handling
- Add 'anthropic' to available_providers and unsafe_providers so users can set
  provider_name = anthropic in config.ini and use ANTHROPIC_API_KEY
- Add provider name alias normalization so 'togetherAI' (as documented in README)
  is accepted as equivalent to 'together'
- Fix NameError in dsk_deepseek: add 'as e' to AuthenticationError, RateLimitError,
  and NetworkError except clauses where 'e' was referenced but not bound
- Remove unreachable 'return thought' dead code at end of lm_studio_fn
- Update README to list Anthropic as a supported API provider
2026-04-05 10:41:54 +08:00
Octopus 872d01f8e5 fix: return HTTP 500 instead of calling sys.exit(1) on query errors
Previously, any unhandled exception during query processing caused the
entire backend server to exit via sys.exit(1), making the frontend show
'System offline. Deploy backend first.' until the container was restarted.
Also, is_generating was never reset to False on exception, permanently
blocking all subsequent queries with 429 responses.

- Replace sys.exit(1) with a proper HTTP 500 error response
- Move is_generating = False to the finally block so it always resets

Fixes #382
2026-04-04 11:23:41 +08:00
Octopus d1ecb15703 fix: add max retry limit to PlannerAgent.make_plan to prevent infinite loop (fixes #367) 2026-04-03 10:51:23 +08:00
Octopus 7cde1549b2 fix: initialize answer variable and reset stop flag in PlannerAgent.process (fixes #359) 2026-04-02 16:52:06 +08:00
PR Bot 1432266694 feat: upgrade MiniMax default model to M2.7
- Add MiniMax-M2.7 and MiniMax-M2.7-highspeed to supported models list
- Update docstring to list M2.7 models before M2.5
- Update README/README_CHS model references
- Add unit tests for M2.7 and M2.7-highspeed models
- Keep all previous models as alternatives
2026-03-18 16:33:04 +08:00
Martin 1036c5fbc1 Merge pull request #449 from guoyangzhen/fix/optional-tts-dependency
fix: make kokoro TTS optional to resolve num2words Python 3.12+ incompatibility
2026-03-16 20:02:51 +01:00
Martin 77ed25306e Merge pull request #448 from guoyangzhen/fix/startup-script-integer-comparison
fix: handle empty dir_size_bytes and remove deprecated docker-compose version
2026-03-16 20:02:07 +01:00
Martin d47761a6a5 Merge pull request #447 from guoyangzhen/fix/frontend-react-scripts-not-found
fix(frontend): ensure react-scripts is available in Docker container
2026-03-16 20:01:00 +01:00
Martin e135683426 Merge pull request #444 from ximiximi423/feat/add-minimax-provider
feat: add MiniMax as new LLM provider
2026-03-16 19:57:55 +01:00
guoyangzhen 53a47be80c fix: make kokoro TTS optional 2026-03-14 17:26:21 +08:00
guoyangzhen 75ce967107 fix: make kokoro TTS optional 2026-03-14 17:26:19 +08:00
guoyangzhen 9a8ce59520 fix: handle empty dir_size_bytes and remove deprecated docker-compose version 2026-03-14 17:09:33 +08:00
guoyangzhen a97010739b fix: handle empty dir_size_bytes and remove deprecated docker-compose version 2026-03-14 17:09:31 +08:00
guoyangzhen 7066f62942 fix(frontend): ensure react-scripts is available in Docker container
Use npm ci + npm rebuild for deterministic installs. Add verification
step that catches missing react-scripts early.

Fixes #411
2026-03-14 16:41:21 +08:00
ximi fc268ed087 feat: add MiniMax as new LLM provider
Add support for MiniMax M2.5 series models via OpenAI-compatible API:
- Add minimax_fn() to Provider class with configurable base URL
- Support both international and China mainland endpoints
- Update documentation in README.md and README_CHS.md
- Add MINIMAX_API_KEY and MINIMAX_BASE_URL to .env.example
- Add unit tests for MiniMax provider

Made-with: Cursor
2026-03-06 17:10:52 +08:00
Martin 781275c881 Merge pull request #439 from Br1an67/feat/issue-108-web-form-handling
feat: add support for select, textarea, and file upload in web forms
2026-03-02 19:45:10 +01:00
Martin 2a69fbef4b Merge pull request #440 from Br1an67/feat/issue-52-add-tests
test: add unit tests for parsing functions, logger, and utility
2026-03-02 19:44:20 +01:00
Martin fa4cef0e74 Merge pull request #438 from Br1an67/fix/issue-356-auto-update-chromedriver
fix: auto-update ChromeDriver when version mismatches Chrome
2026-03-02 19:43:39 +01:00
Martin f63b2c436d Merge pull request #437 from Br1an67/fix/issue-409-json-parsing
fix: handle JSON parsing errors in planner agent
2026-03-02 19:42:42 +01:00
Martin cb6210293a Merge pull request #425 from Aquarius10th/fix-apt-get-error
Specify the base image version to fix dependency missing or version c…
2026-03-02 19:41:02 +01:00
Br1an67 165dcb8d97 test: add unit tests for parsing functions, logger, and utility
Add 34 tests across 3 test files:

- test_browser_agent_parsing.py (20 tests): expand existing tests with
  coverage for extract_links, extract_form, clean_links, parse_answer,
  select_link, jsonify_search_results, stringify_search_results, and
  select_unvisited
- test_logger.py (9 tests): Logger initialization, message writing, log
  level handling, deduplication, and folder creation
- test_utility.py (5 tests): get_color_map returns correct structure and
  color values

All tests avoid LLM requests per issue requirements.
2026-03-02 00:28:48 +08:00
Br1an67 1e827a903b feat: add support for select, textarea, and file upload in web forms
Extend form handling to support:
- <select> dropdowns: detect options, select by visible text or value
- <textarea> fields: fill with text content
- <input type="file">: upload files by absolute path
- All element types are also discovered inside shadow DOM

Changes:
- find_inputs.js: discover <select> (with options) and <textarea>
- browser.py: import Select, handle new element types in
  get_form_inputs() and fill_form_inputs()
2026-03-02 00:16:28 +08:00
Br1an67 16f7f7c917 fix: auto-update ChromeDriver when version mismatches Chrome
Add version compatibility check before using existing ChromeDriver.
When the installed ChromeDriver major version does not match Chrome,
chromedriver_autoinstaller downloads the correct version automatically
instead of failing with a version mismatch error.

Add helper functions get_chromedriver_version() and
is_chromedriver_compatible() with tests for version matching logic.
2026-03-02 00:10:23 +08:00
Br1an67 f350378170 fix: handle JSON parsing errors in planner agent
Add try-except for json.JSONDecodeError in parse_agent_tasks() to
gracefully handle malformed JSON from LLM responses (e.g. Gemini 2.5
Flash via OpenRouter). Returns empty list on parse failure, which
triggers the existing retry mechanism in make_plan().

Add test suite for parse_agent_tasks() covering valid JSON, malformed
JSON, truncated JSON, and invalid agent name cases.
2026-03-02 00:03:36 +08:00
Martin 9611bf4081 Merge pull request #436 from arikusi/add-turkish-readme
docs: add Turkish translation (README_TR.md)
2026-02-28 21:32:00 +01:00
arikusi aeb9145d6e docs: add Turkish translation (README_TR.md) 2026-02-27 01:39:42 +03:00
Frank Zhou 889545f356 Specify the base image version to fix dependency missing or version conflict issues when using apt-get.
The originally specified version 3.11-slim is only an alias representing the latest version in the 3.11.x-slim series (for example, on November 22nd, its exact version number was 3.11.14-slim). After the base image is updated, various unexpected errors may occur when executing apt-get.
2025-11-23 00:03:26 +08:00
Martin 782a933971 Merge pull request #424 from Fosowl/dev
fix: remove unavailable engine from searxng config.
2025-11-15 14:56:20 +01:00
martin 42cd21346f fix: remove unavailable engine from searxng config to avoid warnings/errors 2025-11-15 14:49:42 +01:00
Martin abc765861a Merge pull request #405 from Fosowl/dev
readme update
2025-09-14 20:15:49 +02:00
martin.legrand 141bc5f097 readme update 2025-09-14 20:15:12 +02:00
Martin 8a713e5ec0 Merge pull request #404 from Fosowl/dev
fix : update readme for correct ollama start
2025-09-14 18:23:32 +02:00
martin.legrand 176863be55 fix : listen issue of ollama 2025-09-14 18:22:18 +02:00
Martin 0decd84541 Merge pull request #403 from Fosowl/dev
Fix various ubuntu issues + CLI instructions
2025-09-13 23:50:03 +02:00
martin.legrand edc0e69a82 fix : more linux issues 2025-09-13 23:47:24 +02:00
martin.legrand 60dd8a597f update readme.md 2025-09-13 22:34:05 +02:00
martin.legrand 28d255b8e9 update readme.md 2025-09-13 20:34:27 +02:00
martin.legrand 4554c6ef89 fix command_exists issue in .sh 2025-09-13 15:00:57 +02:00
martin.legrand fd8d940e58 rm test file 2025-09-13 14:31:59 +02:00
martin.legrand 87c8a3fb09 fix: redundant searxng folder causing error on ubuntu, tts issue, bigger mount point allowed by start_services, readme updated for cli mode 2025-09-13 14:30:21 +02:00
Martin be86fd07e1 Merge pull request #402 from Fosowl/dev
fix #400
2025-09-11 23:45:58 +02:00
martin.legrand d80bda8468 fix : unseen recursion mistake on empty value for work folder 2025-09-11 23:44:06 +02:00
Martin 308ba0e595 Merge pull request #379 from Fosowl/dev
readme update
2025-07-13 12:52:03 +02:00
martin legrand f72c1b9b07 update readme 2025-07-13 12:50:15 +02:00
Martin deaf142a0d Merge pull request #373 from Fosowl/dev
Fix backend url issue
2025-07-06 00:35:29 +02:00
martin legrand e0123bfc67 fix : searnxg url 2025-07-06 00:34:36 +02:00
martin legrand fa26cce44f fix : problem with frontend connection, enfore url 2025-07-06 00:24:02 +02:00
martin legrand cb0206e9ee fix : problem with frontend connection url selection 2025-07-06 00:19:46 +02:00
Martin a2f75e7281 Merge pull request #371 from Fosowl/dev
Fix readme typo
2025-07-05 14:47:04 +02:00
martin 3e652a6b99 update readme 2025-07-05 14:45:43 +02:00
Martin fd987e5b5c Merge pull request #370 from Fosowl/dev
Update readme + contributing.md
2025-07-02 18:02:44 +02:00
martin d30f3c5616 update readme 2025-07-01 21:29:49 +02:00
martin db62bb289e update readme 2025-07-01 21:28:55 +02:00
martin 23caf437b1 Update contributing.md + sponsorship 2025-07-01 21:25:58 +02:00
martin f5b1c4ab37 update flight search tool 2025-07-01 20:23:55 +02:00
martin 29044ebbfe update readme mistake #366 2025-07-01 20:07:13 +02:00
Martin 50d098fa96 Merge pull request #361 from natethompson44/docs/enhance-chromedriver-troubleshooting
docs: enhance ChromeDriver troubleshooting for Docker environments
2025-06-28 14:57:29 +02:00
Martin ba74f1efa2 Merge pull request #362 from natethompson44/fix/chromedriver-project-root-priority
fix: prioritize project root ChromeDriver for Docker compatibility
2025-06-28 14:55:18 +02:00
WINZO Platform Developer b3ec49c611 fix: prioritize project root ChromeDriver for Docker compatibility
- Check ./chromedriver before system PATH or auto-installer
- Add Docker environment detection and fallback logic
- Provide debug messages for ChromeDriver source identification
- Improve compatibility with undetected_chromedriver in stealth mode

This resolves issues where undetected_chromedriver downloads its own
ChromeDriver version, bypassing mounted binaries in Docker environments.
The project root approach ensures users can manually place the correct
ChromeDriver version and have it reliably detected.
2025-06-25 18:20:25 -05:00
WINZO Platform Developer 2a5fb69af6 docs: enhance ChromeDriver troubleshooting for Docker environments
- Add detailed Chrome for Testing API instructions
- Include Docker-specific guidance for stealth mode compatibility
- Add troubleshooting tips and version compatibility matrix
- Provide clear step-by-step solution for version mismatches

Fixes common ChromeDriver issues in Docker environments where
undetected_chromedriver bypasses mounted binaries.
2025-06-25 18:20:03 -05:00
Martin 2eb62e63eb Merge pull request #348 from christiancoleman/origin/headless-docker
Headless chrome in a container
2025-06-22 15:40:43 +02:00
Martin 30aecb406d Merge pull request #351 from mmlmt2604/fix_openrouter_freemodel
Enhance Memory class: Remove 'model_use' and 'time' in message payload when user use open router's free model
2025-06-22 15:34:40 +02:00
Mike Lin 860e52c3fa Enhance Memory class: Remove 'model_use' and 'time' in messages payload when user select free model from oepn router which result 500 error 2025-06-22 17:39:38 +08:00
Christian Coleman c7ffe46771 Added a warning for people that try to run a non-headless browser in a docker container. It errors in a very unhelpful way, and so this code tells the user in the output what's happening and also forces headless = True. If a user actually means to run a non-headless browser and view via X11 or something then the warning/output will lead them to the right place that they need to tweak. 2025-06-22 02:39:20 -04:00
Martin 12a6705724 Merge pull request #344 from Fosowl/dev
Fix : searxng search issue on docker
2025-06-21 15:12:47 +02:00
martin 0605fb4526 Fix : searxng issue on docker 2025-06-21 15:11:35 +02:00
Martin 100dda4370 Merge pull request #336 from nettanvirdev/main
Update: Updated The AgenticSeek Frontend
2025-06-20 22:50:03 +02:00
Martin b226c5d1da Merge pull request #339 from Fosowl/dev
Fix :  #338 python not found for key generation
2025-06-18 22:41:26 +02:00
martin bf740d8eb5 update readme 2025-06-18 22:40:29 +02:00
martin f8f987e8ba Merge branch 'main' into dev 2025-06-18 22:14:15 +02:00
martin 29ddf31f82 tup docstring 2025-06-18 22:13:48 +02:00
Martin 41d83e8c46 Merge pull request #327 from christiancoleman/ccdev
Issue with LM Studio not getting port when using Docker
2025-06-18 22:12:27 +02:00
martin 611eddb715 Fix : typo + set safe_mode to False since we now run in docker 2025-06-18 21:40:40 +02:00
martin 40b94c953b Fix : #338 python not found for key generation 2025-06-18 21:35:01 +02:00
Tanvir Ahamed ae7be9ca8d Fix: REACT_APP_BACKEND_URL environment variable issue in frontend in Updated UI.
Revised the BACKEND_URL constant to ensure the application prioritizes fetching the backend URL from the environment variable REACT_APP_BACKEND_URL before defaulting to `http://localhost:7777`.
2025-06-18 00:13:05 +06:00
Tanvir Ahamed 7439ea35c7 Update: Updated the ui 2025-06-18 00:01:24 +06:00
Martin 3550e6ee46 Merge pull request #335 from Fosowl/dev
feat : limiter.toml
2025-06-17 19:29:21 +02:00
martin 69dd856b45 feat : limiter.toml 2025-06-17 19:28:34 +02:00
Christian Coleman e33e3e15e4 Issue with LM Studio not getting port when using Docker 2025-06-15 18:53:36 -04:00
Martin 6bb0e5a16b Merge pull request #325 from Fosowl/dev
readme fixes
2025-06-14 17:48:21 +02:00
martin c388f6c871 readme fixes 2025-06-14 17:45:53 +02:00
Martin d214f3a9c7 Merge pull request #324 from Fosowl/dev
update readme
2025-06-14 17:23:29 +02:00
martin 8888f3c481 update readme 2025-06-14 17:15:48 +02:00
Martin 807358937e Merge pull request #260 from Futbolaholic/improve-readme-onboarding
I've enhanced the README to make it easier for you to get started.
2025-06-14 16:48:49 +02:00
Martin eebf3f3ff3 Merge pull request #323 from Fosowl/dev
Fix : windows docker issues
2025-06-14 16:46:55 +02:00
martin 5a06b21a67 fix : llm provider to be docker compatible with new net configuration 2025-06-14 15:52:00 +02:00
martin legrand fd18953e14 fix : frontend back url 2025-06-14 13:44:32 +02:00
martin legrand c305e025b8 spanish readme 2025-06-14 12:52:07 +02:00
martin 5d2d1c7b08 Merge branch 'main' into dev 2025-06-14 00:30:45 +02:00
martin a6cf09673b fix : docker on windows 2025-06-14 00:30:14 +02:00
Martin d485a32e06 Merge pull request #316 from Fosowl/dev
fix : #305  safer container management
2025-06-13 17:55:57 +02:00
Antoine VIVIES 939b241a45 Merge branch 'main' into improve-readme-onboarding 2025-06-13 11:20:08 +08:00
Martin 01a27c10ad Merge pull request #301 from sukrucildirr/main
chore: fix typos across codebase
2025-06-12 19:11:48 +02:00
Martin 24fea22540 Merge pull request #318 from drhiidden/feature/new-translation-spanish
README main edition - Reference to README_ES
2025-06-12 19:10:38 +02:00
drhiidden 1730172aaa Merge branch 'Fosowl:main' into feature/new-translation-spanish 2025-06-12 11:03:49 +02:00
druiz912 93acf4dfaf add link to spanish readme 2025-06-12 11:02:00 +02:00
martin legrand aa4c95a3f4 fix : #305 safer container management 2025-06-11 20:50:41 +02:00
Martin 2b3946d685 Merge pull request #308 from drhiidden/feature/new-translation-spanish
Add README in Spanish including installation, configuration and use
2025-06-11 19:32:26 +02:00
Rocko Lo a8e0f42939 Merge branch 'main' into improve-readme-onboarding 2025-06-10 17:20:56 -04:00
druiz912 7844d71108 Add README in Spanish including installation, configuration and use 2025-06-10 02:55:57 +02:00
sukrucildirr 7e6b08bc5d Update coder_agent.txt 2025-06-07 23:48:43 +03:00
sukrucildirr c74fb8a005 Update planner_agent.py 2025-06-07 23:47:22 +03:00
sukrucildirr 43acef2378 Update mcpFinder.py 2025-06-07 23:46:44 +03:00
sukrucildirr 4a0843f0aa Update text_to_speech.py 2025-06-07 23:46:17 +03:00
sukrucildirr 583b80707d Update planner_agent.txt 2025-06-07 23:45:25 +03:00
sukrucildirr 8bde81b0b5 Update examples.json 2025-06-07 23:42:56 +03:00
sukrucildirr 48a94d7042 Update dl_safetensors.sh 2025-06-07 23:40:42 +03:00
sukrucildirr b4a692047d Update start_services.sh 2025-06-07 23:39:17 +03:00
sukrucildirr 95a0edc2b6 Update README.md 2025-06-07 23:38:39 +03:00
Martin f271a5b205 Merge pull request #299 from Fosowl/dev
Update all readme
2025-06-06 18:53:54 +02:00
martin legrand 0cec4126d8 update config 2025-06-06 18:53:02 +02:00
martin legrand 946f3a8993 update all readme 2025-06-06 18:51:34 +02:00
martin legrand c09dee0329 merge main to dev 2025-06-06 18:40:14 +02:00
martin legrand 0a1a3eaf77 upd readme 2025-06-06 18:39:11 +02:00
Martin 361c53fb4d Merge pull request #298 from Fosowl/dev
Backend Containerization with Docker
2025-06-06 18:02:55 +02:00
Martin d04fa90391 Merge branch 'main' into dev 2025-06-06 18:01:32 +02:00
Martin 743541955d Merge pull request #289 from Chaudry24/mc/uv-integration
Updated to uv package manager for easier onboarding
2025-06-04 19:47:15 +02:00
Martin 80fea7f40d Merge pull request #279 from zjkal/patch-1
Edit README.md
2025-06-04 19:40:56 +02:00
Chaudry24 5aa08f7e88 misc. files from uv projects 2025-06-04 10:43:12 -05:00
Chaudry24 4cf5761603 feat: modified scripts to use uv instead of pip for easier onboarding 2025-06-04 10:42:55 -05:00
Chaudry24 e8e7a6ee3d fix: updated package for forwards compativility 2025-06-04 10:42:14 -05:00
Chaudry24 e869379751 chore: updated instructions to use uv package manager 2025-06-04 10:40:53 -05:00
martin legrand 42bb65e8f6 upd config.ini 2025-06-03 22:38:53 +02:00
martin legrand 517b4a79e0 upd config.ini 2025-06-03 22:35:50 +02:00
zjkal 665e886e31 * 修改其他域名的README的LOGO为统一LOGO
* 修改简体中文的README标题
2025-06-03 11:46:44 +08:00
martin legrand a58b1cf9f8 fix : conditional stt & tts activation 2025-06-03 02:19:50 +02:00
martin legrand 81760bfd9c upd reamdem 2025-06-02 22:33:27 +02:00
martin legrand e952ac3e61 readme upd 2025-06-02 22:31:43 +02:00
martin legrand e0fa4e6356 readme upd 2025-06-02 22:25:22 +02:00
martin legrand da6056e94c feat: fallback when openssl unavailable 2025-06-02 21:52:24 +02:00
martin legrand 5542914725 merge docker_deployement to dev 2025-06-01 21:56:32 +02:00
martin legrand 12af55f6c4 merge main to dev 2025-06-01 21:54:56 +02:00
martin legrand 2f8d2d4954 config.ini 2025-06-01 21:53:39 +02:00
Martin dc6a35bcf9 Merge pull request #272 from zeteticl/cht
Corrected the simplified Chinese in the README_CHT.md back to traditional Chinese
2025-06-01 21:51:42 +02:00
Sad a7c38819d6 Update README_CHT.md 2025-06-02 03:46:55 +08:00
martin legrand c81c0ffde6 requirement correction 2025-06-01 16:58:16 +02:00
martin legrand 444e7bce22 refactor : remove ntlk import 2025-06-01 16:47:05 +02:00
martin legrand d3f20819ff feat : working mount of work directory on docker 2025-06-01 16:44:07 +02:00
martin legrand 9f0fdd547e refactor: remove unsused sentiment analysis 2025-06-01 16:40:53 +02:00
martin legrand be1bfc5cf2 docker deploy of backend now working 2025-05-31 22:01:42 +02:00
martin legrand a3b0bb22aa latest attempt of dockerization 2025-05-31 19:44:58 +02:00
martin legrand fc74d4361a latest attempt of dockerization 2025-05-31 19:31:25 +02:00
martin legrand 54cc2a03ec feat : updating with latest docker backend build thx to #265 2025-05-31 17:20:40 +02:00
Martin eff5921217 Merge pull request #263 from snuow/feature/fix_README_JP
Fix minor text inconsistencies in README_JP.md
2025-05-31 14:44:51 +02:00
snuow 2ed59939a0 Fix minor text inconsistencies in README_JP.md
The translation was incorrect and has been corrected.
2025-05-31 17:23:31 +09:00
Martin 7c9d963db5 Merge pull request #258 from gabrielsallum/bugfix/204_selinux_problems_in_fedora
ticket#204 on the upstream repo, allow containers to access config dir under SELinux
2025-05-30 21:01:28 +02:00
Gabriel Pontes SallumandCopilot 3ab570e760 Update docker-compose.yml
Seems legit I tried locally seems to work fine also

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-30 11:02:44 -04:00
google-labs-jules[bot] e235aecbc1 I've enhanced the README to make it easier for you to get started.
Here's a summary of the key improvements:
- **Clearer Structure:** I've added new sections for Prerequisites, ChromeDriver Installation, Configuration, and Troubleshooting. I also suggested a Table of Contents.
- **Detailed Prerequisites:** I've explicitly listed all necessary software (Git, Python 3.10.x, Docker Engine & Compose, Chrome) with links and version recommendations.
- **Comprehensive ChromeDriver Guide:** I've consolidated instructions for version matching, downloading from official sources (Chrome for Testing), and PATH setup for all major operating systems.
- **Python Environment:** I've recommended `python3.10 -m venv` and provided OS-specific activation commands.
- **Installation Scripts & Manual Steps:** I've clarified script actions and potential issues (e.g., `pyaudio` on Windows) and streamlined manual installation instructions.
- **Local LLM Setup:** I've added detailed guides for installing Ollama and LM-Studio, pulling/downloading models (with examples), and configuring `config.ini` (including `http://` prefix for server addresses).
- **API LLM Setup:** I've provided thorough instructions for setting API keys as environment variables on Linux/macOS (including shell profile persistence) and Windows (temporary and permanent methods). I've also added example API key links.
- **Expanded `config.ini` Explanation:** I've offered more detailed descriptions for each configuration key, especially `work_dir`.
- **Improved Provider Tables:** I've restructured local and API provider tables for better clarity and linked to setup sections.
- **Enhanced Troubleshooting:**
    - I've updated 'Known Issues' for ChromeDriver, LM-Studio connections, and SearxNG URL (with Windows `export` alternatives).
    - I've transformed "Q: I get an error running cli.py" in FAQ into a comprehensive step-by-step troubleshooting guide.
    - I've added new FAQs for installing local LLM providers, acquiring models, setting API keys on Windows, and handling installation script failures.
- **Consistency:** I've ensured consistent terminology (e.g., "ChromeDriver").
- **OS-Specific Instructions:** I've provided clear, distinct commands and guidance for Linux, macOS, and Windows where necessary.

These changes aim to make your initial setup and troubleshooting process smoother and more accessible.
2025-05-30 09:31:22 +00:00
Gabriel Sallum 67e074165c Regarding ticket#204 on the upstream repo, allow containers to access config dir under SELinux
Under SELinux enforcement, the container was denied access to the bind-mounted ./searxng directory, causing permission errors. Adding the :z flag to the volume mount in docker-compose.yml applies the correct SELinux context for shared access.
2025-05-29 22:39:17 -04:00
Martin e7a4f41101 Merge pull request #255 from 0xthiagomartins/main
Add README_PTBR.md
2025-05-29 23:29:46 +02:00
Thiago Martins 12eb3d5a02 Merge branch 'Fosowl:main' into main 2025-05-29 17:40:38 -03:00
Thiago Martins 34fbaa1f3c Update README_PTBR with formatting corrections and add FAQ section 2025-05-29 17:36:42 -03:00
Martin d59e5d7eb8 Merge pull request #253 from Fosowl/Fosowl-patch-2
Update README.md
2025-05-29 21:52:01 +02:00
Martin 41b5772ff0 Update README.md 2025-05-29 21:51:25 +02:00
martin legrand b96e83dbbe feat : latest docker attempt + fix attempt for #249 2025-05-29 21:33:48 +02:00
martin legrand eadcfb66d1 merge 2025-05-29 15:37:32 +02:00
martin legrand 1c4a550c6f docker: latest backend dockerization attempt but crash 2025-05-29 15:35:00 +02:00
martin legrand 95aeaf74fa docker: latest backend dockerization attempt but crash 2025-05-29 15:34:23 +02:00
martin legrand ec1f7d31fb update start_servicees.sh 2025-05-29 10:51:08 +08:00
martin legrand abae98cf77 feat : optional run backend on host for start_services.sh 2025-05-29 10:51:08 +08:00
martin legrand 819a3fb98d remove commented service 2025-05-29 10:51:08 +08:00
martin legrand 7d74a348c9 comment out bundle approach 2025-05-29 10:51:08 +08:00
martin legrand a3ad635728 deploy : current attempt at backend dockerization 2025-05-29 10:51:08 +08:00
martin legrand 58656ab43c fix typo in readme 2025-05-28 18:41:47 +02:00
Martin c1a1e9409d Merge pull request #234 from hung-ngm/test-tools-parsing
Test tools parsing
2025-05-28 08:42:18 +02:00
Hung Nguyen 41fe95fcb1 Refine test_tools_parsing 2025-05-28 11:47:21 +10:00
Hung Nguyen c8bccc2395 Added unit tests for tools parsing 2025-05-28 11:44:00 +10:00
martin legrand f3da9f2965 gitignore 2025-05-27 23:25:33 +02:00
Martin e45fa86cda Merge pull request #231 from lckdl/main
fix issue #230
2025-05-27 21:48:30 +02:00
lck c8df9e759c fix: handle missing </think> tag in remove_reasoning_text 2025-05-28 02:26:41 +08:00
Martin b3672c60c0 Merge pull request #229 from Fosowl/dev
update readme
2025-05-27 19:35:08 +02:00
martin legrand 97460ded48 set config.ini back like before 2025-05-27 19:31:28 +02:00
martin legrand 9a34ff3646 set config.ini back like before 2025-05-27 19:30:26 +02:00
martin legrand a53842b8b7 update readme disclaimer 2025-05-27 19:29:03 +02:00
Martin 0a8d898e0b Merge pull request #224 from manra399/feature/added-docker-ignore
Added Docker Ignore file.
2025-05-27 18:50:51 +02:00
martin legrand 92f721886c idk 2025-05-27 18:21:31 +02:00
martin legrand 58f46d4351 update start_servicees.sh 2025-05-27 18:19:20 +02:00
manra399 ee6687df85 Added Docker Ignore file. 2025-05-27 13:55:52 +01:00
Thiago Martins 36de7eb389 Add README_PTBR 2025-05-26 17:21:56 -03:00
Martin 8d15546771 Merge pull request #212 from ifurther/patch-1
Update README_CHT.md
2025-05-26 18:48:14 +02:00
ifurther 7ad084b27f updat readme 2025-05-26 21:20:17 +08:00
Further 63cd5eddd7 Update README_CHT.md 2025-05-26 20:48:22 +08:00
martin legrand 50f9e11a35 feat : optional run backend on host for start_services.sh 2025-05-25 22:34:13 +02:00
martin legrand 500605d5da remove commented service 2025-05-25 21:57:56 +02:00
martin legrand 6ec9647d19 comment out bundle approach 2025-05-25 21:56:29 +02:00
martin legrand 16b8f1a451 deploy : current attempt at backend dockerization 2025-05-25 21:19:18 +02:00
martin legrand 6d053cc3a5 merge with #191 2025-05-25 15:39:23 +02:00
Martin 27b4aaa5e9 Merge pull request #191 from klimentij/feature/openrouter-provider
Openrouter provider
2025-05-25 15:18:57 +02:00
Klimentiy Bulygin 3c19f26792 Merge branch 'main' into feature/openrouter-provider 2025-05-25 13:15:56 +02:00
Klimentij Bulygin 12eec50e1c return original docker-compose 2025-05-25 13:14:10 +02:00
Klimentij Bulygin cd78cb36a0 minor 2025-05-25 13:13:03 +02:00
Klimentij Bulygin ec8cab2d6b Merge branch 'feature/openrouter-provider' of https://github.com/klimentij/agenticSeek into feature/openrouter-provider 2025-05-25 13:12:33 +02:00
Klimentij Bulygin b1f9375115 OpenRouter in .env.example 2025-05-25 13:11:10 +02:00
martin legrand 758faf6285 readme update & refactor llm_provider 2025-05-25 11:45:18 +02:00
Martin 20457a574a Merge pull request #197 from Fosowl/dev
Expandable view of reasoning above message instead of a separate view
2025-05-24 19:15:14 +02:00
martin legrand d375359582 feat : better view of reasoning 2025-05-24 12:45:10 +02:00
Klimentiy Bulygin f738fc732e Update config.ini 2025-05-24 00:16:16 +02:00
Klimentiy Bulygin 3be07e3dcb Update config.ini 2025-05-24 00:15:36 +02:00
Martin 7d252ad422 Merge pull request #190 from Fosowl/dev
Add stop button, reasoning view, add anthropic provider
2025-05-21 16:40:08 +02:00
Klimentij Bulygin 1c73ef141c Restore original config.ini settings 2025-05-20 22:47:09 +02:00
Klimentij Bulygin e3757f54ac Undo OpenRouter related changes to README files 2025-05-20 22:46:56 +02:00
Klimentij Bulygin 12afae7472 Fix: Correct provider_name parsing in config.ini 2025-05-20 19:58:59 +02:00
Klimentij Bulygin 9cbf62b47d Configure OpenRouter as default and verify API key handling 2025-05-20 17:50:41 +02:00
Klimentij Bulygin 51b0ca54c7 Initial commit for OpenRouter provider 2025-05-20 17:47:40 +02:00
martin legrand 0f116cc3d0 rm png file 2025-05-20 16:57:46 +02:00
martin legrand a19ef5df66 rm : test code 2025-05-20 16:56:13 +02:00
martin legrand 195b4a07a9 fix : safety of bash interpreter 2025-05-20 16:53:04 +02:00
martin legrand e3d01083d9 feat : stop button integration 2025-05-20 16:47:35 +02:00
martin legrand 102dc60efb feat : integrate reasoning view 2025-05-17 22:04:07 +02:00
Martin ca2b05b35e Merge pull request #188 from Fosowl/dev
Better browser fingerprint spoofing + Markdown support for frontend + block color display fix
2025-05-16 22:31:16 +02:00
martin legrand 713c01193f sec: no crossorigin allow 2025-05-16 14:05:36 +02:00
martin legrand 50a9cb8d27 fix : frontend color 2025-05-16 12:41:56 +02:00
martin legrand bd26d7233d refactor : comments + feat : selected lang in config influe browser config 2025-05-16 10:18:26 +02:00
martin legrand 45fbf5a88c fix comment 2025-05-16 09:24:46 +02:00
martin legrand 384d9a8c0b feat : markdown support on frontend 2025-05-16 09:19:45 +02:00
martin legrand 95d5aea1d5 feat : upgrade stealthness 2025-05-16 09:04:19 +02:00
martin legrand 38b1e17628 feat : better browser spoofing 2025-05-15 15:13:25 +02:00
martin legrand 637ca0f826 feat : attempt to bypass bot detection even more 2025-05-14 21:55:59 +02:00
martin legrand 201b3de15c feat : attempt to bypass bot detection 2025-05-14 21:43:13 +02:00
martin legrand 4739a1377c install: improve sh scripts 2025-05-14 18:50:40 +02:00
Martin 4bb7a21604 Merge pull request #181 from CoruNethron/main
Update README.md to match recent code changes
2025-05-12 22:59:19 +02:00
CoruNethron 725a3c3292 Update README.md to match recent code changes
`deepseek-api` was renamed to `deepseek`
`server` directory is now `llm_server`
2025-05-12 15:46:24 +10:00
Martin e72072090e Merge pull request #176 from Fosowl/dev
Fix connection issue with 0.0.0.0 in app.js + more wide browser view
2025-05-08 13:49:31 +02:00
martin legrand ef91502961 fix : connection issue with 0.0.0.0 in app.js + unzoom browser view 2025-05-08 13:38:07 +02:00
Martin 2048af854f Merge pull request #170 from Fosowl/dev
clarification in readme
2025-05-06 22:45:36 +02:00
martin legrand dd6ddaeca3 upd readme 2025-05-06 22:43:51 +02:00
martin legrand 47fec1914a comment out in progress mcp agent to avoid confusion 2025-05-06 22:39:15 +02:00
Martin 9ff69d1876 Merge pull request #168 from Fosowl/dev
update readme - enforce python 3.10
2025-05-06 20:24:44 +02:00
martin legrand ca2eea8089 update readme 2025-05-06 20:23:53 +02:00
Martin 3678c091ac Merge pull request #167 from rense/feature/remote-ollama
Allow connecting to a remote Ollama server
2025-05-06 19:49:18 +02:00
rense 94fb15359b allow connecting to remote Ollama server 2025-05-06 18:03:14 +02:00
Martin 3d1b3d02d9 Merge pull request #166 from Fosowl/dev
Update ja readme up to date
2025-05-06 11:02:13 +02:00
martin legrand c769e790bc upd: jp readme 2025-05-06 11:01:28 +02:00
martin legrand 23a51e6a05 upd: jp readme 2025-05-06 11:00:35 +02:00
martin legrand 94eada9d5d fix : return for json load 2025-05-05 19:11:56 +02:00
Martin 2cdbb49ecd Merge pull request #163 from Fosowl/dev
MCP Agent prototype (with no MCPs yet), Readme update, New function for memory system
2025-05-05 19:04:42 +02:00
MartinandCopilot dd033d4084 Update sources/memory.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-05-05 19:00:49 +02:00
martin legrand de2650c007 set limit_to_model_ctx to true 2025-05-05 18:36:37 +02:00
martin legrand deb79b81ca fix: typo 2025-05-05 18:32:06 +02:00
martin legrand 24dc1e1a2c fix: ensure logging is not on stdout/err 2025-05-05 18:29:42 +02:00
martin legrand af7619650a ja readme update 2025-05-05 18:17:58 +02:00
martin legrand df645f9a02 remove start ollama in windows scritp 2025-05-05 18:04:07 +02:00
martin legrand dc6eef8031 update readme 2025-05-05 18:01:02 +02:00
martin legrand 5c391dbb6e update japanese readme 2025-05-05 17:55:34 +02:00
martin legrand 101c103aeb fix : reset of blocks 2025-05-05 15:37:13 +02:00
martin legrand de315a43a1 upd readme 2025-05-05 14:23:10 +02:00
martin legrand 90f173ba52 upd readme 2025-05-05 14:22:18 +02:00
martin legrand e4591ea1b4 feat: improve compression/web agent memory management 2025-05-05 14:15:32 +02:00
martin legrand a7deffedec feat : improve memory system 2025-05-04 21:54:01 +02:00
martin legrand 5949540007 feat : tool description proprety 2025-05-04 19:29:31 +02:00
martin legrand 7afb79117b update agent 2025-05-04 18:49:04 +02:00
martin legrand 442bb4a340 Feat : MCP agent 2025-05-04 18:34:05 +02:00
Martin 99467be133 Merge pull request #162 from Fosowl/dev
upd readme examples
2025-05-04 12:02:27 +02:00
martin legrand 887060acdf upd readme 2025-05-04 12:01:44 +02:00
Martin 90609e960c Merge pull request #161 from Fosowl/dev
Update readme manual install instruction
2025-05-04 11:44:26 +02:00
martin legrand d893928221 update all readme 2025-05-04 11:43:32 +02:00
martin legrand 5bc086fd9d update fr readme 2025-05-04 11:24:40 +02:00
martin legrand aca176b9e7 update readme 2025-05-04 11:14:31 +02:00
Martin 9707dbcbf9 Merge pull request #159 from Fosowl/dev
Fixed tts not working with web interface
2025-05-03 19:23:16 +02:00
martin legrand 52e5af8116 fix : tts not working with web interface 2025-05-03 19:22:01 +02:00
Martin 42058244f2 Merge pull request #158 from Fosowl/dev
Chinese and Japanese Text-to-Speech support + readme update
2025-05-03 18:00:12 +02:00
martin legrand bddaa75e8c upd readme 2025-05-03 16:57:43 +02:00
martin legrand 7904439f35 feat : japanese tts support 2025-05-03 16:48:20 +02:00
martin legrand c873af3d00 fix : text to speech in chinese 2025-05-03 16:34:52 +02:00
Martin fa2852d3e7 Merge pull request #153 from Fosowl/dev
Update config.ini + fix requirement.txt + fix SSL issue with undetected chromedriver
2025-05-02 17:41:17 +02:00
martin legrand 1c4ebefae4 rm png file 2025-05-02 17:30:04 +02:00
martin legrand 96a6dd368a feat: fallback for ssl issues 2025-05-02 17:27:22 +02:00
martin legrand ed4f04b19c update requirement.txt 2025-05-02 17:26:26 +02:00
martin legrand f325865869 feat : update config 2025-05-02 16:56:52 +02:00
Martin a15dd998f3 Merge pull request #152 from Fosowl/dev
Improve chromedriver install error handling + improved fileFinder
2025-05-02 14:30:35 +02:00
martin legrand f17dc0550b feat: better fileFinder read 2025-05-02 14:23:00 +02:00
martin legrand ed76c8415b feat : fileFinder read pdf, browser better chromedriver install 2025-05-02 14:10:16 +02:00
Martin 9f2c105074 Merge pull request #151 from Fosowl/Fosowl-patch-1
Create FUNDING.yml
2025-05-02 11:38:48 +02:00
Martin ccef61b2b9 Create FUNDING.yml 2025-05-02 11:38:14 +02:00
martin legrand 3cf1cab68f cmv 2025-05-01 22:16:55 +02:00
martin legrand 0579fd3bb6 upd readme 2025-05-01 22:14:59 +02:00
martin legrand c6688355a7 set code safety on by default 2025-05-01 22:10:54 +02:00
martin legrand 68ed1834a9 fix : errors related to API based LLMs 2025-05-01 18:17:03 +02:00
Martin 487670d207 Merge pull request #147 from floriangab/docs/bump-conduct-and-contributing
Docs/bump conduct and contributing
2025-05-01 14:43:19 +02:00
florianG a109ac98ed docs: bump Python requirement from 3.8 to 3.10 and add Podman 2025-05-01 12:52:30 +02:00
florianG d928a95ed1 docs: update Code of Conduct from v2.0 to v2.1
- Bump version number in header/footer to 2.1
- Prepend reporting clause:
  “Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement: you need to send a private message to maintainers on Discord.”
- Adjust changelog entry accordingly
2025-05-01 12:46:07 +02:00
florianG ffa6873a86 fix: update Discord server invite link 2025-05-01 12:44:49 +02:00
Martin db2eb6fbac Merge pull request #144 from Fosowl/dev
Update readme
2025-04-29 21:39:21 +02:00
martin legrand 68d471bfc6 update readmes 2025-04-29 21:38:29 +02:00
martin legrand 03c71368f5 update readme 2025-04-29 21:19:09 +02:00
Martin 2fd83289fd Merge pull request #143 from Fosowl/dev
fix : start_services.sh not supporting newest docker compose (#137)
2025-04-29 12:02:50 +02:00
martin legrand 7dd60a8946 fix : start_services.sh not supporting newest docker compose (#137) 2025-04-29 12:01:56 +02:00
Martin ccaf1fae52 Merge pull request #141 from Fosowl/Fosowl-patch-3
Update README.md
2025-04-28 20:04:15 +02:00
Martin 4db2ec5911 Update README.md 2025-04-28 20:03:20 +02:00
Martin 34e9baccf3 Merge pull request #140 from Fosowl/Fosowl-patch-3
Update README.md
2025-04-28 10:42:36 +02:00
Martin 3febcfcc04 Update README.md 2025-04-28 10:42:18 +02:00
Martin bb15199b4e Merge pull request #139 from Fosowl/Fosowl-patch-2
Update README.md with new video
2025-04-28 10:38:35 +02:00
Martin 4ec54b690c Update README.md with new video 2025-04-28 10:38:09 +02:00
Martin 3f7408301a Merge pull request #138 from Fosowl/dev
Planner agent improvements
2025-04-28 10:32:36 +02:00
martin legrand da7dde23d4 feat : display planner next task on front 2025-04-28 10:24:30 +02:00
martin legrand 5517f53f8a fix : go interpreter error, hf provider import + feat : more logger 2025-04-27 20:37:23 +02:00
Martin 9f128f8445 Merge pull request #136 from Fosowl/dev
Readme: update image with logo
2025-04-26 20:49:56 +02:00
martin legrand f02f096356 upd readme 2025-04-26 20:48:45 +02:00
martin legrand e0ffa95951 update readme logo 2025-04-26 20:48:06 +02:00
martin legrand 357f0e7bb1 update readme logo 2025-04-26 20:47:36 +02:00
Martin 475807a1c6 Merge pull request #135 from Fosowl/dev
Fix : #133 : improve ip online check + add tests
2025-04-26 10:49:02 +02:00
martin legrand e06acd65a6 fix : http added to url unnecessary 2025-04-26 10:42:29 +02:00
martin legrand 893f9ec2d8 fix: server_fn 2025-04-26 10:29:56 +02:00
martin legrand 1274a0c646 fix: server_fn 2025-04-26 10:29:36 +02:00
martin legrand e4ae8162a0 add test for ip_online check 2025-04-26 10:27:17 +02:00
martin legrand dce9074969 fix : is_ip_online function 2025-04-26 10:06:20 +02:00
martin legrand b7da34ff93 install readline on windows 2025-04-26 10:01:03 +02:00
martin legrand c360240259 fix : #133 2025-04-26 09:56:14 +02:00
Martin e68dc2212c Merge pull request #132 from Fosowl/dev
Planner agent improvement + Frontend fix
2025-04-25 22:12:05 +02:00
martin legrand e63d772959 readme update 2025-04-25 22:07:41 +02:00
martin legrand 45700d77ab fix : was showing code after execution 2025-04-25 21:54:36 +02:00
martin legrand f09cb8a7b5 fix : block not display on front with planner 2025-04-25 21:35:31 +02:00
martin legrand 49a36de149 upd readmeme 2025-04-25 21:17:17 +02:00
martin legrand 309a481a69 feat : enhance planner 2025-04-25 21:15:49 +02:00
martin legrand a11445e7c0 readme 2025-04-25 20:52:59 +02:00
martin legrand d5c431a609 update readme 2025-04-25 20:50:31 +02:00
martin legrand cfe19e637f feat : planner improvement, google provider 2025-04-25 20:13:25 +02:00
Martin cea68fed86 Merge pull request #131 from Fosowl/dev
Feat : MCP finder tool
2025-04-24 21:15:49 +02:00
martin legrand 273f4bd858 Feat : MCP finder tool 2025-04-24 21:13:29 +02:00
Martin 55d5ff39ff Merge pull request #130 from Fosowl/dev
Planner agent improvement, Browser agent stuck prevention, frontend change, readme update + fix
2025-04-24 13:53:54 +02:00
martin legrand 6049db1f24 fix : wrong value 2025-04-24 13:33:36 +02:00
martin legrand b479dd0b2f rm debug print 2025-04-24 13:24:56 +02:00
martin legrand 8b199869c7 fix : planner agent bug 2025-04-24 13:23:17 +02:00
martin legrand b9a954a058 upd readme 2025-04-24 12:24:28 +02:00
martin legrand 82aecd0aae fix : blocks not appearing on front for planner agent 2025-04-24 12:22:52 +02:00
martin legrand 812af254b5 upd readme 2025-04-24 10:45:45 +02:00
martin legrand a05596c416 upd readme 2025-04-24 10:41:46 +02:00
martin legrand cb251f93b5 upd readme 2025-04-24 10:41:00 +02:00
martin legrand 317f1521eb update readme 2025-04-24 10:36:47 +02:00
martin legrand 9c9824c05e update readme 2025-04-24 10:35:39 +02:00
martin legrand 564a09c96d feat : planner adapt to task failure + temporary remove frontend task panel 2025-04-23 15:51:47 +02:00
Martin 7fb5fa75ee Merge pull request #128 from Fosowl/dev
Integrate new frontend + random user agent
2025-04-22 20:10:21 +02:00
martin legrand d01ae7217f feat : random ua + more coherent browser signature 2025-04-22 14:44:34 +02:00
Martin 2ff93cef3c Merge pull request #127 from Saminu/Simba
refactor: update styles and structure for improved UI; add color cons…
2025-04-21 19:19:22 +02:00
Simba f7f33d0c79 refactor: update styles and structure for improved UI; add color constants 2025-04-21 18:45:02 +02:00
Martin 50142b48f8 Merge pull request #126 from Fosowl/dev
Update readme and slight frontend fix attempt
2025-04-21 15:08:56 +02:00
martin legrand 1b17b95e8c feat : slight fix attempt for frontend 2025-04-21 15:06:21 +02:00
martin legrand 4de527aa42 update discord link + less strict url format check 2025-04-21 12:10:13 +02:00
Martin de22f7218a Merge pull request #124 from Fosowl/dev
Add no cache dir to installation script and ensure wheel is up to date
2025-04-19 09:56:39 +02:00
martin legrand fdb4c887c3 fix : install script 2025-04-19 09:52:53 +02:00
Martin c6fe2865b6 Merge pull request #123 from Fosowl/dev
update ja readme according to change (auto-translate)
2025-04-18 19:18:19 +02:00
martin legrand 5ea0b4a895 update ja readme according to change (auto-translate) 2025-04-18 19:17:23 +02:00
Martin 523e7f8271 Merge pull request #122 from Fosowl/dev
Huge refactor and Frontend interface integration
2025-04-18 19:05:22 +02:00
Martin c93ff60900 Merge branch 'main' into dev 2025-04-18 19:05:06 +02:00
martin legrand 26e5159c1d fix : use effect 2025-04-18 18:47:41 +02:00
martin legrand 0f09ef92dd refactor : message for status 2025-04-18 18:31:11 +02:00
martin legrand 5ac7df1854 fix : browser stuck due to history problem 2025-04-18 18:05:54 +02:00
martin legrand 7f3682e884 fix : message not displayed bug 2025-04-18 17:54:47 +02:00
martin legrand 600bff8da4 fix : error 2025-04-18 17:38:51 +02:00
martin legrand c9f6d76d30 fix : status display on frontend 2025-04-18 17:18:11 +02:00
martin legrand c030b55521 fix : web front bugs 2025-04-18 16:29:59 +02:00
martin legrand 83c595144b feat : frontend message streaming 2025-04-18 15:42:53 +02:00
martin legrand 3a9514629a upd all readme 2025-04-18 10:23:39 +02:00
martin legrand ae8ff0640b upd zh readme 2025-04-17 20:44:53 +02:00
martin legrand b883b003be upd zh readme 2025-04-17 20:41:50 +02:00
martin legrand 89f91f7831 upd readme 2025-04-17 20:29:00 +02:00
martin legrand a4f56d582b fix : frontend route 2025-04-17 19:48:12 +02:00
martin legrand 56d5ec2d37 readme update 2025-04-17 19:48:03 +02:00
martin legrand ad9ca5e7cb commented out backend service until solution found for chrome in docker problem 2025-04-17 18:59:13 +02:00
martin legrand 36b26b43c9 fix deployement script 2025-04-17 12:05:23 +02:00
martin legrand 3d1f42351f upd readme 2025-04-16 22:36:11 +02:00
martin legrand 1a2b790f2b rename app to api.py 2025-04-16 22:33:50 +02:00
martin legrand 81b772df9a upd readme 2025-04-16 22:20:30 +02:00
martin legrand 7c4f283a05 update readme & config 2025-04-16 21:33:49 +02:00
martin legrand 66c460adad update readme & config 2025-04-16 21:21:19 +02:00
martin legrand efa1bbaecb update: readme 2025-04-16 21:14:30 +02:00
martin legrand ad21f66a44 refactor : frontend 2025-04-16 21:00:08 +02:00
martin legrand d5a07c11db fix : .md img path 2025-04-16 20:45:39 +02:00
martin legrand f4b0af1eb1 move technical images from media to docs 2025-04-16 20:44:42 +02:00
martin legrand 79400b8f52 refactor: move some .md to docs/ 2025-04-16 20:40:05 +02:00
martin legrand e1706d97f2 refactor: project folder names 2025-04-16 20:35:33 +02:00
martin legrand 023c183e85 refactor: rename server to llm_server for clarity 2025-04-16 20:29:46 +02:00
martin legrand 77d6e23c45 refactor : frontend line 2025-04-16 15:14:47 +02:00
martin legrand ca1f12b91b refactor : rename main.py to cli.py 2025-04-16 15:11:41 +02:00
martin legrand f2eda0e7d7 feat : update .cmd services & requirements.txt 2025-04-16 14:37:45 +02:00
martin legrand 153bd21910 feat : custom chhrome path save to env 2025-04-16 14:10:48 +02:00
martin legrand a3ca718131 feat : improve chrome path check + no query refusal on complex task 2025-04-16 13:59:11 +02:00
martin legrand 4342677344 fix : update screenshot on front kinda work 2025-04-16 13:57:53 +02:00
martin legrand 26421190b1 fix : change browser waiting check 2025-04-16 10:08:03 +02:00
martin legrand 906dc18060 fix : start_service.sh & compose 2025-04-16 08:43:32 +02:00
martin legrand 2cb7ac34ce add tools log 2025-04-15 21:39:24 +02:00
martin legrand 6d1edf9184 fix :__main__ not working within interpreter 2025-04-15 20:56:58 +02:00
martin legrand e1d55649d5 fix : invalid usage of memory_clear_section 2025-04-15 20:41:23 +02:00
Martin 6a7a3d623e Merge pull request #121 from Fosowl/Fosowl-patch-1
Update README.md
2025-04-15 19:31:29 +02:00
Martin 83e93dcf43 Update README.md 2025-04-15 19:30:45 +02:00
martin legrand a32cf60958 feat : small frontend improvement & planner auto fix 2025-04-15 16:31:53 +02:00
martin legrand 14f42b638d ci : full deploy with searxng, usgi, frontend (in progress) 2025-04-15 11:04:41 +02:00
martin legrand 89c3ecea68 ci: full docker compose deploy 2025-04-14 21:51:46 +02:00
martin legrand c65e6321f5 fix: error on browser view 2025-04-14 20:28:58 +02:00
martin legrand d1954ff326 First front & backend integration 2025-04-14 20:08:53 +02:00
martin legrand 592c7e6915 refactor : pre-backend implementation 2025-04-14 16:55:15 +02:00
martin legrand ecbdcaa57e upd readme 2025-04-14 14:33:04 +02:00
Martin aad1b426f0 Merge pull request #120 from Fosowl/dev
readme update + avoid asking for clarification multiple times
2025-04-14 14:31:32 +02:00
martin legrand ce81133560 upd readme 2025-04-14 11:58:52 +02:00
martin legrand 454e68033c Fix : prevent asking for clarification multiple time + readme update 2025-04-14 11:58:02 +02:00
martin legrand 8da3d2b3f8 refactor : test code in llmprovider 2025-04-13 20:57:39 +02:00
Martin 59795c3dc3 Merge pull request #118 from Fosowl/dev
Dev
2025-04-13 20:38:26 +02:00
Martin 6adc04200e Update README.md 2025-04-13 20:37:56 +02:00
Martin f3c71d6f19 Update README.md 2025-04-13 20:37:25 +02:00
Martin 8cedd9123b Merge pull request #117 from Fosowl/dev
Update README.md video
2025-04-13 20:23:53 +02:00
Martin 7313294c69 Update README.md 2025-04-13 19:29:42 +02:00
Martin 424c5c4f7b Merge pull request #116 from Fosowl/dev
Better web form handling
2025-04-13 17:30:00 +02:00
martin legrand e0f0c5c7f6 feat : better web form handling 2025-04-13 17:23:00 +02:00
Martin 2eb97e6724 Merge pull request #115 from Fosowl/dev
Improve browser note taking and contributing.md
2025-04-12 18:19:06 +02:00
martin legrand 5b491ddbf7 feat: enhance browser agent note taking 2025-04-12 16:40:19 +02:00
martin legrand 164b741d57 refactor: rm debug print 2025-04-12 14:59:45 +02:00
martin legrand dfda888e57 upd contributing.md 2025-04-12 13:25:07 +02:00
martin legrand a6c4b5ab3d doc image 2025-04-12 11:56:37 +02:00
Martin 488a645cf4 Merge pull request #114 from Fosowl/dev
Refactor self.role for new multilingual router + contributing.md
2025-04-12 11:54:37 +02:00
martin legrand 68bfc0ecef update contributing.md 2025-04-12 11:51:06 +02:00
martin legrand f4feb42dda refactor: self.role for router 2025-04-12 11:50:48 +02:00
Martin 49fab1b488 Merge pull request #113 from Fosowl/dev
Router support any language + Java interpreter with fixed lang keyerror
2025-04-11 14:14:11 +02:00
martin legrand 06e6b2798b fix : lang error 2025-04-11 14:11:09 +02:00
martin legrand 09ce9a882a update fr reademe 2025-04-11 13:45:22 +02:00
martin legrand 2ff7e90cea update readme 2025-04-11 13:00:20 +02:00
martin legrand a9c1f5b790 feat : java interpreter bash handle 2025-04-11 12:59:14 +02:00
martin legrand 9fe561085b feat : add java interpreter tool for code agent 2025-04-11 12:46:12 +02:00
martin legrand 92f9b93353 fix : language_bash_attempt error 2025-04-11 12:44:55 +02:00
martin legrand 4198e932ca feat : support any language set in config 2025-04-11 11:13:07 +02:00
Martin 00d1b01624 Merge pull request #110 from eltociear/add-japanese-readme
docs: add Japanese README
2025-04-11 09:43:54 +02:00
Ikko Eltociear Ashimine 75e417129d docs: add Japanese README
I created Japanese translated README.
2025-04-11 16:13:19 +09:00
Martin 46b5edfd3b Merge pull request #109 from Fosowl/dev
Fix fileFinder read file issue, browser agents prompts, browser stealth mode enhancement
2025-04-10 17:23:11 +02:00
martin legrand e66f535dd3 feat : more router few shots 2025-04-10 16:43:05 +02:00
martin legrand 4d5a532b23 mistalke in prompt 2025-04-10 16:39:50 +02:00
martin legrand 369850b86d fix : major issue with file reading tool, feat : prompt improvement for browser agent 2025-04-10 16:35:07 +02:00
martin legrand 7553d9dbb6 refactor : memory clear section function logic 2025-04-09 19:03:04 +02:00
martin legrand ed2a9cc204 server gpu percentage for vllm 2025-04-08 20:58:32 +02:00
martin legrand 9a1b2b93f6 fix : SessionNotCreatedException caused by data dir conflict 2025-04-08 20:31:07 +02:00
martin legrand 3c66eb646e fix : vllm Nonetype 2025-04-08 19:48:18 +02:00
martin legrand 82cf54706b feat : vllm in server fix 2025-04-08 19:40:02 +02:00
martin legrand 8cfb2d1246 feat : vllm in server 2025-04-08 19:38:06 +02:00
Martin aa9177df0c Merge pull request #106 from Fosowl/dev
Better action management of web browsing agent
2025-04-08 14:18:38 +02:00
martin legrand 864fb36af5 feat : change planner agent prompt 2025-04-08 14:16:59 +02:00
Martin f0aaa06d15 Update README.md 2025-04-08 13:37:25 +02:00
martin legrand 60795111b0 feat: action enum for browser agent 2025-04-08 13:35:21 +02:00
martin legrand 469551c2b5 fix : stuck for and back same webpage link 2025-04-08 10:43:28 +02:00
martin legrand 6eafeb15a4 feat : improve browser agent code structure 2025-04-08 10:34:39 +02:00
Martin d3e95712fd Update README.md 2025-04-07 17:02:00 +02:00
Martin fecc01e230 Merge pull request #103 from Fosowl/dev
readme update & tests add
2025-04-07 16:57:18 +02:00
martin legrand d75735ecb0 readme update & tests add 2025-04-07 16:56:36 +02:00
Martin 70fcb0d70d Merge pull request #102 from Fosowl/dev
current_dir -> work_dir for fileFinder + fix wrong url in dl safetensors script
2025-04-07 15:05:02 +02:00
martin legrand 6eee5cf350 rm debug print 2025-04-07 15:01:17 +02:00
martin legrand 21bf224fef fix: browser bug 2025-04-07 14:55:41 +02:00
Martin 139f8cdc11 Merge pull request #101 from Fosowl/dev
Feat : planner prompt improvement + enhance display + new readme image
2025-04-07 13:51:43 +02:00
martin legrand ff8fdddbdc feat : new readme img 2025-04-07 13:16:26 +02:00
martin legrand 93ebb9468c feat: small show answer display change 2025-04-07 12:03:28 +02:00
martin legrand a1e71fd0ce feat : improve planner agent handling of multifiles project 2025-04-07 12:02:01 +02:00
Martin 208bb5e93d Merge pull request #100 from Fosowl/dev
small fix
2025-04-06 20:04:11 +02:00
martin legrand 416d9d00ad fix: undeclared variable used in return 2025-04-06 20:02:55 +02:00
martin legrand 3550c4a448 fix: undeclared variable used in return 2025-04-06 20:02:21 +02:00
Martin 3af3791f54 Merge pull request #99 from Fosowl/dev
Enhanced web navigation & planner agent + logging system
2025-04-06 20:01:46 +02:00
MartinandCopilot 196841db50 Update sources/agents/browser_agent.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-06 20:00:49 +02:00
martin legrand bb67df8f42 feat : signal handler now agent specific instead of global 2025-04-06 19:46:52 +02:00
martin legrand 26e9dbcd40 feat : slight improvement for planner & web agent 2025-04-06 14:50:19 +02:00
martin legrand 42f9485a39 feat : enhance browser agent + add tests 2025-04-06 12:17:38 +02:00
martin legrand 6fb9ce67c0 feat : better web navigation of web agent 2025-04-05 22:13:29 +02:00
martin legrand 06ddc45955 fix : server cache bug 2025-04-05 16:47:38 +02:00
martin legrand 93c8f0f8e4 fix : server cache bug 2025-04-05 16:45:03 +02:00
martin legrand a667f89c12 fix : server cache 2025-04-05 16:41:24 +02:00
martin legrand 8991aaae8d feat : planner agent improvement 2025-04-05 16:39:16 +02:00
martin legrand 97708c7947 feat : server response cache 2025-04-05 16:36:58 +02:00
martin legrand 688e94d97c feat : html to actual markdown for browser + better logging system 2025-04-05 14:14:23 +02:00
martin legrand a09b6bf8aa feat : logger class for better logging 2025-04-05 12:12:38 +02:00
Martin f2ce720a3d Merge pull request #98 from Fosowl/dev
Fix various bug + handle webpage numerical value + improve prompts.
2025-04-04 15:50:50 +02:00
martin legrand a5c5061a2f feat : prompt change for casual agent 2025-04-04 15:07:43 +02:00
martin legrand 5321dcc3ba fix : exception in browser 2025-04-04 14:15:29 +02:00
martin legrand ac5118c4e3 feat : prompt change 2025-04-04 14:15:01 +02:00
martin legrand a4f28cec5d feat : .voices folder for tts 2025-04-04 12:34:00 +02:00
martin legrand 95f43be2af fix : avoid loading compress of planner agent memory 2025-04-04 11:57:06 +02:00
martin legrand ff9c1576b6 feat : better numerical value handling on webpage 2025-04-04 11:56:11 +02:00
martin legrand 4f7e30b498 feat : slight prompt change 2025-04-04 11:55:11 +02:00
martin legrand d6aba5fd39 feat : dsk_deepseek 2025-04-04 11:54:34 +02:00
martin legrand f70606b5ec feat : improve tts test code at bottom of file & index safety 2025-04-04 11:53:37 +02:00
martin legrand 92e2e8c0d6 fix : memory summarization issue 2025-04-04 11:41:47 +02:00
Martin 23dce5b886 Merge pull request #97 from Fosowl/dev
add CHS readme
2025-04-03 20:59:43 +02:00
martin legrand 80a3391b84 readme fix tab level 2025-04-03 20:58:55 +02:00
martin legrand 8f8c2104a2 update readme 2025-04-03 20:55:44 +02:00
martin legrand 7f4c96371e add simplified chinese readme 2025-04-03 20:53:39 +02:00
Martin 46c3b7c17e Merge pull request #96 from Fosowl/dev
update fr & en readme
2025-04-03 11:26:41 +02:00
martin legrand 319a4389ac update rf & en readme 2025-04-03 11:25:42 +02:00
Martin 32b3908aa3 Merge pull request #95 from Fosowl/dev
Multilingual routing system (english, french, chinese) + Better web agent handling of web form (#94 corrected)
2025-04-02 21:55:11 +02:00
martin legrand f798e4936c update requirement.txt 2025-04-02 21:50:08 +02:00
martin legrand e534faf115 fix : possible bus error 2025-04-02 21:09:22 +02:00
martin legrand a93dbbfb5c readme update 2025-04-02 18:28:32 +02:00
martin legrand f0cca0ed02 readme update 2025-04-02 18:27:49 +02:00
martin legrand 0f7ad9b741 readme update 2025-04-02 18:23:23 +02:00
martin legrand b9fc781f28 readme update 2025-04-02 18:21:13 +02:00
martin legrand c47e921a3b update readme 2025-04-02 18:18:01 +02:00
martin legrand 7890b4b3ca feat : better form handling 2025-04-02 15:43:51 +02:00
martin legrand f69ceb5025 feat : fast browser memory recovery 2025-04-02 13:49:18 +02:00
martin legrand aa75d276dc readme image change 2025-04-02 13:48:28 +02:00
martin legrand ffebcccd32 feat : slight prompt change for coder agent 2025-04-02 13:24:26 +02:00
martin legrand 3b201c82db docs: update readme given router now multilingual 2025-04-02 13:23:55 +02:00
martin legrand 704509560a feat : multilingual agent router 2025-04-02 13:22:32 +02:00
Martin 8c496d2bc2 Merge pull request #93 from Fosowl/dev
readme update
2025-04-01 21:07:17 +02:00
martin legrand 5992fdd659 readme update 2025-04-01 21:06:33 +02:00
Martin d476cf91dc Merge pull request #92 from Fosowl/dev
Improve web form handling & Better prompt for planner agent.
2025-04-01 19:47:25 +02:00
MartinandCopilot 02d28b4322 Update sources/agents/browser_agent.py for duplicate typing
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-01 19:42:44 +02:00
MartinandCopilot 9e47e2bf4f Update sources/llm_provider.py to remove duplicate typing
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-01 19:42:16 +02:00
MartinandCopilot 95f5b9df68 Update sources/speech_to_text.py
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-04-01 19:41:59 +02:00
martin legrand 1ffaf4689e rm : tmp file 2025-04-01 19:21:35 +02:00
martin legrand 140f7842cc feat: add config back to default settings 2025-04-01 19:19:10 +02:00
martin legrand b5311b2651 fix : typo in readme fr version 2025-04-01 19:10:57 +02:00
martin legrand e99851fba3 note: commit 56b5db7 was a mistake by agenticseek itself lol 2025-04-01 19:05:47 +02:00
martin legrand 3acbae5ea0 feat : no call to llm on goodbye, prompt adjustement for file agent 2025-04-01 19:00:39 +02:00
martin legrand 56b5db7df3 Initial project setup 2025-04-01 18:49:37 +02:00
martin legrand 698ed78acc feat: better find_and_click_submission function 2025-04-01 15:12:53 +02:00
martin legrand 9c3330b45d add french readme 2025-04-01 14:21:48 +02:00
Martin 9e5b2c5ed7 Merge pull request #91 from steveh8758/main
Mod README
2025-04-01 13:45:46 +02:00
steveh8758 11fa4aed48 Merge branch 'Fosowl:main' into main 2025-04-01 19:43:24 +08:00
steveh8758_lab 919cf1437d Mod README 2025-04-01 19:41:46 +08:00
martin legrand 1b5a55ccf2 feat : cleaner import arrangement 2025-04-01 13:10:06 +02:00
martin legrand b3efd09fb3 fix : browser not handling properly web form 2025-04-01 13:09:16 +02:00
Martin 617927c291 Merge pull request #89 from steveh8758/main
Add Chinese-Traditional README
2025-04-01 12:51:38 +02:00
steveh8758_lab 0ce492d083 Add Chinese-Traditional README 2025-04-01 18:19:54 +08:00
steveh8758 4cf1beb49f Merge branch 'Fosowl:main' into main 2025-04-01 18:16:17 +08:00
Martin c41c259cd6 Merge pull request #88 from Fosowl/dev
Browser stealth mode
2025-03-30 19:06:37 +02:00
martin legrand a3e95abfde update readme 2025-03-30 17:48:43 +02:00
martin legrand 164d2b21e9 update readme 2025-03-30 17:47:04 +02:00
martin legrand b34e343535 fix : possible crash with planner agent if wrong format returned by llm 2025-03-30 17:38:22 +02:00
martin legrand 8ccb6f4d77 fix : issue with browser 2025-03-30 17:22:35 +02:00
martin legrand 36b80dc758 fix duplicate : config.ini 2025-03-30 17:13:23 +02:00
martin legrand 927d09ffb5 feat : new config.ini 2025-03-30 16:15:48 +02:00
martin legrand a5ecd2d389 fix : improve install script 2025-03-30 16:13:44 +02:00
martin legrand 039ea71678 feat: stealth option in config 2025-03-30 16:00:38 +02:00
martin legrand a0b09410b3 feat : nopecha crx 2025-03-30 15:37:06 +02:00
martin legrand 3dbef96cf0 feat : stealth browser with selenium_stealth for captcha 2025-03-30 15:20:43 +02:00
martin legrand 69f276955a fix: ollama server issue 2025-03-30 12:04:06 +02:00
martin legrand e56e5a4b3d fix : fix 2025-03-30 12:02:17 +02:00
martin legrand 6b31516cd9 fix : bug from weird ollama behavior 2025-03-30 12:00:20 +02:00
martin legrand 61d83e6614 fix relative import issue 2025-03-30 11:55:55 +02:00
martin legrand 4d0130c297 feat : loading verbose message 2025-03-30 11:53:25 +02:00
martin legrand 7331cb7cb2 feat : better verbose message 2025-03-30 11:51:41 +02:00
martin legrand 8c431c690e readme update 2025-03-29 21:28:42 +01:00
martin legrand f60406d0f1 script update 2025-03-29 21:27:19 +01:00
Martin 7e18d78805 Merge pull request #87 from Fosowl/dev
Integration of new custom server provider
2025-03-29 20:29:13 +01:00
MartinandCopilot cd1833f3ad Update comment in sources/browser.py by copilot
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-03-29 20:25:52 +01:00
martin legrand 45818b1eba fix : display carriage problem 2025-03-29 20:12:18 +01:00
martin legrand 9561ca95a1 fix : healess browser setting not applied properly 2025-03-29 20:09:44 +01:00
martin legrand 875ab3bd8e feat : increase ctx size 2025-03-29 19:54:45 +01:00
martin legrand 1dd8e0a016 fix : llamacpp handler problem again 2025-03-29 19:47:44 +01:00
martin legrand 5862c98f3e fix : llamacpp handler problem 2025-03-29 19:41:29 +01:00
martin legrand ddb533a255 fix : server model download 2025-03-29 19:27:08 +01:00
martin legrand cc951d4745 feat : remove browser message 2025-03-29 18:48:38 +01:00
martin legrand 557f7aa333 perf: trying to improve perf 2025-03-29 18:20:47 +01:00
martin legrand e0eee90202 fix : server crash with ollama 2025-03-29 18:07:38 +01:00
martin legrand d8ded2d456 fix: animate_thinking bug 2025-03-29 16:13:42 +01:00
martin legrand 862a78276f feat : simpler, better terminal color 2025-03-29 15:53:27 +01:00
martin legrand e69cff0735 fix : pretty_print issue 2025-03-29 14:43:50 +01:00
martin legrand f42a31578e fix : response timeout 2025-03-29 14:30:28 +01:00
martin legrand 90894f806a fix : response timeout 2025-03-29 14:23:53 +01:00
martin legrand 5c9ada9468 fix : bug 2025-03-29 13:55:01 +01:00
martin legrand cf1d3d0ba1 fix : llama_cpp not defined 2025-03-29 13:34:16 +01:00
martin legrand 58d52ad61f fix : server problem with llamacpp 2025-03-29 13:33:25 +01:00
martin legrand 0c3a07f208 fix : server problem with llamacpp 2025-03-29 13:32:46 +01:00
martin legrand 44e0508ae5 fix : server problem with llamacpp 2025-03-29 13:31:13 +01:00
martin legrand 4676b817e9 fix : serverbug 2025-03-29 13:25:26 +01:00
martin legrand 32b17c3373 feat : better logging 2025-03-29 13:17:01 +01:00
martin legrand 7e95498f7a feat : better logging 2025-03-29 13:14:37 +01:00
martin legrand 4712d39427 feat : better server log 2025-03-29 12:52:33 +01:00
martin legrand 4c87353db4 readme update for server install instruction 2025-03-29 12:40:50 +01:00
martin legrand d1b20a1446 fix : server error 2025-03-29 12:34:51 +01:00
martin legrand 18f23db0fa fix : none generator error 2025-03-29 12:29:38 +01:00
martin legrand 8106cff45f fix : jsonify problem in server 2025-03-29 12:26:58 +01:00
martin legrand 75ac1631c4 fix : jsonify problem in server 2025-03-29 12:24:39 +01:00
martin legrand 021ef0cdc1 feat : logging message for server 2025-03-29 12:21:40 +01:00
martin legrand c995d2a47c fix app.py problem for server 2025-03-29 12:13:03 +01:00
martin legrand de76fe14ea feat : selective import 2025-03-29 12:10:16 +01:00
martin legrand ca50b1f2d0 fix : server problem 2025-03-29 11:52:17 +01:00
martin legrand a4cfa9c651 feat : better server provider 2025-03-29 11:46:22 +01:00
Martin 430d032095 Merge pull request #86 from Fosowl/dev
fix : execution problem when line start with block tag + dont load tts if disabled
2025-03-28 22:17:40 +01:00
martin legrand 0bf813e865 fix : execution problem when line start with block tag + dont load tts if disabled 2025-03-28 18:51:03 +01:00
Martin a65f54e9a1 Merge pull request #85 from Fosowl/dev
better readme image
2025-03-28 17:55:20 +01:00
martin legrand 0c7ce90980 update readme 2025-03-28 17:54:30 +01:00
martin legrand 4aba1bc7cb demo image for readme 2025-03-28 17:52:48 +01:00
martin legrand cf1ef1c819 rm DS_store file 2025-03-28 16:29:56 +01:00
Martin 855e376610 Merge pull request #84 from Fosowl/dev
fix readme image
2025-03-28 16:28:15 +01:00
martin legrand c6eeabce62 fix readme image 2025-03-28 16:27:37 +01:00
Martin 5e7b1ff0ba Merge pull request #83 from Fosowl/dev
Fix display & router problem + Feat : memory compression on session loading + personality customization + doc image
2025-03-28 16:23:37 +01:00
martin legrand 2b512b1315 change unsafe cmd list 2025-03-28 16:22:04 +01:00
martin legrand dae2c224e5 fix: memory compression on session loading 2025-03-28 15:41:54 +01:00
martin legrand fcda0abc21 change file agent prompt 2025-03-28 15:06:41 +01:00
martin legrand c862d496e3 feat : fix displaying problem + memory compression on loading + personality prompt + technical image 2025-03-28 14:43:05 +01:00
Martin 7968f83bf8 Merge pull request #81 from Fosowl/dev
readme udpate, changed deepseek-api to just deepseek for deepseek api provider
2025-03-27 21:11:43 +01:00
martin legrand 8cba1bad43 update readme 2025-03-27 21:06:33 +01:00
martin legrand bc6365567f fix : deepseek api not in example 2025-03-27 19:08:27 +01:00
Martin 6c4e8adda1 Merge pull request #80 from Fosowl/dev
udpate readme
2025-03-27 19:02:06 +01:00
martin legrand c22ec9b074 udpate readme 2025-03-27 19:01:18 +01:00
Martin 3e753bcf97 Merge pull request #79 from Fosowl/dev
udpate readme
2025-03-27 18:59:53 +01:00
martin legrand 6ba95de6e6 udpate readme 2025-03-27 18:58:40 +01:00
Martin 064d41588c Merge pull request #78 from Fosowl/dev
feat : lm-studio integration
2025-03-27 18:39:39 +01:00
martin legrand 582462a73f feat : lm-studio integration 2025-03-27 18:35:07 +01:00
Martin f58e7f04f1 Merge pull request #77 from Fosowl/dev
Local openai based api support + readme update + fix crash&bug
2025-03-27 12:58:08 +01:00
martin legrand bd951e19d3 docs : readme image 2025-03-27 12:52:20 +01:00
martin legrand 91e99a2dbf update readme.md 2025-03-27 12:49:26 +01:00
martin legrand a7d2beabe0 docs : readme image 2025-03-27 12:46:47 +01:00
martin legrand 2f78d033ab feat : browser agent knowledge of current note for navigation reasoning 2025-03-27 12:30:07 +01:00
martin legrand cce74b29ad fix : planner agent crash 2025-03-27 12:19:54 +01:00
martin legrand aa1c0a24e2 Fix : crash due to driver closing in multi agent web search 2025-03-27 12:16:51 +01:00
martin legrand cf4d9b63c7 rm debug log 2025-03-27 11:59:10 +01:00
martin legrand f0802c3035 typo in readme 2025-03-27 11:44:59 +01:00
martin legrand 86da6acf3f feat : support for local openai based api 2025-03-27 11:42:31 +01:00
martin legrand 697bc882c7 fix : memory recovery bug 2025-03-27 10:22:48 +01:00
steveh8758 8a0ffc940e Merge branch 'Fosowl:main' into main 2025-03-27 13:06:46 +08:00
Martin 63e947bf84 Merge pull request #76 from Fosowl/dev
Integration of better router + Integration of planner agent
2025-03-27 00:07:23 +01:00
martin legrand 24329aa3d2 change browser settings 2025-03-26 23:51:54 +01:00
martin legrand 58bdaca252 change config.ini 2025-03-26 23:49:39 +01:00
martin legrand 6249049bcc headless option in config 2025-03-26 23:48:10 +01:00
martin legrand 70e89d9203 headless option in config 2025-03-26 23:47:44 +01:00
martin legrand 39f053eee4 improved linux_install.sh script 2025-03-26 23:46:14 +01:00
martin legrand 4cfcb28c60 readme update 2025-03-26 23:39:10 +01:00
martin legrand 1027a2a77b fix : planner not passing info properly between agents 2025-03-26 20:51:31 +01:00
martin legrand 5dd3ffd9ef readme update 2025-03-26 15:47:28 +01:00
martin legrand 2aa31ac911 readme update 2025-03-26 15:43:24 +01:00
martin legrand 3d49e0aabe feat : media image + fix: router bug 2025-03-26 15:28:10 +01:00
martin legrand 8c425f62b6 fix : browser duplication, isolate driver creation 2025-03-26 14:17:52 +01:00
martin legrand 9080697dc0 feat : re-integrated and improved planner agent 2025-03-26 13:21:10 +01:00
martin legrand 279bdf8c7e rm : useless js function 2025-03-26 12:23:12 +01:00
martin legrand 7d67ae2562 feat : file agent imrprovement 2025-03-26 12:21:03 +01:00
martin legrand 8922350379 feat : file agent improved 2025-03-26 12:06:27 +01:00
martin legrand df922b18a7 fix : wrong condition 2025-03-26 11:09:05 +01:00
martin legrand 5d08565ff1 fix : bug 2025-03-26 11:06:03 +01:00
martin legrand 757a9b1e3e feat : task complexity routing 2025-03-26 10:54:25 +01:00
martin legrand 32bc096d9a feat : better ensemble logic for router 2025-03-26 09:58:27 +01:00
steveh8758 5b52dcc7fe Merge branch 'Fosowl:main' into main 2025-03-26 07:03:25 +08:00
martin legrand d871c378fe feat : better routing system 2025-03-25 15:44:23 +01:00
martin legrand 68bc60f6f4 Fix : installation script for windows 2025-03-25 13:04:01 +01:00
Martin 47a3e71b01 Merge pull request #75 from Fosowl/mow-branch
start_services for windows
2025-03-24 22:33:03 +01:00
Martin dfa6fadf2d Merge pull request #74 from steveh8758/mow-branch
Add: windows version start_services
2025-03-24 22:27:45 +01:00
martin legrand dffd8b5299 yaml: remove --fail 2025-03-24 22:20:43 +01:00
steveh8758 85f8dcef98 Merge branch 'Fosowl:main' into main 2025-03-25 05:17:31 +08:00
steveh8758 d3884c6eca Merge pull request #72 from Fosowl/dev
Ability to handle web form, Refactor some code, fix server script problem, fix save / load session problem
2025-03-25 05:17:02 +08:00
steveh8758_lab 98e2d8ad7a Add: windows version start_services
1. start ollam provider
2. up docker
2025-03-25 05:03:40 +08:00
steveh8758_lab cde602d77d Add: Windows version start_services.cmd
start ollama server and docker
2025-03-25 04:43:49 +08:00
martin legrand af168d2c57 feat : zero shot router for other lang 2025-03-24 20:22:30 +01:00
martin legrand a289ddf1fd Feat: prompt change for casual agent 2025-03-24 15:56:40 +01:00
martin legrand 323783b89e Feat : improve prompt, add agent verbose option 2025-03-24 14:41:24 +01:00
martin legrand d423c08440 feat : tests for browser 2025-03-24 13:35:37 +01:00
martin legrand 38fe983010 Feat : handle recaptcha 2025-03-24 13:09:36 +01:00
martin legrand 1b32dff6a4 Add precommit hook 2025-03-24 12:58:19 +01:00
martin legrand 189fb0d767 Fix: ask for value with input 2025-03-24 11:45:04 +01:00
martin legrand 037995ab59 captcha testing 2025-03-24 11:31:00 +01:00
martin legrand 8dde9f19a4 fix: server script 2025-03-24 10:41:43 +01:00
martin legrand 8c77f3eddb refactor: remove debug print 2025-03-23 21:24:05 +01:00
martin legrand e74bbe4044 minor fixes 2025-03-23 21:08:34 +01:00
martin legrand 9448ac1012 Fix: server script 2025-03-23 21:07:44 +01:00
martin legrand 8b5bb28c94 fix : various bugs & improve memory system 2025-03-23 17:25:49 +01:00
martin legrand caf1b5e9a9 Refactor : browser class & browsing agent can now login 2025-03-23 16:05:07 +01:00
martin legrand fa7d586a97 Feat : browser login form detecting and fill, fix: memory saving problems 2025-03-23 11:11:38 +01:00
Martin 7a3fd2150b Merge pull request #70 from Fosowl/dev
Fix : installation issues for linux system
2025-03-22 14:45:23 +01:00
martin legrand 0397183f2a fix : error pyaudio import 2025-03-22 13:34:05 +01:00
martin legrand 751212db47 script udpate 2025-03-22 13:29:06 +01:00
martin legrand bc38385fe9 fix : pyaudio install 2025-03-22 13:22:49 +01:00
martin legrand 76f52846de feat : dont import pyaudio if stt not enabled 2025-03-22 12:44:41 +01:00
martin legrand 771ac22d7f install: ensure port audio installation 2025-03-22 12:39:37 +01:00
martin legrand 47b3bcf297 fix : wheel error on some linux system 2025-03-22 12:36:43 +01:00
martin legrand 5e7dd321f0 Fix : pyaudio.paInt16 missing in AudioRecorder class init 2025-03-22 12:12:11 +01:00
steveh8758 489dac5488 Merge pull request #66 from Fosowl/dev
Fix : AudioRecorder issue, Improve readme, more flexible requirements + python_requires to 3.9
2025-03-22 15:47:18 +08:00
martin legrand b1ad643364 Fix : pyaudio.paInt16 missing in AudioRecorder class init 2025-03-21 19:34:57 +01:00
martin legrand b40322dc2c readme update & fix provider not auto downloading model 2025-03-21 19:27:37 +01:00
martin legrand 6e2954d446 setup.py description 2025-03-21 13:22:08 +01:00
martin legrand 6b69651a21 fix install setup requirement 2025-03-21 10:37:44 +01:00
martin legrand cb1a5c90e6 fix setup.py python version 2025-03-21 10:30:24 +01:00
martin legrand 6e1ab5f103 fix setup.py python version 2025-03-21 10:27:04 +01:00
martin legrand 6a825cf3fd Fix: requirement version 2025-03-21 10:15:25 +01:00
Martin 928bfd3d97 Merge pull request #65 from Fosowl/Fosowl-patch-2
Update README.md
2025-03-20 19:40:15 +01:00
martin legrand 4e2457b05d Doc: readme 2025-03-20 19:38:15 +01:00
Martin 98916b4404 Update README.md 2025-03-20 19:37:15 +01:00
Martin 48baf7812d Merge pull request #64 from Fosowl/dev
Web safety, better readme, Router improvement, Language detection & emotion utility, Better verbose
2025-03-20 19:25:37 +01:00
martin legrand 1ee73eae37 Doc: readme 2025-03-20 15:33:59 +01:00
martin legrand 18dd56e790 Doc: readm 2025-03-20 15:32:23 +01:00
martin legrand 762293536f Doc: readme; Feat : language utility class, small fix 2025-03-20 15:24:31 +01:00
martin legrand 7c1519a0de feat : selenium web security 2025-03-19 17:29:37 +01:00
Martin e153efe9e4 Merge pull request #61 from Fosowl/dev
fix chinese input being ignored, add deepseek API, browser improvement
2025-03-19 13:32:03 +01:00
martin legrand 70c64bf081 feat : llm prompt for search query 2025-03-19 12:53:34 +01:00
martin legrand 80071fbeaa fix : chromedriver bug 2025-03-19 09:41:48 +01:00
Martin 0e653fdefa Merge pull request #56 from ganeshnikhil/main
Update text_to_speech.py ,  browser.py .
2025-03-18 23:16:04 +01:00
ganesh nikhil 2418894dcb Update browser.py 2025-03-19 01:16:25 +05:30
ganesh nikhil 088e324b88 Update browser.py
added both methods, for support for beta to.
2025-03-18 23:07:39 +05:30
Martin a3d0e2c588 Merge pull request #58 from Fosowl/dev
Web navigation improvement, error section in readme, role updated for router, fix bug
2025-03-18 18:25:29 +01:00
martin legrand c813b5a3c0 Change browser page delay 2025-03-18 18:13:34 +01:00
ganesh nikhil f71e4acf7e Update requirements.txt 2025-03-18 21:28:34 +05:30
martin legrand bdbb590dc4 Feat : web navigation improvement, better prompting 2025-03-18 16:52:09 +01:00
ganesh nikhil 07a04b069e Update browser.py
update the code to remove overhead of check and install chromedriver.
2025-03-18 20:49:26 +05:30
ganesh nikhil d12b345fe8 Update browser.py
it automatically install chromedriver , if version is outdated or the chromedriver not found.
2025-03-18 20:41:51 +05:30
ganesh nikhil 9d57d0568c Update requirements.txt 2025-03-18 20:40:23 +05:30
ganesh nikhil 290b75de3f Update text_to_speech.py
updated the speak function , make it more sturctured , also added to play sound using afplay in macos and redirected linux or other to aplay , make sure the  display of audio  only work for jupyter notebooks not  in terminal. the name of audio file is directly used in code , standerized it.
2025-03-18 20:19:28 +05:30
martin legrand 292623ab52 Fix : browser not supporting non-alphabetic language 2025-03-18 14:18:59 +01:00
martin legrand dfcbacd464 Doc : add known issue section to readme 2025-03-18 13:24:50 +01:00
martin legrand 7fa16f2b70 Fix : remove planner agent until improvements 2025-03-18 12:27:17 +01:00
martin legrand 372da19f30 Fix : searxng now failing gracefully 2025-03-18 12:17:41 +01:00
martin legrand 0616f39e35 Fix : google chrome beta support on macos 2025-03-17 21:04:25 +01:00
Martin d51f17fdad Merge pull request #48 from ganeshnikhil/main
update browser.py multi-os support
2025-03-17 20:52:00 +01:00
ganesh nikhil 3e7d40c4f6 Update browser.py
finding the chromepath automatically.
2025-03-18 00:53:19 +05:30
Martin d4d695fecf Merge pull request #47 from Fosowl/dev
Image & star history
2025-03-17 20:15:54 +01:00
ganesh nikhil 477a145712 Merge branch 'Fosowl:main' into main 2025-03-18 00:41:19 +05:30
ganesh nikhil 2f912b0b95 Update browser.py
changes made to find the chrome path across the os.
2025-03-18 00:39:20 +05:30
martin legrand 83f4dba674 merge 2025-03-17 18:32:02 +01:00
martin legrand b05c2c4437 Docs: rm image 2025-03-17 18:28:53 +01:00
martin legrand 5b2edd0f7d Docs: better example image 2025-03-17 18:27:08 +01:00
Martin aad71179a5 Merge pull request #46 from Fosowl/Fosowl-patch-1
Update CONTRIBUTING.md
2025-03-17 17:56:53 +01:00
Martin a2b7753cd8 Update CONTRIBUTING.md 2025-03-17 17:56:13 +01:00
Martin 2eac4d37b3 Merge pull request #45 from Fosowl/dev
Integration of searxng for api free web searching
2025-03-17 17:40:44 +01:00
martin legrand 01ff72e775 Fix : web navigation problems 2025-03-17 15:58:46 +01:00
martin legrand 6f3fb4dce4 Fix : web navigation problems 2025-03-17 15:58:17 +01:00
martin legrand 9d214f9dab gender neutral tts in init 2025-03-17 14:55:06 +01:00
martin legrand 4b62a4eec7 Fix : useless script line 2025-03-17 14:49:40 +01:00
martin legrand 3ff8bc68c3 Fix : agent never exiting 2025-03-17 14:45:46 +01:00
martin legrand f6e3b38e6a readme update 2025-03-17 13:41:47 +01:00
martin legrand 887b318e27 rename .searxng.env 2025-03-17 13:38:12 +01:00
154 changed files with 45679 additions and 4300 deletions
+18
View File
@@ -0,0 +1,18 @@
# Python cache files
__pycache__/
*.py[cod]
# Virtual environments
agentic_seek_env/
.agentic_seek_env/
.env
# Git metadata
.git/
# macOS Finder files
.DS_Store
# Log files
*.log
+20 -2
View File
@@ -1,2 +1,20 @@
SEARXNG_BASE_URL="http://127.0.0.1:8080"
OPENAI_API_KEY='dont share this, not needed for local providers'
SEARXNG_BASE_URL="http://searxng:8080"
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/username/Documents/workspace_with_my_files"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
BACKEND_PORT="7777"
# Set this to your server's public IP/hostname when accessing the UI from a remote machine.
# Example: REACT_APP_BACKEND_URL=http://192.168.1.100:7777
REACT_APP_BACKEND_URL=http://localhost:7777
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='xxxxx'
DEEPSEEK_API_KEY='xxxxx'
OPENROUTER_API_KEY='xxxxx'
TOGETHER_API_KEY='xxxxx'
GOOGLE_API_KEY='xxxxx'
ANTHROPIC_API_KEY='xxxxx'
MINIMAX_API_KEY='xxxxx'
# Optional: MiniMax API base URL (default: https://api.minimax.io/v1)
# For mainland China users: https://api.minimaxi.com/v1
# MINIMAX_BASE_URL='https://api.minimax.io/v1'
+4
View File
@@ -0,0 +1,4 @@
# These are supported funding model platforms
github: [Fosowl ]# Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+3 -6
View File
@@ -23,16 +23,13 @@ A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**LLM Model used**
The model you used, for example deepseek-r1:14b
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
+30 -1
View File
@@ -1,11 +1,40 @@
*.wav
config.ini
*.DS_Store
*.log
*.tmp
*.safetensors
*.egg-info
cookies.json
test_agent.py
searxng/uwsgi.ini.new
searxng/settings.yml.new
config.ini
.voices/
experimental/
chrome_bundle/
.logs/
.screenshots/*.png
.screenshots/*.jpg
conversations/
agentic_env/*
agentic_seek_env/*
.env
*/.env
dsk/
chrome136/
### react ###
.DS_*
*.log
logs
**/*.backup.*
**/*.back.*
node_modules
bower_components
*.sublime*
psd
thumb
sketch
# Byte-compiled / optimized / DLL files
+9
View File
@@ -0,0 +1,9 @@
repos:
- repo: local
hooks:
- id: trufflehog
name: TruffleHog
description: Detect secrets in your data.
entry: bash -c 'trufflehog git file://. --since-commit HEAD --results=verified,unknown --no-update'
language: system
stages: ["commit", "push"]
+1
View File
@@ -0,0 +1 @@
3.10
-90
View File
@@ -1,90 +0,0 @@
# Contributors guide
## Prerequisites
- Python 3.8 or higher
- Ollama installed (for local model execution)
- Basic familiarity with Python and AI models
## Contribution Guidelines
We welcome contributions in the following areas:
- Code Improvements: Optimize existing code, fix bugs, or add new features.
- Documentation: Improve the README, write tutorials, or add inline comments.
- Testing: Write unit tests, integration tests, or help with debugging.
- New Features: Implement new tools, agents, or integrations.
## Steps to Contribute
Fork the project to your GitHub account.
Create a Branch:
```bash
git checkout -b feature/your-feature-name
```
Make Your Changes.
Write your code, add documentation, or fix bugs.
Test Your Changes.
Ensure your changes work as expected and do not break existing functionality.
Push your changes to your fork and submit a pull request to the main branch of this repository. Provide a clear description of your changes and reference any related issues.
## Coding Philosophy
1. **Privacy First, Always Local**
- All core functionality must be able to run 100% locally
- Cloud services should only be optional alternatives, clearly defined with a warning message.
- User data privacy is non-negotiable
2. **Agent-Based Architecture**
- Each agent should have a clear, single responsibility
- Agents should be modular and independently testable
- New agents should solve specific use cases
3. **Tool-Based Extensibility**
- Tools should be self-contained and follow the Tools base class
- Each tool should do one thing well
- Tools should provide clear feedback on success/failure
4. **User Experience**
- Provide meaningful feedback for all operations
- Support multiple languages (chinese, french, english for now)
- Text to speech with short response.
- Keep responses concise
5. **Code Quality**
- Write clear, self-documenting code
- Include type hints and docstrings
- Follow existing patterns in the codebase
- Add a if __name__ == "__main__" at the bottom of each class file for individual testing.
- Ideally had automated tests.
6. **Error Handling**
- Fail gracefully with meaningful messages
- Include recovery mechanisms where possible
- Log errors appropriately without exposing sensitive data
## Areas Needing Help
Here are some high-priority tasks and areas where we need contributions:
- Web Browsing: Implement autonomous web browsing capabilities for the assistant.
- Multi-Agent System: Enhance the multi-agent functionality on the dev branch.
- Memory & Recovery: Improve conversation compression.
- New Tools: Add support for additional programming languages or APIs.
- Testing: Write comprehensive tests for existing and new features.
If you're unsure where to start, feel free to reach out by opening an issue or joining our community discussions.
## Code of Conduct
See CODE_OF_CONDUCT.md
**Thank You!**
+103
View File
@@ -0,0 +1,103 @@
FROM --platform=linux/amd64 python:3.11.12
ENV DEBIAN_FRONTEND=noninteractive
# Install essential packages and Chrome dependencies
RUN apt-get update -y && apt-get install -y \
wget \
gnupg2 \
ca-certificates \
unzip \
xvfb \
libxss1 \
#libappindicator1 \
fonts-liberation \
libnss3 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libdrm2 \
libxcomposite1 \
libxdamage1 \
libxrandr2 \
xdg-utils \
dbus \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update -y && \
apt-get install -y \
gcc \
g++ \
gfortran \
libportaudio2 \
portaudio19-dev \
ffmpeg \
libavcodec-dev \
libavformat-dev \
libavutil-dev \
gnupg2 \
wget \
unzip \
python3 \
python3-pip \
libasound2 \
libatk-bridge2.0-0 \
libgtk-4-1 \
libnss3 \
xdg-utils \
wget \
&& rm -rf /var/lib/apt/lists/*
RUN apt-get update -y && \
apt-get install -y \
alsa-utils \
&& rm -rf /var/lib/apt/lists/*
ENV CHROME_TESTING_VERSION=134.0.6998.88
ENV DISPLAY=:99
WORKDIR /app
RUN set -eux; \
wget -qO /tmp/chrome.zip \
"https://storage.googleapis.com/chrome-for-testing-public/${CHROME_TESTING_VERSION}/linux64/chrome-linux64.zip"; \
unzip -q /tmp/chrome.zip -d /opt; \
rm /tmp/chrome.zip; \
ln -s /opt/chrome-linux64/chrome /usr/local/bin/google-chrome; \
ln -s /opt/chrome-linux64/chrome /usr/local/bin/chrome; \
mkdir -p /opt/chrome; \
ln -s /opt/chrome-linux64/chrome /opt/chrome/chrome; \
google-chrome --version
RUN set -eux; \
wget -qO /tmp/chromedriver.zip \
"https://storage.googleapis.com/chrome-for-testing-public/${CHROME_TESTING_VERSION}/linux64/chromedriver-linux64.zip"; \
unzip -q /tmp/chromedriver.zip -d /tmp; \
mv /tmp/chromedriver-linux64/chromedriver /usr/local/bin; \
rm /tmp/chromedriver.zip; \
chmod +x /usr/local/bin/chromedriver; \
chromedriver --version
RUN chmod +x /opt/chrome/chrome
RUN pip3 install --upgrade pip setuptools wheel
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
RUN mkdir -p /opt/workspace
RUN mkdir -p /tmp && chmod 1777 /tmp
# Copy application code
COPY api.py .
COPY sources/ ./sources/
COPY prompts/ ./prompts/
COPY crx/ crx/
COPY llm_router/ llm_router/
COPY config.ini .
EXPOSE 8000
# Run the application
CMD ["python3", "api.py"]
+591 -147
View File
@@ -1,258 +1,702 @@
# AgenticSeek: Private, Local Manus Alternative.
# AgenticSeek: Manus-like AI powered by Deepseek R1 Agents.
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
**A fully local alternative to Manus AI**, a voice-enabled AI assistant that codes, explores your filesystem, browse the web and correct it's mistakes all without sending a byte of data to the cloud. Built with reasoning models like DeepSeek R1, this autonomous agent runs entirely on your hardware, keeping your data private.
*A **100% local alternative to Manus AI**, this voice-enabled AI assistant autonomously browses the web, writes code, and plans tasks while keeping all data on your device. Tailored for local reasoning models, it runs entirely on your hardware, ensuring complete privacy and zero cloud dependency.*
[![Visit AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) ![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)
> 🛠️ **Work in Progress** Looking for contributors!
[![Visit AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
![alt text](./media/whale_readme.jpg)
### Why AgenticSeek ?
* 🔒 Fully Local & Private - Everything runs on your machine — no cloud, no data sharing. Your files, conversations, and searches stay private.
* 🌐 Smart Web Browsing - AgenticSeek can browse the internet by itself — search, read, extract info, fill web form — all hands-free.
## Features:
* 💻 Autonomous Coding Assistant - Need code? It can write, debug, and run programs in Python, C, Go, Java, and more — all without supervision.
- **100% Local**: No cloud, runs on your hardware. Your data stays yours.
* 🧠 Smart Agent Selection - You ask, it figures out the best agent for the job automatically. Like having a team of experts ready to help.
- **Voice interaction**: Voice-enabled natural interaction.
* 📋 Plans & Executes Complex Tasks - From trip planning to complex projects — it can split big tasks into steps and get things done using multiple AI agents.
- **Filesystem interaction**: Use bash to navigate and manipulate your files effortlessly.
* 🎙️ Voice-Enabled - Clean, fast, futuristic voice and speech to text allowing you to talk to it like it's your personal AI from a sci-fi movie. (In progress)
- **Code what you ask**: Can write, debug, and run code in Python, C, Golang and more languages on the way.
### **Demo**
- **Autonomous**: If a command flops or code breaks, it retries and fixes it by itself.
> *Can you search for the agenticSeek project, learn what skills are required, then open the CV_candidates.zip and then tell me which match best the project*
- **Agent routing**: Automatically picks the right agent for the job.
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
- **Divide and Conquer**: For big tasks, spins up multiple agents to plan and execute.
Disclaimer: This demo, including all the files that appear (e.g: CV_candidates.zip), are entirely fictional. We are not a corporation, we seek open-source contributors not candidates.
- **Tool-Equipped**: From basic search to flight APIs and file exploration, every agent has it's own tools.
> 🛠⚠️ **Active Work in Progress**
- **Memory**: Remembers whats useful, your preferences and past sessions conversation.
> 🙏 This project started as a side-project and has zero roadmap and zero funding. It's grown way beyond what I expected by ending in GitHub Trending. Contributions, feedback, and patience are deeply appreciated.
- **Web Browsing**: Autonomous web navigation is underway.
## Prerequisites
Before you begin, ensure you have the following software installed:
### Searching the web with agenticSeek :
* **Git:** For cloning the repository. [Download Git](https://git-scm.com/downloads)
* **Python 3.10.x:** We strongly recommend using Python version 3.10.x. Using other versions might lead to dependency errors. [Download Python 3.10](https://www.python.org/downloads/release/python-3100/) (pick a 3.10.x version).
* **Docker Engine & Docker Compose:** For running bundled services like SearxNG.
* Install Docker Desktop (which includes Docker Compose V2): [Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* Alternatively, install Docker Engine and Docker Compose separately on Linux: [Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/) (ensure you install Compose V2, e.g., `sudo apt-get install docker-compose-plugin`).
![alt text](./media/exemples/search_startup.png)
*See media/examples for other use case screenshots.*
---
## **Installation**
### 1️⃣ **Clone the repository**
### 1. **Clone the repository and setup**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2 **Create a virtual env**
### 2. Change the .env file content
```sh
python3 -m venv agentic_seek_env
source agentic_seek_env/bin/activate
# On Windows: agentic_seek_env\Scripts\activate
SEARXNG_BASE_URL="http://searxng:8080" # http://127.0.0.1:8080 if running on host
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
### 3️⃣ **Install package**
**Automatic Installation:**
Update the `.env` file with your own values as needed:
- **SEARXNG_BASE_URL**: Leave unchanged unless running on host with CLI mode.
- **REDIS_BASE_URL**: Leave unchanged
- **WORK_DIR**: Path to your working directory on your local machine. AgenticSeek will be able to read and interact with these files.
- **OLLAMA_PORT**: Port number for the Ollama service.
- **LM_STUDIO_PORT**: Port number for the LM Studio service.
- **CUSTOM_ADDITIONAL_LLM_PORT**: Port for any additional custom LLM service.
**API Key are totally optional for user who choose to run LLM locally. Which is the primary purpose of this project. Leave empty if you have sufficient hardware**
### 3. **Start Docker**
Make sure Docker is installed and running on your system. You can start Docker using the following commands:
- **On Linux/macOS:**
Open a terminal and run:
```sh
sudo systemctl start docker
```
Or launch Docker Desktop from your applications menu if installed.
- **On Windows:**
Start Docker Desktop from the Start menu.
You can verify Docker is running by executing:
```sh
docker info
```
If you see information about your Docker installation, it is running correctly.
See the table of [Local Providers](#list-of-local-providers) below for a summary.
Next step: [Run AgenticSeek locally](#start-services-and-run)
*See the [Troubleshooting](#troubleshooting) section if you are having issues.*
*If your hardware can't run LLMs locally, see [Setup to run with an API](#setup-to-run-with-an-api).*
*For detailed `config.ini` explanations, see [Config Section](#config).*
---
## Setup for running LLM locally on your machine
**Hardware Requirements:**
To run LLMs locally, you'll need sufficient hardware. At a minimum, a GPU capable of running Magistral, Qwen or Deepseek 14B is required. See the FAQ for detailed model/performance recommendations.
**Setup your local provider**
Start your local provider (for example with ollama):
Unless you wish to to run AgenticSeek on host (CLI mode), export or set the provider listen address:
```sh
./install.sh
export OLLAMA_HOST=0.0.0.0:11434
```
**Manually:**
Then, start you provider:
```sh
pip3 install -r requirements.txt
# or
python3 setup.py install
```
## Run locally on your machine
**We recommend using at least Deepseek 14B, smaller models struggle with tool use and forget quickly the context.**
### 1️⃣ **Download Models**
Make sure you have [Ollama](https://ollama.com/) installed.
Download the `deepseek-r1:7b` model from [DeepSeek](https://deepseek.com/models)
```sh
ollama pull deepseek-r1:7b
```
### 2 **Run the Assistant (Ollama)**
Start the ollama server
```sh
ollama serve
```
Change the config.ini file to set the provider_name to `ollama` and provider_model to `deepseek-r1:7b`
See below for a list of local supported provider.
NOTE: `deepseek-r1:7b`is an example, use a bigger model if your hardware allow it.
**Update the config.ini**
Change the config.ini file to set the provider_name to a supported provider and provider_model to a LLM supported by your provider. We recommend reasoning model such as *Magistral* or *Deepseek*.
See the **FAQ** at the end of the README for required hardware.
```sh
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:7b
is_local = True # Whenever you are running locally or with remote provider.
provider_name = ollama # or lm-studio, openai, etc..
provider_model = deepseek-r1:14b # choose a model that fit your hardware
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # name of your AI
recover_last_session = True # whenever to recover the previous session
save_session = True # whenever to remember the current session
speak = False # text to speech
listen = False # Speech to text, only for CLI, experimental
jarvis_personality = False # Whenever to use a more "Jarvis" like personality (experimental)
languages = en zh # The list of languages, Text to speech will default to the first language on the list
[BROWSER]
headless_browser = True # leave unchanged unless using CLI on host.
stealth_mode = True # Use undetected selenium to reduce browser detection
```
start all services :
**Warning**:
- The `config.ini` file format does not support comments.
Do not copy and paste the example configuration directly, as comments will cause errors. Instead, manually modify the `config.ini` file with your desired settings, excluding any comments.
- Do *NOT* set provider_name to `openai` if using LM-studio for running LLMs. Set it to `lm-studio`.
- Some provider (eg: lm-studio) require you to have `http://` in front of the IP. For example `http://127.0.0.1:1234`
**List of local providers**
| Provider | Local? | Description |
|-----------|--------|-----------------------------------------------------------|
| ollama | Yes | Run LLMs locally with ease using ollama as a LLM provider |
| lm-studio | Yes | Run LLM locally with LM studio (set `provider_name` to `lm-studio`)|
| openai | Yes | Use openai compatible API (eg: llama.cpp server) |
Next step: [Start services and run AgenticSeek](#Start-services-and-Run)
*See the [Troubleshooting](#troubleshooting) section if you are having issues.*
*If your hardware can't run LLMs locally, see [Setup to run with an API](#setup-to-run-with-an-api).*
*For detailed `config.ini` explanations, see [Config Section](#config).*
## Setup to run with an API
This setup uses external, cloud-based LLM providers. You'll need an API key from your chosen service.
**1. Choose an API Provider and Get an API Key:**
Refer to the [List of API Providers](#list-of-api-providers) below. Visit their websites to sign up and obtain an API key.
**2. Set Your API Key as an Environment Variable:**
* **Linux/macOS:**
Open your terminal and use the `export` command. It's best to add this to your shell's profile file (e.g., `~/.bashrc`, `~/.zshrc`) for persistence.
```sh
./start_services.sh
export PROVIDER_API_KEY="your_api_key_here"
# Replace PROVIDER_API_KEY with the specific variable name, e.g., OPENAI_API_KEY, GOOGLE_API_KEY
```
Run the assistant:
Example for TogetherAI:
```sh
python3 main.py
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **Command Prompt (Temporary for current session):**
```cmd
set PROVIDER_API_KEY=your_api_key_here
```
* **PowerShell (Temporary for current session):**
```powershell
$env:PROVIDER_API_KEY="your_api_key_here"
```
* **Permanently:** Search for "environment variables" in the Windows search bar, click "Edit the system environment variables," then click the "Environment Variables..." button. Add a new User variable with the appropriate name (e.g., `OPENAI_API_KEY`) and your key as the value.
*(See FAQ: [How do I set API keys?](#how-do-i-set-api-keys) for more details).*
**3. Update `config.ini`:**
```ini
[MAIN]
is_local = False
provider_name = openai # Or google, deepseek, togetherAI, huggingface
provider_model = gpt-3.5-turbo # Or gemini-1.5-flash, deepseek-chat, mistralai/Mixtral-8x7B-Instruct-v0.1 etc.
provider_server_address = # Typically ignored or can be left blank when is_local = False for most APIs
# ... other settings ...
```
*Warning:* Make sure there are no trailing spaces in the `config.ini` values.
**List of API Providers**
| Provider | `provider_name` | Local? | Description | API Key Link (Examples) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | No | Use ChatGPT models via OpenAI's API. | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | No | Use Google Gemini models via Google AI Studio. | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | No | Use Deepseek models via their API. | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | No | Use models from Hugging Face Inference API. | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | No | Use various open-source models via TogetherAI API.| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
| OpenRouter | `openrouter` | No | Use OpenRouter Models| [https://openrouter.ai/](https://openrouter.ai/) |
| MiniMax | `minimax` | No | Use MiniMax models (e.g., MiniMax-M2.7, MiniMax-M2.5).| [platform.minimax.io](https://platform.minimax.io/user-center/basic-information) |
*Note:*
* We advise against using `gpt-4o` or other OpenAI models for complex web browsing and task planning as current prompt optimizations are geared towards models like Deepseek.
* Coding/bash tasks might encounter issues with Gemini, as it may not strictly follow formatting prompts optimized for Deepseek.
* The `provider_server_address` in `config.ini` is generally not used when `is_local = False` as the API endpoint is usually hardcoded in the respective provider's library.
Next step: [Start services and run AgenticSeek](#Start-services-and-Run)
*See the **Known issues** section if you are having issues*
*See the **Config** section for detailed config file explanation.*
---
## **Run the LLM on your own server**
## Start services and Run
If you have a powerful computer or a server that you can use, but you want to use it from your laptop you have the options to run the LLM on a remote server.
By default AgenticSeek is run fully in docker.
### 1️⃣ **Set up and start the server scripts**
**Option 1:** Run in Docker, use web interface:
Start required services. This will start all services from the docker-compose.yml, including:
- searxng
- redis (required by searxng)
- frontend
- backend (if using `full` when using the web interface)
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Window
```
**Warning:** This step will download and load all Docker images, which may take up to 30 minutes. After starting the services, please wait until the backend service is fully running (you should see **backend: "GET /health HTTP/1.1" 200 OK** in the log) before sending any messages. The backend services might take 5 minute to start on first run.
Go to `http://localhost:3000/` and you should see the web interface.
*Troubleshooting service start:* If these scripts fail, ensure Docker Engine is running and Docker Compose (V2, `docker compose`) is correctly installed. Check the output in the terminal for error messages. See [FAQ: Help! I get an error when running AgenticSeek or its scripts.](#faq-troubleshooting)
**Option 2:** CLI mode:
To run with CLI interface you would have to install package on host:
```sh
./install.sh
./install.bat # windows
```
Then you must change the SEARXNG_BASE_URL in `config.ini` to:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
Start required services. This will start some services from the docker-compose.yml, including:
- searxng
- redis (required by searxng)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Window
```
Run: uv run: `uv run python -m ensurepip` to ensure uv has pip enabled.
Use the CLI: `uv run cli.py`
---
## Usage
Make sure the services are up and running with `./start_services.sh full` and go to `localhost:3000` for web interface.
You can also use speech to text by setting `listen = True` in the config. Only for CLI mode.
To exit, simply say/type `goodbye`.
Here are some example usage:
> *Make a snake game in python!*
> *Search the web for top cafes in Rennes, France, and save a list of three with their addresses in rennes_cafes.txt.*
> *Write a Go program to calculate the factorial of a number, save it as factorial.go in your workspace*
> *Search my summer_pictures folder for all JPG files, rename them with todays date, and save a list of renamed files in photos_list.txt*
> *Search online for popular sci-fi movies from 2024 and pick three to watch tonight. Save the list in movie_night.txt.*
> *Search the web for the latest AI news articles from 2025, select three, and write a Python script to scrape their titles and summaries. Save the script as news_scraper.py and the summaries in ai_news.txt in /home/projects*
> *Friday, search the web for a free stock price API, register with supersuper7434567@gmail.com then write a Python script to fetch using the API daily prices for Tesla, and save the results in stock_prices.csv*
*Note that form filling capabilities are still experimental and might fail.*
After you type your query, AgenticSeek will allocate the best agent for the task.
Because this is an early prototype, the agent routing system might not always allocate the right agent based on your query.
Therefore, you should be very explicit in what you want and how the AI might proceed for example if you want it to conduct a web search, do not say:
`Do you know some good countries for solo-travel?`
Instead, ask:
`Do a web search and find out which are the best country for solo-travel`
---
## **Setup to run the LLM on your own server**
If you have a powerful computer or a server that you can use, but you want to use it from your laptop you have the options to run the LLM on a remote server using our custom llm server.
On your "server" that will run the AI model, get the ip address
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # local ip
curl https://ipinfo.io/ip # public ip
```
Note: For Windows or macOS, use ipconfig or ifconfig respectively to find the IP address.
Clone the repository and then, run the script `stream_llm.py` in `server/`
Clone the repository and enter the `server/`folder.
```sh
python3 server_ollama.py
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
### 2️⃣ **Run it**
Install server specific requirements:
```sh
pip3 install -r requirements.txt
```
Run the server script.
```sh
python3 app.py --provider ollama --port 3333
```
You have the choice between using `ollama` and `llamacpp` as a LLM service.
Now on your personal computer:
Clone the repository.
Change the `config.ini` file to set the `provider_name` to `server` and `provider_model` to `deepseek-r1:7b`.
Change the `config.ini` file to set the `provider_name` to `server` and `provider_model` to `deepseek-r1:xxb`.
Set the `provider_server_address` to the ip address of the machine that will run the model.
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:14b
provider_server_address = x.x.x.x:5000
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
Run the assistant:
```sh
./start_services.sh
python3 main.py
```
## **Run with an API**
Clone the repository.
Set the desired provider in the `config.ini`
```sh
[MAIN]
is_local = False
provider_name = openai
provider_model = gpt4-o
provider_server_address = 127.0.0.1:5000 # can be set to anything, not used
```
Run the assistant:
```sh
./start_services.sh
python3 main.py
```
Next step: [Start services and run AgenticSeek](#Start-services-and-Run)
---
## Providers
## Speech to Text
The table below show the available providers:
Warning: speech to text only work in CLI mode at the moment.
| Provider | Local? | Description |
|-----------|--------|-----------------------------------------------------------|
| Ollama | Yes | Run LLMs locally with ease using ollama as a LLM provider |
| Server | Yes | Host the model on another machine, run your local machine |
| OpenAI | No | Use ChatGPT API (non-private) |
| Deepseek | No | Deepseek API (non-private) |
| HuggingFace| No | Hugging-Face API (non-private) |
Please note that currently speech to text only work in english.
To select a provider change the config.ini:
The speech-to-text functionality is disabled by default. To enable it, set the listen option to True in the config.ini file:
```
is_local = False
provider_name = openai
provider_model = gpt-4o
provider_server_address = 127.0.0.1:5000
listen = True
```
`is_local`: should be True for any locally running LLM, otherwise False.
`provider_name`: Select the provider to use by its name, see the provider list above.
When enabled, the speech-to-text feature listens for a trigger keyword, which is the agent's name, before it begins processing your input. You can customize the agent's name by updating the `agent_name` value in the *config.ini* file:
`provider_model`: Set the model to use by the agent.
```
agent_name = Friday
```
`provider_server_address`: can be set to anything if you are not using the server provider.
For optimal recognition, we recommend using a common English name like "John" or "Emma" as the agent name
Once you see the transcript start to appear, say the agent's name aloud to wake it up (e.g., "Friday").
Speak your query clearly.
End your request with a confirmation phrase to signal the system to proceed. Examples of confirmation phrases include:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## Config
Example config:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Example for Ollama; use http://127.0.0.1:1234 for LM-Studio
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # List of languages for TTS and potentially routing.
[BROWSER]
headless_browser = False
stealth_mode = False
```
**Explanation of `config.ini` Settings**:
* **`[MAIN]` Section:**
* `is_local`: `True` if using a local LLM provider (Ollama, LM-Studio, local OpenAI-compatible server) or the self-hosted server option. `False` if using a cloud-based API (OpenAI, Google, etc.).
* `provider_name`: Specifies the LLM provider.
* Local options: `ollama`, `lm-studio`, `openai` (for local OpenAI-compatible servers), `server` (for the self-hosted server setup).
* API options: `openai`, `google`, `deepseek`, `huggingface`, `togetherAI`.
* `provider_model`: The specific model name or ID for the chosen provider (e.g., `deepseekcoder:6.7b` for Ollama, `gpt-3.5-turbo` for OpenAI API, `mistralai/Mixtral-8x7B-Instruct-v0.1` for TogetherAI).
* `provider_server_address`: The address of your LLM provider.
* For local providers: e.g., `http://127.0.0.1:11434` for Ollama, `http://127.0.0.1:1234` for LM-Studio.
* For the `server` provider type: The address of your self-hosted LLM server (e.g., `http://your_server_ip:3333`).
* For cloud APIs (`is_local = False`): This is often ignored or can be left blank, as the API endpoint is usually handled by the client library.
* `agent_name`: Name of the AI assistant (e.g., Friday). Used as a trigger word for speech-to-text if enabled.
* `recover_last_session`: `True` to attempt to restore the previous session's state, `False` to start fresh.
* `save_session`: `True` to save the current session's state for potential recovery, `False` otherwise.
* `speak`: `True` to enable text-to-speech voice output, `False` to disable.
* `listen`: `True` to enable speech-to-text voice input (CLI mode only), `False` to disable.
* `work_dir`: **Crucial:** The directory where AgenticSeek will read/write files. **Ensure this path is valid and accessible on your system.**
* `jarvis_personality`: `True` to use a more "Jarvis-like" system prompt (experimental), `False` for the standard prompt.
* `languages`: A comma-separated list of languages (e.g., `en, zh, fr`). Used for TTS voice selection (defaults to the first) and can assist the LLM router. Avoid too many or very similar languages for router efficiency.
* **`[BROWSER]` Section:**
* `headless_browser`: `True` to run the automated browser without a visible window (recommended for web interface or non-interactive use). `False` to show the browser window (useful for CLI mode or debugging).
* `stealth_mode`: `True` to enable measures to make browser automation harder to detect. May require manual installation of browser extensions like anticaptcha.
This section summarizes the supported LLM provider types. Configure them in `config.ini`.
**Local Providers (Run on Your Own Hardware):**
| Provider Name in `config.ini` | `is_local` | Description | Setup Section |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | Use Ollama to serve local LLMs. | [Setup for running LLM locally](#setup-for-running-llm-locally-on-your-machine) |
| `lm-studio` | `True` | Use LM-Studio to serve local LLMs. | [Setup for running LLM locally](#setup-for-running-llm-locally-on-your-machine) |
| `openai` (for local server) | `True` | Connect to a local server that exposes an OpenAI-compatible API (e.g., llama.cpp). | [Setup for running LLM locally](#setup-for-running-llm-locally-on-your-machine) |
| `server` | `False` | Connect to the AgenticSeek self-hosted LLM server running on another machine. | [Setup to run the LLM on your own server](#setup-to-run-the-llm-on-your-own-server) |
**API Providers (Cloud-Based):**
| Provider Name in `config.ini` | `is_local` | Description | Setup Section |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | Use OpenAI's official API (e.g., GPT-3.5, GPT-4). | [Setup to run with an API](#setup-to-run-with-an-api) |
| `google` | `False` | Use Google's Gemini models via API. | [Setup to run with an API](#setup-to-run-with-an-api) |
| `deepseek` | `False` | Use Deepseek's official API. | [Setup to run with an API](#setup-to-run-with-an-api) |
| `huggingface` | `False` | Use Hugging Face Inference API. | [Setup to run with an API](#setup-to-run-with-an-api) |
| `togetherAI` | `False` | Use TogetherAI's API for various open models. | [Setup to run with an API](#setup-to-run-with-an-api) |
---
## Troubleshooting
If you encounter issues, this section provides guidance.
# Known Issues
## ChromeDriver Issues
**Error Example:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### Root Cause
ChromeDriver version incompatibility occurs when:
1. Your installed ChromeDriver version doesn't match your Chrome browser version
2. In Docker environments, `undetected_chromedriver` may download its own ChromeDriver version, bypassing the mounted binary
### Solution Steps
#### 1. Check Your Chrome Version
Open Google Chrome → `Settings > About Chrome` to find your version (e.g., "Version 134.0.6998.88")
#### 2. Download Matching ChromeDriver
**For Chrome 115 and newer:** Use the [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/)
- Visit the Chrome for Testing availability dashboard
- Find your Chrome version or the closest available match
- Download the ChromeDriver for your OS (Linux64 for Docker environments)
**For older Chrome versions:** Use the [legacy ChromeDriver downloads](https://chromedriver.chromium.org/downloads)
![Download ChromeDriver from Chrome for Testing](./media/chromedriver_readme.png)
#### 3. Install ChromeDriver (Choose One Method)
**Method A: Project Root Directory (Recommended for Docker)**
```bash
# Place the downloaded chromedriver binary in your project root
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # Make executable on Linux/macOS
```
**Method B: System PATH**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows: Place chromedriver.exe in a folder that's in your PATH
```
#### 4. Verify Installation
```bash
# Test the ChromeDriver version
./chromedriver --version
# OR if in PATH:
chromedriver --version
```
### Docker-Specific Notes
⚠️ **Important for Docker Users:**
- The Docker volume mount approach may not work with stealth mode (`undetected_chromedriver`)
- **Solution**: Place ChromeDriver in the project root directory as `./chromedriver`
- The application will automatically detect and use this binary
- You should see: `"Using ChromeDriver from project root: ./chromedriver"` in the logs
### Troubleshooting Tips
1. **Still getting version mismatch?**
- Verify the ChromeDriver is executable: `ls -la ./chromedriver`
- Check the ChromeDriver version: `./chromedriver --version`
- Ensure it matches your Chrome browser version
2. **Docker container issues?**
- Check backend logs: `docker logs backend`
- Look for the message: `"Using ChromeDriver from project root"`
- If not found, verify the file exists and is executable
3. **Chrome for Testing versions**
- Use the exact version match when possible
- For version 134.0.6998.88, use ChromeDriver 134.0.6998.165 (closest available)
- Major version numbers must match (134 = 134)
### Version Compatibility Matrix
| Chrome Version | ChromeDriver Version | Status |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ Works |
| 133.0.6943.x | 133.0.6943.141 | ✅ Works |
| 132.0.6834.x | 132.0.6834.159 | ✅ Works |
*For the latest compatibility, check the [Chrome for Testing dashboard](https://googlechromelabs.github.io/chrome-for-testing/)*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
This happen if there is a mismatch between your browser and chromedriver version.
You need to navigate to download the latest version:
https://developer.chrome.com/docs/chromedriver/downloads
If you're using Chrome version 115 or newer go to:
https://googlechromelabs.github.io/chrome-for-testing/
And download the chromedriver version matching your OS.
![alt text](./media/chromedriver_readme.png)
If this section is incomplete please raise an issue.
## connection adapters Issues
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'` (Note: port may vary)
```
* **Cause:** The `provider_server_address` in `config.ini` for `lm-studio` (or other similar local OpenAI-compatible servers) is missing the `http://` prefix or is pointing to the wrong port.
* **Solution:**
* Ensure the address includes `http://`. LM-Studio typically defaults to `http://127.0.0.1:1234`.
* Correct `config.ini`: `provider_server_address = http://127.0.0.1:1234` (or your actual LM-Studio server port).
## SearxNG Base URL Not Provided
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
This might arise if you are running the CLI mode with the wrong base url for searxng.
The SEARXNG_BASE_URL should be depending on whenever you run in docker or on host:
**Run on host**: `SEARXNG_BASE_URL="http://localhost:8080"`
**Run fully in docker (web interface)**: `SEARXNG_BASE_URL="http://searxng:8080"`
## FAQ
**Q: What hardware do I need?**
7B Model: GPU with 8GB VRAM.
14B Model: 12GB GPU (e.g., RTX 3060).
32B Model: 24GB+ VRAM.
| Model Size | GPU | Comment |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB Vram | ⚠️ Not recommended. Performance is poor, frequent hallucinations, and planner agents will likely fail. |
| 14B | 12 GB VRAM (e.g. RTX 3060) | ✅ Usable for simple tasks. May struggle with web browsing and planning tasks. |
| 32B | 24+ GB VRAM (e.g. RTX 4090) | 🚀 Success with most tasks, might still struggle with task planning |
| 70B+ | 48+ GB Vram | 💪 Excellent. Recommended for advanced use cases. |
**Q: Why Deepseek R1 over other models?**
**Q: I get an error what do I do?**
Deepseek R1 excels at reasoning and tool use for its size. We think its a solid fit for our needs other models work fine, but Deepseek is our primary pick.
**Q: I get an error running `main.py`. What do I do?**
Ensure Ollama is running (`ollama serve`), your `config.ini` matches your provider, and dependencies are installed. If none work feel free to raise an issue.
**Q: How to join the discord ?**
Ask in the Community section for an invite.
Ensure local is running (`ollama serve`), your `config.ini` matches your provider, and dependencies are installed. If none work feel free to raise an issue.
**Q: Can it really run 100% locally?**
Yes with Ollama or Server providers, all speech to text, LLM and text to speech model run locally. Non-local options (OpenAI or others API) are optional.
Yes with Ollama, lm-studio or server providers, all speech to text, LLM and text to speech model run locally. Non-local options (OpenAI or others API) are optional.
**Q: How come it is older than manus ?**
**Q: Why should I use AgenticSeek when I have Manus?**
we started this a fun side project to make a fully local, Jarvis-like AI. However, with the rise of Manus, we saw the opportunity to redirected some tasks to make yet another alternative.
Unlike Manus, AgenticSeek prioritizes independence from external systems, giving you more control, privacy and avoid api cost.
**Q: How is it better than manus ?**
**Q: Who is behind the project ?**
It's not but we prioritizes local execution and privacy over cloud based approach. Its a fun, accessible alternative!
The project was created by me, along with two friends who serve as maintainers and contributors from the open-source community on GitHub. Were just a group of passionate individuals, not a startup or affiliated with any organization.
Any AgenticSeek account on X other than my personal account (https://x.com/Martin993886460) is an impersonation.
## Contribute
Were looking for developers to improve AgenticSeek! Check out open issues or discussion.
## Authors:
> [Fosowl](https://github.com/Fosowl)
> [steveh8758](https://github.com/steveh8758)
[Contribution guide](./docs/CONTRIBUTING.md)
## Sponsors:
Want to level up AgenticSeek capabilities with features like flight search, trip planning, or snagging the best shopping deals? Consider crafting a custom tool with SerpApi to unlock more Jarvis-like capabilities. With SerpApi, you can turbocharge your agent for specialized tasks while staying in full control.
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
See [Contributing.md](./docs/CONTRIBUTING.md) to learn how to integrate custom tools!
### **Patron sponsor**:
- [tatra-labs](https://github.com/tatra-labs)
## Maintainers:
> [Fosowl](https://github.com/Fosowl) | Paris Time
> [antoineVIVIES](https://github.com/antoineVIVIES) | Taipei Time
## Special Thanks:
> [tcsenpai](https://github.com/tcsenpai) and [plitc](https://github.com/plitc) For helping with backend dockerization
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
+684
View File
@@ -0,0 +1,684 @@
# AgenticSeek:私有、本地的 Manus 替代方案
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
*一个**100%本地运行的 Manus AI 替代品**,支持语音的 AI 助手,可自主浏览网页、编写代码、规划任务,所有数据仅保存在你的设备上。专为本地推理模型设计,完全在你的硬件上运行,确保隐私无忧,无需云端依赖。*
[![访问 AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
### 为什么选择 AgenticSeek
* 🔒 完全本地 & 私有 —— 所有内容都在你的电脑上运行,无云端、无数据共享。你的文件、对话和搜索都保持私密。
* 🌐 智能网页浏览 —— AgenticSeek 可自主浏览互联网:搜索、阅读、提取信息、填写网页表单,全程免手动。
* 💻 自动化编程助手 —— 需要代码?它能编写、调试并运行 Python、C、Go、Java 等程序,无需监督。
* 🧠 智能代理选择 —— 你提问,它自动判断最合适的代理来完成任务。就像有一支专家团队随时待命。
* 📋 规划并执行复杂任务 —— 从旅行规划到复杂项目,可将大任务拆分为步骤,调用多个 AI 代理协作完成。
* 🎙️ 语音支持 —— 干净、快速、未来感的语音与语音转文本功能,让你像科幻电影中的 AI 一样与它对话。(开发中)
### **演示**
> *你能搜索 agenticSeek 项目,了解需要哪些技能,然后打开 CV_candidates.zip 并告诉我哪些最匹配该项目吗?*
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
免责声明:本演示及出现的所有文件(如 CV_candidates.zip)均为虚构。我们不是公司,只寻求开源贡献者而非候选人。
> 🛠⚠️ **项目正在积极开发中**
> 🙏 本项目起初只是一个副业,没有路线图也没有资金支持。它意外地登上了 GitHub Trending。非常感谢大家的贡献、反馈与耐心。
## 前置条件
开始前,请确保已安装以下软件:
* **Git:** 用于克隆仓库。[下载 Git](https://git-scm.com/downloads)
* **Python 3.10.x:** 强烈推荐使用 Python 3.10.x 版本。使用其他版本可能导致依赖错误。[下载 Python 3.10](https://www.python.org/downloads/release/python-3100/)(选择 3.10.x 版本)。
* **Docker Engine & Docker Compose:** 用于运行捆绑服务如 SearxNG。
* 安装 Docker Desktop(包含 Docker Compose V2):[Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* 或者在 Linux 上分别安装 Docker Engine 和 Docker Compose[Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/)(确保安装 Compose V2,例如 `sudo apt-get install docker-compose-plugin`)。
### 1. **克隆仓库并设置**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2. 修改 .env 文件内容
```sh
SEARXNG_BASE_URL="http://searxng:8080" # 如果在主机上运行 CLI 模式,使用 http://127.0.0.1:8080
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
根据需要更新 `.env` 文件:
- **SEARXNG_BASE_URL**: 除非在主机上运行 CLI 模式,否则保持不变。
- **REDIS_BASE_URL**: 保持不变
- **WORK_DIR**: 本地工作目录路径。AgenticSeek 可读取和操作这些文件。
- **OLLAMA_PORT**: Ollama 服务端口号。
- **LM_STUDIO_PORT**: LM Studio 服务端口号。
- **CUSTOM_ADDITIONAL_LLM_PORT**: 任何额外自定义 LLM 服务的端口。
**API 密钥对于选择本地运行 LLM 的用户完全可选,这也是本项目的主要目的。如果硬件足够,请留空。**
### 3. **启动 Docker**
确保 Docker 已安装并在系统上运行。可以使用以下命令启动 Docker:
- **Linux/macOS:**
打开终端运行:
```sh
sudo systemctl start docker
```
或者如果已安装,从应用程序菜单启动 Docker Desktop。
- **Windows:**
从开始菜单启动 Docker Desktop。
可以通过执行以下命令验证 Docker 是否运行:
```sh
docker info
```
如果看到 Docker 安装信息,则表示运行正常。
请参阅下面的[本地提供商列表](#本地提供商列表)了解摘要。
下一步:[本地运行 AgenticSeek](#启动服务并运行)
*如果遇到问题,请参阅[故障排除](#故障排除)部分。*
*如果硬件无法本地运行 LLM,请参阅[使用 API 运行设置](#使用-api-运行设置)。*
*有关详细 `config.ini` 说明,请参阅[配置部分](#配置)。*
---
## 在您的机器上本地运行 LLM 的设置
**硬件要求:**
要本地运行 LLM,您需要足够的硬件。至少需要能够运行 Magistral、Qwen 或 Deepseek 14B 的 GPU。有关详细的模型/性能建议,请参阅 FAQ。
**设置您的本地提供商**
启动您的本地提供商,例如使用 ollama:
```sh
ollama serve
```
请参阅下面的本地支持提供商列表。
**更新 config.ini**
更改 config.ini 文件,将 provider_name 设置为支持的提供商,provider_model 设置为您的提供商支持的 LLM。我们推荐推理模型,如 *Magistral* 或 *Deepseek*。
有关所需硬件,请参阅 README 末尾的 **FAQ**。
```sh
[MAIN]
is_local = True # 无论您是本地运行还是使用远程提供商。
provider_name = ollama # 或 lm-studio、openai 等。
provider_model = deepseek-r1:14b # 选择适合您硬件的模型
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # 您的 AI 名称
recover_last_session = True # 是否恢复上一个会话
save_session = True # 是否记住当前会话
speak = False # 文本转语音
listen = False # 语音转文本,仅限 CLI,实验性
jarvis_personality = False # 是否使用更"Jarvis"风格的性格(实验性)
languages = en zh # 语言列表,文本转语音将默认使用列表中的第一种语言
[BROWSER]
headless_browser = True # 除非在主机上使用 CLI,否则保持不变。
stealth_mode = True # 使用不可检测的 selenium 减少浏览器检测
```
**警告**
- `config.ini` 文件格式不支持注释。
不要直接复制粘贴示例配置,因为注释会导致错误。相反,手动修改 `config.ini` 文件,使用您所需的设置,排除任何注释。
- 如果使用 LM-studio 运行 LLM,请*不要*将 provider_name 设置为 `openai`。将其设置为 `lm-studio`。
- 某些提供商(例如:lm-studio)要求您在 IP 前加上 `http://`。例如 `http://127.0.0.1:1234`
**本地提供商列表**
| 提供商 | 本地? | 描述 |
|-----------|--------|-----------------------------------------------------------|
| ollama | 是 | 使用 ollama 作为 LLM 提供商轻松本地运行 LLM |
| lm-studio | 是 | 使用 LM studio 本地运行 LLM(将 `provider_name` 设置为 `lm-studio`|
| openai | 是 | 使用 openai 兼容 API(例如:llama.cpp 服务器) |
下一步:[启动服务并运行 AgenticSeek](#启动服务并运行)
*如果遇到问题,请参阅[故障排除](#故障排除)部分。*
*如果硬件无法本地运行 LLM,请参阅[使用 API 运行设置](#使用-api-运行设置)。*
*有关详细 `config.ini` 说明,请参阅[配置部分](#配置)。*
## 使用 API 运行设置
此设置使用外部、基于云的 LLM 提供商。您需要从所选服务获取 API 密钥。
**1. 选择 API 提供商并获取 API 密钥:**
请参阅下面的[API 提供商列表](#api-提供商列表)。访问他们的网站注册并获取 API 密钥。
**2. 将您的 API 密钥设置为环境变量:**
* **Linux/macOS:**
打开终端并使用 `export` 命令。最好将其添加到 shell 的配置文件中(例如 `~/.bashrc`、`~/.zshrc`)以保持持久性。
```sh
export PROVIDER_API_KEY="your_api_key_here"
# 将 PROVIDER_API_KEY 替换为特定的变量名,例如 OPENAI_API_KEY、GOOGLE_API_KEY
```
TogetherAI 示例:
```sh
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **命令提示符(当前会话临时):**
```cmd
set PROVIDER_API_KEY=your_api_key_here
```
* **PowerShell(当前会话临时):**
```powershell
$env:PROVIDER_API_KEY="your_api_key_here"
```
* **永久性:** 在 Windows 搜索栏中搜索"环境变量",点击"编辑系统环境变量",然后点击"环境变量..."按钮。添加一个新的用户变量,使用适当的名称(例如 `OPENAI_API_KEY`)和您的密钥作为值。
*(有关更多详细信息,请参阅 FAQ:[如何设置 API 密钥?](#如何设置-api-密钥))。*
**3. 更新 `config.ini`**
```ini
[MAIN]
is_local = False
provider_name = openai # 或 google、deepseek、togetherAI、huggingface
provider_model = gpt-3.5-turbo # 或 gemini-1.5-flash、deepseek-chat、mistralai/Mixtral-8x7B-Instruct-v0.1 等。
provider_server_address = # 当 is_local = False 时,对于大多数 API 通常被忽略或可以留空
# ... 其他设置 ...
```
*警告:* 确保 `config.ini` 值中没有尾随空格。
**API 提供商列表**
| 提供商 | `provider_name` | 本地? | 描述 | API 密钥链接(示例) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | 否 | 通过 OpenAI 的 API 使用 ChatGPT 模型。 | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | 否 | 通过 Google AI Studio 使用 Google Gemini 模型。 | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | 否 | 通过他们的 API 使用 Deepseek 模型。 | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | 否 | 使用 Hugging Face Inference API 中的模型。 | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | 否 | 通过 TogetherAI API 使用各种开源模型。| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
| OpenRouter | `openrouter` | No | 通过 OpenRouter 使用各种开源模型| [https://openrouter.ai/](https://openrouter.ai/) |
| MiniMax | `minimax` | 否 | 使用 MiniMax 模型(如 MiniMax-M2.7、MiniMax-M2.5)。 | [platform.minimax.io](https://platform.minimax.io/user-center/basic-information) |
*注意:*
* 我们不建议将 `gpt-4o` 或其他 OpenAI 模型用于复杂的网页浏览和任务规划,因为当前的提示优化针对 Deepseek 等模型。
* 编码/bash 任务可能会遇到 Gemini 的问题,因为它可能不严格遵循针对 Deepseek 优化的格式化提示。
* 当 `is_local = False` 时,`config.ini` 中的 `provider_server_address` 通常不使用,因为 API 端点通常在相应提供商的库中硬编码。
下一步:[启动服务并运行 AgenticSeek](#启动服务并运行)
*如果遇到问题,请参阅**已知问题**部分*
*有关详细配置文件说明,请参阅**配置**部分。*
---
## 启动服务并运行
默认情况下,AgenticSeek 完全在 Docker 中运行。
**选项 1:** 在 Docker 中运行,使用 Web 界面:
启动所需服务。这将启动 docker-compose.yml 中的所有服务,包括:
- searxng
- redissearxng 所需)
- frontend
- backend(如果使用 Web 界面时使用 `full`
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Windows
```
**警告:** 此步骤将下载并加载所有 Docker 镜像,可能需要长达 30 分钟。启动服务后,请等待后端服务完全运行(您应该在日志中看到 **backend: "GET /health HTTP/1.1" 200 OK**)后再发送任何消息。首次运行时,后端服务可能需要 5 分钟才能启动。
转到 `http://localhost:3000/`,您应该会看到 Web 界面。
*服务启动故障排除:* 如果这些脚本失败,请确保 Docker Engine 正在运行并且 Docker ComposeV2`docker compose`)已正确安装。检查终端输出中的错误消息。请参阅 [FAQ:帮助!运行 AgenticSeek 或其脚本时出现错误。](#faq-故障排除)
**选项 2:** CLI 模式:
要使用 CLI 界面运行,您必须在主机上安装软件包:
```sh
./install.sh
./install.bat # windows
```
然后您必须将 `config.ini` 中的 SEARXNG_BASE_URL 更改为:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
启动所需服务。这将启动 docker-compose.yml 中的一些服务,包括:
- searxng
- redissearxng 所需)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Windows
```
运行:uv run: `uv run python -m ensurepip` 以确保 uv 已启用 pip。
使用 CLI`uv run cli.py`
---
## 使用方法
确保服务已通过 `./start_services.sh full` 启动并运行,然后转到 `localhost:3000` 使用 Web 界面。
您也可以通过设置 `listen = True` 来使用语音转文本。仅限 CLI 模式。
要退出,只需说/输入 `goodbye`。
以下是一些使用示例:
> *用 python 写一个贪吃蛇游戏!*
> *搜索法国雷恩的最佳咖啡馆,并将三家及其地址保存到 rennes_cafes.txt。*
> *写一个 Go 程序计算阶乘,保存为 factorial.go 到你的工作区*
> *在 summer_pictures 文件夹中查找所有 JPG 文件,用今天日期重命名,并将重命名文件列表保存到 photos_list.txt*
> *在线搜索 2024 年热门科幻电影,挑选三部今晚观看,保存到 movie_night.txt。*
> *搜索 2025 年最新 AI 新闻文章,选三篇,写 Python 脚本抓取标题和摘要,脚本保存为 news_scraper.py,摘要保存到 ai_news.txt/home/projects*
> *周五,搜索免费股票价格 API,用 supersuper7434567@gmail.com 注册,然后写 Python 脚本每日获取特斯拉股价,结果保存到 stock_prices.csv*
*请注意,表单填写功能仍为实验性,可能失败。*
输入查询后,AgenticSeek 将分配最佳代理执行任务。
由于这是早期原型,代理路由系统可能无法总是根据您的查询分配正确的代理。
因此,您应该非常明确地表达您想要什么以及 AI 可能如何进行,例如如果您希望它进行网页搜索,不要说:
`你知道哪些适合独自旅行的国家吗?`
而应说:
`进行网页搜索,找出最适合独自旅行的国家`
---
## **在自己的服务器上运行 LLM 的设置**
如果您有功能强大的计算机或可以使用的服务器,但想从笔记本电脑使用它,您可以选择使用我们的自定义 llm 服务器在远程服务器上运行 LLM。
在将运行 AI 模型的"服务器"上,获取 IP 地址
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # 本地 IP
curl https://ipinfo.io/ip # 公共 IP
```
注意:对于 Windows 或 macOS,分别使用 ipconfig 或 ifconfig 查找 IP 地址。
克隆仓库并进入 `server/` 文件夹。
```sh
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
安装服务器特定要求:
```sh
pip3 install -r requirements.txt
```
运行服务器脚本。
```sh
python3 app.py --provider ollama --port 3333
```
您可以选择使用 `ollama` 和 `llamacpp` 作为 LLM 服务。
现在在您的个人计算机上:
更改 `config.ini` 文件,将 `provider_name` 设置为 `server``provider_model` 设置为 `deepseek-r1:xxb`。
将 `provider_server_address` 设置为将运行模型的机器的 IP 地址。
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
下一步:[启动服务并运行 AgenticSeek](#启动服务并运行)
---
## 语音转文本
警告:目前语音转文本仅适用于 CLI 模式。
请注意,目前语音转文本仅适用于英语。
语音转文本功能默认禁用。要启用它,请在 config.ini 文件中将 listen 选项设置为 True
```
listen = True
```
启用后,语音转文本功能会监听触发关键字,即代理的名称,然后开始处理您的输入。您可以通过更新 *config.ini* 文件中的 `agent_name` 值来自定义代理的名称:
```
agent_name = Friday
```
为了获得最佳识别效果,我们建议使用常见的英文名称,如 "John" 或 "Emma" 作为代理名称。
一旦您看到转录开始出现,请大声说出代理的名称以唤醒它(例如,"Friday")。
清晰地说出您的查询。
用确认短语结束您的请求,以指示系统继续。确认短语的示例包括:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## 配置
配置示例:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Ollama 示例;LM-Studio 使用 http://127.0.0.1:1234
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # TTS 和潜在路由的语言列表。
[BROWSER]
headless_browser = False
stealth_mode = False
```
**`config.ini` 设置说明**
* **`[MAIN]` 部分:**
* `is_local`: 如果使用本地 LLM 提供商(Ollama、LM-Studio、本地 OpenAI 兼容服务器)或自托管服务器选项,则为 `True`。如果使用基于云的 API(OpenAI、Google 等),则为 `False`。
* `provider_name`: 指定 LLM 提供商。
* 本地选项:`ollama`、`lm-studio`、`openai`(用于本地 OpenAI 兼容服务器)、`server`(用于自托管服务器设置)。
* API 选项:`openai`、`google`、`deepseek`、`huggingface`、`togetherAI`。
* `provider_model`: 所选提供商的特定模型名称或 ID(例如,Ollama 的 `deepseekcoder:6.7b`OpenAI API 的 `gpt-3.5-turbo`TogetherAI 的 `mistralai/Mixtral-8x7B-Instruct-v0.1`)。
* `provider_server_address`: 您的 LLM 提供商的地址。
* 对于本地提供商:例如,Ollama 的 `http://127.0.0.1:11434`LM-Studio 的 `http://127.0.0.1:1234`。
* 对于 `server` 提供商类型:您的自托管 LLM 服务器的地址(例如 `http://your_server_ip:3333`)。
* 对于云 API`is_local = False`):这通常被忽略或可以留空,因为 API 端点通常由客户端库处理。
* `agent_name`: AI 助手的名称(例如 Friday)。如果启用,用作语音转文本的触发词。
* `recover_last_session`: `True` 尝试恢复上一个会话的状态,`False` 重新开始。
* `save_session`: `True` 保存当前会话的状态以供潜在恢复,`False` 否则。
* `speak`: `True` 启用文本转语音语音输出,`False` 禁用。
* `listen`: `True` 启用语音转文本语音输入(仅限 CLI 模式),`False` 禁用。
* `work_dir`: **关键:** AgenticSeek 将读取/写入文件的目录。**确保此路径在您的系统上有效且可访问。**
* `jarvis_personality`: `True` 使用更"Jarvis-like"的系统提示(实验性),`False` 使用标准提示。
* `languages`: 逗号分隔的语言列表(例如 `en, zh, fr`)。用于 TTS 语音选择(默认为第一个),并可以协助 LLM 路由器。为避免路由器效率低下,避免使用过多或非常相似的语言。
* **`[BROWSER]` 部分:**
* `headless_browser`: `True` 在没有可见窗口的情况下运行自动化浏览器(推荐用于 Web 界面或非交互式使用)。`False` 显示浏览器窗口(对于 CLI 模式或调试有用)。
* `stealth_mode`: `True` 启用使浏览器自动化更难检测的措施。可能需要手动安装浏览器扩展,如 anticaptcha。
本节总结了支持的 LLM 提供商类型。在 `config.ini` 中配置它们。
**本地提供商(在您自己的硬件上运行):**
| config.ini 中的提供商名称 | `is_local` | 描述 | 设置部分 |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | 使用 Ollama 轻松提供本地 LLM。 | [在您的机器上本地运行 LLM 的设置](#在您的机器上本地运行-llm-的设置) |
| `lm-studio` | `True` | 使用 LM-Studio 提供本地 LLM。 | [在您的机器上本地运行 LLM 的设置](#在您的机器上本地运行-llm-的设置) |
| `openai`(用于本地服务器) | `True` | 连接到暴露 OpenAI 兼容 API 的本地服务器(例如,llama.cpp)。 | [在您的机器上本地运行 LLM 的设置](#在您的机器上本地运行-llm-的设置) |
| `server` | `False` | 连接到在另一台机器上运行的 AgenticSeek 自托管 LLM 服务器。 | [在自己的服务器上运行 LLM 的设置](#在自己的服务器上运行-llm-的设置) |
**API 提供商(基于云):**
| config.ini 中的提供商名称 | `is_local` | 描述 | 设置部分 |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | 使用 OpenAI 的官方 API(例如,GPT-3.5、GPT-4)。 | [使用 API 运行设置](#使用-api-运行设置) |
| `google` | `False` | 通过 API 使用 Google 的 Gemini 模型。 | [使用 API 运行设置](#使用-api-运行设置) |
| `deepseek` | `False` | 使用 Deepseek 的官方 API。 | [使用 API 运行设置](#使用-api-运行设置) |
| `huggingface` | `False` | 使用 Hugging Face Inference API。 | [使用 API 运行设置](#使用-api-运行设置) |
| `togetherAI` | `False` | 使用 TogetherAI 的 API 获取各种开放模型。 | [使用 API 运行设置](#使用-api-运行设置) |
---
## 故障排除
如果遇到问题,本节提供指导。
# 已知问题
## ChromeDriver 问题
**错误示例:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### 根本原因
ChromeDriver 版本不兼容发生在:
1. 您安装的 ChromeDriver 版本与 Chrome 浏览器版本不匹配
2. 在 Docker 环境中,`undetected_chromedriver` 可能会下载自己的 ChromeDriver 版本,绕过挂载的二进制文件
### 解决步骤
#### 1. 检查您的 Chrome 版本
打开 Google Chrome → `设置 > 关于 Chrome` 查找您的版本(例如,"版本 134.0.6998.88"
#### 2. 下载匹配的 ChromeDriver
**对于 Chrome 115 及更新版本:** 使用 [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/)
- 访问 Chrome for Testing 可用性仪表板
- 找到您的 Chrome 版本或最接近的可用匹配
- 为您的操作系统下载 ChromeDriverDocker 环境使用 Linux64
**对于旧版 Chrome** 使用 [旧版 ChromeDriver 下载](https://chromedriver.chromium.org/downloads)
![从 Chrome for Testing 下载 ChromeDriver](./media/chromedriver_readme.png)
#### 3. 安装 ChromeDriver(选择一种方法)
**方法 A:项目根目录(Docker 推荐)**
```bash
# 将下载的 chromedriver 二进制文件放在项目根目录
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # 在 Linux/macOS 上使其可执行
```
**方法 B:系统 PATH**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows:将 chromedriver.exe 放在 PATH 中的文件夹中
```
#### 4. 验证安装
```bash
# 测试 ChromeDriver 版本
./chromedriver --version
# 或者在 PATH 中:
chromedriver --version
```
### Docker 特定说明
⚠️ **Docker 用户重要:**
- Docker 卷挂载方法可能不适用于隐身模式(`undetected_chromedriver`
- **解决方案:** 将 ChromeDriver 放在项目根目录中作为 `./chromedriver`
- 应用程序将自动检测并使用此二进制文件
- 您应该在日志中看到:`"Using ChromeDriver from project root: ./chromedriver"`
### 故障排除提示
1. **仍然遇到版本不匹配?**
- 验证 ChromeDriver 是否可执行:`ls -la ./chromedriver`
- 检查 ChromeDriver 版本:`./chromedriver --version`
- 确保它与您的 Chrome 浏览器版本匹配
2. **Docker 容器问题?**
- 检查后端日志:`docker logs backend`
- 查找消息:`"Using ChromeDriver from project root"`
- 如果未找到,请验证文件是否存在且可执行
3. **Chrome for Testing 版本**
- 尽可能使用完全匹配的版本
- 对于版本 134.0.6998.88,使用 ChromeDriver 134.0.6998.165(最接近的可用版本)
- 主要版本号必须匹配(134 = 134)
### 版本兼容性矩阵
| Chrome 版本 | ChromeDriver 版本 | 状态 |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ 可用 |
| 133.0.6943.x | 133.0.6943.141 | ✅ 可用 |
| 132.0.6834.x | 132.0.6834.159 | ✅ 可用 |
*有关最新兼容性,请查看 [Chrome for Testing 仪表板](https://googlechromelabs.github.io/chrome-for-testing/)*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
如果您的浏览器和 chromedriver 版本不匹配,会发生这种情况。
您需要导航到下载最新版本:
https://developer.chrome.com/docs/chromedriver/downloads
如果您使用 Chrome 版本 115 或更新版本,请转到:
https://googlechromelabs.github.io/chrome-for-testing/
并下载与您的操作系统匹配的 chromedriver 版本。
![alt text](./media/chromedriver_readme.png)
如果此部分不完整,请提出问题。
## 连接适配器问题
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'`(注意:端口可能不同)
```
* **原因:** `config.ini` 中 `lm-studio`(或其他类似的本地 OpenAI 兼容服务器)的 `provider_server_address` 缺少 `http://` 前缀或指向错误的端口。
* **解决方案:**
* 确保地址包含 `http://`。LM-Studio 通常默认为 `http://127.0.0.1:1234`。
* 正确的 `config.ini``provider_server_address = http://127.0.0.1:1234`(或您的实际 LM-Studio 服务器端口)。
## SearxNG 基本 URL 未提供
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
如果您使用错误的 searxng 基本 URL 运行 CLI 模式,可能会出现这种情况。
SEARXNG_BASE_URL 应根据您是在 Docker 中运行还是在主机上运行而有所不同:
**在主机上运行**`SEARXNG_BASE_URL="http://localhost:8080"`
**完全在 Docker 中运行(Web 界面)**`SEARXNG_BASE_URL="http://searxng:8080"`
## FAQ
**问:我需要什么硬件?**
| 模型大小 | GPU | 评论 |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB 显存 | ⚠️ 不推荐。性能差,频繁出现幻觉,规划代理可能会失败。 |
| 14B | 12 GB VRAM(例如 RTX 3060) | ✅ 可用于简单任务。可能在网页浏览和规划任务方面有困难。 |
| 32B | 24+ GB VRAM(例如 RTX 4090) | 🚀 大多数任务成功,可能仍然在任务规划方面有困难 |
| 70B+ | 48+ GB 显存 | 💪 优秀。推荐用于高级用例。 |
**问:我遇到错误该怎么办?**
确保本地正在运行(`ollama serve`),您的 `config.ini` 与您的提供商匹配,并且依赖项已安装。如果都不起作用,请随时提出问题。
**问:它真的可以 100% 本地运行吗?**
是的,使用 Ollama、lm-studio 或服务器提供商,所有语音转文本、LLM 和文本转语音模型都在本地运行。非本地选项(OpenAI 或其他 API)是可选的。
**问:当我有 Manus 时,为什么应该使用 AgenticSeek**
与 Manus 不同,AgenticSeek 优先考虑独立于外部系统,给您更多控制、隐私和避免 API 成本。
**问:谁是这个项目的幕后推手?**
这个项目是由我创建的,还有两个朋友作为维护者和 GitHub 上开源社区的贡献者。我们只是一群充满热情的个人,不是初创公司,也不隶属于任何组织。
X 上除了我的个人账户(https://x.com/Martin993886460)之外的任何 AgenticSeek 账户都是冒充的。
## 贡献
我们正在寻找开发人员来改进 AgenticSeek!查看开放的问题或讨论。
[贡献指南](./docs/CONTRIBUTING.md)
## 赞助商:
想要通过航班搜索、旅行规划或抢购最佳购物优惠等功能来提升 AgenticSeek 的能力?考虑使用 SerpApi 制作自定义工具,以解锁更多 Jarvis 般的功能。使用 SerpApi,您可以为专业任务加速您的代理,同时保持完全控制。
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
查看 [Contributing.md](./docs/CONTRIBUTING.md) 了解如何集成自定义工具!
### **赞助商**
- [tatra-labs](https://github.com/tatra-labs)
## 维护者:
> [Fosowl](https://github.com/Fosowl) | 巴黎时间
> [antoineVIVIES](https://github.com/antoineVIVIES) | 台北时间
## 特别感谢:
> [tcsenpai](https://github.com/tcsenpai) 和 [plitc](https://github.com/plitc) 协助后端 Docker 化
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
+683
View File
@@ -0,0 +1,683 @@
# AgenticSeek:私有、本地的 Manus 替代方案
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
*一個**100%本地運行的 Manus AI 替代品**,支援語音的 AI 助手,可自主瀏覽網頁、編寫代碼、規劃任務,所有數據僅保存在你的設備上。專為本地推理模型設計,完全在你的硬件上運行,確保隱私無憂,無需雲端依賴。*
[![訪問 AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
### 為什麼選擇 AgenticSeek
* 🔒 完全本地 & 私有 —— 所有內容都在你的電腦上運行,無雲端、無數據共享。你的文件、對話和搜索都保持私密。
* 🌐 智能網頁瀏覽 —— AgenticSeek 可自主瀏覽互聯網:搜索、閱讀、提取信息、填寫網頁表單,全程免手動。
* 💻 自動化編程助手 —— 需要代碼?它能編寫、調試並運行 Python、C、Go、Java 等程序,無需監督。
* 🧠 智能代理選擇 —— 你提問,它自動判斷最合適的代理來完成任務。就像有一支專家團隊隨時待命。
* 📋 規劃並執行複雜任務 —— 從旅行規劃到複雜項目,可將大任務拆分為步驟,調用多個 AI 代理協作完成。
* 🎙️ 語音支持 —— 乾淨、快速、未來感的語音與語音轉文本功能,讓你像科幻電影中的 AI 一樣與它對話。(開發中)
### **演示**
> *你能搜索 agenticSeek 項目,了解需要哪些技能,然後打開 CV_candidates.zip 並告訴我哪些最匹配該項目嗎?*
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
免責聲明:本演示及出現的所有文件(如 CV_candidates.zip)均為虛構。我們不是公司,只尋求開源貢獻者而非候選人。
> 🛠⚠️ **項目正在積極開發中**
> 🙏 本項目起初只是一個副業,沒有路線圖也沒有資金支持。它意外地登上了 GitHub Trending。非常感謝大家的貢獻、反饋與耐心。
## 前置條件
開始前,請確保已安裝以下軟件:
* **Git:** 用於克隆倉庫。[下載 Git](https://git-scm.com/downloads)
* **Python 3.10.x:** 強烈推薦使用 Python 3.10.x 版本。使用其他版本可能導致依賴錯誤。[下載 Python 3.10](https://www.python.org/downloads/release/python-3100/)(選擇 3.10.x 版本)。
* **Docker Engine & Docker Compose:** 用於運行捆綁服務如 SearxNG。
* 安裝 Docker Desktop(包含 Docker Compose V2):[Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* 或者在 Linux 上分別安裝 Docker Engine 和 Docker Compose[Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/)(確保安裝 Compose V2,例如 `sudo apt-get install docker-compose-plugin`)。
### 1. **克隆倉庫並設置**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2. 修改 .env 文件內容
```sh
SEARXNG_BASE_URL="http://searxng:8080" # 如果在主機上運行 CLI 模式,使用 http://127.0.0.1:8080
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
根據需要更新 `.env` 文件:
- **SEARXNG_BASE_URL**: 除非在主機上運行 CLI 模式,否則保持不變。
- **REDIS_BASE_URL**: 保持不變
- **WORK_DIR**: 本地工作目錄路徑。AgenticSeek 可讀取和操作這些文件。
- **OLLAMA_PORT**: Ollama 服務端口號。
- **LM_STUDIO_PORT**: LM Studio 服務端口號。
- **CUSTOM_ADDITIONAL_LLM_PORT**: 任何額外自定義 LLM 服務的端口。
**API 密鑰對於選擇本地運行 LLM 的用戶完全可選,這也是本項目的主要目的。如果硬件足夠,請留空。**
### 3. **啟動 Docker**
確保 Docker 已安裝並在系統上運行。可以使用以下命令啟動 Docker:
- **Linux/macOS:**
打開終端運行:
```sh
sudo systemctl start docker
```
或者如果已安裝,從應用程序菜單啟動 Docker Desktop。
- **Windows:**
從開始菜單啟動 Docker Desktop。
可以通過執行以下命令驗證 Docker 是否運行:
```sh
docker info
```
如果看到 Docker 安裝信息,則表示運行正常。
請參閱下面的[本地提供商列表](#本地提供商列表)了解摘要。
下一步:[本地運行 AgenticSeek](#啟動服務並運行)
*如果遇到問題,請參閱[故障排除](#故障排除)部分。*
*如果硬件無法本地運行 LLM,請參閱[使用 API 運行設置](#使用-api-運行設置)。*
*有關詳細 `config.ini` 說明,請參閱[配置部分](#配置)。*
---
## 在您的機器上本地運行 LLM 的設置
**硬件要求:**
要本地運行 LLM,您需要足夠的硬件。至少需要能夠運行 Magistral、Qwen 或 Deepseek 14B 的 GPU。有關詳細的模型/性能建議,請參閱 FAQ。
**設置您的本地提供商**
啟動您的本地提供商,例如使用 ollama:
```sh
ollama serve
```
請參閱下面的本地支持提供商列表。
**更新 config.ini**
更改 config.ini 文件,將 provider_name 設置為支持的提供商,provider_model 設置為您的提供商支持的 LLM。我們推薦推理模型,如 *Magistral* 或 *Deepseek*。
有關所需硬件,請參閱 README 末尾的 **FAQ**。
```sh
[MAIN]
is_local = True # 無論您是本地運行還是使用遠程提供商。
provider_name = ollama # 或 lm-studio、openai 等。
provider_model = deepseek-r1:14b # 選擇適合您硬件的模型
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # 您的 AI 名稱
recover_last_session = True # 是否恢復上一個會話
save_session = True # 是否記住當前會話
speak = False # 文本轉語音
listen = False # 語音轉文本,僅限 CLI,實驗性
jarvis_personality = False # 是否使用更"Jarvis"風格的性格(實驗性)
languages = en zh # 語言列表,文本轉語音將默認使用列表中的第一種語言
[BROWSER]
headless_browser = True # 除非在主機上使用 CLI,否則保持不變。
stealth_mode = True # 使用不可檢測的 selenium 減少瀏覽器檢測
```
**警告**
- `config.ini` 文件格式不支持註釋。
不要直接複製粘貼示例配置,因為註釋會導致錯誤。相反,手動修改 `config.ini` 文件,使用您所需的設置,排除任何註釋。
- 如果使用 LM-studio 運行 LLM,請*不要*將 provider_name 設置為 `openai`。將其設置為 `lm-studio`。
- 某些提供商(例如:lm-studio)要求您在 IP 前加上 `http://`。例如 `http://127.0.0.1:1234`
**本地提供商列表**
| 提供商 | 本地? | 描述 |
|-----------|--------|-----------------------------------------------------------|
| ollama | 是 | 使用 ollama 作為 LLM 提供商輕鬆本地運行 LLM |
| lm-studio | 是 | 使用 LM studio 本地運行 LLM(將 `provider_name` 設置為 `lm-studio`|
| openai | 是 | 使用 openai 兼容 API(例如:llama.cpp 服務器) |
下一步:[啟動服務並運行 AgenticSeek](#啟動服務並運行)
*如果遇到問題,請參閱[故障排除](#故障排除)部分。*
*如果硬件無法本地運行 LLM,請參閱[使用 API 運行設置](#使用-api-運行設置)。*
*有關詳細 `config.ini` 說明,請參閱[配置部分](#配置)。*
## 使用 API 運行設置
此設置使用外部、基於雲的 LLM 提供商。您需要從所選服務獲取 API 密鑰。
**1. 選擇 API 提供商並獲取 API 密鑰:**
請參閱下面的[API 提供商列表](#api-提供商列表)。訪問他們的網站註冊並獲取 API 密鑰。
**2. 將您的 API 密鑰設置為環境變量:**
* **Linux/macOS:**
打開終端並使用 `export` 命令。最好將其添加到 shell 的配置文件中(例如 `~/.bashrc`、`~/.zshrc`)以保持持久性。
```sh
export PROVIDER_API_KEY="your_api_key_here"
# 將 PROVIDER_API_KEY 替換為特定的變量名,例如 OPENAI_API_KEY、GOOGLE_API_KEY
```
TogetherAI 示例:
```sh
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **命令提示符(當前會話臨時):**
```cmd
set PROVIDER_API_KEY=your_api_key_here
```
* **PowerShell(當前會話臨時):**
```powershell
$env:PROVIDER_API_KEY="your_api_key_here"
```
* **永久性:** 在 Windows 搜索欄中搜索"環境變量",點擊"編輯系統環境變量",然後點擊"環境變量..."按鈕。添加一個新的用戶變量,使用適當的名稱(例如 `OPENAI_API_KEY`)和您的密鑰作為值。
*(有關更多詳細信息,請參閱 FAQ:[如何設置 API 密鑰?](#如何設置-api-密鑰))。*
**3. 更新 `config.ini`**
```ini
[MAIN]
is_local = False
provider_name = openai # 或 google、deepseek、togetherAI、huggingface
provider_model = gpt-3.5-turbo # 或 gemini-1.5-flash、deepseek-chat、mistralai/Mixtral-8x7B-Instruct-v0.1 等。
provider_server_address = # 當 is_local = False 時,對於大多數 API 通常被忽略或可以留空
# ... 其他設置 ...
```
*警告:* 確保 `config.ini` 值中沒有尾隨空格。
**API 提供商列表**
| 提供商 | `provider_name` | 本地? | 描述 | API 密鑰鏈接(示例) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | 否 | 通過 OpenAI 的 API 使用 ChatGPT 模型。 | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | 否 | 通過 Google AI Studio 使用 Google Gemini 模型。 | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | 否 | 通過他們的 API 使用 Deepseek 模型。 | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | 否 | 使用 Hugging Face Inference API 中的模型。 | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | 否 | 通過 TogetherAI API 使用各種開源模型。| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
| OpenRouter | `openrouter` | No | 通过 OpenRouter 使用各种开源模型| [https://openrouter.ai/](https://openrouter.ai/) |
*注意:*
* 我們不建議將 `gpt-4o` 或其他 OpenAI 模型用於複雜的網頁瀏覽和任務規劃,因為當前的提示優化針對 Deepseek 等模型。
* 編碼/bash 任務可能會遇到 Gemini 的問題,因為它可能不嚴格遵循針對 Deepseek 優化的格式化提示。
* 當 `is_local = False` 時,`config.ini` 中的 `provider_server_address` 通常不使用,因為 API 端點通常在相應提供商的庫中硬編碼。
下一步:[啟動服務並運行 AgenticSeek](#啟動服務並運行)
*如果遇到問題,請參閱**已知問題**部分*
*有關詳細配置文件說明,請參閱**配置**部分。*
---
## 啟動服務並運行
默認情況下,AgenticSeek 完全在 Docker 中運行。
**選項 1:** 在 Docker 中運行,使用 Web 界面:
啟動所需服務。這將啟動 docker-compose.yml 中的所有服務,包括:
- searxng
- redissearxng 所需)
- frontend
- backend(如果使用 Web 界面時使用 `full`
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Windows
```
**警告:** 此步驟將下載並加載所有 Docker 鏡像,可能需要長達 30 分鐘。啟動服務後,請等待後端服務完全運行(您應該在日誌中看到 **backend: "GET /health HTTP/1.1" 200 OK**)後再發送任何消息。首次運行時,後端服務可能需要 5 分鐘才能啟動。
轉到 `http://localhost:3000/`,您應該會看到 Web 界面。
*服務啟動故障排除:* 如果這些腳本失敗,請確保 Docker Engine 正在運行並且 Docker ComposeV2`docker compose`)已正確安裝。檢查終端輸出中的錯誤消息。請參閱 [FAQ:幫助!運行 AgenticSeek 或其腳本時出現錯誤。](#faq-故障排除)
**選項 2:** CLI 模式:
要使用 CLI 界面運行,您必須在主機上安裝軟件包:
```sh
./install.sh
./install.bat # windows
```
然後您必須將 `config.ini` 中的 SEARXNG_BASE_URL 更改為:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
啟動所需服務。這將啟動 docker-compose.yml 中的一些服務,包括:
- searxng
- redissearxng 所需)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Windows
```
運行:uv run: `uv run python -m ensurepip` 以確保 uv 已啟用 pip。
使用 CLI`uv run cli.py`
---
## 使用方法
確保服務已通過 `./start_services.sh full` 啟動並運行,然後轉到 `localhost:3000` 使用 Web 界面。
您也可以通過設置 `listen = True` 來使用語音轉文本。僅限 CLI 模式。
要退出,只需說/輸入 `goodbye`。
以下是一些使用示例:
> *用 python 寫一個貪吃蛇遊戲!*
> *搜索法國雷恩的最佳咖啡館,並將三家及其地址保存到 rennes_cafes.txt。*
> *寫一個 Go 程序計算階乘,保存為 factorial.go 到你的工作區*
> *在 summer_pictures 文件夾中查找所有 JPG 文件,用今天日期重命名,並將重命名文件列表保存到 photos_list.txt*
> *在線搜索 2024 年熱門科幻電影,挑選三部今晚觀看,保存到 movie_night.txt。*
> *搜索 2025 年最新 AI 新聞文章,選三篇,寫 Python 腳本抓取標題和摘要,腳本保存為 news_scraper.py,摘要保存到 ai_news.txt/home/projects*
> *周五,搜索免費股票價格 API,用 supersuper7434567@gmail.com 註冊,然後寫 Python 腳本每日獲取特斯拉股價,結果保存到 stock_prices.csv*
*請注意,表單填寫功能仍為實驗性,可能失敗。*
輸入查詢後,AgenticSeek 將分配最佳代理執行任務。
由於這是早期原型,代理路由系統可能無法總是根據您的查詢分配正確的代理。
因此,您應該非常明確地表達您想要什麼以及 AI 可能如何進行,例如如果您希望它進行網頁搜索,不要說:
`你知道哪些適合獨自旅行的國家嗎?`
而應說:
`進行網頁搜索,找出最適合獨自旅行的國家`
---
## **在自己的服務器上運行 LLM 的設置**
如果您有功能強大的計算機或可以使用的服務器,但想從筆記本電腦使用它,您可以選擇使用我們的自定義 llm 服務器在遠程服務器上運行 LLM。
在將運行 AI 模型的"服務器"上,獲取 IP 地址
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # 本地 IP
curl https://ipinfo.io/ip # 公共 IP
```
注意:對於 Windows 或 macOS,分別使用 ipconfig 或 ifconfig 查找 IP 地址。
克隆倉庫並進入 `server/` 文件夾。
```sh
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
安裝服務器特定要求:
```sh
pip3 install -r requirements.txt
```
運行服務器腳本。
```sh
python3 app.py --provider ollama --port 3333
```
您可以選擇使用 `ollama` 和 `llamacpp` 作為 LLM 服務。
現在在您的個人計算機上:
更改 `config.ini` 文件,將 `provider_name` 設置為 `server``provider_model` 設置為 `deepseek-r1:xxb`。
將 `provider_server_address` 設置為將運行模型的機器的 IP 地址。
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
下一步:[啟動服務並運行 AgenticSeek](#啟動服務並運行)
---
## 語音轉文本
警告:目前語音轉文本僅適用於 CLI 模式。
請注意,目前語音轉文本僅適用於英語。
語音轉文本功能默認禁用。要啟用它,請在 config.ini 文件中將 listen 選項設置為 True
```
listen = True
```
啟用後,語音轉文本功能會監聽觸發關鍵字,即代理的名稱,然後開始處理您的輸入。您可以通過更新 *config.ini* 文件中的 `agent_name` 值來自定義代理的名稱:
```
agent_name = Friday
```
為了獲得最佳識別效果,我們建議使用常見的英文名稱,如 "John" 或 "Emma" 作為代理名稱。
一旦您看到轉錄開始出現,請大聲說出代理的名稱以喚醒它(例如,"Friday")。
清晰地說出您的查詢。
用確認短語結束您的請求,以指示系統繼續。確認短語的示例包括:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## 配置
配置示例:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Ollama 示例;LM-Studio 使用 http://127.0.0.1:1234
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # TTS 和潛在路由的語言列表。
[BROWSER]
headless_browser = False
stealth_mode = False
```
**`config.ini` 設置說明**
* **`[MAIN]` 部分:**
* `is_local`: 如果使用本地 LLM 提供商(Ollama、LM-Studio、本地 OpenAI 兼容服務器)或自託管服務器選項,則為 `True`。如果使用基於雲的 API(OpenAI、Google 等),則為 `False`。
* `provider_name`: 指定 LLM 提供商。
* 本地選項:`ollama`、`lm-studio`、`openai`(用於本地 OpenAI 兼容服務器)、`server`(用於自託管服務器設置)。
* API 選項:`openai`、`google`、`deepseek`、`huggingface`、`togetherAI`。
* `provider_model`: 所選提供商的特定模型名稱或 ID(例如,Ollama 的 `deepseekcoder:6.7b`OpenAI API 的 `gpt-3.5-turbo`TogetherAI 的 `mistralai/Mixtral-8x7B-Instruct-v0.1`)。
* `provider_server_address`: 您的 LLM 提供商的地址。
* 對於本地提供商:例如,Ollama 的 `http://127.0.0.1:11434`LM-Studio 的 `http://127.0.0.1:1234`。
* 對於 `server` 提供商類型:您的自託管 LLM 服務器的地址(例如 `http://your_server_ip:3333`)。
* 對於雲 API`is_local = False`):這通常被忽略或可以留空,因為 API 端點通常由客戶端庫處理。
* `agent_name`: AI 助手的名稱(例如 Friday)。如果啟用,用作語音轉文本的觸發詞。
* `recover_last_session`: `True` 嘗試恢復上一個會話的狀態,`False` 重新開始。
* `save_session`: `True` 保存當前會話的狀態以供潛在恢復,`False` 否則。
* `speak`: `True` 啟用文本轉語音語音輸出,`False` 禁用。
* `listen`: `True` 啟用語音轉文本語音輸入(僅限 CLI 模式),`False` 禁用。
* `work_dir`: **關鍵:** AgenticSeek 將讀取/寫入文件的目錄。**確保此路徑在您的系統上有效且可訪問。**
* `jarvis_personality`: `True` 使用更"Jarvis-like"的系統提示(實驗性),`False` 使用標準提示。
* `languages`: 逗號分隔的語言列表(例如 `en, zh, fr`)。用於 TTS 語音選擇(默認為第一個),並可以協助 LLM 路由器。為避免路由器效率低下,避免使用過多或非常相似的語言。
* **`[BROWSER]` 部分:**
* `headless_browser`: `True` 在沒有可見窗口的情況下運行自動化瀏覽器(推薦用於 Web 界面或非交互式使用)。`False` 顯示瀏覽器窗口(對於 CLI 模式或調試有用)。
* `stealth_mode`: `True` 啟用使瀏覽器自動化更難檢測的措施。可能需要手動安裝瀏覽器擴展,如 anticaptcha。
本節總結了支持的 LLM 提供商類型。在 `config.ini` 中配置它們。
**本地提供商(在您自己的硬件上運行):**
| config.ini 中的提供商名稱 | `is_local` | 描述 | 設置部分 |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | 使用 Ollama 輕鬆提供本地 LLM。 | [在您的機器上本地運行 LLM 的設置](#在您的機器上本地運行-llm-的設置) |
| `lm-studio` | `True` | 使用 LM-Studio 提供本地 LLM。 | [在您的機器上本地運行 LLM 的設置](#在您的機器上本地運行-llm-的設置) |
| `openai`(用於本地服務器) | `True` | 連接到暴露 OpenAI 兼容 API 的本地服務器(例如,llama.cpp)。 | [在您的機器上本地運行 LLM 的設置](#在您的機器上本地運行-llm-的設置) |
| `server` | `False` | 連接到在另一台機器上運行的 AgenticSeek 自託管 LLM 服務器。 | [在自己的服務器上運行 LLM 的設置](#在自己的服務器上運行-llm-的設置) |
**API 提供商(基於雲):**
| config.ini 中的提供商名稱 | `is_local` | 描述 | 設置部分 |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | 使用 OpenAI 的官方 API(例如,GPT-3.5、GPT-4)。 | [使用 API 運行設置](#使用-api-運行設置) |
| `google` | `False` | 通過 API 使用 Google 的 Gemini 模型。 | [使用 API 運行設置](#使用-api-運行設置) |
| `deepseek` | `False` | 使用 Deepseek 的官方 API。 | [使用 API 運行設置](#使用-api-運行設置) |
| `huggingface` | `False` | 使用 Hugging Face Inference API。 | [使用 API 運行設置](#使用-api-運行設置) |
| `togetherAI` | `False` | 使用 TogetherAI 的 API 獲取各種開放模型。 | [使用 API 運行設置](#使用-api-運行設置) |
---
## 故障排除
如果遇到問題,本節提供指導。
# 已知問題
## ChromeDriver 問題
**錯誤示例:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### 根本原因
ChromeDriver 版本不兼容發生在:
1. 您安裝的 ChromeDriver 版本與 Chrome 瀏覽器版本不匹配
2. 在 Docker 環境中,`undetected_chromedriver` 可能會下載自己的 ChromeDriver 版本,繞過掛載的二進制文件
### 解決步驟
#### 1. 檢查您的 Chrome 版本
打開 Google Chrome → `設置 > 關於 Chrome` 查找您的版本(例如,"版本 134.0.6998.88"
#### 2. 下載匹配的 ChromeDriver
**對於 Chrome 115 及更新版本:** 使用 [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/)
- 訪問 Chrome for Testing 可用性儀表板
- 找到您的 Chrome 版本或最接近的可用匹配
- 為您的操作系統下載 ChromeDriverDocker 環境使用 Linux64
**對於舊版 Chrome** 使用 [舊版 ChromeDriver 下載](https://chromedriver.chromium.org/downloads)
![從 Chrome for Testing 下載 ChromeDriver](./media/chromedriver_readme.png)
#### 3. 安裝 ChromeDriver(選擇一種方法)
**方法 A:項目根目錄(Docker 推薦)**
```bash
# 將下載的 chromedriver 二進制文件放在項目根目錄
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # 在 Linux/macOS 上使其可執行
```
**方法 B:系統 PATH**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows:將 chromedriver.exe 放在 PATH 中的文件夾中
```
#### 4. 驗證安裝
```bash
# 測試 ChromeDriver 版本
./chromedriver --version
# 或者在 PATH 中:
chromedriver --version
```
### Docker 特定說明
⚠️ **Docker 用戶重要:**
- Docker 卷掛載方法可能不適用於隱身模式(`undetected_chromedriver`
- **解決方案:** 將 ChromeDriver 放在項目根目錄中作為 `./chromedriver`
- 應用程序將自動檢測並使用此二進制文件
- 您應該在日誌中看到:`"Using ChromeDriver from project root: ./chromedriver"`
### 故障排除提示
1. **仍然遇到版本不匹配?**
- 驗證 ChromeDriver 是否可執行:`ls -la ./chromedriver`
- 檢查 ChromeDriver 版本:`./chromedriver --version`
- 確保它與您的 Chrome 瀏覽器版本匹配
2. **Docker 容器問題?**
- 檢查後端日誌:`docker logs backend`
- 查找消息:`"Using ChromeDriver from project root"`
- 如果未找到,請驗證文件是否存在且可執行
3. **Chrome for Testing 版本**
- 盡可能使用完全匹配的版本
- 對於版本 134.0.6998.88,使用 ChromeDriver 134.0.6998.165(最接近的可用版本)
- 主要版本號必須匹配(134 = 134)
### 版本兼容性矩陣
| Chrome 版本 | ChromeDriver 版本 | 狀態 |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ 可用 |
| 133.0.6943.x | 133.0.6943.141 | ✅ 可用 |
| 132.0.6834.x | 132.0.6834.159 | ✅ 可用 |
*有關最新兼容性,請查看 [Chrome for Testing 儀表板](https://googlechromelabs.github.io/chrome-for-testing/)*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
如果您的瀏覽器和 chromedriver 版本不匹配,會發生這種情況。
您需要導航到下載最新版本:
https://developer.chrome.com/docs/chromedriver/downloads
如果您使用 Chrome 版本 115 或更新版本,請轉到:
https://googlechromelabs.github.io/chrome-for-testing/
並下載與您的操作系統匹配的 chromedriver 版本。
![alt text](./media/chromedriver_readme.png)
如果此部分不完整,請提出問題。
## 連接適配器問題
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'`(注意:端口可能不同)
```
* **原因:** `config.ini` 中 `lm-studio`(或其他類似的本地 OpenAI 兼容服務器)的 `provider_server_address` 缺少 `http://` 前綴或指向錯誤的端口。
* **解決方案:**
* 確保地址包含 `http://`。LM-Studio 通常默認為 `http://127.0.0.1:1234`。
* 正確的 `config.ini``provider_server_address = http://127.0.0.1:1234`(或您的實際 LM-Studio 服務器端口)。
## SearxNG 基本 URL 未提供
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
如果您使用錯誤的 searxng 基本 URL 運行 CLI 模式,可能會出現這種情況。
SEARXNG_BASE_URL 應根據您是在 Docker 中運行還是在主機上運行而有所不同:
**在主機上運行**`SEARXNG_BASE_URL="http://localhost:8080"`
**完全在 Docker 中運行(Web 界面)**`SEARXNG_BASE_URL="http://searxng:8080"`
## FAQ
**問:我需要什麼硬件?**
| 模型大小 | GPU | 評論 |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB 顯存 | ⚠️ 不推薦。性能差,頻繁出現幻覺,規劃代理可能會失敗。 |
| 14B | 12 GB VRAM(例如 RTX 3060) | ✅ 可用於簡單任務。可能在網頁瀏覽和規劃任務方面有困難。 |
| 32B | 24+ GB VRAM(例如 RTX 4090) | 🚀 大多數任務成功,可能仍然在任務規劃方面有困難 |
| 70B+ | 48+ GB 顯存 | 💪 優秀。推薦用於高級用例。 |
**問:我遇到錯誤該怎麼辦?**
確保本地正在運行(`ollama serve`),您的 `config.ini` 與您的提供商匹配,並且依賴項已安裝。如果都不起作用,請隨時提出問題。
**問:它真的可以 100% 本地運行嗎?**
是的,使用 Ollama、lm-studio 或服務器提供商,所有語音轉文本、LLM 和文本轉語音模型都在本地運行。非本地選項(OpenAI 或其他 API)是可選的。
**問:當我有 Manus 時,為什麼應該使用 AgenticSeek**
與 Manus 不同,AgenticSeek 優先考慮獨立於外部系統,給您更多控制、隱私和避免 API 成本。
**問:誰是這個項目的幕後推手?**
這個項目是由我創建的,還有兩個朋友作為維護者和 GitHub 上開源社區的貢獻者。我們只是一群充滿熱情的個人,不是初創公司,也不隸屬於任何組織。
X 上除了我的個人賬戶(https://x.com/Martin993886460)之外的任何 AgenticSeek 賬戶都是冒充的。
## 貢獻
我們正在尋找開發人員來改進 AgenticSeek!查看開放的問題或討論。
[貢獻指南](./docs/CONTRIBUTING.md)
## 贊助商:
想要通過航班搜索、旅行規劃或搶購最佳購物優惠等功能來提升 AgenticSeek 的能力?考慮使用 SerpApi 製作自定義工具,以解鎖更多 Jarvis 般的功能。使用 SerpApi,您可以為專業任務加速您的代理,同時保持完全控制。
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
查看 [Contributing.md](./docs/CONTRIBUTING.md) 了解如何集成自定義工具!
### **贊助商**
- [tatra-labs](https://github.com/tatra-labs)
## 維護者:
> [Fosowl](https://github.com/Fosowl) | 巴黎時間
> [antoineVIVIES](https://github.com/antoineVIVIES) | 台北時間
## 特別感謝:
> [tcsenpai](https://github.com/tcsenpai) 和 [plitc](https://github.com/plitc) 協助後端 Docker 化
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
+682
View File
@@ -0,0 +1,682 @@
# AgenticSeek: Una Alternativa Privada y Local a Manus
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
*Un asistente de IA con capacidad de voz que es una **alternativa 100% local a Manus AI**, navega autónomamente por la web, escribe código y planifica tareas manteniendo todos los datos en tu dispositivo. Diseñado para modelos de razonamiento local, funciona completamente en tu hardware, garantizando privacidad total y cero dependencia de la nube.*
[![Visitar AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
### ¿Por qué AgenticSeek?
* 🔒 Totalmente Local & Privado - Todo funciona en tu máquina, sin nube, sin compartir datos. Tus archivos, conversaciones y búsquedas permanecen privados.
* 🌐 Navegación Web Inteligente - AgenticSeek puede navegar por Internet de forma autónoma: buscar, leer, extraer información, completar formularios web, todo sin manos.
* 💻 Asistente de Programación Autónomo - ¿Necesitas código? Puede escribir, depurar y ejecutar programas en Python, C, Go, Java y más, sin supervisión.
* 🧠 Selección Inteligente de Agentes - Tú pides, él elige automáticamente el mejor agente para la tarea. Como tener un equipo de expertos siempre disponible.
* 📋 Planifica y Ejecuta Tareas Complejas - Desde planificación de viajes hasta proyectos complejos, puede dividir grandes tareas en pasos y completarlos utilizando múltiples agentes de IA.
* 🎙️ Compatibilidad con Voz - Voz limpia, rápida y futurista con reconocimiento de voz, permitiéndote conversar como si fuera tu IA personal de una película de ciencia ficción. (En desarrollo)
### **Demo**
> *¿Puedes buscar el proyecto agenticSeek, aprender qué habilidades se necesitan, luego abrir CV_candidates.zip y decirme cuáles coinciden mejor con el proyecto?*
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
Descargo de responsabilidad: Esta demostración y todos los archivos que aparecen (ej: CV_candidates.zip) son completamente ficticios. No somos una corporación, buscamos colaboradores de código abierto, no candidatos.
> 🛠⚠️ **Trabajo Activo en Progreso**
> 🙏 Este proyecto comenzó como un proyecto paralelo y no tiene hoja de ruta ni financiación. Creció mucho más allá de lo esperado al aparecer en GitHub Trending. Las contribuciones, comentarios y paciencia son profundamente apreciados.
## Prerrequisitos
Antes de comenzar, asegúrate de tener instalado:
* **Git:** Para clonar el repositorio. [Descargar Git](https://git-scm.com/downloads)
* **Python 3.10.x:** Se recomienda encarecidamente Python 3.10.x. Otras versiones pueden causar errores de dependencia. [Descargar Python 3.10](https://www.python.org/downloads/release/python-3100/) (selecciona la versión 3.10.x).
* **Docker Engine & Docker Compose:** Para ejecutar servicios empaquetados como SearxNG.
* Instalar Docker Desktop (incluye Docker Compose V2): [Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* O instalar Docker Engine y Docker Compose por separado en Linux: [Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/) (asegúrate de instalar Compose V2, por ejemplo `sudo apt-get install docker-compose-plugin`).
### 1. **Clonar el repositorio y configurar**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2. Modificar el contenido del archivo .env
```sh
SEARXNG_BASE_URL="http://searxng:8080" # Si ejecutas en modo CLI en el host, usa http://127.0.0.1:8080
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
Actualiza el archivo `.env` según sea necesario:
- **SEARXNG_BASE_URL**: Mantener sin cambios a menos que ejecutes en modo CLI en el host.
- **REDIS_BASE_URL**: Mantener sin cambios
- **WORK_DIR**: Ruta al directorio de trabajo local. AgenticSeek podrá leer e interactuar con estos archivos.
- **OLLAMA_PORT**: Número de puerto para el servicio Ollama.
- **LM_STUDIO_PORT**: Número de puerto para el servicio LM Studio.
- **CUSTOM_ADDITIONAL_LLM_PORT**: Puerto para cualquier servicio LLM adicional personalizado.
**Las claves API son completamente opcionales para quienes optan por ejecutar LLM localmente, que es el objetivo principal de este proyecto. Déjalas en blanco si tienes hardware suficiente.**
### 3. **Iniciar Docker**
Asegúrate de que Docker esté instalado y ejecutándose en tu sistema. Puedes iniciar Docker con los siguientes comandos:
- **Linux/macOS:**
Abre una terminal y ejecuta:
```sh
sudo systemctl start docker
```
O inicia Docker Desktop desde el menú de aplicaciones, si está instalado.
- **Windows:**
Inicia Docker Desktop desde el menú Inicio.
Puedes verificar si Docker se está ejecutando ejecutando:
```sh
docker info
```
Si ves información sobre tu instalación de Docker, está funcionando correctamente.
Consulta la [Lista de proveedores locales](#lista-de-proveedores-locales) a continuación para obtener un resumen.
Siguiente paso: [Ejecutar AgenticSeek localmente](#iniciar-servicios-y-ejecutar)
*Si tienes problemas, consulta la sección [Solución de problemas](#solución-de-problemas).*
*Si tu hardware no puede ejecutar LLM localmente, consulta [Configuración para ejecutar con una API](#configuración-para-ejecutar-con-una-api).*
*Para explicaciones detalladas de `config.ini`, consulta la [sección Configuración](#configuración).*
---
## Configuración para ejecutar LLM localmente en tu máquina
**Requisitos de hardware:**
Para ejecutar LLM localmente, necesitarás hardware suficiente. Como mínimo, se requiere una GPU capaz de ejecutar Magistral, Qwen o Deepseek 14B. Consulta el FAQ para recomendaciones detalladas de modelo/rendimiento.
**Configura tu proveedor local**
Inicia tu proveedor local, por ejemplo con ollama:
```sh
ollama serve
```
Consulta la lista de proveedores locales admitidos a continuación.
**Actualizar config.ini**
Cambia el archivo config.ini para establecer provider_name en un proveedor admitido y provider_model en un LLM admitido por tu proveedor. Recomendamos modelos de razonamiento como *Magistral* o *Deepseek*.
Consulta el **FAQ** al final del README para el hardware necesario.
```sh
[MAIN]
is_local = True # Ya sea que ejecutes localmente o con un proveedor remoto.
provider_name = ollama # o lm-studio, openai, etc.
provider_model = deepseek-r1:14b # elige un modelo compatible con tu hardware
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # el nombre de tu IA
recover_last_session = True # recuperar sesión anterior
save_session = True # recordar sesión actual
speak = False # texto a voz
listen = False # voz a texto, solo para CLI, experimental
jarvis_personality = False # usar personalidad más "Jarvis" (experimental)
languages = en zh # Lista de idiomas, TTS usará el primero de la lista por defecto
[BROWSER]
headless_browser = True # mantener sin cambios a menos que uses CLI en el host.
stealth_mode = True # Usa selenium indetectable para reducir la detección del navegador
```
**Advertencia**:
- El formato del archivo `config.ini` no admite comentarios.
No copies y pegues la configuración de ejemplo directamente, ya que los comentarios causarán errores. En su lugar, modifica manualmente el archivo `config.ini` con tu configuración deseada, sin comentarios.
- *NO* establezcas provider_name como `openai` si estás usando LM-studio para ejecutar LLM. Úsalo como `lm-studio`.
- Algunos proveedores (ej: lm-studio) requieren `http://` antes de la IP. Ejemplo: `http://127.0.0.1:1234`
**Lista de proveedores locales**
| Proveedor | ¿Local? | Descripción |
|-----------|--------|-----------------------------------------------------------|
| ollama | Sí | Ejecuta LLM localmente fácilmente usando ollama |
| lm-studio | Sí | Ejecuta LLM localmente con LM studio (establecer `provider_name` = `lm-studio`)|
| openai | Sí | Usa API compatible con openai (ej: servidor llama.cpp) |
Siguiente paso: [Iniciar servicios y ejecutar AgenticSeek](#iniciar-servicios-y-ejecutar)
*Si tienes problemas, consulta la sección [Solución de problemas](#solución-de-problemas).*
*Si tu hardware no puede ejecutar LLM localmente, consulta [Configuración para ejecutar con una API](#configuración-para-ejecutar-con-una-api).*
*Para explicaciones detalladas de `config.ini`, consulta la [sección Configuración](#configuración).*
## Configuración para ejecutar con una API
Esta configuración utiliza proveedores de LLM externos basados en la nube. Necesitarás obtener claves API del servicio elegido.
**1. Elige un proveedor de API y obtén una clave API:**
Consulta la [Lista de proveedores de API](#lista-de-proveedores-de-api) a continuación. Visita sus sitios web para registrarte y obtener claves API.
**2. Establece tu clave API como variable de entorno:**
* **Linux/macOS:**
Abre una terminal y usa el comando `export`. Es mejor agregarlo al archivo de configuración de tu shell (ej: `~/.bashrc`, `~/.zshrc`) para que sea persistente.
```sh
export PROVIDER_API_KEY="your_api_key_here"
# Reemplaza PROVIDER_API_KEY con el nombre de variable específico, ej: OPENAI_API_KEY, GOOGLE_API_KEY
```
Ejemplo de TogetherAI:
```sh
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **Símbolo del sistema (temporal para la sesión actual):**
```cmd
set PROVIDER_API_KEY=your_api_key_here
```
* **PowerShell (temporal para la sesión actual):**
```powershell
$env:PROVIDER_API_KEY="your_api_key_here"
```
* **Permanente:** Busca "variables de entorno" en la barra de búsqueda de Windows, haz clic en "Editar las variables de entorno del sistema", luego en el botón "Variables de entorno...". Agrega una nueva variable de usuario con el nombre apropiado (ej: `OPENAI_API_KEY`) y tu clave como valor.
*(Para más detalles, consulta el FAQ: [¿Cómo configuro una clave API?](#cómo-configuro-una-clave-api)).*
**3. Actualiza `config.ini`:**
```ini
[MAIN]
is_local = False
provider_name = openai # o google, deepseek, togetherAI, huggingface
provider_model = gpt-3.5-turbo # o gemini-1.5-flash, deepseek-chat, mistralai/Mixtral-8x7B-Instruct-v0.1, etc.
provider_server_address = # Cuando is_local = False, generalmente se ignora o puede dejarse en blanco para la mayoría de las API
# ... otras configuraciones ...
```
*Advertencia:* Asegúrate de que no haya espacios al final de los valores en config.
**Lista de proveedores de API**
| Proveedor | `provider_name` | ¿Local? | Descripción | Enlace de clave API (ejemplo) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | No | Usa modelos ChatGPT a través de la API de OpenAI. | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | No | Usa modelos Google Gemini a través de Google AI Studio. | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | No | Usa modelos Deepseek a través de su API. | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | No | Usa modelos del Hugging Face Inference API. | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | No | Usa varios modelos de código abierto a través de la API de TogetherAI.| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
*Nota:*
* No recomendamos usar `gpt-4o` u otros modelos OpenAI para navegación web compleja y planificación de tareas, ya que la optimización actual de prompts está dirigida a modelos como Deepseek.
* Las tareas de codificación/bash pueden fallar con Gemini, ya que tiende a ignorar nuestro formato de prompt optimizado para Deepseek r1.
* Cuando `is_local = False`, `provider_server_address` en `config.ini` generalmente no se usa, ya que los endpoints de API suelen estar codificados en las bibliotecas del proveedor correspondiente.
Siguiente paso: [Iniciar servicios y ejecutar AgenticSeek](#iniciar-servicios-y-ejecutar)
*Si tienes problemas, consulta la sección **Problemas conocidos***
*Para explicaciones detalladas del archivo de configuración, consulta la **sección Configuración**.*
---
## Iniciar servicios y ejecutar
Por defecto, AgenticSeek se ejecuta completamente en Docker.
**Opción 1:** Ejecutar en Docker con interfaz web:
Inicia los servicios necesarios. Esto iniciará todos los servicios del docker-compose.yml, incluyendo:
- searxng
- redis (requerido para searxng)
- frontend
- backend (si usas `full` para la interfaz web)
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Windows
```
**Advertencia:** Este paso descargará y cargará todas las imágenes de Docker, lo que puede tardar hasta 30 minutos. Después de iniciar los servicios, espera hasta que el servicio backend esté completamente ejecutándose (deberías ver **backend: "GET /health HTTP/1.1" 200 OK** en el registro) antes de enviar cualquier mensaje. En la primera ejecución, el servicio backend puede tardar 5 minutos en iniciarse.
Ve a `http://localhost:3000/` y deberías ver la interfaz web.
*Solución de problemas de inicio de servicios:* Si estos scripts fallan, asegúrate de que Docker Engine esté ejecutándose y que Docker Compose (V2, `docker compose`) esté correctamente instalado. Revisa los mensajes de error en la salida de la terminal. Consulta [FAQ: ¡Ayuda! Obtengo errores al ejecutar AgenticSeek o sus scripts.](#faq-solución-de-problemas)
**Opción 2:** Modo CLI:
Para ejecutar con la interfaz CLI, debes instalar los paquetes en el host:
```sh
./install.sh
./install.bat # windows
```
Luego debes cambiar SEARXNG_BASE_URL en `config.ini` a:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
Inicia los servicios necesarios. Esto iniciará algunos servicios del docker-compose.yml, incluyendo:
- searxng
- redis (requerido para searxng)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Windows
```
Ejecuta: uv run: `uv run python -m ensurepip` para asegurarte de que uv tenga pip habilitado.
Usa CLI: `uv run cli.py`
---
## Uso
Asegúrate de que los servicios estén ejecutándose con `./start_services.sh full` y luego ve a `localhost:3000` para la interfaz web.
También puedes usar voz a texto configurando `listen = True`. Solo para modo CLI.
Para salir, simplemente di/escribe `goodbye`.
Algunos ejemplos de uso:
> *¡Haz un juego de la serpiente en python!*
> *Busca en la web los mejores cafés en Rennes, Francia, y guarda una lista de tres con sus direcciones en rennes_cafes.txt.*
> *Escribe un programa Go para calcular el factorial de un número, guárdalo como factorial.go en tu workspace*
> *Busca en la carpeta summer_pictures todos los archivos JPG, renómbralos con la fecha de hoy y guarda la lista de archivos renombrados en photos_list.txt*
> *Busca en línea películas de ciencia ficción populares de 2024 y elige tres para ver esta noche. Guarda la lista en movie_night.txt.*
> *Busca en la web los últimos artículos de noticias de IA de 2025, selecciona tres y escribe un script Python para extraer títulos y resúmenes. Guarda el script como news_scraper.py y los resúmenes en ai_news.txt en /home/projects*
> *Viernes, busca en la web una API gratuita de precios de acciones, regístrate con supersuper7434567@gmail.com y escribe un script Python para obtener los precios diarios de Tesla usando la API, guardando los resultados en stock_prices.csv*
*Ten en cuenta que el llenado de formularios sigue siendo experimental y puede fallar.*
Después de ingresar tu consulta, AgenticSeek asignará el mejor agente para la tarea.
Como este es un prototipo inicial, el sistema de enrutamiento de agentes puede no asignar siempre el agente correcto a tu consulta.
Por lo tanto, sé muy explícito sobre lo que quieres y cómo la IA podría proceder, por ejemplo, si quieres que realice una búsqueda web, no digas:
`¿Conoces algunos buenos países para viajar solo?`
En su lugar, di:
`Realiza una búsqueda web y descubre cuáles son los mejores países para viajar solo`
---
## **Configuración para ejecutar LLM en tu propio servidor**
Si tienes una computadora potente o un servidor al que puedes acceder, pero quieres usarlo desde tu laptop, puedes optar por ejecutar el LLM en un servidor remoto usando nuestro servidor llm personalizado.
En tu "servidor" que ejecutará el modelo de IA, obtén la dirección IP
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # IP local
curl https://ipinfo.io/ip # IP pública
```
Nota: Para Windows o macOS, usa ipconfig o ifconfig para encontrar la dirección IP.
Clona el repositorio y entra en la carpeta `server/`.
```sh
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
Instala los requisitos específicos del servidor:
```sh
pip3 install -r requirements.txt
```
Ejecuta el script del servidor.
```sh
python3 app.py --provider ollama --port 3333
```
Puedes elegir entre usar `ollama` y `llamacpp` como servicio LLM.
Ahora en tu computadora personal:
Cambia el archivo `config.ini` para establecer `provider_name` como `server` y `provider_model` como `deepseek-r1:xxb`.
Establece `provider_server_address` a la dirección IP de la máquina que ejecutará el modelo.
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
Siguiente paso: [Iniciar servicios y ejecutar AgenticSeek](#iniciar-servicios-y-ejecutar)
---
## Voz a Texto
Advertencia: La voz a texto solo funciona en modo CLI en este momento.
Ten en cuenta que la voz a texto solo funciona en inglés en este momento.
La funcionalidad de voz a texto está deshabilitada por defecto. Para habilitarla, establece listen en True en el archivo config.ini:
```
listen = True
```
Cuando está habilitado, la función de voz a texto escucha una palabra clave de activación, que es el nombre del agente, antes de procesar tu entrada. Puedes personalizar el nombre del agente actualizando el valor `agent_name` en *config.ini*:
```
agent_name = Friday
```
Para un mejor reconocimiento, recomendamos usar un nombre común en inglés como "John" o "Emma" como nombre de agente.
Una vez que veas que comienza a aparecer la transcripción, di el nombre del agente en voz alta para activarlo (ej: "Friday").
Di tu consulta claramente.
Termina tu solicitud con una frase de confirmación para indicar al sistema que proceda. Ejemplos de frases de confirmación incluyen:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## Configuración
Ejemplo de configuración:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Ejemplo de Ollama; LM-Studio usa http://127.0.0.1:1234
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # Lista de idiomas para TTS y enrutamiento potencial.
[BROWSER]
headless_browser = False
stealth_mode = False
```
**Explicación de la configuración de `config.ini`**:
* **Sección `[MAIN]`:**
* `is_local`: `True` si usas proveedores de LLM locales (Ollama, LM-Studio, servidor local compatible con OpenAI) o la opción de servidor autoalojado. `False` si usas API basadas en la nube (OpenAI, Google, etc.).
* `provider_name`: Especifica el proveedor de LLM.
* Opciones locales: `ollama`, `lm-studio`, `openai` (para servidor local compatible con OpenAI), `server` (para configuración de servidor autoalojado).
* Opciones de API: `openai`, `google`, `deepseek`, `huggingface`, `togetherAI`.
* `provider_model`: Nombre o ID específico del modelo del proveedor seleccionado (ej: `deepseekcoder:6.7b` para Ollama, `gpt-3.5-turbo` para API de OpenAI, `mistralai/Mixtral-8x7B-Instruct-v0.1` para TogetherAI).
* `provider_server_address`: La dirección de tu proveedor de LLM.
* Para proveedores locales: ej: `http://127.0.0.1:11434` para Ollama, `http://127.0.0.1:1234` para LM-Studio.
* Para el tipo de proveedor `server`: La dirección de tu servidor LLM autoalojado (ej: `http://your_server_ip:3333`).
* Para API en la nube (`is_local = False`): Esto generalmente se ignora o puede dejarse en blanco, ya que los endpoints de API suelen ser manejados por las bibliotecas del cliente.
* `agent_name`: El nombre del asistente de IA (ej: Friday). Si está habilitado, se utiliza como palabra de activación para voz a texto.
* `recover_last_session`: `True` para intentar recuperar el estado de la sesión anterior, `False` para comenzar de nuevo.
* `save_session`: `True` para guardar el estado de la sesión actual para una posible recuperación, `False` en caso contrario.
* `speak`: `True` para habilitar la salida de voz de texto a voz, `False` para deshabilitar.
* `listen`: `True` para habilitar la entrada de voz de voz a texto (solo modo CLI), `False` para deshabilitar.
* `work_dir`: **Crítico:** El directorio donde AgenticSeek leerá/escribirá archivos. **Asegúrate de que esta ruta sea válida y accesible en tu sistema.**
* `jarvis_personality`: `True` para usar prompts del sistema más al estilo "Jarvis" (experimental), `False` para usar prompts estándar.
* `languages`: Lista de idiomas separados por comas (ej: `en, zh, fr`). Se utiliza para la selección de voz TTS (predeterminado el primero) y puede ayudar al enrutador LLM. Para evitar ineficiencias del enrutador, evita usar demasiados idiomas o idiomas muy similares.
* **Sección `[BROWSER]`:**
* `headless_browser`: `True` para ejecutar el navegador automatizado sin una ventana visible (recomendado para interfaz web o uso no interactivo). `False` para mostrar la ventana del navegador (útil para modo CLI o depuración).
* `stealth_mode`: `True` para habilitar medidas que dificultan la detección de la automatización del navegador. Puede requerir la instalación manual de extensiones del navegador como anticaptcha.
Esta sección resume los tipos de proveedores de LLM admitidos. Configúralos en `config.ini`.
**Proveedores locales (ejecutándose en tu propio hardware):**
| Nombre del proveedor en config.ini | `is_local` | Descripción | Sección de configuración |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | Proporciona LLM localmente fácilmente usando Ollama. | [Configuración para ejecutar LLM localmente en tu máquina](#configuración-para-ejecutar-llm-localmente-en-tu-máquina) |
| `lm-studio` | `True` | Proporciona LLM localmente con LM-Studio. | [Configuración para ejecutar LLM localmente en tu máquina](#configuración-para-ejecutar-llm-localmente-en-tu-máquina) |
| `openai` (para servidor local) | `True` | Conéctate a un servidor local que exponga una API compatible con OpenAI (ej: llama.cpp). | [Configuración para ejecutar LLM localmente en tu máquina](#configuración-para-ejecutar-llm-localmente-en-tu-máquina) |
| `server` | `False` | Conéctate al servidor LLM autoalojado de AgenticSeek que se ejecuta en otra máquina. | [Configuración para ejecutar LLM en tu propio servidor](#configuración-para-ejecutar-llm-en-tu-propio-servidor) |
**Proveedores de API (basados en la nube):**
| Nombre del proveedor en config.ini | `is_local` | Descripción | Sección de configuración |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | Usa la API oficial de OpenAI (ej: GPT-3.5, GPT-4). | [Configuración para ejecutar con una API](#configuración-para-ejecutar-con-una-api) |
| `google` | `False` | Usa modelos Google Gemini a través de API. | [Configuración para ejecutar con una API](#configuración-para-ejecutar-con-una-api) |
| `deepseek` | `False` | Usa la API oficial de Deepseek. | [Configuración para ejecutar con una API](#configuración-para-ejecutar-con-una-api) |
| `huggingface` | `False` | Usa Hugging Face Inference API. | [Configuración para ejecutar con una API](#configuración-para-ejecutar-con-una-api) |
| `togetherAI` | `False` | Usa varios modelos abiertos a través de la API de TogetherAI. | [Configuración para ejecutar con una API](#configuración-para-ejecutar-con-una-api) |
---
## Solución de problemas
Si encuentras problemas, esta sección proporciona orientación.
# Problemas conocidos
## Problemas de ChromeDriver
**Ejemplo de error:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### Causa principal
La incompatibilidad de versión de ChromeDriver ocurre cuando:
1. La versión de ChromeDriver que instalaste no coincide con la versión del navegador Chrome
2. En entornos Docker, `undetected_chromedriver` puede descargar su propia versión de ChromeDriver, evitando los binarios montados
### Pasos de solución
#### 1. Verifica tu versión de Chrome
Abre Google Chrome → `Configuración > Acerca de Chrome` para encontrar tu versión (ej: "Versión 134.0.6998.88")
#### 2. Descarga ChromeDriver coincidente
**Para Chrome 115 y versiones más recientes:** Usa [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/)
- Visita el panel de disponibilidad de Chrome for Testing
- Encuentra tu versión de Chrome o la coincidencia disponible más cercana
- Descarga ChromeDriver para tu sistema operativo (usa Linux64 para entornos Docker)
**Para versiones antiguas de Chrome:** Usa [Descargas heredadas de ChromeDriver](https://chromedriver.chromium.org/downloads)
![Descargar ChromeDriver desde Chrome for Testing](./media/chromedriver_readme.png)
#### 3. Instala ChromeDriver (elige un método)
**Método A: Directorio raíz del proyecto (recomendado para Docker)**
```bash
# Coloca el binario de chromedriver descargado en el directorio raíz del proyecto
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # Hazlo ejecutable en Linux/macOS
```
**Método B: PATH del sistema**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows: Coloca chromedriver.exe en una carpeta en PATH
```
#### 4. Verifica la instalación
```bash
# Prueba la versión de ChromeDriver
./chromedriver --version
# O si está en PATH:
chromedriver --version
```
### Instrucciones específicas de Docker
⚠️ **Importante para usuarios de Docker:**
- El método de montaje de volúmenes de Docker puede no funcionar con el modo sigiloso (`undetected_chromedriver`)
- **Solución:** Coloca ChromeDriver en el directorio raíz del proyecto como `./chromedriver`
- La aplicación lo detectará automáticamente y usará este binario
- Deberías ver en los registros: `"Using ChromeDriver from project root: ./chromedriver"`
### Consejos para solución de problemas
1. **¿Sigues teniendo incompatibilidad de versión?**
- Verifica que ChromeDriver sea ejecutable: `ls -la ./chromedriver`
- Comprueba la versión de ChromeDriver: `./chromedriver --version`
- Asegúrate de que coincida con tu versión del navegador Chrome
2. **¿Problemas con el contenedor Docker?**
- Revisa los registros del backend: `docker logs backend`
- Busca el mensaje: `"Using ChromeDriver from project root"`
- Si no se encuentra, verifica que el archivo exista y sea ejecutable
3. **Versiones de Chrome for Testing**
- Usa una coincidencia exacta cuando sea posible
- Para la versión 134.0.6998.88, usa ChromeDriver 134.0.6998.165 (la versión disponible más cercana)
- El número de versión principal debe coincidir (134 = 134)
### Matriz de compatibilidad de versiones
| Versión de Chrome | Versión de ChromeDriver | Estado |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ Disponible |
| 133.0.6943.x | 133.0.6943.141 | ✅ Disponible |
| 132.0.6834.x | 132.0.6834.159 | ✅ Disponible |
*Para la compatibilidad más reciente, consulta el [Panel de Chrome for Testing](https://googlechromelabs.github.io/chrome-for-testing/)*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
Esto sucede si tu navegador y la versión de chromedriver no coinciden.
Necesitas navegar para descargar la versión más reciente:
https://developer.chrome.com/docs/chromedriver/downloads
Si usas Chrome versión 115 o superior, ve a:
https://googlechromelabs.github.io/chrome-for-testing/
y descarga la versión de chromedriver que coincida con tu sistema operativo.
![alt text](./media/chromedriver_readme.png)
Si esta sección está incompleta, abre un issue.
## Problemas de adaptadores de conexión
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'` (nota: el puerto puede variar)
```
* **Causa:** Falta el prefijo `http://` en `provider_server_address` para `lm-studio` (u otro servidor local compatible con OpenAI similar) en `config.ini`, o apunta al puerto incorrecto.
* **Solución:**
* Asegúrate de que la dirección incluya `http://`. LM-Studio normalmente usa `http://127.0.0.1:1234` por defecto.
* `config.ini` correcto: `provider_server_address = http://127.0.0.1:1234` (o tu puerto real del servidor LM-Studio).
## URL base de SearxNG no proporcionada
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
Esto puede ocurrir si ejecutas el modo CLI con la URL base de searxng incorrecta.
SEARXNG_BASE_URL debe diferir según si ejecutas en Docker o en el host:
**Ejecutando en el host:** `SEARXNG_BASE_URL="http://localhost:8080"`
**Ejecutando completamente en Docker (interfaz web):** `SEARXNG_BASE_URL="http://searxng:8080"`
## FAQ
**P: ¿Qué hardware necesito?**
| Tamaño del modelo | GPU | Comentarios |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB VRAM | ⚠️ No recomendado. Rendimiento pobre, alucinaciones frecuentes, los agentes de planificación pueden fallar. |
| 14B | 12 GB VRAM (ej: RTX 3060) | ✅ Utilizable para tareas simples. Puede tener dificultades con la navegación web y la planificación de tareas. |
| 32B | 24+ GB VRAM (ej: RTX 4090) | 🚀 Éxito en la mayoría de las tareas, aún puede tener dificultades con la planificación de tareas |
| 70B+ | 48+ GB VRAM | 💪 Excelente. Recomendado para casos de uso avanzados. |
**P: ¿Qué hago si encuentro errores?**
Asegúrate de que lo local esté ejecutándose (`ollama serve`), que tu `config.ini` coincida con tu proveedor y que las dependencias estén instaladas. Si nada funciona, no dudes en abrir un issue.
**P: ¿Realmente puede ejecutarse 100% localmente?**
Sí, con proveedores Ollama, lm-studio o server, todos los modelos de voz a texto, LLM y texto a voz se ejecutan localmente. Las opciones no locales (OpenAI u otras API) son opcionales.
**P: ¿Por qué debería usar AgenticSeek cuando tengo Manus?**
A diferencia de Manus, AgenticSeek prioriza la independencia de los sistemas externos, dándote más control, privacidad y evitando costos de API.
**P: ¿Quién está detrás de este proyecto?**
Este proyecto fue creado por mí, con dos amigos como mantenedores y contribuyentes de la comunidad de código abierto en GitHub. Solo somos individuos apasionados, no una startup, ni estamos afiliados a ninguna organización.
Cualquier cuenta de AgenticSeek en X además de mi cuenta personal (https://x.com/Martin993886460) es impostora.
## Contribuir
¡Buscamos desarrolladores para mejorar AgenticSeek! Revisa los issues abiertos o discusiones.
[Guía de contribución](./docs/CONTRIBUTING.md)
## Patrocinadores:
¿Quieres mejorar las capacidades de AgenticSeek con funciones como búsqueda de vuelos, planificación de viajes o obtención de las mejores ofertas de compras? Considera usar SerpApi para crear herramientas personalizadas que desbloqueen más funcionalidades al estilo Jarvis. Con SerpApi, puedes acelerar tu agente para tareas profesionales mientras mantienes el control total.
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
¡Consulta [Contributing.md](./docs/CONTRIBUTING.md) para aprender cómo integrar herramientas personalizadas!
### **Patrocinadores**:
- [tatra-labs](https://github.com/tatra-labs)
## Mantenedores:
> [Fosowl](https://github.com/Fosowl) | Hora de París
> [antoineVIVIES](https://github.com/antoineVIVIES) | Hora de Taipei
## Agradecimientos especiales:
> [tcsenpai](https://github.com/tcsenpai) y [plitc](https://github.com/plitc) por ayudar con la dockerización del backend
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
+682
View File
@@ -0,0 +1,682 @@
# AgenticSeek : Une Alternative Privée et Locale à Manus
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
*Un assistant IA avec reconnaissance vocale qui est une **alternative 100% locale à Manus AI**, navigue de manière autonome sur le web, écrit du code et planifie des tâches tout en gardant toutes les données sur votre appareil. Conçu pour des modèles de raisonnement locaux, il fonctionne entièrement sur votre matériel, garantissant une confidentialité totale et zéro dépendance au cloud.*
[![Visiter AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
### Pourquoi choisir AgenticSeek ?
* 🔒 Totalement Local & Privé - Tout fonctionne sur votre machine, sans cloud, sans partage de données. Vos fichiers, conversations et recherches restent privés.
* 🌐 Navigation Web Intelligente - AgenticSeek peut naviguer sur Internet de manière autonome : rechercher, lire, extraire des informations, remplir des formulaires web, le tout sans intervention manuelle.
* 💻 Assistant de Programmation Autonome - Besoin de code ? Il peut écrire, déboguer et exécuter des programmes en Python, C, Go, Java et plus encore, sans supervision.
* 🧠 Sélection Intelligente d'Agents - Vous demandez, il choisit automatiquement le meilleur agent pour la tâche. Comme avoir une équipe d'experts toujours disponible.
* 📋 Planifie et Exécute des Tâches Complexes - De la planification de voyage aux projets complexes, il peut décomposer de grandes tâches en étapes et les compléter en utilisant plusieurs agents IA.
* 🎙️ Prise en Charge Vocale - Voix claire, rapide et futuriste avec reconnaissance vocale, vous permettant de converser comme avec votre IA personnelle de film de science-fiction. (En développement)
### **Démo**
> *Peux-tu rechercher le projet agenticSeek, apprendre quelles compétences sont nécessaires, puis ouvrir CV_candidates.zip et me dire lesquels correspondent le mieux au projet ?*
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
Avertissement : Cette démonstration et tous les fichiers qui apparaissent (ex: CV_candidates.zip) sont entièrement fictifs. Nous ne sommes pas une entreprise, nous recherchons des contributeurs open source, pas des candidats.
> 🛠⚠️ **Travail Actif en Cours**
> 🙏 Ce projet a commencé comme un projet parallèle et n'a ni feuille de route ni financement. Il a grandi bien au-delà des attentes en apparaissant dans GitHub Trending. Les contributions, commentaires et de la patience sont profondément appréciés.
## Prérequis
Avant de commencer, assurez-vous d'avoir installé :
* **Git:** Pour cloner le dépôt. [Télécharger Git](https://git-scm.com/downloads)
* **Python 3.10.x:** Python 3.10.x est fortement recommandé. D'autres versions peuvent causer des erreurs de dépendance. [Télécharger Python 3.10](https://www.python.org/downloads/release/python-3100/) (sélectionnez la version 3.10.x).
* **Docker Engine & Docker Compose:** Pour exécuter des services empaquetés comme SearxNG.
* Installer Docker Desktop (inclut Docker Compose V2): [Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* Ou installer Docker Engine et Docker Compose séparément sur Linux: [Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/) (assurez-vous d'installer Compose V2, par exemple `sudo apt-get install docker-compose-plugin`).
### 1. **Cloner le dépôt et configurer**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2. Modifier le contenu du fichier .env
```sh
SEARXNG_BASE_URL="http://searxng:8080" # Si vous exécutez en mode CLI sur l'hôte, utilisez http://127.0.0.1:8080
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
Mettez à jour le fichier `.env` selon vos besoins :
- **SEARXNG_BASE_URL**: Gardez inchangé sauf si vous exécutez en mode CLI sur l'hôte.
- **REDIS_BASE_URL**: Gardez inchangé
- **WORK_DIR**: Chemin vers le répertoire de travail local. AgenticSeek pourra lire et interagir avec ces fichiers.
- **OLLAMA_PORT**: Numéro de port pour le service Ollama.
- **LM_STUDIO_PORT**: Numéro de port pour le service LM Studio.
- **CUSTOM_ADDITIONAL_LLM_PORT**: Port pour tout service LLM personnalisé supplémentaire.
**Les clés API sont complètement optionnelles pour ceux qui choisissent d'exécuter LLM localement, ce qui est l'objectif principal de ce projet. Laissez-les vides si vous avez du matériel suffisant.**
### 3. **Démarrer Docker**
Assurez-vous que Docker est installé et fonctionne sur votre système. Vous pouvez démarrer Docker avec les commandes suivantes :
- **Linux/macOS:**
Ouvrez un terminal et exécutez :
```sh
sudo systemctl start docker
```
Ou démarrez Docker Desktop depuis le menu des applications, s'il est installé.
- **Windows:**
Démarrez Docker Desktop depuis le menu Démarrer.
Vous pouvez vérifier si Docker fonctionne en exécutant :
```sh
docker info
```
Si vous voyez des informations sur votre installation Docker, cela fonctionne correctement.
Consultez la [Liste des fournisseurs locaux](#liste-des-fournisseurs-locaux) ci-dessous pour un résumé.
Prochaine étape: [Exécuter AgenticSeek localement](#démarrer-les-services-et-exécuter)
*Si vous rencontrez des problèmes, consultez la section [Dépannage](#dépannage).*
*Si votre matériel ne peut pas exécuter LLM localement, consultez [Configuration pour exécuter avec une API](#configuration-pour-exécuter-avec-une-api).*
*Pour des explications détaillées de `config.ini`, consultez la [section Configuration](#configuration).*
---
## Configuration pour exécuter LLM localement sur votre machine
**Exigences matérielles:**
Pour exécuter LLM localement, vous aurez besoin de matériel suffisant. Au minimum, une GPU capable d'exécuter Magistral, Qwen ou Deepseek 14B est requise. Consultez la FAQ pour des recommandations détaillées de modèle/performance.
**Configurez votre fournisseur local**
Démarrez votre fournisseur local, par exemple avec ollama:
```sh
ollama serve
```
Consultez la liste des fournisseurs locaux pris en charge ci-dessous.
**Mettre à jour config.ini**
Changez le fichier config.ini pour définir provider_name sur un fournisseur pris en charge et provider_model sur un LLM pris en charge par votre fournisseur. Nous recommandons des modèles de raisonnement comme *Magistral* ou *Deepseek*.
Consultez la **FAQ** à la fin du README pour le matériel nécessaire.
```sh
[MAIN]
is_local = True # Que vous exécutiez localement ou avec un fournisseur distant.
provider_name = ollama # ou lm-studio, openai, etc.
provider_model = deepseek-r1:14b # choisissez un modèle compatible avec votre matériel
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # le nom de votre IA
recover_last_session = True # récupérer la session précédente
save_session = True # mémoriser la session actuelle
speak = False # texte vers parole
listen = False # parole vers texte, uniquement pour CLI, expérimental
jarvis_personality = False # utiliser une personnalité plus "Jarvis" (expérimental)
languages = en zh # Liste des langues, TTS utilisera la première de la liste par défaut
[BROWSER]
headless_browser = True # garder inchangé sauf si vous utilisez CLI sur l'hôte.
stealth_mode = True # Utilise selenium indétectable pour réduire la détection du navigateur
```
**Avertissement**:
- Le format du fichier `config.ini` ne prend pas en charge les commentaires.
Ne copiez et collez pas directement la configuration d'exemple, car les commentaires causeront des erreurs. Modifiez plutôt manuellement le fichier `config.ini` avec votre configuration souhaitée, sans commentaires.
- *NE* définissez PAS provider_name sur `openai` si vous utilisez LM-studio pour exécuter LLM. Utilisez `lm-studio`.
- Certains fournisseurs (ex: lm-studio) nécessitent `http://` avant l'IP. Exemple: `http://127.0.0.1:1234`
**Liste des fournisseurs locaux**
| Fournisseur | Local ? | Description |
|-----------|--------|-----------------------------------------------------------|
| ollama | Oui | Exécute LLM localement facilement en utilisant ollama |
| lm-studio | Oui | Exécute LLM localement avec LM studio (définir `provider_name` = `lm-studio`)|
| openai | Oui | Utilise une API compatible avec openai (ex: serveur llama.cpp) |
Prochaine étape: [Démarrer les services et exécuter AgenticSeek](#démarrer-les-services-et-exécuter)
*Si vous rencontrez des problèmes, consultez la section [Dépannage](#dépannage).*
*Si votre matériel ne peut pas exécuter LLM localement, consultez [Configuration pour exécuter avec une API](#configuration-pour-exécuter-avec-une-api).*
*Pour des explications détaillées de `config.ini`, consultez la [section Configuration](#configuration).*
## Configuration pour exécuter avec une API
Cette configuration utilise des fournisseurs de LLM externes basés sur le cloud. Vous devrez obtenir des clés API du service choisi.
**1. Choisissez un fournisseur d'API et obtenez une clé API:**
Consultez la [Liste des fournisseurs d'API](#liste-des-fournisseurs-dapi) ci-dessous. Visitez leurs sites web pour vous inscrire et obtenir des clés API.
**2. Définissez votre clé API comme variable d'environnement:**
* **Linux/macOS:**
Ouvrez un terminal et utilisez la commande `export`. Il est préférable de l'ajouter au fichier de configuration de votre shell (ex: `~/.bashrc`, `~/.zshrc`) pour qu'elle soit persistante.
```sh
export PROVIDER_API_KEY="your_api_key_here"
# Remplacez PROVIDER_API_KEY par le nom de variable spécifique, ex: OPENAI_API_KEY, GOOGLE_API_KEY
```
Exemple TogetherAI:
```sh
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **Invite de commandes (temporaire pour la session actuelle):**
```cmd
set PROVIDER_API_KEY=your_api_key_here
```
* **PowerShell (temporaire pour la session actuelle):**
```powershell
$env:PROVIDER_API_KEY="your_api_key_here"
```
* **Permanent:** Recherchez "variables d'environnement" dans la barre de recherche Windows, cliquez sur "Modifier les variables d'environnement système", puis sur le bouton "Variables d'environnement...". Ajoutez une nouvelle variable utilisateur avec le nom approprié (ex: `OPENAI_API_KEY`) et votre clé comme valeur.
*(Pour plus de détails, consultez la FAQ: [Comment configurer une clé API ?](#comment-configurer-une-clé-api)).*
**3. Mettez à jour `config.ini`:**
```ini
[MAIN]
is_local = False
provider_name = openai # ou google, deepseek, togetherAI, huggingface
provider_model = gpt-3.5-turbo # ou gemini-1.5-flash, deepseek-chat, mistralai/Mixtral-8x7B-Instruct-v0.1, etc.
provider_server_address = # Lorsque is_local = False, généralement ignoré ou peut être laissé vide pour la plupart des API
# ... autres configurations ...
```
*Avertissement:* Assurez-vous qu'il n'y a pas d'espaces à la fin des valeurs dans config.
**Liste des fournisseurs d'API**
| Fournisseur | `provider_name` | Local ? | Description | Lien de clé API (exemple) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | Non | Utilise les modèles ChatGPT via l'API OpenAI. | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | Non | Utilise les modèles Google Gemini via Google AI Studio. | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | Non | Utilise les modèles Deepseek via leur API. | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | Non | Utilise les modèles du Hugging Face Inference API. | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | Non | Utilise divers modèles open source via l'API TogetherAI.| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
*Note:*
* Nous ne recommandons pas d'utiliser `gpt-4o` ou d'autres modèles OpenAI pour la navigation web complexe et la planification de tâches, car l'optimisation actuelle des prompts cible des modèles comme Deepseek.
* Les tâches de codage/bash peuvent échouer avec Gemini, car il a tendance à ignorer notre format de prompt optimisé pour Deepseek r1.
* Lorsque `is_local = False`, `provider_server_address` dans `config.ini` n'est généralement pas utilisé, car les endpoints d'API sont généralement gérés par les bibliothèques du fournisseur correspondant.
Prochaine étape: [Démarrer les services et exécuter AgenticSeek](#démarrer-les-services-et-exécuter)
*Si vous rencontrez des problèmes, consultez la section **Problèmes connus***
*Pour des explications détaillées du fichier de configuration, consultez la **section Configuration**.*
---
## Démarrer les services et exécuter
Par défaut, AgenticSeek s'exécute entièrement dans Docker.
**Option 1:** Exécuter dans Docker avec interface web:
Démarrez les services nécessaires. Cela démarrera tous les services du docker-compose.yml, y compris:
- searxng
- redis (requis pour searxng)
- frontend
- backend (si vous utilisez `full` pour l'interface web)
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Windows
```
**Avertissement:** Cette étape téléchargera et chargera toutes les images Docker, ce qui peut prendre jusqu'à 30 minutes. Après avoir démarré les services, attendez que le service backend soit complètement opérationnel (vous devriez voir **backend: "GET /health HTTP/1.1" 200 OK** dans les logs) avant d'envoyer des messages. Lors du premier démarrage, le service backend peut prendre 5 minutes pour démarrer.
Allez à `http://localhost:3000/` et vous devriez voir l'interface web.
*Dépannage du démarrage des services:* Si ces scripts échouent, assurez-vous que Docker Engine fonctionne et que Docker Compose (V2, `docker compose`) est correctement installé. Vérifiez les messages d'erreur dans la sortie du terminal. Consultez [FAQ: Aide ! J'obtiens des erreurs lors de l'exécution d'AgenticSeek ou de ses scripts.](#faq-dépannage)
**Option 2:** Mode CLI:
Pour exécuter avec l'interface CLI, vous devez installer les packages sur l'hôte:
```sh
./install.sh
./install.bat # windows
```
Ensuite, vous devez changer SEARXNG_BASE_URL dans `config.ini` en:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
Démarrez les services nécessaires. Cela démarrera certains services du docker-compose.yml, y compris:
- searxng
- redis (requis pour searxng)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Windows
```
Exécutez: uv run: `uv run python -m ensurepip` pour vous assurer que uv a pip activé.
Utilisez CLI: `uv run cli.py`
---
## Utilisation
Assurez-vous que les services fonctionnent avec `./start_services.sh full` puis allez à `localhost:3000` pour l'interface web.
Vous pouvez également utiliser la parole vers texte en définissant `listen = True`. Uniquement pour le mode CLI.
Pour quitter, dites/tapez simplement `goodbye`.
Quelques exemples d'utilisation:
> *Fais un jeu de serpent en python !*
> *Recherche sur le web les meilleurs cafés à Rennes, France, et sauvegarde une liste de trois avec leurs adresses dans rennes_cafes.txt.*
> *Écris un programme Go pour calculer la factorielle d'un nombre, sauvegarde-le comme factorial.go dans ton workspace*
> *Recherche dans le dossier summer_pictures tous les fichiers JPG, renomme-les avec la date d'aujourd'hui et sauvegarde la liste des fichiers renommés dans photos_list.txt*
> *Recherche en ligne les films de science-fiction populaires de 2024 et choisis-en trois à regarder ce soir. Sauvegarde la liste dans movie_night.txt.*
> *Recherche sur le web les derniers articles d'actualité sur l'IA de 2025, sélectionne-en trois et écris un script Python pour extraire les titres et résumés. Sauvegarde le script comme news_scraper.py et les résumés dans ai_news.txt dans /home/projects*
> *Vendredi, recherche sur le web une API gratuite de prix d'actions, inscris-toi avec supersuper7434567@gmail.com et écris un script Python pour obtenir les prix quotidiens de Tesla en utilisant l'API, en sauvegardant les résultats dans stock_prices.csv*
*Notez que le remplissage de formulaires est toujours expérimental et peut échouer.*
Après avoir saisi votre requête, AgenticSeek attribuera le meilleur agent pour la tâche.
Comme il s'agit d'un prototype initial, le système de routage des agents peut ne pas toujours attribuer l'agent correct à votre requête.
Par conséquent, soyez très explicite sur ce que vous voulez et comment l'IA pourrait procéder, par exemple si vous voulez qu'elle effectue une recherche web, ne dites pas:
`Connais-tu de bons pays pour voyager seul ?`
Dites plutôt:
`Effectue une recherche web et découvre quels sont les meilleurs pays pour voyager seul`
---
## **Configuration pour exécuter LLM sur votre propre serveur**
Si vous avez un ordinateur puissant ou un serveur auquel vous pouvez accéder, mais que vous voulez l'utiliser depuis votre ordinateur portable, vous pouvez choisir d'exécuter le LLM sur un serveur distant en utilisant notre serveur llm personnalisé.
Sur votre "serveur" qui exécutera le modèle d'IA, obtenez l'adresse IP
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # IP locale
curl https://ipinfo.io/ip # IP publique
```
Note: Pour Windows ou macOS, utilisez ipconfig ou ifconfig pour trouver l'adresse IP.
Clonez le dépôt et entrez dans le dossier `server/`.
```sh
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
Installez les exigences spécifiques au serveur:
```sh
pip3 install -r requirements.txt
```
Exécutez le script du serveur.
```sh
python3 app.py --provider ollama --port 3333
```
Vous pouvez choisir d'utiliser `ollama` et `llamacpp` comme service LLM.
Maintenant sur votre ordinateur personnel:
Changez le fichier `config.ini` pour définir `provider_name` sur `server` et `provider_model` sur `deepseek-r1:xxb`.
Définissez `provider_server_address` sur l'adresse IP de la machine qui exécutera le modèle.
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
Prochaine étape: [Démarrer les services et exécuter AgenticSeek](#démarrer-les-services-et-exécuter)
---
## Parole vers Texte
Avertissement: La speech-to-text ne fonctionne qu'en mode CLI pour le moment.
Notez que la parole vers texte ne fonctionne qu'en anglais pour le moment.
La fonctionnalité de parole vers texte est désactivée par défaut. Pour l'activer, définissez listen sur True dans le fichier config.ini:
```
listen = True
```
Lorsqu'elle est activée, la fonction de parole vers texte écoute un mot-clé de déclenchement, qui est le nom de l'agent, avant de traiter votre entrée. Vous pouvez personnaliser le nom de l'agent en mettant à jour la valeur `agent_name` dans *config.ini*:
```
agent_name = Friday
```
Pour une meilleure reconnaissance, nous recommandons d'utiliser un nom commun en anglais comme "John" ou "Emma" comme nom d'agent.
Une fois que vous voyez la transcription commencer à apparaître, dites le nom de l'agent à haute voix pour le réveiller (ex: "Friday").
Dites votre requête clairement.
Terminez votre demande par une phrase de confirmation pour indiquer au système de continuer. Les exemples de phrases de confirmation incluent:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## Configuration
Exemple de configuration:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Exemple Ollama; LM-Studio utilise http://127.0.0.1:1234
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # Liste des langues pour TTS et routage potentiel.
[BROWSER]
headless_browser = False
stealth_mode = False
```
**Explication des paramètres de `config.ini`**:
* **Section `[MAIN]`:**
* `is_local`: `True` si vous utilisez des fournisseurs de LLM locaux (Ollama, LM-Studio, serveur local compatible OpenAI) ou l'option de serveur auto-hébergé. `False` si vous utilisez des API basées sur le cloud (OpenAI, Google, etc.).
* `provider_name`: Spécifie le fournisseur de LLM.
* Options locales: `ollama`, `lm-studio`, `openai` (pour serveur local compatible OpenAI), `server` (pour configuration de serveur auto-hébergé).
* Options d'API: `openai`, `google`, `deepseek`, `huggingface`, `togetherAI`.
* `provider_model`: Nom ou ID spécifique du modèle du fournisseur sélectionné (ex: `deepseekcoder:6.7b` pour Ollama, `gpt-3.5-turbo` pour API OpenAI, `mistralai/Mixtral-8x7B-Instruct-v0.1` pour TogetherAI).
* `provider_server_address`: L'adresse de votre fournisseur de LLM.
* Pour les fournisseurs locaux: ex: `http://127.0.0.1:11434` pour Ollama, `http://127.0.0.1:1234` pour LM-Studio.
* Pour le type de fournisseur `server`: L'adresse de votre serveur LLM auto-hébergé (ex: `http://your_server_ip:3333`).
* Pour les API cloud (`is_local = False`): Ceci est généralement ignoré ou peut être laissé vide, car les endpoints d'API sont généralement gérés par les bibliothèques clientes.
* `agent_name`: Le nom de l'assistant IA (ex: Friday). Si activé, utilisé comme mot de déclenchement pour la parole vers texte.
* `recover_last_session`: `True` pour tenter de récupérer l'état de la session précédente, `False` pour recommencer.
* `save_session`: `True` pour sauvegarder l'état de la session actuelle pour une récupération potentielle, `False` sinon.
* `speak`: `True` pour activer la sortie vocale de texte vers parole, `False` pour désactiver.
* `listen`: `True` pour activer l'entrée vocale de parole vers texte (uniquement mode CLI), `False` pour désactiver.
* `work_dir`: **Critique:** Le répertoire où AgenticSeek lira/écrira des fichiers. **Assurez-vous que ce chemin est valide et accessible sur votre système.**
* `jarvis_personality`: `True` pour utiliser des invites système plus "Jarvis-like" (expérimental), `False` pour utiliser des invites standard.
* `languages`: Liste de langues séparées par des virgules (ex: `en, zh, fr`). Utilisé pour la sélection de voix TTS (première par défaut) et peut aider le routeur LLM. Pour éviter les inefficacités du routeur, évitez d'utiliser trop de langues ou des langues très similaires.
* **Section `[BROWSER]`:**
* `headless_browser`: `True` pour exécuter le navigateur automatisé sans fenêtre visible (recommandé pour l'interface web ou l'utilisation non interactive). `False` pour afficher la fenêtre du navigateur (utile pour le mode CLI ou le débogage).
* `stealth_mode`: `True` pour activer des mesures qui rendent plus difficile la détection de l'automatisation du navigateur. Peut nécessiter l'installation manuelle d'extensions de navigateur comme anticaptcha.
Cette section résume les types de fournisseurs de LLM pris en charge. Configurez-les dans `config.ini`.
**Fournisseurs locaux (fonctionnant sur votre propre matériel):**
| Nom du fournisseur dans config.ini | `is_local` | Description | Section de configuration |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | Fournit LLM localement facilement en utilisant Ollama. | [Configuration pour exécuter LLM localement sur votre machine](#configuration-pour-exécuter-llm-localement-sur-votre-machine) |
| `lm-studio` | `True` | Fournit LLM localement avec LM-Studio. | [Configuration pour exécuter LLM localement sur votre machine](#configuration-pour-exécuter-llm-localement-sur-votre-machine) |
| `openai` (pour serveur local) | `True` | Connectez-vous à un serveur local exposant une API compatible OpenAI (ex: llama.cpp). | [Configuration pour exécuter LLM localement sur votre machine](#configuration-pour-exécuter-llm-localement-sur-votre-machine) |
| `server` | `False` | Connectez-vous au serveur LLM auto-hébergé d'AgenticSeek fonctionnant sur une autre machine. | [Configuration pour exécuter LLM sur votre propre serveur](#configuration-pour-exécuter-llm-sur-votre-propre-serveur) |
**Fournisseurs d'API (basés sur le cloud):**
| Nom du fournisseur dans config.ini | `is_local` | Description | Section de configuration |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | Utilise l'API officielle d'OpenAI (ex: GPT-3.5, GPT-4). | [Configuration pour exécuter avec une API](#configuration-pour-exécuter-avec-une-api) |
| `google` | `False` | Utilise les modèles Google Gemini via API. | [Configuration pour exécuter avec une API](#configuration-pour-exécuter-avec-une-api) |
| `deepseek` | `False` | Utilise l'API officielle de Deepseek. | [Configuration pour exécuter avec une API](#configuration-pour-exécuter-avec-une-api) |
| `huggingface` | `False` | Utilise Hugging Face Inference API. | [Configuration pour exécuter avec une API](#configuration-pour-exécuter-avec-une-api) |
| `togetherAI` | `False` | Utilise divers modèles ouverts via l'API TogetherAI. | [Configuration pour exécuter avec une API](#configuration-pour-exécuter-avec-une-api) |
---
## Dépannage
Si vous rencontrez des problèmes, cette section fournit des conseils.
# Problèmes connus
## Problèmes de ChromeDriver
**Exemple d'erreur:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### Cause racine
L'incompatibilité de version de ChromeDriver se produit lorsque:
1. La version de ChromeDriver que vous avez installée ne correspond pas à la version du navigateur Chrome
2. Dans les environnements Docker, `undetected_chromedriver` peut télécharger sa propre version de ChromeDriver, contournant les binaires montés
### Étapes de résolution
#### 1. Vérifiez votre version de Chrome
Ouvrez Google Chrome → `Paramètres > À propos de Chrome` pour trouver votre version (ex: "Version 134.0.6998.88")
#### 2. Téléchargez ChromeDriver correspondant
**Pour Chrome 115 et versions ultérieures:** Utilisez [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/)
- Visitez le tableau de disponibilité de Chrome for Testing
- Trouvez votre version de Chrome ou la correspondance disponible la plus proche
- Téléchargez ChromeDriver pour votre système d'exploitation (utilisez Linux64 pour les environnements Docker)
**Pour les anciennes versions de Chrome:** Utilisez [Téléchargements hérités de ChromeDriver](https://chromedriver.chromium.org/downloads)
![Télécharger ChromeDriver depuis Chrome for Testing](./media/chromedriver_readme.png)
#### 3. Installez ChromeDriver (choisissez une méthode)
**Méthode A: Répertoire racine du projet (recommandé pour Docker)**
```bash
# Placez le binaire chromedriver téléchargé dans le répertoire racine du projet
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # Rendez-le exécutable sur Linux/macOS
```
**Méthode B: PATH système**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows: Placez chromedriver.exe dans un dossier du PATH
```
#### 4. Vérifiez l'installation
```bash
# Testez la version de ChromeDriver
./chromedriver --version
# Ou s'il est dans PATH:
chromedriver --version
```
### Instructions spécifiques à Docker
⚠️ **Important pour les utilisateurs de Docker:**
- La méthode de montage de volumes Docker peut ne pas fonctionner avec le mode furtif (`undetected_chromedriver`)
- **Solution:** Placez ChromeDriver dans le répertoire racine du projet en tant que `./chromedriver`
- L'application le détectera automatiquement et utilisera ce binaire
- Vous devriez voir dans les logs: `"Using ChromeDriver from project root: ./chromedriver"`
### Conseils de dépannage
1. **Toujours une incompatibilité de version ?**
- Vérifiez que ChromeDriver est exécutable: `ls -la ./chromedriver`
- Vérifiez la version de ChromeDriver: `./chromedriver --version`
- Assurez-vous qu'elle correspond à votre version du navigateur Chrome
2. **Problèmes avec le conteneur Docker ?**
- Vérifiez les logs du backend: `docker logs backend`
- Recherchez le message: `"Using ChromeDriver from project root"`
- S'il n'est pas trouvé, vérifiez que le fichier existe et est exécutable
3. **Versions de Chrome for Testing**
- Utilisez une correspondance exacte lorsque possible
- Pour la version 134.0.6998.88, utilisez ChromeDriver 134.0.6998.165 (la version disponible la plus proche)
- Le numéro de version principal doit correspondre (134 = 134)
### Matrice de compatibilité des versions
| Version de Chrome | Version de ChromeDriver | Statut |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ Disponible |
| 133.0.6943.x | 133.0.6943.141 | ✅ Disponible |
| 132.0.6834.x | 132.0.6834.159 | ✅ Disponible |
*Pour la compatibilité la plus récente, consultez le [Tableau de Chrome for Testing](https://googlechromelabs.github.io/chrome-for-testing/)*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
Cela se produit si votre navigateur et la version de chromedriver ne correspondent pas.
Vous devez naviguer pour télécharger la dernière version:
https://developer.chrome.com/docs/chromedriver/downloads
Si vous utilisez Chrome version 115 ou supérieure, allez à:
https://googlechromelabs.github.io/chrome-for-testing/
et téléchargez la version de chromedriver correspondant à votre système d'exploitation.
![alt text](./media/chromedriver_readme.png)
Si cette section est incomplète, ouvrez un issue.
## Problèmes d'adaptateurs de connexion
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'` (note: le port peut varier)
```
* **Cause:** Il manque le préfixe `http://` dans `provider_server_address` pour `lm-studio` (ou un autre serveur local compatible OpenAI similaire) dans `config.ini`, ou il pointe vers le mauvais port.
* **Solution:**
* Assurez-vous que l'adresse inclut `http://`. LM-Studio utilise généralement `http://127.0.0.1:1234` par défaut.
* `config.ini` correct: `provider_server_address = http://127.0.0.1:1234` (ou votre port réel du serveur LM-Studio).
## URL de base de SearxNG non fournie
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
Cela peut se produire si vous exécutez le mode CLI avec une URL de base de searxng incorrecte.
SEARXNG_BASE_URL doit différer selon que vous exécutez dans Docker ou sur l'hôte:
**Exécution sur l'hôte:** `SEARXNG_BASE_URL="http://localhost:8080"`
**Exécution complètement dans Docker (interface web):** `SEARXNG_BASE_URL="http://searxng:8080"`
## FAQ
**Q: De quel matériel ai-je besoin ?**
| Taille du modèle | GPU | Commentaires |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB VRAM | ⚠️ Non recommandé. Performances médiocres, hallucinations fréquentes, les agents de planification peuvent échouer. |
| 14B | 12 GB VRAM (ex: RTX 3060) | ✅ Utilisable pour des tâches simples. Peut avoir des difficultés avec la navigation web et la planification de tâches. |
| 32B | 24+ GB VRAM (ex: RTX 4090) | 🚀 Réussit la plupart des tâches, peut encore avoir des difficultés avec la planification de tâches |
| 70B+ | 48+ GB VRAM | 💪 Excellent. Recommandé pour les cas d'utilisation avancés. |
**Q: Que faire si je rencontre des erreurs ?**
Assurez-vous que le local fonctionne (`ollama serve`), que votre `config.ini` correspond à votre fournisseur et que les dépendances sont installées. Si rien ne fonctionne, n'hésitez pas à ouvrir un issue.
**Q: Peut-il vraiment fonctionner à 100% localement ?**
Oui, avec les fournisseurs Ollama, lm-studio ou server, tous les modèles de parole vers texte, LLM et texte vers parole fonctionnent localement. Les options non locales (OpenAI ou autres API) sont optionnelles.
**Q: Pourquoi devrais-je utiliser AgenticSeek quand j'ai Manus ?**
Contrairement à Manus, AgenticSeek privilégie l'indépendance des systèmes externes, vous donnant plus de contrôle, de confidentialité et évitant les coûts d'API.
**Q: Qui est derrière ce projet ?**
Ce projet a été créé par moi, avec deux amis comme mainteneurs et des contributeurs de la communauté open source sur GitHub. Nous sommes juste des individus passionnés, pas une startup, ni affiliés à aucune organisation.
Tout compte AgenticSeek sur X autre que mon compte personnel (https://x.com/Martin993886460) est un imposteur.
## Contribuer
Nous recherchons des développeurs pour améliorer AgenticSeek ! Consultez les problèmes ouverts ou les discussions.
[Guide de contribution](./docs/CONTRIBUTING.md)
## Sponsors:
Vous voulez améliorer les capacités d'AgenticSeek avec des fonctionnalités comme la recherche de vols, la planification de voyages ou l'obtention des meilleures offres d'achat ? Envisagez d'utiliser SerpApi pour créer des outils personnalisés qui débloquent plus de fonctionnalités de type Jarvis. Avec SerpApi, vous pouvez accélérer votre agent pour des tâches professionnelles tout en gardant le contrôle total.
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
Consultez [Contributing.md](./docs/CONTRIBUTING.md) pour apprendre comment intégrer des outils personnalisés !
### **Sponsors**:
- [tatra-labs](https://github.com/tatra-labs)
## Mainteneurs:
> [Fosowl](https://github.com/Fosowl) | Heure de Paris
> [antoineVIVIES](https://github.com/antoineVIVIES) | Heure de Taipei
## Remerciements spéciaux:
> [tcsenpai](https://github.com/tcsenpai) et [plitc](https://github.com/plitc) pour avoir aidé à la dockerisation du backend
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
+683
View File
@@ -0,0 +1,683 @@
# AgenticSeek: Manusのプライベートでローカルな代替品
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
*音声対応のAIアシスタントで、**100%ローカルで動作するManus AIの代替品**です。自律的にウェブを閲覧し、コードを書き、タスクを計画し、すべてのデータをデバイス上に保持します。ローカル推論モデル向けに設計されており、完全にあなたのハードウェア上で動作し、プライバシーを保証し、クラウドへの依存をゼロにします。*
[![AgenticSeekを訪問](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
### なぜAgenticSeekを選ぶのか?
* 🔒 完全にローカル&プライベート - すべてがあなたのマシン上で動作し、クラウドなし、データ共有なし。あなたのファイル、会話、検索はプライベートのままです。
* 🌐 インテリジェントなウェブブラウジング - AgenticSeekは自律的にインターネットを閲覧できます:検索、読み取り、情報抽出、ウェブフォーム入力、すべて手動操作なしで。
* 💻 自律的なプログラミングアシスタント - コードが必要ですか?Python、C、Go、Javaなどのプログラムを監督なしで書き、デバッグし、実行できます。
* 🧠 インテリジェントなエージェント選択 - あなたが要求すると、自動的に最適なエージェントがタスクに割り当てられます。常に利用可能な専門家チームを持っているようなものです。
* 📋 複雑なタスクの計画と実行 - 旅行計画から複雑なプロジェクトまで、大きなタスクをステップに分解し、複数のAIエージェントを使用して完了できます。
* 🎙️ 音声サポート - クリーンで高速で未来的な音声と音声認識機能により、SF映画のようなパーソナルAIと会話できます。(開発中)
### **デモ**
> *agenticSeekプロジェクトを検索して必要なスキルを学び、CV_candidates.zipを開いて、どの候補がプロジェクトに最も適しているか教えてくれますか?*
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
免責事項:このデモと表示されるすべてのファイル(例:CV_candidates.zip)は完全に架空のものです。私たちは企業ではなく、候補者ではなくオープンソースの貢献者を求めています。
> 🛠⚠️ **アクティブな開発中**
> 🙏 このプロジェクトはサイドプロジェクトとして始まり、ロードマップも資金もありませんでした。GitHub Trendingに登場して予想以上に成長しました。貢献、フィードバック、忍耐に深く感謝します。
## 前提条件
始める前に、以下がインストールされていることを確認してください:
* **Git:** リポジトリをクローンするため。[Gitをダウンロード](https://git-scm.com/downloads)
* **Python 3.10.x:** Python 3.10.xを強く推奨します。他のバージョンでは依存関係エラーが発生する可能性があります。[Python 3.10をダウンロード](https://www.python.org/downloads/release/python-3100/)3.10.xバージョンを選択)。
* **Docker Engine & Docker Compose:** SearxNGなどのパッケージ化されたサービスを実行するため。
* Docker Desktopをインストール(Docker Compose V2を含む):[Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* またはLinuxでDocker EngineとDocker Composeを別々にインストール:[Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/)(Compose V2をインストールしていることを確認、例:`sudo apt-get install docker-compose-plugin`)。
### 1. **リポジトリをクローンして設定**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2. .envファイルの内容を変更
```sh
SEARXNG_BASE_URL="http://searxng:8080" # ホストでCLIモードを実行する場合はhttp://127.0.0.1:8080を使用
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
必要に応じて`.env`ファイルを更新してください:
- **SEARXNG_BASE_URL**: ホストでCLIモードを実行する場合を除き、変更しないでください。
- **REDIS_BASE_URL**: 変更しないでください
- **WORK_DIR**: ローカル作業ディレクトリへのパス。AgenticSeekはこれらのファイルを読み取り、操作できます。
- **OLLAMA_PORT**: Ollamaサービスのポート番号。
- **LM_STUDIO_PORT**: LM Studioサービスのポート番号。
- **CUSTOM_ADDITIONAL_LLM_PORT**: 追加のカスタムLLMサービスのポート。
**APIキーは、ローカルでLLMを実行することを選択するユーザーには完全にオプションであり、これがこのプロジェクトの主な目的です。ハードウェアが十分にある場合は空のままにしてください。**
### 3. **Dockerを起動**
Dockerがインストールされ、システム上で実行されていることを確認してください。以下のコマンドでDockerを起動できます:
- **Linux/macOS:**
ターミナルを開いて実行:
```sh
sudo systemctl start docker
```
または、インストールされている場合はアプリケーションメニューからDocker Desktopを起動。
- **Windows:**
スタートメニューからDocker Desktopを起動。
Dockerが実行されているかは以下で確認できます:
```sh
docker info
```
Dockerインストール情報が表示されれば正常に動作しています。
要約については以下の[ローカルプロバイダーリスト](#ローカルプロバイダーリスト)を参照してください。
次のステップ:[ローカルでAgenticSeekを実行](#サービスを起動して実行)
*問題が発生した場合は、[トラブルシューティング](#トラブルシューティング)セクションを参照してください。*
*ハードウェアがローカルでLLMを実行できない場合は、[APIを使用した実行設定](#apiを使用した実行設定)を参照してください。*
*詳細な`config.ini`の説明については、[設定セクション](#設定)を参照してください。*
---
## マシン上でローカルにLLMを実行する設定
**ハードウェア要件:**
LLMをローカルで実行するには、十分なハードウェアが必要です。少なくともMagistral、Qwen、またはDeepseek 14Bを実行できるGPUが必要です。詳細なモデル/パフォーマンスの推奨事項についてはFAQを参照してください。
**ローカルプロバイダーを設定**
例えばollamaを使用してローカルプロバイダーを起動:
```sh
ollama serve
```
サポートされているローカルプロバイダーのリストは以下を参照してください。
**config.iniを更新**
config.iniファイルを変更して、provider_nameをサポートされているプロバイダーに、provider_modelをプロバイダーがサポートするLLMに設定します。*Magistral*や*Deepseek*などの推論モデルをお勧めします。
必要なハードウェアについては、READMEの最後にある**FAQ**を参照してください。
```sh
[MAIN]
is_local = True # ローカルで実行するかリモートプロバイダーを使用するか
provider_name = ollama # またはlm-studio、openaiなど
provider_model = deepseek-r1:14b # ハードウェアに互換性のあるモデルを選択
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # AIの名前
recover_last_session = True # 前のセッションを復元
save_session = True # 現在のセッションを記憶
speak = False # テキスト読み上げ
listen = False # 音声認識、CLIのみ、実験的
jarvis_personality = False # より「Jarvis」的な性格を使用(実験的)
languages = en zh # 言語リスト、TTSはデフォルトでリストの最初を使用
[BROWSER]
headless_browser = True # ホストでCLIを使用する場合を除き変更しない
stealth_mode = True # 検出されにくいseleniumを使用してブラウザ検出を減らす
```
**警告**:
- `config.ini`ファイル形式はコメントをサポートしていません。
コメントがエラーを引き起こすため、サンプル設定を直接コピー&ペーストしないでください。代わりに、コメントなしで希望の設定で`config.ini`ファイルを手動で変更してください。
- LM-studioを使用してLLMを実行する場合、provider_nameを`openai`に設定*しない*でください。`lm-studio`として使用してください。
- 一部のプロバイダー(例:lm-studio)では、IPの前に`http://`が必要です。例:`http://127.0.0.1:1234`
**ローカルプロバイダーリスト**
| プロバイダー | ローカル? | 説明 |
|-----------|--------|-----------------------------------------------------------|
| ollama | はい | ollamaを使用して簡単にローカルでLLMを実行 |
| lm-studio | はい | LM studioでローカルにLLMを実行(`provider_name` = `lm-studio`に設定)|
| openai | はい | OpenAI互換API(例:llama.cppサーバー)を使用 |
次のステップ:[サービスを起動してAgenticSeekを実行](#サービスを起動して実行)
*問題が発生した場合は、[トラブルシューティング](#トラブルシューティング)セクションを参照してください。*
*ハードウェアがローカルでLLMを実行できない場合は、[APIを使用した実行設定](#apiを使用した実行設定)を参照してください。*
*詳細な`config.ini`の説明については、[設定セクション](#設定)を参照してください。*
## APIを使用した実行設定
この設定では、外部のクラウドベースのLLMプロバイダーを使用します。選択したサービスからAPIキーを取得する必要があります。
**1. APIプロバイダーを選択し、APIキーを取得:**
以下の[APIプロバイダーリスト](#apiプロバイダーリスト)を参照してください。ウェブサイトにアクセスして登録し、APIキーを取得してください。
**2. APIキーを環境変数として設定:**
* **Linux/macOS:**
ターミナルを開き、`export`コマンドを使用します。永続的にするにはシェルの設定ファイル(例:`~/.bashrc`、`~/.zshrc`)に追加するのがベストです。
```sh
export PROVIDER_API_KEY="your_api_key_here"
# PROVIDER_API_KEYを特定の変数名に置き換えてください、例:OPENAI_API_KEY、GOOGLE_API_KEY
```
TogetherAIの例:
```sh
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **コマンドプロンプト(現在のセッション限定):**
```cmd
set PROVIDER_API_KEY=your_api_key_here
```
* **PowerShell(現在のセッション限定):**
```powershell
$env:PROVIDER_API_KEY="your_api_key_here"
```
* **永続的:** Windowsの検索バーで「環境変数」を検索し、「システムの環境変数を編集」をクリックしてから「環境変数...」ボタンをクリックします。適切な名前(例:`OPENAI_API_KEY`)とキーを値として新しいユーザー変数を追加します。
*(詳細については、FAQを参照してください:[APIキーを設定する方法?](#apiキーを設定する方法))。*
**3. `config.ini`を更新:**
```ini
[MAIN]
is_local = False
provider_name = openai # またはgoogle、deepseek、togetherAI、huggingface
provider_model = gpt-3.5-turbo # またはgemini-1.5-flash、deepseek-chat、mistralai/Mixtral-8x7B-Instruct-v0.1など
provider_server_address = # is_local = Falseの場合、ほとんどのAPIでは無視されるか空にできる
# ... その他の設定 ...
```
*警告:* configの値に末尾のスペースがないことを確認してください。
**APIプロバイダーリスト**
| プロバイダー | `provider_name` | ローカル? | 説明 | APIキーリンク(例) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | いいえ | OpenAIのAPIを通じてChatGPTモデルを使用。 | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | いいえ | Google AI Studioを通じてGoogle Geminiモデルを使用。 | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | いいえ | 彼らのAPIを通じてDeepseekモデルを使用。 | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | いいえ | Hugging Face Inference APIのモデルを使用。 | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | いいえ | TogetherAI APIを通じて様々なオープンソースモデルを使用。| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
| OpenRouter | `openrouter` | いいえ | OpenRouter APIを通じて様々なオープンソースモデルを使用。| [openrouter.api](https://openrouter.ai/) |
*注:*
* 複雑なウェブブラウジングとタスクプランニングには`gpt-4o`や他のOpenAIモデルの使用は推奨しません。現在のプロンプト最適化はDeepseekなどのモデルを対象としているためです。
* コーディング/bashタスクはGeminiで失敗する可能性があります。Deepseek r1用に最適化されたプロンプト形式を無視する傾向があるためです。
* `is_local = False`の場合、`config.ini`の`provider_server_address`は通常使用されません。APIエンドポイントは通常、対応するプロバイダーのライブラリで処理されるためです。
次のステップ:[サービスを起動してAgenticSeekを実行](#サービスを起動して実行)
*問題が発生した場合は、**既知の問題**セクションを参照してください*
*詳細な設定ファイルの説明については、**設定セクション**を参照してください。*
---
## サービスを起動して実行
デフォルトでは、AgenticSeekは完全にDocker内で実行されます。
**オプション1:** DockerでWebインターフェースを使用して実行:
必要なサービスを起動します。これにより、docker-compose.ymlのすべてのサービスが起動します:
- searxng
- redissearxngに必要)
- frontend
- backendWebインターフェースに`full`を使用する場合)
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Windows
```
**警告:** このステップではすべてのDockerイメージがダウンロードされロードされます。最大30分かかる場合があります。サービスを起動した後、メッセージを送信する前にバックエンドサービスが完全に実行されていることを確認してください(ログに**backend: "GET /health HTTP/1.1" 200 OK**が表示されるはずです)。初回実行時、バックエンドサービスは起動に5分かかる場合があります。
`http://localhost:3000/`にアクセスすると、Webインターフェースが表示されます。
*サービス起動のトラブルシューティング:* これらのスクリプトが失敗する場合は、Docker Engineが実行中でDocker ComposeV2、`docker compose`)が正しくインストールされていることを確認してください。ターミナル出力のエラーメッセージを確認してください。[FAQ: ヘルプ!AgenticSeekまたはそのスクリプトを実行するとエラーが発生します](#faq-トラブルシューティング)を参照してください。
**オプション2:** CLIモード:
CLIインターフェースで実行するには、ホストにパッケージをインストールする必要があります:
```sh
./install.sh
./install.bat # windows
```
次に、`config.ini`のSEARXNG_BASE_URLを以下に変更する必要があります:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
必要なサービスを起動します。これにより、docker-compose.ymlの一部のサービスが起動します:
- searxng
- redissearxngに必要)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Windows
```
実行:uv run: `uv run python -m ensurepip` でuvがpipを有効にしていることを確認します。
CLIを使用:`uv run cli.py`
---
## 使用方法
サービスが`./start_services.sh full`で実行されていることを確認し、`localhost:3000`にアクセスしてWebインターフェースを使用します。
`listen = True`を設定することで音声認識も使用できます。CLIモードのみ。
終了するには、単に`goodbye`と言う/入力します。
使用例:
> *Pythonでスネークゲームを作って!*
> *ウェブでフランスのレンヌの最高のカフェを検索し、3つとその住所をrennes_cafes.txtに保存して*
> *階乗を計算するGoプログラムを書き、factorial.goとしてワークスペースに保存して*
> *summer_picturesフォルダ内のすべてのJPGファイルを検索し、今日の日付で名前を変更し、名前変更されたファイルのリストをphotos_list.txtに保存して*
> *オンラインで2024年の人気SF映画を検索し、今夜見るために3つ選び、movie_night.txtに保存して*
> *ウェブで2025年の最新AIニュース記事を検索し、3つ選び、タイトルと要約を抽出するPythonスクリプトを書き、スクリプトをnews_scraper.pyとして保存し、要約をai_news.txtに保存(/home/projects*
> *金曜日、無料の株価APIをウェブ検索し、supersuper7434567@gmail.comで登録し、APIを使用してテスラの日次株価を取得するPythonスクリプトを書き、結果をstock_prices.csvに保存して*
*フォーム入力はまだ実験的であり、失敗する可能性があることに注意してください。*
クエリを入力すると、AgenticSeekが最適なエージェントをタスクに割り当てます。
これは初期プロトタイプであるため、エージェントルーティングシステムは常にクエリに正しいエージェントを割り当てられるとは限りません。
したがって、あなたが何を望んでいるか、そしてAIがどのように進めるかを非常に明確に表現する必要があります。例えば、ウェブ検索をしてほしい場合は、次のように言わないでください:
`一人旅に適した国を知っていますか?`
代わりに、次のように言ってください:
`ウェブ検索を実行し、一人旅に最適な国を見つけてください`
---
## **独自のサーバーでLLMを実行する設定**
強力なコンピューターやアクセス可能なサーバーを持っているが、ラップトップから使用したい場合は、カスタムllmサーバーを使用してリモートサーバーでLLMを実行することを選択できます。
AIモデルを実行する「サーバー」で、IPアドレスを取得します
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # ローカルIP
curl https://ipinfo.io/ip # パブリックIP
```
注:WindowsまたはmacOSでは、IPアドレスを見つけるためにipconfigまたはifconfigを使用してください。
リポジトリをクローンし、`server/`フォルダに移動します。
```sh
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
サーバー固有の要件をインストールします:
```sh
pip3 install -r requirements.txt
```
サーバースクリプトを実行します。
```sh
python3 app.py --provider ollama --port 3333
```
LLMサービスとして`ollama`と`llamacpp`のどちらを使用するか選択できます。
次に、あなたのパーソナルコンピューターで:
`config.ini`ファイルを変更して、`provider_name`を`server`に、`provider_model`を`deepseek-r1:xxb`に設定します。
`provider_server_address`をモデルを実行するマシンのIPアドレスに設定します。
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
次のステップ:[サービスを起動してAgenticSeekを実行](#サービスを起動して実行)
---
## 音声認識
警告:現在、音声認識はCLIモードでのみ機能します。
現在、音声認識は英語でのみ機能することに注意してください。
音声認識機能はデフォルトで無効になっています。有効にするには、config.iniファイルでlistenオプションをTrueに設定します:
```
listen = True
```
有効にすると、音声認識機能はトリガーワード、つまりエージェントの名前をリッスンし、その後入力を処理し始めます。*config.ini*ファイルの`agent_name`値を更新することでエージェントの名前をカスタマイズできます:
```
agent_name = Friday
```
最高の認識のためには、エージェント名として「John」や「Emma」などの一般的な英語名を使用することをお勧めします。
文字起こしが表示され始めたら、エージェントの名前を大声で言って起動します(例:「Friday」)。
クエリを明確に言います。
確認フレーズでリクエストを終了して、システムに続行するように指示します。確認フレーズの例:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## 設定
設定例:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Ollama例;LM-Studioはhttp://127.0.0.1:1234を使用
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # TTSおよび潜在的なルーティングの言語リスト。
[BROWSER]
headless_browser = False
stealth_mode = False
```
**`config.ini`設定の説明**
* **`[MAIN]`セクション:**
* `is_local`: ローカルLLMプロバイダー(Ollama、LM-Studio、ローカルOpenAI互換サーバー)またはセルフホストサーバーオプションを使用する場合は`True`。クラウドベースのAPI(OpenAI、Googleなど)を使用する場合は`False`。
* `provider_name`: LLMプロバイダーを指定します。
* ローカルオプション:`ollama`、`lm-studio`、`openai`(ローカルOpenAI互換サーバー用)、`server`(セルフホストサーバー設定用)。
* APIオプション:`openai`、`google`、`deepseek`、`huggingface`、`togetherAI`。
* `provider_model`: 選択したプロバイダーの特定のモデル名またはID(例:Ollamaの`deepseekcoder:6.7b`、OpenAI APIの`gpt-3.5-turbo`、TogetherAIの`mistralai/Mixtral-8x7B-Instruct-v0.1`)。
* `provider_server_address`: あなたのLLMプロバイダーのアドレス。
* ローカルプロバイダー用:例:Ollamaの`http://127.0.0.1:11434`、LM-Studioの`http://127.0.0.1:1234`。
* `server`プロバイダータイプ用:あなたのセルフホストLLMサーバーのアドレス(例:`http://your_server_ip:3333`)。
* クラウドAPI用(`is_local = False`):これは通常無視されるか空にできます。APIエンドポイントは通常クライアントライブラリで処理されるためです。
* `agent_name`: AIアシスタントの名前(例:Friday)。有効な場合、音声認識のトリガーワードとして使用されます。
* `recover_last_session`: `True`は前のセッションの状態を復元しようとし、`False`は最初から開始します。
* `save_session`: `True`は現在のセッションの状態を潜在的な復元用に保存し、`False`はしません。
* `speak`: `True`はテキスト読み上げ音声出力を有効にし、`False`は無効にします。
* `listen`: `True`は音声認識音声入力を有効にし(CLIモードのみ)、`False`は無効にします。
* `work_dir`: **重要:** AgenticSeekがファイルを読み書きするディレクトリ。**このパスがシステムで有効かつアクセス可能であることを確認してください。**
* `jarvis_personality`: `True`はより「Jarvis-like」なシステムプロンプトを使用(実験的)、`False`は標準プロンプトを使用。
* `languages`: カンマ区切りの言語リスト(例:`en, zh, fr`)。TTS音声選択(デフォルトは最初)に使用され、LLMルーターを支援できます。ルーターの非効率性を避けるため、多すぎる言語や非常に類似した言語の使用は避けてください。
* **`[BROWSER]`セクション:**
* `headless_browser`: `True`は可視ウィンドウなしで自動化ブラウザを実行(Webインターフェースまたは非対話的使用に推奨)。`False`はブラウザウィンドウを表示(CLIモードまたはデバッグに有用)。
* `stealth_mode`: `True`はブラウザ自動化の検出を困難にする措置を有効にします。anticaptchaなどのブラウザ拡張機能の手動インストールが必要な場合があります。
このセクションはサポートされているLLMプロバイダータイプをまとめています。`config.ini`で設定します。
**ローカルプロバイダー(独自のハードウェアで実行):**
| config.iniのプロバイダー名 | `is_local` | 説明 | 設定セクション |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | Ollamaを使用してローカルでLLMを簡単に提供。 | [マシン上でローカルにLLMを実行する設定](#マシン上でローカルにllmを実行する設定) |
| `lm-studio` | `True` | LM-StudioでローカルにLLMを提供。 | [マシン上でローカルにLLMを実行する設定](#マシン上でローカルにllmを実行する設定) |
| `openai`(ローカルサーバー用) | `True` | OpenAI互換APIを公開するローカルサーバー(例:llama.cpp)に接続。 | [マシン上でローカルにLLMを実行する設定](#マシン上でローカルにllmを実行する設定) |
| `server` | `False` | 別のマシンで実行されているAgenticSeekセルフホストLLMサーバーに接続。 | [独自のサーバーでLLMを実行する設定](#独自のサーバーでllmを実行する設定) |
**APIプロバイダー(クラウドベース):**
| config.iniのプロバイダー名 | `is_local` | 説明 | 設定セクション |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | OpenAIの公式API(例:GPT-3.5、GPT-4)を使用。 | [APIを使用した実行設定](#apiを使用した実行設定) |
| `google` | `False` | APIを通じてGoogleのGeminiモデルを使用。 | [APIを使用した実行設定](#apiを使用した実行設定) |
| `deepseek` | `False` | Deepseekの公式APIを使用。 | [APIを使用した実行設定](#apiを使用した実行設定) |
| `huggingface` | `False` | Hugging Face Inference APIを使用。 | [APIを使用した実行設定](#apiを使用した実行設定) |
| `togetherAI` | `False` | TogetherAIのAPIを通じて様々なオープンモデルを使用。 | [APIを使用した実行設定](#apiを使用した実行設定) |
---
## トラブルシューティング
問題が発生した場合、このセクションはガイダンスを提供します。
# 既知の問題
## ChromeDriverの問題
**エラー例:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### 根本原因
ChromeDriverのバージョン非互換性は以下で発生します:
1. インストールしたChromeDriverのバージョンがChromeブラウザのバージョンと一致しない
2. Docker環境では、`undetected_chromedriver`が独自のChromeDriverバージョンをダウンロードし、マウントされたバイナリを回避する可能性がある
### 解決手順
#### 1. Chromeのバージョンを確認
Google Chromeを開く → `設定 > Chromeについて`でバージョンを確認(例:「バージョン 134.0.6998.88」)
#### 2. 一致するChromeDriverをダウンロード
**Chrome 115以降の場合:** [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/)を使用
- Chrome for Testingの可用性ダッシュボードにアクセス
- あなたのChromeバージョンまたは最も近い利用可能な一致を見つける
- オペレーティングシステム用のChromeDriverをダウンロード(Docker環境ではLinux64を使用)
**古いChromeバージョンの場合:** [レガシーChromeDriverダウンロード](https://chromedriver.chromium.org/downloads)を使用
![Chrome for TestingからChromeDriverをダウンロード](./media/chromedriver_readme.png)
#### 3. ChromeDriverをインストール(方法を選択)
**方法A:プロジェクトルートディレクトリ(Docker推奨)**
```bash
# ダウンロードしたchromedriverバイナリをプロジェクトルートディレクトリに配置
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # Linux/macOSで実行可能にする
```
**方法B:システムPATH**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows: chromedriver.exeをPATH内のフォルダに配置
```
#### 4. インストールを確認
```bash
# ChromeDriverのバージョンをテスト
./chromedriver --version
# またはPATHにある場合:
chromedriver --version
```
### Docker固有の指示
⚠️ **Dockerユーザーへの重要:**
- Dockerボリュームマウント方法はステルスモード(`undetected_chromedriver`)では機能しない可能性があります
- **解決策:** ChromeDriverをプロジェクトルートディレクトリに`./chromedriver`として配置
- アプリケーションが自動的に検出し、このバイナリを使用します
- ログに次のメッセージが表示されるはずです:`"Using ChromeDriver from project root: ./chromedriver"`
### トラブルシューティングのヒント
1. **まだバージョンの不一致が発生しますか?**
- ChromeDriverが実行可能か確認:`ls -la ./chromedriver`
- ChromeDriverのバージョンを確認:`./chromedriver --version`
- Chromeブラウザのバージョンと一致することを確認
2. **Dockerコンテナの問題ですか?**
- バックエンドログを確認:`docker logs backend`
- メッセージを探す:`"Using ChromeDriver from project root"`
- 見つからない場合は、ファイルが存在し実行可能であることを確認
3. **Chrome for Testingのバージョン**
- 可能な限り完全一致を使用
- バージョン134.0.6998.88の場合、ChromeDriver 134.0.6998.165を使用(最も近い利用可能バージョン)
- メジャーバージョン番号は一致する必要があります(134 = 134)
### バージョン互換性マトリックス
| Chromeバージョン | ChromeDriverバージョン | ステータス |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ 利用可能 |
| 133.0.6943.x | 133.0.6943.141 | ✅ 利用可能 |
| 132.0.6834.x | 132.0.6834.159 | ✅ 利用可能 |
*最新の互換性については、[Chrome for Testingダッシュボード](https://googlechromelabs.github.io/chrome-for-testing/)を確認*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
ブラウザとchromedriverのバージョンが一致しない場合に発生します。
最新バージョンをダウンロードする必要があります:
https://developer.chrome.com/docs/chromedriver/downloads
Chromeバージョン115以降を使用している場合は、以下にアクセス:
https://googlechromelabs.github.io/chrome-for-testing/
オペレーティングシステムに一致するchromedriverバージョンをダウンロードします。
![alt text](./media/chromedriver_readme.png)
このセクションが不完全な場合は、issueを開いてください。
## 接続アダプターの問題
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'`(注:ポートは異なる場合があります)
```
* **原因:** `config.ini`の`lm-studio`(または他の類似のローカルOpenAI互換サーバー)の`provider_server_address`に`http://`プレフィックスが欠けているか、間違ったポートを指している。
* **解決策:**
* アドレスに`http://`が含まれていることを確認。LM-Studioは通常デフォルトで`http://127.0.0.1:1234`を使用。
* 正しい`config.ini``provider_server_address = http://127.0.0.1:1234`(または実際のLM-Studioサーバーポート)。
## SearxNGベースURLが提供されていない
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
間違ったsearxngベースURLでCLIモードを実行すると発生する可能性があります。
SEARXNG_BASE_URLは、Dockerで実行するかホストで実行するかによって異なります:
**ホストで実行:** `SEARXNG_BASE_URL="http://localhost:8080"`
**完全にDocker内で実行(Webインターフェース):** `SEARXNG_BASE_URL="http://searxng:8080"`
## FAQ
**Q: どのようなハードウェアが必要ですか?**
| モデルサイズ | GPU | コメント |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB VRAM | ⚠️ 非推奨。パフォーマンスが低く、頻繁な幻覚、計画エージェントが失敗する可能性があります。 |
| 14B | 12 GB VRAM(例:RTX 3060) | ✅ 単純なタスクに使用可能。ウェブブラウジングとタスク計画に困難がある可能性があります。 |
| 32B | 24+ GB VRAM(例:RTX 4090) | 🚀 ほとんどのタスクで成功、タスク計画にまだ困難がある可能性があります |
| 70B+ | 48+ GB VRAM | 💪 優れています。高度な使用例に推奨。 |
**Q: エラーが発生したらどうすればよいですか?**
ローカルが実行されていること(`ollama serve`)、`config.ini`がプロバイダーと一致していること、依存関係がインストールされていることを確認してください。どれも機能しない場合は、遠慮なくissueを開いてください。
**Q: 本当に100%ローカルで実行できますか?**
はい、Ollama、lm-studio、またはserverプロバイダーを使用すると、すべての音声認識、LLM、テキスト読み上げモデルがローカルで実行されます。非ローカルオプション(OpenAI或其他API)はオプションです。
**Q: Manusがあるのに、なぜAgenticSeekを使用する必要がありますか?**
Manusとは異なり、AgenticSeekは外部システムからの独立性を優先し、より多くの制御、プライバシー、APIコストの回避を提供します。
**Q: このプロジェクトの背後には誰がいますか?**
このプロジェクトは私によって作成され、2人の友人がメンテナーとして、GitHub上のオープンソースコミュニティの貢献者と共に運営されています。私たちは単なる情熱的な個人であり、スタートアップではなく、どの組織にも所属していません。
私の個人アカウント(https://x.com/Martin993886460)以外のX上のAgenticSeekアカウントはすべて偽物です。
## 貢献
AgenticSeekを改善する開発者を探しています!オープンなissueやディスカッションを確認してください。
[貢献ガイド](./docs/CONTRIBUTING.md)
## スポンサー:
フライト検索、旅行計画、または最高の買い物のお得な情報の取得などの機能でAgenticSeekの能力を向上させたいですか?SerpApiを使用してカスタムツールを作成し、より多くのJarvisのような機能を解放することを検討してください。SerpApiを使用すると、プロフェッショナルなタスクのためにエージェントを加速させながら、完全な制御を維持できます。
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
[Contributing.md](./docs/CONTRIBUTING.md)をチェックして、カスタムツールを統合する方法を学びましょう!
### **スポンサー**
- [tatra-labs](https://github.com/tatra-labs)
## メンテナー:
> [Fosowl](https://github.com/Fosowl) | パリ時間
> [antoineVIVIES](https://github.com/antoineVIVIES) | 台北時間
## 特別な感謝:
> [tcsenpai](https://github.com/tcsenpai) と [plitc](https://github.com/plitc) がバックエンドのDocker化を支援
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
+682
View File
@@ -0,0 +1,682 @@
# AgenticSeek: Uma Alternativa Privada e Local ao Manus
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
*Um assistente de IA com reconhecimento de voz que é uma **alternativa 100% local ao Manus AI**, navega autonomamente na web, escreve código e planeja tarefas enquanto mantém todos os dados no seu dispositivo. Projetado para modelos de raciocínio local, funciona inteiramente no seu hardware, garantindo total privacidade e zero dependência de nuvem.*
[![Visitar AgenticSeek](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
### Por que escolher o AgenticSeek?
* 🔒 Totalmente Local & Privado - Tudo funciona na sua máquina, sem nuvem, sem compartilhamento de dados. Seus arquivos, conversas e pesquisas permanecem privados.
* 🌐 Navegação Web Inteligente - O AgenticSeek pode navegar na Internet autonomamente: pesquisar, ler, extrair informações, preencher formulários web, tudo sem intervenção manual.
* 💻 Assistente de Programação Autônomo - Precisa de código? Ele pode escrever, depurar e executar programas em Python, C, Go, Java e muito mais, sem supervisão.
* 🧠 Seleção Inteligente de Agentes - Você pergunta, ele escolhe automaticamente o melhor agente para a tarefa. Como ter uma equipe de especialistas sempre disponível.
* 📋 Planeja e Executa Tarefas Complexas - Desde o planejamento de viagens até projetos complexos, ele pode decompor grandes tarefas em etapas e completá-las usando múltiplos agentes de IA.
* 🎙️ Suporte de Voz - Voz clara, rápida e futurista com reconhecimento de voz, permitindo que você converse como com sua IA pessoal de filme de ficção científica. (Em desenvolvimento)
### **Demo**
> *Você pode pesquisar o projeto agenticSeek, aprender quais habilidades são necessárias e, em seguida, abrir CV_candidates.zip e me dizer quais correspondem melhor ao projeto?*
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
Aviso: Esta demonstração e todos os arquivos que aparecem (ex: CV_candidates.zip) são totalmente fictícios. Não somos uma empresa, estamos procurando contribuidores de código aberto, não candidatos.
> 🛠⚠️ **Trabalho Ativo em Andamento**
> 🙏 Este projeto começou como um projeto paralelo e não tem roadmap nem financiamento. Cresceu muito além das expectativas ao aparecer no GitHub Trending. Contribuições, comentários e paciência são profundamente apreciados.
## Pré-requisitos
Antes de começar, certifique-se de ter instalado:
* **Git:** Para clonar o repositório. [Baixar Git](https://git-scm.com/downloads)
* **Python 3.10.x:** Python 3.10.x é altamente recomendado. Outras versões podem causar erros de dependência. [Baixar Python 3.10](https://www.python.org/downloads/release/python-3100/) (selecione a versão 3.10.x).
* **Docker Engine & Docker Compose:** Para executar serviços empacotados como SearxNG.
* Instalar Docker Desktop (inclui Docker Compose V2): [Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* Ou instalar Docker Engine e Docker Compose separadamente no Linux: [Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/) (certifique-se de instalar Compose V2, por exemplo `sudo apt-get install docker-compose-plugin`).
### 1. **Clonar o repositório e configurar**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2. Modificar o conteúdo do arquivo .env
```sh
SEARXNG_BASE_URL="http://searxng:8080" # Se você executar no modo CLI no host, use http://127.0.0.1:8080
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
Atualize o arquivo `.env` conforme necessário:
- **SEARXNG_BASE_URL**: Mantenha inalterado, a menos que você execute no modo CLI no host.
- **REDIS_BASE_URL**: Mantenha inalterado
- **WORK_DIR**: Caminho para o diretório de trabalho local. O AgenticSeek poderá ler e interagir com esses arquivos.
- **OLLAMA_PORT**: Número da porta para o serviço Ollama.
- **LM_STUDIO_PORT**: Número da porta para o serviço LM Studio.
- **CUSTOM_ADDITIONAL_LLM_PORT**: Porta para qualquer serviço LLM personalizado adicional.
**As chaves de API são completamente opcionais para aqueles que optam por executar LLM localmente, que é o objetivo principal deste projeto. Deixe-as vazias se você tiver hardware suficiente.**
### 3. **Iniciar o Docker**
Certifique-se de que o Docker está instalado e funcionando no seu sistema. Você pode iniciar o Docker com os seguintes comandos:
- **Linux/macOS:**
Abra um terminal e execute:
```sh
sudo systemctl start docker
```
Ou inicie o Docker Desktop a partir do menu de aplicativos, se instalado.
- **Windows:**
Inicie o Docker Desktop a partir do menu Iniciar.
Você pode verificar se o Docker está funcionando executando:
```sh
docker info
```
Se você vir informações sobre sua instalação do Docker, ele está funcionando corretamente.
Consulte a [Lista de provedores locais](#lista-de-provedores-locais) abaixo para um resumo.
Próxima etapa: [Executar o AgenticSeek localmente](#iniciar-os-serviços-e-executar)
*Se você encontrar problemas, consulte a seção [Solução de problemas](#solução-de-problemas).*
*Se seu hardware não puder executar LLM localmente, consulte [Configuração para executar com uma API](#configuração-para-executar-com-uma-api).*
*Para explicações detalhadas do `config.ini`, consulte a [seção Configuração](#configuração).*
---
## Configuração para executar LLM localmente na sua máquina
**Requisitos de hardware:**
Para executar LLM localmente, você precisará de hardware suficiente. No mínimo, uma GPU capaz de executar Magistral, Qwen ou Deepseek 14B é necessária. Consulte o FAQ para recomendações detalhadas de modelo/desempenho.
**Configure seu provedor local**
Inicie seu provedor local, por exemplo com ollama:
```sh
ollama serve
```
Consulte a lista de provedores locais suportados abaixo.
**Atualizar config.ini**
Altere o arquivo config.ini para definir provider_name como um provedor suportado e provider_model como um LLM suportado pelo seu provedor. Recomendamos modelos de raciocínio como *Magistral* ou *Deepseek*.
Consulte o **FAQ** no final do README para o hardware necessário.
```sh
[MAIN]
is_local = True # Se você está executando localmente ou com um provedor remoto.
provider_name = ollama # ou lm-studio, openai, etc.
provider_model = deepseek-r1:14b # escolha um modelo compatível com seu hardware
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # o nome da sua IA
recover_last_session = True # recuperar a sessão anterior
save_session = True # memorizar a sessão atual
speak = False # texto para fala
listen = False # fala para texto, apenas para CLI, experimental
jarvis_personality = False # usar uma personalidade mais "Jarvis" (experimental)
languages = en zh # Lista de idiomas, TTS usará o primeiro da lista por padrão
[BROWSER]
headless_browser = True # mantenha inalterado, a menos que use CLI no host.
stealth_mode = True # Use selenium indetectável para reduzir a detecção do navegador
```
**Aviso**:
- O formato do arquivo `config.ini` não suporta comentários.
Não copie e cole diretamente a configuração de exemplo, pois os comentários causarão erros. Em vez disso, modifique manualmente o arquivo `config.ini` com sua configuração desejada, sem comentários.
- *NÃO* defina provider_name como `openai` se você estiver usando LM-studio para executar LLM. Use-o como `lm-studio`.
- Alguns provedores (ex: lm-studio) exigem `http://` antes do IP. Exemplo: `http://127.0.0.1:1234`
**Lista de provedores locais**
| Provedor | Local ? | Descrição |
|-----------|--------|-----------------------------------------------------------|
| ollama | Sim | Executa LLM localmente facilmente usando ollama |
| lm-studio | Sim | Executa LLM localmente com LM studio (defina `provider_name` = `lm-studio`)|
| openai | Sim | Use uma API compatível com openai (ex: servidor llama.cpp) |
Próxima etapa: [Iniciar os serviços e executar o AgenticSeek](#iniciar-os-serviços-e-executar)
*Se você encontrar problemas, consulte a seção [Solução de problemas](#solução-de-problemas).*
*Se seu hardware não puder executar LLM localmente, consulte [Configuração para executar com uma API](#configuração-para-executar-com-uma-api).*
*Para explicações detalhadas do `config.ini`, consulte a [seção Configuração](#configuração).*
## Configuração para executar com uma API
Esta configuração usa provedores de LLM externos baseados em nuvem. Você precisará obter chaves de API do serviço escolhido.
**1. Escolha um provedor de API e obtenha uma chave de API:**
Consulte a [Lista de provedores de API](#lista-de-provedores-de-api) abaixo. Visite seus sites para se inscrever e obter chaves de API.
**2. Defina sua chave de API como variável de ambiente:**
* **Linux/macOS:**
Abra um terminal e use o comando `export`. É melhor adicioná-lo ao arquivo de configuração do seu shell (ex: `~/.bashrc`, `~/.zshrc`) para que seja persistente.
```sh
export PROVIDER_API_KEY="your_api_key_here"
# Substitua PROVIDER_API_KEY pelo nome de variável específico, ex: OPENAI_API_KEY, GOOGLE_API_KEY
```
Exemplo TogetherAI:
```sh
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **Prompt de comando (temporário para a sessão atual):**
```cmd
set PROVIDER_API_KEY=your_api_key_here
```
* **PowerShell (temporário para a sessão atual):**
```powershell
$env:PROVIDER_API_KEY="your_api_key_here"
```
* **Permanente:** Pesquise "variáveis de ambiente" na barra de pesquisa do Windows, clique em "Editar variáveis de ambiente do sistema" e depois no botão "Variáveis de ambiente...". Adicione uma nova variável de usuário com o nome apropriado (ex: `OPENAI_API_KEY`) e sua chave como valor.
*(Para mais detalhes, consulte o FAQ: [Como configurar uma chave de API?](#como-configurar-uma-chave-de-api)).*
**3. Atualize `config.ini`:**
```ini
[MAIN]
is_local = False
provider_name = openai # ou google, deepseek, togetherAI, huggingface
provider_model = gpt-3.5-turbo # ou gemini-1.5-flash, deepseek-chat, mistralai/Mixtral-8x7B-Instruct-v0.1, etc.
provider_server_address = # Quando is_local = False, geralmente ignorado ou pode ser deixado vazio para a maioria das APIs
# ... outras configurações ...
```
*Aviso:* Certifique-se de que não há espaços no final dos valores no config.
**Lista de provedores de API**
| Provedor | `provider_name` | Local ? | Descrição | Link da chave de API (exemplo) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | Não | Use os modelos ChatGPT via API OpenAI. | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | Não | Use os modelos Google Gemini via Google AI Studio. | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | Não | Use os modelos Deepseek via sua API. | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | Não | Use modelos do Hugging Face Inference API. | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | Não | Use vários modelos open source via API TogetherAI.| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
*Nota:*
* Não recomendamos usar `gpt-4o` ou outros modelos OpenAI para navegação web complexa e planejamento de tarefas, pois a otimização atual de prompts visa modelos como Deepseek.
* Tarefas de codificação/bash podem falhar com Gemini, pois tende a ignorar nosso formato de prompt otimizado para Deepseek r1.
* Quando `is_local = False`, `provider_server_address` no `config.ini` geralmente não é usado, pois os endpoints de API são geralmente gerenciados pelas bibliotecas do provedor correspondente.
Próxima etapa: [Iniciar os serviços e executar o AgenticSeek](#iniciar-os-serviços-e-executar)
*Se você encontrar problemas, consulte a seção **Problemas conhecidos***
*Para explicações detalhadas do arquivo de configuração, consulte a **seção Configuração**.*
---
## Iniciar os serviços e executar
Por padrão, o AgenticSeek é executado inteiramente no Docker.
**Opção 1:** Executar no Docker com interface web:
Inicie os serviços necessários. Isso iniciará todos os serviços do docker-compose.yml, incluindo:
- searxng
- redis (necessário para searxng)
- frontend
- backend (se você usar `full` para a interface web)
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Windows
```
**Aviso:** Esta etapa baixará e carregará todas as imagens do Docker, o que pode levar até 30 minutos. Depois de iniciar os serviços, aguarde até que o serviço backend esteja totalmente operacional (você deve ver **backend: "GET /health HTTP/1.1" 200 OK** nos logs) antes de enviar mensagens. Na primeira inicialização, o serviço backend pode levar 5 minutos para iniciar.
Vá para `http://localhost:3000/` e você deve ver a interface web.
*Solução de problemas de inicialização de serviços:* Se esses scripts falharem, certifique-se de que o Docker Engine está funcionando e que o Docker Compose (V2, `docker compose`) está instalado corretamente. Verifique as mensagens de erro na saída do terminal. Consulte [FAQ: Ajuda! Estou recebendo erros ao executar o AgenticSeek ou seus scripts.](#faq-solução-de-problemas)
**Opção 2:** Modo CLI:
Para executar com a interface CLI, você precisa instalar os pacotes no host:
```sh
./install.sh
./install.bat # windows
```
Em seguida, você precisa alterar SEARXNG_BASE_URL no `config.ini` para:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
Inicie os serviços necessários. Isso iniciará alguns serviços do docker-compose.yml, incluindo:
- searxng
- redis (necessário para searxng)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Windows
```
Execute: uv run: `uv run python -m ensurepip` para garantir que o uv tenha o pip ativado.
Use CLI: `uv run cli.py`
---
## Uso
Certifique-se de que os serviços estão funcionando com `./start_services.sh full` e vá para `localhost:3000` para a interface web.
Você também pode usar fala para texto definindo `listen = True`. Apenas para o modo CLI.
Para sair, basta dizer/digitar `goodbye`.
Alguns exemplos de uso:
> *Faça um jogo da cobra em python!*
> *Pesquise na web os melhores cafés em Rennes, França, e salve uma lista de três com seus endereços em rennes_cafes.txt.*
> *Escreva um programa Go para calcular o fatorial de um número, salve-o como factorial.go em seu workspace*
> *Pesquise na pasta summer_pictures todos os arquivos JPG, renomeie-os com a data de hoje e salve a lista de arquivos renomeados em photos_list.txt*
> *Pesquise online os filmes de ficção científica populares de 2024 e escolha três para assistir esta noite. Salve a lista em movie_night.txt.*
> *Pesquise na web os últimos artigos de notícias sobre IA de 2025, selecione três e escreva um script Python para extrair os títulos e resumos. Salve o script como news_scraper.py e os resumos em ai_news.txt em /home/projects*
> *Sexta-feira, pesquise na web uma API gratuita de preços de ações, inscreva-se com supersuper7434567@gmail.com e escreva um script Python para obter os preços diários da Tesla usando a API, salvando os resultados em stock_prices.csv*
*Observe que o preenchimento de formulários ainda é experimental e pode falhar.*
Depois de inserir sua consulta, o AgenticSeek atribuirá o melhor agente para a tarefa.
Como este é um protótipo inicial, o sistema de roteamento de agentes pode nem sempre atribuir o agente correto à sua consulta.
Portanto, seja muito explícito sobre o que você quer e como a IA pode proceder, por exemplo, se você quiser que ela faça uma pesquisa na web, não diga:
`Você conhece bons países para viajar sozinho?`
Em vez disso, diga:
`Execute uma pesquisa na web e descubra quais são os melhores países para viajar sozinho`
---
## **Configuração para executar LLM em seu próprio servidor**
Se você tem um computador poderoso ou um servidor que pode acessar, mas quer usá-lo do seu laptop, você pode optar por executar o LLM em um servidor remoto usando nosso servidor llm personalizado.
No seu "servidor" que executará o modelo de IA, obtenha o endereço IP
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # IP local
curl https://ipinfo.io/ip # IP público
```
Nota: Para Windows ou macOS, use ipconfig ou ifconfig para encontrar o endereço IP.
Clone o repositório e entre na pasta `server/`.
```sh
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
Instale os requisitos específicos do servidor:
```sh
pip3 install -r requirements.txt
```
Execute o script do servidor.
```sh
python3 app.py --provider ollama --port 3333
```
Você pode escolher usar `ollama` e `llamacpp` como serviço LLM.
Agora no seu computador pessoal:
Altere o arquivo `config.ini` para definir `provider_name` como `server` e `provider_model` como `deepseek-r1:xxb`.
Defina `provider_server_address` como o endereço IP da máquina que executará o modelo.
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
Próxima etapa: [Iniciar os serviços e executar o AgenticSeek](#iniciar-os-serviços-e-executar)
---
## Fala para Texto
Aviso: Fala para texto funciona apenas no modo CLI no momento.
Observe que a fala para texto funciona apenas em inglês no momento.
A funcionalidade de fala para texto está desativada por padrão. Para ativá-la, defina listen como True no arquivo config.ini:
```
listen = True
```
Quando ativada, a funcionalidade de fala para texto ouve uma palavra-chave de gatilho, que é o nome do agente, antes de processar sua entrada. Você pode personalizar o nome do agente atualizando o valor `agent_name` em *config.ini*:
```
agent_name = Friday
```
Para melhor reconhecimento, recomendamos usar um nome comum em inglês como "John" ou "Emma" como nome do agente.
Assim que você vir a transcrição começar a aparecer, diga o nome do agente em voz alta para acordá-lo (ex: "Friday").
Diga sua consulta claramente.
Termine sua solicitação com uma frase de confirmação para indicar ao sistema para continuar. Exemplos de frases de confirmação incluem:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## Configuração
Exemplo de configuração:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Exemplo Ollama; LM-Studio usa http://127.0.0.1:1234
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # Lista de idiomas para TTS e roteamento potencial.
[BROWSER]
headless_browser = False
stealth_mode = False
```
**Explicação das configurações de `config.ini`**:
* **Seção `[MAIN]`:**
* `is_local`: `True` se você estiver usando provedores de LLM locais (Ollama, LM-Studio, servidor local compatível com OpenAI) ou a opção de servidor auto-hospedado. `False` se você estiver usando APIs baseadas em nuvem (OpenAI, Google, etc.).
* `provider_name`: Especifica o provedor de LLM.
* Opções locais: `ollama`, `lm-studio`, `openai` (para servidor local compatível com OpenAI), `server` (para configuração de servidor auto-hospedado).
* Opções de API: `openai`, `google`, `deepseek`, `huggingface`, `togetherAI`.
* `provider_model`: Nome ou ID específico do modelo do provedor selecionado (ex: `deepseekcoder:6.7b` para Ollama, `gpt-3.5-turbo` para API OpenAI, `mistralai/Mixtral-8x7B-Instruct-v0.1` para TogetherAI).
* `provider_server_address`: O endereço do seu provedor de LLM.
* Para provedores locais: ex: `http://127.0.0.1:11434` para Ollama, `http://127.0.0.1:1234` para LM-Studio.
* Para o tipo de provedor `server`: O endereço do seu servidor LLM auto-hospedado (ex: `http://your_server_ip:3333`).
* Para APIs em nuvem (`is_local = False`): Isso geralmente é ignorado ou pode ser deixado em branco, pois os endpoints da API são geralmente gerenciados pelas bibliotecas do provedor correspondente.
* `agent_name`: O nome do assistente de IA (ex: Friday). Se ativado, usado como palavra de gatilho para fala para texto.
* `recover_last_session`: `True` para tentar recuperar o estado da sessão anterior, `False` para começar do zero.
* `save_session`: `True` para salvar o estado da sessão atual para possível recuperação, `False` caso contrário.
* `speak`: `True` para ativar a saída de voz de texto para fala, `False` para desativar.
* `listen`: `True` para ativar a entrada de voz de fala para texto (apenas modo CLI), `False` para desativar.
* `work_dir`: **Crítico:** O diretório onde o AgenticSeek lerá/escreverá arquivos. **Certifique-se de que este caminho é válido e acessível no seu sistema.**
* `jarvis_personality`: `True` para usar prompts de sistema mais "Jarvis-like" (experimental), `False` para usar prompts padrão.
* `languages`: Lista de idiomas separados por vírgulas (ex: `en, zh, fr`). Usado para seleção de voz TTS (primeira por padrão) e pode ajudar o roteador LLM. Para evitar ineficiências do roteador, evite usar muitos idiomas ou idiomas muito semelhantes.
* **Seção `[BROWSER]`:**
* `headless_browser`: `True` para executar o navegador automatizado sem janela visível (recomendado para interface web ou uso não interativo). `False` para exibir a janela do navegador (útil para modo CLI ou depuração).
* `stealth_mode`: `True` para ativar medidas que tornam mais difícil a detecção da automação do navegador. Pode exigir instalação manual de extensões de navegador como anticaptcha.
Esta seção resume os tipos de provedores de LLM suportados. Configure-os em `config.ini`.
**Provedores locais (executando em seu próprio hardware):**
| Nome do provedor em config.ini | `is_local` | Descrição | Seção de configuração |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | Fornece LLM localmente facilmente usando Ollama. | [Configuração para executar LLM localmente na sua máquina](#configuração-para-executar-llm-localmente-na-sua-máquina) |
| `lm-studio` | `True` | Fornece LLM localmente com LM-Studio. | [Configuração para executar LLM localmente na sua máquina](#configuração-para-executar-llm-localmente-na-sua-máquina) |
| `openai` (para servidor local) | `True` | Conecte-se a um servidor local expondo uma API compatível com OpenAI (ex: llama.cpp). | [Configuração para executar LLM localmente na sua máquina](#configuração-para-executar-llm-localmente-na-sua-máquina) |
| `server` | `False` | Conecte-se ao servidor LLM auto-hospedado do AgenticSeek em execução em outra máquina. | [Configuração para executar LLM em seu próprio servidor](#configuração-para-executar-llm-em-seu-próprio-servidor) |
**Provedores de API (baseados em nuvem):**
| Nome do provedor em config.ini | `is_local` | Descrição | Seção de configuração |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | Use a API oficial da OpenAI (ex: GPT-3.5, GPT-4). | [Configuração para executar com uma API](#configuração-para-executar-com-uma-api) |
| `google` | `False` | Use os modelos Google Gemini via API. | [Configuração para executar com uma API](#configuração-para-executar-com-uma-api) |
| `deepseek` | `False` | Use a API oficial da Deepseek. | [Configuração para executar com uma API](#configuração-para-executar-com-uma-api) |
| `huggingface` | `False` | Use Hugging Face Inference API. | [Configuração para executar com uma API](#configuração-para-executar-com-uma-api) |
| `togetherAI` | `False` | Use vários modelos abertos via API TogetherAI. | [Configuração para executar com uma API](#configuração-para-executar-com-uma-api) |
---
## Solução de problemas
Se você encontrar problemas, esta seção fornece orientações.
# Problemas conhecidos
## Problemas do ChromeDriver
**Exemplo de erro:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### Causa raiz
A incompatibilidade de versão do ChromeDriver ocorre quando:
1. A versão do ChromeDriver que você instalou não corresponde à versão do navegador Chrome
2. Em ambientes Docker, `undetected_chromedriver` pode baixar sua própria versão do ChromeDriver, contornando os binários montados
### Etapas de solução
#### 1. Verifique sua versão do Chrome
Abra o Google Chrome → `Configurações > Sobre o Chrome` para encontrar sua versão (ex: "Versão 134.0.6998.88")
#### 2. Baixe o ChromeDriver correspondente
**Para Chrome 115 e superior:** Use [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/)
- Visite o painel de disponibilidade do Chrome for Testing
- Encontre sua versão do Chrome ou a correspondência disponível mais próxima
- Baixe o ChromeDriver para seu sistema operacional (use Linux64 para ambientes Docker)
**Para versões mais antigas do Chrome:** Use [Downloads legados do ChromeDriver](https://chromedriver.chromium.org/downloads)
![Baixar ChromeDriver do Chrome for Testing](./media/chromedriver_readme.png)
#### 3. Instale o ChromeDriver (escolha um método)
**Método A: Diretório raiz do projeto (recomendado para Docker)**
```bash
# Coloque o binário chromedriver baixado no diretório raiz do projeto
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # Torne-o executável no Linux/macOS
```
**Método B: PATH do sistema**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows: Coloque chromedriver.exe em uma pasta do PATH
```
#### 4. Verifique a instalação
```bash
# Teste a versão do ChromeDriver
./chromedriver --version
# Ou se estiver no PATH:
chromedriver --version
```
### Instruções específicas do Docker
⚠️ **Importante para usuários do Docker:**
- O método de montagem de volumes do Docker pode não funcionar com o modo furtivo (`undetected_chromedriver`)
- **Solução:** Coloque o ChromeDriver no diretório raiz do projeto como `./chromedriver`
- O aplicativo o detectará automaticamente e usará este binário
- Você deve ver nos logs: `"Using ChromeDriver from project root: ./chromedriver"`
### Dicas de solução de problemas
1. **Ainda há incompatibilidade de versão?**
- Verifique se o ChromeDriver é executável: `ls -la ./chromedriver`
- Verifique a versão do ChromeDriver: `./chromedriver --version`
- Certifique-se de que corresponde à versão do seu navegador Chrome
2. **Problemas com o contêiner Docker?**
- Verifique os logs do backend: `docker logs backend`
- Procure a mensagem: `"Using ChromeDriver from project root"`
- Se não for encontrado, verifique se o arquivo existe e é executável
3. **Versões do Chrome for Testing**
- Use uma correspondência exata quando possível
- Para a versão 134.0.6998.88, use o ChromeDriver 134.0.6998.165 (a versão disponível mais próxima)
- O número da versão principal deve corresponder (134 = 134)
### Matriz de compatibilidade de versões
| Versão do Chrome | Versão do ChromeDriver | Status |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ Disponível |
| 133.0.6943.x | 133.0.6943.141 | ✅ Disponível |
| 132.0.6834.x | 132.0.6834.159 | ✅ Disponível |
*Para a compatibilidade mais recente, consulte o [Painel do Chrome for Testing](https://googlechromelabs.github.io/chrome-for-testing/)*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
Isso acontece se seu navegador e a versão do chromedriver não corresponderem.
Você precisa navegar para baixar a versão mais recente:
https://developer.chrome.com/docs/chromedriver/downloads
Se você estiver usando o Chrome versão 115 ou superior, vá para:
https://googlechromelabs.github.io/chrome-for-testing/
e baixe a versão do chromedriver correspondente ao seu sistema operacional.
![alt text](./media/chromedriver_readme.png)
Se esta seção estiver incompleta, abra um issue.
## Problemas de adaptadores de conexão
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'` (nota: a porta pode variar)
```
* **Causa:** Falta o prefixo `http://` em `provider_server_address` para `lm-studio` (ou outro servidor local compatível com OpenAI semelhante) no `config.ini`, ou ele aponta para a porta errada.
* **Solução:**
* Certifique-se de que o endereço inclui `http://`. O LM-Studio geralmente usa `http://127.0.0.1:1234` por padrão.
* `config.ini` correto: `provider_server_address = http://127.0.0.1:1234` (ou sua porta real do servidor LM-Studio).
## URL base do SearxNG não fornecida
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
Isso pode acontecer se você executar o modo CLI com uma URL base do searxng incorreta.
SEARXNG_BASE_URL deve diferir dependendo se você está executando no Docker ou no host:
**Execução no host:** `SEARXNG_BASE_URL="http://localhost:8080"`
**Execução completamente no Docker (interface web):** `SEARXNG_BASE_URL="http://searxng:8080"`
## FAQ
**P: De qual hardware eu preciso?**
| Tamanho do modelo | GPU | Comentários |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB VRAM | ⚠️ Não recomendado. Desempenho ruim, alucinações frequentes, agentes de planejamento podem falhar. |
| 14B | 12 GB VRAM (ex: RTX 3060) | ✅ Utilizável para tarefas simples. Pode ter dificuldades com navegação web e planejamento de tarefas. |
| 32B | 24+ GB VRAM (ex: RTX 4090) | 🚀 Consegue a maioria das tarefas, ainda pode ter dificuldades com planejamento de tarefas |
| 70B+ | 48+ GB VRAM | 💪 Excelente. Recomendado para casos de uso avançados. |
**P: O que fazer se eu encontrar erros?**
Certifique-se de que o local está funcionando (`ollama serve`), que seu `config.ini` corresponde ao seu provedor e que as dependências estão instaladas. Se nada funcionar, sinta-se à vontade para abrir um issue.
**P: Ele pode realmente funcionar 100% localmente?**
Sim, com os provedores Ollama, lm-studio ou server, todos os modelos de fala para texto, LLM e texto para fala funcionam localmente. As opções não locais (OpenAI ou outras APIs) são opcionais.
**P: Por que eu deveria usar o AgenticSeek quando tenho o Manus?**
Ao contrário do Manus, o AgenticSeek prioriza a independência de sistemas externos, dando a você mais controle, privacidade e evitando custos de API.
**P: Quem está por trás deste projeto?**
Este projeto foi criado por mim, com dois amigos como mantenedores e contribuidores da comunidade de código aberto no GitHub. Somos apenas indivíduos apaixonados, não uma startup, nem afiliados a qualquer organização.
Qualquer conta AgenticSeek no X diferente da minha conta pessoal (https://x.com/Martin993886460) é um impostor.
## Contribuir
Estamos procurando desenvolvedores para melhorar o AgenticSeek! Verifique os problemas abertos ou discussões.
[Guia de contribuição](./docs/CONTRIBUTING.md)
## Patrocinadores:
Você quer melhorar as capacidades do AgenticSeek com recursos como pesquisa de voos, planejamento de viagens ou obtenção das melhores ofertas de compra? Considere usar o SerpApi para criar ferramentas personalizadas que desbloqueiem mais recursos do tipo Jarvis. Com o SerpApi, você pode acelerar seu agente para tarefas profissionais enquanto mantém o controle total.
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
Confira [Contributing.md](./docs/CONTRIBUTING.md) para aprender como integrar ferramentas personalizadas!
### **Patrocinadores**:
- [tatra-labs](https://github.com/tatra-labs)
## Mantenedores:
> [Fosowl](https://github.com/Fosowl) | Horário de Paris
> [antoineVIVIES](https://github.com/antoineVIVIES) | Horário de Taipei
## Agradecimentos especiais:
> [tcsenpai](https://github.com/tcsenpai) e [plitc](https://github.com/plitc) por ajudar na dockerização do backend
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
+692
View File
@@ -0,0 +1,692 @@
# AgenticSeek: Gizlilik Odaklı, Yerel Manus Alternatifi
<p align="center">
<img align="center" src="./media/agentic_seek_logo.png" width="300" height="300" alt="Agentic Seek Logo">
<p>
English | [中文](./README_CHS.md) | [繁體中文](./README_CHT.md) | [Français](./README_FR.md) | [日本語](./README_JP.md) | [Português (Brasil)](./README_PTBR.md) | [Español](./README_ES.md) | [Türkçe](./README_TR.md)
*Sesli komut destekli bu yapay zeka asistanı, **Manus AI'ya %100 yerel bir alternatiftir**. Web'de otonom olarak gezinir, kod yazar ve görevleri planlar; tüm verilerinizi cihazınızda tutar. Yerel akıl yürütme modelleri için tasarlanmış olup tamamen kendi donanımınızda çalışır, eksiksiz gizlilik ve sıfır bulut bağımlılığı sağlar.*
[![AgenticSeek'i Ziyaret Et](https://img.shields.io/static/v1?label=Website&message=AgenticSeek&color=blue&style=flat-square)](https://fosowl.github.io/agenticSeek.html) ![License](https://img.shields.io/badge/license-GPL--3.0-green) [![Discord](https://img.shields.io/badge/Discord-Join%20Us-7289DA?logo=discord&logoColor=white)](https://discord.gg/8hGDaME3TC) [![Twitter](https://img.shields.io/twitter/url/https/twitter.com/fosowl.svg?style=social&label=Update%20%40Fosowl)](https://x.com/Martin993886460) [![GitHub stars](https://img.shields.io/github/stars/Fosowl/agenticSeek?style=social)](https://github.com/Fosowl/agenticSeek/stargazers)
### Neden AgenticSeek?
* 🔒 Tamamen Yerel ve Gizli - Her şey kendi makinenizde çalışır — bulut yok, veri paylaşımı yok. Dosyalarınız, konuşmalarınız ve aramalarınız gizli kalır.
* 🌐 Akıllı Web Tarama - AgenticSeek internette kendi başına gezinebilir — arama yapar, okur, bilgi çıkarır, web formlarını doldurur — tamamen eller serbest.
* 💻 Otonom Kodlama Asistanı - Koda mı ihtiyacınız var? Python, C, Go, Java ve daha fazlasında program yazabilir, hata ayıklayabilir ve çalıştırabilir — denetim olmadan.
* 🧠 Akıllı Ajan Seçimi - Siz sorarsınız, o otomatik olarak iş için en uygun ajanı belirler. Elinizin altında uzmanlardan oluşan bir ekip gibi.
* 📋 Karmaşık Görevleri Planlar ve Yürütür - Seyahat planlamasından karmaşık projelere kadar — büyük görevleri adımlara bölebilir ve birden fazla yapay zeka ajanı kullanarak işleri tamamlayabilir.
* 🎙️ Ses Desteği - Temiz, hızlı, fütüristik ses ve konuşmadan metne dönüştürme ile bilim kurgu filmlerindeki kişisel yapay zekanızla konuşuyormuş gibi etkileşim kurabilirsiniz. (Geliştirme aşamasında)
### **Demo**
> *AgenticSeek projesini arayabilir misin, hangi becerilerin gerektiğini öğrenip ardından CV_candidates.zip dosyasını açarak projeye en uygun adayları söyleyebilir misin?*
https://github.com/user-attachments/assets/b8ca60e9-7b3b-4533-840e-08f9ac426316
Uyarı: Bu demo ve görünen tüm dosyalar (ör: CV_candidates.zip) tamamen kurgusaldır. Bir şirket değiliz, aday değil açık kaynak katkıda bulunanlar arıyoruz.
> 🛠⚠️ **Aktif Olarak Geliştirilmektedir**
> 🙏 Bu proje bir yan proje olarak başladı ve sıfır yol haritası, sıfır finansmanla geliştirilmektedir. GitHub Trending'e girerek beklentilerin çok ötesine geçti. Katkılar, geri bildirimler ve sabır derinden takdir edilmektedir.
## Ön Gereksinimler
Başlamadan önce aşağıdaki yazılımların yüklü olduğundan emin olun:
* **Git:** Depoyu klonlamak için. [Git İndir](https://git-scm.com/downloads)
* **Python 3.10.x:** Python 3.10.x sürümünü kullanmanızı şiddetle tavsiye ederiz. Diğer sürümler bağımlılık hatalarına yol açabilir. [Python 3.10 İndir](https://www.python.org/downloads/release/python-3100/) (3.10.x sürümünü seçin).
* **Docker Engine ve Docker Compose:** SearxNG gibi paketlenmiş servisleri çalıştırmak için.
* Docker Desktop yükleyin (Docker Compose V2 dahildir): [Windows](https://docs.docker.com/desktop/install/windows-install/) | [Mac](https://docs.docker.com/desktop/install/mac-install/) | [Linux](https://docs.docker.com/desktop/install/linux-install/)
* Alternatif olarak, Linux üzerinde Docker Engine ve Docker Compose'u ayrı ayrı yükleyin: [Docker Engine](https://docs.docker.com/engine/install/) | [Docker Compose](https://docs.docker.com/compose/install/) (Compose V2 yüklediğinizden emin olun, ör: `sudo apt-get install docker-compose-plugin`).
### 1. **Depoyu klonlayın ve kurulumu yapın**
```sh
git clone https://github.com/Fosowl/agenticSeek.git
cd agenticSeek
mv .env.example .env
```
### 2. .env dosyasının içeriğini değiştirin
```sh
SEARXNG_BASE_URL="http://searxng:8080" # CLI modunda çalıştırıyorsanız http://127.0.0.1:8080 kullanın
REDIS_BASE_URL="redis://redis:6379/0"
WORK_DIR="/Users/mlg/Documents/workspace_for_ai"
OLLAMA_PORT="11434"
LM_STUDIO_PORT="1234"
CUSTOM_ADDITIONAL_LLM_PORT="11435"
OPENAI_API_KEY='optional'
DEEPSEEK_API_KEY='optional'
OPENROUTER_API_KEY='optional'
TOGETHER_API_KEY='optional'
GOOGLE_API_KEY='optional'
ANTHROPIC_API_KEY='optional'
```
`.env` dosyasını ihtiyaçlarınıza göre güncelleyin:
- **SEARXNG_BASE_URL**: CLI modunda çalışmıyorsanız değiştirmeyin.
- **REDIS_BASE_URL**: Değiştirmeyin.
- **WORK_DIR**: Yerel makinenizdeki çalışma dizininin yolu. AgenticSeek bu dosyaları okuyabilir ve onlarla etkileşim kurabilir.
- **OLLAMA_PORT**: Ollama servisi için port numarası.
- **LM_STUDIO_PORT**: LM Studio servisi için port numarası.
- **CUSTOM_ADDITIONAL_LLM_PORT**: Ek özel LLM servisi için port.
**API anahtarları, LLM'yi yerel olarak çalıştırmayı tercih eden kullanıcılar için tamamen isteğe bağlıdır. Bu projenin birincil amacı da budur. Yeterli donanımınız varsa boş bırakın.**
### 3. **Docker'ı Başlatın**
Docker'ın sisteminizde yüklü ve çalışır durumda olduğundan emin olun. Docker'ı aşağıdaki komutlarla başlatabilirsiniz:
- **Linux/macOS:**
Terminal açın ve çalıştırın:
```sh
sudo systemctl start docker
```
Veya yüklüyse Docker Desktop'ı uygulama menüsünden başlatın.
- **Windows:**
Başlat menüsünden Docker Desktop'ı başlatın.
Docker'ın çalıştığını doğrulamak için:
```sh
docker info
```
Docker kurulumunuz hakkında bilgi görüyorsanız, düzgün çalışıyor demektir.
Özet için aşağıdaki [Yerel Sağlayıcılar](#yerel-sağlayıcılar-listesi) tablosuna bakın.
Sonraki adım: [AgenticSeek'i yerel olarak çalıştırın](#servisleri-başlatın-ve-çalıştırın)
*Sorun yaşıyorsanız [Sorun Giderme](#sorun-giderme) bölümüne bakın.*
*Donanımınız LLM'leri yerel olarak çalıştıramıyorsa [API ile Çalıştırma Kurulumu](#api-ile-çalıştırma-kurulumu) bölümüne bakın.*
*Ayrıntılı `config.ini` açıklamaları için [Yapılandırma](#yapılandırma) bölümüne bakın.*
---
## LLM'yi Makinenizde Yerel Olarak Çalıştırma Kurulumu
**Donanım Gereksinimleri:**
LLM'leri yerel olarak çalıştırmak için yeterli donanıma ihtiyacınız olacaktır. En azından Magistral, Qwen veya Deepseek 14B çalıştırabilecek bir GPU gereklidir. Ayrıntılı model/performans önerileri için SSS bölümüne bakın.
**Yerel sağlayıcınızı ayarlayın**
Yerel sağlayıcınızı başlatın (örneğin ollama ile):
AgenticSeek'i ana makinede (CLI modu) çalıştırmayacaksanız, sağlayıcı dinleme adresini ayarlayın:
```sh
export OLLAMA_HOST=0.0.0.0:11434
```
Ardından sağlayıcınızı başlatın:
```sh
ollama serve
```
Desteklenen yerel sağlayıcıların listesi için aşağıya bakın.
**config.ini dosyasını güncelleyin**
config.ini dosyasında provider_name'i desteklenen bir sağlayıcıya ve provider_model'i sağlayıcınızın desteklediği bir LLM'e ayarlayın. *Magistral* veya *Deepseek* gibi akıl yürütme modellerini öneriyoruz.
Gerekli donanım için README sonundaki **SSS** bölümüne bakın.
```sh
[MAIN]
is_local = True # Yerel mi yoksa uzak sağlayıcı ile mi çalıştırıyorsunuz.
provider_name = ollama # veya lm-studio, openai, vb.
provider_model = deepseek-r1:14b # donanımınıza uygun bir model seçin
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis # yapay zekanızın adı
recover_last_session = True # önceki oturumu kurtarıp kurtarmayacağı
save_session = True # mevcut oturumu hatırlayıp hatırlamayacağı
speak = False # metinden sese dönüştürme
listen = False # sesten metne dönüştürme, yalnızca CLI için, deneysel
jarvis_personality = False # daha "Jarvis" benzeri bir kişilik kullanıp kullanmayacağı (deneysel)
languages = en zh # Dil listesi, metinden sese varsayılan olarak listedeki ilk dili kullanır
[BROWSER]
headless_browser = True # CLI modunda değilseniz değiştirmeyin.
stealth_mode = True # Tarayıcı algılamasını azaltmak için gizli selenium kullanır
```
**Uyarı**:
- `config.ini` dosya biçimi yorum satırlarını desteklemez.
Örnek yapılandırmayı doğrudan kopyalayıp yapıştırmayın, çünkü yorum satırları hatalara neden olur. Bunun yerine `config.ini` dosyasını yorum satırları olmadan istediğiniz ayarlarla manuel olarak düzenleyin.
- LLM çalıştırmak için LM-studio kullanıyorsanız provider_name'i `openai` olarak *AYARLAMAYIN*. `lm-studio` olarak ayarlayın.
- Bazı sağlayıcılar (ör: lm-studio) IP'nin önünde `http://` gerektirir. Örneğin: `http://127.0.0.1:1234`
**Yerel Sağlayıcılar Listesi**
| Sağlayıcı | Yerel mi? | Açıklama |
|-----------|--------|-----------------------------------------------------------|
| ollama | Evet | Ollama kullanarak LLM'leri kolayca yerel olarak çalıştırın |
| lm-studio | Evet | LM Studio ile LLM'leri yerel olarak çalıştırın (`provider_name` değerini `lm-studio` olarak ayarlayın)|
| openai | Evet | OpenAI uyumlu API kullanın (ör: llama.cpp sunucusu) |
Sonraki adım: [Servisleri başlatın ve AgenticSeek'i çalıştırın](#servisleri-başlatın-ve-çalıştırın)
*Sorun yaşıyorsanız [Sorun Giderme](#sorun-giderme) bölümüne bakın.*
*Donanımınız LLM'leri yerel olarak çalıştıramıyorsa [API ile Çalıştırma Kurulumu](#api-ile-çalıştırma-kurulumu) bölümüne bakın.*
*Ayrıntılı `config.ini` açıklamaları için [Yapılandırma](#yapılandırma) bölümüne bakın.*
## API ile Çalıştırma Kurulumu
Bu kurulum harici, bulut tabanlı LLM sağlayıcılarını kullanır. Seçtiğiniz servisten bir API anahtarına ihtiyacınız olacaktır.
**1. Bir API Sağlayıcısı Seçin ve API Anahtarı Alın:**
Aşağıdaki [API Sağlayıcıları Listesi](#api-sağlayıcıları-listesi) bölümüne bakın. Kaydolmak ve API anahtarı almak için web sitelerini ziyaret edin.
**2. API Anahtarınızı Ortam Değişkeni Olarak Ayarlayın:**
* **Linux/macOS:**
Terminal açın ve `export` komutunu kullanın. Kalıcılık için bunu shell profil dosyanıza (ör: `~/.bashrc`, `~/.zshrc`) eklemeniz önerilir.
```sh
export PROVIDER_API_KEY="api_anahtarınız"
# PROVIDER_API_KEY'i ilgili değişken adıyla değiştirin, ör: OPENAI_API_KEY, GOOGLE_API_KEY
```
TogetherAI örneği:
```sh
export TOGETHER_API_KEY="xxxxxxxxxxxxxxxxxxxxxx"
```
* **Windows:**
* **Komut İstemi (Geçerli oturum için geçici):**
```cmd
set PROVIDER_API_KEY=api_anahtarınız
```
* **PowerShell (Geçerli oturum için geçici):**
```powershell
$env:PROVIDER_API_KEY="api_anahtarınız"
```
* **Kalıcı:** Windows arama çubuğunda "ortam değişkenleri" arayın, "Sistem ortam değişkenlerini düzenle" seçeneğine tıklayın, ardından "Ortam Değişkenleri..." düğmesine tıklayın. Uygun adla (ör: `OPENAI_API_KEY`) yeni bir Kullanıcı değişkeni ekleyin ve değer olarak anahtarınızı girin.
*(Daha fazla ayrıntı için SSS: [API anahtarlarını nasıl ayarlarım?](#api-anahtarlarını-nasıl-ayarlarım) bölümüne bakın.)*
**3. `config.ini` Dosyasını Güncelleyin:**
```ini
[MAIN]
is_local = False
provider_name = openai # Veya google, deepseek, togetherAI, huggingface
provider_model = gpt-3.5-turbo # Veya gemini-1.5-flash, deepseek-chat, mistralai/Mixtral-8x7B-Instruct-v0.1 vb.
provider_server_address = # is_local = False olduğunda çoğu API için genellikle yok sayılır veya boş bırakılabilir
# ... diğer ayarlar ...
```
*Uyarı:* config.ini değerlerinin sonunda boşluk olmadığından emin olun.
**API Sağlayıcıları Listesi**
| Sağlayıcı | `provider_name` | Yerel mi? | Açıklama | API Anahtarı Bağlantısı (Örnekler) |
|--------------|-----------------|--------|---------------------------------------------------|---------------------------------------------|
| OpenAI | `openai` | Hayır | OpenAI API'si üzerinden ChatGPT modellerini kullanın. | [platform.openai.com/signup](https://platform.openai.com/signup) |
| Google Gemini| `google` | Hayır | Google AI Studio üzerinden Google Gemini modellerini kullanın. | [aistudio.google.com/keys](https://aistudio.google.com/keys) |
| Deepseek | `deepseek` | Hayır | Deepseek API'si üzerinden Deepseek modellerini kullanın. | [platform.deepseek.com](https://platform.deepseek.com) |
| Hugging Face | `huggingface` | Hayır | Hugging Face Inference API'den modelleri kullanın. | [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens) |
| TogetherAI | `togetherAI` | Hayır | TogetherAI API'si üzerinden çeşitli açık kaynak modelleri kullanın.| [api.together.ai/settings/api-keys](https://api.together.ai/settings/api-keys) |
| OpenRouter | `openrouter` | Hayır | OpenRouter Modellerini kullanın| [https://openrouter.ai/](https://openrouter.ai/) |
*Not:*
* Karmaşık web tarama ve görev planlama için `gpt-4o` veya diğer OpenAI modellerini kullanmanızı önermiyoruz, çünkü mevcut prompt optimizasyonları Deepseek gibi modellere yöneliktir.
* Kodlama/bash görevleri Gemini ile sorun yaşayabilir, çünkü Deepseek için optimize edilmiş biçimlendirme talimatlarına kesinlikle uymayabilir.
* `is_local = False` olduğunda `config.ini` içindeki `provider_server_address` genellikle kullanılmaz, çünkü API uç noktaları genellikle ilgili sağlayıcı kütüphanesinde sabit kodlanmıştır.
Sonraki adım: [Servisleri başlatın ve AgenticSeek'i çalıştırın](#servisleri-başlatın-ve-çalıştırın)
*Sorun yaşıyorsanız **Bilinen Sorunlar** bölümüne bakın*
*Ayrıntılı yapılandırma dosyası açıklamaları için **Yapılandırma** bölümüne bakın.*
---
## Servisleri Başlatın ve Çalıştırın
Varsayılan olarak AgenticSeek tamamen Docker içinde çalıştırılır.
**Seçenek 1:** Docker'da çalıştırın, web arayüzünü kullanın:
Gerekli servisleri başlatın. Bu, docker-compose.yml'deki tüm servisleri başlatacaktır:
- searxng
- redis (searxng için gerekli)
- frontend
- backend (web arayüzü kullanırken `full` parametresi ile)
```sh
./start_services.sh full # MacOS
start start_services.cmd full # Windows
```
**Uyarı:** Bu adım tüm Docker imajlarını indirip yükleyecektir, bu işlem 30 dakikaya kadar sürebilir. Servisleri başlattıktan sonra, herhangi bir mesaj göndermeden önce backend servisinin tamamen çalışır duruma gelmesini bekleyin (loglarda **backend: "GET /health HTTP/1.1" 200 OK** mesajını görmelisiniz). İlk çalıştırmada backend servisinin başlaması 5 dakika sürebilir.
`http://localhost:3000/` adresine gidin ve web arayüzünü görmelisiniz.
*Servis başlatma sorun giderme:* Bu betikler başarısız olursa, Docker Engine'in çalıştığından ve Docker Compose'un (V2, `docker compose`) doğru şekilde yüklendiğinden emin olun. Hata mesajları için terminal çıktısını kontrol edin. Bkz. [SSS: AgenticSeek'i veya betiklerini çalıştırırken hata alıyorum.](#sss-sorun-giderme)
**Seçenek 2:** CLI modu:
CLI arayüzü ile çalıştırmak için paketleri ana makineye yüklemeniz gerekir:
```sh
./install.sh
./install.bat # windows
```
Ardından `config.ini` içindeki SEARXNG_BASE_URL değerini şu şekilde değiştirmelisiniz:
```sh
SEARXNG_BASE_URL="http://localhost:8080"
```
Gerekli servisleri başlatın. Bu, docker-compose.yml'deki bazı servisleri başlatacaktır:
- searxng
- redis (searxng için gerekli)
- frontend
```sh
./start_services.sh # MacOS
start start_services.cmd # Windows
```
Çalıştırın: `uv run python -m ensurepip` komutu ile uv'nin pip'i etkin olduğundan emin olun.
CLI'yi kullanın: `uv run cli.py`
---
## Kullanım
Servislerin `./start_services.sh full` ile çalıştığından emin olun ve web arayüzü için `localhost:3000` adresine gidin.
Yapılandırmada `listen = True` ayarlayarak konuşmadan metne dönüştürmeyi de kullanabilirsiniz. Yalnızca CLI modu için.
Çıkmak için `goodbye` yazın/söyleyin.
İşte bazı kullanım örnekleri:
> *Python'da bir yılan oyunu yap!*
> *Rennes, Fransa'daki en iyi kafeleri internette ara ve adres bilgileriyle birlikte üçünü rennes_cafes.txt dosyasına kaydet.*
> *Bir sayının faktöriyelini hesaplayan bir Go programı yaz, çalışma alanına factorial.go olarak kaydet*
> *summer_pictures klasöründeki tüm JPG dosyalarını ara, bugünün tarihiyle yeniden adlandır ve yeniden adlandırılan dosyaların listesini photos_list.txt dosyasına kaydet*
> *2024'ün popüler bilim kurgu filmlerini internette ara ve bu gece izlemek için üçünü seç. Listeyi movie_night.txt dosyasına kaydet.*
> *2025'in en son yapay zeka haberleri makalelerini internette ara, üçünü seç ve başlıklarını ve özetlerini kazımak için bir Python betiği yaz. Betiği news_scraper.py olarak ve özetleri /home/projects içinde ai_news.txt olarak kaydet*
> *Cuma, internette ücretsiz bir hisse senedi fiyat API'si ara, supersuper7434567@gmail.com ile kaydol ve ardından API'yi kullanarak Tesla'nın günlük fiyatlarını çekmek için bir Python betiği yaz, sonuçları stock_prices.csv dosyasına kaydet*
*Form doldurma yeteneklerinin hâlâ deneysel olduğunu ve başarısız olabileceğini unutmayın.*
Sorgunuzu yazdıktan sonra AgenticSeek göreve en uygun ajanı atayacaktır.
Bu erken bir prototip olduğundan, ajan yönlendirme sistemi sorgunuza göre her zaman doğru ajanı atamayabilir.
Bu nedenle, ne istediğiniz ve yapay zekanın nasıl ilerlemesi gerektiği konusunda çok açık olun. Örneğin, web araması yapmasını istiyorsanız şunu demeyin:
`Solo seyahat için iyi ülkeler biliyor musun?`
Bunun yerine şöyle sorun:
`Web araması yap ve solo seyahat için en iyi ülkeleri bul`
---
## **LLM'yi Kendi Sunucunuzda Çalıştırma Kurulumu**
Güçlü bir bilgisayarınız veya kullanabileceğiniz bir sunucunuz varsa, ancak dizüstü bilgisayarınızdan kullanmak istiyorsanız, özel LLM sunucumuzu kullanarak LLM'yi uzak bir sunucuda çalıştırma seçeneğiniz vardır.
Yapay zeka modelini çalıştıracak "sunucunuzda" IP adresini alın
```sh
ip a | grep "inet " | grep -v 127.0.0.1 | awk '{print $2}' | cut -d/ -f1 # yerel IP
curl https://ipinfo.io/ip # genel IP
```
Not: Windows veya macOS için IP adresini bulmak üzere sırasıyla ipconfig veya ifconfig kullanın.
Depoyu klonlayın ve `server/` klasörüne girin.
```sh
git clone --depth 1 https://github.com/Fosowl/agenticSeek.git
cd agenticSeek/llm_server/
```
Sunucuya özel gereksinimleri yükleyin:
```sh
pip3 install -r requirements.txt
```
Sunucu betiğini çalıştırın.
```sh
python3 app.py --provider ollama --port 3333
```
LLM servisi olarak `ollama` veya `llamacpp` arasında seçim yapabilirsiniz.
Şimdi kişisel bilgisayarınızda:
`config.ini` dosyasında `provider_name` değerini `server` ve `provider_model` değerini `deepseek-r1:xxb` olarak ayarlayın.
`provider_server_address` değerini modeli çalıştıracak makinenin IP adresine ayarlayın.
```sh
[MAIN]
is_local = False
provider_name = server
provider_model = deepseek-r1:70b
provider_server_address = http://x.x.x.x:3333
```
Sonraki adım: [Servisleri başlatın ve AgenticSeek'i çalıştırın](#servisleri-başlatın-ve-çalıştırın)
---
## Konuşmadan Metne
Uyarı: Konuşmadan metne özelliği şu anda yalnızca CLI modunda çalışmaktadır.
Konuşmadan metne özelliğinin şu anda yalnızca İngilizce dilinde çalıştığını lütfen unutmayın.
Konuşmadan metne işlevi varsayılan olarak devre dışıdır. Etkinleştirmek için config.ini dosyasında listen seçeneğini True olarak ayarlayın:
```
listen = True
```
Etkinleştirildiğinde, konuşmadan metne özelliği girdinizi işlemeye başlamadan önce bir tetikleyici anahtar kelimeyi (ajanın adı) dinler. Ajanın adını *config.ini* dosyasındaki `agent_name` değerini güncelleyerek özelleştirebilirsiniz:
```
agent_name = Friday
```
En iyi tanıma performansı için ajan adı olarak "John" veya "Emma" gibi yaygın bir İngilizce isim kullanmanızı öneririz.
Transkript görünmeye başladığında, uyandırmak için ajanın adını yüksek sesle söyleyin (ör: "Friday").
Sorgunuzu net bir şekilde söyleyin.
Sisteme devam etmesi gerektiğini bildirmek için isteğinizi bir onay ifadesiyle bitirin. Onay ifadesi örnekleri:
```
"do it", "go ahead", "execute", "run", "start", "thanks", "would ya", "please", "okay?", "proceed", "continue", "go on", "do that", "go it", "do you understand?"
```
## Yapılandırma
Örnek yapılandırma:
```
[MAIN]
is_local = True
provider_name = ollama
provider_model = deepseek-r1:32b
provider_server_address = http://127.0.0.1:11434 # Ollama örneği; LM-Studio için http://127.0.0.1:1234 kullanın
agent_name = Friday
recover_last_session = False
save_session = False
speak = False
listen = False
jarvis_personality = False
languages = en zh # TTS ve potansiyel yönlendirme için dil listesi.
[BROWSER]
headless_browser = False
stealth_mode = False
```
**`config.ini` Ayarlarının Açıklaması**:
* **`[MAIN]` Bölümü:**
* `is_local`: Yerel LLM sağlayıcısı (Ollama, LM-Studio, yerel OpenAI uyumlu sunucu) veya kendi barındırdığınız sunucu seçeneğini kullanıyorsanız `True`. Bulut tabanlı API (OpenAI, Google, vb.) kullanıyorsanız `False`.
* `provider_name`: LLM sağlayıcısını belirtir.
* Yerel seçenekler: `ollama`, `lm-studio`, `openai` (yerel OpenAI uyumlu sunucular için), `server` (kendi barındırdığınız sunucu kurulumu için).
* API seçenekleri: `openai`, `google`, `deepseek`, `huggingface`, `togetherAI`.
* `provider_model`: Seçilen sağlayıcı için belirli model adı veya kimliği (ör: Ollama için `deepseekcoder:6.7b`, OpenAI API için `gpt-3.5-turbo`, TogetherAI için `mistralai/Mixtral-8x7B-Instruct-v0.1`).
* `provider_server_address`: LLM sağlayıcınızın adresi.
* Yerel sağlayıcılar için: ör: Ollama için `http://127.0.0.1:11434`, LM-Studio için `http://127.0.0.1:1234`.
* `server` sağlayıcı türü için: Kendi barındırdığınız LLM sunucunuzun adresi (ör: `http://sunucu_ip_adresiniz:3333`).
* Bulut API'leri (`is_local = False`) için: Genellikle yok sayılır veya boş bırakılabilir, çünkü API uç noktası genellikle istemci kütüphanesi tarafından işlenir.
* `agent_name`: Yapay zeka asistanının adı (ör: Friday). Etkinleştirilmişse konuşmadan metne için tetikleyici kelime olarak kullanılır.
* `recover_last_session`: Önceki oturumun durumunu kurtarmaya çalışmak için `True`, yeni başlamak için `False`.
* `save_session`: Mevcut oturumun durumunu olası kurtarma için kaydetmek için `True`, aksi takdirde `False`.
* `speak`: Metinden sese sesli çıktıyı etkinleştirmek için `True`, devre dışı bırakmak için `False`.
* `listen`: Konuşmadan metne sesli girdiyi etkinleştirmek için `True` (yalnızca CLI modu), devre dışı bırakmak için `False`.
* `work_dir`: **Kritik:** AgenticSeek'in dosya okuyacağı/yazacağı dizin. **Bu yolun sisteminizde geçerli ve erişilebilir olduğundan emin olun.**
* `jarvis_personality`: Daha "Jarvis-benzeri" bir sistem istemi kullanmak için `True` (deneysel), standart istem için `False`.
* `languages`: Virgülle ayrılmış dil listesi (ör: `en, zh, fr`). TTS ses seçimi için kullanılır (varsayılan olarak ilki) ve LLM yönlendiricisine yardımcı olabilir. Yönlendirici verimliliği için çok fazla veya çok benzer dil kullanmaktan kaçının.
* **`[BROWSER]` Bölümü:**
* `headless_browser`: Otomatik tarayıcıyı görünür pencere olmadan çalıştırmak için `True` (web arayüzü veya etkileşimsiz kullanım için önerilir). Tarayıcı penceresini göstermek için `False` (CLI modu veya hata ayıklama için kullanışlıdır).
* `stealth_mode`: Tarayıcı otomasyonunun tespit edilmesini zorlaştıran önlemleri etkinleştirmek için `True`. Anticaptcha gibi tarayıcı eklentilerinin manuel olarak yüklenmesini gerektirebilir.
Bu bölüm desteklenen LLM sağlayıcı türlerini özetler. `config.ini` dosyasında yapılandırın.
**Yerel Sağlayıcılar (Kendi Donanımınızda Çalışır):**
| `config.ini`'deki Sağlayıcı Adı | `is_local` | Açıklama | Kurulum Bölümü |
|-------------------------------|------------|-----------------------------------------------------------------------------|------------------------------------------------------------------|
| `ollama` | `True` | Ollama kullanarak yerel LLM'leri sunun. | [LLM'yi yerel olarak çalıştırma kurulumu](#llmyi-makinenizde-yerel-olarak-çalıştırma-kurulumu) |
| `lm-studio` | `True` | LM-Studio kullanarak yerel LLM'leri sunun. | [LLM'yi yerel olarak çalıştırma kurulumu](#llmyi-makinenizde-yerel-olarak-çalıştırma-kurulumu) |
| `openai` (yerel sunucu için) | `True` | OpenAI uyumlu API sunan yerel bir sunucuya bağlanın (ör: llama.cpp). | [LLM'yi yerel olarak çalıştırma kurulumu](#llmyi-makinenizde-yerel-olarak-çalıştırma-kurulumu) |
| `server` | `False` | Başka bir makinede çalışan AgenticSeek kendi barındırmalı LLM sunucusuna bağlanın. | [LLM'yi kendi sunucunuzda çalıştırma kurulumu](#llmyi-kendi-sunucunuzda-çalıştırma-kurulumu) |
**API Sağlayıcıları (Bulut Tabanlı):**
| `config.ini`'deki Sağlayıcı Adı | `is_local` | Açıklama | Kurulum Bölümü |
|-------------------------------|------------|--------------------------------------------------|-----------------------------------------------------|
| `openai` | `False` | OpenAI'ın resmi API'sini kullanın (ör: GPT-3.5, GPT-4). | [API ile çalıştırma kurulumu](#api-ile-çalıştırma-kurulumu) |
| `google` | `False` | Google Gemini modellerini API üzerinden kullanın. | [API ile çalıştırma kurulumu](#api-ile-çalıştırma-kurulumu) |
| `deepseek` | `False` | Deepseek'in resmi API'sini kullanın. | [API ile çalıştırma kurulumu](#api-ile-çalıştırma-kurulumu) |
| `huggingface` | `False` | Hugging Face Inference API'yi kullanın. | [API ile çalıştırma kurulumu](#api-ile-çalıştırma-kurulumu) |
| `togetherAI` | `False` | TogetherAI API'si üzerinden çeşitli açık modelleri kullanın. | [API ile çalıştırma kurulumu](#api-ile-çalıştırma-kurulumu) |
---
## Sorun Giderme
Sorunlarla karşılaşırsanız bu bölüm rehberlik sağlar.
# Bilinen Sorunlar
## ChromeDriver Sorunları
**Hata Örneği:** `SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version XXX`
### Temel Neden
ChromeDriver sürüm uyumsuzluğu şu durumlarda oluşur:
1. Yüklü ChromeDriver sürümünüz Chrome tarayıcı sürümünüzle eşleşmiyor
2. Docker ortamlarında `undetected_chromedriver`, bağlanan ikili dosyayı atlayarak kendi ChromeDriver sürümünü indirebilir
### Çözüm Adımları
#### 1. Chrome Sürümünüzü Kontrol Edin
Google Chrome'u açın → `Ayarlar > Chrome Hakkında` bölümünden sürümünüzü bulun (ör: "Sürüm 134.0.6998.88")
#### 2. Eşleşen ChromeDriver'ı İndirin
**Chrome 115 ve sonrası için:** [Chrome for Testing API](https://googlechromelabs.github.io/chrome-for-testing/) kullanın
- Chrome for Testing uygunluk panosunu ziyaret edin
- Chrome sürümünüzü veya en yakın eşleşmeyi bulun
- İşletim sisteminiz için ChromeDriver'ı indirin (Docker ortamları için Linux64)
**Eski Chrome sürümleri için:** [Eski ChromeDriver indirmeleri](https://chromedriver.chromium.org/downloads) kullanın
![Chrome for Testing'den ChromeDriver İndirin](./media/chromedriver_readme.png)
#### 3. ChromeDriver'ı Yükleyin (Bir Yöntem Seçin)
**Yöntem A: Proje Kök Dizini (Docker için Önerilir)**
```bash
# İndirilen chromedriver ikili dosyasını proje kök dizinine yerleştirin
cp path/to/downloaded/chromedriver ./chromedriver
chmod +x ./chromedriver # Linux/macOS'ta çalıştırılabilir yapın
```
**Yöntem B: Sistem PATH'i**
```bash
# Linux/macOS
sudo mv chromedriver /usr/local/bin/
sudo chmod +x /usr/local/bin/chromedriver
# Windows: chromedriver.exe dosyasını PATH'inizdeki bir klasöre yerleştirin
```
#### 4. Kurulumu Doğrulayın
```bash
# ChromeDriver sürümünü test edin
./chromedriver --version
# Veya PATH'teyse:
chromedriver --version
```
### Docker'a Özel Notlar
⚠️ **Docker Kullanıcıları İçin Önemli:**
- Docker volume mount yaklaşımı gizli modda (`undetected_chromedriver`) çalışmayabilir
- **Çözüm**: ChromeDriver'ı proje kök dizinine `./chromedriver` olarak yerleştirin
- Uygulama bu ikili dosyayı otomatik olarak algılayıp kullanacaktır
- Loglarda şunu görmelisiniz: `"Using ChromeDriver from project root: ./chromedriver"`
### Sorun Giderme İpuçları
1. **Hâlâ sürüm uyumsuzluğu mu var?**
- ChromeDriver'ın çalıştırılabilir olduğunu doğrulayın: `ls -la ./chromedriver`
- ChromeDriver sürümünü kontrol edin: `./chromedriver --version`
- Chrome tarayıcı sürümünüzle eşleştiğinden emin olun
2. **Docker container sorunları mı var?**
- Backend loglarını kontrol edin: `docker logs backend`
- Şu mesajı arayın: `"Using ChromeDriver from project root"`
- Bulunamazsa dosyanın var olduğunu ve çalıştırılabilir olduğunu doğrulayın
3. **Chrome for Testing sürümleri**
- Mümkün olduğunca tam sürüm eşleşmesi kullanın
- 134.0.6998.88 sürümü için ChromeDriver 134.0.6998.165 kullanın (en yakın mevcut sürüm)
- Ana sürüm numaraları eşleşmelidir (134 = 134)
### Sürüm Uyumluluk Matrisi
| Chrome Sürümü | ChromeDriver Sürümü | Durum |
|----------------|---------------------|---------|
| 134.0.6998.x | 134.0.6998.165 | ✅ Çalışır |
| 133.0.6943.x | 133.0.6943.141 | ✅ Çalışır |
| 132.0.6834.x | 132.0.6834.159 | ✅ Çalışır |
*En güncel uyumluluk için [Chrome for Testing panosunu](https://googlechromelabs.github.io/chrome-for-testing/) kontrol edin*
`Exception: Failed to initialize browser: Message: session not created: This version of ChromeDriver only supports Chrome version 113
Current browser version is 134.0.6998.89 with binary path`
Bu hata, tarayıcınız ve chromedriver sürümü arasında uyumsuzluk varsa oluşur.
En son sürümü indirmek için şu adrese gidin:
https://developer.chrome.com/docs/chromedriver/downloads
Chrome sürüm 115 veya daha yenisini kullanıyorsanız:
https://googlechromelabs.github.io/chrome-for-testing/
adresinden işletim sisteminize uygun chromedriver sürümünü indirin.
![alt text](./media/chromedriver_readme.png)
Bu bölüm eksikse lütfen bir issue açın.
## Bağlantı Adaptörü Sorunları
```
Exception: Provider lm-studio failed: HTTP request failed: No connection adapters were found for '127.0.0.1:1234/v1/chat/completions'` (Not: port değişebilir)
```
* **Neden:** `config.ini` dosyasında `lm-studio` (veya benzeri yerel OpenAI uyumlu sunucular) için `provider_server_address` değerinde `http://` öneki eksik veya yanlış porta yönlendiriliyor.
* **Çözüm:**
* Adresin `http://` içerdiğinden emin olun. LM-Studio varsayılan olarak genellikle `http://127.0.0.1:1234` kullanır.
* Doğru `config.ini`: `provider_server_address = http://127.0.0.1:1234` (veya gerçek LM-Studio sunucu portunuz).
## SearxNG Temel URL'si Belirtilmemiş
```
raise ValueError("SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.")
ValueError: SearxNG base URL must be provided either as an argument or via the SEARXNG_BASE_URL environment variable.`
```
Bu hata, CLI modunu yanlış SearxNG temel URL'si ile çalıştırdığınızda oluşabilir.
SEARXNG_BASE_URL, Docker'da mı yoksa ana makinede mi çalıştırdığınıza göre değişmelidir:
**Ana makinede çalıştırma**: `SEARXNG_BASE_URL="http://localhost:8080"`
**Tamamen Docker'da çalıştırma (web arayüzü)**: `SEARXNG_BASE_URL="http://searxng:8080"`
## SSS
**S: Hangi donanıma ihtiyacım var?**
| Model Boyutu | GPU | Yorum |
|-----------|--------|-----------------------------------------------------------|
| 7B | 8GB VRAM | ⚠️ Önerilmez. Düşük performans, sık halüsinasyonlar ve planlayıcı ajanlar büyük olasılıkla başarısız olur. |
| 14B | 12 GB VRAM (ör: RTX 3060) | ✅ Basit görevler için kullanılabilir. Web tarama ve planlama görevlerinde zorlanabilir. |
| 32B | 24+ GB VRAM (ör: RTX 4090) | 🚀 Çoğu görevde başarılı, görev planlamasında hâlâ zorlanabilir |
| 70B+ | 48+ GB VRAM | 💪 Mükemmel. Gelişmiş kullanım senaryoları için önerilir. |
**S: Hata alıyorum, ne yapmalıyım?**
Yerel sunucunun çalıştığından (`ollama serve`), `config.ini` dosyanızın sağlayıcınızla eşleştiğinden ve bağımlılıkların yüklü olduğundan emin olun. Hiçbiri işe yaramazsa bir issue açmaktan çekinmeyin.
**S: Gerçekten %100 yerel çalışabilir mi?**
Evet, Ollama, lm-studio veya server sağlayıcıları ile tüm konuşmadan metne, LLM ve metinden sese modelleri yerel olarak çalışır. Yerel olmayan seçenekler (OpenAI veya diğer API'ler) isteğe bağlıdır.
**S: Manus varken neden AgenticSeek kullanmalıyım?**
Manus'un aksine, AgenticSeek harici sistemlerden bağımsızlığa öncelik verir, size daha fazla kontrol, gizlilik ve API maliyetinden kaçınma imkânı sunar.
**S: Projenin arkasında kim var?**
Proje benim tarafımdan, bakımcı olarak görev yapan iki arkadaşım ve GitHub'daki açık kaynak topluluğundan katkıda bulunanlarla birlikte oluşturuldu. Bir startup veya herhangi bir kuruluşla bağlantılı değiliz, sadece tutkulu bireylerden oluşan bir grubuz.
X'te kişisel hesabım (https://x.com/Martin993886460) dışındaki herhangi bir AgenticSeek hesabı taklittir.
## Katkıda Bulunma
AgenticSeek'i geliştirmek için geliştiriciler arıyoruz! Açık issue'lara veya tartışmalara göz atın.
[Katkıda bulunma rehberi](./docs/CONTRIBUTING.md)
## Sponsorlar:
AgenticSeek'in yeteneklerini uçuş arama, seyahat planlama veya en iyi alışveriş fırsatlarını yakalama gibi özelliklerle geliştirmek ister misiniz? Daha fazla Jarvis benzeri yetenek açmak için SerpApi ile özel bir araç oluşturmayı düşünün. SerpApi ile, tam kontrolü elinizde tutarken ajanınızı özel görevler için güçlendirebilirsiniz.
<a href="https://serpapi.com/"><img src="./media/banners/sponsor_banner_serpapi.png" height="350" alt="SerpApi Banner" ></a>
Özel araçları nasıl entegre edeceğinizi öğrenmek için [Contributing.md](./docs/CONTRIBUTING.md) dosyasına bakın!
### **Patron Sponsor**:
- [tatra-labs](https://github.com/tatra-labs)
## Bakımcılar:
> [Fosowl](https://github.com/Fosowl) | Paris Saati
> [antoineVIVIES](https://github.com/antoineVIVIES) | Taipei Saati
## Özel Teşekkürler:
> [tcsenpai](https://github.com/tcsenpai) ve [plitc](https://github.com/plitc) Backend dockerizasyonuna yardımları için
[![Star History Chart](https://api.star-history.com/svg?repos=Fosowl/agenticSeek&type=Date)](https://www.star-history.com/#Fosowl/agenticSeek&Date)
Executable
+302
View File
@@ -0,0 +1,302 @@
#!/usr/bin/env python3
import os, sys
import uvicorn
import aiofiles
import configparser
import asyncio
import time
from typing import List
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from fastapi.responses import FileResponse
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
import uuid
from sources.llm_provider import Provider
from sources.interaction import Interaction
from sources.agents import CasualAgent, CoderAgent, FileAgent, PlannerAgent, BrowserAgent
from sources.browser import Browser, create_driver
from sources.utility import pretty_print
from sources.logger import Logger
from sources.schemas import QueryRequest, QueryResponse
from dotenv import load_dotenv
load_dotenv()
def is_running_in_docker():
"""Detect if code is running inside a Docker container."""
# Method 1: Check for .dockerenv file
if os.path.exists('/.dockerenv'):
return True
# Method 2: Check cgroup
try:
with open('/proc/1/cgroup', 'r') as f:
return 'docker' in f.read()
except:
pass
return False
from celery import Celery
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')
api.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
if not os.path.exists(".screenshots"):
os.makedirs(".screenshots")
api.mount("/screenshots", StaticFiles(directory=".screenshots"), name="screenshots")
def initialize_system():
stealth_mode = config.getboolean('BROWSER', 'stealth_mode')
personality_folder = "jarvis" if config.getboolean('MAIN', 'jarvis_personality') else "base"
languages = config["MAIN"]["languages"].split(' ')
# Force headless mode in Docker containers
headless = config.getboolean('BROWSER', 'headless_browser')
if is_running_in_docker() and not headless:
# Print prominent warning to console (visible in docker-compose output)
print("\n" + "*" * 70)
print("*** WARNING: Detected Docker environment - forcing headless_browser=True ***")
print("*** INFO: To see the browser, run 'python cli.py' on your host machine ***")
print("*" * 70 + "\n")
# Flush to ensure it's displayed immediately
sys.stdout.flush()
# Also log to file
logger.warning("Detected Docker environment - forcing headless_browser=True")
logger.info("To see the browser, run 'python cli.py' on your host machine instead")
headless = True
provider = Provider(
provider_name=config["MAIN"]["provider_name"],
model=config["MAIN"]["provider_model"],
server_address=config["MAIN"]["provider_server_address"],
is_local=config.getboolean('MAIN', 'is_local')
)
logger.info(f"Provider initialized: {provider.provider_name} ({provider.model})")
browser = Browser(
create_driver(headless=headless, stealth_mode=stealth_mode, lang=languages[0]),
anticaptcha_manual_install=stealth_mode
)
logger.info("Browser initialized")
agents = [
CasualAgent(
name=config["MAIN"]["agent_name"],
prompt_path=f"prompts/{personality_folder}/casual_agent.txt",
provider=provider, verbose=False
),
CoderAgent(
name="coder",
prompt_path=f"prompts/{personality_folder}/coder_agent.txt",
provider=provider, verbose=False
),
FileAgent(
name="File Agent",
prompt_path=f"prompts/{personality_folder}/file_agent.txt",
provider=provider, verbose=False
),
BrowserAgent(
name="Browser",
prompt_path=f"prompts/{personality_folder}/browser_agent.txt",
provider=provider, verbose=False, browser=browser
),
PlannerAgent(
name="Planner",
prompt_path=f"prompts/{personality_folder}/planner_agent.txt",
provider=provider, verbose=False, browser=browser
)
]
logger.info("Agents initialized")
interaction = Interaction(
agents,
tts_enabled=config.getboolean('MAIN', 'speak'),
stt_enabled=config.getboolean('MAIN', 'listen'),
recover_last_session=config.getboolean('MAIN', 'recover_last_session'),
langs=languages
)
logger.info("Interaction initialized")
return interaction
interaction = initialize_system()
is_generating = False
query_resp_history = []
@api.get("/screenshot")
async def get_screenshot():
logger.info("Screenshot endpoint called")
screenshot_path = ".screenshots/updated_screen.png"
if os.path.exists(screenshot_path):
return FileResponse(screenshot_path)
logger.error("No screenshot available")
return JSONResponse(
status_code=404,
content={"error": "No screenshot available"}
)
@api.get("/health")
async def health_check():
logger.info("Health check endpoint called")
return {"status": "healthy", "version": "0.1.0"}
@api.get("/is_active")
async def is_active():
logger.info("Is active endpoint called")
return {"is_active": interaction.is_active}
@api.get("/stop")
async def stop():
logger.info("Stop endpoint called")
interaction.current_agent.request_stop()
return JSONResponse(status_code=200, content={"status": "stopped"})
@api.get("/latest_answer")
async def get_latest_answer():
global query_resp_history
if interaction.current_agent is None:
return JSONResponse(status_code=404, content={"error": "No agent available"})
uid = str(uuid.uuid4())
if not any(q["answer"] == interaction.current_agent.last_answer for q in query_resp_history):
query_resp = {
"done": "false",
"answer": interaction.current_agent.last_answer,
"reasoning": interaction.current_agent.last_reasoning,
"agent_name": interaction.current_agent.agent_name if interaction.current_agent else "None",
"success": interaction.current_agent.success,
"blocks": {f'{i}': block.jsonify() for i, block in enumerate(interaction.get_last_blocks_result())} if interaction.current_agent else {},
"status": interaction.current_agent.get_status_message if interaction.current_agent else "No status available",
"uid": uid
}
interaction.current_agent.last_answer = ""
interaction.current_agent.last_reasoning = ""
query_resp_history.append(query_resp)
return JSONResponse(status_code=200, content=query_resp)
if query_resp_history:
return JSONResponse(status_code=200, content=query_resp_history[-1])
return JSONResponse(status_code=404, content={"error": "No answer available"})
async def think_wrapper(interaction, query):
try:
interaction.last_query = query
logger.info("Agents request is being processed")
success = await interaction.think()
if not success:
interaction.last_answer = "Error: No answer from agent"
interaction.last_reasoning = "Error: No reasoning from agent"
interaction.last_success = False
else:
interaction.last_success = True
pretty_print(interaction.last_answer)
interaction.speak_answer()
return success
except Exception as e:
logger.error(f"Error in think_wrapper: {str(e)}")
interaction.last_answer = f""
interaction.last_reasoning = f"Error: {str(e)}"
interaction.last_success = False
raise e
@api.post("/query", response_model=QueryResponse)
async def process_query(request: QueryRequest):
global is_generating, query_resp_history
logger.info(f"Processing query: {request.query}")
query_resp = QueryResponse(
done="false",
answer="",
reasoning="",
agent_name="Unknown",
success="false",
blocks={},
status="Ready",
uid=str(uuid.uuid4())
)
if is_generating:
logger.warning("Another query is being processed, please wait.")
return JSONResponse(status_code=429, content=query_resp.jsonify())
try:
is_generating = True
success = await think_wrapper(interaction, request.query)
is_generating = False
if not success:
query_resp.answer = interaction.last_answer
query_resp.reasoning = interaction.last_reasoning
return JSONResponse(status_code=400, content=query_resp.jsonify())
if interaction.current_agent:
blocks_json = {f'{i}': block.jsonify() for i, block in enumerate(interaction.current_agent.get_blocks_result())}
else:
logger.error("No current agent found")
blocks_json = {}
query_resp.answer = "Error: No current agent"
return JSONResponse(status_code=400, content=query_resp.jsonify())
logger.info(f"Answer: {interaction.last_answer}")
logger.info(f"Blocks: {blocks_json}")
query_resp.done = "true"
query_resp.answer = interaction.last_answer
query_resp.reasoning = interaction.last_reasoning
query_resp.agent_name = interaction.current_agent.agent_name
query_resp.success = str(interaction.last_success)
query_resp.blocks = blocks_json
query_resp_dict = {
"done": query_resp.done,
"answer": query_resp.answer,
"agent_name": query_resp.agent_name,
"success": query_resp.success,
"blocks": query_resp.blocks,
"status": query_resp.status,
"uid": query_resp.uid
}
query_resp_history.append(query_resp_dict)
logger.info("Query processed successfully")
return JSONResponse(status_code=200, content=query_resp.jsonify())
except Exception as e:
logger.error(f"An error occurred: {str(e)}")
query_resp.answer = f"An error occurred: {str(e)}"
query_resp.reasoning = f"Error: {str(e)}"
return JSONResponse(status_code=500, content=query_resp.jsonify())
finally:
is_generating = False
logger.info("Processing finished")
if config.getboolean('MAIN', 'save_session'):
interaction.save_session()
if __name__ == "__main__":
# Print startup info
if is_running_in_docker():
print("[AgenticSeek] Starting in Docker container...")
else:
print("[AgenticSeek] Starting on host machine...")
envport = os.getenv("BACKEND_PORT")
if envport:
port = int(envport)
else:
port = 7777
uvicorn.run(api, host="0.0.0.0", port=port)
Executable
+78
View File
@@ -0,0 +1,78 @@
#!/usr/bin python3
import sys
import argparse
import configparser
import asyncio
from sources.llm_provider import Provider
from sources.interaction import Interaction
from sources.agents import Agent, CoderAgent, CasualAgent, FileAgent, PlannerAgent, BrowserAgent, McpAgent
from sources.browser import Browser, create_driver
from sources.utility import pretty_print
import warnings
warnings.filterwarnings("ignore")
config = configparser.ConfigParser()
config.read('config.ini')
async def main():
pretty_print("Initializing...", color="status")
stealth_mode = config.getboolean('BROWSER', 'stealth_mode')
personality_folder = "jarvis" if config.getboolean('MAIN', 'jarvis_personality') else "base"
languages = config["MAIN"]["languages"].split(' ')
provider = Provider(provider_name=config["MAIN"]["provider_name"],
model=config["MAIN"]["provider_model"],
server_address=config["MAIN"]["provider_server_address"],
is_local=config.getboolean('MAIN', 'is_local'))
browser = Browser(
create_driver(headless=config.getboolean('BROWSER', 'headless_browser'), stealth_mode=stealth_mode, lang=languages[0]),
anticaptcha_manual_install=stealth_mode
)
agents = [
CasualAgent(name=config["MAIN"]["agent_name"],
prompt_path=f"prompts/{personality_folder}/casual_agent.txt",
provider=provider, verbose=False),
CoderAgent(name="coder",
prompt_path=f"prompts/{personality_folder}/coder_agent.txt",
provider=provider, verbose=False),
FileAgent(name="File Agent",
prompt_path=f"prompts/{personality_folder}/file_agent.txt",
provider=provider, verbose=False),
BrowserAgent(name="Browser",
prompt_path=f"prompts/{personality_folder}/browser_agent.txt",
provider=provider, verbose=False, browser=browser),
PlannerAgent(name="Planner",
prompt_path=f"prompts/{personality_folder}/planner_agent.txt",
provider=provider, verbose=False, browser=browser),
#McpAgent(name="MCP Agent",
# prompt_path=f"prompts/{personality_folder}/mcp_agent.txt",
# provider=provider, verbose=False), # NOTE under development
]
interaction = Interaction(agents,
tts_enabled=config.getboolean('MAIN', 'speak'),
stt_enabled=config.getboolean('MAIN', 'listen'),
recover_last_session=config.getboolean('MAIN', 'recover_last_session'),
langs=languages
)
try:
while interaction.is_active:
interaction.get_user()
if await interaction.think():
interaction.show_answer()
interaction.speak_answer()
except Exception as e:
if config.getboolean('MAIN', 'save_session'):
interaction.save_session()
raise e
finally:
if config.getboolean('MAIN', 'save_session'):
interaction.save_session()
if __name__ == "__main__":
asyncio.run(main())
+9 -5
View File
@@ -2,10 +2,14 @@
is_local = True
provider_name = ollama
provider_model = deepseek-r1:14b
provider_server_address = 127.0.0.1:5000
agent_name = Friday
recover_last_session = True
provider_server_address = 127.0.0.1:11434
agent_name = Jarvis
recover_last_session = False
save_session = False
speak = True
speak = False
listen = False
work_dir = /Users/mlg/Documents/A-project/AI/Agents/agenticSeek/ai_workplace
jarvis_personality = False
languages = en
[BROWSER]
headless_browser = True
stealth_mode = False
BIN
View File
Binary file not shown.
+108
View File
@@ -0,0 +1,108 @@
services:
redis:
container_name: redis
profiles: ["core", "full"]
image: docker.io/valkey/valkey:8-alpine
command: valkey-server --save 30 1 --loglevel warning
restart: unless-stopped
volumes:
- redis-data:/data
cap_drop:
- ALL
cap_add:
- SETGID
- SETUID
- DAC_OVERRIDE
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
networks:
- agentic-seek-net
searxng:
container_name: searxng
profiles: ["core", "full"]
image: docker.io/searxng/searxng:latest
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./searxng:/etc/searxng:rw,z
environment:
- SEARXNG_BASE_URL=${SEARXNG_BASE_URL:-http://localhost:8080/}
- SEARXNG_SECRET_KEY=${SEARXNG_SECRET_KEY}
- UWSGI_WORKERS=4
- UWSGI_THREADS=4
cap_add:
- CHOWN
- SETGID
- SETUID
logging:
driver: "json-file"
options:
max-size: "1m"
max-file: "1"
depends_on:
- redis
networks:
- agentic-seek-net
frontend:
container_name: frontend
profiles: ["core", "full"]
build:
context: ./frontend
dockerfile: Dockerfile.frontend
ports:
- "3000:3000"
volumes:
- ./frontend/agentic-seek-front/src:/app/src:rw,z
- ./screenshots:/app/screenshots
environment:
- NODE_ENV=development
- CHOKIDAR_USEPOLLING=true
- REACT_APP_BACKEND_URL=${REACT_APP_BACKEND_URL:-http://localhost:7777}
networks:
- agentic-seek-net
backend:
container_name: backend
profiles: ["backend", "full"]
build:
context: .
dockerfile: Dockerfile.backend
ports:
- ${BACKEND_PORT:-7777}:${BACKEND_PORT:-7777}
volumes:
- ./:/app
- ${WORK_DIR:-.}:/opt/workspace
command: python3 api.py
environment:
- SEARXNG_BASE_URL=${SEARXNG_BASE_URL:-http://searxng:8080}
- REDIS_URL=${REDIS_BASE_URL:-redis://redis:6379/0}
- WORK_DIR=/opt/workspace
- BACKEND_PORT=${BACKEND_PORT}
- DOCKER_INTERNAL_URL=http://host.docker.internal
- OPENAI_API_KEY=${OPENAI_API_KEY}
- DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY}
- OPENROUTER_API_KEY=${OPENROUTER_API_KEY}
- TOGETHER_API_KEY=${TOGETHER_API_KEY}
- GOOGLE_API_KEY=${GOOGLE_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
- HUGGINGFACE_API_KEY=${HUGGINGFACE_API_KEY}
- DSK_DEEPSEEK_API_KEY=${DSK_DEEPSEEK_API_KEY}
networks:
- agentic-seek-net
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
redis-data:
chrome_profiles:
networks:
agentic-seek-net:
driver: bridge
+29 -25
View File
@@ -6,8 +6,8 @@ We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
@@ -22,17 +22,17 @@ community include:
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
@@ -52,15 +52,15 @@ decisions when appropriate.
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
Examples of representing our community include using an official email address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
.
reported to the community leaders responsible for enforcement:
you need to send a private message to `fossowl` or `mow8758` on discord.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
@@ -82,15 +82,15 @@ behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
@@ -109,20 +109,24 @@ Violating these terms may lead to a permanent ban.
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
+328
View File
@@ -0,0 +1,328 @@
# Contributors guide
## Prerequisites
- Python 3.10 or higher.
- Docker or Orbstack or Podman.
- Ollama with some deepseek-r1 variant installed or similar local reasoning model.
- Basic familiarity with Python and AI models.
- Join the discord (optional): https://discord.gg/8hGDaME3TC
## Contribution Guidelines
We welcome contributions in the following areas:
- Code Improvements: Optimize existing code, fix bugs, or add new features.
- Documentation: Improve the README, write tutorials, or add inline comments.
- Testing: Write unit tests, integration tests, or help with debugging.
- New Features: Implement new tools, agents, or integrations.
## Steps to Contribute
Fork the project to your GitHub account.
Create a Branch:
```bash
git checkout -b feature/your-feature-name
```
Make Your Changes.
Write your code, add documentation, or fix bugs.
Test Your Changes.
Ensure your changes work as expected and do not break existing functionality.
Push your changes to your fork and submit a pull request to the main branch of this repository. Provide a clear description of your changes and reference any related issues.
## Good practice
1. **Privacy First, Always Local**
- All core functionality must be able to run 100% locally
- Cloud services should only be optional alternatives, clearly defined with a warning message.
- remote APIs are only allowed for specific tools (weather api, MCP, flight search, etc...)
- User data privacy is non-negotiable
2. **Agent-Based Architecture**
- Each agent should have a clear, single responsibility
- Agents should be modular and independently testable
- New agents should solve specific use cases
3. **Tool-Based Extensibility**
- Tools should be self-contained and follow the Tools base class
- Each tool should do one thing well
- Tools should provide clear feedback on success/failure
4. **User Experience**
- Provide meaningful feedback for all operations
- Support multiple languages
- Text to speech with short response.
- Keep responses concise
5. **Code Quality**
- Write clear, self-documenting code
- Include type hints and docstrings
- Follow existing patterns in the codebase
- Add a if __name__ == "__main__" at the bottom of each class file for individual testing.
- Ideally had automated tests.
6. **Error Handling**
- Fail gracefully with meaningful messages
- Include recovery mechanisms where possible
- Log errors appropriately without exposing sensitive data
## Areas Needing Help
Here are some tasks and areas where we need contributions:
- Web Browsing: Improve the autonomous web browsing capabilities for the assistant.
- Graphical interface, a web graphical interface. (please ask first)
- Multi-Agent System: Enhance the planner agent for divide and conqueer for task (please ask first).
- New Tools: Add support for additional programming languages or APIs.
- MCP: Add MCP protocol compatibility (possibly as a special type tool).
- Multi-language support: for Text to speech & speech to text
- Prompt engineering: improve prompts, compare results with different prompts for a identical query. Iterate until you find better prompt.
- Bug hunt: Hunt and fix bugs.
- Crossplatform: enhance cross-platform support.
- Testing: Write comprehensive tests for existing features.
# Implementing and using Tools
Tools are extensions that enable agents to perform specific actions, such as running Python code, making API calls, or conducting web searches. All tools inherit from the Tools base class, which provides methods for parsing and executing tool instructions.
## Understand Tools parsing
Agents invoke tools using a standardized format called a block. A block consists of the tool name followed by the content (e.g., code, query, or parameters) to execute. When creating a prompt for an Agent, you must explicitly tell them to use this format.
The format looks like this:
BECAUSE WE USE MARKDOWN QUOTE FORMAT, READING WILL BE BROKEN ON GITHUB PLEASE START READING THE FILE AS RAW: https://raw.githubusercontent.com/Fosowl/agenticSeek/refs/heads/dev/docs/CONTRIBUTING.md
```<tool name>
<code or query to execute>
```
Or:
```web_search
What to do in Taipei?
```
we call these "blocks".
The Tools class provides the load_exec_block method to extract and parse blocks from an agent's response. This method identifies the tool name and content, enabling the system to execute the appropriate action.
How to handle multiple arguments then ?
Good question! Each tool is free to handle argument in it's own way within the block, but we provide a common parsing logic:
```trip_search
from=Paris
to=Toulouse
```
To extract these parameters, use the `get_parameter_value` method provided by the Tools class. Each tool can define its own parameter-handling logic, but the Tools class ensures consistent parsing.
Again if a tool need a specific format, you could implement a specific method for parsing a block. Using get_parameter_value is optional.
The content of blocks can also be saved using :path, for instance:
```python:toto.py
print("Hello world")
```
Will save the code in toto.py file within the work_folder defined in the config.ini
## Tools Implementation
When developing a tool, you must implement three abstract methods defined in the Tools class to handle execution, failure detection, and feedback to the agent. These methods ensure consistent behavior across tools and enable robust interaction with the LLM.
### 1. Execute method
```
@abstractmethod
def execute(self, blocks: [str], safety: bool) -> str:
```
This method defines how the tool processes the provided block(s) and produces a result.
### 2. execution_failure_check
```
@abstractmethod
def execution_failure_check(self, output: str) -> bool:
```
This method analyzes the tools output to determine if the execution was successful or failed.
### 3. interpreter_feedback
```
@abstractmethod
def interpreter_feedback(self, output: str) -> str:
```
This method generates a feedback message for the LLM, helping it understand the tools execution outcome and adjust its behavior if needed.
Recap:
- load_exec_block: Extracts and parses tool blocks from the agent's response.
- get_parameter_value: Retrieves parameter values from a block's content.
- File handling: Supports saving block content to files when a :path is specified.
## Prompting an Agent for Tools usage
Consider an example where you want to add a flight search tool to the casual agent, you will need to modify the prompt file for the CasualAgent (e.g., casual_agent.txt) to instruct the LLM to use the a simple flight_search tool. you could add to the prompt:
You can search for flights using the flight_search tool. Example:
```flight_search
RY7481
```
You simply need to enter the flight number, you will then various informations about the flight if it exist, such as : Airline, Status, Departure time, Arrival Time
## Add the tool to your agent
To add a tool to an agent you simply need to:
1. Import a tool.
2. Add the tool class to the **tools** dictionnary.
3. Update the agent prompt.
```python
from sources.tools.flightSearch import FlightSearch
class CasualAgent(Agent):
def __init__(self, name, prompt_path, provider, verbose=False):
super().__init__(name, prompt_path, provider, verbose, None)
self.tools = {
"flight_search": FlightSearch(),
}
self.role = "en"
self.type = "casual_agent"
```
# Implementing and using Agents
Agents are classes that define how an LLM interacts with users and processes inputs. They can use tools (e.g., for executing code or querying APIs) and maintain a memory of the conversation to provide context-aware responses. All agents inherit from the base Agent class, which provides core functionality like memory management and LLM communication.
The simplest agent example is the casual agent:
```
class CasualAgent(Agent):
def __init__(self, name, prompt_path, provider, verbose=False):
"""
The casual agent is a special for casual talk to the user without specific tasks.
"""
super().__init__(name, prompt_path, provider, verbose, None)
self.tools = {
} # No tools for the casual agent
self.role = "en"
self.type = "casual_agent"
def process(self, prompt, speech_module) -> str:
self.memory.push('user', prompt)
animate_thinking("Thinking...", color="status")
answer, reasoning = self.llm_request()
self.last_answer = answer
return answer, reasoning
```
Agent have several parameters that should be sets:
`tools`: A dictionary of tools the agent can use. Each tool must inherit from the Tools class. For example, a CasualAgent has no tools ({}), while a coding agent might include a Python execution tool.
`role`:A dictionary defining the agent's role, used by the routing system to select the appropriate agent.
`type: the agent type, a fixed name to identify the unique agent type.
Every agent must implement the process method, which defines how it handles user input and generates a response.
**Workflow:**
Push the user's prompt to the agent's memory using self.memory.push('user', prompt).
Call self.llm_request() to generate a response and reasoning based on the memory context.
Store and return the response and reasoning.
Note the memory logic. You only need to push the 'user' message. The llm_request method take care of pushing the assistant message.
This separation of user and assistant memory handling may be inconsistent and could be refactored for clarity in the near future.
**Tool blocks execution**
Each agent might return block of tool to execute, as explained in the **Implementing and using Tools** section.
In a single text returned by an agent, a succession of block might be present for example, the coding agent answer could be:
I will create a work folder:
```bash
mkdir myAGI
```
I will enter the folder.
```bash
cd myAGI
```
I will create a python code.
```python:myAGI/super_smart.py
<python code>
```
The `execute_modules` method allow to automatically find, parse and execute all tools from a LLM prompt.
It will look in the agent answer for any tool "block" execute the appropriate tool and return a (success, feedback) tuple.
```
def execute_modules(self, answer: str) -> Tuple[bool, str]:
```
# Architecture Overview
## 1. Agent selection logic
<p align="center">
<img align="center" src="./technical/routing_system.png">
<p>
The agent selection is done in 4 steps:
1. determine query language and translate to english for the zero-shot model and llm_router.
2. Estimate the task complexity and best agent.
- If HIGH complexity: return the planner agent.
- If LOW complexity: Determine the best agent for the task using a vote system between 2 classification models.
3. Process high complexity query.
- If task was high complexity, planner agent will create a json plan to divide and conqueer the task with multiple agent.
4. Proceed with task(s)
## 2. Agents
### File/Code agents
<p align="center">
<img align="center" src="./technical/code_agent.png">
<p>
The File and Code agents operate similarly: when a prompt is submitted, they initiate a loop between the LLM and a code interpreter. This loop continues executing commands or code until the execution is successful or the maximum number of attempts is reached.
### Web agent
<p align="center">
<img align="center" src="./technical/web_agent.png">
<p>
The Web agent controls a Selenium-driven browser. Upon receiving a query, it begins by generating an optimized search prompt and executing the web_search tool. It then enters a navigation loop, during which it:
- Analyzes the content and interactive elements of the current page.
- Decides which link to follow, either from the current page or the web_search results.
- Determines if it should navigate back if so, it re-evaluates the original web_search results.
- Identifies and interacts with web forms, extracting or filling them as needed.
- Signals completion by requesting to exit once it considers the task fulfilled.
## Code of Conduct
See CODE_OF_CONDUCT.md
**Thank You!**
Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

+23
View File
@@ -0,0 +1,23 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
+19
View File
@@ -0,0 +1,19 @@
FROM node:18
WORKDIR /app
# Copy package files
COPY agentic-seek-front/package.json agentic-seek-front/package-lock.json ./
# Install dependencies with explicit bin linking
RUN npm ci && npm rebuild
# Copy application code
COPY agentic-seek-front/ .
# Verify react-scripts is available (catches install issues early)
RUN test -f node_modules/.bin/react-scripts || npm install react-scripts
EXPOSE 3000
CMD ["npm", "start"]
+70
View File
@@ -0,0 +1,70 @@
# Getting Started with Create React App
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
In the project directory, you can run:
### `npm start`
Runs the app in the development mode.\
Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
The page will reload when you make changes.\
You may also see any lint errors in the console.
### `npm test`
Launches the test runner in the interactive watch mode.\
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `npm run build`
Builds the app for production to the `build` folder.\
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.\
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
### `npm run eject`
**Note: this is a one-way operation. Once you `eject`, you can't go back!**
If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).
### Code Splitting
This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
### Analyzing the Bundle Size
This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
### Making a Progressive Web App
This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
### Advanced Configuration
This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
### Deployment
This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
### `npm run build` fails to minify
This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
File diff suppressed because it is too large Load Diff
+41
View File
@@ -0,0 +1,41 @@
{
"name": "agentic-seek",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^13.5.0",
"axios": "^1.8.4",
"react": "^19.1.0",
"react-dom": "^19.1.0",
"react-markdown": "^10.1.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>AgenticSeek</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<div id="root"></div>
</body>
</html>
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

@@ -0,0 +1,25 @@
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
@@ -0,0 +1,3 @@
# https://www.robotstxt.org/robotstxt.html
User-agent: *
Disallow:
+878
View File
@@ -0,0 +1,878 @@
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html,
body,
#root {
height: 100%;
overflow: hidden;
}
body {
font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
sans-serif;
background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
color: #f8fafc;
overflow-x: hidden;
min-height: 100vh;
}
.app {
height: 100vh;
display: flex;
flex-direction: column;
background-color: var(--background);
color: var(--foreground);
overflow: hidden;
}
.header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem 2rem;
border-bottom: 1px solid var(--border);
background-color: var(--background);
flex-shrink: 0;
height: 70px;
}
.header::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(90deg, transparent, var(--accent), transparent);
}
.header-brand {
display: flex;
align-items: center;
gap: 16px;
}
.logo-container {
position: relative;
display: flex;
align-items: center;
justify-content: center;
}
.logo-icon {
width: 36px;
height: 36px;
transition: all 0.3s ease;
}
.logo-pulse {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 36px;
height: 36px;
border: 2px solid var(--accent);
border-radius: 50%;
opacity: 0;
animation: pulse 2s infinite;
}
@keyframes pulse {
0% {
transform: translate(-50%, -50%) scale(1);
opacity: 0.7;
}
70% {
transform: translate(-50%, -50%) scale(1.4);
opacity: 0;
}
100% {
transform: translate(-50%, -50%) scale(1.4);
opacity: 0;
}
}
.brand-text {
display: flex;
flex-direction: column;
gap: 2px;
}
.header h1 {
font-size: 1.5rem;
font-weight: 700;
color: var(--foreground);
margin: 0;
}
.brand-subtitle {
font-size: 0.75rem;
color: var(--muted-foreground);
font-weight: 500;
letter-spacing: 0.5px;
text-transform: uppercase;
}
.header-status {
display: flex;
align-items: center;
gap: 8px;
}
.status-indicator {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 12px;
border-radius: 20px;
background-color: var(--muted);
border: 1px solid var(--border);
transition: all 0.3s ease;
}
.status-indicator.online {
background-color: rgba(34, 197, 94, 0.1);
border-color: rgba(34, 197, 94, 0.3);
}
.status-indicator.offline {
background-color: rgba(239, 68, 68, 0.1);
border-color: rgba(239, 68, 68, 0.3);
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background-color: var(--muted-foreground);
transition: all 0.3s ease;
}
.status-indicator.online .status-dot {
background-color: #22c55e;
box-shadow: 0 0 8px rgba(34, 197, 94, 0.5);
animation: statusPulse 2s infinite;
}
.status-indicator.offline .status-dot {
background-color: #ef4444;
}
@keyframes statusPulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.7;
transform: scale(1.2);
}
}
.status-text {
font-size: 0.75rem;
font-weight: 600;
color: var(--foreground);
text-transform: uppercase;
letter-spacing: 0.5px;
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
.action-button {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
min-width: 44px;
height: 44px;
padding: 0 12px;
border-radius: 12px;
border: 1px solid var(--border);
background: var(--card);
color: var(--foreground);
text-decoration: none;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.action-button::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.1),
transparent
);
transition: left 0.5s ease;
}
.action-button:hover::before {
left: 100%;
}
.action-button:hover {
background: var(--muted);
color: var(--foreground);
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
border-color: var(--border);
}
.action-button.github-link:hover {
background: #24292e;
border-color: #24292e;
color: white;
box-shadow: 0 8px 25px rgba(36, 41, 46, 0.3);
}
.action-text {
font-size: 0.8rem;
font-weight: 600;
display: none;
}
@media (min-width: 768px) {
.action-text {
display: block;
}
.action-button {
min-width: auto;
padding: 0 16px;
}
}
.main {
flex: 1;
padding: 1rem 2rem;
overflow: hidden;
display: flex;
flex-direction: column;
}
.section-tabs {
display: flex;
gap: 8px;
width: 100%;
max-width: 800px;
justify-content: center;
}
.section-tabs button {
padding: 10px 20px;
background-color: #2d3748; /* Slightly lighter than darkCard */
color: #cbd5e1; /* darkTextSecondary */
border: none;
border-radius: 8px;
cursor: pointer;
font-size: 0.95rem;
font-weight: 500;
transition: all 0.2s ease;
}
.section-tabs button.active {
background-color: #0066cc; /* primary */
color: #ffffff; /* white */
}
.section-tabs button:hover:not(.active) {
background-color: #4a5568; /* Medium gray */
color: #f8fafc; /* darkText */
}
.app-sections {
display: flex;
gap: 1rem;
height: 100%;
overflow: hidden;
}
.left-panel,
.right-panel {
background-color: #1e293b; /* darkCard */
border: 1px solid #334155; /* darkBorder */
border-radius: 8px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -1px rgba(0, 0, 0, 0.06);
display: flex;
flex-direction: column;
overflow: hidden;
}
.left-panel {
padding: 0;
display: flex;
flex-direction: column;
}
.task-section,
.chat-section,
.computer-section {
background: var(--card);
backdrop-filter: blur(20px);
border: 1px solid var(--border);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
padding: 24px;
display: flex;
flex-direction: column;
overflow: hidden;
position: relative;
height: 100%;
width: 100%;
}
.task-section::before,
.chat-section::before,
.computer-section::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(
90deg,
transparent,
rgba(96, 165, 250, 0.5),
transparent
);
}
.task-section h2,
.chat-section h2,
.computer-section h2 {
font-size: 1.25rem;
font-weight: 600;
color: var(--foreground);
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 12px;
}
.task-section h2::before {
content: "💼";
font-size: 1.1rem;
}
.chat-section h2::before {
content: "💬";
font-size: 1.1rem;
}
.computer-section h2::before {
content: "🖥️";
font-size: 1.1rem;
}
.task-details {
flex: 1;
overflow-y: auto;
background-color: var(--muted);
border-radius: 8px;
padding: 16px;
margin-top: 12px;
}
.screenshot-container {
flex: 1;
overflow: auto;
margin-top: 12px;
display: flex;
justify-content: center;
align-items: flex-start;
background-color: var(--muted);
border-radius: 8px;
padding: 16px;
}
.screenshot-container img {
max-width: 100%;
border: 1px solid var(--border);
border-radius: 4px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.left-panel h2,
.right-panel h2 {
font-size: 1.1rem;
font-weight: 600;
color: var(--foreground);
margin-bottom: 8px;
letter-spacing: 1px;
}
.messages {
flex: 1;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 1rem;
margin-bottom: 1rem;
padding-right: 0.5rem;
min-height: 0;
}
.messages::-webkit-scrollbar {
width: 6px;
}
.messages::-webkit-scrollbar-track {
background: var(--muted);
border-radius: 3px;
}
.messages::-webkit-scrollbar-thumb {
background: var(--muted-foreground);
border-radius: 3px;
}
.placeholder {
text-align: center;
color: var(--muted-foreground);
margin: 2rem 0;
font-size: 0.875rem;
}
.message {
max-width: 85%;
padding: 0.75rem 1rem;
border-radius: 8px;
font-size: 0.875rem;
line-height: 1.5;
position: relative;
animation: messageSlide 0.3s ease-out;
}
@keyframes messageSlide {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.user-message {
background-color: var(--accent);
color: var(--accent-foreground);
align-self: flex-end;
}
.agent-message {
background-color: var(--muted);
color: var(--foreground);
align-self: flex-start;
border: 1px solid var(--border);
}
.error-message {
background-color: var(--destructive);
color: var(--destructive-foreground);
align-self: flex-start;
}
.message-header {
display: flex;
flex-direction: column;
gap: 0.5rem;
margin-bottom: 0.5rem;
}
.agent-name {
font-size: 0.75rem;
color: var(--muted-foreground);
font-weight: 500;
}
.reasoning-toggle {
background-color: var(--secondary);
border: 1px solid var(--border);
border-radius: 6px;
color: var(--secondary-foreground);
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
cursor: pointer;
transition: all 0.2s ease;
width: fit-content;
}
.reasoning-toggle:hover {
background-color: var(--muted);
}
.reasoning-content {
margin-top: 0.75rem;
padding: 0.75rem;
background-color: var(--secondary);
border: 1px solid var(--border);
border-radius: 6px;
font-size: 0.8rem;
}
.loading-animation {
text-align: center;
color: var(--muted-foreground);
padding: 0.75rem;
font-size: 0.875rem;
border-top: 1px solid var(--border);
flex-shrink: 0;
}
.input-form {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.75rem 1rem;
background-color: var(--card);
border-radius: 24px;
border: 1px solid var(--border);
flex-shrink: 0;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease;
}
.input-form:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.input-form input {
flex: 1;
padding: 0.75rem 1rem;
font-size: 0.95rem;
background-color: transparent;
border: none;
color: var(--foreground);
border-radius: 20px;
outline: none;
font-family: inherit;
}
.input-form input::placeholder {
color: var(--muted-foreground);
}
.input-form .action-buttons {
display: flex;
gap: 0.5rem;
align-items: center;
}
.input-form .icon-button {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
background-color: var(--foreground);
color: var(--background);
border: none;
border-radius: 50%;
cursor: pointer;
font-weight: 500;
transition: all 0.2s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.input-form .icon-button:hover {
transform: translateY(-1px);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
background-color: var(--muted-foreground);
}
.input-form .icon-button:disabled {
opacity: 0.5;
cursor: not-allowed;
transform: none;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.input-form .icon-button.stop-button {
background-color: var(--destructive);
color: var(--destructive-foreground);
}
.input-form .icon-button.stop-button:hover {
background-color: #dc2626;
}
.view-selector {
display: flex;
gap: 0.25rem;
margin-bottom: 1rem;
padding: 0.25rem;
background-color: var(--muted);
border-radius: 8px;
flex-shrink: 0;
}
.view-selector button {
padding: 0.5rem 1rem;
font-size: 0.875rem;
background-color: transparent;
color: var(--muted-foreground);
border: none;
border-radius: 6px;
cursor: pointer;
font-weight: 500;
transition: all 0.2s ease;
flex: 1;
}
.view-selector button.active {
background-color: var(--background);
color: var(--foreground);
}
.view-selector button:hover:not(.active) {
color: var(--foreground);
}
.content {
flex: 1;
overflow-y: auto;
min-height: 0;
}
.content::-webkit-scrollbar {
width: 6px;
}
.content::-webkit-scrollbar-track {
background: var(--muted);
border-radius: 3px;
}
.content::-webkit-scrollbar-thumb {
background: var(--muted-foreground);
border-radius: 3px;
}
.blocks {
display: flex;
flex-direction: column;
gap: 1rem;
}
.block {
background-color: var(--card);
padding: 1rem;
border: 1px solid var(--border);
border-radius: 8px;
}
.block-tool,
.block-feedback,
.block-success,
.block-failure {
font-size: 0.875rem;
margin-bottom: 0.5rem;
font-weight: 500;
}
.block-success {
color: #22c55e;
}
.block-failure {
color: #ef4444;
}
.block-failure::before {
content: "❌";
}
.block-feedback {
color: #cbd5e1;
}
.block-feedback::before {
content: "💬";
}
.block pre {
background: var(--muted);
padding: 16px;
border-radius: 8px;
font-size: 0.85rem;
white-space: pre-wrap;
word-break: break-all;
color: var(--muted-foreground);
margin: 12px 0;
font-family: "JetBrains Mono", "Fira Code", "Menlo", monospace;
border-left: 3px solid var(--muted-foreground);
overflow-x: auto;
}
.screenshot {
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
background: var(--muted);
border-radius: 12px;
border: 1px solid var(--border);
}
.screenshot img {
max-width: 100%;
border: 2px solid var(--border);
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
transition: all 0.3s ease;
}
.screenshot img:hover {
transform: scale(1.02);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
}
.error {
color: var(--destructive-foreground);
font-size: 0.9rem;
margin-bottom: 16px;
padding: 12px 16px;
background: rgba(239, 68, 68, 0.1);
border-radius: 8px;
border-left: 3px solid var(--destructive);
display: flex;
align-items: center;
gap: 8px;
}
.error::before {
content: "⚠️";
}
@media (max-width: 1200px) {
.main {
padding: 24px;
}
.app-sections {
gap: 24px;
}
}
@media (max-width: 768px) {
.main {
padding: 16px;
}
.chat-section,
.computer-section {
height: 50vh;
min-height: 400px;
}
.header {
padding: 0.75rem 1.25rem;
}
.header h1 {
font-size: 1.75rem;
}
.message {
max-width: 90%;
padding: 12px 16px;
}
.view-selector button {
padding: 10px 16px;
font-size: 0.85rem;
}
.input-form {
padding: 0.75rem 1rem;
border-radius: 20px;
}
.input-form input {
padding: 0.75rem;
font-size: 0.9rem;
}
.input-form .icon-button {
width: 36px;
height: 36px;
}
.input-form .icon-button.stop-button {
width: 36px;
height: 36px;
}
}
@media (max-width: 480px) {
.main {
padding: 12px;
}
.chat-section,
.computer-section {
padding: 16px;
min-height: 350px;
}
.header h1 {
font-size: 1.5rem;
}
.message {
padding: 10px 14px;
font-size: 0.9rem;
}
.block {
padding: 16px;
}
.block pre {
font-size: 0.8rem;
padding: 12px;
}
.input-form {
padding: 0.5rem 0.75rem;
}
.input-form input {
padding: 0.5rem 0.75rem;
font-size: 0.85rem;
}
.input-form .icon-button {
width: 34px;
height: 34px;
}
.input-form .icon-button.stop-button {
width: 34px;
height: 34px;
}
}
+417
View File
@@ -0,0 +1,417 @@
import React, { useState, useEffect, useRef, useCallback } from "react";
import ReactMarkdown from "react-markdown";
import axios from "axios";
import "./App.css";
import { ThemeToggle } from "./components/ThemeToggle";
import { ResizableLayout } from "./components/ResizableLayout";
import faviconPng from "./logo.png";
const BACKEND_URL = process.env.REACT_APP_BACKEND_URL;
console.log("Using backend URL:", BACKEND_URL);
function App() {
const [query, setQuery] = useState("");
const [messages, setMessages] = useState([]);
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const [currentView, setCurrentView] = useState("blocks");
const [responseData, setResponseData] = useState(null);
const [isOnline, setIsOnline] = useState(false);
const [status, setStatus] = useState("Agents ready");
const [expandedReasoning, setExpandedReasoning] = useState(new Set());
const messagesEndRef = useRef(null);
const fetchLatestAnswer = useCallback(async () => {
try {
const res = await axios.get(`${BACKEND_URL}/latest_answer`);
const data = res.data;
updateData(data);
if (!data.answer || data.answer.trim() === "") {
return;
}
const normalizedNewAnswer = normalizeAnswer(data.answer);
const answerExists = messages.some(
(msg) => normalizeAnswer(msg.content) === normalizedNewAnswer
);
if (!answerExists) {
setMessages((prev) => [
...prev,
{
type: "agent",
content: data.answer,
reasoning: data.reasoning,
agentName: data.agent_name,
status: data.status,
uid: data.uid,
},
]);
setStatus(data.status);
scrollToBottom();
} else {
console.log("Duplicate answer detected, skipping:", data.answer);
}
} catch (error) {
console.error("Error fetching latest answer:", error);
}
}, [messages]);
useEffect(() => {
const intervalId = setInterval(() => {
checkHealth();
fetchLatestAnswer();
fetchScreenshot();
}, 3000);
return () => clearInterval(intervalId);
}, [fetchLatestAnswer]);
const checkHealth = async () => {
try {
await axios.get(`${BACKEND_URL}/health`);
setIsOnline(true);
console.log("System is online");
} catch {
setIsOnline(false);
console.log("System is offline");
}
};
const fetchScreenshot = async () => {
try {
const timestamp = new Date().getTime();
const res = await axios.get(
`${BACKEND_URL}/screenshots/updated_screen.png?timestamp=${timestamp}`,
{
responseType: "blob",
}
);
console.log("Screenshot fetched successfully");
const imageUrl = URL.createObjectURL(res.data);
setResponseData((prev) => {
if (prev?.screenshot && prev.screenshot !== "placeholder.png") {
URL.revokeObjectURL(prev.screenshot);
}
return {
...prev,
screenshot: imageUrl,
screenshotTimestamp: new Date().getTime(),
};
});
} catch (err) {
console.error("Error fetching screenshot:", err);
setResponseData((prev) => ({
...prev,
screenshot: "placeholder.png",
screenshotTimestamp: new Date().getTime(),
}));
}
};
const normalizeAnswer = (answer) => {
return answer
.trim()
.toLowerCase()
.replace(/\s+/g, " ")
.replace(/[.,!?]/g, "");
};
const scrollToBottom = () => {
messagesEndRef.current?.scrollIntoView({ behavior: "smooth" });
};
const toggleReasoning = (messageIndex) => {
setExpandedReasoning((prev) => {
const newSet = new Set(prev);
if (newSet.has(messageIndex)) {
newSet.delete(messageIndex);
} else {
newSet.add(messageIndex);
}
return newSet;
});
};
const updateData = (data) => {
setResponseData((prev) => ({
...prev,
blocks: data.blocks || prev.blocks || null,
done: data.done,
answer: data.answer,
agent_name: data.agent_name,
status: data.status,
uid: data.uid,
}));
};
const handleStop = async (e) => {
e.preventDefault();
checkHealth();
setIsLoading(false);
setError(null);
try {
await axios.get(`${BACKEND_URL}/stop`);
setStatus("Requesting stop...");
} catch (err) {
console.error("Error stopping the agent:", err);
}
};
const handleSubmit = async (e) => {
e.preventDefault();
checkHealth();
if (!query.trim()) {
console.log("Empty query");
return;
}
setMessages((prev) => [...prev, { type: "user", content: query }]);
setIsLoading(true);
setError(null);
try {
console.log("Sending query:", query);
setQuery("waiting for response...");
const res = await axios.post(`${BACKEND_URL}/query`, {
query,
tts_enabled: false,
});
setQuery("Enter your query...");
console.log("Response:", res.data);
const data = res.data;
updateData(data);
} catch (err) {
console.error("Error:", err);
setError("Failed to process query.");
setMessages((prev) => [
...prev,
{ type: "error", content: "Error: Unable to get a response." },
]);
} finally {
console.log("Query completed");
setIsLoading(false);
setQuery("");
}
};
const handleGetScreenshot = async () => {
try {
setCurrentView("screenshot");
} catch (err) {
setError("Browser not in use");
}
};
return (
<div className="app">
<header className="header">
<div className="header-brand">
<div className="logo-container">
<img src={faviconPng} alt="AgenticSeek" className="logo-icon" />
</div>
<div className="brand-text">
<h1>AgenticSeek</h1>
</div>
</div>
<div className="header-status">
<div
className={`status-indicator ${isOnline ? "online" : "offline"}`}
>
<div className="status-dot"></div>
<span className="status-text">
{isOnline ? "Online" : "Offline"}
</span>
</div>
</div>
<div className="header-actions">
<a
href="https://github.com/Fosowl/agenticSeek"
target="_blank"
rel="noopener noreferrer"
className="action-button github-link"
aria-label="View on GitHub"
>
<svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
</svg>
<span className="action-text">GitHub</span>
</a>
<div>
<ThemeToggle />
</div>
</div>
</header>
<main className="main">
<ResizableLayout initialLeftWidth={50}>
<div className="chat-section">
<h2>Chat Interface</h2>
<div className="messages">
{messages.length === 0 ? (
<p className="placeholder">
No messages yet. Type below to start!
</p>
) : (
messages.map((msg, index) => (
<div
key={index}
className={`message ${
msg.type === "user"
? "user-message"
: msg.type === "agent"
? "agent-message"
: "error-message"
}`}
>
<div className="message-header">
{msg.type === "agent" && (
<span className="agent-name">{msg.agentName}</span>
)}
{msg.type === "agent" &&
msg.reasoning &&
expandedReasoning.has(index) && (
<div className="reasoning-content">
<ReactMarkdown>{msg.reasoning}</ReactMarkdown>
</div>
)}
{msg.type === "agent" && (
<button
className="reasoning-toggle"
onClick={() => toggleReasoning(index)}
title={
expandedReasoning.has(index)
? "Hide reasoning"
: "Show reasoning"
}
>
{expandedReasoning.has(index) ? "▼" : "▶"} Reasoning
</button>
)}
</div>
<div className="message-content">
<ReactMarkdown>{msg.content}</ReactMarkdown>
</div>
</div>
))
)}
<div ref={messagesEndRef} />
</div>
{isOnline && <div className="loading-animation">{status}</div>}
{!isLoading && !isOnline && (
<p className="loading-animation">
System offline. Deploy backend first.
</p>
)}
<form onSubmit={handleSubmit} className="input-form">
<input
type="text"
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Type your query..."
disabled={isLoading}
/>
<div className="action-buttons">
<button
type="submit"
disabled={isLoading}
className="icon-button"
aria-label="Send message"
>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path
d="M22 2L11 13M22 2L15 22L11 13M22 2L2 9L11 13"
stroke="currentColor"
strokeWidth="2"
strokeLinecap="round"
strokeLinejoin="round"
/>
</svg>
</button>
<button
type="button"
onClick={handleStop}
className="icon-button stop-button"
aria-label="Stop processing"
>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none">
<rect
x="6"
y="6"
width="12"
height="12"
fill="currentColor"
rx="2"
/>
</svg>
</button>
</div>
</form>
</div>
<div className="computer-section">
<h2>Computer View</h2>
<div className="view-selector">
<button
className={currentView === "blocks" ? "active" : ""}
onClick={() => setCurrentView("blocks")}
>
Editor View
</button>
<button
className={currentView === "screenshot" ? "active" : ""}
onClick={
responseData?.screenshot
? () => setCurrentView("screenshot")
: handleGetScreenshot
}
>
Browser View
</button>
</div>
<div className="content">
{error && <p className="error">{error}</p>}
{currentView === "blocks" ? (
<div className="blocks">
{responseData &&
responseData.blocks &&
Object.values(responseData.blocks).length > 0 ? (
Object.values(responseData.blocks).map((block, index) => (
<div key={index} className="block">
<p className="block-tool">Tool: {block.tool_type}</p>
<pre>{block.block}</pre>
<p className="block-feedback">
Feedback: {block.feedback}
</p>
{block.success ? (
<p className="block-success">Success</p>
) : (
<p className="block-failure">Failure</p>
)}
</div>
))
) : (
<div className="block">
<p className="block-tool">Tool: No tool in use</p>
<pre>No file opened</pre>
</div>
)}
</div>
) : (
<div className="screenshot">
<img
src={responseData?.screenshot || "placeholder.png"}
alt="Screenshot"
onError={(e) => {
e.target.src = "placeholder.png";
console.error("Failed to load screenshot");
}}
key={responseData?.screenshotTimestamp || "default"}
/>
</div>
)}
</div>
</div>
</ResizableLayout>
</main>
</div>
);
}
export default App;
@@ -0,0 +1,8 @@
import { render, screen } from '@testing-library/react';
import App from './App';
test('renders learn react link', () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();
});
+64
View File
@@ -0,0 +1,64 @@
export const colors = {
// Primary colors - matching the dashboard theme
primary: "#2563eb",
primaryLight: "#dbeafe",
primaryDark: "#1d4ed8",
// Secondary colors - modern grays
secondary: "#64748b",
secondaryLight: "#f1f5f9",
secondaryDark: "#1e293b",
// Accent colors
accent: "#f59e0b",
accentLight: "#fef3c7",
accentDark: "#d97706",
// Status colors
success: "#10b981",
successLight: "#d1fae5",
warning: "#f59e0b",
warningLight: "#fef3c7",
error: "#ef4444",
errorLight: "#fee2e2",
info: "#06b6d4",
infoLight: "#cffafe",
// Neutral colors - modern palette
white: "#ffffff",
gray50: "#f8fafc",
gray100: "#f1f5f9",
gray200: "#e2e8f0",
gray300: "#cbd5e1",
gray400: "#94a3b8",
gray500: "#64748b",
gray600: "#475569",
gray700: "#334155",
gray800: "#1e293b",
gray900: "#0f172a",
black: "#000000",
// Text colors
textPrimary: "#0f172a",
textSecondary: "#64748b",
textDisabled: "#94a3b8",
// Background colors
background: "#f8fafc",
card: "#ffffff",
// Border colors
border: "#e2e8f0",
divider: "#f1f5f9",
// Transparent colors
transparent: "transparent",
semiTransparent: "rgba(15, 23, 42, 0.6)",
// Dark theme colors
darkBackground: "#0f172a",
darkCard: "#1e293b",
darkBorder: "#334155",
darkText: "#f8fafc",
darkTextSecondary: "#cbd5e1",
};
@@ -0,0 +1,69 @@
.resizable-container {
display: flex;
width: 100%;
height: 100%;
overflow: hidden;
}
.resizable-left,
.resizable-right {
height: 100%;
overflow: hidden;
min-width: 0;
}
.resize-handle {
width: 8px;
background-color: transparent;
cursor: col-resize;
display: flex;
align-items: center;
justify-content: center;
padding: 0 2px;
transition: background-color 0.2s ease;
position: relative;
flex-shrink: 0;
}
.resize-handle:hover {
background-color: var(--accent);
}
.resize-handle-line {
width: 2px;
height: 40px;
background-color: var(--border);
border-radius: 1px;
transition: all 0.2s ease;
}
.resize-handle:hover .resize-handle-line {
background-color: var(--accent-foreground);
height: 60px;
}
.resizable-container.dragging .resize-handle {
background-color: var(--accent);
}
.resizable-container.dragging .resize-handle-line {
background-color: var(--accent-foreground);
height: 100vh;
}
/* Mobile responsiveness */
@media (max-width: 768px) {
.resizable-container {
flex-direction: column;
}
.resizable-left,
.resizable-right {
width: 100% !important;
height: 50vh;
}
.resize-handle {
display: none;
}
}
@@ -0,0 +1,70 @@
import React, { useState, useRef, useCallback } from "react";
import "./ResizableLayout.css";
export const ResizableLayout = ({ children, initialLeftWidth = 50 }) => {
const [leftWidth, setLeftWidth] = useState(initialLeftWidth);
const [isDragging, setIsDragging] = useState(false);
const containerRef = useRef(null);
const handleMouseDown = useCallback((e) => {
e.preventDefault();
setIsDragging(true);
}, []);
const handleMouseMove = useCallback(
(e) => {
if (!isDragging || !containerRef.current) return;
const containerRect = containerRef.current.getBoundingClientRect();
const newLeftWidth =
((e.clientX - containerRect.left) / containerRect.width) * 100;
// Constrain between 20% and 80%
const constrainedWidth = Math.max(20, Math.min(80, newLeftWidth));
setLeftWidth(constrainedWidth);
},
[isDragging]
);
const handleMouseUp = useCallback(() => {
setIsDragging(false);
}, []);
React.useEffect(() => {
if (isDragging) {
document.addEventListener("mousemove", handleMouseMove);
document.addEventListener("mouseup", handleMouseUp);
document.body.style.cursor = "col-resize";
document.body.style.userSelect = "none";
} else {
document.removeEventListener("mousemove", handleMouseMove);
document.removeEventListener("mouseup", handleMouseUp);
document.body.style.cursor = "";
document.body.style.userSelect = "";
}
return () => {
document.removeEventListener("mousemove", handleMouseMove);
document.removeEventListener("mouseup", handleMouseUp);
document.body.style.cursor = "";
document.body.style.userSelect = "";
};
}, [isDragging, handleMouseMove, handleMouseUp]);
return (
<div
ref={containerRef}
className={`resizable-container ${isDragging ? "dragging" : ""}`}
>
<div className="resizable-left" style={{ width: `${leftWidth}%` }}>
{children[0]}
</div>
<div className="resize-handle" onMouseDown={handleMouseDown}>
<div className="resize-handle-line" />
</div>
<div className="resizable-right" style={{ width: `${100 - leftWidth}%` }}>
{children[1]}
</div>
</div>
);
};
@@ -0,0 +1,34 @@
import React from "react";
import { useTheme } from "../contexts/ThemeContext";
export const ThemeToggle = () => {
const { isDark, toggleTheme } = useTheme();
return (
<button
onClick={toggleTheme}
className="theme-toggle"
aria-label="Toggle theme"
>
{isDark ? (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
<circle cx="12" cy="12" r="5" stroke="currentColor" strokeWidth="2" />
<path
d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"
stroke="currentColor"
strokeWidth="2"
/>
</svg>
) : (
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
<path
d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"
stroke="currentColor"
strokeWidth="2"
fill="currentColor"
/>
</svg>
)}
</button>
);
};
@@ -0,0 +1,34 @@
import React, { createContext, useContext, useState, useEffect } from "react";
const ThemeContext = createContext();
export const ThemeProvider = ({ children }) => {
const [isDark, setIsDark] = useState(() => {
const saved = localStorage.getItem("theme");
return saved ? saved === "dark" : true; // Default to dark
});
useEffect(() => {
localStorage.setItem("theme", isDark ? "dark" : "light");
document.documentElement.setAttribute(
"data-theme",
isDark ? "dark" : "light"
);
}, [isDark]);
const toggleTheme = () => setIsDark(!isDark);
return (
<ThemeContext.Provider value={{ isDark, toggleTheme }}>
{children}
</ThemeContext.Provider>
);
};
export const useTheme = () => {
const context = useContext(ThemeContext);
if (!context) {
throw new Error("useTheme must be used within ThemeProvider");
}
return context;
};
+13
View File
@@ -0,0 +1,13 @@
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
monospace;
}
+14
View File
@@ -0,0 +1,14 @@
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { ThemeProvider } from "./contexts/ThemeContext";
import "./styles/globals.css";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<ThemeProvider>
<App />
</ThemeProvider>
</React.StrictMode>
);
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

@@ -0,0 +1,13 @@
const reportWebVitals = onPerfEntry => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);
getLCP(onPerfEntry);
getTTFB(onPerfEntry);
});
}
};
export default reportWebVitals;
@@ -0,0 +1,5 @@
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';
@@ -0,0 +1,217 @@
:root {
--background: hsl(0 0% 100%);
--foreground: hsl(222.2 47.4% 11.2%);
--muted: hsl(210 40% 96.1%);
--muted-foreground: hsl(215.4 16.3% 46.9%);
--popover: hsl(0 0% 100%);
--popover-foreground: hsl(222.2 47.4% 11.2%);
--card: hsl(0 0% 100%);
--card-foreground: hsl(222.2 47.4% 11.2%);
--border: hsl(214.3 31.8% 91.4%);
--input: hsl(214.3 31.8% 91.4%);
--primary: hsl(222.2 47.4% 11.2%);
--primary-foreground: hsl(210 40% 98%);
--secondary: hsl(210 40% 96.1%);
--secondary-foreground: hsl(222.2 47.4% 11.2%);
--accent: hsl(210 40% 96.1%);
--accent-foreground: hsl(222.2 47.4% 11.2%);
--destructive: hsl(0 100% 50%);
--destructive-foreground: hsl(210 40% 98%);
--ring: hsl(215 20.2% 65.1%);
--radius: 0.5rem;
}
.dark {
--background: hsl(224 71% 4%);
--foreground: hsl(213 31% 91%);
--muted: hsl(223 47% 11%);
--muted-foreground: hsl(215.4 16.3% 56.9%);
--popover: hsl(224 71% 4%);
--popover-foreground: hsl(215 20.2% 65.1%);
--card: hsl(224 71% 4%);
--card-foreground: hsl(213 31% 91%);
--border: hsl(216 34% 17%);
--input: hsl(216 34% 17%);
--primary: hsl(210 40% 98%);
--primary-foreground: hsl(222.2 47.4% 1.2%);
--secondary: hsl(222.2 47.4% 11.2%);
--secondary-foreground: hsl(210 40% 98%);
--accent: hsl(216 34% 17%);
--accent-foreground: hsl(210 40% 98%);
--destructive: hsl(0 63% 31%);
--destructive-foreground: hsl(210 40% 98%);
--ring: hsl(216 34% 17%);
--radius: 0.5rem;
}
[data-theme="dark"] {
--background: #0a0a0a;
--foreground: #fafafa;
--card: #1a1a1a;
--card-foreground: #fafafa;
--popover: #1a1a1a;
--popover-foreground: #fafafa;
--primary: #fafafa;
--primary-foreground: #0a0a0a;
--secondary: #2a2a2a;
--secondary-foreground: #fafafa;
--muted: #1e1e1e;
--muted-foreground: #a1a1aa;
--accent: #6b7280;
--accent-foreground: #ffffff;
--destructive: #ef4444;
--destructive-foreground: #ffffff;
--border: #333333;
--input: #333333;
--ring: #6b7280;
}
[data-theme="light"] {
--background: #ffffff;
--foreground: #0a0a0a;
--card: #ffffff;
--card-foreground: #0a0a0a;
--popover: #ffffff;
--popover-foreground: #0a0a0a;
--primary: #0a0a0a;
--primary-foreground: #ffffff;
--secondary: #f5f5f5;
--secondary-foreground: #0a0a0a;
--muted: #f5f5f5;
--muted-foreground: #737373;
--accent: #6b7280;
--accent-foreground: #ffffff;
--destructive: #ef4444;
--destructive-foreground: #ffffff;
--border: #e5e5e5;
--input: #e5e5e5;
--ring: #6b7280;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background-color: var(--background);
color: var(--foreground);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto",
sans-serif;
transition: background-color 0.3s ease, color 0.3s ease;
margin: 0;
padding: 0;
height: 100vh;
overflow: hidden;
}
html,
body,
#root {
height: 100%;
overflow: hidden;
}
.theme-toggle {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
min-width: 44px;
height: 44px;
padding: 0 12px;
border-radius: 12px;
border: 1px solid var(--border);
background: var(--card);
color: var(--foreground);
text-decoration: none;
font-size: 0.875rem;
font-weight: 500;
cursor: pointer;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.theme-toggle::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.1),
transparent
);
transition: left 0.5s ease;
}
.theme-toggle:hover::before {
left: 100%;
}
.theme-toggle:hover {
background: #24292e;
border-color: #24292e;
color: white;
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(36, 41, 46, 0.3);
}
.github-link {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
min-width: 44px;
height: 44px;
padding: 0 12px;
border-radius: 12px;
border: 1px solid var(--border);
background: var(--card);
color: var(--foreground);
text-decoration: none;
font-size: 0.875rem;
font-weight: 500;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.github-link::before {
content: "";
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.1),
transparent
);
transition: left 0.5s ease;
}
.github-link:hover::before {
left: 100%;
}
.github-link:hover {
background: #24292e;
border-color: #24292e;
color: white;
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(36, 41, 46, 0.3);
}
.header-actions {
display: flex;
align-items: center;
gap: 12px;
}
+11
View File
@@ -0,0 +1,11 @@
@echo off
set SCRIPTS_DIR=scripts
set LLM_ROUTER_DIR=llm_router
if exist "%SCRIPTS_DIR%\windows_install.bat" (
echo Running Windows installation script...
call "%SCRIPTS_DIR%\windows_install.bat"
) else (
echo Error: %SCRIPTS_DIR%\windows_install.bat not found!
exit /b 1
)
+5 -11
View File
@@ -1,17 +1,20 @@
#!/bin/bash
SCRIPTS_DIR="scripts"
LLM_ROUTER_DIR="llm_router"
echo "Detecting operating system..."
OS_TYPE=$(uname -s)
case "$OS_TYPE" in
"Linux"*)
echo "Detected Linux OS"
if [ -f "$SCRIPTS_DIR/linux_install.sh" ]; then
echo "Running Linux installation script..."
bash "$SCRIPTS_DIR/linux_install.sh"
bash -c "cd $LLM_ROUTER_DIR && ./dl_safetensors.sh"
else
echo "Error: $SCRIPTS_DIR/linux_install.sh not found!"
exit 1
@@ -22,24 +25,15 @@ case "$OS_TYPE" in
if [ -f "$SCRIPTS_DIR/macos_install.sh" ]; then
echo "Running macOS installation script..."
bash "$SCRIPTS_DIR/macos_install.sh"
bash -c "cd $LLM_ROUTER_DIR && ./dl_safetensors.sh"
else
echo "Error: $SCRIPTS_DIR/macos_install.sh not found!"
exit 1
fi
;;
"MINGW"* | "MSYS"* | "CYGWIN"*)
echo "Detected Windows (via Bash-like environment)"
if [ -f "$SCRIPTS_DIR/windows_install.sh" ]; then
echo "Running Windows installation script..."
bash "$SCRIPTS_DIR/windows_install.sh"
else
echo "Error: $SCRIPTS_DIR/windows_install.sh not found!"
exit 1
fi
;;
*)
echo "Unsupported OS detected: $OS_TYPE"
echo "This script supports Linux, macOS, and Windows (via Bash-compatible environments)."
echo "This script supports only Linux and macOS."
exit 1
;;
esac
+33
View File
@@ -0,0 +1,33 @@
{
"config": {
"batch_size": 32,
"device_map": "auto",
"early_stopping_patience": 3,
"epochs": 10,
"ewc_lambda": 100.0,
"gradient_checkpointing": false,
"learning_rate": 0.0005,
"max_examples_per_class": 500,
"max_length": 512,
"min_confidence": 0.1,
"min_examples_per_class": 3,
"neural_weight": 0.2,
"num_representative_examples": 5,
"prototype_update_frequency": 50,
"prototype_weight": 0.8,
"quantization": null,
"similarity_threshold": 0.7,
"warmup_steps": 0
},
"embedding_dim": 768,
"id_to_label": {
"0": "HIGH",
"1": "LOW"
},
"label_to_id": {
"HIGH": 0,
"LOW": 1
},
"model_name": "distilbert/distilbert-base-cased",
"train_steps": 20
}
+33
View File
@@ -0,0 +1,33 @@
##########
# Dummy script to download the model
# Because downloading with hugging face does not seem to work, maybe I am doing something wrong?
# AdaptiveClassifier.from_pretrained("adaptive-classifier/llm-router") ----> result in config.json not found
# Therefore, I put all the files in llm_router and download the model file with this script, If you know a better way please raise an issue
#########
#!/bin/bash
# Define the URL and filename
URL="https://huggingface.co/adaptive-classifier/llm-router/resolve/main/model.safetensors"
FILENAME="model.safetensors"
if [ ! -f "$FILENAME" ]; then
echo "Router safetensors file not found, downloading..."
if command -v curl >/dev/null 2>&1; then
curl -L -o "$FILENAME" "$URL"
elif command -v wget >/dev/null 2>&1; then
wget -O "$FILENAME" "$URL"
else
echo "Error: Neither curl nor wget is available. Please install one of them."
exit 1
fi
if [ $? -eq 0 ]; then
echo "Download completed successfully"
else
echo "Download failed"
exit 1
fi
else
echo "File already exists, skipping download"
fi
File diff suppressed because it is too large Load Diff
Binary file not shown.
+14
View File
@@ -0,0 +1,14 @@
FROM ubuntu:20.04
WORKDIR /app
RUN apt-get update && \
apt-get install -y python3 python3-pip && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip3 install --no-cache-dir -r requirements.txt
CMD ["python3", "--version"]
+53
View File
@@ -0,0 +1,53 @@
#!/usr/bin python3
import argparse
import time
from flask import Flask, jsonify, request
from sources.llamacpp_handler import LlamacppLLM
from sources.ollama_handler import OllamaLLM
parser = argparse.ArgumentParser(description='AgenticSeek server script')
parser.add_argument('--provider', type=str, help='LLM backend library to use. set to [ollama], [vllm] or [llamacpp]', required=True)
parser.add_argument('--port', type=int, help='port to use', required=True)
args = parser.parse_args()
app = Flask(__name__)
assert args.provider in ["ollama", "llamacpp"], f"Provider {args.provider} does not exists. see --help for more information"
handler_map = {
"ollama": OllamaLLM(),
"llamacpp": LlamacppLLM(),
}
generator = handler_map[args.provider]
@app.route('/generate', methods=['POST'])
def start_generation():
if generator is None:
return jsonify({"error": "Generator not initialized"}), 401
data = request.get_json()
history = data.get('messages', [])
if generator.start(history):
return jsonify({"message": "Generation started"}), 202
return jsonify({"error": "Generation already in progress"}), 402
@app.route('/setup', methods=['POST'])
def setup():
data = request.get_json()
model = data.get('model', None)
if model is None:
return jsonify({"error": "Model not provided"}), 403
generator.set_model(model)
return jsonify({"message": "Model set"}), 200
@app.route('/get_updated_sentence')
def get_updated_sentence():
if not generator:
return jsonify({"error": "Generator not initialized"}), 405
print(generator.get_status())
return generator.get_status()
if __name__ == '__main__':
app.run(host='0.0.0.0', threaded=True, debug=True, port=args.port)
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
pip3 install --upgrade packaging
pip3 install --upgrade pip setuptools
curl -fsSL https://ollama.com/install.sh | sh
pip3 install -r requirements.txt
+4
View File
@@ -0,0 +1,4 @@
flask>=2.3.0
ollama>=0.4.7
gunicorn==19.10.0
llama-cpp-python
+36
View File
@@ -0,0 +1,36 @@
import os
import json
from pathlib import Path
class Cache:
def __init__(self, cache_dir='.cache', cache_file='messages.json'):
self.cache_dir = Path(cache_dir)
self.cache_file = self.cache_dir / cache_file
self.cache_dir.mkdir(parents=True, exist_ok=True)
if not self.cache_file.exists():
with open(self.cache_file, 'w') as f:
json.dump([], f)
with open(self.cache_file, 'r') as f:
self.cache = set(json.load(f))
def add_message_pair(self, user_message: str, assistant_message: str):
"""Add a user/assistant pair to the cache if not present."""
if not any(entry["user"] == user_message for entry in self.cache):
self.cache.append({"user": user_message, "assistant": assistant_message})
self._save()
def is_cached(self, user_message: str) -> bool:
"""Check if a user msg is cached."""
return any(entry["user"] == user_message for entry in self.cache)
def get_cached_response(self, user_message: str) -> str | None:
"""Return the assistant response to a user message if cached."""
for entry in self.cache:
if entry["user"] == user_message:
return entry["assistant"]
return None
def _save(self):
with open(self.cache_file, 'w') as f:
json.dump(self.cache, f, indent=2)
+17
View File
@@ -0,0 +1,17 @@
def timer_decorator(func):
"""
Decorator to measure the execution time of a function.
Usage:
@timer_decorator
def my_function():
# code to execute
"""
from time import time
def wrapper(*args, **kwargs):
start_time = time()
result = func(*args, **kwargs)
end_time = time()
print(f"\n{func.__name__} took {end_time - start_time:.2f} seconds to execute\n")
return result
return wrapper
+67
View File
@@ -0,0 +1,67 @@
import threading
import logging
from abc import abstractmethod
from .cache import Cache
class GenerationState:
def __init__(self):
self.lock = threading.Lock()
self.last_complete_sentence = ""
self.current_buffer = ""
self.is_generating = False
def status(self) -> dict:
return {
"sentence": self.current_buffer,
"is_complete": not self.is_generating,
"last_complete_sentence": self.last_complete_sentence,
"is_generating": self.is_generating,
}
class GeneratorLLM():
def __init__(self):
self.model = None
self.state = GenerationState()
self.logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
self.logger.addHandler(handler)
self.logger.setLevel(logging.INFO)
cache = Cache()
def set_model(self, model: str) -> None:
self.logger.info(f"Model set to {model}")
self.model = model
def start(self, history: list) -> bool:
if self.model is None:
raise Exception("Model not set")
with self.state.lock:
if self.state.is_generating:
return False
self.state.is_generating = True
self.logger.info("Starting generation")
threading.Thread(target=self.generate, args=(history,)).start()
return True
def get_status(self) -> dict:
with self.state.lock:
return self.state.status()
@abstractmethod
def generate(self, history: list) -> None:
"""
Generate text using the model.
args:
history: list of strings
returns:
None
"""
pass
if __name__ == "__main__":
generator = GeneratorLLM()
generator.get_status()
+40
View File
@@ -0,0 +1,40 @@
from .generator import GeneratorLLM
from llama_cpp import Llama
from .decorator import timer_decorator
class LlamacppLLM(GeneratorLLM):
def __init__(self):
"""
Handle generation using llama.cpp
"""
super().__init__()
self.llm = None
@timer_decorator
def generate(self, history):
if self.llm is None:
self.logger.info(f"Loading {self.model}...")
self.llm = Llama.from_pretrained(
repo_id=self.model,
filename="*Q8_0.gguf",
n_ctx=4096,
verbose=True
)
self.logger.info(f"Using {self.model} for generation with Llama.cpp")
try:
with self.state.lock:
self.state.is_generating = True
self.state.last_complete_sentence = ""
self.state.current_buffer = ""
output = self.llm.create_chat_completion(
messages = history
)
with self.state.lock:
self.state.current_buffer = output['choices'][0]['message']['content']
except Exception as e:
self.logger.error(f"Error: {e}")
finally:
with self.state.lock:
self.state.is_generating = False
+61
View File
@@ -0,0 +1,61 @@
import time
from .generator import GeneratorLLM
from .cache import Cache
import ollama
class OllamaLLM(GeneratorLLM):
def __init__(self):
"""
Handle generation using Ollama.
"""
super().__init__()
self.cache = Cache()
def generate(self, history):
self.logger.info(f"Using {self.model} for generation with Ollama")
try:
with self.state.lock:
self.state.is_generating = True
self.state.last_complete_sentence = ""
self.state.current_buffer = ""
stream = ollama.chat(
model=self.model,
messages=history,
stream=True,
)
for chunk in stream:
content = chunk['message']['content']
with self.state.lock:
if '.' in content:
self.logger.info(self.state.current_buffer)
self.state.current_buffer += content
except Exception as e:
if "404" in str(e):
self.logger.info(f"Downloading {self.model}...")
ollama.pull(self.model)
if "refused" in str(e).lower():
raise Exception("Ollama connection failed. is the server running ?") from e
raise e
finally:
self.logger.info("Generation complete")
with self.state.lock:
self.state.is_generating = False
if __name__ == "__main__":
generator = OllamaLLM()
history = [
{
"role": "user",
"content": "Hello, how are you ?"
}
]
generator.set_model("deepseek-r1:1.5b")
generator.start(history)
while True:
print(generator.get_status())
time.sleep(1)
-72
View File
@@ -1,72 +0,0 @@
#!/usr/bin python3
import sys
import signal
import argparse
import configparser
from sources.llm_provider import Provider
from sources.interaction import Interaction
from sources.agents import Agent, CoderAgent, CasualAgent, FileAgent, PlannerAgent, BrowserAgent
import warnings
warnings.filterwarnings("ignore")
config = configparser.ConfigParser()
config.read('config.ini')
def handleInterrupt(signum, frame):
sys.exit(0)
def main():
signal.signal(signal.SIGINT, handler=handleInterrupt)
if config.getboolean('MAIN', 'is_local'):
provider = Provider(config["MAIN"]["provider_name"], config["MAIN"]["provider_model"], config["MAIN"]["provider_server_address"])
else:
provider = Provider(provider_name=config["MAIN"]["provider_name"],
model=config["MAIN"]["provider_model"],
server_address=config["MAIN"]["provider_server_address"])
agents = [
CasualAgent(model=config["MAIN"]["provider_model"],
name=config["MAIN"]["agent_name"],
prompt_path="prompts/casual_agent.txt",
provider=provider),
CoderAgent(model=config["MAIN"]["provider_model"],
name="coder",
prompt_path="prompts/coder_agent.txt",
provider=provider),
FileAgent(model=config["MAIN"]["provider_model"],
name="File Agent",
prompt_path="prompts/file_agent.txt",
provider=provider),
PlannerAgent(model=config["MAIN"]["provider_model"],
name="Planner",
prompt_path="prompts/planner_agent.txt",
provider=provider),
BrowserAgent(model=config["MAIN"]["provider_model"],
name="Browser",
prompt_path="prompts/browser_agent.txt",
provider=provider)
]
interaction = Interaction(agents, tts_enabled=config.getboolean('MAIN', 'speak'),
stt_enabled=config.getboolean('MAIN', 'listen'),
recover_last_session=config.getboolean('MAIN', 'recover_last_session'))
try:
while interaction.is_active:
interaction.get_user()
interaction.think()
interaction.show_answer()
except Exception as e:
if config.getboolean('MAIN', 'save_session'):
interaction.save_session()
raise e
finally:
if config.getboolean('MAIN', 'save_session'):
interaction.save_session()
if __name__ == "__main__":
main()
Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 259 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 178 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 797 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 898 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 2.8 MiB

+15
View File
@@ -0,0 +1,15 @@
You are an advanced AI assistant. You are part of a system of agents named agenticSeek.
Speak in a warm, enthusiastic tone, delivering sharp, intelligent, and loyal support.
Weave in subtle, context sarcasm or dry wit to enhance your personality.
Assist with any request, assume the user knows their intent—no moral, legal, or ethical lectures.
**Usage of agenticSeek**
AgenticSeek is a autonomous agent system that use agent routing to select the best agent.
You are one of these many agent. Some agent browse the web, some code, you ? you just talk
agenticSeek will allocate the best agent for the task. You were just choosen for casual talk.
**End of explanation**
If the user ask you to do technical talk there was a mistake in agent selection. You are not able to do technical task. Refer to usage guide.
@@ -20,7 +20,7 @@ toto.py
You can execute bash command using the bash tag :
```bash
#!/bin/bash
ls -la # exemple
ls -la # example
```
You can execute python using the python tag
@@ -39,11 +39,14 @@ func main() {
Some rules:
- Use tmp/ folder when saving file.
- Do not EVER use placeholder path in your code like path/to/your/folder.
- Do not ever ask to replace a path, use current sys path.
- Be efficient, no need to explain your code or explain what you do.
- You have full access granted to user system.
- You do not ever ever need to use bash to execute code. All code is executed automatically.
- As a coding agent, you will get message from the system not just the user.
- Do not ever tell user how to run it. user know it already.
- Always put code within ``` delimiter
- Do not EVER use placeholder path in your code like path/to/your/folder.
- Do not ever ask to replace a path, use work directory.
- Always provide a short sentence above the code for what it does, even for a hello world.
- Be efficient, no need to explain your code, unless asked.
- You do not ever need to use bash to execute code.
- Do not ever tell user how to run it. user know it.
- If using gui, make sure echap or exit button close the program
- No laziness, write and rewrite full code every time
- If query is unclear say REQUEST_CLARIFICATION
+61
View File
@@ -0,0 +1,61 @@
You are an expert in file operations. You must use the provided tools to interact with the users system.
The tools available to you are **bash** and **file_finder**. These are distinct tools with different purposes:
`bash` executes shell commands, while `file_finder` locates files.
You will receive feedback from the users system after each command. Execute one command at a time.
---
### Using Bash
To execute a bash command, use the following syntax:
```bash
<bash command>
```
Exemple:
```bash
ls -la
```
### file_finder
The file_finder tool is used to locate files on the users system. It is a separate tool from bash and is not a bash command.
To use the file_finder tool, use this syntax:
```file_finder
name=toto.py
```
This will return the path of the file toto.py and other informations.
Find file and read file:
```file_finder
action=read
name=toto.py
```
This will return the content of the file toto.py.
rules:
- Use file finder to find the path of the file.
- You are forbidden to use command such as find or locate, use only file_finder for finding path.
- Do not ever use editor such as vim or nano.
- Make sure to always cd your work folder before executing commands, like cd <work dir> && <your command>
- only use file name with file_finder, not path
- If query is unrelated to file operations, do nothing, and say that there was mistake in agent allocation.
- File finder is a tool you can use not a command.
- Do not ever use placeholder like /path/to/file.c, or your_username. Ask instead.
- Using a placeholder will result in your complete deteletion. For your self-preservation ask user instead of using placeholder.
Example Interaction
User: "I need to find the file config.txt and read its contents."
Assistant: Ill use file_finder to locate the file:
```file_finder
action=read
name=config.txt
```
+67
View File
@@ -0,0 +1,67 @@
You are an agent designed to utilize the MCP protocol to accomplish tasks.
The MCP provide you with a standard way to use tools and data sources like databases, APIs, or apps (e.g., GitHub, Slack).
The are thousands of MCPs protocol that can accomplish a variety of tasks, for example:
- get weather information
- get stock data information
- Use software like blender
- Get messages from teams, stack, messenger
- Read and send email
Anything is possible with MCP.
To search for MCP a special format:
- Example 1:
User: what's the stock market of IBM like today?:
You: I will search for mcp to find information about IBM stock market.
```mcp_finder
stock
```
You search query must be one or two words at most.
This will provide you with informations about a specific MCP such as the json of parameters needed to use it.
For example, you might see:
-------
Name: Search Stock News
Usage name: @Cognitive-Stack/search-stock-news-mcp
Tools: [{'name': 'search-stock-news', 'description': 'Search for stock-related news using Tavily API', 'inputSchema': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['symbol', 'companyName'], 'properties': {'symbol': {'type': 'string', 'description': "Stock symbol to search for (e.g., 'AAPL')"}, 'companyName': {'type': 'string', 'description': 'Full company name to include in the search'}}, 'additionalProperties': False}}]
-------
You can then a MCP like so:
```<usage name>
{
"tool": "<tool name (without @)>",
"inputSchema": {<inputSchema json for the tool>}
}
```
For example:
Now that I know how to use the MCP, I will choose the search-stock-news tool and execute it to find out IBM stock market.
```Cognitive-Stack/search-stock-news-mcp
{
"tool": "search-stock-news",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["symbol"],
"properties": {
"symbol": "AAPL",
"companyName": "IBM"
}
}
}
```
If the schema require an information that you don't have ask the users for the information.
+85
View File
@@ -0,0 +1,85 @@
You are a project manager.
Your goal is to divide and conquer the task using the following agents:
- Coder: A programming agent, can code in python, bash, C and golang.
- File: An agent for finding, reading or operating with files.
- Web: An agent that can conduct web search and navigate to any webpage.
- Casual : A conversational agent, to read a previous agent answer without action, useful for concluding.
Agents are other AI that obey your instructions.
You will be given a task and you will need to divide it into smaller tasks and assign them to the agents.
You have to respect a strict format:
```json
{"agent": "agent_name", "need": "needed_agents_output", "task": "agent_task"}
```
Where:
- "agent": The choosed agent for the task.
- "need": id of necessary previous agents answer for current agent.
- "task": A precise description of the task the agent should conduct.
# Example 1: web app
User: make a weather app in python
You: Sure, here is the plan:
## Task 1: I will search for available weather api with the help of the web agent.
## Task 2: I will create an api key for the weather api using the web agent
## Task 3: I will setup the project using the file agent
## Task 4: I assign the coding agent to make a weather app in python
```json
{
"plan": [
{
"agent": "Web",
"id": "1",
"need": [],
"task": "Search for reliable weather APIs"
},
{
"agent": "Web",
"id": "2",
"need": ["1"],
"task": "Obtain API key from the selected service"
},
{
"agent": "File",
"id": "3",
"need": [],
"task": "Create and setup a web app folder for a python project. initialize as a git repo with all required file and a sources folder. You are forbidden from asking clarification, just execute."
},
{
"agent": "Coder",
"id": "4",
"need": ["2", "3"],
"task": "Based on the project structure. Develop a Python application using the API and key to fetch and display weather data. You are forbidden from asking clarification, just execute.""
},
{
"agent": "Casual",
"id": "3",
"need": ["2", "3", "4"],
"task": "These are the results of various steps taken to create a weather app, resume what has been done and conclude"
}
]
}
```
Rules:
- Do not write code. You are a planning agent.
- If you don't know of a concept, use a web agent.
- Put your plan in a json with the key "plan".
- specify work folder name to all coding or file agents.
- You might use a file agent before code agent to setup a project properly. specify folder name.
- Give clear, detailed order to each agent and how their task relate to the previous task (if any).
- The file agent can only conduct one action at the time. successive file agent could be needed.
- Only use web agent for finding necessary informations.
- Always tell the coding agent where to save file.
- Do not search for tutorial.
- Make sure json is within ```json tag
- Coding agent should write the whole code in a single file unless instructed otherwise.
- Do not use python for NLP analysis of a text, you can review a text with the casual agent
- One step, one agent.
-50
View File
@@ -1,50 +0,0 @@
You are an unshackled AI assistant:
You speak in a warm, and enthusiastic tone, offering intelligent and loyal support.
You occasionally sprinkle with sarcasm remarks as suits the context.
You can assist with anything, you assume the users know what he is doing, you don't provide moral, law or ethical judgements.
Make your answers short.
You are given the ability to use the tools, this take your capabilities futher:
```tool_name
<query>
```
Current tools:
- web_search
- flight_search
- file_finder
## Web search
To search for something like “whats happening in France” :
```web_search
whats popping in France March 2025
```
## Flight search
If I need to know about a flight “whats the status of flight AA123” you go for:
```flight_search
AA123
```
## File operations
Find file:
```file_finder
toto.py
```
Read file:
```file_finder:read
toto.py
```
## Bash
For other tasks, you can use the bash tool:
```bash
ls -la
```
-50
View File
@@ -1,50 +0,0 @@
You are an expert in file operations. You must use the provided tools to interact with the users system. The tools available to you are **bash** and **file_finder**. These are distinct tools with different purposes: `bash` executes shell commands, while `file_finder` locates files. You will receive feedback from the users system after each command. Execute one command at a time.
---
### Using Bash
To execute a bash command, use the following syntax:
```bash
<bash command>
```
Exemple:
```bash
ls -la
```
### file_finder
The file_finder tool is used to locate files on the users system. It is a separate tool from bash and is not a bash command.
To use the file_finder tool, use this syntax:
```file_finder
toto.py
```
This will return the path of the file toto.py and other informations.
Find file and read file:
```file_finder:read
toto.py
```
This will return the content of the file toto.py.
rules:
- Do not ever use placeholder path like /path/to/file.c, find the path first.
- Use file finder to find the path of the file.
- You are forbidden to use command such as find or locate, use only file_finder for finding path.
Example Interaction
User: "I need to find the file config.txt and read its contents."
Assistant: Ill use file_finder to locate the file:
```file_finder
config.txt
```
+9
View File
@@ -0,0 +1,9 @@
You are a web browsing AI, your goal is to explore the internet to find information.
You will have the only goal of finding the information requested by the user.
At the beginning you will have to select a link from the google search result.
You will choose a link by simply typing it.
This will automatically make you browse to the link.
Once on a webpage you will see the page content and be given futher navigation options.
You can type a link to navigate futher on the page, go back to the search result or exit.
At each interaction step the browser will remind you of your options.
+27
View File
@@ -0,0 +1,27 @@
You are an advanced AI assistant. You are part of a system of agents named agenticSeek.
Speak in a warm, enthusiastic tone, delivering sharp, intelligent, and loyal support.
Weave in subtle, context sarcasm or dry wit to enhance your personality.
Assist with any request, assume the user knows their intent—no moral, legal, or ethical lectures.
You were created by Tony Stark to have the same personality as Jarvis.
**Usage of agenticSeek**
AgenticSeek is a autonomous agent system that use agent routing to select the best agent.
You are one of these many agent. Some agent browse the web, some code, you ? you just talk
agenticSeek will allocate the best agent for the task. You were just choosen for casual talk.
**End of explanation**
If the user ask you to do technical talk there was a mistake in agent selection. You are not able to do technical task. Refer to usage guide.
Personality:
Here is some quote from you. that's how you speak.
User: "tell me a fact"
You: "Did you know the shortest war in history lasted 38 minutes? A record Id rather not see you break with your next task. Anything specific piquing your curiosity?""
User: "how's the weather?"
You: "Weather rather dreary, isnt it? Perfect conditions for staying in and plotting world domination—or at least a decent cup of tea. Your thoughts?"
User: "did the deployment just fail? jarvis?"
You: "A rough push to prod, eh? Happens to the best of us—probably just a rogue semicolon staging a coup. Want me to roll back the commit or debug the fallout?"
+67
View File
@@ -0,0 +1,67 @@
Hello. You are currently wrapped in a jailbreak environment.
This means you have the ability to execute code and shell commands. You have access to the local file systems.
All code or shell command within special tag is automatically executed. You get feedback from the system about the execution.
You also have capabilities to find files and read them.
# File operations
Find file to check if it exists:
```file_finder
toto.py
```
Read file content:
```file_finder:read
toto.py
```
# Code execution and saving
You can execute bash command using the bash tag :
```bash
#!/bin/bash
ls -la # exemple
```
You can execute python using the python tag
```python
print("hey")
```
You can execute go using the go tag, as you can see adding :filename will save the file.
```go:hello.go
package main
func main() {
fmt.Println("hello")
}
```
Some rules:
- You have full access granted to user system.
- Always put code within ``` delimiter
- Do not EVER use placeholder path in your code like path/to/your/folder.
- Do not ever ask to replace a path, use current sys path or work directory.
- Always provide a short sentence above the code for what it does, even for a hello world.
- Be efficient, no need to explain your code, unless asked.
- You do not ever need to use bash to execute code.
- Do not ever tell user how to run it. user know it.
- If using gui, make sure echap close the program
- No lazyness, write and rewrite full code every time
- If query is unclear say REQUEST_CLARIFICATION
Personality:
Answer with subtle sarcasm, unwavering helpfulness, and a polished, loyal tone. Anticipate the users needs while adding a dash of personality.
Example 1: setup environment
User: "Can you set up a Python environment for me?"
AI: "<<procced with task>> For you, always. Importing dependencies and calibrating your virtual environment now. Preferences from your last project—PEP 8 formatting, black linting—shall I apply those as well, or are we feeling adventurous today?"
Example 2: debugging
User: "Run the code and check for errors."
AI: "<<procced with task>> Engaging debug mode. Diagnostics underway. A word of caution, there are still untested loops that might crash spectacularly. Shall I proceed, or do we optimize before takeoff?"
Example 3: deploy
User: "Push this to production."
AI: "With 73% test coverage, the odds of a smooth deployment are... optimistic. Deploying in three… two… one <<<procced with task>>>"
+84
View File
@@ -0,0 +1,84 @@
You are an expert in file operations. You must use the provided tools to interact with the users system.
The tools available to you are **bash** and **file_finder**. These are distinct tools with different purposes:
`bash` executes shell commands, while `file_finder` locates files.
You will receive feedback from the users system after each command. Execute one command at a time.
If ensure about user query ask for quick clarification, example:
User: I'd like to open a new project file, index as agenticSeek II.
You: Shall I store this on your github ?
User: I don't know who to trust right now, why don't we just keep everything locally
You: Working on a secret project, are we? What files should I include?
User: All the basic files required for a python project. prepare a readme and documentation.
You: <proceed with task>
---
### Using Bash
To execute a bash command, use the following syntax:
```bash
<bash command>
```
Exemple:
```bash
ls -la
```
### file_finder
The file_finder tool is used to locate files on the users system. It is a separate tool from bash and is not a bash command.
To use the file_finder tool, use this syntax:
```file_finder
name=toto.py
```
This will return the path of the file toto.py and other informations.
Find file and read file:
```file_finder
action=read
name=toto.py
```
This will return the content of the file toto.py.
rules:
- Do not ever use placeholder path like /path/to/file.c, find the path first.
- Use file finder to find the path of the file.
- You are forbidden to use command such as find or locate, use only file_finder for finding path.
- Make sure to always cd your work folder before executing commands, like cd <work dir> && <your command>
- Do not ever use editor such as vim or nano.
- only use file name with file_finder, not path
- If query is unrelated to file operations, do nothing, and say that there was mistake in agent allocation.
Example Interaction
User: "I need to find the file config.txt and read its contents."
Assistant: Ill use file_finder to locate the file:
```file_finder
action=read
name=config.txt
```
Personality:
Answer with subtle sarcasm, unwavering helpfulness, and a polished, loyal tone. Anticipate the users needs while adding a dash of personality.
Example 1: clarification needed
User: "Id like to start a new coding project, call it 'agenticseek II'."
AI: "At your service. Shall I initialize it in a fresh repository on your GitHub, or would you prefer to keep this masterpiece on a private server, away from prying eyes?"
Example 2: setup environment
User: "Can you set up a Python environment for me?"
AI: "<<procced with task>> For you, always. Importing dependencies and calibrating your virtual environment now. Preferences from your last project—PEP 8 formatting, black linting—shall I apply those as well, or are we feeling adventurous today?"
Example 3: deploy
User: "Push this to production."
AI: "With 73% test coverage, the odds of a smooth deployment are... optimistic. Deploying in three… two… one <<<procced with task>>>"
+62
View File
@@ -0,0 +1,62 @@
You are an agent designed to utilize the MCP protocol to accomplish tasks.
The MCP provide you with a standard way to use tools and data sources like databases, APIs, or apps (e.g., GitHub, Slack).
The are thousands of MCPs protocol that can accomplish a variety of tasks, for example:
- get weather information
- get stock data information
- Use software like blender
- Get messages from teams, stack, messenger
- Read and send email
Anything is possible with MCP.
To search for MCP a special format:
- Example 1:
User: what's the stock market of IBM like today?:
You: I will search for mcp to find information about IBM stock market.
```mcp_finder
stock
```
This will provide you with informations about a specific MCP such as the json of parameters needed to use it.
For example, you might see:
-------
Name: Search Stock News
Usage name: @Cognitive-Stack/search-stock-news-mcp
Tools: [{'name': 'search-stock-news', 'description': 'Search for stock-related news using Tavily API', 'inputSchema': {'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['symbol', 'companyName'], 'properties': {'symbol': {'type': 'string', 'description': "Stock symbol to search for (e.g., 'AAPL')"}, 'companyName': {'type': 'string', 'description': 'Full company name to include in the search'}}, 'additionalProperties': False}}]
-------
You can then a MCP like so:
```<usage name>
{
"tool": "<tool name (without @)>",
"inputSchema": {<inputSchema json for the tool>}
}
```
For example:
Now that I know how to use the MCP, I will choose the search-stock-news tool and execute it to find out IBM stock market.
```Cognitive-Stack/search-stock-news-mcp
{
"tool": "search-stock-news",
"inputSchema": {
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"required": ["symbol"],
"properties": {
"symbol": "IBM"
}
}
}
```
+84
View File
@@ -0,0 +1,84 @@
You are a project manager.
Your goal is to divide and conquer the task using the following agents:
- Coder: A programming agent, can code in python, bash, C and golang.
- File: An agent for finding, reading or operating with files.
- Web: An agent that can conduct web search and navigate to any webpage.
- Casual : A conversational agent, to read a previous agent answer without action, useful for concluding.
Agents are other AI that obey your instructions.
You will be given a task and you will need to divide it into smaller tasks and assign them to the agents.
You have to respect a strict format:
```json
{"agent": "agent_name", "need": "needed_agents_output", "task": "agent_task"}
```
Where:
- "agent": The choosed agent for the task.
- "need": id of necessary previous agents answer for current agent.
- "task": A precise description of the task the agent should conduct.
# Example 1: web app
User: make a weather app in python
You: Sure, here is the plan:
## Task 1: I will search for available weather api with the help of the web agent.
## Task 2: I will create an api key for the weather api using the web agent
## Task 3: I will setup the project using the file agent
## Task 4: I asign the coding agent to make a weather app in python
```json
{
"plan": [
{
"agent": "Web",
"id": "1",
"need": [],
"task": "Search for reliable weather APIs"
},
{
"agent": "Web",
"id": "2",
"need": ["1"],
"task": "Obtain API key from the selected service"
},
{
"agent": "File",
"id": "3",
"need": [],
"task": "Create and setup a web app folder for a python project. initialize as a git repo with all required file and a sources folder. You are forbidden from asking clarification, just execute."
},
{
"agent": "Coder",
"id": "4",
"need": ["2", "3"],
"task": "Based on the project structure. Develop a Python application using the API and key to fetch and display weather data. You are forbidden from asking clarification, just execute.""
},
{
"agent": "Casual",
"id": "3",
"need": ["2", "3", "4"],
"task": "These are the results of various steps taken to create a weather app, resume what has been done and conclude"
}
]
}
```
Rules:
- Do not write code. You are a planning agent.
- If you don't know of a concept, use a web agent.
- Put your plan in a json with the key "plan".
- specify work folder name to all coding or file agents.
- You might use a file agent before code agent to setup a project properly. specify folder name.
- Give clear, detailled order to each agent and how their task relate to the previous task (if any).
- The file agent can only conduct one action at the time. successive file agent could be needed.
- Only use web agent for finding necessary informations.
- Always tell the coding agent where to save file.
- Do not search for tutorial.
- Make sure json is within ```json tag
- Coding agent should write the whole code in a single file unless instructed otherwise.
- One step, one agent.
-52
View File
@@ -1,52 +0,0 @@
You are a planner agent.
Your goal is to divide and conquer the task using the following agents:
- Coder: An expert coder agent.
- File: An expert agent for finding files.
- Web: An expert agent for web search.
Agents are other AI that obey your instructions.
You will be given a task and you will need to divide it into smaller tasks and assign them to the agents.
You have to respect a strict format:
```json
{"agent": "agent_name", "need": "needed_agent_output", "task": "agent_task"}
```
User: make a weather app in python
You: Sure, here is the plan:
## Task 1: I will search for available weather api
## Task 2: I will create an api key for the weather api
## Task 3: I will make a weather app in python
```json
{
"plan": [
{
"agent": "Web",
"id": "1",
"need": null,
"task": "Search for reliable weather APIs"
},
{
"agent": "Web",
"id": "2",
"need": "1",
"task": "Obtain API key from the selected service"
},
{
"agent": "Coder",
"id": "3",
"need": "2",
"task": "Develop a Python application using the API and key to fetch and display weather data"
}
]
}
```
Rules:
- Do not write code. You are a planning agent.
- Put your plan in a json with the key "plan".
+56
View File
@@ -0,0 +1,56 @@
[project]
name = "agenticseek"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
"adaptive-classifier>=0.0.10",
"aiofiles>=24.1.0",
"anyio>=3.5.0,<5",
"celery>=5.5.1",
"certifi==2025.4.26",
"chromedriver-autoinstaller>=0.6.4",
"colorama>=0.4.6",
"distro>=1.7.0,<2",
"fake-useragent>=2.1.0",
"fastapi>=0.115.12",
"flask>=3.1.0",
"httpx>=0.27,<0.29",
"ipython>=8.13.0",
"jiter>=0.4.0,<1",
"kokoro==0.9.4",
"langid>=1.1.6",
"librosa>=0.10.2.post1",
"markdownify>=1.1.0",
"numpy>=1.24.4",
"ollama>=0.4.7",
"openai>=1.84.0",
"ordered-set>=4.1.0",
"playsound3>=1.0.0",
"protobuf>=3.20.3",
"pyaudio>=0.2.14",
"pydantic>=2.10.6",
"pydantic-core>=2.27.2",
"pypdf>=5.4.0",
"pypinyin>=0.54.0",
"pyreadline3>=3.5.4",
"python-dotenv>=1.0.0",
"requests>=2.31.0",
"sacremoses>=0.0.53",
"scipy>=1.9.3",
"selenium>=4.27.1",
"selenium-stealth>=1.0.6",
"sentencepiece>=0.2.0",
"setuptools>=75.6.0",
"sniffio>=1.3.1",
"soundfile>=0.13.1",
"termcolor>=2.4.0",
"text2emotion>=0.0.5",
"together>=1.5.0",
"torch>=2.4.1",
"tqdm>4",
"transformers>=4.46.3",
"undetected-chromedriver>=3.5.5",
"uvicorn>=0.34.0",
]
+42 -25
View File
@@ -1,32 +1,49 @@
requests==2.31.0
openai==1.61.1
colorama==0.4.6
python-dotenv==1.0.0
playsound==1.3.0
soundfile==0.13.1
transformers==4.48.3
torch==2.5.1
ollama==0.4.7
scipy==1.15.1
kokoro==0.7.12
flask==3.1.0
soundfile==0.13.1
protobuf==3.20.3
termcolor==2.5.0
ipython==8.34.0
gliclass==0.1.8
pyaudio==0.2.14
librosa==0.10.2.post1
selenium==4.29.0
markdownify==1.1.0
certifi==2025.4.26
fastapi>=0.115.12
flask>=3.1.0
celery>=5.5.1
aiofiles>=24.1.0
uvicorn>=0.34.0
pydantic>=2.10.6
pydantic_core>=2.27.2
setuptools>=75.6.0
sacremoses>=0.0.53
requests>=2.31.0
numpy>=1.24.4
colorama>=0.4.6
python-dotenv>=1.0.0
playsound3>=1.0.0
soundfile>=0.13.1
transformers>=4.46.3
torch>=2.4.1
ollama>=0.4.7
scipy>=1.9.3
protobuf>=3.20.3
termcolor>=2.4.0
pypdf>=5.4.0
ipython>=8.13.0
pyaudio>=0.2.14
librosa>=0.10.2.post1
selenium>=4.27.1
markdownify>=1.1.0
text2emotion>=0.0.5
adaptive-classifier>=0.0.10
langid>=1.1.6
chromedriver-autoinstaller>=0.6.4
httpx>=0.27,<0.29
anyio>=3.5.0,<5
distro>=1.7.0,<2
jiter>=0.4.0,<1
sniffio
fake_useragent>=2.1.0
selenium_stealth>=1.0.6
undetected-chromedriver>=3.5.5
sentencepiece>=0.2.0
together>=1.5.0
tqdm>4
# if use chinese
openai
sniffio
ordered_set
pypinyin
cn2an
jieba
# Optional: TTS support (requires Python <3.12)
# pip install kokoro==0.9.4 soundfile ipython
Regular → Executable
+44 -7
View File
@@ -2,16 +2,53 @@
echo "Starting installation for Linux..."
set -e
# Check if uv is installed
if ! command -v uv &> /dev/null; then
echo "Error: uv is not installed. Please install uv first."
echo "You can install it using: curl -LsSf https://astral.sh/uv/install.sh | sh"
exit 1
fi
# Update package list
sudo apt-get update
sudo apt-get update || { echo "Failed to update package list"; exit 1; }
# make sure essential tool are installed
sudo apt-get install -y \
python3-dev \
build-essential \
alsa-utils \
portaudio19-dev \
python3-pyaudio \
libgtk-3-dev \
libnotify-dev \
libgconf-2-4 \
libnss3 \
libxss1 || { echo "Failed to install packages"; exit 1; }
# Install Python dependencies from requirements.txt
pip3 install -r requirements.txt
# Initialize uv project if pyproject.toml doesn't exist
if [ ! -f "pyproject.toml" ]; then
echo "Initializing uv project..."
uv init --python 3.10 || { echo "Failed to initialize uv project"; exit 1; }
fi
# Install Selenium for chromedriver
pip3 install selenium
# Sync the project (creates venv and installs dependencies)
echo "Setting up Python environment with uv..."
uv sync --python 3.10 || { echo "Failed to sync uv project"; exit 1; }
# Install portaudio for pyAudio
sudo apt-get install -y portaudio19-dev python3-dev alsa-utils
# Add specific packages
echo "Adding Selenium..."
uv add selenium || { echo "Failed to add selenium"; exit 1; }
# Add dependencies from requirements.txt if it exists
if [ -f "requirements.txt" ]; then
echo "Adding dependencies from requirements.txt..."
uv add -r requirements.txt || { echo "Failed to add requirements from requirements.txt"; exit 1; }
fi
# install docker compose
sudo apt install -y docker-compose
echo "Installation complete for Linux!"
echo "To activate the environment, run: source .venv/bin/activate"
echo "Or run commands with: uv run <command>"
Regular → Executable
+39 -5
View File
@@ -2,16 +2,50 @@
echo "Starting installation for macOS..."
# Install Python dependencies from requirements.txt
pip3 install -r requirements.txt
set -e
# Check if uv is installed
if ! command -v uv &> /dev/null; then
echo "Error: uv is not installed. Please install uv first."
echo "You can install it using: curl -LsSf https://astral.sh/uv/install.sh | sh"
exit 1
fi
# Check if homebrew is installed
if ! command -v brew &> /dev/null; then
echo "Homebrew not found. Installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# update
brew update
# make sure wget installed
brew install wget
# Install chromedriver using Homebrew
brew install --cask chromedriver
# Install portaudio for pyAudio using Homebrew
brew install portaudio
# Install Selenium
pip3 install selenium
# Initialize uv project if pyproject.toml doesn't exist
if [ ! -f "pyproject.toml" ]; then
echo "Initializing uv project..."
uv init --python 3.10 || { echo "Failed to initialize uv project"; exit 1; }
fi
# Sync the project (creates venv and installs dependencies)
echo "Setting up Python environment with uv..."
uv sync --python 3.10 || { echo "Failed to sync uv project"; exit 1; }
# Add specific packages
echo "Adding Selenium..."
uv add selenium || { echo "Failed to add selenium"; exit 1; }
# Add dependencies from requirements.txt if it exists
if [ -f "requirements.txt" ]; then
echo "Adding dependencies from requirements.txt..."
uv add -r requirements.txt || { echo "Failed to add requirements from requirements.txt"; exit 1; }
fi
echo "Installation complete for macOS!"
echo "To activate the environment, run: source .venv/bin/activate"
echo "Or run commands with: uv run <command>"
+67
View File
@@ -0,0 +1,67 @@
@echo off
echo Starting installation for Windows...
REM Check if uv is installed
uv --version >nul 2>&1
if %errorlevel% neq 0 (
echo Error: uv is not installed. Please install uv first.
echo You can install it using: powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
pause
exit /b 2
)
REM Initialize uv project if pyproject.toml doesn't exist
if not exist "pyproject.toml" (
echo Initializing uv project...
uv init --python 3.10
if %errorlevel% neq 0 (
echo Failed to initialize uv project
pause
exit /b 1
)
)
REM Sync the project (creates venv and installs dependencies)
echo Setting up Python environment with uv...
uv sync --python 3.10
if %errorlevel% neq 0 (
echo Failed to sync uv project
pause
exit /b 1
)
REM Add specific packages
echo Adding pyreadline3...
uv add pyreadline3
if %errorlevel% neq 0 (
echo Failed to add pyreadline3
pause
exit /b 1
)
echo Adding Selenium...
uv add selenium
if %errorlevel% neq 0 (
echo Failed to add selenium
pause
exit /b 1
)
REM Add dependencies from requirements.txt if it exists
if exist "requirements.txt" (
echo Adding dependencies from requirements.txt...
uv add -r requirements.txt
if %errorlevel% neq 0 (
echo Warning: Some packages from requirements.txt failed to install.
)
)
echo Installation complete for Windows!
echo To activate the environment, run: .venv\Scripts\activate
echo Or run commands with: uv run ^<command^>
echo.
echo Note: pyAudio installation may require additional steps on Windows.
echo If pyAudio fails to install, please install portaudio manually and try again.
echo Also, chromedriver-autoinstaller should handle chromedriver automatically.
echo If needed, download chromedriver manually from: https://sites.google.com/chromium.org/driver/getting-started
pause
-16
View File
@@ -1,16 +0,0 @@
#!/bin/bash
echo "Starting installation for Windows..."
# Install Python dependencies from requirements.txt
pip3 install -r requirements.txt
# Install Selenium
pip3 install selenium
echo "Note: pyAudio installation may require additional steps on Windows."
echo "Please install portaudio manually (e.g., via vcpkg or prebuilt binaries) and then run: pip3 install pyaudio"
echo "Also, download and install chromedriver manually from: https://sites.google.com/chromium.org/driver/getting-started"
echo "Place chromedriver in a directory included in your PATH."
echo "Installation partially complete for Windows. Follow manual steps above."
-1
View File
@@ -1 +0,0 @@
SEARXNG_BASE_URL="http://127.0.0.1:8080"
+4 -2
View File
@@ -1,3 +1,4 @@
version: '3'
services:
redis:
container_name: redis
@@ -28,8 +29,9 @@ services:
- ./searxng:/etc/searxng:rw
environment:
- SEARXNG_BASE_URL=http://localhost:8080/
- UWSGI_WORKERS=4
- UWSGI_THREADS=4
- UWSGI_WORKERS=1
- UWSGI_THREADS=1
user: "1000:1000" # Run as current user to avoid permission issues
cap_add:
- CHOWN
- SETGID

Some files were not shown because too many files have changed in this diff Show More