From 4a6721c3be98bcad9d99978e0cbf0f852e7d2dd5 Mon Sep 17 00:00:00 2001 From: Ed_ Date: Sun, 22 Feb 2026 10:09:19 -0500 Subject: [PATCH] cache improvement (gemini) --- Readme.md | 22 ++++++++++++++++++---- ai_client.py | 26 ++++++++++++++++++++++---- 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/Readme.md b/Readme.md index 93bbef1..a72d1b5 100644 --- a/Readme.md +++ b/Readme.md @@ -1,6 +1,8 @@ # Manual Slop -An AI coding assistant interface featuring multi-project management, rich discussion history, dynamic tool utilization, and a robust frontend. +Vibe coding.. but more manual + +![img](./gallery/python_2026-02-21_23-37-29.png) This tool is designed to work as an auxiliary assistant that natively interacts with your codebase via PowerShell and MCP-like file tools, supporting both Anthropic and Gemini APIs. @@ -25,7 +27,19 @@ Features: * [docs/guide_tools.md](docs/guide_tools.md) for information on the AI tooling capabilities * [docs/guide_architecture.md](docs/guide_architecture.md) for an in-depth breakdown of the codebase architecture -## Running +## Instructions -Use `uv run gui.py` or `python gui.py` to launch the frontend. -Requires a `credentials.toml` file in the root directory containing `gemini` and `anthropic` API keys. +1. Make a credentials.toml in the immediate directory of your clone: + +```toml +[gemini] +api_key = "****" +[anthropic] +api_key = "****" +``` + +2. Have fun. This is experiemntal slop. + +```ps1 +uv run .\gui.py +``` diff --git a/ai_client.py b/ai_client.py index 8655c79..308eeea 100644 --- a/ai_client.py +++ b/ai_client.py @@ -430,11 +430,24 @@ def _send_gemini(md_content: str, user_message: str, base_dir: str, file_items: sys_instr = f"{_get_combined_system_prompt()}\n\n\n{md_content}\n" tools_decl = [_gemini_tool_declaration()] - global _gemini_cache + global _gemini_cache, _gemini_chat + + # DYNAMIC CONTEXT: Check if files/context changed mid-session + current_md_hash = hash(md_content) + old_history = None + if _gemini_chat and getattr(_gemini_chat, "_last_md_hash", None) != current_md_hash: + old_history = list(_gemini_chat.history) if _gemini_chat.history else [] + if _gemini_cache: + try: _gemini_client.caches.delete(name=_gemini_cache.name) + except: pass + _gemini_chat = None + _gemini_cache = None + _append_comms("OUT", "request", {"message": "[CONTEXT CHANGED] Rebuilding cache and chat session..."}) + if not _gemini_chat: chat_config = types.GenerateContentConfig(system_instruction=sys_instr, tools=tools_decl) try: - # Gemini requires >= 32,768 tokens for caching. We try to cache, and fallback if it fails. + # Gemini requires 1024 (Flash) or 4096 (Pro) tokens to cache. _gemini_cache = _gemini_client.caches.create( model=_model, config=types.CreateCachedContentConfig( @@ -446,10 +459,15 @@ def _send_gemini(md_content: str, user_message: str, base_dir: str, file_items: chat_config = types.GenerateContentConfig(cached_content=_gemini_cache.name) _append_comms("OUT", "request", {"message": f"[CACHE CREATED] {_gemini_cache.name}"}) except Exception as e: - # Fallback to standard request if under 32k tokens or cache creation fails + # Fallback if under token limit or API error pass - _gemini_chat = _gemini_client.chats.create(model=_model, config=chat_config) + kwargs = {"model": _model, "config": chat_config} + if old_history: + kwargs["history"] = old_history + + _gemini_chat = _gemini_client.chats.create(**kwargs) + _gemini_chat._last_md_hash = current_md_hash _append_comms("OUT", "request", {"message": f"[ctx {len(md_content)} + msg {len(user_message)}]"}) payload, all_text = user_message, []