@jini-ai/agent-plugins 0.6.17 → 0.6.19
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/CHANGELOG.md +29 -1
- package/NOTICE +14 -0
- package/README.md +35 -14
- package/charts-echarts/plugin.json +39 -0
- package/charts-echarts/skills/charts-echarts/SKILL.md +110 -0
- package/charts-recharts/plugin.json +32 -0
- package/charts-recharts/skills/charts-recharts/SKILL.md +108 -0
- package/cloudflare/NOTES.md +16 -0
- package/cloudflare/form-destinations/cloudflare-d1.mjs +9 -0
- package/cloudflare/lib/api.mjs +96 -0
- package/cloudflare/lib/assets.mjs +65 -0
- package/cloudflare/lib/dns.mjs +32 -0
- package/cloudflare/lib/domain-inventory.mjs +61 -0
- package/cloudflare/lib/domain-status.mjs +48 -0
- package/cloudflare/lib/domains.mjs +95 -0
- package/cloudflare/lib/forms.mjs +254 -0
- package/cloudflare/lib/pages-upload.mjs +51 -0
- package/cloudflare/lib/target.mjs +165 -0
- package/cloudflare/lib/workers-upload.mjs +48 -0
- package/cloudflare/lib/zones.mjs +25 -0
- package/cloudflare/mcp.json +4 -0
- package/cloudflare/plugin.json +96 -0
- package/cloudflare/skills/cloudflare/SKILL.md +57 -0
- package/cloudflare/skills/cloudflare/references/domains.md +31 -0
- package/cloudflare/skills/cloudflare/references/pages.md +18 -0
- package/cloudflare/skills/cloudflare/references/permissions.md +29 -0
- package/cloudflare/skills/cloudflare/references/troubleshooting.md +20 -0
- package/cloudflare/skills/cloudflare/references/workers.md +42 -0
- package/cloudflare/targets/cloudflare-pages.mjs +12 -0
- package/cloudflare/targets/cloudflare-workers.mjs +17 -0
- package/cloudflare/tovu-consent.json +6 -0
- package/cloudflare/tovu-deploy-targets.json +630 -0
- package/cloudflare/tovu-form-destinations.json +12 -0
- package/cloudflare/worker/forms-receiver.mjs +249 -0
- package/composio/mcp.json +10 -0
- package/composio/plugin.json +68 -0
- package/composio/skills/composio/SKILL.md +85 -0
- package/dist/core/identity-namespace.d.ts +12 -0
- package/dist/core/identity-namespace.js +20 -0
- package/dist/folder-zip-node.js +29 -7
- package/dist/lifecycle/bundled-digests.js +4 -3
- package/dist/lifecycle/install.d.ts +7 -0
- package/dist/lifecycle/install.js +45 -3
- package/dist/lifecycle/manifest.d.ts +2 -2
- package/dist/lifecycle/manifest.js +5 -3
- package/dist/lifecycle/node.js +2 -0
- package/dist/lifecycle/persistent-state.js +1 -1
- package/dist/lifecycle/ports.d.ts +8 -0
- package/dist/lifecycle/seed-bundled.js +4 -1
- package/dist/manifest.d.ts +1 -1
- package/dist/manifest.js +3 -2
- package/fly/deploy-configs/fly.mjs +115 -0
- package/fly/deploy-ops/fly.mjs +102 -0
- package/fly/mcp.json +4 -0
- package/fly/plugin.json +81 -0
- package/fly/scripts/render-deploy-workflow.mjs +150 -0
- package/fly/skills/fly/SKILL.md +43 -0
- package/fly/skills/fly/references/fly-deploy.template.yml +117 -0
- package/fly/skills/fly/references/fly.template.toml +81 -0
- package/fly/tovu-credential-schemes.json +11 -0
- package/fly/tovu-deploy-configs.json +21 -0
- package/fly/tovu-deploy-ops.json +14 -0
- package/github/deploy-ops/github-actions.mjs +164 -0
- package/github/deployments/github.mjs +415 -0
- package/github/mcp.json +4 -0
- package/github/plugin.json +105 -0
- package/github/skills/github/SKILL.md +249 -0
- package/github/skills/github/references/actions.md +224 -0
- package/github/skills/github/references/auth-and-tokens.md +140 -0
- package/github/skills/github/references/repo-files.md +135 -0
- package/github/skills/github/references/site-backup.md +159 -0
- package/github/skills/github/references/source-control.md +123 -0
- package/github/source-control/backup-push.mjs +242 -0
- package/github/source-control/commit-site.mjs +459 -0
- package/github/source-control/github.mjs +93 -0
- package/github/source-control/write-files.mjs +468 -0
- package/github/tovu-deploy-ops.json +13 -0
- package/github/tovu-source-control.json +117 -0
- package/github-pages/NOTES.md +19 -0
- package/github-pages/mcp.json +4 -0
- package/github-pages/plugin.json +48 -0
- package/github-pages/skills/github-pages/SKILL.md +44 -0
- package/github-pages/targets/github-pages.mjs +543 -0
- package/github-pages/tovu-deploy-targets.json +327 -0
- package/google-login/exports/google-g.svg +1 -0
- package/google-login/exports/sign-in-button.css +68 -0
- package/google-login/exports/sign-in-button.html +4 -0
- package/google-login/mcp.json +4 -0
- package/google-login/plugin.json +59 -0
- package/google-login/skills/google-login/SKILL.md +96 -0
- package/google-login/tovu-login-providers.json +21 -0
- package/google-workspace/README.md +132 -0
- package/google-workspace/form-destinations/README.md +87 -0
- package/google-workspace/form-destinations/dedupe.mjs +43 -0
- package/google-workspace/form-destinations/delivery-result.mjs +69 -0
- package/google-workspace/form-destinations/mapping.mjs +152 -0
- package/google-workspace/form-destinations/sheets.mjs +202 -0
- package/google-workspace/lib/auth.mjs +81 -0
- package/google-workspace/lib/drive-files.mjs +54 -0
- package/google-workspace/lib/form-destination-settings.mjs +72 -0
- package/google-workspace/lib/http.mjs +168 -0
- package/google-workspace/lib/picker-flow.mjs +171 -0
- package/google-workspace/lib/picker-selection.mjs +107 -0
- package/google-workspace/lib/product-state.mjs +93 -0
- package/google-workspace/lib/request-policy.mjs +163 -0
- package/google-workspace/lib/sheets-a1.mjs +79 -0
- package/google-workspace/lib/sheets-admin-csv.mjs +82 -0
- package/google-workspace/lib/sheets-admin-request-kinds.mjs +183 -0
- package/google-workspace/lib/sheets-client.mjs +286 -0
- package/google-workspace/lib/surface-actions.mjs +107 -0
- package/google-workspace/mcp.json +4 -0
- package/google-workspace/plugin.json +77 -0
- package/google-workspace/products.json +12 -0
- package/google-workspace/skills/google-workspace/SKILL.md +82 -0
- package/google-workspace/skills/google-workspace/references/connection.md +102 -0
- package/google-workspace/skills/google-workspace/references/form-delivery.md +50 -0
- package/google-workspace/skills/google-workspace/references/sheets.md +149 -0
- package/google-workspace/skills/google-workspace/references/troubleshooting.md +31 -0
- package/google-workspace/tools/account-info.mjs +18 -0
- package/google-workspace/tools/sheets/README.md +54 -0
- package/google-workspace/tools/sheets/copy-tab.mjs +23 -0
- package/google-workspace/tools/sheets/copy.mjs +23 -0
- package/google-workspace/tools/sheets/create.mjs +35 -0
- package/google-workspace/tools/sheets/find-replace.mjs +38 -0
- package/google-workspace/tools/sheets/find.mjs +52 -0
- package/google-workspace/tools/sheets/get-by-data-filter.mjs +23 -0
- package/google-workspace/tools/sheets/get.mjs +22 -0
- package/google-workspace/tools/sheets/values-append.mjs +27 -0
- package/google-workspace/tools/sheets/values-batch-clear.mjs +20 -0
- package/google-workspace/tools/sheets/values-batch-get.mjs +20 -0
- package/google-workspace/tools/sheets/values-batch-update.mjs +29 -0
- package/google-workspace/tools/sheets/values-by-data-filter.mjs +62 -0
- package/google-workspace/tools/sheets/values-clear.mjs +20 -0
- package/google-workspace/tools/sheets/values-get.mjs +21 -0
- package/google-workspace/tools/sheets/values-update.mjs +26 -0
- package/google-workspace/tools/sheets-admin/README.md +45 -0
- package/google-workspace/tools/sheets-admin/basic-filter.mjs +32 -0
- package/google-workspace/tools/sheets-admin/batch-update.mjs +25 -0
- package/google-workspace/tools/sheets-admin/developer-metadata.mjs +28 -0
- package/google-workspace/tools/sheets-admin/export-csv.mjs +67 -0
- package/google-workspace/tools/sheets-admin/filter-views.mjs +38 -0
- package/google-workspace/tools/sheets-admin/format.mjs +70 -0
- package/google-workspace/tools/sheets-admin/named-ranges.mjs +42 -0
- package/google-workspace/tools/sheets-admin/open-existing.mjs +34 -0
- package/google-workspace/tools/sheets-admin/protected-ranges-get.mjs +18 -0
- package/google-workspace/tools/sheets-admin/sort.mjs +18 -0
- package/google-workspace/tools/sheets-admin/tab-modify.mjs +36 -0
- package/google-workspace/tovu-admin-surfaces.json +63 -0
- package/google-workspace/tovu-agent-tools.json +1178 -0
- package/google-workspace/tovu-connections.json +35 -0
- package/google-workspace/tovu-form-destinations.json +10 -0
- package/google-workspace/ui/README.md +73 -0
- package/google-workspace/ui/connection-panel.handler.mjs +167 -0
- package/google-workspace/ui/connection-panel.html +17 -0
- package/google-workspace/ui/connection-panel.mjs +189 -0
- package/google-workspace/ui/connection-view.mjs +120 -0
- package/google-workspace/ui/destination-panel.handler.mjs +106 -0
- package/google-workspace/ui/destination-panel.html +17 -0
- package/google-workspace/ui/destination-panel.mjs +150 -0
- package/google-workspace/ui/dom.mjs +140 -0
- package/google-workspace/ui/panel.css +170 -0
- package/google-workspace/ui/picker-flow.mjs +87 -0
- package/google-workspace/ui/picker-view.mjs +44 -0
- package/google-workspace/ui/picker.handler.mjs +56 -0
- package/google-workspace/ui/picker.html +17 -0
- package/google-workspace/ui/picker.mjs +88 -0
- package/google-workspace/ui/surface-client.mjs +227 -0
- package/higgsfield-media/mcp.json +9 -0
- package/higgsfield-media/plugin.json +109 -0
- package/higgsfield-media/skills/higgsfield-media/SKILL.md +325 -0
- package/higgsfield-media/skills/higgsfield-media/references/failure-modes.md +116 -0
- package/higgsfield-media/skills/higgsfield-media/references/models-and-plan-gates.md +142 -0
- package/jev/mcp.json +4 -0
- package/jev/plugin.json +44 -0
- package/jev/skills/jev/SKILL.md +308 -0
- package/jev/skills/jev/references/cookbooks.md +197 -0
- package/jev/skills/jev/references/jaggedness.md +135 -0
- package/jev/skills/jev/references/javascript-sdk.md +146 -0
- package/jev/skills/jev/references/patterns.md +123 -0
- package/jev/skills/jev/references/primitives-reference.md +187 -0
- package/langfuse/plugin.json +22 -0
- package/meilisearch/mcp.json +4 -0
- package/meilisearch/plugin.json +54 -0
- package/meilisearch/providers/meilisearch.mjs +651 -0
- package/meilisearch/skills/meilisearch/SKILL.md +43 -0
- package/meilisearch/tovu-search-providers.json +10 -0
- package/netlify/NOTES.md +13 -0
- package/netlify/mcp.json +4 -0
- package/netlify/plugin.json +47 -0
- package/netlify/skills/netlify/SKILL.md +39 -0
- package/netlify/targets/netlify.mjs +384 -0
- package/netlify/tovu-consent.json +6 -0
- package/netlify/tovu-deploy-targets.json +163 -0
- package/opentelemetry/mcp.json +4 -0
- package/opentelemetry/plugin.json +52 -0
- package/opentelemetry/skills/opentelemetry/SKILL.md +39 -0
- package/package.json +161 -6
- package/posthog/mcp.json +4 -0
- package/posthog/plugin.json +46 -0
- package/posthog/skills/posthog/SKILL.md +36 -0
- package/railway/deploy-configs/railway.mjs +135 -0
- package/railway/deploy-ops/railway.mjs +167 -0
- package/railway/mcp.json +4 -0
- package/railway/plugin.json +45 -0
- package/railway/skills/railway/SKILL.md +66 -0
- package/railway/tovu-deploy-configs.json +16 -0
- package/railway/tovu-deploy-ops.json +11 -0
- package/render/deploy-configs/render.mjs +141 -0
- package/render/deploy-ops/render.mjs +152 -0
- package/render/mcp.json +4 -0
- package/render/plugin.json +47 -0
- package/render/skills/render/SKILL.md +63 -0
- package/render/tovu-deploy-configs.json +16 -0
- package/render/tovu-deploy-ops.json +11 -0
- package/resend/NOTES.md +52 -0
- package/resend/adapters/resend.mjs +161 -0
- package/resend/lib/domains.mjs +137 -0
- package/resend/lib/errors.mjs +25 -0
- package/resend/lib/feedback.mjs +118 -0
- package/resend/mcp.json +13 -0
- package/resend/plugin.json +192 -0
- package/resend/skills/resend/SKILL.md +107 -0
- package/resend/tovu-mail-adapters.json +22 -0
- package/s3-compatible/NOTES.md +11 -0
- package/s3-compatible/mcp.json +4 -0
- package/s3-compatible/object-stores/s3-compatible.mjs +287 -0
- package/s3-compatible/plugin.json +56 -0
- package/s3-compatible/skills/s3-compatible/SKILL.md +39 -0
- package/s3-compatible/targets/s3-compatible.mjs +1054 -0
- package/s3-compatible/tovu-deploy-targets.json +432 -0
- package/s3-compatible/tovu-object-stores.json +29 -0
- package/sentry/mcp.json +4 -0
- package/sentry/plugin.json +49 -0
- package/sentry/skills/sentry/SKILL.md +34 -0
- package/shopify/mcp.json +4 -0
- package/shopify/plugin.json +22 -0
- package/shopify/skills/shopify/SKILL.md +103 -0
- package/shopify/skills/shopify/references/catalog-sync.md +74 -0
- package/shopify/skills/shopify/references/domains.md +26 -0
- package/shopify/skills/shopify/references/live-storefront.md +34 -0
- package/shopify/skills/shopify/references/storefront-snippets.md +21 -0
- package/site-compliance/mcp.json +4 -0
- package/site-compliance/plugin.json +34 -0
- package/site-compliance/skills/site-compliance/SKILL.md +220 -0
- package/site-compliance/skills/site-compliance/references/ccpa-cpra.md +115 -0
- package/site-compliance/skills/site-compliance/references/gdpr-eu-uk.md +143 -0
- package/site-compliance/skills/site-compliance/references/wcag-2-2.md +129 -0
- package/site-import/mcp.json +4 -0
- package/site-import/plugin.json +41 -0
- package/site-import/skills/site-import/SKILL.md +232 -0
- package/site-import/skills/site-import/references/content-mapping.md +166 -0
- package/site-import/skills/site-import/references/discovery-and-classification.md +117 -0
- package/site-import/skills/site-import/references/theme-extraction.md +34 -0
- package/slide-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
- package/slide-design/mcp.json +4 -0
- package/slide-design/plugin.json +26 -0
- package/slide-design/skills/slide-design/SKILL.md +103 -0
- package/slide-design/skills/slide-design/references/charts-and-exhibits.md +100 -0
- package/slide-design/skills/slide-design/references/html-deck.md +175 -0
- package/slide-design/skills/slide-design/references/layout-and-style.md +131 -0
- package/slide-design/skills/slide-design/references/review.md +93 -0
- package/slide-design/skills/slide-design/references/storyline.md +118 -0
- package/stripe/plugin.json +22 -0
- package/supabase/mcp.json +26 -0
- package/supabase/plugin.json +78 -0
- package/supabase/skills/supabase/SKILL.md +169 -0
- package/supabase/skills/supabase/references/failure-modes.md +101 -0
- package/ui-ux-design/CHANGELOG.md +28 -0
- package/ui-ux-design/LICENSE +201 -0
- package/ui-ux-design/NOTICE +14 -0
- package/ui-ux-design/README.md +62 -0
- package/ui-ux-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
- package/ui-ux-design/mcp.json +4 -0
- package/ui-ux-design/plugin.json +26 -0
- package/ui-ux-design/skills/frontend-accessibility/SKILL.md +60 -0
- package/ui-ux-design/skills/gstack-design/SKILL.md +53 -0
- package/ui-ux-design/skills/gstack-design/references/consultation.md +30 -0
- package/ui-ux-design/skills/gstack-design/references/html.md +29 -0
- package/ui-ux-design/skills/gstack-design/references/review.md +28 -0
- package/ui-ux-design/skills/gstack-design/references/shotgun.md +33 -0
- package/ui-ux-design/skills/gstack-design/references/upstream-notes.md +23 -0
- package/ui-ux-design/skills/interface-design/ORIGINAL.md +16 -0
- package/ui-ux-design/skills/interface-design/SKILL.md +41 -0
- package/ui-ux-design/skills/interface-design/references/commands/audit.md +40 -0
- package/ui-ux-design/skills/interface-design/references/commands/critique.md +21 -0
- package/ui-ux-design/skills/interface-design/references/commands/extract.md +34 -0
- package/ui-ux-design/skills/interface-design/references/commands/init.md +31 -0
- package/ui-ux-design/skills/interface-design/references/commands/status.md +22 -0
- package/ui-ux-design/skills/interface-design/references/examples/system-precision.md +29 -0
- package/ui-ux-design/skills/interface-design/references/examples/system-warmth.md +29 -0
- package/ui-ux-design/skills/interface-design/references/system-template.md +57 -0
- package/ui-ux-design/skills/shadcn-ui/README.md +244 -0
- package/ui-ux-design/skills/shadcn-ui/SKILL.md +333 -0
- package/ui-ux-design/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
- package/ui-ux-design/skills/shadcn-ui/examples/data-table.tsx +313 -0
- package/ui-ux-design/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
- package/ui-ux-design/skills/shadcn-ui/resources/component-catalog.md +481 -0
- package/ui-ux-design/skills/shadcn-ui/resources/customization-guide.md +516 -0
- package/ui-ux-design/skills/shadcn-ui/resources/migration-guide.md +463 -0
- package/ui-ux-design/skills/shadcn-ui/resources/setup-guide.md +412 -0
- package/ui-ux-design/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
- package/ui-ux-design/skills/ui-ux-design/SKILL.md +171 -0
- package/ui-ux-design/skills/ui-ux-design/references/brand-and-voice.md +78 -0
- package/ui-ux-design/skills/ui-ux-design/references/chrome-mobile-test-matrix.md +137 -0
- package/ui-ux-design/skills/ui-ux-design/references/components-and-states.md +112 -0
- package/ui-ux-design/skills/ui-ux-design/references/delight-and-motion.md +54 -0
- package/ui-ux-design/skills/ui-ux-design/references/foundations.md +145 -0
- package/ui-ux-design/skills/ui-ux-design/references/inclusive-ai-imagery.md +57 -0
- package/ui-ux-design/skills/ui-ux-design/references/kole-jain-uiux-concepts.md +104 -0
- package/ui-ux-design/skills/ui-ux-design/references/kuinetic-reference.md +184 -0
- package/ui-ux-design/skills/ui-ux-design/references/openai-frontend-skill.md +139 -0
- package/ui-ux-design/skills/ui-ux-design/references/premium-ui.md +55 -0
- package/ui-ux-design/skills/ui-ux-design/references/research-and-validation.md +88 -0
- package/ui-ux-design/skills/ui-ux-design/references/sam-crawford-premium-websites.md +103 -0
- package/ui-ux-design/skills/ui-ux-design/references/self-made-web-designer-core-skills.md +119 -0
- package/ui-ux-design/skills/ui-ux-design/references/ui-animation.md +173 -0
- package/ui-ux-design/skills/ui-ux-design/references/ui-loop.md +234 -0
- package/ui-ux-design/skills/ui-ux-design/references/visual-storytelling.md +54 -0
- package/ui-ux-design/skills/vercel-web-design-guidelines/SKILL.md +39 -0
- package/ui-ux-design/skills/web-compliance/SKILL.md +134 -0
- package/ui-ux-design/skills/web-compliance/references/audit-evidence.md +59 -0
- package/vercel/NOTES.md +23 -0
- package/vercel/mcp.json +4 -0
- package/vercel/object-stores/vercel-blob.mjs +147 -0
- package/vercel/plugin.json +47 -0
- package/vercel/skills/vercel/SKILL.md +48 -0
- package/vercel/targets/vercel.mjs +586 -0
- package/vercel/tovu-consent.json +6 -0
- package/vercel/tovu-deploy-targets.json +219 -0
- package/vercel/tovu-object-stores.json +10 -0
- package/wordpress/NOTES.md +33 -0
- package/wordpress/plugin.json +30 -0
- package/wordpress/skills/wordpress/SKILL.md +43 -0
- package/wordpress/skills/wordpress/references/free-site-redirect.md +46 -0
- package/wordpress/skills/wordpress/references/subdomain.md +66 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# JavaScript SDK reference
|
|
2
|
+
|
|
3
|
+
Sources: `docs.typesafe.ai/sdk/javascript.md` (quickstart), `docs.typesafe.ai/sdk/javascript/api.md`
|
|
4
|
+
(API index) and these reference sub-pages under `docs.typesafe.ai/sdk/javascript/api/`:
|
|
5
|
+
`classes/TypeSafeClient`, `interfaces/TypeSafeClientConfig`, `interfaces/RequestOptions`,
|
|
6
|
+
`interfaces/RetryPolicy`, `interfaces/SystemOneRequest`, `variables/ENV`, `functions/choice`,
|
|
7
|
+
`functions/score`, `functions/noul`, `type-aliases/ScoreCriteria`, the error classes, and
|
|
8
|
+
`sdk/javascript/changelog`. All checked on 2026-09-21 against SDK `v0.6.0`. Append `.md` to any of
|
|
9
|
+
those paths to read the raw page. If the installed package's version differs, trust its `.d.ts`
|
|
10
|
+
files over this page.
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
Requires Node.js 20+. The package ships ESM, CommonJS, and TypeScript declarations.
|
|
15
|
+
|
|
16
|
+
```sh
|
|
17
|
+
npm install @typesafe-ai/sdk
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Client
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { choice, score, noul, TypeSafeClient } from "@typesafe-ai/sdk";
|
|
24
|
+
|
|
25
|
+
const client = new TypeSafeClient(); // key from TYPESAFE_API_KEY
|
|
26
|
+
const pinned = new TypeSafeClient({ apiKey }); // explicit key wins over the env var
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
`new TypeSafeClient(config?)` throws if the API key is missing, the config is invalid, or the runtime
|
|
30
|
+
is unsupported. Explicit options win over environment variables, which win over SDK defaults. Empty
|
|
31
|
+
or whitespace-only env values are ignored.
|
|
32
|
+
|
|
33
|
+
`TypeSafeClientConfig` (all optional):
|
|
34
|
+
|
|
35
|
+
| Option | Env fallback | Default |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `apiKey` | `TYPESAFE_API_KEY` | none. Required from one source or the other. |
|
|
38
|
+
| `baseURL` | `TYPESAFE_BASE_URL` | `https://api.typesafe.ai` |
|
|
39
|
+
| `defaultModel` | `TYPESAFE_DEFAULT_MODEL` | `jev-latest` |
|
|
40
|
+
| `logLevel` | `TYPESAFE_LOG_LEVEL` | `warn`. `info` logs request summaries. `debug` adds headers and bodies. Credential headers are redacted, bodies are not. |
|
|
41
|
+
| `timeout` | none | `10000` ms per attempt. There is no total retry budget. |
|
|
42
|
+
| `retry` | none | `Partial<RetryPolicy>`, see below |
|
|
43
|
+
| `defaultHeaders` | none | extra headers on every request |
|
|
44
|
+
| `fetch` | none | global `fetch` |
|
|
45
|
+
| `logger` | none | a prefixed `console` |
|
|
46
|
+
| `dangerouslyAllowBrowser` | none | `false` |
|
|
47
|
+
|
|
48
|
+
**Don't set `dangerouslyAllowBrowser` in code that ships to a browser.** The docs say it exposes the API key to page
|
|
49
|
+
users. Call Jev from server-side code, never from an admin or site bundle that ships to a browser.
|
|
50
|
+
|
|
51
|
+
## Calling `systemOne`
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
const response = await client.systemOne(
|
|
55
|
+
{
|
|
56
|
+
state: { document: "I was charged twice. Please fix this ASAP." },
|
|
57
|
+
questions: {
|
|
58
|
+
category: choice("What is this ticket about?", { billing: null, technical: null, other: null }),
|
|
59
|
+
frustration: score("How frustrated the customer appears", [
|
|
60
|
+
"Calm, just stating facts",
|
|
61
|
+
"Frustrated but civil",
|
|
62
|
+
"Very angry, strong language",
|
|
63
|
+
]),
|
|
64
|
+
billing: noul("Is this about billing?"),
|
|
65
|
+
},
|
|
66
|
+
// model: "jev-1.13.0", // optional; omitted uses the client's defaultModel
|
|
67
|
+
},
|
|
68
|
+
{ timeout: 5000 }, // optional RequestOptions
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
response.answers.category.choice; // "billing" | "technical" | "other"
|
|
72
|
+
response.answers.frustration.score; // number, 0..2
|
|
73
|
+
response.answers.billing.noul; // number, 0..1
|
|
74
|
+
response.model; // resolved versioned id, e.g. "jev-1.13.0"
|
|
75
|
+
response.usage; // input and output token counts
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
- `systemOne(request, options?)` returns an `APIPromise<SystemOneResult<Q>>`. `request` is
|
|
79
|
+
`{ state, questions, model? }`, and `questions` must be non-empty.
|
|
80
|
+
- Answer types are inferred from the helper that built each question. For example, `.choice` is
|
|
81
|
+
narrowed to the criteria's keys.
|
|
82
|
+
- Question helpers:
|
|
83
|
+
- `choice(instructions, criteria)`: `criteria` maps each label to a description, or to `null` for
|
|
84
|
+
an undescribed label.
|
|
85
|
+
- `score(instructions, criteria)`: `criteria` is an ordered array of at least two level
|
|
86
|
+
descriptions, indexed from 0. Since `v0.6.0` it is an array. Earlier versions took an object
|
|
87
|
+
keyed by integers, so check the installed version if you see that shape.
|
|
88
|
+
- `noul(instructions?, criteria?)`: `criteria` is optional `{ true?, false? }`.
|
|
89
|
+
- `instructions` and every description accept `EntryType`: text, a JSON object or array, or `null`.
|
|
90
|
+
This is the same structured shape the HTTP API documents (see `primitives-reference.md`).
|
|
91
|
+
- `systemOne()` also throws if the questions are empty or a Score has fewer than two levels.
|
|
92
|
+
|
|
93
|
+
`RequestOptions` (per call): `timeout`, `retry` (a `Partial<RetryPolicy>`), `headers` (merged over
|
|
94
|
+
`defaultHeaders`), and `signal` (an `AbortSignal` that cancels the request and any pending retries).
|
|
95
|
+
|
|
96
|
+
## Retries
|
|
97
|
+
|
|
98
|
+
Retries are on by default, so don't wrap `systemOne` in your own retry loop. `RetryPolicy` defaults:
|
|
99
|
+
|
|
100
|
+
| Field | Default |
|
|
101
|
+
|---|---|
|
|
102
|
+
| `maxRetries` | `2` (after the first attempt; `0` disables) |
|
|
103
|
+
| `httpStatuses` | `408`, `429`, and `500`–`599` (this covers `529 Overloaded`) |
|
|
104
|
+
| `apiConnectionError` / `apiTimeoutError` | `true` / `true` |
|
|
105
|
+
| `backoffInitialMs` / `backoffMaxMs` | `500` / `5000` (doubles each retry) |
|
|
106
|
+
| `backoffJitter` | `0.25` |
|
|
107
|
+
| `respectRetryAfter` / `maxRetryAfterMs` | `true` / `60000` |
|
|
108
|
+
|
|
109
|
+
## Errors
|
|
110
|
+
|
|
111
|
+
Every SDK error extends `TypeSafeError`:
|
|
112
|
+
|
|
113
|
+
- `APIError`: a non-2xx response after retries. It has `status`, `body`, `headers`, and `requestId`
|
|
114
|
+
(from `x-typesafe-request-id`). Subclasses by status:
|
|
115
|
+
- `BadRequestError` (400), `AuthenticationError` (401), `PermissionDeniedError` (403),
|
|
116
|
+
`NotFoundError` (404), `UnprocessableEntityError` (422), `RateLimitError` (429, also has
|
|
117
|
+
`retryAfterMs`), `InternalServerError` (5xx, which includes `529`).
|
|
118
|
+
- `APIConnectionError`: DNS, TLS, or connection failure. Its subclass `APITimeoutError` fires when
|
|
119
|
+
the full response didn't arrive within `timeout`.
|
|
120
|
+
- `APIUserAbortError`: the caller aborted through `signal`.
|
|
121
|
+
|
|
122
|
+
```ts
|
|
123
|
+
import { APIError, RateLimitError, UnprocessableEntityError } from "@typesafe-ai/sdk";
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
await client.systemOne({ state, questions });
|
|
127
|
+
} catch (err) {
|
|
128
|
+
if (err instanceof UnprocessableEntityError) {
|
|
129
|
+
// Malformed question. err.body names the offending field. Fix it; don't retry.
|
|
130
|
+
} else if (err instanceof RateLimitError) {
|
|
131
|
+
// Retries are already exhausted here.
|
|
132
|
+
} else if (err instanceof APIError) {
|
|
133
|
+
// Log err.status and err.requestId.
|
|
134
|
+
}
|
|
135
|
+
throw err;
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## Not covered here
|
|
140
|
+
|
|
141
|
+
`client.models.list()` returns the models available to the account as `ModelCard[]`. The API index
|
|
142
|
+
also lists `APIPromise`/`WithResponse` (probably access to the raw HTTP response), `Logger`,
|
|
143
|
+
`ModelCard`'s fields, and `VERSION`. Their pages weren't checked for this skill. Read the page or the
|
|
144
|
+
installed `.d.ts` before relying on them.
|
|
145
|
+
TypeSafe's own agent-skill FAQ names "the agent invents request or response fields" as a known
|
|
146
|
+
failure mode.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Patterns
|
|
2
|
+
|
|
3
|
+
TypeSafe documents four named architectural patterns for using Jev in a larger system
|
|
4
|
+
(`docs.typesafe.ai/patterns.md` and its four sub-pages, crawled 2026-09-21). Each assumes you
|
|
5
|
+
already understand the primitives and confidence — read the main `SKILL.md` first if you haven't.
|
|
6
|
+
|
|
7
|
+
## Speculative fan-out
|
|
8
|
+
|
|
9
|
+
**What:** Put every question a system might need — including ones that only matter for some inputs
|
|
10
|
+
— into a single request, and let code decide afterward what's relevant. Every question evaluates in
|
|
11
|
+
parallel against the same `state`, so adding more of them usually has little effect on response time.
|
|
12
|
+
|
|
13
|
+
**Worked example (support-ticket triage, one request, 5 questions):**
|
|
14
|
+
|
|
15
|
+
- `category` (Choice: `bug_report` / `billing` / `feature_request` / `account`)
|
|
16
|
+
- `bug_severity` (Score, 3 levels) — only meaningful if `category == bug_report`
|
|
17
|
+
- `has_reproducible_steps` (Noul) — only meaningful if `category == bug_report`
|
|
18
|
+
- `refund_requested` (Noul) — only meaningful if `category == billing`
|
|
19
|
+
- `frustration` (Score, 3 levels) — relevant regardless of category
|
|
20
|
+
|
|
21
|
+
All five are asked upfront; the ones that don't apply to a given ticket are simply ignored in code.
|
|
22
|
+
Routing logic then reads whichever answers matter:
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
if category.choice == "bug_report":
|
|
26
|
+
if bug_severity.score > 1.5 and bug_repro.noul > 0.6:
|
|
27
|
+
escalate_to_engineering(ticket) # high severity + reproducible
|
|
28
|
+
elif category.choice == "billing":
|
|
29
|
+
if refund.noul > 0.7:
|
|
30
|
+
flag_likely_refund(ticket)
|
|
31
|
+
# ...other categories...
|
|
32
|
+
if frustration.score > 1.5:
|
|
33
|
+
flag_for_priority_response(ticket) # regardless of category
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
The category answer decides which speculative answers get read. A bug-report ticket's `refund`
|
|
37
|
+
answer is never consulted.
|
|
38
|
+
|
|
39
|
+
**Why:** cost and speed. A separate request per question would resend the state each time and add
|
|
40
|
+
round trips. In one request, the extra questions cost only their own tokens and barely change
|
|
41
|
+
latency.
|
|
42
|
+
|
|
43
|
+
## Confidence-gated routing
|
|
44
|
+
|
|
45
|
+
**What:** Use `confidence` as a second decision axis alongside the answer itself — the answer says
|
|
46
|
+
*what*, confidence says *whether to act on it*. Give different actions different confidence floors
|
|
47
|
+
based on the cost of being wrong.
|
|
48
|
+
|
|
49
|
+
**Worked example (voice banking commands, one Choice question, `intent`: `check_balance` /
|
|
50
|
+
`approve_transfer` / `other`):**
|
|
51
|
+
|
|
52
|
+
```python
|
|
53
|
+
if intent.confidence < 0.6:
|
|
54
|
+
route_to_human_agent(request) # floor: catches anything genuinely uncertain
|
|
55
|
+
elif intent.choice == "check_balance":
|
|
56
|
+
# Low stakes — 0.6 is already sufficient.
|
|
57
|
+
show_balance(request)
|
|
58
|
+
elif intent.choice == "approve_transfer":
|
|
59
|
+
if intent.confidence > 0.85:
|
|
60
|
+
approve_automatically(request) # high stakes, but high confidence
|
|
61
|
+
else:
|
|
62
|
+
ask_user_to_confirm(request) # high stakes, moderate confidence
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Why:** the same 0.6 floor filters out genuine model uncertainty regardless of intent; above that,
|
|
66
|
+
each action gets its own threshold scaled to how expensive a wrong automatic action would be.
|
|
67
|
+
Thresholds like these are domain-specific and not portable between question types — don't carry a
|
|
68
|
+
threshold tuned on one Choice over to a different Choice or a Score without re-validating it.
|
|
69
|
+
|
|
70
|
+
## Composite scoring
|
|
71
|
+
|
|
72
|
+
**What:** Break one complex judgment into several independent Score dimensions, normalize each to
|
|
73
|
+
0–1, and combine them with weights owned in code — rather than asking the model to produce one
|
|
74
|
+
holistic number directly.
|
|
75
|
+
|
|
76
|
+
**Worked example (resume screening, 4 independent 5-level Score questions in one request:
|
|
77
|
+
`python_depth`, `team_leadership`, `system_design`, `generalist`), combined with different weights
|
|
78
|
+
for two different roles from the same raw scores:**
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
py, lead, arch, general = (response.answers[k].score / 4 for k in
|
|
82
|
+
["python_depth", "team_leadership", "system_design", "generalist"])
|
|
83
|
+
|
|
84
|
+
# Senior IC
|
|
85
|
+
ic_score = (0.40 * py) + (0.10 * lead) + (0.40 * arch) + (0.10 * general)
|
|
86
|
+
|
|
87
|
+
# Engineering Manager
|
|
88
|
+
em_score = (0.15 * py) + (0.40 * lead) + (0.20 * arch) + (0.25 * general)
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
**Why:** ranking candidates this way gives visibility into exactly how the final number was built
|
|
92
|
+
(each component is inspectable), and the same raw per-dimension scores can be re-weighted for a
|
|
93
|
+
different downstream decision without another model call.
|
|
94
|
+
|
|
95
|
+
## Intent routing
|
|
96
|
+
|
|
97
|
+
**What:** Use Jev as a cheap, fast classifier in front of the real handlers, so only the requests
|
|
98
|
+
that actually need an expensive model or a human get one.
|
|
99
|
+
|
|
100
|
+
**Worked example (customer-service routing, 2 questions in one request — `intent`: Choice of
|
|
101
|
+
`order_status` / `product_question` / `return_exchange` / `complaint`; `complexity`: Score, 3
|
|
102
|
+
levels):**
|
|
103
|
+
|
|
104
|
+
```python
|
|
105
|
+
if intent.confidence < 0.5:
|
|
106
|
+
route_to_human(request) # floor, applies to every intent
|
|
107
|
+
elif intent.choice == "order_status":
|
|
108
|
+
handle_deterministically(request) # no LLM at all
|
|
109
|
+
elif intent.choice == "product_question":
|
|
110
|
+
route_to_llm("product_specialist", request)
|
|
111
|
+
elif intent.choice == "return_exchange":
|
|
112
|
+
route_to_llm("returns_specialist", request)
|
|
113
|
+
elif intent.choice == "complaint":
|
|
114
|
+
if complexity.score > 1 or complexity.confidence < 0.5:
|
|
115
|
+
route_to_human(request)
|
|
116
|
+
else:
|
|
117
|
+
route_to_llm("complaint_resolution", request)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Why:** one intent needs no LLM at all, two route to different specialist LLMs, and one uses a
|
|
121
|
+
*second* answer's confidence (`complexity`, a Score) to decide between an LLM and a human —
|
|
122
|
+
reinforcing that a confidence threshold's meaning depends on which question and which stakes it's
|
|
123
|
+
gating, not a single number reused everywhere.
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Primitives, HTTP API, and Models reference
|
|
2
|
+
|
|
3
|
+
Everything below is quoted or directly restated from `docs.typesafe.ai`'s `introduction.md`,
|
|
4
|
+
`primitives.md`, `primitives/choice.md`, `primitives/score.md`, `primitives/noul.md`,
|
|
5
|
+
`primitives/advanced.md`, `api.md`, and `models.md` (crawled 2026-09-21). Read the live docs if
|
|
6
|
+
anything here looks out of date. TypeSafe ships new model versions on its own schedule.
|
|
7
|
+
|
|
8
|
+
## Endpoint
|
|
9
|
+
|
|
10
|
+
```http
|
|
11
|
+
POST https://api.typesafe.ai/v1/systemone
|
|
12
|
+
Authorization: Bearer <API_KEY>
|
|
13
|
+
Content-Type: application/json
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
### Request body (top level, all required)
|
|
17
|
+
|
|
18
|
+
| Field | Type | Notes |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| `state` | `string \| object \| array` | The content every question in this request is evaluated against. See "State format" below. |
|
|
21
|
+
| `model` | `string` | e.g. `"jev-latest"`. See "Models, aliases, and versions." |
|
|
22
|
+
| `questions` | `map<string, Question>` | Key is your own id — chosen by your code, **never sent to the model, never used in inference**. Write the complete question in `instructions` even if the id looks self-explanatory. |
|
|
23
|
+
|
|
24
|
+
### Response body (top level, all required)
|
|
25
|
+
|
|
26
|
+
| Field | Type | Notes |
|
|
27
|
+
|---|---|---|
|
|
28
|
+
| `model` | `string` | The concrete, versioned model that actually answered (e.g. `"jev-1.13.0"`), even if the request's `model` field was an alias. |
|
|
29
|
+
| `answers` | `map<string, Answer>` | Keyed by the same ids you sent in `questions`. |
|
|
30
|
+
| `usage` | `{ input_tokens: integer, output_tokens: integer }` | Token accounting for the whole request (all questions combined), used for billing. |
|
|
31
|
+
|
|
32
|
+
### Errors
|
|
33
|
+
|
|
34
|
+
| Status | Meaning | What to do |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `401 Unauthorized` | Missing or invalid API key. | Check the `Authorization` header. |
|
|
37
|
+
| `422 Unprocessable Entity` | Request body failed validation (missing required field, malformed question). The body details the offending field. | Fix the request; don't retry unchanged. |
|
|
38
|
+
| `429 Too Many Requests` | Rate limit exceeded. | Retry with exponential backoff; honor `retry-after` if present. SDKs do this by default. |
|
|
39
|
+
| `529 Overloaded` | TypeSafe is temporarily overloaded. | Retry after a short delay, with backoff. |
|
|
40
|
+
|
|
41
|
+
## State format
|
|
42
|
+
|
|
43
|
+
| Format | Useful for | Example |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| String | A message, article, or passage | `"My card was charged twice."` |
|
|
46
|
+
| Object | Named fields, related records, or application state | `{"message": "...", "order_id": "A-104"}` |
|
|
47
|
+
| Array | A sequence of messages or records | `["Hi", "My customer number is TS1337.", "My card was charged twice."]` |
|
|
48
|
+
|
|
49
|
+
- Text only — string, JSON object, or array of text values. No image, audio, or video input.
|
|
50
|
+
- English is the primary training language and currently the most accurate. Other languages,
|
|
51
|
+
including CJK scripts, are accepted but less accurate — test on real content before relying on
|
|
52
|
+
Jev for a non-English workload.
|
|
53
|
+
- Prefer an object over a bare string for most requests, so parts of the state have descriptive
|
|
54
|
+
names a question can reference (see "Referencing nested state" below).
|
|
55
|
+
- Use an object, not a giant string, when you can — it composes with per-question structure and lets
|
|
56
|
+
you filter irrelevant fields out in code (see jaggedness #5, large/irrelevant state hurts accuracy).
|
|
57
|
+
|
|
58
|
+
## Question types — full field reference
|
|
59
|
+
|
|
60
|
+
Every question shares this shape: an id (your key, not sent to the model), `type`, `instructions`
|
|
61
|
+
(required on all three), and `criteria` (required for Choice and Score, optional for Noul).
|
|
62
|
+
|
|
63
|
+
### Choice
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{ "type": "choice", "instructions": <EntryType>, "criteria": { "<option>": <EntryType|null>, ... } }
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
- `criteria` is a **required** map: option name → description. A description of `null` is valid when
|
|
70
|
+
the option name is self-explanatory (e.g. `{"calm": null, "frustrated": null, "angry": null}`).
|
|
71
|
+
- **Maximum 255 options.** Each option adds only a few tokens, so give the full list of teams,
|
|
72
|
+
categories, or products rather than a shortlist. Add an `other` / `none of the above` option when
|
|
73
|
+
the list might not cover every input.
|
|
74
|
+
- Answer: `{ "type": "choice", "choice": "<winning option>", "confidence": <0-1>, "probabilities": { "<option>": <0-1>, ... } }` — `probabilities` sums to 1 across every option; `choice` is the
|
|
75
|
+
highest-probability option; `confidence` is derived from how peaked/flat that distribution is.
|
|
76
|
+
|
|
77
|
+
### Score
|
|
78
|
+
|
|
79
|
+
```json
|
|
80
|
+
{ "type": "score", "instructions": <EntryType>, "criteria": [<EntryType>, <EntryType>, ...] }
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
- `criteria` is a **required, ordered array** of level descriptions, low end of the scale first.
|
|
84
|
+
**At least 2 levels, at most 10.** Levels are 0-indexed by array position. The model is given only
|
|
85
|
+
the description text for each level and judges each independently — it does not see the level
|
|
86
|
+
number or its neighbors.
|
|
87
|
+
- Use as many levels as you can describe distinctly; three is fine. Don't add levels you can't
|
|
88
|
+
describe distinctly — plain numeric levels (`["0", "1", "2"]`) measurably perform worse than
|
|
89
|
+
described ones for the same input (docs show a same-input comparison: descriptive levels →
|
|
90
|
+
score 0.0 at confidence 1.0; numeric-only levels → score 0.55 at confidence 0.33).
|
|
91
|
+
- Answer: `{ "type": "score", "score": <number>, "confidence": <0-1>, "legend": { "<index>": "<description>", ... }, "probabilities": { "<index>": <0-1>, ... } }`.
|
|
92
|
+
**`score` formula:** the probability-weighted mean of level indices — `Σ(level_index ×
|
|
93
|
+
probability[level_index])`. It can therefore land between two levels (e.g. `1.43` between levels 1
|
|
94
|
+
and 2); do not treat `score` as an exact measurement interpolated within a level (jaggedness #2).
|
|
95
|
+
- To split a complex judgment into several Score questions and recombine: normalize each score to
|
|
96
|
+
0–1 by dividing by `len(criteria) - 1` (the top level index), then combine with weights you own in
|
|
97
|
+
code (composite scoring — see `patterns.md`).
|
|
98
|
+
- Structured level descriptions (an object per level, e.g. `{what: ..., examples: [...]}`) can
|
|
99
|
+
materially change `score`/`confidence` when the example matches the real input — the docs show the
|
|
100
|
+
same input scoring `1.43`/`0.35` with a plain-string level vs. `1.03`/`0.96` once a matching
|
|
101
|
+
example was added to that level's description.
|
|
102
|
+
|
|
103
|
+
### Noul
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{ "type": "noul", "instructions": <EntryType>, "criteria": { "true": <EntryType>, "false": <EntryType> } }
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- `criteria` is **optional** — an object clarifying what "yes" and "no" mean for ambiguous
|
|
110
|
+
boundaries. Omit it when the question is unambiguous.
|
|
111
|
+
- Answer: `{ "type": "noul", "noul": <0-1> }` — the probability the answer is yes. **No `confidence`
|
|
112
|
+
field** (a two-outcome distribution is already fully described by one number).
|
|
113
|
+
- `noul` is a probability of "yes," not a scale of the thing you asked about — it is not directly
|
|
114
|
+
comparable to a Score's `score` value for the same underlying question (docs show a 4-row example
|
|
115
|
+
where Noul values 0.03/0.14/0.81/0.92 line up with Score values 0.0/1.0/2.05/2.89 for parallel
|
|
116
|
+
questions on the same 4 inputs — not linearly related).
|
|
117
|
+
- Threshold guidance: use 0.5 when acting on a false yes and missing a true yes cost about the same;
|
|
118
|
+
raise the threshold when a false yes is expensive, lower it when missing a true yes is expensive.
|
|
119
|
+
A "don't know" band (e.g. `0.2 < noul < 0.8`) can route ambiguous cases to human review while still
|
|
120
|
+
surfacing the raw probability.
|
|
121
|
+
- Phrase the question so a "yes" answer is unambiguous — `criteria.true`/`criteria.false` exist
|
|
122
|
+
specifically for the cases where that's not obvious from the instructions alone.
|
|
123
|
+
|
|
124
|
+
### Structured `instructions`/`criteria` (`EntryType`)
|
|
125
|
+
|
|
126
|
+
`instructions`, Choice's per-option `criteria` values, Score's per-level `criteria` entries, and
|
|
127
|
+
Noul's `criteria.true`/`criteria.false` all accept the same shape — `EntryType` = `string | object |
|
|
128
|
+
array | null` — not just plain text.
|
|
129
|
+
|
|
130
|
+
- Use structure when it adds clarity (a multi-part question) or when the question needs supporting
|
|
131
|
+
data that's already JSON (a schema, a taxonomy node, a database row) — pass that JSON directly, or
|
|
132
|
+
the relevant subfields, rather than string-templating it into prose.
|
|
133
|
+
- Field names inside a structured value are **not part of the API and none are reserved** — you
|
|
134
|
+
choose them (docs use examples like `question`, `focus`, `what`, `not_for`, `examples`), and the
|
|
135
|
+
model sees the field names along with the values.
|
|
136
|
+
- Reference a specific part of `state` from inside `instructions` with a backtick dot/index path,
|
|
137
|
+
e.g. `` `ticket.messages[0].text` ``.
|
|
138
|
+
- **Walking a taxonomy:** for a deep classification tree, ask one Choice per level, with the current
|
|
139
|
+
node's children as `criteria` keys and their **subtrees** as the option values (not just a
|
|
140
|
+
description) — this lets the model see what's under each branch before committing. If a branch is
|
|
141
|
+
too large, trim its value to direct children plus a sample of leaves.
|
|
142
|
+
|
|
143
|
+
## Batching questions in one request
|
|
144
|
+
|
|
145
|
+
- All three types can be mixed freely in one `questions` map.
|
|
146
|
+
- Every question in a request is evaluated **in parallel and in isolation** against the same
|
|
147
|
+
`state`. Adding questions barely changes response time and costs only the extra tokens for the
|
|
148
|
+
added question text.
|
|
149
|
+
- Only split into two sequential requests when code genuinely cannot construct the second request
|
|
150
|
+
until it has read the first response (e.g. rank-then-verify over a large candidate set — see
|
|
151
|
+
`cookbooks.md`'s "Skill suggestion" and "Structure recovery" entries, and "Hierarchical
|
|
152
|
+
classification" for beam search over sequential per-level requests).
|
|
153
|
+
|
|
154
|
+
## Models, aliases, and versions
|
|
155
|
+
|
|
156
|
+
| Field | Value |
|
|
157
|
+
|---|---|
|
|
158
|
+
| Current model | `jev-1.13.0` (the only model family as of this writing) |
|
|
159
|
+
| Price | $42 per billion input tokens ($0.042 / million). **Output tokens are free.** |
|
|
160
|
+
| Rate limits | 250,000 tokens/second, 1,200 requests/minute — **stated as adjusting dynamically and subject to change without notice** as TypeSafe scales capacity. Higher limits available on custom/enterprise plans (`sales@typesafe.ai`). |
|
|
161
|
+
| Context length | 64k tokens per request (`state` + every question combined); 32k tokens for `state` plus the single longest question. |
|
|
162
|
+
| Input | Text only (string / JSON object / array of text). No image, audio, or video. |
|
|
163
|
+
|
|
164
|
+
**Aliases:**
|
|
165
|
+
|
|
166
|
+
| Alias | Points to (currently) | Meaning |
|
|
167
|
+
|---|---|---|
|
|
168
|
+
| `jev-latest` | `jev-1.13.0` | Most recent **stable, official** release. SDK default; what these docs' examples use. |
|
|
169
|
+
| `jev-preview` | `jev-1.13.0` | Most recent release, official or not — moves ahead of `jev-latest` when a preview build exists. Currently identical to `jev-latest`; no preview build is live right now. |
|
|
170
|
+
|
|
171
|
+
An alias moves when TypeSafe ships a new release, so answers behind it can change without any change
|
|
172
|
+
on your side. The response's `model` field always reports the concrete versioned id that answered.
|
|
173
|
+
**If you've tuned confidence thresholds against a specific version, pin that version's id instead of
|
|
174
|
+
an alias.**
|
|
175
|
+
|
|
176
|
+
`GET /v1/models` lists available `model` names (the aliases) with a description and release date —
|
|
177
|
+
`{"models": [{"name": string, "description": string, "release_date": string}, ...]}`. Versioned ids
|
|
178
|
+
like `jev-1.13.0` are always accepted by the `model` field whether or not they're listed there.
|
|
179
|
+
|
|
180
|
+
**Customization:** Jev is not fine-tuned or LoRA-adapted per customer — the same weights serve every
|
|
181
|
+
account. It's trained with RLCD (reinforcement learning for calibrated decisions — see TypeSafe's
|
|
182
|
+
"AI primer" for how this differs from optimizing for generated text). Customization happens entirely
|
|
183
|
+
through how you shape the request: `state` content, `instructions`/`criteria` wording, and how you
|
|
184
|
+
decompose and recombine questions in code — not through any per-account training.
|
|
185
|
+
|
|
186
|
+
**Data handling:** Jev is not trained on customer requests or responses. Zero data retention (ZDR)
|
|
187
|
+
is available for enterprise customers — see TypeSafe's `/legal` for the DPA and privacy policy.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "langfuse",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Connects the site to Langfuse through the ai-trace-langfuse provider in @jini-ai/provider-plugins. Installation alone does not enable or configure the provider.",
|
|
6
|
+
"author": "Jini",
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"extensions": {
|
|
9
|
+
"tovu": {
|
|
10
|
+
"id": "jini/langfuse",
|
|
11
|
+
"displayName": "Langfuse",
|
|
12
|
+
"providerPlugin": "ai-trace-langfuse",
|
|
13
|
+
"provides": [
|
|
14
|
+
"ai-tracing"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"langfuse",
|
|
20
|
+
"ai-trace-langfuse"
|
|
21
|
+
]
|
|
22
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
|
|
3
|
+
"name": "meilisearch",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"description": "Runs the site's visitor search on a Meilisearch server (self-hosted or Meilisearch Cloud) instead of the host's built-in search. Ships the search provider itself (a host loads it only when the host shipped it) and the know-how to connect it. Meilisearch receives PUBLIC content only: published, publicly visible titles, text and URLs. Members-only or otherwise restricted content is never sent to it and stays in the host's built-in search.",
|
|
6
|
+
"author": "Tovu",
|
|
7
|
+
"license": "Apache-2.0",
|
|
8
|
+
"extensions": {
|
|
9
|
+
"tovu": {
|
|
10
|
+
"maturity": "soon",
|
|
11
|
+
"summary": "Powers your site's search with Meilisearch. Only public content is sent to it.",
|
|
12
|
+
"id": "tovu/meilisearch",
|
|
13
|
+
"provides": [
|
|
14
|
+
"site-search"
|
|
15
|
+
],
|
|
16
|
+
"credentialCards": [
|
|
17
|
+
{
|
|
18
|
+
"target": "meilisearch",
|
|
19
|
+
"title": "Connect Meilisearch",
|
|
20
|
+
"label": "Tovu Search — Meilisearch",
|
|
21
|
+
"ownedApiLabel": "Tovu Search — Meilisearch",
|
|
22
|
+
"category": "general",
|
|
23
|
+
"intro": "Connect your Meilisearch server to index and search this site’s public content only.",
|
|
24
|
+
"usedFor": [
|
|
25
|
+
"Keeps a search index of your site's public content",
|
|
26
|
+
"Finds matching public content for your site's visitors"
|
|
27
|
+
],
|
|
28
|
+
"keyHint": "Scope the key to the site index: indexes.create, indexes.delete, documents.add, documents.get, search, settings.update and tasks.get. Use a scoped key rather than the master key.",
|
|
29
|
+
"saveKind": "api",
|
|
30
|
+
"fields": [
|
|
31
|
+
{
|
|
32
|
+
"name": "baseUrl",
|
|
33
|
+
"label": "Meilisearch server URL",
|
|
34
|
+
"hint": "The HTTPS URL of your own Cloud or self-hosted Meilisearch server.",
|
|
35
|
+
"required": true
|
|
36
|
+
}
|
|
37
|
+
]
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"toolKeywords": {
|
|
41
|
+
"search_status": "meilisearch",
|
|
42
|
+
"search_set_provider": "meilisearch"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"keywords": [
|
|
47
|
+
"meilisearch",
|
|
48
|
+
"search",
|
|
49
|
+
"site-search",
|
|
50
|
+
"full-text-search",
|
|
51
|
+
"typo-tolerance",
|
|
52
|
+
"search-engine"
|
|
53
|
+
]
|
|
54
|
+
}
|