400f512d81
`_get_contents` deep-copied `event.content` for every event on every LLM request, just to strip ADK-generated (`adk-` prefixed) function call/response ids and to isolate the contents from downstream request processors that mutate parts in place (e.g. nl_planning clearing `part.thought`, code_execution rewriting parts). The deepcopy recursed into large `function_call.args`/`inline_data` payloads, and cost grew with conversation length (a dominant non-LLM CPU sink in profiling, ~4-7s of a ~30s run). Replace it with a shallow copy: the `Content` and every `Part` are `model_copy`-d (so downstream in-place mutations stay isolated from session events), but the payloads (`args`/`response`/`inline_data`/...) are shared by reference instead of deep-copied. Adds regression tests (id stripping and downstream-mutation isolation) and a google_benchmark perf script. Benchmark (_get_contents over a 500-turn history, ~23x): Before (copy.deepcopy): ------------------------------------------------------- Benchmark Time CPU Iterations ------------------------------------------------------- get_contents 781559706 ns 781443557 ns 1 After (per-part shallow copy): ------------------------------------------------------- Benchmark Time CPU Iterations ------------------------------------------------------- get_contents 33996069 ns 33987197 ns 20 PiperOrigin-RevId: 940664677