aon-agent 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. aon_agent-1.0.0/LICENSE +21 -0
  2. aon_agent-1.0.0/PKG-INFO +369 -0
  3. aon_agent-1.0.0/README.md +335 -0
  4. aon_agent-1.0.0/pyproject.toml +56 -0
  5. aon_agent-1.0.0/setup.cfg +4 -0
  6. aon_agent-1.0.0/src/aon/__init__.py +2 -0
  7. aon_agent-1.0.0/src/aon/approval_gate.py +48 -0
  8. aon_agent-1.0.0/src/aon/attachments.py +132 -0
  9. aon_agent-1.0.0/src/aon/audit.py +10 -0
  10. aon_agent-1.0.0/src/aon/backends.py +42 -0
  11. aon_agent-1.0.0/src/aon/build.py +111 -0
  12. aon_agent-1.0.0/src/aon/capabilities.py +28 -0
  13. aon_agent-1.0.0/src/aon/cli.py +147 -0
  14. aon_agent-1.0.0/src/aon/composite_skills.py +30 -0
  15. aon_agent-1.0.0/src/aon/config.py +64 -0
  16. aon_agent-1.0.0/src/aon/context.py +160 -0
  17. aon_agent-1.0.0/src/aon/default_skills/creating-skills/SKILL.md +61 -0
  18. aon_agent-1.0.0/src/aon/default_skills/creating-skills/evals/evals.json +23 -0
  19. aon_agent-1.0.0/src/aon/default_skills/creating-skills/references/best-practices.md +40 -0
  20. aon_agent-1.0.0/src/aon/default_skills/creating-skills/references/descriptions.md +39 -0
  21. aon_agent-1.0.0/src/aon/default_skills/creating-skills/references/evals.md +41 -0
  22. aon_agent-1.0.0/src/aon/default_skills/creating-skills/references/scripts.md +30 -0
  23. aon_agent-1.0.0/src/aon/docs.py +426 -0
  24. aon_agent-1.0.0/src/aon/engine.py +327 -0
  25. aon_agent-1.0.0/src/aon/executor.py +38 -0
  26. aon_agent-1.0.0/src/aon/geo.py +718 -0
  27. aon_agent-1.0.0/src/aon/hub.py +98 -0
  28. aon_agent-1.0.0/src/aon/install_tools.py +80 -0
  29. aon_agent-1.0.0/src/aon/link_intake.py +233 -0
  30. aon_agent-1.0.0/src/aon/llm_client.py +94 -0
  31. aon_agent-1.0.0/src/aon/main.py +61 -0
  32. aon_agent-1.0.0/src/aon/mcp_client.py +216 -0
  33. aon_agent-1.0.0/src/aon/mcp_server.py +134 -0
  34. aon_agent-1.0.0/src/aon/mcp_tools.py +19 -0
  35. aon_agent-1.0.0/src/aon/memory.py +180 -0
  36. aon_agent-1.0.0/src/aon/memory_extract.py +148 -0
  37. aon_agent-1.0.0/src/aon/memory_semantic.py +134 -0
  38. aon_agent-1.0.0/src/aon/model_tools.py +192 -0
  39. aon_agent-1.0.0/src/aon/persistence.py +159 -0
  40. aon_agent-1.0.0/src/aon/prompts.py +62 -0
  41. aon_agent-1.0.0/src/aon/recall.py +224 -0
  42. aon_agent-1.0.0/src/aon/router.py +209 -0
  43. aon_agent-1.0.0/src/aon/skill_author.py +72 -0
  44. aon_agent-1.0.0/src/aon/skill_evals.py +245 -0
  45. aon_agent-1.0.0/src/aon/skill_import.py +207 -0
  46. aon_agent-1.0.0/src/aon/skills.py +168 -0
  47. aon_agent-1.0.0/src/aon/static/aon-loader.svg +39 -0
  48. aon_agent-1.0.0/src/aon/static/aon-logo.svg +34 -0
  49. aon_agent-1.0.0/src/aon/static/fonts/Exo2-italic-400-latin-ext.woff2 +0 -0
  50. aon_agent-1.0.0/src/aon/static/fonts/Exo2-italic-400-latin.woff2 +0 -0
  51. aon_agent-1.0.0/src/aon/static/fonts/Exo2-normal-300-700-latin-ext.woff2 +0 -0
  52. aon_agent-1.0.0/src/aon/static/fonts/Exo2-normal-300-700-latin.woff2 +0 -0
  53. aon_agent-1.0.0/src/aon/static/fonts/JetBrainsMono-normal-400-600-latin-ext.woff2 +0 -0
  54. aon_agent-1.0.0/src/aon/static/fonts/JetBrainsMono-normal-400-600-latin.woff2 +0 -0
  55. aon_agent-1.0.0/src/aon/static/fonts/OFL-exo2.txt +93 -0
  56. aon_agent-1.0.0/src/aon/static/fonts/OFL-jetbrainsmono.txt +93 -0
  57. aon_agent-1.0.0/src/aon/static/fonts/OFL-orbitron.txt +93 -0
  58. aon_agent-1.0.0/src/aon/static/fonts/OFL-rajdhani.txt +93 -0
  59. aon_agent-1.0.0/src/aon/static/fonts/Orbitron-normal-600-800-latin.woff2 +0 -0
  60. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-400-latin-ext.woff2 +0 -0
  61. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-400-latin.woff2 +0 -0
  62. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-500-latin-ext.woff2 +0 -0
  63. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-500-latin.woff2 +0 -0
  64. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-600-latin-ext.woff2 +0 -0
  65. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-600-latin.woff2 +0 -0
  66. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-700-latin-ext.woff2 +0 -0
  67. aon_agent-1.0.0/src/aon/static/fonts/Rajdhani-normal-700-latin.woff2 +0 -0
  68. aon_agent-1.0.0/src/aon/static/index.html +1068 -0
  69. aon_agent-1.0.0/src/aon/static/lib/aon-map.css +72 -0
  70. aon_agent-1.0.0/src/aon/static/lib/aon-map.js +425 -0
  71. aon_agent-1.0.0/src/aon/static/lib/atom-one-dark.min.css +1 -0
  72. aon_agent-1.0.0/src/aon/static/lib/cyber-icons.svg +157 -0
  73. aon_agent-1.0.0/src/aon/static/lib/cybercore.LICENSE +21 -0
  74. aon_agent-1.0.0/src/aon/static/lib/cybercore.min.css +1 -0
  75. aon_agent-1.0.0/src/aon/static/lib/fonts.css +136 -0
  76. aon_agent-1.0.0/src/aon/static/lib/highlight.min.js +1213 -0
  77. aon_agent-1.0.0/src/aon/static/lib/maplibre-gl.LICENSE +116 -0
  78. aon_agent-1.0.0/src/aon/static/lib/maplibre-gl.css +1 -0
  79. aon_agent-1.0.0/src/aon/static/lib/maplibre-gl.js +59 -0
  80. aon_agent-1.0.0/src/aon/static/lib/marked.min.js +6 -0
  81. aon_agent-1.0.0/src/aon/static/lib/purify.min.js +3 -0
  82. aon_agent-1.0.0/src/aon/summary.py +95 -0
  83. aon_agent-1.0.0/src/aon/telegram.py +34 -0
  84. aon_agent-1.0.0/src/aon/tools/__init__.py +0 -0
  85. aon_agent-1.0.0/src/aon/tools/base.py +40 -0
  86. aon_agent-1.0.0/src/aon/tools/files_read.py +32 -0
  87. aon_agent-1.0.0/src/aon/tools/files_write.py +58 -0
  88. aon_agent-1.0.0/src/aon/tools/map_tool.py +30 -0
  89. aon_agent-1.0.0/src/aon/tools/paths.py +12 -0
  90. aon_agent-1.0.0/src/aon/tools/shell.py +20 -0
  91. aon_agent-1.0.0/src/aon/tools/web.py +45 -0
  92. aon_agent-1.0.0/src/aon/web.py +522 -0
  93. aon_agent-1.0.0/src/aon_agent.egg-info/PKG-INFO +369 -0
  94. aon_agent-1.0.0/src/aon_agent.egg-info/SOURCES.txt +185 -0
  95. aon_agent-1.0.0/src/aon_agent.egg-info/dependency_links.txt +1 -0
  96. aon_agent-1.0.0/src/aon_agent.egg-info/entry_points.txt +2 -0
  97. aon_agent-1.0.0/src/aon_agent.egg-info/requires.txt +10 -0
  98. aon_agent-1.0.0/src/aon_agent.egg-info/top_level.txt +1 -0
  99. aon_agent-1.0.0/tests/test_approval_gate.py +23 -0
  100. aon_agent-1.0.0/tests/test_attachments.py +115 -0
  101. aon_agent-1.0.0/tests/test_attachments_flow.py +128 -0
  102. aon_agent-1.0.0/tests/test_audit.py +13 -0
  103. aon_agent-1.0.0/tests/test_backends.py +117 -0
  104. aon_agent-1.0.0/tests/test_build.py +21 -0
  105. aon_agent-1.0.0/tests/test_build_mcp.py +20 -0
  106. aon_agent-1.0.0/tests/test_build_memory_skills.py +14 -0
  107. aon_agent-1.0.0/tests/test_build_prompt.py +13 -0
  108. aon_agent-1.0.0/tests/test_build_router.py +17 -0
  109. aon_agent-1.0.0/tests/test_capabilities.py +25 -0
  110. aon_agent-1.0.0/tests/test_chat_summary.py +171 -0
  111. aon_agent-1.0.0/tests/test_cli.py +92 -0
  112. aon_agent-1.0.0/tests/test_composite_skills.py +29 -0
  113. aon_agent-1.0.0/tests/test_config.py +31 -0
  114. aon_agent-1.0.0/tests/test_context_budget.py +98 -0
  115. aon_agent-1.0.0/tests/test_context_injection.py +24 -0
  116. aon_agent-1.0.0/tests/test_context_wiring.py +108 -0
  117. aon_agent-1.0.0/tests/test_conversation_flow.py +42 -0
  118. aon_agent-1.0.0/tests/test_conversations.py +36 -0
  119. aon_agent-1.0.0/tests/test_dispatch.py +41 -0
  120. aon_agent-1.0.0/tests/test_docs.py +325 -0
  121. aon_agent-1.0.0/tests/test_engine_loop.py +35 -0
  122. aon_agent-1.0.0/tests/test_engine_recovery.py +76 -0
  123. aon_agent-1.0.0/tests/test_engine_router.py +82 -0
  124. aon_agent-1.0.0/tests/test_exact_fit_and_retry.py +168 -0
  125. aon_agent-1.0.0/tests/test_executor.py +24 -0
  126. aon_agent-1.0.0/tests/test_files_read.py +27 -0
  127. aon_agent-1.0.0/tests/test_files_write.py +31 -0
  128. aon_agent-1.0.0/tests/test_geo.py +477 -0
  129. aon_agent-1.0.0/tests/test_honesty_secrets.py +80 -0
  130. aon_agent-1.0.0/tests/test_hooks.py +37 -0
  131. aon_agent-1.0.0/tests/test_hub.py +121 -0
  132. aon_agent-1.0.0/tests/test_install_capture.py +41 -0
  133. aon_agent-1.0.0/tests/test_is_install.py +14 -0
  134. aon_agent-1.0.0/tests/test_link_intake.py +254 -0
  135. aon_agent-1.0.0/tests/test_llm_client_chat.py +37 -0
  136. aon_agent-1.0.0/tests/test_llm_client_models.py +12 -0
  137. aon_agent-1.0.0/tests/test_llm_usage.py +13 -0
  138. aon_agent-1.0.0/tests/test_main_mcp_wiring.py +23 -0
  139. aon_agent-1.0.0/tests/test_main_smoke.py +117 -0
  140. aon_agent-1.0.0/tests/test_map_flow.py +334 -0
  141. aon_agent-1.0.0/tests/test_map_hint.py +237 -0
  142. aon_agent-1.0.0/tests/test_mcp_http.py +36 -0
  143. aon_agent-1.0.0/tests/test_mcp_manager.py +96 -0
  144. aon_agent-1.0.0/tests/test_mcp_server.py +119 -0
  145. aon_agent-1.0.0/tests/test_mcp_tools.py +27 -0
  146. aon_agent-1.0.0/tests/test_memory.py +15 -0
  147. aon_agent-1.0.0/tests/test_memory_episodic.py +68 -0
  148. aon_agent-1.0.0/tests/test_memory_extract.py +56 -0
  149. aon_agent-1.0.0/tests/test_memory_recall.py +91 -0
  150. aon_agent-1.0.0/tests/test_memory_semantic.py +206 -0
  151. aon_agent-1.0.0/tests/test_message_order.py +58 -0
  152. aon_agent-1.0.0/tests/test_model_errors.py +87 -0
  153. aon_agent-1.0.0/tests/test_model_tools.py +152 -0
  154. aon_agent-1.0.0/tests/test_persistence.py +18 -0
  155. aon_agent-1.0.0/tests/test_plan_tracking.py +59 -0
  156. aon_agent-1.0.0/tests/test_probe_directives.py +10 -0
  157. aon_agent-1.0.0/tests/test_prompts.py +11 -0
  158. aon_agent-1.0.0/tests/test_prompts_capabilities.py +34 -0
  159. aon_agent-1.0.0/tests/test_prompts_plan.py +12 -0
  160. aon_agent-1.0.0/tests/test_prompts_skill_guidance.py +7 -0
  161. aon_agent-1.0.0/tests/test_recall.py +239 -0
  162. aon_agent-1.0.0/tests/test_recall_cross.py +166 -0
  163. aon_agent-1.0.0/tests/test_repetition.py +21 -0
  164. aon_agent-1.0.0/tests/test_router.py +63 -0
  165. aon_agent-1.0.0/tests/test_search_conversation.py +30 -0
  166. aon_agent-1.0.0/tests/test_shell_tool.py +17 -0
  167. aon_agent-1.0.0/tests/test_skill_author.py +55 -0
  168. aon_agent-1.0.0/tests/test_skill_evals_core.py +55 -0
  169. aon_agent-1.0.0/tests/test_skill_evals_runner.py +104 -0
  170. aon_agent-1.0.0/tests/test_skill_import.py +184 -0
  171. aon_agent-1.0.0/tests/test_skills.py +78 -0
  172. aon_agent-1.0.0/tests/test_static_mount.py +107 -0
  173. aon_agent-1.0.0/tests/test_system_prompt.py +26 -0
  174. aon_agent-1.0.0/tests/test_telegram.py +28 -0
  175. aon_agent-1.0.0/tests/test_tool_paths_and_empty.py +36 -0
  176. aon_agent-1.0.0/tests/test_tool_registry.py +22 -0
  177. aon_agent-1.0.0/tests/test_web_conversation.py +49 -0
  178. aon_agent-1.0.0/tests/test_web_evals.py +30 -0
  179. aon_agent-1.0.0/tests/test_web_mcp.py +37 -0
  180. aon_agent-1.0.0/tests/test_web_mcp_http.py +31 -0
  181. aon_agent-1.0.0/tests/test_web_memory.py +26 -0
  182. aon_agent-1.0.0/tests/test_web_memskills.py +24 -0
  183. aon_agent-1.0.0/tests/test_web_prompt.py +20 -0
  184. aon_agent-1.0.0/tests/test_web_rest.py +30 -0
  185. aon_agent-1.0.0/tests/test_web_skill_import.py +79 -0
  186. aon_agent-1.0.0/tests/test_web_tools.py +24 -0
  187. aon_agent-1.0.0/tests/test_web_ws.py +57 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sithu Htun (leo007-htun)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,369 @@
1
+ Metadata-Version: 2.4
2
+ Name: aon-agent
3
+ Version: 1.0.0
4
+ Summary: Self-contained, obliterated AI agent on your own GPU: memory, document RAG, tools, MCP, maps, multi-user via vLLM.
5
+ Author: Sithu Htun
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/leo007-htun/AON
8
+ Project-URL: Source, https://github.com/leo007-htun/AON
9
+ Project-URL: Issues, https://github.com/leo007-htun/AON/issues
10
+ Project-URL: Demo, https://www.youtube.com/watch?v=wLiVhkLOd-8
11
+ Keywords: ai-agent,llm,self-hosted,local-llm,uncensored,vllm,ollama,rag,mcp,agentic-ai
12
+ Classifier: Development Status :: 4 - Beta
13
+ Classifier: Environment :: Web Environment
14
+ Classifier: Framework :: FastAPI
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: Operating System :: POSIX :: Linux
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: fastapi>=0.115
25
+ Requires-Dist: uvicorn>=0.30
26
+ Requires-Dist: httpx>=0.27
27
+ Requires-Dist: websockets>=12
28
+ Requires-Dist: mcp<2,>=1.20
29
+ Requires-Dist: pypdf>=5
30
+ Provides-Extra: test
31
+ Requires-Dist: pytest>=8; extra == "test"
32
+ Requires-Dist: pytest-asyncio>=0.23; extra == "test"
33
+ Dynamic: license-file
34
+
35
+ <div align="center">
36
+
37
+ # ๐Ÿ›ฐ๏ธ AON : Self-Contained Obliterated AI
38
+
39
+ [![Live](https://img.shields.io/badge/live-aon.vulkron.uk-00e5ff?style=for-the-badge&logo=cloudflare&logoColor=white)](https://aon.vulkron.uk)
40
+ [![YouTube demo](https://img.shields.io/badge/demo-YouTube-FF0000?style=for-the-badge&logo=youtube&logoColor=white)](https://www.youtube.com/watch?v=wLiVhkLOd-8)
41
+ [![License: MIT](https://img.shields.io/badge/license-MIT-22c55e?style=for-the-badge)](LICENSE)
42
+ [![Android APK](https://img.shields.io/badge/Android-download%20APK-3DDC84?style=for-the-badge&logo=android&logoColor=white)](https://github.com/leo007-htun/AON/releases/latest/download/AON.apk)
43
+
44
+ ![Python](https://img.shields.io/badge/Python-3.12-3776AB?logo=python&logoColor=white)
45
+ ![FastAPI](https://img.shields.io/badge/FastAPI-0.142-009688?logo=fastapi&logoColor=white)
46
+ ![Uvicorn](https://img.shields.io/badge/Uvicorn-0.54-499848?logo=gunicorn&logoColor=white)
47
+ ![httpx](https://img.shields.io/badge/httpx-0.28-2D7FF9)
48
+ ![WebSockets](https://img.shields.io/badge/WebSockets-17.2-010101?logo=socketdotio&logoColor=white)
49
+ ![MCP](https://img.shields.io/badge/MCP-1.30-6E56CF)
50
+ ![pypdf](https://img.shields.io/badge/pypdf-5.1-E34F26)
51
+ ![SQLite](https://img.shields.io/badge/SQLite-FTS5%20%2B%20vectors-003B57?logo=sqlite&logoColor=white)
52
+
53
+ ![vLLM](https://img.shields.io/badge/vLLM-0.31-30A2FF)
54
+ ![Ollama](https://img.shields.io/badge/Ollama-local%20models-000000?logo=ollama&logoColor=white)
55
+ ![nomic-embed-text](https://img.shields.io/badge/embeddings-nomic--embed--text-5B5BD6)
56
+ ![MapLibre](https://img.shields.io/badge/MapLibre-5.22-396CB2?logo=maplibre&logoColor=white)
57
+ ![Cloudflare](https://img.shields.io/badge/Cloudflare-Tunnel%20%2B%20Access-F38020?logo=cloudflare&logoColor=white)
58
+ ![pytest](https://img.shields.io/badge/tests-pytest-0A9EDC?logo=pytest&logoColor=white)
59
+
60
+ | ๐Ÿ’ฌ Chat | ๐Ÿ—บ๏ธ Maps |
61
+ |:---:|:---:|
62
+ | ![AON chat UI](docs/screenshot.png) | ![AON route on the 3D globe map](docs/map.png) |
63
+
64
+ </div>
65
+
66
+ AON is a self-hosted chat agent that runs on your own hardware with local models. It answers
67
+ questions, runs tools in a workspace (files, shell commands, web fetch and search), remembers you
68
+ across chats, searches your own documents, and can be extended with skills and MCP servers. It
69
+ has a web UI, an Android app and an optional Telegram bot.
70
+
71
+ > ๐Ÿ”’ Nothing is sent to a cloud LLM: chat runs on [Ollama](https://ollama.com) or
72
+ > [vLLM](https://docs.vllm.ai), embeddings on Ollama.
73
+
74
+ ## ๐Ÿ’ก What makes AON different
75
+
76
+ Memory and RAG are table stakes now. What AON adds:
77
+
78
+ - ๐Ÿ”“ **Obliterated and fully yours.** It runs an uncensored ("obliterated") 27B model on a single
79
+ consumer GPU (RTX 4090), with no cloud, no API bills and no provider filtering or logging.
80
+ Your chats, memory and documents never leave the box.
81
+ - ๐Ÿงฌ **It extends itself.** Paste a link and AON works out what it is: a GGUF model it can pull
82
+ (it checks the VRAM budget and tool support first), an MCP server it can connect, a skill repo
83
+ it can import, or docs it can learn from. It can also draft a new skill from any web page and
84
+ test it with evals.
85
+ - ๐Ÿ‘ฅ **A private AI for your whole crew, from one GPU.** The chat model is served by vLLM, so
86
+ several people use it at once. Access goes through Cloudflare Access email PIN, and every user
87
+ is approved by hand.
88
+ - ๐Ÿ›ก๏ธ **Honest by design.** Shell commands and file writes wait for your approval. A reply that
89
+ claims "done" without a tool having run is not trusted, so the real loop runs instead. Secrets
90
+ such as tokens and keys are never saved to memory.
91
+ - ๐Ÿ—บ๏ธ **Grounded, not guessed.** Places and routes come from OpenStreetMap geocoding and routing,
92
+ drawn on a 3D globe. Distances and times are computed by the routing service, not written by
93
+ the model.
94
+ - ๐Ÿ“ฑ **Everywhere you are.** The web UI, the Android app and an optional Telegram bot all reach the
95
+ same agent on your server.
96
+
97
+ ## ๐Ÿ“ฑ Android app
98
+
99
+ [**Download AON.apk**](https://github.com/leo007-htun/AON/releases/latest/download/AON.apk) (260 KB, Android 7.0 or newer).
100
+
101
+ 1. Open the link on your phone and download the APK.
102
+ 2. Allow installs from your browser when Android asks (**Install unknown apps**), then tap **Install**.
103
+ 3. Open AON and sign in with your approved email address (see
104
+ [Trying the live instance](#-trying-the-live-instance)).
105
+
106
+ The app opens <https://aon.vulkron.uk> by default. To use your own server, press **Back** in the
107
+ app and choose **Change server**, for example `http://192.168.1.84:8700` on your home network.
108
+ The APK is signed (APK Signature Scheme v2, certificate `CN=AON, O=Vulkron, C=GB`); its SHA-256 is
109
+ listed on the [release page](https://github.com/leo007-htun/AON/releases/latest).
110
+
111
+ ## ๐ŸŽฌ Demo
112
+
113
+ <div align="center">
114
+
115
+ [![Watch the AON demo on YouTube](https://img.youtube.com/vi/wLiVhkLOd-8/maxresdefault.jpg)](https://www.youtube.com/watch?v=wLiVhkLOd-8)
116
+
117
+ โ–ถ๏ธ *Click the image to watch on YouTube*
118
+
119
+ </div>
120
+
121
+ ## ๐Ÿ”‘ Trying the live instance
122
+
123
+ Access to the live instance is by approval only:
124
+
125
+ 1. ๐Ÿ“ **Request access.** [Open an issue](https://github.com/leo007-htun/AON/issues/new?title=Access%20request)
126
+ titled *Access request*, saying who you are and what you would like to use AON for. Please do
127
+ **not** post your email address in the issue; the maintainer will reply and tell you how to send it.
128
+ 2. โณ **Wait for approval.** Requests are reviewed by hand. Once yours is approved, your email address
129
+ is added to the allowed list and the issue is closed with a note.
130
+ 3. โœ… **Sign in.** Open <https://aon.vulkron.uk>, enter the approved email address, and type the
131
+ one-time PIN that is emailed to you. The PIN sign-in is handled by Cloudflare Access.
132
+
133
+ Access can be withdrawn at any time. The instance runs on private hardware with limited capacity:
134
+ please do not use it for anything illegal, for automated or bulk traffic, or to process other
135
+ people's personal data, and expect a short wait when several people are using it.
136
+
137
+ ## โœจ Features
138
+
139
+ - ๐Ÿ› ๏ธ **Agent loop with tools**: read, write and edit files, run shell commands, fetch and search the
140
+ web, show maps, remember facts. Commands and file writes ask for your approval first.
141
+ - ๐Ÿง  **Long memory**
142
+ - **Episodic memory**: facts about you and your work, stored and searched by meaning; a
143
+ duplicate or an updated fact is merged by the model.
144
+ - **Chat recall**: older turns of a chat (and of your other chats) are found by meaning and by
145
+ exact strings (IPs, codes, numbers) and added to the request.
146
+ - **Rolling summary** of each chat, plus a numbered outline of everything you asked, so
147
+ "what did I ask first?" works in long chats.
148
+ - ๐Ÿ“š **Document library (RAG)**: add text, code, Markdown, HTML, Word (.docx) and PDF files in the
149
+ Documents panel or by attaching them in chat. They are chunked, embedded and indexed (SQLite
150
+ FTS5 + vectors); the relevant passages are added to answers, with the document name.
151
+ - ๐Ÿ“ **Context budget**: every request is fitted to the model's window using the server's exact token
152
+ count (vLLM), so long chats never overflow.
153
+ - ๐Ÿงฉ **Skills**: reusable procedures in the Agent Skills (`SKILL.md`) format. Import from a zip, a
154
+ GitHub URL or pasted text; draft one from a web page; run evals.
155
+ - ๐Ÿ”Œ **MCP**: connect stdio or HTTP MCP servers; browse the Glama MCP directory in the Hub.
156
+ - ๐Ÿ“Ž **Attachments**: files and photos in chat; images go to vision models.
157
+ - ๐Ÿ—บ๏ธ **Maps**: places and routes from OpenStreetMap (Nominatim, OSRM), shown with MapLibre.
158
+ - ๐Ÿ‘ฅ **Multi-user serving**: put the chat model on vLLM to serve several users at once.
159
+
160
+ ## ๐Ÿ“‹ Requirements
161
+
162
+ - Linux (runs on Ubuntu), Python 3.11 or newer (3.12 in use).
163
+ - [Ollama](https://ollama.com) with:
164
+ - an embedding model: `ollama pull nomic-embed-text`
165
+ - a chat model with tool support, for example `ollama pull qwen3:14b`, unless chat runs on vLLM
166
+ - Optional: a GPU server running vLLM (see [`vllm/README.md`](vllm/README.md)).
167
+ - Optional: Node.js 20 for `npx`-based MCP servers (`bin/npx` is a wrapper for a bundled copy).
168
+
169
+ ## ๐Ÿ“ฆ Install
170
+
171
+ ```bash
172
+ pipx install aon-agent # or: pip install aon-agent
173
+ aon init # creates ~/.aon with a starter config.toml
174
+ ```
175
+
176
+ `aon init` takes `--ollama URL`, `--model NAME`, `--bind HOST:PORT` and `--home DIR`. Then pull the
177
+ models it names:
178
+
179
+ ```bash
180
+ ollama pull nomic-embed-text
181
+ ollama pull qwen3:14b # or the chat model you chose with --model
182
+ ```
183
+
184
+ **From source** (for development):
185
+
186
+ ```bash
187
+ git clone https://github.com/leo007-htun/AON.git && cd AON
188
+ python3 -m venv venv && venv/bin/pip install -e ".[test]"
189
+ venv/bin/aon init
190
+ ```
191
+
192
+ Everything AON keeps (config, chats, memory, documents, skills) lives in its **home folder**:
193
+ `--home DIR`, else `$AON_HOME`, else `~/.aon`.
194
+
195
+ ## โš™๏ธ Configure (`config.toml`)
196
+
197
+ `aon init` writes this file into the home folder; edit it to taste.
198
+
199
+ | Key | Meaning | Example |
200
+ |---|---|---|
201
+ | `ollama_base_url` | Ollama's OpenAI-compatible endpoint (embeddings, and chat unless `chat_base_url` is set) | `"http://localhost:11434/v1"` |
202
+ | `default_model` | Model used when the UI does not pick one | `"qwen3:14b"` |
203
+ | `workdir` | The agent's workspace; chats and documents are stored here | `"~/app/workspace"` |
204
+ | `bind` | Address and port of the web UI | `"0.0.0.0:8700"` |
205
+ | `max_steps` | Tool calls allowed per request | `40` |
206
+ | `command_timeout` | Seconds before a shell command is stopped | `120` |
207
+ | `always_ask` | Extra tools that always need approval | `[]` |
208
+ | `embed_model` | Embedding model on Ollama | `"nomic-embed-text"` |
209
+ | `context_window` | The chat model's context length, in tokens | `16384` |
210
+ | `reply_reserve` | Tokens kept free for thinking and the answer | `6144` |
211
+ | `history_tokens` | Recent chat turns sent word for word | `5000` |
212
+ | `cross_chat_recall` | Also recall relevant turns from your other chats | `true` |
213
+ | `chat_base_url` | Optional separate chat backend (vLLM) | `"http://gpu-box:8001/v1"` |
214
+ | `chat_model` | The model name served there; only this model goes to `chat_base_url` | `"aon"` |
215
+ | `chat_temperature`, `chat_top_p`, `chat_repetition_penalty` | Sampling for the chat backend | `0.2`, unset, `1.15` |
216
+ | `chat_vision` | The chat backend model accepts images | `true` |
217
+ | `telegram_bot_token`, `telegram_allowed_chat_ids` | Optional Telegram bot | `""`, `[]` |
218
+
219
+ Keep `context_window` equal to vLLM's `--max-model-len` (or the Ollama model's context).
220
+
221
+ ## ๐Ÿš€ Run
222
+
223
+ ```bash
224
+ aon serve # web UI on the bind address from config.toml
225
+ aon serve --port 9000 # or override host/port
226
+ aon --help
227
+ ```
228
+
229
+ Then open `http://<bind address>` in a browser.
230
+
231
+ ### ๐ŸŒ™ In the background
232
+
233
+ ```bash
234
+ setsid nohup aon serve >> ~/.aon/aon.log 2>&1 < /dev/null &
235
+ pgrep -af '[a]on serve' # is it running?
236
+ tail -f ~/.aon/aon.log # its log
237
+ pkill -f '[a]on serve' # stop it
238
+ ```
239
+
240
+ ### ๐Ÿ” As a service (starts at boot, restarts on failure)
241
+
242
+ ```bash
243
+ sudo tee /etc/systemd/system/aon.service >/dev/null <<'EOF'
244
+ [Unit]
245
+ Description=AON agent
246
+ After=network-online.target
247
+ Wants=network-online.target
248
+
249
+ [Service]
250
+ User=ubuntu
251
+ Environment=AON_HOME=/home/ubuntu/.aon
252
+ ExecStart=/home/ubuntu/.local/bin/aon serve
253
+ Restart=always
254
+ RestartSec=5
255
+
256
+ [Install]
257
+ WantedBy=multi-user.target
258
+ EOF
259
+ sudo systemctl daemon-reload && sudo systemctl enable --now aon
260
+ journalctl -u aon -f
261
+ ```
262
+
263
+ Change `User`, `AON_HOME` and the `aon` path (`which aon`) to match your setup. Python code changes need a restart;
264
+ `static/index.html` is read on every request, so UI changes show on reload.
265
+
266
+ ## ๐Ÿ”Œ Use AON from other AI apps (MCP)
267
+
268
+ `aon mcp` runs AON as an [MCP](https://modelcontextprotocol.io) server over stdio, so Claude
269
+ Desktop, Claude Code, Cursor and other MCP clients can use it:
270
+
271
+ | Tool | What it does |
272
+ |---|---|
273
+ | `ask_aon` | Hand AON a task or question; it answers with its own model, memory, documents and tools. Use `chat` to continue a conversation. |
274
+ | `search_memory` | Search AON's long-term memory about you (read-only) |
275
+ | `remember` | Save a fact to AON's memory |
276
+ | `search_documents` | Search your document library (read-only) |
277
+ | `list_documents` | List the library (read-only) |
278
+ | `add_document` | Add a text document to the library |
279
+
280
+ Shell commands and file writes are always refused over MCP, because there is no one to approve them there.
281
+
282
+ **Claude Desktop** (`claude_desktop_config.json`) and **Cursor** (`~/.cursor/mcp.json`):
283
+
284
+ ```json
285
+ {
286
+ "mcpServers": {
287
+ "aon": { "command": "aon", "args": ["mcp"] }
288
+ }
289
+ }
290
+ ```
291
+
292
+ **Claude Code:**
293
+
294
+ ```bash
295
+ claude mcp add aon -- aon mcp
296
+ ```
297
+
298
+ Add `"--home", "/path/to/home"` to `args` to use a different home folder. If the client cannot find
299
+ `aon`, give the full path from `which aon`.
300
+
301
+ ## โšก Chat on vLLM (several users at once)
302
+
303
+ Ollama answers one request at a time for some models. To serve several users, run the chat
304
+ model on vLLM and point AON at it:
305
+
306
+ ```toml
307
+ chat_base_url = "http://<gpu-box>:8001/v1"
308
+ chat_model = "aon"
309
+ default_model = "aon"
310
+ context_window = 16384
311
+ ```
312
+
313
+ [`vllm/`](vllm/) has the systemd unit, the chat template and the exact package versions used.
314
+ Measured on one RTX 4090 (24 GB) with a 27B 4-bit model: 16K context serves 2โ€“3 full-length
315
+ requests at once and the rest queue; 8K serves 4.
316
+
317
+ ## ๐ŸŒ Remote access
318
+
319
+ AON has no login of its own. Keep `bind` on your LAN and, to reach it from outside, put it behind
320
+ an authenticating proxy, for example a Cloudflare Tunnel with Cloudflare Access (email PIN).
321
+ Geolocation in the map needs HTTPS.
322
+
323
+ ## ๐Ÿงช Tests
324
+
325
+ ```bash
326
+ pip install -e ".[test]"
327
+ pytest -q
328
+ ```
329
+
330
+ ## ๐Ÿ—‚๏ธ Project layout
331
+
332
+ | Path | What it is |
333
+ |---|---|
334
+ | `src/aon/cli.py` | The `aon` command: `init`, `serve`, `mcp` |
335
+ | `src/aon/main.py` | Builds AON from `config.toml` (shared by `serve` and `mcp`) |
336
+ | `src/aon/mcp_server.py` | AON as an MCP server |
337
+ | `src/aon/web.py` | FastAPI app: REST API and the chat WebSocket |
338
+ | `src/aon/engine.py` | The agent loop (tool calls, approval, loop guard) |
339
+ | `src/aon/router.py` | Planner: answer directly, ask, or plan tool steps |
340
+ | `src/aon/llm_client.py`, `backends.py` | Model calls; Ollama or vLLM per model |
341
+ | `src/aon/context.py` | Fitting requests into the context window |
342
+ | `src/aon/recall.py`, `summary.py` | Chat recall, rolling summary, outline |
343
+ | `src/aon/memory*.py` | Episodic memory, extraction, consolidation |
344
+ | `src/aon/docs.py` | Document library (RAG) |
345
+ | `src/aon/skills.py`, `skill_*.py` | Skills: store, import, authoring, evals |
346
+ | `src/aon/mcp_client.py`, `mcp_tools.py`, `hub.py` | MCP servers and the Glama hub |
347
+ | `src/aon/tools/` | Built-in tools (files, shell, web, map) |
348
+ | `src/aon/static/` | Web UI (`index.html`), icons, fonts, map library |
349
+ | `src/aon/default_skills/` | Skills copied into a new home by `aon init` |
350
+ | `tests/` | Test suite |
351
+ | `specs/` | Design notes |
352
+ | `vllm/` | vLLM server setup |
353
+
354
+ ## ๐Ÿ’พ Data
355
+
356
+ AON keeps its data in its home folder: `workspace/app.db` (chats), `workspace/docs.db` (document
357
+ library), `memory/episodes.db` (memory) and `workspace/uploads/` (attachments). This repository
358
+ includes a snapshot of them from 2026-10-14. A fresh install creates empty ones; to start clean,
359
+ delete them before the first run. The Glama API key is kept in `.glama_key`, which is git-ignored.
360
+
361
+ ## ๐Ÿ“„ License
362
+
363
+ AON is released under the [MIT License](LICENSE). ยฉ 2026 Sithu Htun ([@leo007-htun](https://github.com/leo007-htun)).
364
+
365
+ Bundled third-party files keep their own licenses, included next to them:
366
+ [CybercoreCSS](static/lib/cybercore.LICENSE) (MIT),
367
+ [MapLibre GL JS](static/lib/maplibre-gl.LICENSE) (BSD-3-Clause),
368
+ highlight.js (BSD-3-Clause), and the Exo 2, JetBrains Mono, Orbitron and Rajdhani fonts
369
+ ([SIL Open Font License](static/fonts/)).