feat(ui): Enhanced context control with per-file flags and Gemini cache awareness
This commit is contained in:
@@ -63,6 +63,7 @@ _gemini_chat: Any = None
|
||||
_gemini_cache: Any = None
|
||||
_gemini_cache_md_hash: Optional[str] = None
|
||||
_gemini_cache_created_at: Optional[float] = None
|
||||
_gemini_cached_file_paths: list[str] = []
|
||||
|
||||
# Gemini cache TTL in seconds. Caches are created with this TTL and
|
||||
# proactively rebuilt at 90% of this value to avoid stale-reference errors.
|
||||
@@ -343,16 +344,17 @@ def get_provider() -> str:
|
||||
return _provider
|
||||
|
||||
def cleanup() -> None:
|
||||
global _gemini_client, _gemini_cache
|
||||
global _gemini_client, _gemini_cache, _gemini_cached_file_paths
|
||||
if _gemini_client and _gemini_cache:
|
||||
try:
|
||||
_gemini_client.caches.delete(name=_gemini_cache.name)
|
||||
except Exception:
|
||||
pass
|
||||
_gemini_cached_file_paths = []
|
||||
|
||||
def reset_session() -> None:
|
||||
global _gemini_client, _gemini_chat, _gemini_cache
|
||||
global _gemini_cache_md_hash, _gemini_cache_created_at
|
||||
global _gemini_cache_md_hash, _gemini_cache_created_at, _gemini_cached_file_paths
|
||||
global _anthropic_client, _anthropic_history
|
||||
global _deepseek_client, _deepseek_history
|
||||
global _minimax_client, _minimax_history
|
||||
@@ -368,6 +370,7 @@ def reset_session() -> None:
|
||||
_gemini_cache = None
|
||||
_gemini_cache_md_hash = None
|
||||
_gemini_cache_created_at = None
|
||||
_gemini_cached_file_paths = []
|
||||
|
||||
# Preserve binary_path if adapter exists
|
||||
old_path = _gemini_cli_adapter.binary_path if _gemini_cli_adapter else "gemini"
|
||||
@@ -389,14 +392,14 @@ def reset_session() -> None:
|
||||
def get_gemini_cache_stats() -> dict[str, Any]:
|
||||
_ensure_gemini_client()
|
||||
if not _gemini_client:
|
||||
return {"cache_count": 0, "total_size_bytes": 0}
|
||||
return {"cache_count": 0, "total_size_bytes": 0, "cached_files": []}
|
||||
caches_iterator = _gemini_client.caches.list()
|
||||
caches = list(caches_iterator)
|
||||
total_size_bytes = sum(getattr(c, 'size_bytes', 0) for c in caches)
|
||||
return {
|
||||
|
||||
"cache_count": len(caches),
|
||||
"total_size_bytes": total_size_bytes,
|
||||
"cached_files": _gemini_cached_file_paths,
|
||||
}
|
||||
|
||||
def list_models(provider: str) -> list[str]:
|
||||
@@ -803,7 +806,7 @@ def _send_gemini(md_content: str, user_message: str, base_dir: str,
|
||||
enable_tools: bool = True,
|
||||
stream_callback: Optional[Callable[[str], None]] = None,
|
||||
patch_callback: Optional[Callable[[str, str], Optional[str]]] = None) -> str:
|
||||
global _gemini_chat, _gemini_cache, _gemini_cache_md_hash, _gemini_cache_created_at
|
||||
global _gemini_chat, _gemini_cache, _gemini_cache_md_hash, _gemini_cache_created_at, _gemini_cached_file_paths
|
||||
try:
|
||||
_ensure_gemini_client(); mcp_client.configure(file_items or [], [base_dir])
|
||||
sys_instr = f"{_get_combined_system_prompt()}\n\n<context>\n{md_content}\n</context>"
|
||||
@@ -820,6 +823,7 @@ def _send_gemini(md_content: str, user_message: str, base_dir: str,
|
||||
_gemini_chat = None
|
||||
_gemini_cache = None
|
||||
_gemini_cache_created_at = None
|
||||
_gemini_cached_file_paths = []
|
||||
_append_comms("OUT", "request", {"message": "[CONTEXT CHANGED] Rebuilding cache and chat session..."})
|
||||
if _gemini_chat and _gemini_cache and _gemini_cache_created_at:
|
||||
elapsed = time.time() - _gemini_cache_created_at
|
||||
@@ -830,6 +834,7 @@ def _send_gemini(md_content: str, user_message: str, base_dir: str,
|
||||
_gemini_chat = None
|
||||
_gemini_cache = None
|
||||
_gemini_cache_created_at = None
|
||||
_gemini_cached_file_paths = []
|
||||
_append_comms("OUT", "request", {"message": f"[CACHE TTL] Rebuilding cache (expired after {int(elapsed)}s)..."})
|
||||
if not _gemini_chat:
|
||||
chat_config = types.GenerateContentConfig(
|
||||
@@ -860,6 +865,7 @@ def _send_gemini(md_content: str, user_message: str, base_dir: str,
|
||||
)
|
||||
)
|
||||
_gemini_cache_created_at = time.time()
|
||||
_gemini_cached_file_paths = [str(item.get("path", "")) for item in (file_items or []) if item.get("path")]
|
||||
chat_config = types.GenerateContentConfig(
|
||||
cached_content=_gemini_cache.name,
|
||||
temperature=_temperature,
|
||||
@@ -870,6 +876,7 @@ def _send_gemini(md_content: str, user_message: str, base_dir: str,
|
||||
except Exception as e:
|
||||
_gemini_cache = None
|
||||
_gemini_cache_created_at = None
|
||||
_gemini_cached_file_paths = []
|
||||
_append_comms("OUT", "request", {"message": f"[CACHE FAILED] {type(e).__name__}: {e} \u2014 falling back to inline system_instruction"})
|
||||
kwargs: dict[str, Any] = {"model": _model, "config": chat_config}
|
||||
if old_history:
|
||||
|
||||
Reference in New Issue
Block a user