@pyric/cli 0.1.0-alpha.15 → 0.1.0-alpha.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -9
- package/dist/assurance/.generated/conformance-verdicts.d.ts +80 -72
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +80 -72
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/bridge/client/dispatch.js +1 -1
- package/dist/bridge/client/dispatch.js.map +1 -1
- package/dist/cli/database-rules.d.ts.map +1 -1
- package/dist/cli/database-rules.js +6 -4
- package/dist/cli/database-rules.js.map +1 -1
- package/dist/cli/dev-runner.d.ts +9 -0
- package/dist/cli/dev-runner.d.ts.map +1 -1
- package/dist/cli/dev-runner.js +18 -0
- package/dist/cli/dev-runner.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +61 -6
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/verify.js +2 -2
- package/dist/cli/verify.js.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js +1 -1
- package/dist/conformance/.generated/can-i-use-browser.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
- package/dist/conformance/.generated/conformance-docs.js +1 -1
- package/dist/conformance/.generated/conformance-docs.js.map +1 -1
- package/dist/next/client-aliases.d.ts +11 -0
- package/dist/next/client-aliases.d.ts.map +1 -0
- package/dist/next/client-aliases.js +38 -0
- package/dist/next/client-aliases.js.map +1 -0
- package/dist/next/dev-rewrites.d.ts +9 -0
- package/dist/next/dev-rewrites.d.ts.map +1 -0
- package/dist/next/dev-rewrites.js +53 -0
- package/dist/next/dev-rewrites.js.map +1 -0
- package/dist/next/guard.d.ts +15 -0
- package/dist/next/guard.d.ts.map +1 -0
- package/dist/next/guard.js +52 -0
- package/dist/next/guard.js.map +1 -0
- package/dist/next/index.d.ts +12 -0
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +11 -0
- package/dist/next/index.js.map +1 -0
- package/dist/next/runtime-env.d.ts +7 -0
- package/dist/next/runtime-env.d.ts.map +1 -0
- package/dist/next/runtime-env.js +13 -0
- package/dist/next/runtime-env.js.map +1 -0
- package/dist/next/server-external-packages.d.ts +10 -0
- package/dist/next/server-external-packages.d.ts.map +1 -0
- package/dist/next/server-external-packages.js +34 -0
- package/dist/next/server-external-packages.js.map +1 -0
- package/dist/next/target-url.d.ts +11 -0
- package/dist/next/target-url.d.ts.map +1 -0
- package/dist/next/target-url.js +36 -0
- package/dist/next/target-url.js.map +1 -0
- package/dist/next/turbopack-config.d.ts +9 -0
- package/dist/next/turbopack-config.d.ts.map +1 -0
- package/dist/next/turbopack-config.js +39 -0
- package/dist/next/turbopack-config.js.map +1 -0
- package/dist/next/types.d.ts +40 -0
- package/dist/next/types.d.ts.map +1 -0
- package/dist/next/types.js +5 -0
- package/dist/next/types.js.map +1 -0
- package/dist/next/webpack-config.d.ts +11 -0
- package/dist/next/webpack-config.d.ts.map +1 -0
- package/dist/next/webpack-config.js +51 -0
- package/dist/next/webpack-config.js.map +1 -0
- package/dist/next/with-pyric.d.ts +22 -0
- package/dist/next/with-pyric.d.ts.map +1 -0
- package/dist/next/with-pyric.js +49 -0
- package/dist/next/with-pyric.js.map +1 -0
- package/dist/register/app-bridge.d.ts +9 -0
- package/dist/register/app-bridge.d.ts.map +1 -0
- package/dist/register/app-bridge.js +56 -0
- package/dist/register/app-bridge.js.map +1 -0
- package/dist/register/hooks.d.ts.map +1 -1
- package/dist/register/hooks.js +6 -1
- package/dist/register/hooks.js.map +1 -1
- package/dist/register/index.js +1 -1
- package/dist/register/index.js.map +1 -1
- package/dist/register/mapping.d.ts +3 -1
- package/dist/register/mapping.d.ts.map +1 -1
- package/dist/register/mapping.js +41 -5
- package/dist/register/mapping.js.map +1 -1
- package/dist/rtdb/rules-json.d.ts +12 -0
- package/dist/rtdb/rules-json.d.ts.map +1 -1
- package/dist/rtdb/rules-json.js +98 -0
- package/dist/rtdb/rules-json.js.map +1 -1
- package/dist/serve/bundler.d.ts.map +1 -1
- package/dist/serve/bundler.js +2 -0
- package/dist/serve/bundler.js.map +1 -1
- package/dist/serve/discovery.d.ts +4 -4
- package/dist/serve/discovery.d.ts.map +1 -1
- package/dist/serve/discovery.js +59 -38
- package/dist/serve/discovery.js.map +1 -1
- package/dist/serve/entries/app-ai-passthrough.d.ts +8 -0
- package/dist/serve/entries/app-ai-passthrough.d.ts.map +1 -0
- package/dist/serve/entries/app-ai-passthrough.js +59 -0
- package/dist/serve/entries/app-ai-passthrough.js.map +1 -0
- package/dist/serve/entries/auth-helper-core.d.ts +9 -0
- package/dist/serve/entries/auth-helper-core.d.ts.map +1 -1
- package/dist/serve/entries/auth-helper-core.js +37 -8
- package/dist/serve/entries/auth-helper-core.js.map +1 -1
- package/dist/serve/entries/auth.d.ts +1 -0
- package/dist/serve/entries/auth.d.ts.map +1 -1
- package/dist/serve/entries/auth.js +7 -4
- package/dist/serve/entries/auth.js.map +1 -1
- package/dist/serve/entries/bridge-url.d.ts.map +1 -1
- package/dist/serve/entries/bridge-url.js +7 -2
- package/dist/serve/entries/bridge-url.js.map +1 -1
- package/dist/serve/entries/database.d.ts +1 -0
- package/dist/serve/entries/database.d.ts.map +1 -1
- package/dist/serve/entries/database.js +1 -0
- package/dist/serve/entries/database.js.map +1 -1
- package/dist/serve/entries/firestore.d.ts +1 -0
- package/dist/serve/entries/firestore.d.ts.map +1 -1
- package/dist/serve/entries/firestore.js +1 -0
- package/dist/serve/entries/firestore.js.map +1 -1
- package/dist/serve/entries/init.d.ts.map +1 -1
- package/dist/serve/entries/init.js +4 -2
- package/dist/serve/entries/init.js.map +1 -1
- package/dist/serve/entries/runtime.js +23 -0
- package/dist/serve/entries/runtime.js.map +1 -1
- package/dist/serve/entries/storage.d.ts +2 -0
- package/dist/serve/entries/storage.d.ts.map +1 -1
- package/dist/serve/entries/storage.js +9 -2
- package/dist/serve/entries/storage.js.map +1 -1
- package/dist/serve/html-injection.d.ts +3 -1
- package/dist/serve/html-injection.d.ts.map +1 -1
- package/dist/serve/html-injection.js +27 -1
- package/dist/serve/html-injection.js.map +1 -1
- package/dist/serve/rules.js +2 -2
- package/dist/serve/rules.js.map +1 -1
- package/dist/serve/runtime/chip-config.d.ts +1 -1
- package/dist/serve/runtime/chip-config.d.ts.map +1 -1
- package/dist/serve/runtime/chip-config.js +16 -8
- package/dist/serve/runtime/chip-config.js.map +1 -1
- package/dist/serve/sandbox-session.d.ts +1 -0
- package/dist/serve/sandbox-session.d.ts.map +1 -1
- package/dist/serve/sandbox-session.js +30 -2
- package/dist/serve/sandbox-session.js.map +1 -1
- package/dist/serve/site-ui/_astro/_studio_.B6b_G1ev.css +1 -0
- package/dist/serve/site-ui/_astro/app.bnmVTkIY.js +11 -0
- package/dist/serve/site-ui/_astro/app.t6u-adB_.js +1 -0
- package/dist/serve/site-ui/_astro/{chess-showcase.DzPO6kz0.js → chess-showcase.kC8dXLKY.js} +1 -1
- package/dist/serve/site-ui/_astro/{example-runtime.CM0H02rx.js → example-runtime.D79PnoSk.js} +1 -1
- package/dist/serve/site-ui/_astro/index.DzVde04M.js +1 -0
- package/dist/serve/site-ui/_astro/reads.BYBRLbsE.js +1 -0
- package/dist/serve/site-ui/_astro/sandbox-controls.C9Aaazt8.js +1252 -0
- package/dist/serve/site-ui/_astro/{seed.BCn5DhHS.js → seed.DANAIyRw.js} +1 -1
- package/dist/serve/site-ui/auth/index.html +2 -2
- package/dist/serve/site-ui/docs/_rhythm/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/set-up-your-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/watch-and-review/index.html +1 -1
- package/dist/serve/site-ui/docs/agent/work-with-an-agent/index.html +1 -1
- package/dist/serve/site-ui/docs/ai-compat/index.html +85 -85
- package/dist/serve/site-ui/docs/ai-compat.md +84 -84
- package/dist/serve/site-ui/docs/api-reference/index.html +3 -1
- package/dist/serve/site-ui/docs/api-reference.md +2 -0
- package/dist/serve/site-ui/docs/app-compat/index.html +28 -28
- package/dist/serve/site-ui/docs/app-compat.md +27 -27
- package/dist/serve/site-ui/docs/auth-compat/index.html +122 -122
- package/dist/serve/site-ui/docs/auth-compat.md +121 -121
- package/dist/serve/site-ui/docs/build/ai-logic/index.html +1 -1
- package/dist/serve/site-ui/docs/build/authentication/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-firestore/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-messaging/index.html +1 -1
- package/dist/serve/site-ui/docs/build/cloud-storage/index.html +1 -1
- package/dist/serve/site-ui/docs/build/realtime-database/index.html +1 -1
- package/dist/serve/site-ui/docs/conformance-scores/index.html +4 -4
- package/dist/serve/site-ui/docs/conformance-scores.md +3 -3
- package/dist/serve/site-ui/docs/create-pyric-reference-api/index.html +6 -6
- package/dist/serve/site-ui/docs/create-pyric-reference-api.md +5 -5
- package/dist/serve/site-ui/docs/database-compat/index.html +200 -448
- package/dist/serve/site-ui/docs/database-compat.md +198 -461
- package/dist/serve/site-ui/docs/examples/chess/index.html +2 -2
- package/dist/serve/site-ui/docs/examples/index.html +1 -1
- package/dist/serve/site-ui/docs/firestore-compat/index.html +186 -195
- package/dist/serve/site-ui/docs/firestore-compat.md +184 -195
- package/dist/serve/site-ui/docs/functions-rtdb-compat/index.html +15 -15
- package/dist/serve/site-ui/docs/functions-rtdb-compat.md +14 -14
- package/dist/serve/site-ui/docs/get-started/how-the-swap-works/index.html +1 -1
- package/dist/serve/site-ui/docs/get-started/nextjs/index.html +57 -0
- package/dist/serve/site-ui/docs/get-started/nextjs.md +86 -0
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +25 -8
- package/dist/serve/site-ui/docs/get-started/start-building.md +34 -5
- package/dist/serve/site-ui/docs/get-started/vite/index.html +26 -0
- package/dist/serve/site-ui/docs/get-started/vite.md +45 -0
- package/dist/serve/site-ui/docs/index.json +668 -103
- package/dist/serve/site-ui/docs/messaging-compat/index.html +56 -56
- package/dist/serve/site-ui/docs/messaging-compat.md +55 -55
- package/dist/serve/site-ui/docs/observe/resolve-runtime-status/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/see-whats-happening/index.html +1 -1
- package/dist/serve/site-ui/docs/observe/shape-your-data/index.html +1 -1
- package/dist/serve/site-ui/docs/overview/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api/index.html +39 -13
- package/dist/serve/site-ui/docs/pyric-admin-app-reference-api.md +28 -2
- package/dist/serve/site-ui/docs/pyric-admin-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api/index.html +38 -6
- package/dist/serve/site-ui/docs/pyric-admin-database-reference-api.md +43 -0
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api/index.html +9 -1
- package/dist/serve/site-ui/docs/pyric-admin-firestore-reference-api.md +8 -0
- package/dist/serve/site-ui/docs/pyric-admin-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api/index.html +27 -4
- package/dist/serve/site-ui/docs/pyric-admin-storage-reference-api.md +23 -0
- package/dist/serve/site-ui/docs/pyric-ai-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ai-scripting-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-app-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-auth-reference-api/index.html +2 -2
- package/dist/serve/site-ui/docs/pyric-auth-reference-api.md +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-browser-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-client-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-bridge-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-browser-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-docs-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-conformance-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-credentials-node-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-discover-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api/index.html +123 -0
- package/dist/serve/site-ui/docs/pyric-cli-next-reference-api.md +99 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api/index.html +127 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-app-bridge-reference-api.md +174 -0
- package/dist/serve/site-ui/docs/pyric-cli-register-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-remote-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api/index.html +570 -326
- package/dist/serve/site-ui/docs/pyric-cli-serve-worker-reference-api.md +198 -6
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-cli-vite-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-database-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api/index.html +2971 -627
- package/dist/serve/site-ui/docs/pyric-firestore-reference-api.md +2873 -517
- package/dist/serve/site-ui/docs/pyric-messaging-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-messaging-sw-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-rules-reference-api/index.html +43 -3
- package/dist/serve/site-ui/docs/pyric-rules-reference-api.md +8 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api/index.html +26 -2
- package/dist/serve/site-ui/docs/pyric-sandbox-database-reference-api.md +24 -0
- package/dist/serve/site-ui/docs/pyric-sandbox-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api/index.html +77 -9
- package/dist/serve/site-ui/docs/pyric-sandbox-reference-api.md +28 -13
- package/dist/serve/site-ui/docs/pyric-storage-reference-api/index.html +240 -63
- package/dist/serve/site-ui/docs/pyric-storage-reference-api.md +164 -5
- package/dist/serve/site-ui/docs/pyric-ui-agents-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-auth-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-events-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-firestore-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-primitives-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rtdb-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-rules-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api/index.html +2 -1
- package/dist/serve/site-ui/docs/pyric-ui-storage-reference-api.md +1 -0
- package/dist/serve/site-ui/docs/pyric-ui-traffic-hooks-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/pyric-ui-traffic-reference-api/index.html +1 -1
- package/dist/serve/site-ui/docs/rules-compat/index.html +87 -79
- package/dist/serve/site-ui/docs/rules-compat.md +86 -78
- package/dist/serve/site-ui/docs/secure/audit-your-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/firestore-rules-limits/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/read-a-denial/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rtdb-rules-in-typescript/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/secure-it-with-rules/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/simulate-and-lint/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +1 -1
- package/dist/serve/site-ui/docs/ship/test-in-node/index.html +1 -1
- package/dist/serve/site-ui/docs/storage-compat/index.html +119 -125
- package/dist/serve/site-ui/docs/storage-compat.md +118 -124
- package/dist/serve/site-ui/docs/trust/how-we-know-it-matches-firebase/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/rules-standard-library/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/storage-rules-stdlib-research/index.html +1 -1
- package/dist/serve/site-ui/docs/trust/versioning-and-compatibility/index.html +1 -1
- package/dist/serve/site-ui/docs/tutorial/index.html +1 -1
- package/dist/serve/site-ui/examples/chess/index.html +1 -1
- package/dist/serve/site-ui/examples/firestore-first-write/index.html +1 -1
- package/dist/serve/site-ui/firestore/index.html +2 -2
- package/dist/serve/site-ui/index.html +2 -2
- package/dist/serve/site-ui/llms.txt +6 -2
- package/dist/serve/site-ui/rtdb/index.html +2 -2
- package/dist/serve/site-ui/settings/index.html +2 -2
- package/dist/serve/site-ui/storage/index.html +2 -2
- package/dist/serve/site-ui/traffic/index.html +2 -2
- package/dist/serve/vite-ai-config.d.ts +4 -1
- package/dist/serve/vite-ai-config.d.ts.map +1 -1
- package/dist/serve/vite-ai-config.js +83 -19
- package/dist/serve/vite-ai-config.js.map +1 -1
- package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
- package/dist/serve/vite-generation-rules-watch.js +61 -14
- package/dist/serve/vite-generation-rules-watch.js.map +1 -1
- package/dist/serve/vite-module-swap.d.ts +4 -1
- package/dist/serve/vite-module-swap.d.ts.map +1 -1
- package/dist/serve/vite-module-swap.js +106 -21
- package/dist/serve/vite-module-swap.js.map +1 -1
- package/dist/serve/vite-plugin.d.ts.map +1 -1
- package/dist/serve/vite-plugin.js +45 -5
- package/dist/serve/vite-plugin.js.map +1 -1
- package/dist/serve/vite-sandbox-generation.js +1 -1
- package/dist/serve/vite-sandbox-generation.js.map +1 -1
- package/dist/serve/worker/client/resumable.d.ts +30 -0
- package/dist/serve/worker/client/resumable.d.ts.map +1 -0
- package/dist/serve/worker/client/resumable.js +416 -0
- package/dist/serve/worker/client/resumable.js.map +1 -0
- package/dist/serve/worker/client/rtdb-references.d.ts.map +1 -1
- package/dist/serve/worker/client/rtdb-references.js +4 -1
- package/dist/serve/worker/client/rtdb-references.js.map +1 -1
- package/dist/serve/worker/client/storage.d.ts +16 -2
- package/dist/serve/worker/client/storage.d.ts.map +1 -1
- package/dist/serve/worker/client/storage.js +57 -6
- package/dist/serve/worker/client/storage.js.map +1 -1
- package/dist/serve/worker/host/rules.d.ts.map +1 -1
- package/dist/serve/worker/host/rules.js +2 -1
- package/dist/serve/worker/host/rules.js.map +1 -1
- package/dist/serve/worker/index.d.ts +1 -1
- package/dist/serve/worker/index.d.ts.map +1 -1
- package/dist/serve/worker/index.js +1 -1
- package/dist/serve/worker/index.js.map +1 -1
- package/dist/serve/worker/serve-init.d.ts.map +1 -1
- package/dist/serve/worker/serve-init.js +31 -0
- package/dist/serve/worker/serve-init.js.map +1 -1
- package/package.json +15 -4
- package/src/assurance/.generated/conformance-verdicts.ts +80 -72
- package/src/bridge/client/dispatch.ts +1 -1
- package/src/cli/cli.test.ts +14 -0
- package/src/cli/database-rules.ts +6 -4
- package/src/cli/dev-runner.ts +21 -0
- package/src/cli/serve.ts +62 -5
- package/src/cli/verify.ts +2 -2
- package/src/conformance/.generated/can-i-use-browser.ts +1 -1
- package/src/conformance/.generated/can-i-use.ts +1 -1
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/next/client-aliases.ts +39 -0
- package/src/next/dev-rewrites.ts +77 -0
- package/src/next/guard.ts +61 -0
- package/src/next/index.ts +16 -0
- package/src/next/runtime-env.ts +18 -0
- package/src/next/server-external-packages.ts +43 -0
- package/src/next/target-url.ts +46 -0
- package/src/next/turbopack-config.ts +54 -0
- package/src/next/types.ts +47 -0
- package/src/next/webpack-config.ts +71 -0
- package/src/next/with-pyric.ts +58 -0
- package/src/register/app-bridge.ts +79 -0
- package/src/register/hooks.ts +6 -1
- package/src/register/index.ts +1 -1
- package/src/register/mapping.ts +50 -4
- package/src/rtdb/rules-json.ts +110 -0
- package/src/serve/bundler.ts +2 -0
- package/src/serve/discovery.ts +65 -44
- package/src/serve/entries/app-ai-passthrough.ts +83 -0
- package/src/serve/entries/auth-helper-core.ts +44 -8
- package/src/serve/entries/auth.ts +9 -4
- package/src/serve/entries/bridge-url.ts +9 -2
- package/src/serve/entries/database.ts +1 -0
- package/src/serve/entries/firestore.ts +1 -0
- package/src/serve/entries/init.ts +5 -2
- package/src/serve/entries/runtime.ts +25 -0
- package/src/serve/entries/storage.ts +12 -1
- package/src/serve/html-injection.ts +26 -1
- package/src/serve/rules.ts +2 -2
- package/src/serve/runtime/chip-config.ts +19 -6
- package/src/serve/sandbox-session.ts +31 -2
- package/src/serve/vite-ai-config.ts +86 -19
- package/src/serve/vite-generation-rules-watch.ts +67 -15
- package/src/serve/vite-module-swap.ts +121 -21
- package/src/serve/vite-plugin.ts +44 -6
- package/src/serve/vite-sandbox-generation.ts +1 -1
- package/src/serve/worker/client/resumable.ts +506 -0
- package/src/serve/worker/client/rtdb-references.ts +4 -1
- package/src/serve/worker/client/storage.ts +77 -7
- package/src/serve/worker/host/rules.ts +2 -1
- package/src/serve/worker/index.ts +4 -0
- package/src/serve/worker/serve-init.ts +30 -0
- package/dist/serve/site-ui/_astro/_studio_.BtYpqe1A.css +0 -1
- package/dist/serve/site-ui/_astro/app.BnMC0ywl.js +0 -109
- package/dist/serve/site-ui/_astro/app.DVXXR-WI.js +0 -1
- package/dist/serve/site-ui/_astro/index.B4Kh80he.js +0 -1
- package/dist/serve/site-ui/_astro/reads.D1exkX1-.js +0 -1
- package/dist/serve/site-ui/_astro/sandbox-controls.BqMePr5V.js +0 -1153
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>pyric/ai compatibility matrix · Pyric Studio</title><link rel="icon" type="image/svg+xml" href="/__pyric/ui/pyric-logo.svg"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.CXh9yTP1.css">
|
|
2
|
-
<link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.BoKXYrnu.css"></head> <body> <header class="studio__bar" data-astro-cid-mw7aashj> <div class="studio__bar-inner" data-astro-cid-mw7aashj> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio" data-astro-cid-mw7aashj>Pyric</a> <nav class="studio__nav" aria-label="Studio tabs" data-astro-cid-mw7aashj> <a class="studio__nav-tab" href="/__pyric/ui/" data-astro-cid-mw7aashj> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore" data-astro-cid-mw7aashj> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth" data-astro-cid-mw7aashj> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb" data-astro-cid-mw7aashj> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage" data-astro-cid-mw7aashj> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic" data-astro-cid-mw7aashj> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings" data-astro-cid-mw7aashj> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page" data-astro-cid-mw7aashj> Docs </a> </nav> </div> </header> <div class="docs-shell" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" open> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/" aria-current="page"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance" open> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/" aria-current="page"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main" data-astro-cid-mw7aashj> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/conformance-scores/">Conformance</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">AI Logic</span> </li> </ol> </nav> <article class="prose" data-astro-cid-mw7aashj> <!-- Generated from the conformance model (registry rows + surface contracts). Do not edit by hand; run bun run compat:generate. -->
|
|
2
|
+
<link rel="stylesheet" href="/__pyric/ui/_astro/_slug_.BoKXYrnu.css"></head> <body> <header class="studio__bar" data-astro-cid-mw7aashj> <div class="studio__bar-inner" data-astro-cid-mw7aashj> <a class="studio__brand" href="/__pyric/ui/" aria-label="Pyric Studio" data-astro-cid-mw7aashj>Pyric</a> <nav class="studio__nav" aria-label="Studio tabs" data-astro-cid-mw7aashj> <a class="studio__nav-tab" href="/__pyric/ui/" data-astro-cid-mw7aashj> Home </a><a class="studio__nav-tab" href="/__pyric/ui/firestore" data-astro-cid-mw7aashj> Firestore </a><a class="studio__nav-tab" href="/__pyric/ui/auth" data-astro-cid-mw7aashj> Auth </a><a class="studio__nav-tab" href="/__pyric/ui/rtdb" data-astro-cid-mw7aashj> RTDB </a><a class="studio__nav-tab" href="/__pyric/ui/storage" data-astro-cid-mw7aashj> Storage </a><a class="studio__nav-tab" href="/__pyric/ui/traffic" data-astro-cid-mw7aashj> Traffic </a><a class="studio__nav-tab" href="/__pyric/ui/settings" data-astro-cid-mw7aashj> Settings </a><a class="studio__nav-tab" href="/__pyric/ui/docs" aria-current="page" data-astro-cid-mw7aashj> Docs </a> </nav> </div> </header> <div class="docs-shell" data-astro-cid-mw7aashj> <details class="docs-nav-drawer" data-astro-cid-mw7aashj> <summary data-astro-cid-mw7aashj>Navigate</summary> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <script type="module">let i=null;function d(t){return i||(i=fetch(t).then(e=>e.json())),i}function l(t,e){return t.title.toLowerCase().includes(e)||t.excerpt.toLowerCase().includes(e)?!0:t.headings.some(r=>r.text.toLowerCase().includes(e))}function u(t,e,r){if(e.innerHTML="",t.length===0){e.hidden=!1;{const n=document.createElement("li");n.className="docs-search-empty",n.textContent="No matches",e.appendChild(n)}return}e.hidden=!1;for(const n of t.slice(0,8)){const s=document.createElement("li"),c=document.createElement("a");c.href=n.path;const o=document.createElement("span");o.className="docs-search-result-title",o.textContent=n.title;const a=document.createElement("span");a.className="docs-search-result-meta",a.textContent=[n.group,n.section].filter(Boolean).join(" / "),c.append(o,a),s.appendChild(c),e.appendChild(s)}}document.querySelectorAll(".docs-search").forEach(t=>{const e=t.dataset.indexUrl,r=t.querySelector(".docs-search-input"),n=t.querySelector(".docs-search-results");r.addEventListener("input",async()=>{const s=r.value.trim().toLowerCase();if(!s){n.hidden=!0,n.innerHTML="";return}const{pages:c}=await d(e);r.value.trim().toLowerCase()===s&&u(c.filter(o=>l(o,s)),n)}),r.addEventListener("focus",()=>{d(e),n.childElementCount>0&&(n.hidden=!1)}),r.addEventListener("keydown",s=>{s.key==="Escape"&&(r.value="",n.hidden=!0,n.innerHTML="",r.blur())}),r.addEventListener("blur",()=>{window.setTimeout(()=>{n.hidden=!0},150)})});document.addEventListener("keydown",t=>{if(!(t.metaKey||t.ctrlKey)||t.key.toLowerCase()!=="k")return;const e=[...document.querySelectorAll(".docs-search-input")].find(r=>r.offsetParent!==null);e&&(t.preventDefault(),e.focus(),e.select())});</script> <details class="docs-nav-group"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" open> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/" aria-current="page"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> </details> <nav class="docs-nav" aria-label="Documentation"> <div class="docs-search" data-index-url="/__pyric/ui/docs/index.json"> <div class="docs-search-field"> <svg class="docs-search-icon" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"> <path d="M11.5 11.5 15 15M13 7A6 6 0 1 1 1 7a6 6 0 0 1 12 0Z" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"></path> </svg> <input type="text" class="docs-search-input" placeholder="Search docs" aria-label="Search docs" autocomplete="off" spellcheck="false"> <kbd class="docs-search-kbd">⌘K</kbd> </div> <ul class="docs-search-results" hidden></ul> </div> <details class="docs-nav-group" id="nav-group-overview"> <summary>Overview</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/overview/"> Overview </a> </li><li> <a href="/__pyric/ui/docs/tutorial/"> Tutorial </a> </li><li> <a href="/__pyric/ui/docs/examples/"> Examples </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-get-started"> <summary>Get started</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/get-started/start-building/"> Quickstart </a> </li><li> <a href="/__pyric/ui/docs/get-started/vite/"> Vite </a> </li><li> <a href="/__pyric/ui/docs/get-started/nextjs/"> Next.js </a> </li><li> <a href="/__pyric/ui/docs/get-started/how-the-swap-works/"> How the swap works </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-build"> <summary>Build</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/build/authentication/"> Authentication </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-firestore/"> Cloud Firestore </a> </li><li> <a href="/__pyric/ui/docs/build/realtime-database/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-storage/"> Cloud Storage </a> </li><li> <a href="/__pyric/ui/docs/build/cloud-messaging/"> Cloud Messaging </a> </li><li> <a href="/__pyric/ui/docs/build/ai-logic/"> AI Logic </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-secure-debug"> <summary>Secure & debug</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/secure/secure-it-with-rules/"> Security Rules </a> </li><li> <a href="/__pyric/ui/docs/secure/simulate-and-lint/"> Simulate and lint before you deploy </a> </li><li> <a href="/__pyric/ui/docs/secure/write-a-rules-test-suite/"> Write a rules test suite </a> </li><li> <a href="/__pyric/ui/docs/secure/read-a-denial/"> Read a denial and understand it </a> </li><li> <a href="/__pyric/ui/docs/secure/rules-standard-library/"> The rules standard library </a> </li><li> <a href="/__pyric/ui/docs/secure/rtdb-rules-in-typescript/"> RTDB rules in TypeScript </a> </li><li> <a href="/__pyric/ui/docs/secure/firestore-rules-limits/"> Rules limits </a> </li><li> <a href="/__pyric/ui/docs/secure/audit-your-rules/"> Audit rules and data </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading" id="nav-section-secure-debug-examples"> Examples </h2> <ul> <li> <a href="/__pyric/ui/docs/examples/chess/"> Chess showcase </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-observe-shape"> <summary>Observe & shape</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/observe/see-whats-happening/"> Traffic & rule verdicts </a> </li><li> <a href="/__pyric/ui/docs/observe/resolve-runtime-status/"> Runtime status </a> </li><li> <a href="/__pyric/ui/docs/observe/shape-your-data/"> Seed, snapshot, replay </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-ship-test"> <summary>Ship & test</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/ship/ship-to-production/"> Ship to production </a> </li><li> <a href="/__pyric/ui/docs/ship/test-in-node/"> Test in Node </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-work-with-an-agent"> <summary>Work with an agent</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/agent/set-up-your-agent/"> Connect an agent </a> </li><li> <a href="/__pyric/ui/docs/agent/work-with-an-agent/"> Use the MCP tools </a> </li><li> <a href="/__pyric/ui/docs/agent/watch-and-review/"> Watch in Pyric Studio </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-trust"> <summary>Trust</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/trust/versioning-and-compatibility/"> Versioning and the fb tag </a> </li><li> <a href="/__pyric/ui/docs/trust/storage-rules-stdlib-research/"> Storage Rules modules: evidence and design </a> </li><li> <a href="/__pyric/ui/docs/trust/rules-standard-library/"> Rules standard library reference </a> </li> </ul> </div> </div> </details><details class="docs-nav-group" id="nav-group-conformance" open> <summary>Conformance</summary> <div class="docs-nav-group-body"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/conformance-scores/"> Public API coverage </a> </li><li> <a href="/__pyric/ui/docs/trust/how-we-know-it-matches-firebase/"> How we know it matches Firebase </a> </li><li> <a href="/__pyric/ui/docs/app-compat/"> App </a> </li><li> <a href="/__pyric/ui/docs/ai-compat/" aria-current="page"> AI Logic </a> </li><li> <a href="/__pyric/ui/docs/auth-compat/"> Auth </a> </li><li> <a href="/__pyric/ui/docs/firestore-compat/"> Firestore </a> </li><li> <a href="/__pyric/ui/docs/database-compat/"> Realtime Database </a> </li><li> <a href="/__pyric/ui/docs/storage-compat/"> Storage </a> </li><li> <a href="/__pyric/ui/docs/messaging-compat/"> Messaging </a> </li><li> <a href="/__pyric/ui/docs/functions-rtdb-compat/"> Functions · RTDB </a> </li><li> <a href="/__pyric/ui/docs/rules-compat/"> Rules </a> </li> </ul> </div> </div> </details> <details class="docs-nav-group" id="nav-group-reference"> <summary>Reference</summary> <div class="docs-nav-group-body docs-nav-group-body--reference"> <div class="docs-nav-section"> <ul> <li> <a href="/__pyric/ui/docs/api-reference/"> API reference </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-app-reference-api/"> pyric/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-firestore-reference-api/"> pyric/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-auth-reference-api/"> pyric/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-reference-api/"> pyric/ai </a> </li><li> <a href="/__pyric/ui/docs/pyric-ai-scripting-reference-api/"> pyric/ai/scripting </a> </li><li> <a href="/__pyric/ui/docs/pyric-database-reference-api/"> pyric/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-storage-reference-api/"> pyric/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-reference-api/"> pyric/messaging </a> </li><li> <a href="/__pyric/ui/docs/pyric-messaging-sw-reference-api/"> pyric/messaging/sw </a> </li><li> <a href="/__pyric/ui/docs/pyric-rules-reference-api/"> pyric/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-reference-api/"> pyric/sandbox </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-firestore-reference-api/"> pyric/sandbox/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-sandbox-database-reference-api/"> pyric/sandbox/database </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">pyric-admin</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-admin-app-reference-api/"> pyric-admin/app </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-firestore-reference-api/"> pyric-admin/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-auth-reference-api/"> pyric-admin/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-database-reference-api/"> pyric-admin/database </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-storage-reference-api/"> pyric-admin/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-admin-messaging-reference-api/"> pyric-admin/messaging </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">create-pyric</h2> <ul> <li> <a href="/__pyric/ui/docs/create-pyric-reference-api/"> create-pyric </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/cli</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-cli-credentials-node-reference-api/"> @pyric/cli/credentials/node </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-verify-reference-api/"> @pyric/cli/verify </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-reference-api/"> @pyric/cli/conformance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-browser-reference-api/"> @pyric/cli/conformance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-conformance-docs-reference-api/"> @pyric/cli/conformance/docs </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-reference-api/"> @pyric/cli/assurance </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-assurance-browser-reference-api/"> @pyric/cli/assurance/browser </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-reference-api/"> @pyric/cli/bridge </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-bridge-client-reference-api/"> @pyric/cli/bridge/client </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-discover-reference-api/"> @pyric/cli/discover </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-vite-reference-api/"> @pyric/cli/vite </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-next-reference-api/"> @pyric/cli/next </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-serve-worker-reference-api/"> @pyric/cli/serve/worker </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-remote-reference-api/"> @pyric/cli/remote </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-reference-api/"> @pyric/cli/register </a> </li><li> <a href="/__pyric/ui/docs/pyric-cli-register-app-bridge-reference-api/"> @pyric/cli/register/app-bridge </a> </li> </ul> </div><div class="docs-nav-section"> <h2 class="docs-nav-heading">@pyric/ui</h2> <ul> <li> <a href="/__pyric/ui/docs/pyric-ui-auth-reference-api/"> @pyric/ui/auth </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-auth-hooks-reference-api/"> @pyric/ui/auth/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-primitives-reference-api/"> @pyric/ui/primitives </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-reference-api/"> @pyric/ui/firestore </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-firestore-hooks-reference-api/"> @pyric/ui/firestore/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rtdb-reference-api/"> @pyric/ui/rtdb </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-reference-api/"> @pyric/ui/storage </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-storage-hooks-reference-api/"> @pyric/ui/storage/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-reference-api/"> @pyric/ui/traffic </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-traffic-hooks-reference-api/"> @pyric/ui/traffic/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-reference-api/"> @pyric/ui/events </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-events-hooks-reference-api/"> @pyric/ui/events/hooks </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-agents-reference-api/"> @pyric/ui/agents </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-reference-api/"> @pyric/ui/rules </a> </li><li> <a href="/__pyric/ui/docs/pyric-ui-rules-hooks-reference-api/"> @pyric/ui/rules/hooks </a> </li> </ul> </div> </div> </details> </nav> <main class="doc-main" data-astro-cid-mw7aashj> <nav class="docs-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/__pyric/ui/docs/conformance-scores/">Conformance</a> </li><li> <span class="docs-breadcrumbs-sep" aria-hidden="true">/</span> <span aria-current="page">AI Logic</span> </li> </ol> </nav> <article class="prose" data-astro-cid-mw7aashj> <!-- Generated from the conformance model (registry rows + surface contracts). Do not edit by hand; run bun run compat:generate. -->
|
|
3
3
|
<h1 id="pyricai-compatibility-matrix"><code>pyric/ai</code> compatibility matrix</h1>
|
|
4
4
|
<div class="compat-stat">
|
|
5
5
|
<p class="compat-stat-figure">
|
|
@@ -20,134 +20,134 @@
|
|
|
20
20
|
<div class="compat-list">
|
|
21
21
|
<details class="compat-row" data-status="ok">
|
|
22
22
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior"><code>getAI(sandbox)</code> returns an AI handle bound to the sandbox target; a model minted from it answers through the in-process answer engine</span></span></span></summary>
|
|
23
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-sandbox-dispatch</code> (no capture; structural dispatch claim)</div></div>
|
|
23
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L22" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-sandbox-dispatch</code> (no capture; structural dispatch claim)</div></div>
|
|
24
24
|
</details>
|
|
25
25
|
<details class="compat-row" data-status="ok">
|
|
26
26
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior">After package resolution selects the mirror, <code>getAI(app)</code> uses the app's sandbox and the returned handle carries the app</span></span></span></summary>
|
|
27
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-app-dispatch</code> (package-resolution dispatch claim)</div></div>
|
|
27
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L31" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-app-dispatch</code> (package-resolution dispatch claim)</div></div>
|
|
28
28
|
</details>
|
|
29
29
|
<details class="compat-row" data-status="ok">
|
|
30
30
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior">With no options the backend defaults to <code>GoogleAIBackend</code>, <code>backendType</code> is <code>GOOGLE_AI</code>, and the AI handle location is the empty string</span></span></span></summary>
|
|
31
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-default-backend</code> (matches upstream AIOptions default)</div></div>
|
|
31
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L47" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-default-backend</code> (matches upstream AIOptions default)</div></div>
|
|
32
32
|
</details>
|
|
33
33
|
<details class="compat-row" data-status="ok">
|
|
34
34
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target)</code><span class="compat-sub"><span class="compat-behavior">Repeat <code>getAI</code> calls with the same target return a stable handle</span></span></span></summary>
|
|
35
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-idempotent</code> (no capture; structural claim)</div></div>
|
|
35
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L54" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-idempotent</code> (no capture; structural claim)</div></div>
|
|
36
36
|
</details>
|
|
37
37
|
<details class="compat-row" data-status="ok">
|
|
38
38
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(target, options)</code><span class="compat-sub"><span class="compat-behavior"><code>getAI(sandbox, { backend: new GoogleAIBackend(), engine: { kind: "scripted" } })</code> selects the scripted engine explicitly and behaves identically to the zero-config default</span></span></span></summary>
|
|
39
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-engine-option</code> (engine seam per packages/conformance/docs/ai/cdd-deltas.md)</div></div>
|
|
39
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L58" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-engine-option</code> (engine seam per packages/conformance/docs/ai/cdd-deltas.md)</div></div>
|
|
40
40
|
</details>
|
|
41
41
|
<details class="compat-row" data-status="ok">
|
|
42
42
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">VertexAIBackend</code><span class="compat-sub"><span class="compat-behavior"><code>VertexAIBackend</code> carries <code>backendType</code> <code>VERTEX_AI</code>; its location and the resulting AI handle location default to <code>us-central1</code></span></span></span></summary>
|
|
43
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#backend-vertex</code> (matches upstream constructor default)</div></div>
|
|
43
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L72" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#backend-vertex</code> (matches upstream constructor default)</div></div>
|
|
44
44
|
</details>
|
|
45
45
|
<details class="compat-row" data-status="ok">
|
|
46
46
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior">A short model name such as <code>gemini-flash-lite-latest</code> normalizes to the <code>models/</code> resource name on <code>GenerativeModel.model</code></span></span></span></summary>
|
|
47
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#model-name-short</code> (upstream AIModel normalization on the GoogleAI backend)</div></div>
|
|
47
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L80" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-short</code> (upstream AIModel normalization on the GoogleAI backend)</div></div>
|
|
48
48
|
</details>
|
|
49
49
|
<details class="compat-row" data-status="diverged">
|
|
50
50
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior">A <code>models/</code>-prefixed name is accepted without double prefixing</span></span></span></summary>
|
|
51
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div>
|
|
51
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L86" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div>
|
|
52
52
|
<div class="compat-note">normalization</div></div>
|
|
53
53
|
</details>
|
|
54
54
|
<details class="compat-row" data-status="ok">
|
|
55
55
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior"><code>getGenerativeModel</code> without <code>modelParams.model</code> throws an <code>AIError</code> with code <code>no-model</code></span></span></span></summary>
|
|
56
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#model-name-required</code> (upstream throw contract)</div></div>
|
|
56
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-required</code> (upstream throw contract)</div></div>
|
|
57
57
|
</details>
|
|
58
58
|
<details class="compat-row" data-status="ok">
|
|
59
59
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">getAI(sandbox)</code><span class="compat-sub"><span class="compat-behavior">The sandbox target with the scripted engine performs no network I/O for generateContent</span></span></span></summary>
|
|
60
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:instances.test.ts</code> test <code>ai#getai-sandbox-no-network</code> (ruling 1 of the engine placement deltas: the scripted engine does no I/O anywhere)</div></div>
|
|
60
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L105" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#getai-sandbox-no-network</code> (ruling 1 of the engine placement deltas: the scripted engine does no I/O anywhere)</div></div>
|
|
61
61
|
</details>
|
|
62
62
|
</div>
|
|
63
63
|
<h2 id="generativemodelgeneratecontent-envelope"><code>GenerativeModel.generateContent</code> envelope</h2>
|
|
64
64
|
<div class="compat-list">
|
|
65
65
|
<details class="compat-row" data-status="ok">
|
|
66
66
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">The response envelope top-level key set is exactly <code>candidates</code>, <code>modelVersion</code>, <code>responseId</code>, <code>usageMetadata</code></span></span></span></summary>
|
|
67
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-envelope-keys</code></div></div>
|
|
67
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-envelope-keys</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
68
68
|
</details>
|
|
69
69
|
<details class="compat-row" data-status="ok">
|
|
70
70
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">The candidate key set is <code>content</code>, <code>finishReason</code>, <code>index</code>, and <code>index</code> is present on the wire (0 for the single candidate)</span></span></span></summary>
|
|
71
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (candidateHasIndexOnWire) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-candidate-keys</code></div></div>
|
|
71
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (candidateHasIndexOnWire) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-candidate-keys</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
72
72
|
</details>
|
|
73
73
|
<details class="compat-row" data-status="ok">
|
|
74
74
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">Candidate content carries role <code>model</code> and the content key set is <code>parts</code>, <code>role</code></span></span></span></summary>
|
|
75
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-role-model</code></div></div>
|
|
75
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-role-model</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
76
76
|
</details>
|
|
77
77
|
<details class="compat-row" data-status="ok">
|
|
78
78
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">A normal completion finishes with <code>finishReason</code> <code>STOP</code></span></span></span></summary>
|
|
79
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-finish-stop</code></div></div>
|
|
79
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-finish-stop</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
80
80
|
</details>
|
|
81
81
|
<details class="compat-row" data-status="ok">
|
|
82
82
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">The usageMetadata key set on a minimal text call is <code>candidatesTokenCount</code>, <code>promptTokenCount</code>, <code>promptTokensDetails</code>, <code>serviceTier</code>, <code>totalTokenCount</code></span></span></span></summary>
|
|
83
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-key-set</code></div></div>
|
|
83
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-key-set</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
84
84
|
</details>
|
|
85
85
|
<details class="compat-row" data-status="ok">
|
|
86
86
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior"><code>usageMetadata.serviceTier</code> rides the wire even though the 2.12.0 SDK typings do not declare it</span></span></span></summary>
|
|
87
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (usageServiceTierPresent) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-service-tier</code></div></div>
|
|
87
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope (usageServiceTierPresent) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-usage-service-tier</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
88
88
|
</details>
|
|
89
89
|
<details class="compat-row" data-status="ok">
|
|
90
90
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior"><code>modelVersion</code> and <code>responseId</code> are present nonempty strings; the sandbox mints them deterministically</span></span></span></summary>
|
|
91
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-modelversion-responseid</code></div></div>
|
|
91
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-modelversion-responseid</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
92
92
|
</details>
|
|
93
93
|
<details class="compat-row" data-status="ok">
|
|
94
94
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior">A plain string request is wrapped as a single user turn before it reaches the engine</span></span></span></summary>
|
|
95
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:generate-content.test.ts</code> test <code>ai#generate-string-request</code> (no capture; upstream request formatting claim)</div></div>
|
|
95
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L82" target="_blank" rel="noopener noreferrer"><code>unit:generate-content.test.ts</code></a> test <code>ai#generate-string-request</code> (no capture; upstream request formatting claim)</div></div>
|
|
96
96
|
</details>
|
|
97
97
|
<details class="compat-row" data-status="ok">
|
|
98
98
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior">A top-level <code>systemInstruction</code> is accepted and the response envelope shape is unaffected</span></span></span></summary>
|
|
99
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-system-instruction-accepted replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-system-instruction</code></div></div>
|
|
99
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-system-instruction-accepted replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-system-instruction</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-system-instruction-accepted.json" target="_blank" rel="noopener noreferrer"><code>ai-system-instruction-accepted</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L100" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
100
100
|
</details>
|
|
101
101
|
<details class="compat-row" data-status="ok">
|
|
102
102
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior"><code>responseMimeType</code> <code>application/json</code> plus a <code>responseSchema</code> yields a text part that parses as JSON with the schema key set</span></span></span></summary>
|
|
103
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-structured-output</code></div></div>
|
|
103
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-structured-output</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-structured-output-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-structured-output-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L110" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
104
104
|
</details>
|
|
105
105
|
<details class="compat-row" data-status="ok">
|
|
106
106
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request)</code><span class="compat-sub"><span class="compat-behavior">With <code>thinkingConfig</code> on the probe model, text parts carry <code>thoughtSignature</code> and no part is flagged <code>thought: true</code></span></span></span></summary>
|
|
107
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-thinking-thought-parts (partKeySets, anyThoughtPart false) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-thinking-signature</code></div></div>
|
|
107
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-thinking-thought-parts (partKeySets, anyThoughtPart false) replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-thinking-signature</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-thinking-thought-parts.json" target="_blank" rel="noopener noreferrer"><code>ai-thinking-thought-parts</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L125" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
108
108
|
</details>
|
|
109
109
|
<details class="compat-row" data-status="ok">
|
|
110
110
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent(request, singleRequestOptions)</code><span class="compat-sub"><span class="compat-behavior">A pre-aborted <code>SingleRequestOptions.signal</code> rejects the call</span></span></span></summary>
|
|
111
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:generate-content.test.ts</code> test <code>ai#generate-abort-signal</code> (no capture; upstream SingleRequestOptions contract)</div></div>
|
|
111
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L138" target="_blank" rel="noopener noreferrer"><code>unit:generate-content.test.ts</code></a> test <code>ai#generate-abort-signal</code> (no capture; upstream SingleRequestOptions contract)</div></div>
|
|
112
112
|
</details>
|
|
113
113
|
<details class="compat-row" data-status="ok">
|
|
114
114
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContent()</code><span class="compat-sub"><span class="compat-behavior">Token counts are minted without a tokenizer, and the minimal envelope omits <code>safetyRatings</code>, matching the captured candidate key set</span></span></span></summary>
|
|
115
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-decoration-synthesized</code></div></div>
|
|
115
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/generate-content.test.ts test <code>ai#generate-decoration-synthesized</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/generate-content.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>generate-content.test.ts</code></a>)</div></div>
|
|
116
116
|
</details>
|
|
117
117
|
</div>
|
|
118
118
|
<h2 id="generatecontentstream-framing-and-aggregation"><code>generateContentStream</code> framing and aggregation</h2>
|
|
119
119
|
<div class="compat-list">
|
|
120
120
|
<details class="compat-row" data-status="ok">
|
|
121
121
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>result.stream</code> async-iterates response chunks via <code>for await</code>; each chunk is a complete GenerateContentResponse</span></span></span></summary>
|
|
122
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-async-iterable</code></div></div>
|
|
122
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-async-iterable</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
123
123
|
</details>
|
|
124
124
|
<details class="compat-row" data-status="ok">
|
|
125
125
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream() wire framing</code><span class="compat-sub"><span class="compat-behavior">Every SSE event is <code>data: </code> prefixed and its payload parses as a complete JSON document</span></span></span></summary>
|
|
126
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (allEventsDataPrefixed) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-data-prefixed</code></div></div>
|
|
126
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (allEventsDataPrefixed) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-data-prefixed</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
127
127
|
</details>
|
|
128
128
|
<details class="compat-row" data-status="ok">
|
|
129
129
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream() wire framing</code><span class="compat-sub"><span class="compat-behavior">SSE events are separated by CRLF CRLF</span></span></span></summary>
|
|
130
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (separatorIsCrlfCrlf) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-separator-crlf</code></div></div>
|
|
130
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (separatorIsCrlfCrlf) replayed byte-level by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-separator-crlf</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
131
131
|
</details>
|
|
132
132
|
<details class="compat-row" data-status="ok">
|
|
133
133
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>finishReason</code> appears only on the last chunk of a stream</span></span></span></summary>
|
|
134
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (finishReasonOnlyOnLastChunk) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-finish-last-chunk</code></div></div>
|
|
134
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (finishReasonOnlyOnLastChunk) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-finish-last-chunk</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
135
135
|
</details>
|
|
136
136
|
<details class="compat-row" data-status="ok">
|
|
137
137
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>usageMetadata</code> rides every chunk, not only the last one</span></span></span></summary>
|
|
138
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (usageMetadataChunkIndexes covers all chunks) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-usage-every-chunk</code></div></div>
|
|
138
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (usageMetadataChunkIndexes covers all chunks) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-usage-every-chunk</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
139
139
|
</details>
|
|
140
140
|
<details class="compat-row" data-status="ok">
|
|
141
141
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior">Every chunk carries <code>candidates</code> or <code>usageMetadata</code></span></span></span></summary>
|
|
142
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (everyEventHasCandidatesOrUsage) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-chunk-envelope</code></div></div>
|
|
142
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-stream-framing (everyEventHasCandidatesOrUsage) replayed by packages/pyric/test/ai/streaming.test.ts test <code>ai#stream-chunk-envelope</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>streaming.test.ts</code></a>)</div></div>
|
|
143
143
|
</details>
|
|
144
144
|
<details class="compat-row" data-status="ok">
|
|
145
145
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior"><code>result.response</code> resolves to an aggregated response whose text is the concatenation of the streamed text parts</span></span></span></summary>
|
|
146
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:streaming.test.ts</code> test <code>ai#stream-response-aggregate</code> (aggregation semantics; text values come from an explicit script)</div></div>
|
|
146
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L107" target="_blank" rel="noopener noreferrer"><code>unit:streaming.test.ts</code></a> test <code>ai#stream-response-aggregate</code> (aggregation semantics; text values come from an explicit script)</div></div>
|
|
147
147
|
</details>
|
|
148
148
|
<details class="compat-row" data-status="diverged">
|
|
149
149
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior">The aggregated response carries the final chunk <code>finishReason</code> and <code>usageMetadata</code></span></span></span></summary>
|
|
150
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:streaming.test.ts</code> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div>
|
|
150
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L117" target="_blank" rel="noopener noreferrer"><code>unit:streaming.test.ts</code></a> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div>
|
|
151
151
|
<div class="compat-note">metadata carry</div></div>
|
|
152
152
|
</details>
|
|
153
153
|
</div>
|
|
@@ -155,216 +155,216 @@
|
|
|
155
155
|
<div class="compat-list">
|
|
156
156
|
<details class="compat-row" data-status="ok">
|
|
157
157
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">GenerativeModel.startChat()</code><span class="compat-sub"><span class="compat-behavior"><code>startChat</code> returns a <code>ChatSession</code> seeded with <code>StartChatParams.history</code></span></span></span></summary>
|
|
158
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I1 validateChatHistory accept/reject via startChat) + <code>unit:chat-session.test.ts</code> test <code>ai#chat-startchat</code></div></div>
|
|
158
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L6" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I1 validateChatHistory accept/reject via startChat) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L32" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-startchat</code></div></div>
|
|
159
159
|
</details>
|
|
160
160
|
<details class="compat-row" data-status="diverged">
|
|
161
161
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessage() / getHistory()</code><span class="compat-sub"><span class="compat-behavior"><code>sendMessage</code> appends the user turn and the model turn; <code>getHistory()</code> returns the ordered <code>Content[]</code> with alternating roles</span></span></span></summary>
|
|
162
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div>
|
|
162
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L45" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div>
|
|
163
163
|
<div class="compat-note">clone</div></div>
|
|
164
164
|
</details>
|
|
165
165
|
<details class="compat-row" data-status="diverged">
|
|
166
166
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.getHistory()</code><span class="compat-sub"><span class="compat-behavior">Blocked prompts and blocked candidates are excluded from <code>getHistory()</code></span></span></span></summary>
|
|
167
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div>
|
|
167
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L61" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div>
|
|
168
168
|
<div class="compat-note">blocked history</div></div>
|
|
169
169
|
</details>
|
|
170
170
|
<details class="compat-row" data-status="ok">
|
|
171
171
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessage()</code><span class="compat-sub"><span class="compat-behavior">A <code>sendMessage</code> result carries the same envelope facts as <code>generateContent</code>: the four top-level keys and role <code>model</code></span></span></span></summary>
|
|
172
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/chat-session.test.ts test <code>ai#chat-sendmessage-envelope</code></div></div>
|
|
172
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-generate-minimal-envelope replayed by packages/pyric/test/ai/chat-session.test.ts test <code>ai#chat-sendmessage-envelope</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>chat-session.test.ts</code></a>)</div></div>
|
|
173
173
|
</details>
|
|
174
174
|
<details class="compat-row" data-status="ok">
|
|
175
175
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessageStream()</code><span class="compat-sub"><span class="compat-behavior"><code>sendMessageStream</code> returns a stream plus a response promise; history updates after aggregation completes</span></span></span></summary>
|
|
176
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-sendmessagestream</code> (no capture; streaming turn claim)</div></div>
|
|
176
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L80" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-sendmessagestream</code> (no capture; streaming turn claim)</div></div>
|
|
177
177
|
</details>
|
|
178
178
|
<details class="compat-row" data-status="diverged">
|
|
179
179
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessageStream()</code><span class="compat-sub"><span class="compat-behavior">Exactly one user turn is recorded per <code>sendMessageStream</code> call; the mirror implements the 2.13.0 fixed semantics, not the installed 2.12.0 duplicate-user-turn bug</span></span></span></summary>
|
|
180
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div>
|
|
180
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div>
|
|
181
181
|
<div class="compat-note">2.13.0 semantics</div></div>
|
|
182
182
|
</details>
|
|
183
183
|
<details class="compat-row" data-status="ok">
|
|
184
184
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">POSSIBLE_ROLES</code><span class="compat-sub"><span class="compat-behavior"><code>POSSIBLE_ROLES</code> is exactly <code>["user", "model", "function", "system"]</code></span></span></span></summary>
|
|
185
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:chat-session.test.ts</code> test <code>ai#chat-role-vocabulary</code> (upstream constant; distinct from the production wire role vocabulary in ai-error-bad-role)</div></div>
|
|
185
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L108" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-role-vocabulary</code> (upstream constant; distinct from the production wire role vocabulary in ai-error-bad-role)</div></div>
|
|
186
186
|
</details>
|
|
187
187
|
</div>
|
|
188
188
|
<h2 id="function-calling">Function calling</h2>
|
|
189
189
|
<div class="compat-list">
|
|
190
190
|
<details class="compat-row" data-status="ok">
|
|
191
191
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionCall parts</code><span class="compat-sub"><span class="compat-behavior">A functionCall part carries the key set <code>args</code>, <code>id</code>, <code>name</code>, and <code>args</code> arrives as a parsed JSON object, not a string</span></span></span></summary>
|
|
192
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (functionCallKeySet, argsIsObjectNotString) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-part-shape</code></div></div>
|
|
192
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (functionCallKeySet, argsIsObjectNotString) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-part-shape</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
193
193
|
</details>
|
|
194
194
|
<details class="compat-row" data-status="ok">
|
|
195
195
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">toolConfig.functionCallingConfig</code><span class="compat-sub"><span class="compat-behavior">Mode <code>ANY</code> forces a functionCall part in the response and the candidate finishes <code>STOP</code></span></span></span></summary>
|
|
196
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (captured under mode ANY, finishReason STOP) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-mode-any</code></div></div>
|
|
196
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (captured under mode ANY, finishReason STOP) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-mode-any</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
197
197
|
</details>
|
|
198
198
|
<details class="compat-row" data-status="ok">
|
|
199
199
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionCall parts</code><span class="compat-sub"><span class="compat-behavior"><code>functionCall.id</code> is present on the GoogleAI wire; the mirror emits an id on synthesized calls</span></span></span></summary>
|
|
200
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (id in functionCallKeySet) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-id-present</code></div></div>
|
|
200
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-call-shape (id in functionCallKeySet) replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-id-present</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L3" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
201
201
|
</details>
|
|
202
202
|
<details class="compat-row" data-status="ok">
|
|
203
203
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionResponse round trip</code><span class="compat-sub"><span class="compat-behavior">A round trip that threads the model functionCall turn back verbatim, thoughtSignature preserved, is accepted: the answer has a text part and no further functionCall part</span></span></span></summary>
|
|
204
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-response-round replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-round-trip</code></div></div>
|
|
204
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-function-response-round replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-round-trip</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-response-round.json" target="_blank" rel="noopener noreferrer"><code>ai-function-response-round</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
205
205
|
</details>
|
|
206
206
|
<details class="compat-row" data-status="ok">
|
|
207
207
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">functionResponse round trip</code><span class="compat-sub"><span class="compat-behavior">A replayed model functionCall turn lacking <code>thoughtSignature</code> is rejected 400 INVALID_ARGUMENT with the thought-signature message</span></span></span></summary>
|
|
208
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-fncall-missing-thought-signature replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-thought-signature-required</code></div></div>
|
|
208
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-fncall-missing-thought-signature replayed by packages/pyric/test/ai/function-calling.test.ts test <code>ai#fncall-thought-signature-required</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-fncall-missing-thought-signature.json" target="_blank" rel="noopener noreferrer"><code>ai-error-fncall-missing-thought-signature</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>function-calling.test.ts</code></a>)</div></div>
|
|
209
209
|
</details>
|
|
210
210
|
<details class="compat-row" data-status="ok">
|
|
211
211
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">scripted engine synthesis</code><span class="compat-sub"><span class="compat-behavior">The engine mints a <code>thoughtSignature</code> on every functionCall part it synthesizes, so scripted tool round trips replay cleanly</span></span></span></summary>
|
|
212
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:function-calling.test.ts</code> test <code>ai#fncall-signature-minted</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection)</div></div>
|
|
212
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/function-calling.test.ts#L4" target="_blank" rel="noopener noreferrer"><code>unit:function-calling.test.ts</code></a> test <code>ai#fncall-signature-minted</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-fncall-missing-thought-signature.json" target="_blank" rel="noopener noreferrer"><code>ai-error-fncall-missing-thought-signature</code></a>)</div></div>
|
|
213
213
|
</details>
|
|
214
214
|
</div>
|
|
215
215
|
<h2 id="counttokens"><code>countTokens</code></h2>
|
|
216
216
|
<div class="compat-list">
|
|
217
217
|
<details class="compat-row" data-status="ok">
|
|
218
218
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">countTokens()</code><span class="compat-sub"><span class="compat-behavior">The countTokens envelope key set is exactly <code>promptTokensDetails</code>, <code>totalTokens</code></span></span></span></summary>
|
|
219
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-envelope</code></div></div>
|
|
219
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-envelope</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-counttokens-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-counttokens-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L39" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
220
220
|
</details>
|
|
221
221
|
<details class="compat-row" data-status="ok">
|
|
222
222
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">countTokens()</code><span class="compat-sub"><span class="compat-behavior">An identical payload returns an identical <code>totalTokens</code> across calls</span></span></span></summary>
|
|
223
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope (deterministicAcrossTwoCalls) replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-deterministic</code></div></div>
|
|
223
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-counttokens-envelope (deterministicAcrossTwoCalls) replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#counttokens-deterministic</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-counttokens-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-counttokens-envelope</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L40" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
224
224
|
</details>
|
|
225
225
|
</div>
|
|
226
226
|
<h2 id="error-envelopes">Error envelopes</h2>
|
|
227
227
|
<div class="compat-list">
|
|
228
228
|
<details class="compat-row" data-status="ok">
|
|
229
229
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">A model name production has never served fails 404 NOT_FOUND with the error key set <code>code</code>, <code>message</code>, <code>status</code> and no details</span></span></span></summary>
|
|
230
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-unknown-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-unknown-model</code></div></div>
|
|
230
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-unknown-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-unknown-model</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-unknown-model.json" target="_blank" rel="noopener noreferrer"><code>ai-error-unknown-model</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L59" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
231
231
|
</details>
|
|
232
232
|
<details class="compat-row" data-status="ok">
|
|
233
233
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">A retired model family (Gemini 1.5) fails 404 NOT_FOUND with an ErrorInfo detail and a retirement message distinct from unknown-model</span></span></span></summary>
|
|
234
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-retired-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-retired-model</code></div></div>
|
|
234
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-retired-model replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-retired-model</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-retired-model.json" target="_blank" rel="noopener noreferrer"><code>ai-error-retired-model</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
235
235
|
</details>
|
|
236
236
|
<details class="compat-row" data-status="ok">
|
|
237
237
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">An invalid API key fails 400 INVALID_ARGUMENT, not 401, with ErrorInfo plus LocalizedMessage details and the message <code>API key not valid. Please pass a valid API key.</code></span></span></span></summary>
|
|
238
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-api-key replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-api-key</code></div></div>
|
|
238
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-api-key replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-api-key</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-bad-api-key.json" target="_blank" rel="noopener noreferrer"><code>ai-error-bad-api-key</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L82" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
239
239
|
</details>
|
|
240
240
|
<details class="compat-row" data-status="ok">
|
|
241
241
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">An empty <code>contents</code> array fails 400 INVALID_ARGUMENT with the message <code>contents is not specified</code></span></span></span></summary>
|
|
242
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-empty-contents replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-empty-contents</code></div></div>
|
|
242
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-empty-contents replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-empty-contents</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-empty-contents.json" target="_blank" rel="noopener noreferrer"><code>ai-error-empty-contents</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L116" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
243
243
|
</details>
|
|
244
244
|
<details class="compat-row" data-status="ok">
|
|
245
245
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">error envelope</code><span class="compat-sub"><span class="compat-behavior">An invalid content role fails 400 INVALID_ARGUMENT and the message lists the production role vocabulary: SYSTEM, SYSTEM_1, USER, ASSISTANT, DEVELOPER, CONTEXT, USER_CONTEXT, MODEL, USER</span></span></span></summary>
|
|
246
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-role replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-role</code></div></div>
|
|
246
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-error-bad-role replayed by packages/pyric/test/ai/errors-counttokens.test.ts test <code>ai#error-bad-role</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-bad-role.json" target="_blank" rel="noopener noreferrer"><code>ai-error-bad-role</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L125" target="_blank" rel="noopener noreferrer"><code>errors-counttokens.test.ts</code></a>)</div></div>
|
|
247
247
|
</details>
|
|
248
248
|
<details class="compat-row" data-status="ok">
|
|
249
249
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">AIError</code><span class="compat-sub"><span class="compat-behavior">HTTP failures surface as <code>AIError</code> with an <code>AIErrorCode</code> code and <code>customErrorData</code> carrying <code>status</code>, <code>statusText</code>, and <code>errorDetails</code></span></span></span></summary>
|
|
250
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:errors-counttokens.test.ts</code> test <code>ai#error-aierror-shape</code> (capture ai-error-bad-api-key cited as the sample envelope)</div></div>
|
|
250
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L83" target="_blank" rel="noopener noreferrer"><code>unit:errors-counttokens.test.ts</code></a> test <code>ai#error-aierror-shape</code> (capture ai-error-bad-api-key cited as the sample envelope) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-bad-api-key.json" target="_blank" rel="noopener noreferrer"><code>ai-error-bad-api-key</code></a>)</div></div>
|
|
251
251
|
</details>
|
|
252
252
|
<details class="compat-row" data-status="ok">
|
|
253
253
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">AIErrorCode</code><span class="compat-sub"><span class="compat-behavior"><code>AIErrorCode</code> exposes the 14 documented codes, from <code>error</code> through <code>unsupported</code></span></span></span></summary>
|
|
254
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:errors-counttokens.test.ts</code> test <code>ai#error-code-vocabulary</code> (upstream constant vocabulary)</div></div>
|
|
254
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/errors-counttokens.test.ts#L154" target="_blank" rel="noopener noreferrer"><code>unit:errors-counttokens.test.ts</code></a> test <code>ai#error-code-vocabulary</code> (upstream constant vocabulary)</div></div>
|
|
255
255
|
</details>
|
|
256
256
|
</div>
|
|
257
257
|
<h2 id="response-helpers-enhancedgeneratecontentresponse">Response helpers (<code>EnhancedGenerateContentResponse</code>)</h2>
|
|
258
258
|
<div class="compat-list">
|
|
259
259
|
<details class="compat-row" data-status="ok">
|
|
260
260
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.text()</code><span class="compat-sub"><span class="compat-behavior"><code>text()</code> concatenates the text parts of the first candidate</span></span></span></summary>
|
|
261
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I3 text() across mixed parts) + <code>unit:helpers-schema.test.ts</code> test <code>ai#helper-text</code></div></div>
|
|
261
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I3 text() across mixed parts) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L33" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-text</code></div></div>
|
|
262
262
|
</details>
|
|
263
263
|
<details class="compat-row" data-status="ok">
|
|
264
264
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.text()</code><span class="compat-sub"><span class="compat-behavior"><code>text()</code> throws on bad finish reasons such as <code>SAFETY</code> and on a blocked prompt</span></span></span></summary>
|
|
265
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#helper-text-throws</code> (exercised with a scripted SAFETY envelope)</div></div>
|
|
265
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L51" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-text-throws</code> (exercised with a scripted SAFETY envelope)</div></div>
|
|
266
266
|
</details>
|
|
267
267
|
<details class="compat-row" data-status="ok">
|
|
268
268
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.functionCalls()</code><span class="compat-sub"><span class="compat-behavior"><code>functionCalls()</code> returns the <code>FunctionCall</code> array from the functionCall parts, args as parsed objects</span></span></span></summary>
|
|
269
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I3 text+functionCall mix) + Capture ai-function-call-shape replayed by <code>unit:helpers-schema.test.ts</code> test <code>ai#helper-functioncalls</code></div></div>
|
|
269
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L113" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I3 text+functionCall mix) + Capture ai-function-call-shape replayed by <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L70" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-functioncalls</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-function-call-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-function-call-shape</code></a>)</div></div>
|
|
270
270
|
</details>
|
|
271
271
|
<details class="compat-row" data-status="ok">
|
|
272
272
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.thoughtSummary()</code><span class="compat-sub"><span class="compat-behavior"><code>thoughtSummary()</code> returns undefined when no part is flagged <code>thought: true</code>, the captured lite-model case</span></span></span></summary>
|
|
273
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I3 thoughtSummary from thought parts) + Capture ai-thinking-thought-parts replayed by <code>unit:helpers-schema.test.ts</code> test <code>ai#helper-thoughtsummary</code></div></div>
|
|
273
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I3 thoughtSummary from thought parts) + Capture ai-thinking-thought-parts replayed by <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L85" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-thoughtsummary</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-thinking-thought-parts.json" target="_blank" rel="noopener noreferrer"><code>ai-thinking-thought-parts</code></a>)</div></div>
|
|
274
274
|
</details>
|
|
275
275
|
<details class="compat-row" data-status="ok">
|
|
276
276
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response.inlineDataParts()</code><span class="compat-sub"><span class="compat-behavior"><code>inlineDataParts()</code> returns the <code>InlineDataPart</code> array when inlineData parts exist and undefined when none do</span></span></span></summary>
|
|
277
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#helper-inlinedataparts</code> (exercised with a scripted raw envelope)</div></div>
|
|
277
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-inlinedataparts</code> (exercised with a scripted raw envelope)</div></div>
|
|
278
278
|
</details>
|
|
279
279
|
<details class="compat-row" data-status="ok">
|
|
280
280
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">response helpers</code><span class="compat-sub"><span class="compat-behavior">Helpers tolerate omitted decoration: an envelope without <code>usageMetadata</code>, <code>finishReason</code>, or <code>safetyRatings</code> still serves <code>text()</code> without throwing</span></span></span></summary>
|
|
281
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#helper-tolerates-missing-decor</code> (exercised with a scripted bare envelope)</div></div>
|
|
281
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L124" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#helper-tolerates-missing-decor</code> (exercised with a scripted bare envelope)</div></div>
|
|
282
282
|
</details>
|
|
283
283
|
</div>
|
|
284
284
|
<h2 id="schema-builders"><code>Schema</code> builders</h2>
|
|
285
285
|
<div class="compat-list">
|
|
286
286
|
<details class="compat-row" data-status="ok">
|
|
287
287
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Schema.object()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.object</code> serializes to type <code>object</code> with <code>properties</code>, and <code>required</code> is derived by excluding <code>optionalProperties</code></span></span></span></summary>
|
|
288
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I2 empty optionalProperties + propertyOrdering) + <code>unit:helpers-schema.test.ts</code> test <code>ai#schema-object-tojson</code></div></div>
|
|
288
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L8" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I2 empty optionalProperties + propertyOrdering) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L139" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-object-tojson</code></div></div>
|
|
289
289
|
</details>
|
|
290
290
|
<details class="compat-row" data-status="diverged">
|
|
291
291
|
<summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Schema.enumString()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.enumString</code> serializes the enum values with type <code>string</code> and format <code>enum</code></span></span></span></summary>
|
|
292
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div>
|
|
292
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L153" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div>
|
|
293
293
|
<div class="compat-note">format</div></div>
|
|
294
294
|
</details>
|
|
295
295
|
<details class="compat-row" data-status="ok">
|
|
296
296
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Schema.string()/integer()/number()/boolean()/array()</code><span class="compat-sub"><span class="compat-behavior">Each primitive builder serializes its <code>SchemaType</code>, and <code>array</code> carries <code>items</code></span></span></span></summary>
|
|
297
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:helpers-schema.test.ts</code> test <code>ai#schema-primitives</code> (upstream toJSON request shape)</div></div>
|
|
297
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L160" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-primitives</code> (upstream toJSON request shape)</div></div>
|
|
298
298
|
</details>
|
|
299
299
|
<details class="compat-row" data-status="ok">
|
|
300
300
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">Schema.anyOf()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.anyOf</code> returns an <code>AnyOfSchema</code> whose JSON carries an <code>anyOf</code> array of sub-schemas and no top-level type</span></span></span></summary>
|
|
301
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:upstream-ai-probes.test.ts</code> (I2 empty anyOf → invalid-schema) + <code>unit:helpers-schema.test.ts</code> test <code>ai#schema-anyof</code></div></div>
|
|
301
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/upstream-ai-probes.test.ts#L8" target="_blank" rel="noopener noreferrer"><code>unit:upstream-ai-probes.test.ts</code></a> (I2 empty anyOf → invalid-schema) + <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L170" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-anyof</code></div></div>
|
|
302
302
|
</details>
|
|
303
303
|
<details class="compat-row" data-status="ok">
|
|
304
304
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">generationConfig.responseSchema</code><span class="compat-sub"><span class="compat-behavior">A built <code>Schema</code> serializes into <code>generationConfig.responseSchema</code> on the request and drives JSON output</span></span></span></summary>
|
|
305
|
-
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/helpers-schema.test.ts test <code>ai#schema-rides-request</code></div></div>
|
|
305
|
+
<div class="compat-evidence"><div class="compat-probe">Capture ai-structured-output-shape replayed by packages/pyric/test/ai/helpers-schema.test.ts test <code>ai#schema-rides-request</code> (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-structured-output-shape.json" target="_blank" rel="noopener noreferrer"><code>ai-structured-output-shape</code></a>, <a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L179" target="_blank" rel="noopener noreferrer"><code>helpers-schema.test.ts</code></a>)</div></div>
|
|
306
306
|
</details>
|
|
307
307
|
</div>
|
|
308
308
|
<h2 id="sandbox-answer-engine-scripted">Sandbox answer engine: scripted</h2>
|
|
309
309
|
<div class="compat-list">
|
|
310
310
|
<details class="compat-row" data-status="ok">
|
|
311
311
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">scripted engine</code><span class="compat-sub"><span class="compat-behavior">With no script the engine returns a deterministic synthesized response derived from the request, wire-true in shape: the captured envelope key sets hold</span></span></span></summary>
|
|
312
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-zero-config</code> (capture ai-generate-minimal-envelope cited as the shape source)</div></div>
|
|
312
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L10" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-zero-config</code> (capture ai-generate-minimal-envelope cited as the shape source) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>)</div></div>
|
|
313
313
|
</details>
|
|
314
314
|
<details class="compat-row" data-status="ok">
|
|
315
315
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">scripted engine</code><span class="compat-sub"><span class="compat-behavior">The same unscripted request twice yields an identical envelope, candidates and usage included</span></span></span></summary>
|
|
316
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-deterministic</code> (determinism claim from the scripted authoring deltas)</div></div>
|
|
316
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L47" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-deterministic</code> (determinism claim from the scripted authoring deltas)</div></div>
|
|
317
317
|
</details>
|
|
318
318
|
<details class="compat-row" data-status="ok">
|
|
319
319
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">Script entries without matchers are consumed in FIFO queue order</span></span></span></summary>
|
|
320
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-queue-order</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
320
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L57" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-queue-order</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
321
321
|
</details>
|
|
322
322
|
<details class="compat-row" data-status="ok">
|
|
323
323
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">Entries match by substring, regex, or predicate on the request; a matching entry wins over the plain queue</span></span></span></summary>
|
|
324
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-matchers</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
324
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L66" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-matchers</code> (ruling 2 of the scripted authoring deltas)</div></div>
|
|
325
325
|
</details>
|
|
326
326
|
<details class="compat-row" data-status="ok">
|
|
327
327
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A raw Gemini envelope entry is returned verbatim, so an observation <code>behavior.raw</code> pastes in directly and captures are the corpus</span></span></span></summary>
|
|
328
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-raw-envelope</code> (ruling 3 of the scripted authoring deltas)</div></div>
|
|
328
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L79" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-raw-envelope</code> (ruling 3 of the scripted authoring deltas)</div></div>
|
|
329
329
|
</details>
|
|
330
330
|
<details class="compat-row" data-status="ok">
|
|
331
331
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A <code>text</code> shorthand expands to a wire-true envelope: finishReason STOP, usageMetadata with serviceTier, modelVersion, responseId</span></span></span></summary>
|
|
332
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-shorthand-text</code> (capture ai-generate-minimal-envelope cited as the expansion target)</div></div>
|
|
332
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L10" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-shorthand-text</code> (capture ai-generate-minimal-envelope cited as the expansion target) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-minimal-envelope.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-minimal-envelope</code></a>)</div></div>
|
|
333
333
|
</details>
|
|
334
334
|
<details class="compat-row" data-status="ok">
|
|
335
335
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A <code>functionCall</code> shorthand expands to a model turn whose functionCall part carries a minted <code>thoughtSignature</code></span></span></span></summary>
|
|
336
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-shorthand-functioncall</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection)</div></div>
|
|
336
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L116" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-shorthand-functioncall</code> (capture ai-error-fncall-missing-thought-signature cited as the motivating rejection) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-error-fncall-missing-thought-signature.json" target="_blank" rel="noopener noreferrer"><code>ai-error-fncall-missing-thought-signature</code></a>)</div></div>
|
|
337
337
|
</details>
|
|
338
338
|
<details class="compat-row" data-status="ok">
|
|
339
339
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">A chunk-array shorthand declares chunk boundaries and the engine applies the captured framing, so authors never hand-write SSE</span></span></span></summary>
|
|
340
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-stream-chunks</code> (capture ai-generate-stream-framing cited as the framing source)</div></div>
|
|
340
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L11" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-stream-chunks</code> (capture ai-generate-stream-framing cited as the framing source) (Structured evidence: <a href="https://github.com/davideast/pyric/blob/main/packages/conformance/observations/ai/ai-generate-stream-framing.json" target="_blank" rel="noopener noreferrer"><code>ai-generate-stream-framing</code></a>)</div></div>
|
|
341
341
|
</details>
|
|
342
342
|
<details class="compat-row" data-status="ok">
|
|
343
343
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">script(ai, entries)</code><span class="compat-sub"><span class="compat-behavior">Scripted text is the one place generated text values may be asserted: <code>response.text()</code> returns the scripted string exactly</span></span></span></summary>
|
|
344
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#scripted-text-assertable</code> (evidence tier ruling 1: generated text is never compared anywhere else)</div></div>
|
|
344
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L142" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#scripted-text-assertable</code> (evidence tier ruling 1: generated text is never compared anywhere else)</div></div>
|
|
345
345
|
</details>
|
|
346
346
|
</div>
|
|
347
347
|
<h2 id="sandbox-answer-engine-openai-translation">Sandbox answer engine: openai translation</h2>
|
|
348
348
|
<div class="compat-list">
|
|
349
349
|
<details class="compat-row" data-status="ok">
|
|
350
350
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">Gemini <code>contents</code> and <code>systemInstruction</code> translate to OpenAI chat messages, and the OpenAI response translates back to a Gemini envelope with role <code>model</code></span></span></span></summary>
|
|
351
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-request-translation</code> (translation exercised against a local OpenAI-compatible mock)</div></div>
|
|
351
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L185" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-request-translation</code> (translation exercised against a local OpenAI-compatible mock)</div></div>
|
|
352
352
|
</details>
|
|
353
353
|
<details class="compat-row" data-status="ok">
|
|
354
354
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">OpenAI <code>tool_call</code> ids are matched FIFO against Gemini functionResponse parts when replaying tool history</span></span></span></summary>
|
|
355
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-fifo-tool-ids</code> (lossy translation edge from ticket #96)</div></div>
|
|
355
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L198" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-fifo-tool-ids</code> (lossy translation edge from ticket #96)</div></div>
|
|
356
356
|
</details>
|
|
357
357
|
<details class="compat-row" data-status="ok">
|
|
358
358
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">Streamed OpenAI tool_call deltas are buffered; the Gemini stream emits whole functionCall parts with parsed args, never partial fragments</span></span></span></summary>
|
|
359
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-buffered-fncalls</code> (lossy translation edge from ticket #96)</div></div>
|
|
359
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L230" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-buffered-fncalls</code> (lossy translation edge from ticket #96)</div></div>
|
|
360
360
|
</details>
|
|
361
361
|
<details class="compat-row" data-status="ok">
|
|
362
362
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">The OpenAI <code>[DONE]</code> sentinel is never forwarded as a Gemini chunk; every emitted chunk is a parseable Gemini envelope</span></span></span></summary>
|
|
363
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-done-not-forwarded</code> (lossy translation edge from ticket #96)</div></div>
|
|
363
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L254" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-done-not-forwarded</code> (lossy translation edge from ticket #96)</div></div>
|
|
364
364
|
</details>
|
|
365
365
|
<details class="compat-row" data-status="ok">
|
|
366
366
|
<summary class="compat-line"><span class="compat-dot" data-status="ok" role="img" aria-label="Conforming" title="Conforming"></span><span class="compat-main"><code class="compat-api">openai engine</code><span class="compat-sub"><span class="compat-behavior">Parts flagged <code>thought: true</code> in history are skipped when replaying to an OpenAI upstream</span></span></span></summary>
|
|
367
|
-
<div class="compat-evidence"><div class="compat-probe"><code>unit:engines.test.ts</code> test <code>ai#openai-thought-parts-skipped</code> (lossy translation edge from ticket #96)</div></div>
|
|
367
|
+
<div class="compat-evidence"><div class="compat-probe"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/engines.test.ts#L271" target="_blank" rel="noopener noreferrer"><code>unit:engines.test.ts</code></a> test <code>ai#openai-thought-parts-skipped</code> (lossy translation edge from ticket #96)</div></div>
|
|
368
368
|
</details>
|
|
369
369
|
</div>
|
|
370
370
|
<h2 id="current-gaps">Current gaps</h2>
|
|
@@ -372,17 +372,17 @@
|
|
|
372
372
|
<p>Known differences between Pyric and production Firebase. Each remains tracked as a non-conforming row.</p>
|
|
373
373
|
<div class="compat-list">
|
|
374
374
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">getGenerativeModel(ai, modelParams)</code><span class="compat-sub"><span class="compat-behavior">A <code>models/</code>-prefixed name is accepted without double prefixing</span></span></span></summary>
|
|
375
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:instances.test.ts</code> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div></div></details>
|
|
375
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/instances.test.ts#L86" target="_blank" rel="noopener noreferrer"><code>unit:instances.test.ts</code></a> test <code>ai#model-name-prefixed</code> (no capture; normalization claim)</div></div></details>
|
|
376
376
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">generateContentStream()</code><span class="compat-sub"><span class="compat-behavior">The aggregated response carries the final chunk <code>finishReason</code> and <code>usageMetadata</code></span></span></span></summary>
|
|
377
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:streaming.test.ts</code> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div></div></details>
|
|
377
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/streaming.test.ts#L117" target="_blank" rel="noopener noreferrer"><code>unit:streaming.test.ts</code></a> test <code>ai#stream-aggregate-final-meta</code> (aggregation semantics derived from the framing capture)</div></div></details>
|
|
378
378
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessage() / getHistory()</code><span class="compat-sub"><span class="compat-behavior"><code>sendMessage</code> appends the user turn and the model turn; <code>getHistory()</code> returns the ordered <code>Content[]</code> with alternating roles</span></span></span></summary>
|
|
379
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div></div></details>
|
|
379
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L45" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-threads</code> (no capture; history threading claim)</div></div></details>
|
|
380
380
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.getHistory()</code><span class="compat-sub"><span class="compat-behavior">Blocked prompts and blocked candidates are excluded from <code>getHistory()</code></span></span></span></summary>
|
|
381
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:chat-session.test.ts</code> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div></div></details>
|
|
381
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L61" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-history-excludes-blocked</code> (upstream JSDoc contract; exercised with a scripted blocked envelope)</div></div></details>
|
|
382
382
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">ChatSession.sendMessageStream()</code><span class="compat-sub"><span class="compat-behavior">Exactly one user turn is recorded per <code>sendMessageStream</code> call; the mirror implements the 2.13.0 fixed semantics, not the installed 2.12.0 duplicate-user-turn bug</span></span></span></summary>
|
|
383
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:chat-session.test.ts</code> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div></div></details>
|
|
383
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/chat-session.test.ts#L93" target="_blank" rel="noopener noreferrer"><code>unit:chat-session.test.ts</code></a> test <code>ai#chat-stream-single-user-turn</code> (no capture; divergence pinned by ruling, see notes)</div></div></details>
|
|
384
384
|
<details class="compat-row" data-status="diverged"><summary class="compat-line"><span class="compat-dot" data-status="diverged" role="img" aria-label="Diverged (documented)" title="Diverged (documented)"></span><span class="compat-main"><code class="compat-api">Schema.enumString()</code><span class="compat-sub"><span class="compat-behavior"><code>Schema.enumString</code> serializes the enum values with type <code>string</code> and format <code>enum</code></span></span></span></summary>
|
|
385
|
-
<div class="compat-evidence"><div class="compat-note"><code>unit:helpers-schema.test.ts</code> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div></div></details>
|
|
385
|
+
<div class="compat-evidence"><div class="compat-note"><a href="https://github.com/davideast/pyric/blob/main/packages/pyric/test/ai/helpers-schema.test.ts#L153" target="_blank" rel="noopener noreferrer"><code>unit:helpers-schema.test.ts</code></a> test <code>ai#schema-string-enum</code> (upstream toJSON request shape; GoogleAI accepts only enum and date-time formats)</div></div></details>
|
|
386
386
|
</div>
|
|
387
387
|
<h2 id="reviewed-public-runtime-gaps">Reviewed public-runtime gaps</h2>
|
|
388
388
|
<div class="compat-list">
|