This release adds Ceramic as a new search option and makes OpenAI search much cheaper by default. Answer mode and query rewriting now work with models whose provider signs in without an API key. Requests made through a proxy now keep their method, headers, body and Content-Length, and HEAD requests stay HEAD requests. Apps that run several Pi sessions in one process no longer lose search results between conversations.
Highlights
- Search with Ceramic, a new paid keyword search provider you can select.
- OpenAI search now defaults to the newest Luna model, which costs about 20 times less per token than Terra.
- Answer mode and query rewriting work with models whose provider signs in without an API key, such as pi-multiprovider models.
- Requests through a proxy keep their method, headers, body and
Content-Length, and HEAD requests stay HEAD requests.
Need to know
OpenAI web_search now uses the newest Luna model (gpt-6-luna) instead of gpt-5.6-terra. Set openaiSearchModel if you want a different model.
Search summaries and fetch_content answer mode no longer send x-opencode-client, and custom providers pointed at opencode.ai no longer get OpenCode's session header from pi-web-access. Pi's built-in opencode and opencode-go providers still send the session header.
Changelog
Added
- New Ceramic search provider for Ceramic's keyword web search API, used only when you select it. Set
ceramicApiKeyorCERAMIC_API_KEYto your Ceramic key. Ceramic is a paid API with free starter credits, so it is never picked byautoorall. Allowed domains are added to the query assite:filters, and excluded domains are removed from the results. Ceramic has no date filter, sorecencyFilteris ignored. Thanks to @sweepies for issue #523.
Changed
- The
web_searchtool description is now four sentences on how to use the tool, instead of a paragraph listing every provider, theallpolicy and each workflow mode. The model still sees the providers and theallpolicy in theproviderparameter and the modes in theworkflowparameter. Thanks to @mcwalrus for issue #528. - OpenAI
web_searchnow runs on the newest Luna model by default, such asgpt-6-lunaon a ChatGPT subscription, instead ofgpt-5.6-terra. Terra costs about 20 times as much per token asgpt-6-lunaand is a generation older, so searches were using a large share of subscription usage. With only an API key, the default isgpt-6-luna. SetopenaiSearchModelto pick a different model. Thanks to @sslotin for issue #520. - Search summaries and
fetch_contentanswer mode now give Pi the session ID and let itsopencodeandopencode-goproviders add OpenCode'sx-opencode-sessionheader, instead of building OpenCode's headers themselves. They no longer sendx-opencode-client, and custom providers pointed atopencode.aino longer get the session header from pi-web-access. See issue #537.
Fixed
- With a proxy set,
fetch(new Request(...))now sends the Request's own method, headers, body, redirect setting and abort signal. It used to arrive as a bare GET without them. HEAD requests through the proxy are now real HEAD requests with an empty response body instead of GETs. Thanks to @xiaozhu1337 for issue #535 and PR #536. - With a proxy set, HEAD responses keep the server's
Content-Length, and a POST or PUT with no body sendsContent-Length: 0as native fetch does, instead of omitting it (which some servers answer with 411). See issue #539. - Keyless Parallel MCP searches no longer fail with Parallel's "free-tier rate limit" error. Requests went out with Node's default
undiciUser-Agent, which Parallel rate-limits as one shared bucket, so they now sendUser-Agent: pi-web-access. Thanks to @kestermcullough for PR #531. fetch_contentanswer mode and search query rewriting now work with models whose provider signs in without giving Pi an API key, such as models added by pi-multiprovider. Answer mode used to fail with "No API key available for answer model" even though Pi could call the model. Thanks to @eikopf for issue #530.- A host that serves several conversations at once from one process, with one extension instance per session (an app or chat server built on the Pi SDK), no longer loses results across conversations. Each instance now keeps its own session's results, background fetches and active flag: one conversation starting or ending used to clear every stored result, so a
get_search_contentin another conversation answered "No stored results for responseId …", and its backgroundincludeContentfetches were aborted. Sessions forked from one history hold the results they share until the last of them ends, and deleting a shared result from/searchremoves it only from that session. Pi itself, which runs one instance and switches its session, behaves as before. GitHub clones are removed when the last live session ends, and while sessions keep overlapping, a session's end removes the clones no fetch has returned since the oldest live session started. A session that restores results from history marks the clones they point at as used, so a session forked from another keeps its clone paths after the original ends. Thanks to @kid7st for PR #521. @modelcontextprotocol/sdkis updated from 1.27.1 to 1.32.1, which fixes GHSA-6qxp-vccf-f47h, sonpm auditno longer reports it. That advisory covers the SDK's OAuth client, which pi-web-access doesn't use: its HTTP providers send API keys in headers and its MCP server runs over stdio. Thanks to @M1racleShih for PR #522 and @SidShaytay for issue #519.