@agent-native/core 0.7.12 → 0.7.13
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 +1 -1
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +26 -8
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +19 -0
- package/dist/agent/engine/builder-engine.d.ts.map +1 -0
- package/dist/agent/engine/builder-engine.js +430 -0
- package/dist/agent/engine/builder-engine.js.map +1 -0
- package/dist/agent/engine/builtin.d.ts.map +1 -1
- package/dist/agent/engine/builtin.js +26 -10
- package/dist/agent/engine/builtin.js.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +20 -1
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +49 -1
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/engine/types.d.ts +30 -0
- package/dist/agent/engine/types.d.ts.map +1 -1
- package/dist/agent/engine/types.js +19 -1
- package/dist/agent/engine/types.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +65 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +11 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts +4 -0
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +1 -0
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/agent/types.d.ts +8 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/checkpoints/service.d.ts +1 -0
- package/dist/checkpoints/service.d.ts.map +1 -1
- package/dist/checkpoints/service.js +26 -2
- package/dist/checkpoints/service.js.map +1 -1
- package/dist/cli/create.d.ts +30 -0
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +25 -13
- package/dist/cli/create.js.map +1 -1
- package/dist/client/AgentPanel.js +1 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +49 -10
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ConnectBuilderCard.d.ts +1 -7
- package/dist/client/ConnectBuilderCard.d.ts.map +1 -1
- package/dist/client/ConnectBuilderCard.js +30 -132
- package/dist/client/ConnectBuilderCard.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +30 -9
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/analytics.d.ts +5 -8
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +53 -11
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/builder-mark.d.ts +9 -0
- package/dist/client/builder-mark.d.ts.map +1 -0
- package/dist/client/builder-mark.js +10 -0
- package/dist/client/builder-mark.js.map +1 -0
- package/dist/client/components/ui/popover.d.ts +8 -0
- package/dist/client/components/ui/popover.d.ts.map +1 -0
- package/dist/client/components/ui/popover.js +11 -0
- package/dist/client/components/ui/popover.js.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts +2 -0
- package/dist/client/composer/ComposerPlusMenu.d.ts.map +1 -0
- package/dist/client/composer/ComposerPlusMenu.js +244 -0
- package/dist/client/composer/ComposerPlusMenu.js.map +1 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +9 -5
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/useVoiceDictation.d.ts.map +1 -1
- package/dist/client/composer/useVoiceDictation.js +4 -2
- package/dist/client/composer/useVoiceDictation.js.map +1 -1
- package/dist/client/error-format.d.ts +2 -0
- package/dist/client/error-format.d.ts.map +1 -0
- package/dist/client/error-format.js +31 -0
- package/dist/client/error-format.js.map +1 -0
- package/dist/client/index.d.ts +3 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/observability/ObservabilityDashboard.d.ts +5 -0
- package/dist/client/observability/ObservabilityDashboard.d.ts.map +1 -0
- package/dist/client/observability/ObservabilityDashboard.js +169 -0
- package/dist/client/observability/ObservabilityDashboard.js.map +1 -0
- package/dist/client/observability/ThumbsFeedback.d.ts +8 -0
- package/dist/client/observability/ThumbsFeedback.d.ts.map +1 -0
- package/dist/client/observability/ThumbsFeedback.js +64 -0
- package/dist/client/observability/ThumbsFeedback.js.map +1 -0
- package/dist/client/observability/index.d.ts +4 -0
- package/dist/client/observability/index.d.ts.map +1 -0
- package/dist/client/observability/index.js +4 -0
- package/dist/client/observability/index.js.map +1 -0
- package/dist/client/observability/useObservability.d.ts +128 -0
- package/dist/client/observability/useObservability.d.ts.map +1 -0
- package/dist/client/observability/useObservability.js +109 -0
- package/dist/client/observability/useObservability.js.map +1 -0
- package/dist/client/onboarding/OnboardingPanel.d.ts.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +34 -92
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.d.ts +33 -0
- package/dist/client/org/RequireActiveOrg.d.ts.map +1 -0
- package/dist/client/org/RequireActiveOrg.js +63 -0
- package/dist/client/org/RequireActiveOrg.js.map +1 -0
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +50 -15
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +1 -0
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +1 -0
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +3 -3
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/settings/AutomationsSection.js +1 -1
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/BrowserSection.js +1 -1
- package/dist/client/settings/BrowserSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +112 -12
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +10 -4
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/useBuilderStatus.d.ts +26 -0
- package/dist/client/settings/useBuilderStatus.d.ts.map +1 -1
- package/dist/client/settings/useBuilderStatus.js +128 -4
- package/dist/client/settings/useBuilderStatus.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts +2 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +6 -2
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts +9 -0
- package/dist/client/transcription/BuilderTranscriptionCta.d.ts.map +1 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js +18 -0
- package/dist/client/transcription/BuilderTranscriptionCta.js.map +1 -0
- package/dist/client/transcription/use-live-transcription.d.ts +29 -0
- package/dist/client/transcription/use-live-transcription.d.ts.map +1 -0
- package/dist/client/transcription/use-live-transcription.js +156 -0
- package/dist/client/transcription/use-live-transcription.js.map +1 -0
- package/dist/client/use-builder-enabled.d.ts +17 -0
- package/dist/client/use-builder-enabled.d.ts.map +1 -0
- package/dist/client/use-builder-enabled.js +36 -0
- package/dist/client/use-builder-enabled.js.map +1 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +4 -2
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/useProductionAgent.d.ts.map +1 -1
- package/dist/client/useProductionAgent.js +3 -1
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/db/migrations.d.ts +9 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +75 -10
- package/dist/db/migrations.js.map +1 -1
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +11 -4
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +137 -161
- package/dist/jobs/tools.js.map +1 -1
- package/dist/notifications/actions.d.ts +2 -2
- package/dist/notifications/actions.d.ts.map +1 -1
- package/dist/notifications/actions.js +77 -69
- package/dist/notifications/actions.js.map +1 -1
- package/dist/observability/evals.d.ts +22 -0
- package/dist/observability/evals.d.ts.map +1 -0
- package/dist/observability/evals.js +371 -0
- package/dist/observability/evals.js.map +1 -0
- package/dist/observability/experiments.d.ts +24 -0
- package/dist/observability/experiments.d.ts.map +1 -0
- package/dist/observability/experiments.js +274 -0
- package/dist/observability/experiments.js.map +1 -0
- package/dist/observability/feedback.d.ts +14 -0
- package/dist/observability/feedback.d.ts.map +1 -0
- package/dist/observability/feedback.js +256 -0
- package/dist/observability/feedback.js.map +1 -0
- package/dist/observability/index.d.ts +6 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +5 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/plugin.d.ts +2 -0
- package/dist/observability/plugin.d.ts.map +1 -0
- package/dist/observability/plugin.js +12 -0
- package/dist/observability/plugin.js.map +1 -0
- package/dist/observability/routes.d.ts +68 -0
- package/dist/observability/routes.d.ts.map +1 -0
- package/dist/observability/routes.js +301 -0
- package/dist/observability/routes.js.map +1 -0
- package/dist/observability/store.d.ts +77 -0
- package/dist/observability/store.d.ts.map +1 -0
- package/dist/observability/store.js +976 -0
- package/dist/observability/store.js.map +1 -0
- package/dist/observability/traces.d.ts +37 -0
- package/dist/observability/traces.d.ts.map +1 -0
- package/dist/observability/traces.js +182 -0
- package/dist/observability/traces.js.map +1 -0
- package/dist/observability/types.d.ts +159 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +16 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +6 -5
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/types.d.ts +10 -1
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/org/context.d.ts +8 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +163 -6
- package/dist/org/context.js.map +1 -1
- package/dist/org/handlers.d.ts.map +1 -1
- package/dist/org/handlers.js +49 -30
- package/dist/org/handlers.js.map +1 -1
- package/dist/progress/actions.d.ts +3 -0
- package/dist/progress/actions.d.ts.map +1 -1
- package/dist/progress/actions.js +86 -110
- package/dist/progress/actions.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/progress/routes.js +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts +10 -0
- package/dist/scripts/agent-engines/manage-agent-engine.d.ts.map +1 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js +47 -0
- package/dist/scripts/agent-engines/manage-agent-engine.js.map +1 -0
- package/dist/scripts/agent-engines/set-agent-engine.js +2 -2
- package/dist/scripts/agent-engines/set-agent-engine.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts +39 -0
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +707 -443
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-teams.js +1 -1
- package/dist/server/agent-teams.js.map +1 -1
- package/dist/server/analytics.d.ts +5 -6
- package/dist/server/analytics.d.ts.map +1 -1
- package/dist/server/analytics.js +6 -14
- package/dist/server/analytics.js.map +1 -1
- package/dist/server/app-name.d.ts +5 -2
- package/dist/server/app-name.d.ts.map +1 -1
- package/dist/server/app-name.js +14 -3
- package/dist/server/app-name.js.map +1 -1
- package/dist/server/app-url.d.ts.map +1 -1
- package/dist/server/app-url.js +10 -1
- package/dist/server/app-url.js.map +1 -1
- package/dist/server/auth.d.ts +2 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +153 -2
- package/dist/server/auth.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +2 -0
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +4 -0
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/builder-browser.d.ts +59 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +127 -11
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +208 -6
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +7 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +10 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +29 -4
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +46 -5
- package/dist/server/poll.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +2 -1
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts.map +1 -1
- package/dist/server/transcribe-voice.js +44 -5
- package/dist/server/transcribe-voice.js.map +1 -1
- package/dist/styles/agent-native.css +11 -2
- package/dist/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/dist/templates/default/app/root.tsx +7 -0
- package/dist/transcription/builder-transcription.d.ts +27 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -0
- package/dist/transcription/builder-transcription.js +41 -0
- package/dist/transcription/builder-transcription.js.map +1 -0
- package/dist/triggers/actions.d.ts +3 -0
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +189 -213
- package/dist/triggers/actions.js.map +1 -1
- package/docs/content/agent-mentions.md +1 -1
- package/docs/content/automations.md +22 -19
- package/docs/content/cloneable-saas.md +2 -2
- package/docs/content/deployment.md +21 -61
- package/docs/content/getting-started.md +1 -1
- package/docs/content/key-concepts.md +1 -1
- package/docs/content/{enterprise-workspace.md → multi-app-workspace.md} +3 -3
- package/docs/content/multi-tenancy.md +1 -1
- package/docs/content/progress.md +11 -11
- package/docs/content/template-dispatch.md +3 -3
- package/docs/content/workspace-management.md +1 -1
- package/package.json +9 -2
- package/src/templates/default/.agents/skills/progress/SKILL.md +14 -12
- package/src/templates/default/app/root.tsx +7 -0
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* Framework-level agent actions for the notifications primitive.
|
|
3
3
|
*
|
|
4
4
|
* Registered as native tools (not template actions) so they're available in
|
|
5
|
-
* every template.
|
|
6
|
-
*
|
|
5
|
+
* every template. Consolidated into a single `manage-notifications` tool with
|
|
6
|
+
* an `action` parameter that dispatches to the correct implementation.
|
|
7
7
|
*/
|
|
8
8
|
import type { ActionEntry } from "../agent/production-agent.js";
|
|
9
9
|
export declare function createNotificationToolEntries(getCurrentUser: () => string): Record<string, ActionEntry>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,MAAM,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAkI7B"}
|
|
@@ -2,112 +2,120 @@
|
|
|
2
2
|
* Framework-level agent actions for the notifications primitive.
|
|
3
3
|
*
|
|
4
4
|
* Registered as native tools (not template actions) so they're available in
|
|
5
|
-
* every template.
|
|
6
|
-
*
|
|
5
|
+
* every template. Consolidated into a single `manage-notifications` tool with
|
|
6
|
+
* an `action` parameter that dispatches to the correct implementation.
|
|
7
7
|
*/
|
|
8
8
|
import { notify, listNotifications, countUnread } from "./registry.js";
|
|
9
9
|
export function createNotificationToolEntries(getCurrentUser) {
|
|
10
10
|
return {
|
|
11
|
-
|
|
11
|
+
"manage-notifications": {
|
|
12
12
|
tool: {
|
|
13
|
-
description:
|
|
13
|
+
description: [
|
|
14
|
+
"Manage user notifications. Available actions:",
|
|
15
|
+
"",
|
|
16
|
+
'• action="send" — Send a notification to the user. Persisted to the in-app inbox so the bell + toast surface shows it. Registered channels (webhook, Slack, etc.) also run.',
|
|
17
|
+
" Required: severity, title. Optional: body, metadataJson, channels.",
|
|
18
|
+
"",
|
|
19
|
+
'• action="list" — List recent notifications for the current user. Useful when the user asks about prior alerts.',
|
|
20
|
+
" Optional: unreadOnly (boolean), limit (number, default 20, max 200).",
|
|
21
|
+
].join("\n"),
|
|
14
22
|
parameters: {
|
|
15
23
|
type: "object",
|
|
16
24
|
properties: {
|
|
25
|
+
action: {
|
|
26
|
+
type: "string",
|
|
27
|
+
enum: ["send", "list"],
|
|
28
|
+
description: "The notification action to perform.",
|
|
29
|
+
},
|
|
17
30
|
severity: {
|
|
18
31
|
type: "string",
|
|
19
32
|
enum: ["info", "warning", "critical"],
|
|
20
|
-
description:
|
|
33
|
+
description: '(send) Severity level — drives styling and per-severity channel routing. Use "info" for FYI, "warning" for things the user should look at, "critical" for things that need immediate attention.',
|
|
21
34
|
},
|
|
22
35
|
title: {
|
|
23
36
|
type: "string",
|
|
24
|
-
description: "Short, human-readable headline (≤100 chars).",
|
|
37
|
+
description: "(send) Short, human-readable headline (≤100 chars).",
|
|
25
38
|
},
|
|
26
39
|
body: {
|
|
27
40
|
type: "string",
|
|
28
|
-
description: "Optional longer description.",
|
|
41
|
+
description: "(send) Optional longer description.",
|
|
29
42
|
},
|
|
30
43
|
metadataJson: {
|
|
31
44
|
type: "string",
|
|
32
|
-
description: 'Optional JSON metadata (URLs, entity ids, etc.). Example: \'{"threadId":"abc","link":"/inbox/abc"}\'.',
|
|
45
|
+
description: '(send) Optional JSON metadata (URLs, entity ids, etc.). Example: \'{"threadId":"abc","link":"/inbox/abc"}\'.',
|
|
33
46
|
},
|
|
34
47
|
channels: {
|
|
35
48
|
type: "string",
|
|
36
|
-
description: 'Optional comma-separated channel allowlist (e.g. "inbox,webhook"). Omit to run all registered channels.',
|
|
49
|
+
description: '(send) Optional comma-separated channel allowlist (e.g. "inbox,webhook"). Omit to run all registered channels.',
|
|
37
50
|
},
|
|
38
|
-
},
|
|
39
|
-
required: ["severity", "title"],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
run: async (args) => {
|
|
43
|
-
const owner = getCurrentUser();
|
|
44
|
-
if (!args.severity || !args.title) {
|
|
45
|
-
return "Error: --severity and --title are required.";
|
|
46
|
-
}
|
|
47
|
-
const severity = args.severity;
|
|
48
|
-
if (!["info", "warning", "critical"].includes(severity)) {
|
|
49
|
-
return `Error: severity must be info, warning, or critical (got "${severity}").`;
|
|
50
|
-
}
|
|
51
|
-
let metadata;
|
|
52
|
-
if (args.metadataJson) {
|
|
53
|
-
try {
|
|
54
|
-
metadata = JSON.parse(args.metadataJson);
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return "Error: metadataJson must be valid JSON.";
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
const channels = args.channels
|
|
61
|
-
? args.channels
|
|
62
|
-
.split(",")
|
|
63
|
-
.map((s) => s.trim())
|
|
64
|
-
.filter(Boolean)
|
|
65
|
-
: undefined;
|
|
66
|
-
const stored = await notify({
|
|
67
|
-
severity,
|
|
68
|
-
title: args.title,
|
|
69
|
-
body: args.body || undefined,
|
|
70
|
-
metadata,
|
|
71
|
-
channels,
|
|
72
|
-
}, { owner });
|
|
73
|
-
return stored
|
|
74
|
-
? `Notification sent (id: ${stored.id})`
|
|
75
|
-
: "Notification dispatched to channels (not persisted).";
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
"list-notifications": {
|
|
79
|
-
tool: {
|
|
80
|
-
description: "List recent notifications for the current user. Useful when the user asks about prior alerts.",
|
|
81
|
-
parameters: {
|
|
82
|
-
type: "object",
|
|
83
|
-
properties: {
|
|
84
51
|
unreadOnly: {
|
|
85
52
|
type: "boolean",
|
|
86
|
-
description: "When true, only include unread notifications.",
|
|
53
|
+
description: "(list) When true, only include unread notifications.",
|
|
87
54
|
},
|
|
88
55
|
limit: {
|
|
89
56
|
type: "number",
|
|
90
|
-
description: "Max rows to return (default 20, max 200).",
|
|
57
|
+
description: "(list) Max rows to return (default 20, max 200).",
|
|
91
58
|
},
|
|
92
59
|
},
|
|
60
|
+
required: ["action"],
|
|
93
61
|
},
|
|
94
62
|
},
|
|
95
63
|
run: async (args) => {
|
|
96
64
|
const owner = getCurrentUser();
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
65
|
+
const action = args.action;
|
|
66
|
+
switch (action) {
|
|
67
|
+
case "send": {
|
|
68
|
+
if (!args.severity || !args.title) {
|
|
69
|
+
return "Error: severity and title are required for action=send.";
|
|
70
|
+
}
|
|
71
|
+
const severity = args.severity;
|
|
72
|
+
if (!["info", "warning", "critical"].includes(severity)) {
|
|
73
|
+
return `Error: severity must be info, warning, or critical (got "${severity}").`;
|
|
74
|
+
}
|
|
75
|
+
let metadata;
|
|
76
|
+
if (args.metadataJson) {
|
|
77
|
+
try {
|
|
78
|
+
metadata = JSON.parse(args.metadataJson);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return "Error: metadataJson must be valid JSON.";
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const channels = typeof args.channels === "string"
|
|
85
|
+
? args.channels
|
|
86
|
+
.split(",")
|
|
87
|
+
.map((s) => s.trim())
|
|
88
|
+
.filter(Boolean)
|
|
89
|
+
: undefined;
|
|
90
|
+
const stored = await notify({
|
|
91
|
+
severity,
|
|
92
|
+
title: args.title,
|
|
93
|
+
body: args.body || undefined,
|
|
94
|
+
metadata,
|
|
95
|
+
channels,
|
|
96
|
+
}, { owner });
|
|
97
|
+
return stored
|
|
98
|
+
? `Notification sent (id: ${stored.id})`
|
|
99
|
+
: "Notification dispatched to channels (not persisted).";
|
|
100
|
+
}
|
|
101
|
+
case "list": {
|
|
102
|
+
const rows = await listNotifications(owner, {
|
|
103
|
+
unreadOnly: args.unreadOnly === true || args.unreadOnly === "true",
|
|
104
|
+
limit: Math.min(Number(args.limit ?? 20), 200),
|
|
105
|
+
});
|
|
106
|
+
if (rows.length === 0) {
|
|
107
|
+
return args.unreadOnly
|
|
108
|
+
? "No unread notifications."
|
|
109
|
+
: "No notifications.";
|
|
110
|
+
}
|
|
111
|
+
const unreadCount = await countUnread(owner);
|
|
112
|
+
const lines = rows.map((n) => `[${n.readAt ? " " : "•"}] (${n.severity}) ${n.title}${n.body ? ` — ${n.body}` : ""} · ${n.createdAt}`);
|
|
113
|
+
return `${unreadCount} unread\n\n${lines.join("\n")}`;
|
|
114
|
+
}
|
|
115
|
+
default:
|
|
116
|
+
return `Error: unknown action "${action}". Must be one of: send, list.`;
|
|
105
117
|
}
|
|
106
|
-
const unreadCount = await countUnread(owner);
|
|
107
|
-
const lines = rows.map((n) => `[${n.readAt ? " " : "•"}] (${n.severity}) ${n.title}${n.body ? ` — ${n.body}` : ""} · ${n.createdAt}`);
|
|
108
|
-
return `${unreadCount} unread\n\n${lines.join("\n")}`;
|
|
109
118
|
},
|
|
110
|
-
readOnly: true,
|
|
111
119
|
},
|
|
112
120
|
};
|
|
113
121
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGvE,MAAM,UAAU,6BAA6B,CAC3C,cAA4B;IAE5B,OAAO;QACL,
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/notifications/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EvalResult, EvalCriteria } from "./types.js";
|
|
2
|
+
import type { AgentEngine } from "../agent/engine/types.js";
|
|
3
|
+
export declare function runAutomatedEvals(runId: string): Promise<EvalResult[]>;
|
|
4
|
+
export declare function runLlmJudgeEval(runId: string, criteria: EvalCriteria, opts?: {
|
|
5
|
+
engine?: AgentEngine;
|
|
6
|
+
model?: string;
|
|
7
|
+
userId?: string | null;
|
|
8
|
+
}): Promise<EvalResult | null>;
|
|
9
|
+
export declare function runDatasetEval(datasetId: string, opts?: {
|
|
10
|
+
criteria?: EvalCriteria[];
|
|
11
|
+
engine?: AgentEngine;
|
|
12
|
+
model?: string;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
datasetId: string;
|
|
15
|
+
totalCases: number;
|
|
16
|
+
avgScore: number;
|
|
17
|
+
results: EvalResult[];
|
|
18
|
+
}>;
|
|
19
|
+
export declare function evaluateRun(runId: string, opts?: {
|
|
20
|
+
sampleRate?: number;
|
|
21
|
+
}): Promise<EvalResult[]>;
|
|
22
|
+
//# sourceMappingURL=evals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evals.d.ts","sourceRoot":"","sources":["../../src/observability/evals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,YAAY,EAGb,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AA0I5D,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAsB5E;AA2DD,wBAAsB,eAAe,CACnC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,YAAY,EACtB,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACtE,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA6E5B;AAID,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACzE,OAAO,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB,CAAC,CAkDD;AAuGD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7B,OAAO,CAAC,UAAU,EAAE,CAAC,CA6BvB"}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import { getTraceSummary, insertEvalResult, getEvalDataset } from "./store.js";
|
|
2
|
+
import { getRunById, getRunEventsSince } from "../agent/run-store.js";
|
|
3
|
+
import { resolveEngine, getStoredModelForEngine, } from "../agent/engine/index.js";
|
|
4
|
+
const LATENCY_BASELINE_PER_TOOL_MS = 10_000;
|
|
5
|
+
const COST_BASELINE_PER_TOOL_CX100 = 50;
|
|
6
|
+
const LLM_JUDGE_TIMEOUT_MS = 30_000;
|
|
7
|
+
function makeEvalResult(opts) {
|
|
8
|
+
return {
|
|
9
|
+
id: crypto.randomUUID(),
|
|
10
|
+
runId: opts.runId,
|
|
11
|
+
threadId: opts.threadId,
|
|
12
|
+
userId: opts.userId,
|
|
13
|
+
evalType: opts.evalType,
|
|
14
|
+
criteria: opts.criteria,
|
|
15
|
+
score: Math.max(0, Math.min(1, opts.score)),
|
|
16
|
+
reasoning: opts.reasoning ?? null,
|
|
17
|
+
metadata: opts.metadata ?? null,
|
|
18
|
+
createdAt: Date.now(),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Lift the (runId, threadId, userId) triple off a TraceSummary —
|
|
22
|
+
* every automated scorer pulls these together. */
|
|
23
|
+
function fromSummary(summary) {
|
|
24
|
+
return {
|
|
25
|
+
runId: summary.runId,
|
|
26
|
+
threadId: summary.threadId,
|
|
27
|
+
userId: summary.userId,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// ─── Layer 1: Automated deterministic scorers ────────────────────────
|
|
31
|
+
function scoreToolSuccessRate(summary) {
|
|
32
|
+
const total = summary.toolCalls;
|
|
33
|
+
const score = total > 0 ? summary.successfulTools / total : 1.0;
|
|
34
|
+
return makeEvalResult({
|
|
35
|
+
...fromSummary(summary),
|
|
36
|
+
evalType: "automated",
|
|
37
|
+
criteria: "tool_success_rate",
|
|
38
|
+
score,
|
|
39
|
+
metadata: {
|
|
40
|
+
totalTools: total,
|
|
41
|
+
successfulTools: summary.successfulTools,
|
|
42
|
+
failedTools: summary.failedTools,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function scoreStepEfficiency(summary) {
|
|
47
|
+
// No tool calls = simple Q&A, maximally efficient.
|
|
48
|
+
// With tools: penalize excessive LLM iterations relative to tool calls.
|
|
49
|
+
const score = summary.toolCalls === 0
|
|
50
|
+
? 1.0
|
|
51
|
+
: summary.llmCalls > 0
|
|
52
|
+
? Math.min(1, summary.toolCalls / summary.llmCalls)
|
|
53
|
+
: 1.0;
|
|
54
|
+
return makeEvalResult({
|
|
55
|
+
...fromSummary(summary),
|
|
56
|
+
evalType: "automated",
|
|
57
|
+
criteria: "step_efficiency",
|
|
58
|
+
score,
|
|
59
|
+
metadata: { llmCalls: summary.llmCalls, toolCalls: summary.toolCalls },
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
function scoreLatency(summary) {
|
|
63
|
+
const expectedMs = Math.max(LATENCY_BASELINE_PER_TOOL_MS, summary.toolCalls * LATENCY_BASELINE_PER_TOOL_MS);
|
|
64
|
+
const score = Math.max(0, 1 - summary.totalDurationMs / expectedMs);
|
|
65
|
+
return makeEvalResult({
|
|
66
|
+
...fromSummary(summary),
|
|
67
|
+
evalType: "automated",
|
|
68
|
+
criteria: "latency_score",
|
|
69
|
+
score,
|
|
70
|
+
metadata: { actualMs: summary.totalDurationMs, expectedMs },
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function scoreCostEfficiency(summary) {
|
|
74
|
+
const expectedCx100 = Math.max(COST_BASELINE_PER_TOOL_CX100, summary.toolCalls * COST_BASELINE_PER_TOOL_CX100);
|
|
75
|
+
const score = Math.max(0, 1 - summary.totalCostCentsX100 / expectedCx100);
|
|
76
|
+
return makeEvalResult({
|
|
77
|
+
...fromSummary(summary),
|
|
78
|
+
evalType: "automated",
|
|
79
|
+
criteria: "cost_efficiency",
|
|
80
|
+
score,
|
|
81
|
+
metadata: { actualCx100: summary.totalCostCentsX100, expectedCx100 },
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
function scoreErrorRecovery(summary, runStatus) {
|
|
85
|
+
const hadErrors = summary.failedTools > 0;
|
|
86
|
+
let score;
|
|
87
|
+
if (!hadErrors) {
|
|
88
|
+
score = 1.0;
|
|
89
|
+
}
|
|
90
|
+
else if (runStatus === "completed") {
|
|
91
|
+
score = 1.0;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
score = 0;
|
|
95
|
+
}
|
|
96
|
+
return makeEvalResult({
|
|
97
|
+
...fromSummary(summary),
|
|
98
|
+
evalType: "automated",
|
|
99
|
+
criteria: "error_recovery",
|
|
100
|
+
score,
|
|
101
|
+
metadata: { hadErrors, runStatus },
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export async function runAutomatedEvals(runId) {
|
|
105
|
+
const [summary, run] = await Promise.all([
|
|
106
|
+
getTraceSummary(runId),
|
|
107
|
+
getRunById(runId),
|
|
108
|
+
]);
|
|
109
|
+
if (!summary)
|
|
110
|
+
return [];
|
|
111
|
+
const runStatus = run?.status ?? "unknown";
|
|
112
|
+
const results = [
|
|
113
|
+
scoreToolSuccessRate(summary),
|
|
114
|
+
scoreStepEfficiency(summary),
|
|
115
|
+
scoreLatency(summary),
|
|
116
|
+
scoreCostEfficiency(summary),
|
|
117
|
+
scoreErrorRecovery(summary, runStatus),
|
|
118
|
+
];
|
|
119
|
+
for (const result of results) {
|
|
120
|
+
insertEvalResult(result).catch(() => { });
|
|
121
|
+
}
|
|
122
|
+
return results;
|
|
123
|
+
}
|
|
124
|
+
// ─── Layer 2: LLM-as-Judge ───────────────────────────────────────────
|
|
125
|
+
function buildConversationTranscript(events) {
|
|
126
|
+
const lines = [];
|
|
127
|
+
for (const { eventData } of events) {
|
|
128
|
+
try {
|
|
129
|
+
const event = JSON.parse(eventData);
|
|
130
|
+
if (event.type === "user-message") {
|
|
131
|
+
lines.push(`[User]: ${event.text ?? JSON.stringify(event.content)}`);
|
|
132
|
+
}
|
|
133
|
+
else if (event.type === "text-delta" || event.type === "text") {
|
|
134
|
+
lines.push(`[Agent]: ${event.text}`);
|
|
135
|
+
}
|
|
136
|
+
else if (event.type === "tool-call") {
|
|
137
|
+
lines.push(`[Tool Call: ${event.name}] ${JSON.stringify(event.input)}`);
|
|
138
|
+
}
|
|
139
|
+
else if (event.type === "tool-result") {
|
|
140
|
+
const snippet = typeof event.content === "string"
|
|
141
|
+
? event.content.slice(0, 500)
|
|
142
|
+
: JSON.stringify(event.content).slice(0, 500);
|
|
143
|
+
lines.push(`[Tool Result${event.isError ? " (ERROR)" : ""}]: ${snippet}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// Skip unparseable events
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return lines.join("\n");
|
|
151
|
+
}
|
|
152
|
+
function buildJudgePrompt(transcript, criteria) {
|
|
153
|
+
let prompt = `You are an expert evaluator. Assess the following agent conversation against the given criteria.
|
|
154
|
+
|
|
155
|
+
## Criteria
|
|
156
|
+
Name: ${criteria.name}
|
|
157
|
+
Description: ${criteria.description}`;
|
|
158
|
+
if (criteria.rubric) {
|
|
159
|
+
prompt += `\nRubric: ${criteria.rubric}`;
|
|
160
|
+
}
|
|
161
|
+
const min = criteria.scoreRange?.min ?? 0;
|
|
162
|
+
const max = criteria.scoreRange?.max ?? 1;
|
|
163
|
+
prompt += `
|
|
164
|
+
|
|
165
|
+
## Conversation Transcript
|
|
166
|
+
${transcript}
|
|
167
|
+
|
|
168
|
+
## Instructions
|
|
169
|
+
Evaluate the conversation and respond with ONLY a JSON object (no markdown, no explanation outside the JSON):
|
|
170
|
+
{"score": <number between ${min} and ${max}>, "reasoning": "<brief explanation>"}`;
|
|
171
|
+
return prompt;
|
|
172
|
+
}
|
|
173
|
+
export async function runLlmJudgeEval(runId, criteria, opts) {
|
|
174
|
+
try {
|
|
175
|
+
const [events, run] = await Promise.all([
|
|
176
|
+
getRunEventsSince(runId, 0),
|
|
177
|
+
getRunById(runId),
|
|
178
|
+
]);
|
|
179
|
+
if (events.length === 0)
|
|
180
|
+
return null;
|
|
181
|
+
const transcript = buildConversationTranscript(events);
|
|
182
|
+
if (!transcript.trim())
|
|
183
|
+
return null;
|
|
184
|
+
const engine = opts?.engine ?? (await resolveEngine({ engineOption: undefined }));
|
|
185
|
+
const model = opts?.model ??
|
|
186
|
+
(await getStoredModelForEngine(engine)) ??
|
|
187
|
+
engine.defaultModel;
|
|
188
|
+
const judgePrompt = buildJudgePrompt(transcript, criteria);
|
|
189
|
+
const controller = new AbortController();
|
|
190
|
+
const timeout = setTimeout(() => controller.abort(), LLM_JUDGE_TIMEOUT_MS);
|
|
191
|
+
let responseText = "";
|
|
192
|
+
try {
|
|
193
|
+
const stream = engine.stream({
|
|
194
|
+
model,
|
|
195
|
+
systemPrompt: "You are an evaluation judge. Respond only with valid JSON.",
|
|
196
|
+
messages: [
|
|
197
|
+
{ role: "user", content: [{ type: "text", text: judgePrompt }] },
|
|
198
|
+
],
|
|
199
|
+
tools: [],
|
|
200
|
+
abortSignal: controller.signal,
|
|
201
|
+
maxOutputTokens: 512,
|
|
202
|
+
temperature: 0,
|
|
203
|
+
});
|
|
204
|
+
for await (const event of stream) {
|
|
205
|
+
if (event.type === "text-delta") {
|
|
206
|
+
responseText += event.text;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
clearTimeout(timeout);
|
|
212
|
+
}
|
|
213
|
+
const jsonMatch = responseText.match(/\{[\s\S]*\}/);
|
|
214
|
+
if (!jsonMatch)
|
|
215
|
+
return null;
|
|
216
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
217
|
+
const min = criteria.scoreRange?.min ?? 0;
|
|
218
|
+
const max = criteria.scoreRange?.max ?? 1;
|
|
219
|
+
const normalizedScore = max > min ? (parsed.score - min) / (max - min) : parsed.score;
|
|
220
|
+
const result = makeEvalResult({
|
|
221
|
+
runId,
|
|
222
|
+
threadId: run?.threadId ?? null,
|
|
223
|
+
userId: opts?.userId ?? null,
|
|
224
|
+
evalType: "llm_judge",
|
|
225
|
+
criteria: criteria.name,
|
|
226
|
+
score: normalizedScore,
|
|
227
|
+
reasoning: parsed.reasoning,
|
|
228
|
+
metadata: { model, rawScore: parsed.score, scoreRange: { min, max } },
|
|
229
|
+
});
|
|
230
|
+
insertEvalResult(result).catch(() => { });
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
return null;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ─── Layer 3: Dataset evaluation ─────────────────────────────────────
|
|
238
|
+
export async function runDatasetEval(datasetId, opts) {
|
|
239
|
+
const dataset = await getEvalDataset(datasetId);
|
|
240
|
+
if (!dataset) {
|
|
241
|
+
return { datasetId, totalCases: 0, avgScore: 0, results: [] };
|
|
242
|
+
}
|
|
243
|
+
const engine = opts?.engine ?? (await resolveEngine({ engineOption: undefined }));
|
|
244
|
+
const model = opts?.model ??
|
|
245
|
+
(await getStoredModelForEngine(engine)) ??
|
|
246
|
+
engine.defaultModel;
|
|
247
|
+
const criteria = opts?.criteria ?? [
|
|
248
|
+
{
|
|
249
|
+
name: "response_quality",
|
|
250
|
+
description: "How well the agent's response addresses the user's input, considering accuracy, completeness, and helpfulness.",
|
|
251
|
+
},
|
|
252
|
+
];
|
|
253
|
+
const allResults = [];
|
|
254
|
+
for (const testCase of dataset.entries) {
|
|
255
|
+
const transcript = buildTestCaseTranscript(testCase, engine, model);
|
|
256
|
+
for (const c of criteria) {
|
|
257
|
+
const result = await evaluateTestCase(datasetId, testCase, transcript, c, engine, model);
|
|
258
|
+
if (result)
|
|
259
|
+
allResults.push(result);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const avgScore = allResults.length > 0
|
|
263
|
+
? allResults.reduce((sum, r) => sum + r.score, 0) / allResults.length
|
|
264
|
+
: 0;
|
|
265
|
+
return {
|
|
266
|
+
datasetId,
|
|
267
|
+
totalCases: dataset.entries.length,
|
|
268
|
+
avgScore,
|
|
269
|
+
results: allResults,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
function buildTestCaseTranscript(testCase, _engine, _model) {
|
|
273
|
+
let transcript = `[User]: ${testCase.input}`;
|
|
274
|
+
if (testCase.expectedOutput) {
|
|
275
|
+
transcript += `\n[Expected Output]: ${testCase.expectedOutput}`;
|
|
276
|
+
}
|
|
277
|
+
if (testCase.context) {
|
|
278
|
+
transcript += `\n[Context]: ${JSON.stringify(testCase.context)}`;
|
|
279
|
+
}
|
|
280
|
+
return transcript;
|
|
281
|
+
}
|
|
282
|
+
async function evaluateTestCase(datasetId, testCase, transcript, criteria, engine, model) {
|
|
283
|
+
try {
|
|
284
|
+
const judgePrompt = buildJudgePrompt(transcript, criteria);
|
|
285
|
+
const controller = new AbortController();
|
|
286
|
+
const timeout = setTimeout(() => controller.abort(), LLM_JUDGE_TIMEOUT_MS);
|
|
287
|
+
let responseText = "";
|
|
288
|
+
try {
|
|
289
|
+
const stream = engine.stream({
|
|
290
|
+
model,
|
|
291
|
+
systemPrompt: "You are an evaluation judge. Respond only with valid JSON.",
|
|
292
|
+
messages: [
|
|
293
|
+
{ role: "user", content: [{ type: "text", text: judgePrompt }] },
|
|
294
|
+
],
|
|
295
|
+
tools: [],
|
|
296
|
+
abortSignal: controller.signal,
|
|
297
|
+
maxOutputTokens: 512,
|
|
298
|
+
temperature: 0,
|
|
299
|
+
});
|
|
300
|
+
for await (const event of stream) {
|
|
301
|
+
if (event.type === "text-delta") {
|
|
302
|
+
responseText += event.text;
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
finally {
|
|
307
|
+
clearTimeout(timeout);
|
|
308
|
+
}
|
|
309
|
+
const jsonMatch = responseText.match(/\{[\s\S]*\}/);
|
|
310
|
+
if (!jsonMatch)
|
|
311
|
+
return null;
|
|
312
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
313
|
+
const min = criteria.scoreRange?.min ?? 0;
|
|
314
|
+
const max = criteria.scoreRange?.max ?? 1;
|
|
315
|
+
const normalizedScore = max > min ? (parsed.score - min) / (max - min) : parsed.score;
|
|
316
|
+
// Dataset evals use a synthetic runId since there's no real run
|
|
317
|
+
const syntheticRunId = `dataset:${datasetId}:${crypto.randomUUID()}`;
|
|
318
|
+
// Dataset evals are administrative — there's no per-user runId, so
|
|
319
|
+
// we leave userId null. Per-user reads filter null rows out, which
|
|
320
|
+
// is the right default; admins can fetch dataset evals via the
|
|
321
|
+
// unfiltered call path.
|
|
322
|
+
const result = makeEvalResult({
|
|
323
|
+
runId: syntheticRunId,
|
|
324
|
+
threadId: null,
|
|
325
|
+
userId: null,
|
|
326
|
+
evalType: "llm_judge",
|
|
327
|
+
criteria: criteria.name,
|
|
328
|
+
score: normalizedScore,
|
|
329
|
+
reasoning: parsed.reasoning,
|
|
330
|
+
metadata: {
|
|
331
|
+
datasetId,
|
|
332
|
+
model,
|
|
333
|
+
testCaseInput: testCase.input,
|
|
334
|
+
expectedOutput: testCase.expectedOutput ?? null,
|
|
335
|
+
tags: testCase.tags ?? [],
|
|
336
|
+
rawScore: parsed.score,
|
|
337
|
+
scoreRange: { min, max },
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
insertEvalResult(result).catch(() => { });
|
|
341
|
+
return result;
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
return null;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// ─── Orchestrator ────────────────────────────────────────────────────
|
|
348
|
+
export async function evaluateRun(runId, opts) {
|
|
349
|
+
const results = await runAutomatedEvals(runId);
|
|
350
|
+
const userId = results[0]?.userId ?? null;
|
|
351
|
+
const sampleRate = opts?.sampleRate ?? 0;
|
|
352
|
+
if (sampleRate > 0 && Math.random() < sampleRate) {
|
|
353
|
+
const defaultCriteria = [
|
|
354
|
+
{
|
|
355
|
+
name: "overall_quality",
|
|
356
|
+
description: "Overall quality of the agent's response, considering helpfulness, accuracy, and appropriate tool usage.",
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
name: "task_completion",
|
|
360
|
+
description: "Whether the agent successfully completed the user's requested task.",
|
|
361
|
+
},
|
|
362
|
+
];
|
|
363
|
+
const judgeResults = await Promise.all(defaultCriteria.map((c) => runLlmJudgeEval(runId, c, { userId })));
|
|
364
|
+
for (const r of judgeResults) {
|
|
365
|
+
if (r)
|
|
366
|
+
results.push(r);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
return results;
|
|
370
|
+
}
|
|
371
|
+
//# sourceMappingURL=evals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evals.js","sourceRoot":"","sources":["../../src/observability/evals.ts"],"names":[],"mappings":"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"}
|