quiver-cli 0.1.0
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 +188 -0
- package/bin/quiver-cli.mjs +2 -0
- package/dist/cli.js +3074 -0
- package/package.json +55 -0
- package/template/.agents/AGENTS.md +25 -0
- package/template/.agents/commands/cp.md +116 -0
- package/template/.agents/commands/next-setup.md +1064 -0
- package/template/.agents/commands/tf-readme.md +38 -0
- package/template/.agents/config.json +60 -0
- package/template/.agents/skills/agent-browser/SKILL.md +55 -0
- package/template/.agents/skills/apps/skybridge/SKILL.md +46 -0
- package/template/.agents/skills/apps/skybridge/references/architecture.md +175 -0
- package/template/.agents/skills/apps/skybridge/references/copy-template.md +24 -0
- package/template/.agents/skills/apps/skybridge/references/csp.md +33 -0
- package/template/.agents/skills/apps/skybridge/references/deploy.md +33 -0
- package/template/.agents/skills/apps/skybridge/references/discover.md +84 -0
- package/template/.agents/skills/apps/skybridge/references/download-file.md +77 -0
- package/template/.agents/skills/apps/skybridge/references/fetch-and-render-data.md +151 -0
- package/template/.agents/skills/apps/skybridge/references/oauth.md +115 -0
- package/template/.agents/skills/apps/skybridge/references/open-external-links.md +71 -0
- package/template/.agents/skills/apps/skybridge/references/prompt-llm.md +20 -0
- package/template/.agents/skills/apps/skybridge/references/publish.md +19 -0
- package/template/.agents/skills/apps/skybridge/references/run-locally.md +51 -0
- package/template/.agents/skills/apps/skybridge/references/state-and-context.md +151 -0
- package/template/.agents/skills/apps/skybridge/references/ui-guidelines.md +205 -0
- package/template/.agents/skills/code/cleanup/SKILL.md +26 -0
- package/template/.agents/skills/code/vercel-react-best-practices/AGENTS.md +3810 -0
- package/template/.agents/skills/code/vercel-react-best-practices/README.md +123 -0
- package/template/.agents/skills/code/vercel-react-best-practices/SKILL.md +149 -0
- package/template/.agents/skills/code/vercel-react-best-practices/metadata.json +15 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_sections.md +46 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/_template.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/template/.agents/skills/code/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/template/.agents/skills/data/prisma-cli/SKILL.md +247 -0
- package/template/.agents/skills/data/prisma-cli/references/db-execute.md +78 -0
- package/template/.agents/skills/data/prisma-cli/references/db-pull.md +185 -0
- package/template/.agents/skills/data/prisma-cli/references/db-push.md +148 -0
- package/template/.agents/skills/data/prisma-cli/references/db-seed.md +188 -0
- package/template/.agents/skills/data/prisma-cli/references/debug.md +46 -0
- package/template/.agents/skills/data/prisma-cli/references/dev.md +157 -0
- package/template/.agents/skills/data/prisma-cli/references/format.md +48 -0
- package/template/.agents/skills/data/prisma-cli/references/generate.md +173 -0
- package/template/.agents/skills/data/prisma-cli/references/init.md +136 -0
- package/template/.agents/skills/data/prisma-cli/references/mcp.md +38 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-deploy.md +127 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-dev.md +145 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-diff.md +89 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-reset.md +78 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-resolve.md +57 -0
- package/template/.agents/skills/data/prisma-cli/references/migrate-status.md +65 -0
- package/template/.agents/skills/data/prisma-cli/references/studio.md +137 -0
- package/template/.agents/skills/data/prisma-cli/references/validate.md +53 -0
- package/template/.agents/skills/data/prisma-client-api/SKILL.md +216 -0
- package/template/.agents/skills/data/prisma-client-api/references/client-methods.md +223 -0
- package/template/.agents/skills/data/prisma-client-api/references/constructor.md +208 -0
- package/template/.agents/skills/data/prisma-client-api/references/filters.md +256 -0
- package/template/.agents/skills/data/prisma-client-api/references/model-queries.md +281 -0
- package/template/.agents/skills/data/prisma-client-api/references/query-options.md +276 -0
- package/template/.agents/skills/data/prisma-client-api/references/raw-queries.md +194 -0
- package/template/.agents/skills/data/prisma-client-api/references/relations.md +308 -0
- package/template/.agents/skills/data/prisma-client-api/references/transactions.md +184 -0
- package/template/.agents/skills/design/impeccable/SKILL.md +176 -0
- package/template/.agents/skills/design/impeccable/reference/adapt.md +311 -0
- package/template/.agents/skills/design/impeccable/reference/animate.md +201 -0
- package/template/.agents/skills/design/impeccable/reference/audit.md +133 -0
- package/template/.agents/skills/design/impeccable/reference/bolder.md +113 -0
- package/template/.agents/skills/design/impeccable/reference/brand.md +108 -0
- package/template/.agents/skills/design/impeccable/reference/clarify.md +288 -0
- package/template/.agents/skills/design/impeccable/reference/codex.md +105 -0
- package/template/.agents/skills/design/impeccable/reference/colorize.md +257 -0
- package/template/.agents/skills/design/impeccable/reference/craft.md +123 -0
- package/template/.agents/skills/design/impeccable/reference/critique.md +767 -0
- package/template/.agents/skills/design/impeccable/reference/delight.md +302 -0
- package/template/.agents/skills/design/impeccable/reference/distill.md +111 -0
- package/template/.agents/skills/design/impeccable/reference/document.md +429 -0
- package/template/.agents/skills/design/impeccable/reference/extract.md +69 -0
- package/template/.agents/skills/design/impeccable/reference/harden.md +347 -0
- package/template/.agents/skills/design/impeccable/reference/init.md +172 -0
- package/template/.agents/skills/design/impeccable/reference/interaction-design.md +189 -0
- package/template/.agents/skills/design/impeccable/reference/layout.md +161 -0
- package/template/.agents/skills/design/impeccable/reference/live.md +718 -0
- package/template/.agents/skills/design/impeccable/reference/onboard.md +234 -0
- package/template/.agents/skills/design/impeccable/reference/optimize.md +258 -0
- package/template/.agents/skills/design/impeccable/reference/overdrive.md +130 -0
- package/template/.agents/skills/design/impeccable/reference/polish.md +241 -0
- package/template/.agents/skills/design/impeccable/reference/product.md +60 -0
- package/template/.agents/skills/design/impeccable/reference/quieter.md +99 -0
- package/template/.agents/skills/design/impeccable/reference/shape.md +165 -0
- package/template/.agents/skills/design/impeccable/reference/typeset.md +279 -0
- package/template/.agents/skills/design/impeccable/scripts/cleanup-deprecated.mjs +284 -0
- package/template/.agents/skills/design/impeccable/scripts/command-metadata.json +94 -0
- package/template/.agents/skills/design/impeccable/scripts/context-signals.mjs +225 -0
- package/template/.agents/skills/design/impeccable/scripts/context.mjs +270 -0
- package/template/.agents/skills/design/impeccable/scripts/critique-storage.mjs +242 -0
- package/template/.agents/skills/design/impeccable/scripts/design-parser.mjs +835 -0
- package/template/.agents/skills/design/impeccable/scripts/detect-csp.mjs +198 -0
- package/template/.agents/skills/design/impeccable/scripts/detect.mjs +21 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/browser/injected/index.mjs +1733 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/cli/main.mjs +244 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns-browser.js +4551 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/detect-antipatterns.mjs +43 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/browser/detect-url.mjs +252 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/regex/detect-text.mjs +535 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +986 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/static-html/detect-html.mjs +208 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/engines/visual/screenshot-contrast.mjs +189 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/findings.mjs +12 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/node/file-system.mjs +198 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/profile/profiler.mjs +166 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/registry/antipatterns.mjs +419 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/rules/checks.mjs +2316 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/color.mjs +124 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/constants.mjs +101 -0
- package/template/.agents/skills/design/impeccable/scripts/detector/shared/page.mjs +7 -0
- package/template/.agents/skills/design/impeccable/scripts/impeccable-paths.mjs +126 -0
- package/template/.agents/skills/design/impeccable/scripts/is-generated.mjs +69 -0
- package/template/.agents/skills/design/impeccable/scripts/live-accept.mjs +812 -0
- package/template/.agents/skills/design/impeccable/scripts/live-browser-session.js +123 -0
- package/template/.agents/skills/design/impeccable/scripts/live-browser.js +10316 -0
- package/template/.agents/skills/design/impeccable/scripts/live-commit-manual-edits.mjs +1241 -0
- package/template/.agents/skills/design/impeccable/scripts/live-complete.mjs +75 -0
- package/template/.agents/skills/design/impeccable/scripts/live-completion.mjs +19 -0
- package/template/.agents/skills/design/impeccable/scripts/live-copy-edit-agent.mjs +683 -0
- package/template/.agents/skills/design/impeccable/scripts/live-discard-manual-edits.mjs +51 -0
- package/template/.agents/skills/design/impeccable/scripts/live-event-validation.mjs +136 -0
- package/template/.agents/skills/design/impeccable/scripts/live-inject.mjs +557 -0
- package/template/.agents/skills/design/impeccable/scripts/live-insert-ui.mjs +458 -0
- package/template/.agents/skills/design/impeccable/scripts/live-insert.mjs +272 -0
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edit-evidence.mjs +363 -0
- package/template/.agents/skills/design/impeccable/scripts/live-manual-edits-buffer.mjs +152 -0
- package/template/.agents/skills/design/impeccable/scripts/live-poll.mjs +379 -0
- package/template/.agents/skills/design/impeccable/scripts/live-resume.mjs +94 -0
- package/template/.agents/skills/design/impeccable/scripts/live-server.mjs +2322 -0
- package/template/.agents/skills/design/impeccable/scripts/live-session-store.mjs +289 -0
- package/template/.agents/skills/design/impeccable/scripts/live-status.mjs +61 -0
- package/template/.agents/skills/design/impeccable/scripts/live-svelte-component.mjs +826 -0
- package/template/.agents/skills/design/impeccable/scripts/live-sveltekit-adapter.mjs +274 -0
- package/template/.agents/skills/design/impeccable/scripts/live-ui-core.mjs +179 -0
- package/template/.agents/skills/design/impeccable/scripts/live-wrap.mjs +894 -0
- package/template/.agents/skills/design/impeccable/scripts/live.mjs +246 -0
- package/template/.agents/skills/design/impeccable/scripts/modern-screenshot.umd.js +14 -0
- package/template/.agents/skills/design/impeccable/scripts/palette.mjs +633 -0
- package/template/.agents/skills/design/impeccable/scripts/pin.mjs +214 -0
- package/template/.agents/skills/design/shadcn/SKILL.md +242 -0
- package/template/.agents/skills/design/shadcn/agents/openai.yml +5 -0
- package/template/.agents/skills/design/shadcn/assets/shadcn-small.png +0 -0
- package/template/.agents/skills/design/shadcn/assets/shadcn.png +0 -0
- package/template/.agents/skills/design/shadcn/cli.md +257 -0
- package/template/.agents/skills/design/shadcn/customization.md +202 -0
- package/template/.agents/skills/design/shadcn/evals/evals.json +47 -0
- package/template/.agents/skills/design/shadcn/mcp.md +94 -0
- package/template/.agents/skills/design/shadcn/rules/base-vs-radix.md +306 -0
- package/template/.agents/skills/design/shadcn/rules/composition.md +195 -0
- package/template/.agents/skills/design/shadcn/rules/forms.md +192 -0
- package/template/.agents/skills/design/shadcn/rules/icons.md +101 -0
- package/template/.agents/skills/design/shadcn/rules/styling.md +162 -0
- package/template/.agents/skills/find-skills/SKILL.md +142 -0
- package/template/.agents/skills/integrations/langfuse/SKILL.md +142 -0
- package/template/.agents/skills/integrations/langfuse/references/cli.md +52 -0
- package/template/.agents/skills/integrations/langfuse/references/error-analysis.md +100 -0
- package/template/.agents/skills/integrations/langfuse/references/instrumentation.md +134 -0
- package/template/.agents/skills/integrations/langfuse/references/judge-calibration.md +288 -0
- package/template/.agents/skills/integrations/langfuse/references/prompt-migration.md +234 -0
- package/template/.agents/skills/integrations/langfuse/references/sdk-upgrade.md +175 -0
- package/template/.agents/skills/integrations/langfuse/references/skill-feedback.md +52 -0
- package/template/.agents/skills/integrations/langfuse/references/user-feedback.md +88 -0
- package/template/.agents/skills/integrations/posthog/SKILL.md +102 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-alerts.md +63 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-assigning-issues.md +77 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-fingerprints.md +57 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-monitoring.md +140 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-nextjs.md +490 -0
- package/template/.agents/skills/integrations/posthog/references/error-tracking-source-maps.md +45 -0
- package/template/.agents/skills/integrations/posthog/references/feature-flags-best-practices.md +139 -0
- package/template/.agents/skills/integrations/posthog/references/feature-flags-react.md +302 -0
- package/template/.agents/skills/integrations/posthog/references/identify-users.md +202 -0
- package/template/.agents/skills/integrations/posthog/references/integration-example.md +706 -0
- package/template/.agents/skills/integrations/posthog/references/integration-nextjs.md +385 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-1-begin.md +43 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-2-edit.md +37 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-3-revise.md +22 -0
- package/template/.agents/skills/integrations/posthog/references/integration-step-4-conclude.md +38 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-anthropic.md +200 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-basics.md +62 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-costs.md +197 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-manual-capture.md +397 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-traces.md +98 -0
- package/template/.agents/skills/integrations/posthog/references/llm-analytics-vercel-ai.md +120 -0
- package/template/.agents/skills/repo/repo-ci/SKILL.md +265 -0
- package/template/.agents/skills/repo/repo-init-next-js/SKILL.md +129 -0
- package/template/.agents/skills/repo/repo-init-next-js/references/file-contents.md +800 -0
- package/template/.agents/skills/repo/repo-init-next-js/scripts/setup.sh +47 -0
- package/template/.agents/skills/repo/repo-init-node/SKILL.md +196 -0
- package/template/.agents/skills/skill-creator/LICENSE.txt +202 -0
- package/template/.agents/skills/skill-creator/SKILL.md +485 -0
- package/template/.agents/skills/skill-creator/agents/analyzer.md +274 -0
- package/template/.agents/skills/skill-creator/agents/comparator.md +202 -0
- package/template/.agents/skills/skill-creator/agents/grader.md +223 -0
- package/template/.agents/skills/skill-creator/assets/eval_review.html +146 -0
- package/template/.agents/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/template/.agents/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/template/.agents/skills/skill-creator/references/schemas.md +430 -0
- package/template/.agents/skills/skill-creator/scripts/__init__.py +0 -0
- package/template/.agents/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/template/.agents/skills/skill-creator/scripts/generate_report.py +326 -0
- package/template/.agents/skills/skill-creator/scripts/improve_description.py +247 -0
- package/template/.agents/skills/skill-creator/scripts/package_skill.py +136 -0
- package/template/.agents/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/template/.agents/skills/skill-creator/scripts/run_eval.py +310 -0
- package/template/.agents/skills/skill-creator/scripts/run_loop.py +328 -0
- package/template/.agents/skills/skill-creator/scripts/utils.py +47 -0
- package/template/.agents/upstreams.json +80 -0
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# Anthropic LLM analytics installation - Docs
|
|
2
|
+
|
|
3
|
+
1. 1
|
|
4
|
+
|
|
5
|
+
## Install the PostHog SDK
|
|
6
|
+
|
|
7
|
+
Required
|
|
8
|
+
|
|
9
|
+
Setting up analytics starts with installing the PostHog SDK for your language. LLM analytics works best with our Python and Node SDKs.
|
|
10
|
+
|
|
11
|
+
PostHog AI
|
|
12
|
+
|
|
13
|
+
### Python
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pip install posthog
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### Node
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install @posthog/ai posthog-node
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
2. 2
|
|
26
|
+
|
|
27
|
+
## Install the Anthropic SDK
|
|
28
|
+
|
|
29
|
+
Required
|
|
30
|
+
|
|
31
|
+
Install the Anthropic SDK. The PostHog SDK instruments your LLM calls by wrapping the Anthropic client. The PostHog SDK **does not** proxy your calls.
|
|
32
|
+
|
|
33
|
+
PostHog AI
|
|
34
|
+
|
|
35
|
+
### Python
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
pip install anthropic
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Node
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm install @anthropic-ai/sdk
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**Proxy note**
|
|
48
|
+
|
|
49
|
+
These SDKs **do not** proxy your calls. They only fire off an async call to PostHog in the background to send the data. You can also use LLM analytics with other SDKs or our API, but you will need to capture the data in the right format. See the schema in the [manual capture section](/docs/llm-analytics/installation/manual-capture.md) for more details.
|
|
50
|
+
|
|
51
|
+
3. 3
|
|
52
|
+
|
|
53
|
+
## Initialize PostHog and the Anthropic wrapper
|
|
54
|
+
|
|
55
|
+
Required
|
|
56
|
+
|
|
57
|
+
Initialize PostHog with your project token and host from [your project settings](https://app.posthog.com/settings/project), then pass it to our Anthropic wrapper.
|
|
58
|
+
|
|
59
|
+
PostHog AI
|
|
60
|
+
|
|
61
|
+
### Python
|
|
62
|
+
|
|
63
|
+
```python
|
|
64
|
+
from posthog.ai.anthropic import Anthropic
|
|
65
|
+
from posthog import Posthog
|
|
66
|
+
posthog = Posthog(
|
|
67
|
+
"<ph_project_token>",
|
|
68
|
+
host="https://us.i.posthog.com"
|
|
69
|
+
)
|
|
70
|
+
client = Anthropic(
|
|
71
|
+
api_key="sk-ant-api...", # Replace with your Anthropic API key
|
|
72
|
+
posthog_client=posthog # This is an optional parameter. If it is not provided, a default client will be used.
|
|
73
|
+
)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### Node
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
import { Anthropic } from '@posthog/ai'
|
|
80
|
+
import { PostHog } from 'posthog-node'
|
|
81
|
+
const phClient = new PostHog(
|
|
82
|
+
'<ph_project_token>',
|
|
83
|
+
{ host: 'https://us.i.posthog.com' }
|
|
84
|
+
)
|
|
85
|
+
const client = new Anthropic({
|
|
86
|
+
apiKey: 'sk-ant-api...', // Replace with your Anthropic API key
|
|
87
|
+
posthog: phClient
|
|
88
|
+
})
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
> **Note:** This also works with the `AsyncAnthropic` client as well as `AnthropicBedrock`, `AnthropicVertex`, and the async versions of those.
|
|
92
|
+
|
|
93
|
+
4. 4
|
|
94
|
+
|
|
95
|
+
## Call Anthropic LLMs
|
|
96
|
+
|
|
97
|
+
Required
|
|
98
|
+
|
|
99
|
+
Now, when you use the Anthropic SDK to call LLMs, PostHog automatically captures an `$ai_generation` event. You can enrich the event with additional data such as the trace ID, distinct ID, custom properties, groups, and privacy mode options.
|
|
100
|
+
|
|
101
|
+
PostHog AI
|
|
102
|
+
|
|
103
|
+
### Python
|
|
104
|
+
|
|
105
|
+
```python
|
|
106
|
+
response = client.messages.create(
|
|
107
|
+
model="claude-3-opus-20240229",
|
|
108
|
+
messages=[
|
|
109
|
+
{
|
|
110
|
+
"role": "user",
|
|
111
|
+
"content": "Tell me a fun fact about hedgehogs"
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
posthog_distinct_id="user_123", # optional
|
|
115
|
+
posthog_trace_id="trace_123", # optional
|
|
116
|
+
posthog_properties={"conversation_id": "abc123", "paid": True}, # optional
|
|
117
|
+
posthog_groups={"company": "company_id_in_your_db"}, # optional
|
|
118
|
+
posthog_privacy_mode=False # optional
|
|
119
|
+
)
|
|
120
|
+
print(response.content[0].text)
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Node
|
|
124
|
+
|
|
125
|
+
```typescript
|
|
126
|
+
const response = await client.messages.create({
|
|
127
|
+
model: "claude-3-5-sonnet-latest",
|
|
128
|
+
messages: [
|
|
129
|
+
{
|
|
130
|
+
role: "user",
|
|
131
|
+
content: "Tell me a fun fact about hedgehogs"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
posthogDistinctId: "user_123", // optional
|
|
135
|
+
posthogTraceId: "trace_123", // optional
|
|
136
|
+
posthogProperties: { conversationId: "abc123", paid: true }, // optional
|
|
137
|
+
posthogGroups: { company: "company_id_in_your_db" }, // optional
|
|
138
|
+
posthogPrivacyMode: false // optional
|
|
139
|
+
})
|
|
140
|
+
console.log(response.content[0].text)
|
|
141
|
+
phClient.shutdown()
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
> **Notes:**
|
|
145
|
+
>
|
|
146
|
+
> - This also works when message streams are used (e.g. `stream=True` or `client.messages.stream(...)`).
|
|
147
|
+
> - If you want to capture LLM events anonymously, **don't** pass a distinct ID to the request.
|
|
148
|
+
>
|
|
149
|
+
> See our docs on [anonymous vs identified events](/docs/data/anonymous-vs-identified-events.md) to learn more.
|
|
150
|
+
|
|
151
|
+
You can expect captured `$ai_generation` events to have the following properties:
|
|
152
|
+
|
|
153
|
+
| Property | Description |
|
|
154
|
+
| --- | --- |
|
|
155
|
+
| $ai_model | The specific model, like gpt-5-mini or claude-4-sonnet |
|
|
156
|
+
| $ai_latency | The latency of the LLM call in seconds |
|
|
157
|
+
| $ai_time_to_first_token | Time to first token in seconds (streaming only) |
|
|
158
|
+
| $ai_tools | Tools and functions available to the LLM |
|
|
159
|
+
| $ai_input | List of messages sent to the LLM |
|
|
160
|
+
| $ai_input_tokens | The number of tokens in the input (often found in response.usage) |
|
|
161
|
+
| $ai_output_choices | List of response choices from the LLM |
|
|
162
|
+
| $ai_output_tokens | The number of tokens in the output (often found in response.usage) |
|
|
163
|
+
| $ai_total_cost_usd | The total cost in USD (input + output) |
|
|
164
|
+
| [[...]](/docs/llm-analytics/generations.md#event-properties) | See [full list](/docs/llm-analytics/generations.md#event-properties) of properties |
|
|
165
|
+
|
|
166
|
+
5. ## Verify traces and generations
|
|
167
|
+
|
|
168
|
+
Recommended
|
|
169
|
+
|
|
170
|
+
*Confirm LLM events are being sent to PostHog*
|
|
171
|
+
|
|
172
|
+
Let's make sure LLM events are being captured and sent to PostHog. Under **LLM analytics**, you should see rows of data appear in the **Traces** and **Generations** tabs.
|
|
173
|
+
|
|
174
|
+

|
|
175
|
+
|
|
176
|
+
[Check for LLM events in PostHog](https://app.posthog.com/llm-analytics/generations)
|
|
177
|
+
|
|
178
|
+
6. 5
|
|
179
|
+
|
|
180
|
+
## Next steps
|
|
181
|
+
|
|
182
|
+
Recommended
|
|
183
|
+
|
|
184
|
+
Now that you're capturing AI conversations, continue with the resources below to learn what else LLM Analytics enables within the PostHog platform.
|
|
185
|
+
|
|
186
|
+
| Resource | Description |
|
|
187
|
+
| --- | --- |
|
|
188
|
+
| [Basics](/docs/llm-analytics/basics.md) | Learn the basics of how LLM calls become events in PostHog. |
|
|
189
|
+
| [Generations](/docs/llm-analytics/generations.md) | Read about the $ai_generation event and its properties. |
|
|
190
|
+
| [Traces](/docs/llm-analytics/traces.md) | Explore the trace hierarchy and how to use it to debug LLM calls. |
|
|
191
|
+
| [Spans](/docs/llm-analytics/spans.md) | Review spans and their role in representing individual operations. |
|
|
192
|
+
| [Anaylze LLM performance](/docs/llm-analytics/dashboard.md) | Learn how to create dashboards to analyze LLM performance. |
|
|
193
|
+
|
|
194
|
+
### Community questions
|
|
195
|
+
|
|
196
|
+
Ask a question
|
|
197
|
+
|
|
198
|
+
### Was this page useful?
|
|
199
|
+
|
|
200
|
+
HelpfulCould be better
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# LLM Analytics basics - Docs
|
|
2
|
+
|
|
3
|
+
This page covers how your LLM calls become analytics in PostHog and defines key concepts for LLM Analytics.
|
|
4
|
+
|
|
5
|
+
## How LLM calls become events
|
|
6
|
+
|
|
7
|
+
PostHog's LLM Analytics works by wrapping your existing LLM provider's SDK to capture requests and responses. Your API calls still go directly to your provider, but the wrapper extracts metadata from each call and sends it to PostHog as an event.
|
|
8
|
+
|
|
9
|
+
graph LR Call\["LLM call"\] --> Wrapper\["Wrapped SDK"\] Wrapper --> Provider\["LLM provider API"\] Wrapper --> Event\["Event"\] Event --> PostHog\["PostHog"\]
|
|
10
|
+
|
|
11
|
+
Events sent to PostHog are called **generations**. A generation represents a single LLM call. For example, when you send a prompt to Claude and get a response back, that's one generation.
|
|
12
|
+
|
|
13
|
+
Generations are represented using the event name `$ai_generation`. Each generation captures the model, provider, input, output, token counts, latency, and cost.
|
|
14
|
+
|
|
15
|
+
## Generation properties
|
|
16
|
+
|
|
17
|
+
### Tokens and costs
|
|
18
|
+
|
|
19
|
+
**Tokens** are the units LLMs use to process text. LLM providers charge based on token usage:
|
|
20
|
+
|
|
21
|
+
- **Input tokens** are tokens used in the message you send to an LLM
|
|
22
|
+
- **Output tokens** are tokens used in the message you receive from an LLM
|
|
23
|
+
|
|
24
|
+
PostHog automatically calculates costs by matching your model and provider against pricing data. We use OpenRouter's pricing as our primary source, with fallback to manually maintained pricing for additional models.
|
|
25
|
+
|
|
26
|
+
You can also [set custom pricing](/docs/llm-analytics/calculating-costs.md) if you have negotiated rates or use unsupported models.
|
|
27
|
+
|
|
28
|
+
### Message roles
|
|
29
|
+
|
|
30
|
+
When you send messages to an LLM, each message has a **role** that tells the model how to interpret it:
|
|
31
|
+
|
|
32
|
+
| Role | Purpose | Example |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| system | Instructions that define the assistant's behavior | "You are a helpful assistant that speaks like a pirate" |
|
|
35
|
+
| user | Messages from the end user | "What's the weather today?" |
|
|
36
|
+
| assistant | Previous model responses, used for conversation history | "Arrr, it be sunny with a chance of scurvy!" |
|
|
37
|
+
|
|
38
|
+
PostHog captures the full message array with roles intact, so you can see exactly what context the model had when it generated a response.
|
|
39
|
+
|
|
40
|
+
## Grouping related events
|
|
41
|
+
|
|
42
|
+
Most LLM applications involve multiple calls. Traces, spans, and sessions let you see how they connect:
|
|
43
|
+
|
|
44
|
+
graph TD Session\["Session"\] Trace\["Trace"\] Generation1\["Generation"\] Span\["Span"\] Generation2\["Generation"\] Session -.-> Trace Trace --> Generation1 Trace --> Span Span --> Generation2
|
|
45
|
+
|
|
46
|
+
Here's a breakdown of this hierarchy:
|
|
47
|
+
|
|
48
|
+
| Term | Definition | Example |
|
|
49
|
+
| --- | --- | --- |
|
|
50
|
+
| [Session](/docs/llm-analytics/sessions.md) | Groups multiple traces together | A user's conversation thread |
|
|
51
|
+
| [Trace](/docs/llm-analytics/traces.md) | Contains generations and spans for a single request | One chatbot message and response |
|
|
52
|
+
| [Span](/docs/llm-analytics/spans.md) | Tracks an operation within a trace | A retrieval step or function call |
|
|
53
|
+
| [Generation](/docs/llm-analytics/generations.md) | An LLM call, tracked as $ai_generation events | Sending a prompt to Claude |
|
|
54
|
+
| [Embedding](/docs/llm-analytics/embeddings.md) | Converts text into vectors | Vectorizing documents for RAG |
|
|
55
|
+
|
|
56
|
+
### Community questions
|
|
57
|
+
|
|
58
|
+
Ask a question
|
|
59
|
+
|
|
60
|
+
### Was this page useful?
|
|
61
|
+
|
|
62
|
+
HelpfulCould be better
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# Calculating LLM costs - Docs
|
|
2
|
+
|
|
3
|
+
## How are LLM costs calculated?
|
|
4
|
+
|
|
5
|
+
PostHog calculates cost based on the number of input (prompt) and output (completion) tokens generated by specific AI models, plus additional cost components like per-request and per-web-search pricing when applicable.
|
|
6
|
+
|
|
7
|
+
### Model matching
|
|
8
|
+
|
|
9
|
+
We use OpenRouter's pricing data as our primary source to match your model and calculate costs. OpenRouter provides comprehensive pricing information for models across different providers, and we use both the `$ai_provider` and `$ai_model` properties from your events to find the exact pricing.
|
|
10
|
+
|
|
11
|
+
If OpenRouter doesn't have pricing data for a specific model, we fall back to our manually maintained pricing database for additional model support.
|
|
12
|
+
|
|
13
|
+
### Cost components
|
|
14
|
+
|
|
15
|
+
The total cost (`$ai_total_cost_usd`) is calculated from multiple components:
|
|
16
|
+
|
|
17
|
+
- **Token-based costs**: Input (prompt) and output (completion) tokens
|
|
18
|
+
- **Cache costs**: Cached token reads and writes (when applicable)
|
|
19
|
+
- **Request-based costs**: Some models charge per request in addition to token costs
|
|
20
|
+
- **Web search costs**: Some models charge per web search performed
|
|
21
|
+
|
|
22
|
+
For cached LLM responses, our pricing models include cached token pricing which we automatically apply.
|
|
23
|
+
|
|
24
|
+
We also take into account the reasoning / thinking tokens for models that support it.
|
|
25
|
+
|
|
26
|
+
### Cache token accounting
|
|
27
|
+
|
|
28
|
+
Different LLM providers report cache tokens differently:
|
|
29
|
+
|
|
30
|
+
- **Exclusive counting** (Anthropic/Claude) - Cache tokens are separate from `$ai_input_tokens`. For example, if you have 100 input tokens and 50 cached tokens, `$ai_input_tokens` is 100.
|
|
31
|
+
- **Inclusive counting** (OpenAI and most others) - Cache tokens are included in `$ai_input_tokens`. Using the same example, `$ai_input_tokens` is 150.
|
|
32
|
+
|
|
33
|
+
PostHog auto-detects which counting style to use based on the `$ai_provider` and `$ai_model` properties. For Anthropic and Claude models, PostHog assumes exclusive counting. For all other providers, it assumes inclusive counting.
|
|
34
|
+
|
|
35
|
+
#### Overriding auto-detection
|
|
36
|
+
|
|
37
|
+
If you're manually capturing events or using a framework wrapper that normalizes token counts differently, override the auto-detection by setting the `$ai_cache_reporting_exclusive` property:
|
|
38
|
+
|
|
39
|
+
- `$ai_cache_reporting_exclusive: true` - Cache tokens are separate from input tokens (Anthropic-style)
|
|
40
|
+
- `$ai_cache_reporting_exclusive: false` - Input tokens already include cache tokens
|
|
41
|
+
|
|
42
|
+
When not set, PostHog resolves this automatically and writes the resolved value back to the event for downstream consumers.
|
|
43
|
+
|
|
44
|
+
## Setting custom pricing
|
|
45
|
+
|
|
46
|
+
You can override PostHog's automatic cost calculation by providing custom pricing for your LLM models. This is useful when:
|
|
47
|
+
|
|
48
|
+
- You have negotiated custom pricing with your LLM provider
|
|
49
|
+
- You're using a model that PostHog doesn't support yet
|
|
50
|
+
- PostHog's automatic pricing doesn't match your specific use case
|
|
51
|
+
|
|
52
|
+
### Option 1: Custom price per token
|
|
53
|
+
|
|
54
|
+
If you know your pricing per token, you can set the following [custom properties](/docs/llm-analytics/custom-properties.md) when calling your LLM:
|
|
55
|
+
|
|
56
|
+
- `$ai_input_token_price` (required): Price per input/prompt token
|
|
57
|
+
- `$ai_output_token_price` (required): Price per output/completion token
|
|
58
|
+
- `$ai_cache_read_token_price` (optional): Price per cached token read
|
|
59
|
+
- `$ai_cache_write_token_price` (optional): Price per cached token write
|
|
60
|
+
- `$ai_request_price` (optional): Price per request (for models that charge per request)
|
|
61
|
+
- `$ai_web_search_price` (optional): Price per web search (for models that charge per search)
|
|
62
|
+
|
|
63
|
+
**Important:** Token prices should be per individual token, not per million tokens. For example, if your provider charges $0.03 per 1M tokens, you would set `$ai_input_token_price: 0.00000003` (0.03 / 1,000,000).
|
|
64
|
+
|
|
65
|
+
PostHog AI
|
|
66
|
+
|
|
67
|
+
### JavaScript
|
|
68
|
+
|
|
69
|
+
```javascript
|
|
70
|
+
import { OpenAI } from '@posthog/ai'
|
|
71
|
+
import { PostHog } from 'posthog-node'
|
|
72
|
+
const phClient = new PostHog(
|
|
73
|
+
'<ph_project_token>',
|
|
74
|
+
{ host: 'https://us.i.posthog.com' }
|
|
75
|
+
)
|
|
76
|
+
const openai = new OpenAI({
|
|
77
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
78
|
+
posthog: phClient
|
|
79
|
+
})
|
|
80
|
+
const response = await openai.responses.create({
|
|
81
|
+
model: 'my-custom-model',
|
|
82
|
+
messages: [{ role: 'user', content: 'Hello' }],
|
|
83
|
+
posthogProperties: {
|
|
84
|
+
$ai_input_token_price: 0.00000003, // $0.03 per 1M tokens = $0.00000003 per token
|
|
85
|
+
$ai_output_token_price: 0.00000006, // $0.06 per 1M tokens = $0.00000006 per token
|
|
86
|
+
// Optional: cache pricing
|
|
87
|
+
$ai_cache_read_token_price: 0.000000015,
|
|
88
|
+
$ai_cache_write_token_price: 0.0000000375
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Python
|
|
94
|
+
|
|
95
|
+
```python
|
|
96
|
+
from posthog.ai.openai import OpenAI
|
|
97
|
+
from posthog import Posthog
|
|
98
|
+
posthog = Posthog(
|
|
99
|
+
"<ph_project_token>",
|
|
100
|
+
host="https://us.i.posthog.com"
|
|
101
|
+
)
|
|
102
|
+
client = OpenAI(
|
|
103
|
+
api_key="sk-...",
|
|
104
|
+
posthog_client=posthog
|
|
105
|
+
)
|
|
106
|
+
response = client.responses.create(
|
|
107
|
+
model="my-custom-model",
|
|
108
|
+
messages=[{"role": "user", "content": "Hello"}],
|
|
109
|
+
posthog_properties={
|
|
110
|
+
"$ai_input_token_price": 0.00000003, # $0.03 per 1M tokens = $0.00000003 per token
|
|
111
|
+
"$ai_output_token_price": 0.00000006, # $0.06 per 1M tokens = $0.00000006 per token
|
|
112
|
+
# Optional: cache pricing
|
|
113
|
+
"$ai_cache_read_token_price": 0.000000015,
|
|
114
|
+
"$ai_cache_write_token_price": 0.0000000375
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Both `$ai_input_token_price` and `$ai_output_token_price` must be provided for custom pricing to take effect. PostHog will then calculate the total cost based on the token counts and your custom prices.
|
|
120
|
+
|
|
121
|
+
### Option 2: Pre-calculated costs
|
|
122
|
+
|
|
123
|
+
If you're [manually capturing](/docs/llm-analytics/installation/manual-capture.md) LLM events and have already calculated the total costs yourself, you can send them directly:
|
|
124
|
+
|
|
125
|
+
- `$ai_input_cost_usd`: Total cost for input/prompt tokens in USD
|
|
126
|
+
- `$ai_output_cost_usd`: Total cost for output/completion tokens in USD
|
|
127
|
+
- `$ai_request_cost_usd`: Total cost for requests in USD
|
|
128
|
+
- `$ai_web_search_cost_usd`: Total cost for web searches in USD
|
|
129
|
+
|
|
130
|
+
PostHog AI
|
|
131
|
+
|
|
132
|
+
### JavaScript
|
|
133
|
+
|
|
134
|
+
```javascript
|
|
135
|
+
// After making your LLM call and calculating costs
|
|
136
|
+
posthog.capture('$ai_generation', {
|
|
137
|
+
$ai_trace_id: traceId,
|
|
138
|
+
$ai_model: 'my-custom-model',
|
|
139
|
+
$ai_provider: 'my-provider',
|
|
140
|
+
$ai_input_tokens: inputTokens,
|
|
141
|
+
$ai_output_tokens: outputTokens,
|
|
142
|
+
$ai_input_cost_usd: 0.0042,
|
|
143
|
+
$ai_output_cost_usd: 0.0028
|
|
144
|
+
// ... other required properties
|
|
145
|
+
})
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Python
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
# After making your LLM call and calculating costs
|
|
152
|
+
posthog.capture(
|
|
153
|
+
event='$ai_generation',
|
|
154
|
+
properties={
|
|
155
|
+
'$ai_trace_id': trace_id,
|
|
156
|
+
'$ai_model': 'my-custom-model',
|
|
157
|
+
'$ai_provider': 'my-provider',
|
|
158
|
+
'$ai_input_tokens': input_tokens,
|
|
159
|
+
'$ai_output_tokens': output_tokens,
|
|
160
|
+
'$ai_input_cost_usd': 0.0042,
|
|
161
|
+
'$ai_output_cost_usd': 0.0028
|
|
162
|
+
# ... other required properties
|
|
163
|
+
}
|
|
164
|
+
)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
PostHog will use these values directly without any additional calculation.
|
|
168
|
+
|
|
169
|
+
### Precedence
|
|
170
|
+
|
|
171
|
+
Cost calculation follows this precedence order:
|
|
172
|
+
|
|
173
|
+
1. **Pre-calculated costs** (`$ai_input_cost_usd`, `$ai_output_cost_usd`, `$ai_request_cost_usd`, `$ai_web_search_cost_usd`): These values are used directly without any additional calculation
|
|
174
|
+
2. **Custom pricing** (`$ai_input_token_price`, `$ai_output_token_price`, `$ai_request_price`, `$ai_web_search_price`): PostHog calculates costs from token counts and usage metrics using your custom prices
|
|
175
|
+
3. **Automatic model matching**: PostHog matches your model using OpenRouter's pricing data first, then falls back to manually maintained pricing if needed
|
|
176
|
+
|
|
177
|
+
## Cost calculation metadata
|
|
178
|
+
|
|
179
|
+
When PostHog calculates costs automatically, it sets the following metadata properties on the event to help you understand how costs were determined:
|
|
180
|
+
|
|
181
|
+
| Property | Description | Examples |
|
|
182
|
+
| --- | --- | --- |
|
|
183
|
+
| $ai_model_cost_used | The model identifier used for cost calculation. May differ from the requested model when a variant or alias is resolved. | openai/gpt-4o-mini |
|
|
184
|
+
| $ai_cost_model_source | Where the cost data for this model was sourced from. | openrouter, manual, custom, passthrough |
|
|
185
|
+
| $ai_cost_model_provider | The provider used to look up the cost for this model. | openai, anthropic, custom |
|
|
186
|
+
|
|
187
|
+
These properties are useful for debugging cost discrepancies or understanding which pricing was applied when using model aliases or custom configurations.
|
|
188
|
+
|
|
189
|
+
You can find the code for this on [GitHub](https://github.com/PostHog/posthog/tree/master/plugin-server/src/ingestion/ai-costs).
|
|
190
|
+
|
|
191
|
+
### Community questions
|
|
192
|
+
|
|
193
|
+
Ask a question
|
|
194
|
+
|
|
195
|
+
### Was this page useful?
|
|
196
|
+
|
|
197
|
+
HelpfulCould be better
|