from google.adk.models.google_llm import Gemini
class CachedGemini(Gemini):
_cache: dict[str, list[dict]]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._cache = SqliteDict('./cache.sqlite', autocommit=True)
async def generate_content_async(
self, llm_request: LlmRequest, stream: bool = False
) -> AsyncGenerator[LlmResponse, None]:
cache_key = hashlib.sha256(llm_request.model_dump_json().encode()).hexdigest() + ('_stream' if stream else '_nostream')
if cache_key in self._cache:
print("Cache hit for request")
for cached_response in self._cache[cache_key]:
yield LlmResponse.model_validate(cached_response)
return
events = []
async for llm_response in super().generate_content_async(llm_request, stream):
events.append(llm_response.model_dump())
yield llm_response
self._cache[cache_key] = events
root_agent = Agent(
model=CachedGemini(model=MODEL),
...
)
Notes on Programming
Thursday, 19 March 2026
adk cached gemini
adk callbacks
from google.adk.agents.llm_agent import Agent, BaseAgent
from google.genai import types
from google.adk.agents.context import Context
from google.adk.models.llm_request import LlmRequest
from google.adk.models.llm_response import LlmResponse
from google.adk.agents.callback_context import CallbackContext
from typing import Optional
from google.adk.tools.tool_context import ToolContext
from google.adk.tools.base_tool import BaseTool
from typing import Any
async def before_agent_callback(callback_context: CallbackContext):
print("Before agent callback triggered")
print(callback_context)
async def after_agent_callback(callback_context: CallbackContext):
print("After agent callback triggered")
print(callback_context)
def before_model_callback(callback_context: Context, llm_request: LlmRequest):
print("Before model callback triggered")
print(callback_context)
print(llm_request)
def after_model_callback(callback_context: Context, llm_response: LlmResponse):
print("After model callback triggered")
print(callback_context)
print(llm_response)
def before_tool_callback(tool: BaseTool, args: dict[str, Any], tool_context: ToolContext) -> Optional[dict]:
print("Before tool callback triggered")
print(tool.name, args)
if False:
return {"result": "Tool execution was blocked by before_tool_callback."}
def after_tool_callback(tool: BaseTool, args: dict[str, Any], tool_context: ToolContext, tool_response: dict) -> Optional[dict]:
print("After tool callback triggered")
print(tool.name, args, tool_response)
def get_temperature(city: str):
"""
A dummy tool to get the temperature of a city.
"""
temprature = len(city) * 3 # Dummy temperature based on city name length
return f"The current temperature in {city} is {temprature} degrees Celsius."
root_agent = Agent(
model='gemini-2.5-flash',
name='root_agent',
description='A helpful assistant for user questions.',
before_agent_callback=before_agent_callback,
after_agent_callback=after_agent_callback,
before_model_callback=before_model_callback,
after_model_callback=after_model_callback,
before_tool_callback=before_tool_callback,
after_tool_callback=after_tool_callback,
instruction='You are a weather assistant. Use get_temperature tool to answer user questions about the weather.',
tools=[get_temperature]
)
async def main():
from google.adk.sessions import InMemorySessionService
from google.adk.runners import Runner
session_service = InMemorySessionService()
runner = Runner(
agent=root_agent,
app_name="app",
session_service=session_service,
)
await runner.run_debug("how warm is it in munich?", verbose=True)
if __name__ == "__main__":
import asyncio
import dotenv
dotenv.load_dotenv()
asyncio.run(main())
Wednesday, 18 March 2026
Consume stuff to learn things. Does this makes things interesting?
It makes sense that we are interesting in consuming stuff to learn stuff. So we survived, so we survive more likely. The problem with ai generated content, that we can not learn from it. In the digital age we can not learn much from content produced by others, but there is at least minimal signal there. I can observe how a lake looks like in Sweden when it starts to rain. Useful? No idea. But our brain was wired long before that. But with AI, I know that the information is worthless, no signal. Maybe this is the reason why it feels empty. It is ironic, as there might be a signal, carried through the training. But maybe it is hallucinated. No idea. It feels empty, not interesting. If I see the same shot, one which I know is real and the other is AI, one feels more interesting. Maybe this is a old useless brain talking here.
Btw, I dont care about the effort. If someone took a 4k image, opened paint and copied it pixel by pixel with a 1x paint tool, it takes forever (450 work days / 2 work years with 1.5s per pixel) but I find the result not more interesting.
partial orders and arenas
When I first learned about partial orders I was confused and did not see where this would be useful. It was introduced in the realm of numbers. Many years later, I love the idea. Arenas are everywhere. A user sees 20 items. He selects one. Again and again. A partial order emerges.
Note: This assumes that humans are perfectly rational, which is wrong, the intuition still holds and we can use proper methods in practices.
Tuesday, 17 March 2026
zahnpflege
Phase 1: Häusliches Biofilm-Management (Der primäre Hebel)
Da zahnmedizinische Präventivmaßnahmen ohne eigene Verhaltensänderung laut Report keinen messbaren Langzeitnutzen aufweisen, liegt das kurative Potenzial fast vollständig in Ihrer eigenen Routine.
- Mechanische Disruption: Regelmäßige Nutzung von Zahnbürste (manuell oder elektrisch-oszillierend zeigen hier keinen klinisch relevanten Unterschied) sowie zwingend Hilfsmittel für den Interdentalraum (Interdentalbürsten, Zahnseide, Zahnhölzer).
- Vermeidung mechanischer Traumata: Der Report widerlegt zwar die monokausale Entstehung von Zahnfleischrückgang (Gingivarezessionen) durch falsches Putzen, klassifiziert aber erhöhte Putzkraft, harte Borsten und horizontale Schrubb-Techniken als relevante Kofaktoren für Gewebeverlust.
- Chemische Modulation (Karies): Zwingender Einsatz von Fluoridzahnpasta. Die rein mechanische Plaqueentfernung reicht zur Kariesprävention nicht aus; Fluorid wird für die Remineralisation, die Bildung von säureresistentem Fluorapatit und die Hemmung des bakteriellen Metabolismus (Enolase-Inhibition) zwingend benötigt.
Phase 2: Beauftragung der zahnärztlichen Dienstleistung (Primärprävention)
Der Report dekonstruiert den Mythos der "professionellen Zahnreinigung" als passiv zu konsumierende Gesundheitsmaßnahme für parodontal Gesunde. Die Behandlungszeit muss auf Edukation umverteilt werden.
1. Streichung starrer Intervalle:
- Anweisung: Ablehnung routinemäßiger, kalenderbasierter Termine (z. B. strikt alle 6 oder 12 Monate).
- Begründung: Laut Metaanalysen macht die routinemäßige zahnärztliche Reinigung bei gesunden Erwachsenen hinsichtlich der Inzidenz von Gingivitis, der Reduktion von Sondierungstiefen und der Plaquewerte nach zwei bis drei Jahren "nur geringe oder gar keine messbaren Unterschiede" im Vergleich zu einer rein bedarfsgerechten Behandlung. Die Indikationsstellung muss rein risikobasiert erfolgen.
2. Fokus der Sitzung (Mundhygieneinstruktion - MHI):
- Anweisung: Die Behandlungszeit ist primär der Kontrolle der Putztechnik, der psychologischen Motivation und der intensiven Schulung in der häuslichen Nutzung von Hilfsmitteln (Interdentalraumbürsten) zu widmen.
- Begründung: Die PMPR hat bei gesunden Erwachsenen ohne begleitende MHI keinen signifikanten Zusatznutzen. Die professionelle Reinigung fungiert hier primär als "pädagogisches, instruktives und motivierendes Vehikel".
3. Diagnostik und Navigation:
- Anweisung: Das Anfärben der Plaque (Plaque Disclosure) vorab ist obligatorisch.
- Begründung: Dient der Visualisierung für Ihre häusliche Optimierung und verhindert, dass der Behandler saubere Zahnflächen instrumentiert.
4. Instrumentelle Durchführung (Die Reduktion auf das Nötigste):
- Zahnschmelz: Auf intaktem, gesundem Zahnschmelz verursachen Ultraschall, Handküretten und Air-Polishing (mit Erythritol) keinen messbaren Gewebeverlust. Die Instrumentenwahl ist hier biologisch unkritisch.
- Zahnstein (Calculus): Die Entfernung mineralisierter Konkremente ist bei parodontal Gesunden laut Report "höchst ungewiss" in ihrer klinischen Relevanz für den Zahnerhalt, da Zahnstein ohne vitalen Biofilm keinen Attachmentverlust initiiert. Es handelt sich um eine "untergeordnete, kosmetisch-hygienische Ergänzung".
- Kritische Restriktion (Zahnhalsfüllungen): Sofern Sie zervikale Kompositrestaurationen (Füllungen am Zahnhals) besitzen, müssen Ultraschall und Pulverstrahlverfahren in diesen Bereichen strikt untersagt werden. Sie erhöhen die Oberflächenrauigkeit des Komposits signifikant (Faktor 1,5 bis 2) und provozieren dadurch Sekundärkaries.
5. Abschluss der Behandlung:
- Anweisung: Verzicht auf die Politur mit Gummikelch und Prophylaxepaste, falls zuvor Air-Polishing angewendet wurde, da sie keinen topografischen Vorteil (Rauigkeitsreduktion) bietet.
- Anweisung: Zwingende lokale Applikation von Fluorid (Lack oder Gel) zur chemischen Kariesprävention, da die mechanische PMPR allein hierfür nicht ausreicht.
Einkaufsliste
- Zahnpasta - alle die Florid deklarieren sind gut genug
- Weiche bis max Mittel Zahnbürste
- Interdentalraumbürsten, wobe ich die größe durch ausprobieren finden muss
- Zahnseide wo die bürste nicht hin kommt.
Friday, 13 March 2026
Pesion
Diagnistic Reasonign is an interative Information Retrieval Task
We take ALL known Etiologies and use differential diagnosis to filter out as much as possible using the patient presentation and rank the rest. We take action for max learning, update the patient file, filter and rank. It is iterative information retrieval across multiple databases, including the head and body of the patient as query-able database. All Nails I guess.
adk cached gemini
from google.adk.models.google_llm import Gemini class CachedGemini(Gemini): _cache: dict[str, list[dict]] def __init__(self, *ar...
-
""" This module processes Wikipedia dump files by extracting individual articles and parsing them into a structured format, ...
-
2 Million renderings took 0.875s import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap;...
-
docker pull quay.io/unstructured-io/unstructured-api 20gb image. After docker-pull: docker image inspect --format '{{json .}}' ...