- Add AI Agent Governance tutorial: Policy-based sandboxing for single agents
- Teaches deterministic policy enforcement concepts
- Includes filesystem, network, and rate limit policies
- Full working Python code with audit logging
- Add Multi-Agent Trust Layer tutorial: Secure agent-to-agent communication
- Teaches trust scoring and behavioral monitoring
- Includes delegation chains with scope narrowing
- Full working Python code with audit trail
- Added app screenshots (01_home.png, 02_fullpage.png)
- Fixed HttpAgent import to use @ag-ui/client package
- Added .gitignore files for frontend and backend
- Updated package.json with correct @ag-ui/client version
A real-time agent vs agent negotiation showdown using Google ADK:
- Two AI agents (Buyer vs Seller) negotiate autonomously
- Dramatic used car scenario with secrets on both sides
- 4 buyer personalities (Desperate Dan, Analytical Alex, Cool-Hand Casey, Fair-Deal Fran)
- 4 seller personalities (Shark Steve, By-The-Book Beth, Motivated Mike, Drama Queen Diana)
- 3 negotiation scenarios (Used Car, Vintage Guitar, Apartment Sublet)
- Configurable max rounds and personality selection
- Live Streamlit UI showing offers, counteroffers, and outcomes
- Uses gemini-3-flash-preview model
Run with: streamlit run negotiation_app.py
Updated all 18 skills to use consistent format:
- YAML frontmatter (name, description)
- 'When to use this skill' section
- 'How to Use this Skill' with code examples
- Parameters table
- Returns description
- Practical examples
Format inspired by technical skill documentation patterns.
Fixes#409
## Changes
### agent.py
- Replace singleton `google_search` with explicit `GoogleSearchTool(bypass_multi_tools_limit=True)`
to enable compatibility with nested agent setups (ADK limitation workaround)
- Update SearchAgent instruction to be clearer about how the built-in search works
(it's automatic, not a callable function)
### tools.py
- Add validation for common LLM hallucination patterns (e.g., `_v0` version numbers)
- Add fallback logic when artifact loading fails:
1. Try corrected filename if version 0 detected
2. Look up known artifact versions in session state
3. Fall back to last generated rendering
- Improve error messages to show available artifacts
## Root Cause Analysis
1. **google_search not found**: The LLM was trying to call 'google_search' as a
function, but GoogleSearchTool is a Gemini built-in capability that works
automatically. Using `bypass_multi_tools_limit=True` and clearer instructions
resolves the confusion.
2. **Artifact not found**: The LLM sometimes hallucinated incorrect filenames
(e.g., `_v0.png` instead of `_v1.png`). Added robust fallback logic to
recover gracefully.
Fixes#449
The loop variable 'memory' in the memory iteration was shadowing the
Memory object from mem0, causing 'AttributeError: dict object has no
attribute add' when memory.add() was called later.
Renamed to 'mem' to match the pattern already used in other parts of
the codebase.
Affected files:
- ai_travel_agent_memory/travel_agent_memory.py
- multi_llm_memory/multi_llm_memory.py
Headroom reduces LLM API costs by 50-90% through intelligent context
compression for AI agents. Tool outputs are 70-95% redundant boilerplate
that LLMs pay for but don't need - Headroom compresses that away while
preserving accuracy.
Features:
- SmartCrusher: Statistical compression of JSON tool outputs
- CacheAligner: Provider-side cache optimization
- Memory: Persistent memory across conversations
- MCP support: Tool output compression for Claude
- Framework integrations: LangChain, Agno, any OpenAI client