@guidify-ai/vapi-studio 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/LICENSE +21 -0
- package/README.md +129 -0
- package/agent/AGENTS.md +42 -0
- package/agent/CLAUDE.md +15 -0
- package/agent/claude/rules/ui-and-api-identity.md +9 -0
- package/agent/claude/rules/vapi-studio-best-practices.md +36 -0
- package/agent/cursor/ui-and-api-identity.mdc +16 -0
- package/agent/cursor/vapi-studio-best-practices.mdc +43 -0
- package/dist/adapters/vapi/vapi-sse.compiler.d.ts +61 -0
- package/dist/adapters/vapi/vapi-sse.compiler.d.ts.map +1 -0
- package/dist/adapters/vapi/vapi-sse.compiler.js +396 -0
- package/dist/adapters/vapi/vapi-sse.compiler.js.map +1 -0
- package/dist/analytics/analytics-tags.d.ts +60 -0
- package/dist/analytics/analytics-tags.d.ts.map +1 -0
- package/dist/analytics/analytics-tags.js +27 -0
- package/dist/analytics/analytics-tags.js.map +1 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.d.ts +27 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.js +94 -0
- package/dist/brain/adapters/chatgpt-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/claude-brain.adapter.d.ts +24 -0
- package/dist/brain/adapters/claude-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/claude-brain.adapter.js +96 -0
- package/dist/brain/adapters/claude-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/gemini-brain.adapter.d.ts +24 -0
- package/dist/brain/adapters/gemini-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/gemini-brain.adapter.js +106 -0
- package/dist/brain/adapters/gemini-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/grok-brain.adapter.d.ts +24 -0
- package/dist/brain/adapters/grok-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/grok-brain.adapter.js +90 -0
- package/dist/brain/adapters/grok-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/json-llm-brain.base.d.ts +63 -0
- package/dist/brain/adapters/json-llm-brain.base.d.ts.map +1 -0
- package/dist/brain/adapters/json-llm-brain.base.js +511 -0
- package/dist/brain/adapters/json-llm-brain.base.js.map +1 -0
- package/dist/brain/adapters/mock-brain.adapter.d.ts +32 -0
- package/dist/brain/adapters/mock-brain.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/mock-brain.adapter.js +201 -0
- package/dist/brain/adapters/mock-brain.adapter.js.map +1 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.d.ts +22 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.d.ts.map +1 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.js +48 -0
- package/dist/brain/adapters/mock-provider-brains.adapter.js.map +1 -0
- package/dist/brain/brain-clarify.d.ts +75 -0
- package/dist/brain/brain-clarify.d.ts.map +1 -0
- package/dist/brain/brain-clarify.js +146 -0
- package/dist/brain/brain-clarify.js.map +1 -0
- package/dist/brain/brain-config.d.ts +20 -0
- package/dist/brain/brain-config.d.ts.map +1 -0
- package/dist/brain/brain-config.js +20 -0
- package/dist/brain/brain-config.js.map +1 -0
- package/dist/brain/brain-judge.d.ts +68 -0
- package/dist/brain/brain-judge.d.ts.map +1 -0
- package/dist/brain/brain-judge.js +111 -0
- package/dist/brain/brain-judge.js.map +1 -0
- package/dist/brain/brain-ranking.d.ts +41 -0
- package/dist/brain/brain-ranking.d.ts.map +1 -0
- package/dist/brain/brain-ranking.js +103 -0
- package/dist/brain/brain-ranking.js.map +1 -0
- package/dist/brain/brain-usage.tracker.d.ts +48 -0
- package/dist/brain/brain-usage.tracker.d.ts.map +1 -0
- package/dist/brain/brain-usage.tracker.js +106 -0
- package/dist/brain/brain-usage.tracker.js.map +1 -0
- package/dist/brain/brain.port.d.ts +63 -0
- package/dist/brain/brain.port.d.ts.map +1 -0
- package/dist/brain/brain.port.js +7 -0
- package/dist/brain/brain.port.js.map +1 -0
- package/dist/brain/brain.service.d.ts +14 -0
- package/dist/brain/brain.service.d.ts.map +1 -0
- package/dist/brain/brain.service.js +27 -0
- package/dist/brain/brain.service.js.map +1 -0
- package/dist/brain/claude-cheap-models.d.ts +18 -0
- package/dist/brain/claude-cheap-models.d.ts.map +1 -0
- package/dist/brain/claude-cheap-models.js +53 -0
- package/dist/brain/claude-cheap-models.js.map +1 -0
- package/dist/brain/gemini-cheap-models.d.ts +18 -0
- package/dist/brain/gemini-cheap-models.d.ts.map +1 -0
- package/dist/brain/gemini-cheap-models.js +53 -0
- package/dist/brain/gemini-cheap-models.js.map +1 -0
- package/dist/brain/grok-cheap-models.d.ts +18 -0
- package/dist/brain/grok-cheap-models.d.ts.map +1 -0
- package/dist/brain/grok-cheap-models.js +53 -0
- package/dist/brain/grok-cheap-models.js.map +1 -0
- package/dist/brain/llm-model-pricing.d.ts +29 -0
- package/dist/brain/llm-model-pricing.d.ts.map +1 -0
- package/dist/brain/llm-model-pricing.js +38 -0
- package/dist/brain/llm-model-pricing.js.map +1 -0
- package/dist/brain/openai-cheap-models.d.ts +34 -0
- package/dist/brain/openai-cheap-models.d.ts.map +1 -0
- package/dist/brain/openai-cheap-models.js +72 -0
- package/dist/brain/openai-cheap-models.js.map +1 -0
- package/dist/brain/prompt-injection-guard.d.ts +34 -0
- package/dist/brain/prompt-injection-guard.d.ts.map +1 -0
- package/dist/brain/prompt-injection-guard.js +109 -0
- package/dist/brain/prompt-injection-guard.js.map +1 -0
- package/dist/channel/channel-tools.d.ts +72 -0
- package/dist/channel/channel-tools.d.ts.map +1 -0
- package/dist/channel/channel-tools.js +131 -0
- package/dist/channel/channel-tools.js.map +1 -0
- package/dist/conversation/call-turn-queue.d.ts +64 -0
- package/dist/conversation/call-turn-queue.d.ts.map +1 -0
- package/dist/conversation/call-turn-queue.js +156 -0
- package/dist/conversation/call-turn-queue.js.map +1 -0
- package/dist/conversation/conversation-bootstrap.service.d.ts +60 -0
- package/dist/conversation/conversation-bootstrap.service.d.ts.map +1 -0
- package/dist/conversation/conversation-bootstrap.service.js +383 -0
- package/dist/conversation/conversation-bootstrap.service.js.map +1 -0
- package/dist/conversation/conversation-entry.d.ts +38 -0
- package/dist/conversation/conversation-entry.d.ts.map +1 -0
- package/dist/conversation/conversation-entry.js +17 -0
- package/dist/conversation/conversation-entry.js.map +1 -0
- package/dist/conversation/conversation-history.d.ts +31 -0
- package/dist/conversation/conversation-history.d.ts.map +1 -0
- package/dist/conversation/conversation-history.js +53 -0
- package/dist/conversation/conversation-history.js.map +1 -0
- package/dist/conversation/conversation-limits.d.ts +49 -0
- package/dist/conversation/conversation-limits.d.ts.map +1 -0
- package/dist/conversation/conversation-limits.js +44 -0
- package/dist/conversation/conversation-limits.js.map +1 -0
- package/dist/conversation/conversation-resume.service.d.ts +39 -0
- package/dist/conversation/conversation-resume.service.d.ts.map +1 -0
- package/dist/conversation/conversation-resume.service.js +234 -0
- package/dist/conversation/conversation-resume.service.js.map +1 -0
- package/dist/conversation/conversation-schema.d.ts +23 -0
- package/dist/conversation/conversation-schema.d.ts.map +1 -0
- package/dist/conversation/conversation-schema.js +3 -0
- package/dist/conversation/conversation-schema.js.map +1 -0
- package/dist/conversation/listen-expectation.d.ts +145 -0
- package/dist/conversation/listen-expectation.d.ts.map +1 -0
- package/dist/conversation/listen-expectation.js +219 -0
- package/dist/conversation/listen-expectation.js.map +1 -0
- package/dist/conversation/listen-timeout.d.ts +42 -0
- package/dist/conversation/listen-timeout.d.ts.map +1 -0
- package/dist/conversation/listen-timeout.js +57 -0
- package/dist/conversation/listen-timeout.js.map +1 -0
- package/dist/conversation/supervised-conversation.d.ts +64 -0
- package/dist/conversation/supervised-conversation.d.ts.map +1 -0
- package/dist/conversation/supervised-conversation.js +198 -0
- package/dist/conversation/supervised-conversation.js.map +1 -0
- package/dist/conversation/supervised-conversation.registry.d.ts +14 -0
- package/dist/conversation/supervised-conversation.registry.d.ts.map +1 -0
- package/dist/conversation/supervised-conversation.registry.js +47 -0
- package/dist/conversation/supervised-conversation.registry.js.map +1 -0
- package/dist/conversation/types.d.ts +52 -0
- package/dist/conversation/types.d.ts.map +1 -0
- package/dist/conversation/types.js +3 -0
- package/dist/conversation/types.js.map +1 -0
- package/dist/events/conversation-console.d.ts +17 -0
- package/dist/events/conversation-console.d.ts.map +1 -0
- package/dist/events/conversation-console.js +863 -0
- package/dist/events/conversation-console.js.map +1 -0
- package/dist/events/daily-log.driver.d.ts +35 -0
- package/dist/events/daily-log.driver.d.ts.map +1 -0
- package/dist/events/daily-log.driver.js +206 -0
- package/dist/events/daily-log.driver.js.map +1 -0
- package/dist/events/event.service.d.ts +24 -0
- package/dist/events/event.service.d.ts.map +1 -0
- package/dist/events/event.service.js +141 -0
- package/dist/events/event.service.js.map +1 -0
- package/dist/events/route-forensics.d.ts +38 -0
- package/dist/events/route-forensics.d.ts.map +1 -0
- package/dist/events/route-forensics.js +85 -0
- package/dist/events/route-forensics.js.map +1 -0
- package/dist/events/studio-event-bus.d.ts +17 -0
- package/dist/events/studio-event-bus.d.ts.map +1 -0
- package/dist/events/studio-event-bus.js +37 -0
- package/dist/events/studio-event-bus.js.map +1 -0
- package/dist/events/studio-event.d.ts +44 -0
- package/dist/events/studio-event.d.ts.map +1 -0
- package/dist/events/studio-event.js +27 -0
- package/dist/events/studio-event.js.map +1 -0
- package/dist/flow/condition.d.ts +35 -0
- package/dist/flow/condition.d.ts.map +1 -0
- package/dist/flow/condition.js +246 -0
- package/dist/flow/condition.js.map +1 -0
- package/dist/flow/flow-loader.d.ts +71 -0
- package/dist/flow/flow-loader.d.ts.map +1 -0
- package/dist/flow/flow-loader.js +182 -0
- package/dist/flow/flow-loader.js.map +1 -0
- package/dist/forms/form-html.d.ts +30 -0
- package/dist/forms/form-html.d.ts.map +1 -0
- package/dist/forms/form-html.js +130 -0
- package/dist/forms/form-html.js.map +1 -0
- package/dist/forms/form.tokens.d.ts +3 -0
- package/dist/forms/form.tokens.d.ts.map +1 -0
- package/dist/forms/form.tokens.js +6 -0
- package/dist/forms/form.tokens.js.map +1 -0
- package/dist/forms/form.types.d.ts +81 -0
- package/dist/forms/form.types.d.ts.map +1 -0
- package/dist/forms/form.types.js +36 -0
- package/dist/forms/form.types.js.map +1 -0
- package/dist/forms/forms.service.d.ts +52 -0
- package/dist/forms/forms.service.d.ts.map +1 -0
- package/dist/forms/forms.service.js +434 -0
- package/dist/forms/forms.service.js.map +1 -0
- package/dist/forms/noop-form-dispose.adapter.d.ts +12 -0
- package/dist/forms/noop-form-dispose.adapter.d.ts.map +1 -0
- package/dist/forms/noop-form-dispose.adapter.js +27 -0
- package/dist/forms/noop-form-dispose.adapter.js.map +1 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.d.ts +33 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.d.ts.map +1 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.js +125 -0
- package/dist/forms/twilio-sms-form-dispose.adapter.js.map +1 -0
- package/dist/forms/twilio-sms.env.d.ts +62 -0
- package/dist/forms/twilio-sms.env.d.ts.map +1 -0
- package/dist/forms/twilio-sms.env.js +147 -0
- package/dist/forms/twilio-sms.env.js.map +1 -0
- package/dist/forms/twilio-sms.sender.d.ts +27 -0
- package/dist/forms/twilio-sms.sender.d.ts.map +1 -0
- package/dist/forms/twilio-sms.sender.js +75 -0
- package/dist/forms/twilio-sms.sender.js.map +1 -0
- package/dist/identity/email-parse.d.ts +20 -0
- package/dist/identity/email-parse.d.ts.map +1 -0
- package/dist/identity/email-parse.js +102 -0
- package/dist/identity/email-parse.js.map +1 -0
- package/dist/identity/index.d.ts +17 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +23 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/index.d.ts +108 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +300 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/integration-client.d.ts +41 -0
- package/dist/integrations/integration-client.d.ts.map +1 -0
- package/dist/integrations/integration-client.js +152 -0
- package/dist/integrations/integration-client.js.map +1 -0
- package/dist/integrations/jwt-hmac.d.ts +33 -0
- package/dist/integrations/jwt-hmac.d.ts.map +1 -0
- package/dist/integrations/jwt-hmac.js +108 -0
- package/dist/integrations/jwt-hmac.js.map +1 -0
- package/dist/intention/code-intention.d.ts +94 -0
- package/dist/intention/code-intention.d.ts.map +1 -0
- package/dist/intention/code-intention.js +89 -0
- package/dist/intention/code-intention.js.map +1 -0
- package/dist/intention/intention-constants.d.ts +37 -0
- package/dist/intention/intention-constants.d.ts.map +1 -0
- package/dist/intention/intention-constants.js +37 -0
- package/dist/intention/intention-constants.js.map +1 -0
- package/dist/intentions/standard-intentions.d.ts +26 -0
- package/dist/intentions/standard-intentions.d.ts.map +1 -0
- package/dist/intentions/standard-intentions.js +28 -0
- package/dist/intentions/standard-intentions.js.map +1 -0
- package/dist/node/agent-node.d.ts +156 -0
- package/dist/node/agent-node.d.ts.map +1 -0
- package/dist/node/agent-node.js +179 -0
- package/dist/node/agent-node.js.map +1 -0
- package/dist/node/catch-directive.d.ts +33 -0
- package/dist/node/catch-directive.d.ts.map +1 -0
- package/dist/node/catch-directive.js +41 -0
- package/dist/node/catch-directive.js.map +1 -0
- package/dist/output/conversation-output.d.ts +113 -0
- package/dist/output/conversation-output.d.ts.map +1 -0
- package/dist/output/conversation-output.js +100 -0
- package/dist/output/conversation-output.js.map +1 -0
- package/dist/persistence/conversation.entity.d.ts +27 -0
- package/dist/persistence/conversation.entity.d.ts.map +1 -0
- package/dist/persistence/conversation.entity.js +115 -0
- package/dist/persistence/conversation.entity.js.map +1 -0
- package/dist/persistence/conversation.repository.d.ts +82 -0
- package/dist/persistence/conversation.repository.d.ts.map +1 -0
- package/dist/persistence/conversation.repository.js +277 -0
- package/dist/persistence/conversation.repository.js.map +1 -0
- package/dist/persistence/project.entity.d.ts +12 -0
- package/dist/persistence/project.entity.d.ts.map +1 -0
- package/dist/persistence/project.entity.js +46 -0
- package/dist/persistence/project.entity.js.map +1 -0
- package/dist/persistence/project.repository.d.ts +17 -0
- package/dist/persistence/project.repository.d.ts.map +1 -0
- package/dist/persistence/project.repository.js +69 -0
- package/dist/persistence/project.repository.js.map +1 -0
- package/dist/persistence/provider-ingress.entity.d.ts +18 -0
- package/dist/persistence/provider-ingress.entity.d.ts.map +1 -0
- package/dist/persistence/provider-ingress.entity.js +91 -0
- package/dist/persistence/provider-ingress.entity.js.map +1 -0
- package/dist/persistence/provider-ingress.repository.d.ts +21 -0
- package/dist/persistence/provider-ingress.repository.d.ts.map +1 -0
- package/dist/persistence/provider-ingress.repository.js +76 -0
- package/dist/persistence/provider-ingress.repository.js.map +1 -0
- package/dist/studio-ui/assets/index-BGd2OhLv.js +84 -0
- package/dist/studio-ui/assets/index-BGd2OhLv.js.map +1 -0
- package/dist/studio-ui/assets/index-DnJos5x2.css +1 -0
- package/dist/studio-ui/index.html +13 -0
- package/dist/studio-ui-mount/index.d.ts +6 -0
- package/dist/studio-ui-mount/index.d.ts.map +1 -0
- package/dist/studio-ui-mount/index.js +13 -0
- package/dist/studio-ui-mount/index.js.map +1 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.d.ts +6 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.d.ts.map +1 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.js +25 -0
- package/dist/studio-ui-mount/resolve-studio-ui-root.js.map +1 -0
- package/dist/studio-ui-mount/studio-spa.controller.d.ts +18 -0
- package/dist/studio-ui-mount/studio-spa.controller.d.ts.map +1 -0
- package/dist/studio-ui-mount/studio-spa.controller.js +57 -0
- package/dist/studio-ui-mount/studio-spa.controller.js.map +1 -0
- package/dist/studio-ui-mount/studio-ui.module.d.ts +15 -0
- package/dist/studio-ui-mount/studio-ui.module.d.ts.map +1 -0
- package/dist/studio-ui-mount/studio-ui.module.js +47 -0
- package/dist/studio-ui-mount/studio-ui.module.js.map +1 -0
- package/dist/studio-ui-mount/studio-ui.tokens.d.ts +2 -0
- package/dist/studio-ui-mount/studio-ui.tokens.d.ts.map +1 -0
- package/dist/studio-ui-mount/studio-ui.tokens.js +5 -0
- package/dist/studio-ui-mount/studio-ui.tokens.js.map +1 -0
- package/dist/supervisor/supervisor-cascade.d.ts +55 -0
- package/dist/supervisor/supervisor-cascade.d.ts.map +1 -0
- package/dist/supervisor/supervisor-cascade.js +261 -0
- package/dist/supervisor/supervisor-cascade.js.map +1 -0
- package/dist/supervisor/supervisor-engine.d.ts +9 -0
- package/dist/supervisor/supervisor-engine.d.ts.map +1 -0
- package/dist/supervisor/supervisor-engine.js +64 -0
- package/dist/supervisor/supervisor-engine.js.map +1 -0
- package/dist/supervisor/supervisor-limits.d.ts +8 -0
- package/dist/supervisor/supervisor-limits.d.ts.map +1 -0
- package/dist/supervisor/supervisor-limits.js +36 -0
- package/dist/supervisor/supervisor-limits.js.map +1 -0
- package/dist/supervisor/supervisor-node-exec.d.ts +39 -0
- package/dist/supervisor/supervisor-node-exec.d.ts.map +1 -0
- package/dist/supervisor/supervisor-node-exec.js +201 -0
- package/dist/supervisor/supervisor-node-exec.js.map +1 -0
- package/dist/supervisor/supervisor-orchestration.d.ts +24 -0
- package/dist/supervisor/supervisor-orchestration.d.ts.map +1 -0
- package/dist/supervisor/supervisor-orchestration.js +395 -0
- package/dist/supervisor/supervisor-orchestration.js.map +1 -0
- package/dist/supervisor/supervisor-portal.d.ts +75 -0
- package/dist/supervisor/supervisor-portal.d.ts.map +1 -0
- package/dist/supervisor/supervisor-portal.js +320 -0
- package/dist/supervisor/supervisor-portal.js.map +1 -0
- package/dist/supervisor/supervisor-route.d.ts +53 -0
- package/dist/supervisor/supervisor-route.d.ts.map +1 -0
- package/dist/supervisor/supervisor-route.js +308 -0
- package/dist/supervisor/supervisor-route.js.map +1 -0
- package/dist/supervisor/supervisor-special-turns.d.ts +34 -0
- package/dist/supervisor/supervisor-special-turns.d.ts.map +1 -0
- package/dist/supervisor/supervisor-special-turns.js +308 -0
- package/dist/supervisor/supervisor-special-turns.js.map +1 -0
- package/dist/supervisor/supervisor.d.ts +44 -0
- package/dist/supervisor/supervisor.d.ts.map +1 -0
- package/dist/supervisor/supervisor.js +79 -0
- package/dist/supervisor/supervisor.js.map +1 -0
- package/dist/supervisor/supervisor.types.d.ts +71 -0
- package/dist/supervisor/supervisor.types.d.ts.map +1 -0
- package/dist/supervisor/supervisor.types.js +8 -0
- package/dist/supervisor/supervisor.types.js.map +1 -0
- package/dist/tasks/studio-task-queue.d.ts +93 -0
- package/dist/tasks/studio-task-queue.d.ts.map +1 -0
- package/dist/tasks/studio-task-queue.js +226 -0
- package/dist/tasks/studio-task-queue.js.map +1 -0
- package/dist/util/studio-env.d.ts +7 -0
- package/dist/util/studio-env.d.ts.map +1 -0
- package/dist/util/studio-env.js +32 -0
- package/dist/util/studio-env.js.map +1 -0
- package/dist/vapi-studio.module.d.ts +55 -0
- package/dist/vapi-studio.module.d.ts.map +1 -0
- package/dist/vapi-studio.module.js +166 -0
- package/dist/vapi-studio.module.js.map +1 -0
- package/dist/workflow/workflow-handoff.service.d.ts +29 -0
- package/dist/workflow/workflow-handoff.service.d.ts.map +1 -0
- package/dist/workflow/workflow-handoff.service.js +165 -0
- package/dist/workflow/workflow-handoff.service.js.map +1 -0
- package/dist/workflow/workflow-loader.d.ts +48 -0
- package/dist/workflow/workflow-loader.d.ts.map +1 -0
- package/dist/workflow/workflow-loader.js +87 -0
- package/dist/workflow/workflow-loader.js.map +1 -0
- package/docs/README.md +69 -0
- package/docs/assets/deterministic-assistant-flow.svg +128 -0
- package/docs/assets/vapi-studio-stack.svg +26 -0
- package/docs/best-practices/README.md +37 -0
- package/docs/best-practices/brain-and-prompt-injection.md +70 -0
- package/docs/best-practices/conversation-design.md +152 -0
- package/docs/best-practices/debugging-and-observability.md +49 -0
- package/docs/best-practices/documentation-layers.md +31 -0
- package/docs/best-practices/identity-and-pii.md +66 -0
- package/docs/best-practices/nodes-and-listens.md +116 -0
- package/docs/best-practices/ui-and-api-identity.md +51 -0
- package/docs/building-apps/creating-an-app.md +59 -0
- package/docs/building-apps/example-apps.md +23 -0
- package/docs/building-apps/overview.md +27 -0
- package/docs/getting-started/installation.md +52 -0
- package/docs/getting-started/introduction.md +23 -0
- package/docs/getting-started/quick-start.md +23 -0
- package/docs/guide/concepts.md +103 -0
- package/docs/guide/forms.md +102 -0
- package/docs/guide/handbook.md +21 -0
- package/docs/guide/introduction.md +56 -0
- package/docs/guide/module-setup.md +68 -0
- package/docs/guide/vapi-adapter.md +70 -0
- package/docs/guide/workflow-squad.md +59 -0
- package/docs/guides/agents.md +85 -0
- package/docs/guides/docker-compose.events.stub.yaml +27 -0
- package/docs/guides/documentation.md +13 -0
- package/docs/guides/extending-events.md +155 -0
- package/docs/guides/node-conventions.md +59 -0
- package/docs/guides/speckit.md +56 -0
- package/docs/reference/data-model.md +79 -0
- package/docs/reference/environment-variables.md +60 -0
- package/docs/reference/events-and-logging.md +137 -0
- package/docs/reference/flow-schema.md +79 -0
- package/docs/reference/runtime-api.md +708 -0
- package/docs/reference/security.md +41 -0
- package/docs/reference/standard-intentions.md +49 -0
- package/docs/reference/testing.md +15 -0
- package/docs/samples/events/nest-listener.example.ts +17 -0
- package/docs/samples/events/redis-bridge.example.ts +44 -0
- package/package.json +81 -0
- package/scripts/fix-access-modifiers.mjs +85 -0
- package/scripts/install-agent-refs.cjs +196 -0
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Brain judge — LLM-as-a-judge.
|
|
4
|
+
* Rare on the live call path; the primary consumer is eval tests.
|
|
5
|
+
*
|
|
6
|
+
* Given stringifiable context + a plain-language goal + success/failure
|
|
7
|
+
* criteria, adapters return pass/fail, reasoning bullets, and confidence.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.CONFIDENCE_6_PATTERN = exports.DEFAULT_BRAIN_JUDGE_CONFIDENCE_THRESHOLD = void 0;
|
|
11
|
+
exports.resolveJudgeConfidenceThreshold = resolveJudgeConfidenceThreshold;
|
|
12
|
+
exports.clampConfidence = clampConfidence;
|
|
13
|
+
exports.formatConfidence6 = formatConfidence6;
|
|
14
|
+
exports.isConfidence6 = isConfidence6;
|
|
15
|
+
exports.normalizeReasoning = normalizeReasoning;
|
|
16
|
+
exports.judgeContextToString = judgeContextToString;
|
|
17
|
+
exports.normalizeJudgeResult = normalizeJudgeResult;
|
|
18
|
+
const brain_ranking_1 = require("./brain-ranking");
|
|
19
|
+
/** Default: no confidence floor — callers opt in via options.confidenceThreshold. */
|
|
20
|
+
exports.DEFAULT_BRAIN_JUDGE_CONFIDENCE_THRESHOLD = 0;
|
|
21
|
+
/** Confidence as a fixed 6-decimal string, e.g. "0.850000". Always matches /^\d\.\d{6}$/. */
|
|
22
|
+
exports.CONFIDENCE_6_PATTERN = /^\d\.\d{6}$/;
|
|
23
|
+
function resolveJudgeConfidenceThreshold(value) {
|
|
24
|
+
if (typeof value !== 'number' || Number.isNaN(value)) {
|
|
25
|
+
return exports.DEFAULT_BRAIN_JUDGE_CONFIDENCE_THRESHOLD;
|
|
26
|
+
}
|
|
27
|
+
return Math.min(1, Math.max(0, value));
|
|
28
|
+
}
|
|
29
|
+
function clampConfidence(value) {
|
|
30
|
+
const n = typeof value === 'number' ? value : Number(value);
|
|
31
|
+
if (!Number.isFinite(n))
|
|
32
|
+
return 0;
|
|
33
|
+
return (0, brain_ranking_1.clamp01)(n);
|
|
34
|
+
}
|
|
35
|
+
/** Clamp to [0, 1] and format as `\d.\d\d\d\d\d\d`. */
|
|
36
|
+
function formatConfidence6(value) {
|
|
37
|
+
return clampConfidence(value).toFixed(brain_ranking_1.CONFIDENCE_DECIMALS);
|
|
38
|
+
}
|
|
39
|
+
function isConfidence6(value) {
|
|
40
|
+
return exports.CONFIDENCE_6_PATTERN.test(value);
|
|
41
|
+
}
|
|
42
|
+
function normalizeReasoning(raw) {
|
|
43
|
+
if (!Array.isArray(raw)) {
|
|
44
|
+
if (typeof raw === 'string' && raw.trim())
|
|
45
|
+
return [raw.trim()];
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return raw
|
|
49
|
+
.map((item) => (typeof item === 'string' ? item.trim() : ''))
|
|
50
|
+
.filter(Boolean);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* JSON-stringify objects; pass strings through.
|
|
54
|
+
* Prefer this over clarifiableInputToString so `{foo:1}` is not `[object Object]`.
|
|
55
|
+
*/
|
|
56
|
+
function judgeContextToString(context) {
|
|
57
|
+
if (context === null || context === undefined)
|
|
58
|
+
return '';
|
|
59
|
+
if (typeof context === 'string')
|
|
60
|
+
return context;
|
|
61
|
+
if (typeof context === 'number' ||
|
|
62
|
+
typeof context === 'boolean' ||
|
|
63
|
+
typeof context === 'bigint') {
|
|
64
|
+
return String(context);
|
|
65
|
+
}
|
|
66
|
+
if (context instanceof Date) {
|
|
67
|
+
return context.toISOString();
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
return JSON.stringify(context);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
try {
|
|
74
|
+
return String(context);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return '';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Normalize raw Brain JSON into a judge result.
|
|
83
|
+
* `passed` is the model judgment; threshold only sets `belowThreshold`.
|
|
84
|
+
*/
|
|
85
|
+
function normalizeJudgeResult(raw, options) {
|
|
86
|
+
const threshold = resolveJudgeConfidenceThreshold(options?.confidenceThreshold);
|
|
87
|
+
const obj = raw && typeof raw === 'object' && !Array.isArray(raw)
|
|
88
|
+
? raw
|
|
89
|
+
: {};
|
|
90
|
+
const passed = obj.passed === true ||
|
|
91
|
+
obj.verdict === true ||
|
|
92
|
+
(typeof obj.passed === 'string' &&
|
|
93
|
+
/^(true|pass|passed|yes)$/i.test(obj.passed));
|
|
94
|
+
const confidence = formatConfidence6(obj.confidence);
|
|
95
|
+
const reasoning = normalizeReasoning(obj.reasoning);
|
|
96
|
+
const belowThreshold = Number(confidence) < threshold;
|
|
97
|
+
if (!reasoning.length) {
|
|
98
|
+
reasoning.push(Object.keys(obj).length === 0
|
|
99
|
+
? 'invalid_judge_payload'
|
|
100
|
+
: passed
|
|
101
|
+
? 'passed'
|
|
102
|
+
: 'failed');
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
passed,
|
|
106
|
+
reasoning,
|
|
107
|
+
confidence,
|
|
108
|
+
belowThreshold,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=brain-judge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-judge.js","sourceRoot":"","sources":["../../src/brain/brain-judge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers for ranked intention JSON + unknown-transition fallback.
|
|
3
|
+
*/
|
|
4
|
+
import type { IntentionCandidate } from '../conversation/types';
|
|
5
|
+
export declare const DEFAULT_BRAIN_CONFIDENCE_THRESHOLD = 0.4;
|
|
6
|
+
export declare const CONFIDENCE_DECIMALS = 6;
|
|
7
|
+
export interface RankedIntentionScore {
|
|
8
|
+
name: string;
|
|
9
|
+
confidence: number;
|
|
10
|
+
reason?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BrainIntentionOption {
|
|
13
|
+
name: string;
|
|
14
|
+
boost?: number;
|
|
15
|
+
/** Supervisor walk order. Default 1. */
|
|
16
|
+
priority?: number;
|
|
17
|
+
source?: 'listen' | 'portal' | 'flow' | 'runtime';
|
|
18
|
+
}
|
|
19
|
+
export declare function resolveConfidenceThreshold(explicit?: number): number;
|
|
20
|
+
/** Clamp to [0, 1] then round to 6 decimal places. Never above 1. */
|
|
21
|
+
export declare function roundConfidence(n: number): number;
|
|
22
|
+
export declare function clamp01(n: number): number;
|
|
23
|
+
export declare function resolveIntentionPriority(value?: number): number;
|
|
24
|
+
/** True when every scored intention is below the confidence threshold. */
|
|
25
|
+
export declare function allBelowConfidenceThreshold(scores: RankedIntentionScore[], threshold: number): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Convert model scores into IntentionCandidates.
|
|
28
|
+
* Boost is recorded as a hint; it does not change Supervisor walk order.
|
|
29
|
+
*/
|
|
30
|
+
export declare function scoresToRankedCandidates(scores: RankedIntentionScore[], options: BrainIntentionOption[], meta?: Record<string, unknown>): IntentionCandidate[];
|
|
31
|
+
/**
|
|
32
|
+
* Supervisor walk order: higher priority first, then name A–Z.
|
|
33
|
+
*/
|
|
34
|
+
export declare function compareIntentionWalkOrder(a: Pick<IntentionCandidate, 'name' | 'priority'>, b: Pick<IntentionCandidate, 'name' | 'priority'>): number;
|
|
35
|
+
export declare function orderIntentionsForWalk(intentions: IntentionCandidate[]): IntentionCandidate[];
|
|
36
|
+
/**
|
|
37
|
+
* Drop scores below threshold, except always keep isUnknownTransition
|
|
38
|
+
* when it is the only remaining / fallback candidate.
|
|
39
|
+
*/
|
|
40
|
+
export declare function selectWalkableIntentions(intentions: IntentionCandidate[], threshold: number, unknownName: string): IntentionCandidate[];
|
|
41
|
+
//# sourceMappingURL=brain-ranking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-ranking.d.ts","sourceRoot":"","sources":["../../src/brain/brain-ranking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE,eAAO,MAAM,kCAAkC,MAAM,CAAC;AACtD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;CACnD;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAKpE;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAKzC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED,0EAA0E;AAC1E,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,oBAAoB,EAAE,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAKT;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,oBAAoB,EAAE,EAC9B,OAAO,EAAE,oBAAoB,EAAE,EAC/B,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,kBAAkB,EAAE,CAqBtB;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,UAAU,CAAC,EAChD,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,MAAM,GAAG,UAAU,CAAC,GAC/C,MAAM,CAKR;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,kBAAkB,EAAE,GAC/B,kBAAkB,EAAE,CAEtB;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,kBAAkB,EAAE,EAChC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,kBAAkB,EAAE,CActB"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pure helpers for ranked intention JSON + unknown-transition fallback.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CONFIDENCE_DECIMALS = exports.DEFAULT_BRAIN_CONFIDENCE_THRESHOLD = void 0;
|
|
7
|
+
exports.resolveConfidenceThreshold = resolveConfidenceThreshold;
|
|
8
|
+
exports.roundConfidence = roundConfidence;
|
|
9
|
+
exports.clamp01 = clamp01;
|
|
10
|
+
exports.resolveIntentionPriority = resolveIntentionPriority;
|
|
11
|
+
exports.allBelowConfidenceThreshold = allBelowConfidenceThreshold;
|
|
12
|
+
exports.scoresToRankedCandidates = scoresToRankedCandidates;
|
|
13
|
+
exports.compareIntentionWalkOrder = compareIntentionWalkOrder;
|
|
14
|
+
exports.orderIntentionsForWalk = orderIntentionsForWalk;
|
|
15
|
+
exports.selectWalkableIntentions = selectWalkableIntentions;
|
|
16
|
+
const conversation_history_1 = require("../conversation/conversation-history");
|
|
17
|
+
exports.DEFAULT_BRAIN_CONFIDENCE_THRESHOLD = 0.4;
|
|
18
|
+
exports.CONFIDENCE_DECIMALS = 6;
|
|
19
|
+
function resolveConfidenceThreshold(explicit) {
|
|
20
|
+
if (typeof explicit === 'number' && Number.isFinite(explicit)) {
|
|
21
|
+
return roundConfidence(clamp01(explicit));
|
|
22
|
+
}
|
|
23
|
+
return exports.DEFAULT_BRAIN_CONFIDENCE_THRESHOLD;
|
|
24
|
+
}
|
|
25
|
+
/** Clamp to [0, 1] then round to 6 decimal places. Never above 1. */
|
|
26
|
+
function roundConfidence(n) {
|
|
27
|
+
return Number(clamp01(n).toFixed(exports.CONFIDENCE_DECIMALS));
|
|
28
|
+
}
|
|
29
|
+
function clamp01(n) {
|
|
30
|
+
if (!Number.isFinite(n)) {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
return Math.min(1, Math.max(0, n));
|
|
34
|
+
}
|
|
35
|
+
function resolveIntentionPriority(value) {
|
|
36
|
+
if (typeof value !== 'number' || !Number.isFinite(value)) {
|
|
37
|
+
return conversation_history_1.DEFAULT_INTENTION_PRIORITY;
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
/** True when every scored intention is below the confidence threshold. */
|
|
42
|
+
function allBelowConfidenceThreshold(scores, threshold) {
|
|
43
|
+
if (!scores.length) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return scores.every((s) => roundConfidence(s.confidence ?? 0) < threshold);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Convert model scores into IntentionCandidates.
|
|
50
|
+
* Boost is recorded as a hint; it does not change Supervisor walk order.
|
|
51
|
+
*/
|
|
52
|
+
function scoresToRankedCandidates(scores, options, meta = {}) {
|
|
53
|
+
const byName = new Map(options.map((o) => [o.name, o]));
|
|
54
|
+
return scores.map((s) => {
|
|
55
|
+
const confidence = roundConfidence(s.confidence);
|
|
56
|
+
const option = byName.get(s.name);
|
|
57
|
+
const boost = option?.boost ?? 0;
|
|
58
|
+
const priority = resolveIntentionPriority(option?.priority);
|
|
59
|
+
return {
|
|
60
|
+
name: s.name,
|
|
61
|
+
confidence,
|
|
62
|
+
priority,
|
|
63
|
+
rank: Math.round((1 - confidence) * 1_000_000),
|
|
64
|
+
payload: {
|
|
65
|
+
...meta,
|
|
66
|
+
confidence,
|
|
67
|
+
reason: s.reason,
|
|
68
|
+
listenBoost: boost || undefined,
|
|
69
|
+
priority,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Supervisor walk order: higher priority first, then name A–Z.
|
|
76
|
+
*/
|
|
77
|
+
function compareIntentionWalkOrder(a, b) {
|
|
78
|
+
const pa = resolveIntentionPriority(a.priority);
|
|
79
|
+
const pb = resolveIntentionPriority(b.priority);
|
|
80
|
+
if (pb !== pa)
|
|
81
|
+
return pb - pa;
|
|
82
|
+
return a.name.localeCompare(b.name);
|
|
83
|
+
}
|
|
84
|
+
function orderIntentionsForWalk(intentions) {
|
|
85
|
+
return [...intentions].sort(compareIntentionWalkOrder);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Drop scores below threshold, except always keep isUnknownTransition
|
|
89
|
+
* when it is the only remaining / fallback candidate.
|
|
90
|
+
*/
|
|
91
|
+
function selectWalkableIntentions(intentions, threshold, unknownName) {
|
|
92
|
+
const eligible = intentions.filter((i) => i.name === unknownName ||
|
|
93
|
+
roundConfidence(i.confidence) >= threshold);
|
|
94
|
+
if (eligible.length) {
|
|
95
|
+
return orderIntentionsForWalk(eligible);
|
|
96
|
+
}
|
|
97
|
+
const unknown = intentions.find((i) => i.name === unknownName);
|
|
98
|
+
if (unknown) {
|
|
99
|
+
return [unknown];
|
|
100
|
+
}
|
|
101
|
+
return [];
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=brain-ranking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-ranking.js","sourceRoot":"","sources":["../../src/brain/brain-ranking.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export type BrainCallKind = 'scan' | 'clarify' | 'judge';
|
|
2
|
+
export interface BrainUsageRecord {
|
|
3
|
+
kind: BrainCallKind;
|
|
4
|
+
model: string;
|
|
5
|
+
promptTokens: number;
|
|
6
|
+
completionTokens: number;
|
|
7
|
+
totalTokens: number;
|
|
8
|
+
estimatedUsd: number;
|
|
9
|
+
at: string;
|
|
10
|
+
}
|
|
11
|
+
export interface BrainUsageSummary {
|
|
12
|
+
providerCallId: string;
|
|
13
|
+
conversationId?: string;
|
|
14
|
+
calls: number;
|
|
15
|
+
promptTokens: number;
|
|
16
|
+
completionTokens: number;
|
|
17
|
+
totalTokens: number;
|
|
18
|
+
/** Approximate USD from whitelist pricing table. */
|
|
19
|
+
estimatedUsd: number;
|
|
20
|
+
byModel: Record<string, {
|
|
21
|
+
calls: number;
|
|
22
|
+
promptTokens: number;
|
|
23
|
+
completionTokens: number;
|
|
24
|
+
estimatedUsd: number;
|
|
25
|
+
}>;
|
|
26
|
+
records: BrainUsageRecord[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Per-call LLM usage ledger for stock Brain adapters (ChatGPT / Claude / Gemini / Grok).
|
|
30
|
+
* Printed as $$$ at end of call (finalize).
|
|
31
|
+
*/
|
|
32
|
+
export declare class BrainUsageTracker {
|
|
33
|
+
private readonly byCall;
|
|
34
|
+
beginCall(providerCallId: string, conversationId?: string): void;
|
|
35
|
+
record(input: {
|
|
36
|
+
providerCallId: string;
|
|
37
|
+
conversationId?: string;
|
|
38
|
+
kind: BrainCallKind;
|
|
39
|
+
model: string;
|
|
40
|
+
promptTokens: number;
|
|
41
|
+
completionTokens: number;
|
|
42
|
+
}): BrainUsageRecord;
|
|
43
|
+
summary(providerCallId: string): BrainUsageSummary | null;
|
|
44
|
+
/** Format a short money line for console / logs. */
|
|
45
|
+
formatMoney(usd: number): string;
|
|
46
|
+
clear(providerCallId: string): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=brain-usage.tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-usage.tracker.d.ts","sourceRoot":"","sources":["../../src/brain/brain-usage.tracker.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CACb,MAAM,EACN;QACE,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;KACtB,CACF,CAAC;IACF,OAAO,EAAE,gBAAgB,EAAE,CAAC;CAC7B;AAQD;;;GAGG;AACH,qBACa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4D;IAE5E,SAAS,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI;IAchE,MAAM,CAAC,KAAK,EAAE;QACnB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,IAAI,EAAE,aAAa,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,gBAAgB;IAyBb,OAAO,CAAC,cAAc,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAoChE,oDAAoD;IAC7C,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMhC,KAAK,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;CAG3C"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.BrainUsageTracker = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const llm_model_pricing_1 = require("./llm-model-pricing");
|
|
12
|
+
/**
|
|
13
|
+
* Per-call LLM usage ledger for stock Brain adapters (ChatGPT / Claude / Gemini / Grok).
|
|
14
|
+
* Printed as $$$ at end of call (finalize).
|
|
15
|
+
*/
|
|
16
|
+
let BrainUsageTracker = class BrainUsageTracker {
|
|
17
|
+
byCall = new Map();
|
|
18
|
+
beginCall(providerCallId, conversationId) {
|
|
19
|
+
if (!providerCallId)
|
|
20
|
+
return;
|
|
21
|
+
const existing = this.byCall.get(providerCallId);
|
|
22
|
+
if (existing) {
|
|
23
|
+
if (conversationId)
|
|
24
|
+
existing.conversationId = conversationId;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.byCall.set(providerCallId, {
|
|
28
|
+
providerCallId,
|
|
29
|
+
conversationId,
|
|
30
|
+
records: [],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
record(input) {
|
|
34
|
+
this.beginCall(input.providerCallId, input.conversationId);
|
|
35
|
+
const bucket = this.byCall.get(input.providerCallId);
|
|
36
|
+
const promptTokens = Math.max(0, Math.floor(input.promptTokens || 0));
|
|
37
|
+
const completionTokens = Math.max(0, Math.floor(input.completionTokens || 0));
|
|
38
|
+
const record = {
|
|
39
|
+
kind: input.kind,
|
|
40
|
+
model: input.model,
|
|
41
|
+
promptTokens,
|
|
42
|
+
completionTokens,
|
|
43
|
+
totalTokens: promptTokens + completionTokens,
|
|
44
|
+
estimatedUsd: (0, llm_model_pricing_1.estimateUsdCost)({
|
|
45
|
+
model: input.model,
|
|
46
|
+
promptTokens,
|
|
47
|
+
completionTokens,
|
|
48
|
+
}),
|
|
49
|
+
at: new Date().toISOString(),
|
|
50
|
+
};
|
|
51
|
+
bucket.records.push(record);
|
|
52
|
+
return record;
|
|
53
|
+
}
|
|
54
|
+
summary(providerCallId) {
|
|
55
|
+
const bucket = this.byCall.get(providerCallId);
|
|
56
|
+
if (!bucket)
|
|
57
|
+
return null;
|
|
58
|
+
const byModel = {};
|
|
59
|
+
let promptTokens = 0;
|
|
60
|
+
let completionTokens = 0;
|
|
61
|
+
let estimatedUsd = 0;
|
|
62
|
+
for (const r of bucket.records) {
|
|
63
|
+
promptTokens += r.promptTokens;
|
|
64
|
+
completionTokens += r.completionTokens;
|
|
65
|
+
estimatedUsd += r.estimatedUsd;
|
|
66
|
+
const row = byModel[r.model] ?? {
|
|
67
|
+
calls: 0,
|
|
68
|
+
promptTokens: 0,
|
|
69
|
+
completionTokens: 0,
|
|
70
|
+
estimatedUsd: 0,
|
|
71
|
+
};
|
|
72
|
+
row.calls += 1;
|
|
73
|
+
row.promptTokens += r.promptTokens;
|
|
74
|
+
row.completionTokens += r.completionTokens;
|
|
75
|
+
row.estimatedUsd += r.estimatedUsd;
|
|
76
|
+
byModel[r.model] = row;
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
providerCallId,
|
|
80
|
+
conversationId: bucket.conversationId,
|
|
81
|
+
calls: bucket.records.length,
|
|
82
|
+
promptTokens,
|
|
83
|
+
completionTokens,
|
|
84
|
+
totalTokens: promptTokens + completionTokens,
|
|
85
|
+
estimatedUsd,
|
|
86
|
+
byModel,
|
|
87
|
+
records: [...bucket.records],
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Format a short money line for console / logs. */
|
|
91
|
+
formatMoney(usd) {
|
|
92
|
+
if (usd <= 0)
|
|
93
|
+
return '$0.000000';
|
|
94
|
+
if (usd < 0.01)
|
|
95
|
+
return `$${usd.toFixed(6)}`;
|
|
96
|
+
return `$${usd.toFixed(4)}`;
|
|
97
|
+
}
|
|
98
|
+
clear(providerCallId) {
|
|
99
|
+
this.byCall.delete(providerCallId);
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
exports.BrainUsageTracker = BrainUsageTracker;
|
|
103
|
+
exports.BrainUsageTracker = BrainUsageTracker = __decorate([
|
|
104
|
+
(0, common_1.Injectable)()
|
|
105
|
+
], BrainUsageTracker);
|
|
106
|
+
//# sourceMappingURL=brain-usage.tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain-usage.tracker.js","sourceRoot":"","sources":["../../src/brain/brain-usage.tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { IntentionCandidate } from '../conversation/types';
|
|
2
|
+
import type { SupervisedConversation } from '../conversation/supervised-conversation';
|
|
3
|
+
import type { ListenExpectation } from '../conversation/listen-expectation';
|
|
4
|
+
import type { BrainIntentionOption } from './brain-ranking';
|
|
5
|
+
import type { BrainClarifyRequest, BrainClarifyResult } from './brain-clarify';
|
|
6
|
+
import type { BrainJudgeRequest, BrainJudgeResult } from './brain-judge';
|
|
7
|
+
export interface BrainScanInput {
|
|
8
|
+
runtime: SupervisedConversation;
|
|
9
|
+
userText: string;
|
|
10
|
+
/** Active listen registration from the previous/current Node. */
|
|
11
|
+
listen?: ListenExpectation | null;
|
|
12
|
+
/**
|
|
13
|
+
* Limited intention set for this listen:
|
|
14
|
+
* listen-prioritized next-node intentions + all portal intentions.
|
|
15
|
+
*/
|
|
16
|
+
candidates?: BrainIntentionOption[];
|
|
17
|
+
/** Default 0.4 — if all confidences are below this, studio.isUnknownTransition wins. */
|
|
18
|
+
confidenceThreshold?: number;
|
|
19
|
+
/** Compact rolling transcript so the scanner has call context. */
|
|
20
|
+
history?: {
|
|
21
|
+
chat: Array<{
|
|
22
|
+
role: 'user' | 'assistant';
|
|
23
|
+
text: string;
|
|
24
|
+
}>;
|
|
25
|
+
nodes: Array<{
|
|
26
|
+
nodeId: string;
|
|
27
|
+
intention: string;
|
|
28
|
+
turnNumber: number;
|
|
29
|
+
}>;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Brain scan output: ranked intentions + optional structured extractions
|
|
34
|
+
* declared on the active listen / sayAndListen.
|
|
35
|
+
*/
|
|
36
|
+
export interface BrainScanResult {
|
|
37
|
+
intentions: IntentionCandidate[];
|
|
38
|
+
/** Map of ListenExtractField.key → value. */
|
|
39
|
+
extracted?: Record<string, unknown>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Brain port — Supervisor depends only on this.
|
|
43
|
+
* Concrete providers live under `brain/adapters/*` (Mock, studio-chatgpt, custom API, …).
|
|
44
|
+
*/
|
|
45
|
+
export interface BrainService {
|
|
46
|
+
scan(input: BrainScanInput): Promise<BrainScanResult>;
|
|
47
|
+
/**
|
|
48
|
+
* Free-form clarification: input + question + required object answer shape.
|
|
49
|
+
* Always returns `{ answer: object }`.
|
|
50
|
+
*/
|
|
51
|
+
clarify<TAnswer extends Record<string, unknown> = Record<string, unknown>>(request: BrainClarifyRequest): Promise<BrainClarifyResult<TAnswer>>;
|
|
52
|
+
/**
|
|
53
|
+
* LLM-as-a-judge: score stringifiable context against a goal + criteria.
|
|
54
|
+
* Rare on the live call path; primary consumer is eval tests.
|
|
55
|
+
*/
|
|
56
|
+
judge<TContext = unknown>(request: BrainJudgeRequest<TContext>): Promise<BrainJudgeResult>;
|
|
57
|
+
}
|
|
58
|
+
/** Alias emphasizing the adapter pattern for application wiring. */
|
|
59
|
+
export type BrainAdapter = BrainService;
|
|
60
|
+
export declare const BRAIN_SERVICE: unique symbol;
|
|
61
|
+
/** Same token as BRAIN_SERVICE — prefer this name at the app boundary. */
|
|
62
|
+
export declare const BRAIN_ADAPTER: symbol;
|
|
63
|
+
//# sourceMappingURL=brain.port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain.port.d.ts","sourceRoot":"","sources":["../../src/brain/brain.port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EACjB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAClC;;;OAGG;IACH,UAAU,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACpC,wFAAwF;IACxF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kEAAkE;IAClE,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC1D,KAAK,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACzE,CAAC;CACH;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACtD;;;OAGG;IACH,OAAO,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvE,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxC;;;OAGG;IACH,KAAK,CAAC,QAAQ,GAAG,OAAO,EACtB,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9B;AAED,oEAAoE;AACpE,MAAM,MAAM,YAAY,GAAG,YAAY,CAAC;AAExC,eAAO,MAAM,aAAa,eAA0B,CAAC;AACrD,0EAA0E;AAC1E,eAAO,MAAM,aAAa,QAAgB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BRAIN_ADAPTER = exports.BRAIN_SERVICE = void 0;
|
|
4
|
+
exports.BRAIN_SERVICE = Symbol('BRAIN_SERVICE');
|
|
5
|
+
/** Same token as BRAIN_SERVICE — prefer this name at the app boundary. */
|
|
6
|
+
exports.BRAIN_ADAPTER = exports.BRAIN_SERVICE;
|
|
7
|
+
//# sourceMappingURL=brain.port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain.port.js","sourceRoot":"","sources":["../../src/brain/brain.port.ts"],"names":[],"mappings":";;;AAmEa,QAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AACrD,0EAA0E;AAC7D,QAAA,aAAa,GAAG,qBAAa,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Brain barrel — port + stock adapters.
|
|
3
|
+
* Apps may supply their own adapter (e.g. custom HTTP API) via VapiStudioModule.forRoot({ brainAdapter }).
|
|
4
|
+
*/
|
|
5
|
+
export { BRAIN_SERVICE, BRAIN_ADAPTER, } from './brain.port';
|
|
6
|
+
export type { BrainService, BrainAdapter, BrainScanInput, BrainScanResult, } from './brain.port';
|
|
7
|
+
export type { BrainJudgeRequest, BrainJudgeOptions, BrainJudgeResult, } from './brain-judge';
|
|
8
|
+
export { MockBrainAdapter, MockBrainService, } from './adapters/mock-brain.adapter';
|
|
9
|
+
export { MockChatGptBrainAdapter, MockClaudeBrainAdapter, MockGeminiBrainAdapter, MockGrokBrainAdapter, } from './adapters/mock-provider-brains.adapter';
|
|
10
|
+
export { ChatGptBrainAdapter } from './adapters/chatgpt-brain.adapter';
|
|
11
|
+
export { ClaudeBrainAdapter } from './adapters/claude-brain.adapter';
|
|
12
|
+
export { GeminiBrainAdapter } from './adapters/gemini-brain.adapter';
|
|
13
|
+
export { GrokBrainAdapter } from './adapters/grok-brain.adapter';
|
|
14
|
+
//# sourceMappingURL=brain.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain.service.d.ts","sourceRoot":"","sources":["../../src/brain/brain.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACL,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GrokBrainAdapter = exports.GeminiBrainAdapter = exports.ClaudeBrainAdapter = exports.ChatGptBrainAdapter = exports.MockGrokBrainAdapter = exports.MockGeminiBrainAdapter = exports.MockClaudeBrainAdapter = exports.MockChatGptBrainAdapter = exports.MockBrainService = exports.MockBrainAdapter = exports.BRAIN_ADAPTER = exports.BRAIN_SERVICE = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Brain barrel — port + stock adapters.
|
|
6
|
+
* Apps may supply their own adapter (e.g. custom HTTP API) via VapiStudioModule.forRoot({ brainAdapter }).
|
|
7
|
+
*/
|
|
8
|
+
var brain_port_1 = require("./brain.port");
|
|
9
|
+
Object.defineProperty(exports, "BRAIN_SERVICE", { enumerable: true, get: function () { return brain_port_1.BRAIN_SERVICE; } });
|
|
10
|
+
Object.defineProperty(exports, "BRAIN_ADAPTER", { enumerable: true, get: function () { return brain_port_1.BRAIN_ADAPTER; } });
|
|
11
|
+
var mock_brain_adapter_1 = require("./adapters/mock-brain.adapter");
|
|
12
|
+
Object.defineProperty(exports, "MockBrainAdapter", { enumerable: true, get: function () { return mock_brain_adapter_1.MockBrainAdapter; } });
|
|
13
|
+
Object.defineProperty(exports, "MockBrainService", { enumerable: true, get: function () { return mock_brain_adapter_1.MockBrainService; } });
|
|
14
|
+
var mock_provider_brains_adapter_1 = require("./adapters/mock-provider-brains.adapter");
|
|
15
|
+
Object.defineProperty(exports, "MockChatGptBrainAdapter", { enumerable: true, get: function () { return mock_provider_brains_adapter_1.MockChatGptBrainAdapter; } });
|
|
16
|
+
Object.defineProperty(exports, "MockClaudeBrainAdapter", { enumerable: true, get: function () { return mock_provider_brains_adapter_1.MockClaudeBrainAdapter; } });
|
|
17
|
+
Object.defineProperty(exports, "MockGeminiBrainAdapter", { enumerable: true, get: function () { return mock_provider_brains_adapter_1.MockGeminiBrainAdapter; } });
|
|
18
|
+
Object.defineProperty(exports, "MockGrokBrainAdapter", { enumerable: true, get: function () { return mock_provider_brains_adapter_1.MockGrokBrainAdapter; } });
|
|
19
|
+
var chatgpt_brain_adapter_1 = require("./adapters/chatgpt-brain.adapter");
|
|
20
|
+
Object.defineProperty(exports, "ChatGptBrainAdapter", { enumerable: true, get: function () { return chatgpt_brain_adapter_1.ChatGptBrainAdapter; } });
|
|
21
|
+
var claude_brain_adapter_1 = require("./adapters/claude-brain.adapter");
|
|
22
|
+
Object.defineProperty(exports, "ClaudeBrainAdapter", { enumerable: true, get: function () { return claude_brain_adapter_1.ClaudeBrainAdapter; } });
|
|
23
|
+
var gemini_brain_adapter_1 = require("./adapters/gemini-brain.adapter");
|
|
24
|
+
Object.defineProperty(exports, "GeminiBrainAdapter", { enumerable: true, get: function () { return gemini_brain_adapter_1.GeminiBrainAdapter; } });
|
|
25
|
+
var grok_brain_adapter_1 = require("./adapters/grok-brain.adapter");
|
|
26
|
+
Object.defineProperty(exports, "GrokBrainAdapter", { enumerable: true, get: function () { return grok_brain_adapter_1.GrokBrainAdapter; } });
|
|
27
|
+
//# sourceMappingURL=brain.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brain.service.js","sourceRoot":"","sources":["../../src/brain/brain.service.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,2CAGsB;AAFpB,2GAAA,aAAa,OAAA;AACb,2GAAA,aAAa,OAAA;AAef,oEAGuC;AAFrC,sHAAA,gBAAgB,OAAA;AAChB,sHAAA,gBAAgB,OAAA;AAElB,wFAKiD;AAJ/C,uIAAA,uBAAuB,OAAA;AACvB,sIAAA,sBAAsB,OAAA;AACtB,sIAAA,sBAAsB,OAAA;AACtB,oIAAA,oBAAoB,OAAA;AAEtB,0EAAuE;AAA9D,4HAAA,mBAAmB,OAAA;AAC5B,wEAAqE;AAA5D,0HAAA,kBAAkB,OAAA;AAC3B,wEAAqE;AAA5D,0HAAA,kBAAkB,OAAA;AAC3B,oEAAiE;AAAxD,sHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whitelisted cheap Anthropic Claude models for studio-claude Brain.
|
|
3
|
+
* Anything outside this set is rejected — no silent upgrade to expensive models.
|
|
4
|
+
*
|
|
5
|
+
* Prices are approximate USD per 1M tokens for PoC cost estimates.
|
|
6
|
+
*/
|
|
7
|
+
import type { LlmModelPricing } from './llm-model-pricing';
|
|
8
|
+
export type CheapClaudeModelId = 'claude-haiku-4-5-20251001' | 'claude-3-5-haiku-latest' | 'claude-3-5-haiku-20241022' | 'claude-3-haiku-20240307';
|
|
9
|
+
export type CheapClaudeModelPricing = LlmModelPricing & {
|
|
10
|
+
id: CheapClaudeModelId;
|
|
11
|
+
};
|
|
12
|
+
/** Default — cheapest Haiku suited to intention scoring + extract. */
|
|
13
|
+
export declare const DEFAULT_CHEAP_CLAUDE_MODEL: CheapClaudeModelId;
|
|
14
|
+
export declare const CHEAP_CLAUDE_MODELS: Record<CheapClaudeModelId, CheapClaudeModelPricing>;
|
|
15
|
+
export declare const CHEAP_CLAUDE_MODEL_IDS: CheapClaudeModelId[];
|
|
16
|
+
export declare function isCheapClaudeModel(model: string): model is CheapClaudeModelId;
|
|
17
|
+
export declare function resolveCheapClaudeModel(value?: string | null): CheapClaudeModelPricing;
|
|
18
|
+
//# sourceMappingURL=claude-cheap-models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cheap-models.d.ts","sourceRoot":"","sources":["../../src/brain/claude-cheap-models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,MAAM,kBAAkB,GAC1B,2BAA2B,GAC3B,yBAAyB,GACzB,2BAA2B,GAC3B,yBAAyB,CAAC;AAE9B,MAAM,MAAM,uBAAuB,GAAG,eAAe,GAAG;IACtD,EAAE,EAAE,kBAAkB,CAAC;CACxB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,0BAA0B,EAAE,kBACZ,CAAC;AAE9B,eAAO,MAAM,mBAAmB,EAAE,MAAM,CACtC,kBAAkB,EAClB,uBAAuB,CAuBxB,CAAC;AAEF,eAAO,MAAM,sBAAsB,EAE9B,kBAAkB,EAAE,CAAC;AAE1B,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GACZ,KAAK,IAAI,kBAAkB,CAE7B;AAED,wBAAgB,uBAAuB,CACrC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACpB,uBAAuB,CAazB"}
|