98 lines
3.3 KiB
Markdown
98 lines
3.3 KiB
Markdown
# g4f Gemini Web Search — `tools=[["google_search"]]`
|
||
|
||
## Discovery
|
||
|
||
g4f's `Provider.Gemini` (URL: `https://gemini.google.com`, uses COOKIES, not API key) supports Google Search through the `tools` parameter passed to `build_request`.
|
||
|
||
## How it works
|
||
|
||
1. `Gemini.create_async_generator` accepts `tools=kwargs.get("tools")` (line 663)
|
||
2. `Gemini.build_request` accepts `tools: list[list[str]]` and sets `request[9] = tools` (lines 988-1017)
|
||
3. The web protocol expects `[["google_search"]]` format
|
||
|
||
## Usage
|
||
|
||
```python
|
||
import g4f
|
||
|
||
response = g4f.ChatCompletion.create(
|
||
model="gemini",
|
||
provider=g4f.Provider.Gemini,
|
||
cookies=cookies_dict,
|
||
tools=[["google_search"]], # enables Google Search in web interface
|
||
messages=[{"role": "user", "content": "What's the current Bitcoin price?"}]
|
||
)
|
||
```
|
||
|
||
## Verified
|
||
|
||
- g4f version: 8.1.6
|
||
- Source: `g4f/Provider/needs_auth/Gemini.py`
|
||
- `build_request` parameter: `tools: list[list[str]] = None` → `request[9] = tools`
|
||
- No other g4f providers support this parameter (searched entire `g4f/Provider/` directory — 0 matches for `google_search`)
|
||
|
||
## Pitfalls
|
||
|
||
- The format `[["google_search"]]` is a best guess — the exact web protocol format is undocumented
|
||
- Gemini web interface may not always honor the tools parameter
|
||
- No error is thrown if the format is wrong — Gemini just ignores it silently
|
||
- Test with a query that requires real-time data to verify it's working
|
||
|
||
## Real-world usage: Calorie-Counter-AI bot (2026-08-16)
|
||
|
||
### Architecture
|
||
|
||
```
|
||
gemini_web.py (wrapper) → g4f.ChatCompletion.create(
|
||
provider=g4f.Provider.Gemini,
|
||
cookies=gemini_cookies.json,
|
||
tools=[["google_search"]]
|
||
) → gemini.google.com
|
||
```
|
||
|
||
### System prompt pattern for structured search results
|
||
|
||
Instruct Gemini to return search results as structured JSON fields:
|
||
|
||
```json
|
||
{
|
||
"prices": [{"product": "куриное филе", "price_uah": 189, "store": "АТБ"}],
|
||
"promotions": [{"store": "Сільпо", "title": "Скидка 30%", "valid_until": "2026-08-20"}]
|
||
}
|
||
```
|
||
|
||
Prompt snippet:
|
||
```
|
||
ИНСТРУМЕНТЫ: У тебя есть доступ к Google Search (google_search). Используй его чтобы:
|
||
1. Найти актуальные цены в гривнах на КАЖДЫЙ продукт из shopping_list в 2-3 магазинах
|
||
2. Найти текущие АКЦИИ и скидки на продукты
|
||
```
|
||
|
||
### Multi-store comparison pattern
|
||
|
||
Request multiple store prices per product. Post-process by grouping and sorting:
|
||
|
||
```python
|
||
from collections import defaultdict
|
||
by_product = defaultdict(list)
|
||
for p in prices:
|
||
by_product[p["product"]].append((p["price_uah"], p["store"]))
|
||
# Display best price first, show alternatives
|
||
```
|
||
|
||
### Fallback chain
|
||
|
||
1. Gemini Google Search → `prices` field
|
||
2. If empty → DuckDuckGo scraping (`price_search.py`)
|
||
3. If both fail → no price block shown
|
||
|
||
### Verified behavior
|
||
|
||
- Gemini with `tools=[["google_search"]]` returns real-time search results through g4f cookies
|
||
- The search tool is invoked automatically by Gemini when the prompt asks for current prices
|
||
- DuckDuckGo fallback catches cases where Gemini doesn't search (rate limits, silent failures)
|
||
|
||
## Related
|
||
|
||
- `gemini_web.py` in Calorie-Counter-AI project: wraps g4f Gemini with SDK-like interface
|
||
- Cookie file: `gemini_cookies.json` (extracted from browser) |