assistant-cloud 0.2.0 → 0.2.2
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 +48 -6
- package/dist/AssistantCloud.d.ts +3 -3
- package/dist/AssistantCloud.d.ts.map +1 -1
- package/dist/AssistantCloud.js +2 -0
- package/dist/AssistantCloud.js.map +1 -1
- package/dist/AssistantCloudAPI.d.ts +14 -6
- package/dist/AssistantCloudAPI.d.ts.map +1 -1
- package/dist/AssistantCloudAPI.js +17 -1
- package/dist/AssistantCloudAPI.js.map +1 -1
- package/dist/AssistantCloudAuthStrategy.d.ts +6 -7
- package/dist/AssistantCloudAuthStrategy.d.ts.map +1 -1
- package/dist/AssistantCloudAuthStrategy.js +4 -2
- package/dist/AssistantCloudAuthStrategy.js.map +1 -1
- package/dist/AssistantCloudAuthTokens.d.ts +1 -2
- package/dist/AssistantCloudAuthTokens.d.ts.map +1 -1
- package/dist/AssistantCloudEvents.d.ts +3 -4
- package/dist/AssistantCloudEvents.d.ts.map +1 -1
- package/dist/AssistantCloudEvents.js +5 -1
- package/dist/AssistantCloudEvents.js.map +1 -1
- package/dist/AssistantCloudFiles.d.ts +2 -3
- package/dist/AssistantCloudFiles.d.ts.map +1 -1
- package/dist/AssistantCloudProjectThreadMessages.d.ts +1 -2
- package/dist/AssistantCloudProjectThreadMessages.d.ts.map +1 -1
- package/dist/AssistantCloudProjectThreads.d.ts +1 -2
- package/dist/AssistantCloudProjectThreads.d.ts.map +1 -1
- package/dist/AssistantCloudProjects.d.ts +1 -2
- package/dist/AssistantCloudProjects.d.ts.map +1 -1
- package/dist/AssistantCloudRuns.d.ts +3 -3
- package/dist/AssistantCloudRuns.d.ts.map +1 -1
- package/dist/AssistantCloudRuns.js +2 -1
- package/dist/AssistantCloudRuns.js.map +1 -1
- package/dist/AssistantCloudScores.d.ts +3 -4
- package/dist/AssistantCloudScores.d.ts.map +1 -1
- package/dist/AssistantCloudThreadMessages.d.ts +7 -6
- package/dist/AssistantCloudThreadMessages.d.ts.map +1 -1
- package/dist/AssistantCloudThreadMessages.js +7 -2
- package/dist/AssistantCloudThreadMessages.js.map +1 -1
- package/dist/AssistantCloudThreads.d.ts +3 -4
- package/dist/AssistantCloudThreads.d.ts.map +1 -1
- package/dist/CloudEngagementReporter.d.ts +73 -0
- package/dist/CloudEngagementReporter.d.ts.map +1 -0
- package/dist/CloudEngagementReporter.js +132 -0
- package/dist/CloudEngagementReporter.js.map +1 -0
- package/dist/CloudMessagePersistence.d.ts +9 -11
- package/dist/CloudMessagePersistence.d.ts.map +1 -1
- package/dist/CloudMessagePersistence.js +18 -11
- package/dist/CloudMessagePersistence.js.map +1 -1
- package/dist/CloudRunReporter.d.ts +19 -0
- package/dist/CloudRunReporter.d.ts.map +1 -0
- package/dist/CloudRunReporter.js +47 -0
- package/dist/CloudRunReporter.js.map +1 -0
- package/dist/FormattedCloudPersistence.d.ts +5 -11
- package/dist/FormattedCloudPersistence.d.ts.map +1 -1
- package/dist/FormattedCloudPersistence.js +3 -8
- package/dist/FormattedCloudPersistence.js.map +1 -1
- package/dist/ai-sdk/index.d.ts +32 -0
- package/dist/ai-sdk/index.d.ts.map +1 -0
- package/dist/ai-sdk/index.js +147 -0
- package/dist/ai-sdk/index.js.map +1 -0
- package/dist/cloudResponse.d.ts +12 -13
- package/dist/cloudResponse.d.ts.map +1 -1
- package/dist/generateThreadTitle.d.ts +1 -2
- package/dist/generateThreadTitle.d.ts.map +1 -1
- package/dist/generateThreadTitle.js +1 -0
- package/dist/generateThreadTitle.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -2
- package/dist/instrumentMcpSampling.d.ts +6 -7
- package/dist/instrumentMcpSampling.d.ts.map +1 -1
- package/dist/instrumentMcpSampling.js +12 -2
- package/dist/instrumentMcpSampling.js.map +1 -1
- package/dist/runTelemetry.d.ts +30 -15
- package/dist/runTelemetry.d.ts.map +1 -1
- package/dist/runTelemetry.js.map +1 -1
- package/dist/telemetry/index.d.ts +8 -9
- package/dist/telemetry/index.d.ts.map +1 -1
- package/dist/version.d.ts +4 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +24 -10
- package/src/AssistantCloud.ts +3 -0
- package/src/AssistantCloudAPI.ts +31 -1
- package/src/AssistantCloudAuthStrategy.ts +4 -2
- package/src/AssistantCloudEvents.test.ts +68 -2
- package/src/AssistantCloudEvents.ts +6 -0
- package/src/AssistantCloudRuns.ts +1 -0
- package/src/AssistantCloudThreadMessages.test.ts +53 -2
- package/src/AssistantCloudThreadMessages.ts +13 -1
- package/src/CloudEngagementReporter.ts +231 -0
- package/src/CloudMessagePersistence.ts +24 -13
- package/src/CloudRunReporter.ts +50 -0
- package/src/FormattedCloudPersistence.ts +3 -8
- package/src/ai-sdk/index.test.ts +258 -0
- package/src/ai-sdk/index.ts +222 -0
- package/src/generateThreadTitle.test.ts +32 -0
- package/src/generateThreadTitle.ts +1 -0
- package/src/index.ts +11 -1
- package/src/instrumentMcpSampling.test.ts +102 -0
- package/src/instrumentMcpSampling.ts +16 -2
- package/src/runTelemetry.ts +17 -0
- package/src/tests/AssistantCloud.test.ts +33 -1
- package/src/tests/AssistantCloudAPI.test.ts +51 -0
- package/src/tests/AssistantCloudAuthStrategy.test.ts +22 -0
- package/src/tests/AssistantCloudProjects.test.ts +1 -5
- package/src/tests/CloudEngagementReporter.test.ts +184 -0
- package/src/tests/CloudMessagePersistence.test.ts +235 -0
- package/src/tests/CloudRunReporter.test.ts +135 -0
- package/src/version.ts +4 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from "vitest";
|
|
2
|
+
import type { AssistantCloud } from "../AssistantCloud";
|
|
3
|
+
import { CloudAPIError } from "../AssistantCloudAPI";
|
|
4
|
+
import { CloudRunReporter } from "../CloudRunReporter";
|
|
5
|
+
import { CloudResponseError } from "../cloudResponse";
|
|
6
|
+
|
|
7
|
+
const createCloud = (telemetry: AssistantCloud["telemetry"]) => {
|
|
8
|
+
const report = vi.fn().mockResolvedValue({ run_id: "run_1" });
|
|
9
|
+
const cloud = { telemetry, runs: { report } } as unknown as AssistantCloud;
|
|
10
|
+
return { cloud, report };
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
describe("CloudRunReporter", () => {
|
|
14
|
+
it("sends nothing while telemetry is disabled", async () => {
|
|
15
|
+
const { cloud, report } = createCloud({ enabled: false });
|
|
16
|
+
await new CloudRunReporter(cloud).report({
|
|
17
|
+
threadId: "thread_1",
|
|
18
|
+
status: "completed",
|
|
19
|
+
});
|
|
20
|
+
expect(report).not.toHaveBeenCalled();
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("stamps the cloud's environment, release and tags and applies beforeReport last", async () => {
|
|
24
|
+
const beforeReport = vi.fn((report) => ({ ...report, model_id: "gpt" }));
|
|
25
|
+
const { cloud, report } = createCloud({
|
|
26
|
+
enabled: true,
|
|
27
|
+
environment: "production",
|
|
28
|
+
release: "1.2.3",
|
|
29
|
+
tags: ["web"],
|
|
30
|
+
beforeReport,
|
|
31
|
+
});
|
|
32
|
+
await new CloudRunReporter(cloud).report({
|
|
33
|
+
threadId: "thread_1",
|
|
34
|
+
status: "completed",
|
|
35
|
+
outputText: "hi",
|
|
36
|
+
});
|
|
37
|
+
expect(beforeReport).toHaveBeenCalledWith(
|
|
38
|
+
expect.objectContaining({
|
|
39
|
+
thread_id: "thread_1",
|
|
40
|
+
environment: "production",
|
|
41
|
+
release: "1.2.3",
|
|
42
|
+
tags: ["web"],
|
|
43
|
+
}),
|
|
44
|
+
);
|
|
45
|
+
expect(report).toHaveBeenCalledWith(
|
|
46
|
+
expect.objectContaining({ thread_id: "thread_1", model_id: "gpt" }),
|
|
47
|
+
);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("skips a report the hook vetoes without consuming its key", async () => {
|
|
51
|
+
const { cloud, report } = createCloud({
|
|
52
|
+
enabled: true,
|
|
53
|
+
beforeReport: vi
|
|
54
|
+
.fn()
|
|
55
|
+
.mockReturnValueOnce(null)
|
|
56
|
+
.mockImplementation((r) => r),
|
|
57
|
+
});
|
|
58
|
+
const reporter = new CloudRunReporter(cloud);
|
|
59
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
60
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
61
|
+
expect(report).toHaveBeenCalledOnce();
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("reports a keyed run once and an unkeyed run every time", async () => {
|
|
65
|
+
const { cloud, report } = createCloud({ enabled: true });
|
|
66
|
+
const reporter = new CloudRunReporter(cloud);
|
|
67
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
68
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
69
|
+
await reporter.report({ threadId: "t", status: "completed" });
|
|
70
|
+
await reporter.report({ threadId: "t", status: "completed" });
|
|
71
|
+
expect(report).toHaveBeenCalledTimes(3);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("allows a keyed run to retry after rate limiting", async () => {
|
|
75
|
+
const { cloud, report } = createCloud({ enabled: true });
|
|
76
|
+
report.mockRejectedValueOnce(new CloudAPIError("rate limited", 429));
|
|
77
|
+
const reporter = new CloudRunReporter(cloud);
|
|
78
|
+
|
|
79
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
80
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
81
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
82
|
+
|
|
83
|
+
expect(report).toHaveBeenCalledTimes(2);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it.each([
|
|
87
|
+
["a transport failure", new Error("offline")],
|
|
88
|
+
["a request timeout", new CloudAPIError("timeout", 408)],
|
|
89
|
+
["a server error", new CloudAPIError("unavailable", 503)],
|
|
90
|
+
[
|
|
91
|
+
"a successful response with an invalid body",
|
|
92
|
+
new CloudResponseError("invalid response"),
|
|
93
|
+
],
|
|
94
|
+
["a successful response with invalid JSON", new SyntaxError("invalid")],
|
|
95
|
+
["a permanent client error", new CloudAPIError("invalid report", 400)],
|
|
96
|
+
])("does not retry after %s", async (_name, error) => {
|
|
97
|
+
const { cloud, report } = createCloud({ enabled: true });
|
|
98
|
+
report.mockRejectedValueOnce(error);
|
|
99
|
+
const reporter = new CloudRunReporter(cloud);
|
|
100
|
+
|
|
101
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
102
|
+
await reporter.report({ threadId: "t", status: "completed" }, "t:m");
|
|
103
|
+
|
|
104
|
+
expect(report).toHaveBeenCalledOnce();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("swallows a failed send and reads the cloud through a getter", async () => {
|
|
108
|
+
const { cloud } = createCloud({ enabled: true });
|
|
109
|
+
(cloud.runs.report as ReturnType<typeof vi.fn>).mockRejectedValue(
|
|
110
|
+
new Error("offline"),
|
|
111
|
+
);
|
|
112
|
+
await expect(
|
|
113
|
+
new CloudRunReporter(() => cloud).report({
|
|
114
|
+
threadId: "t",
|
|
115
|
+
status: "error",
|
|
116
|
+
}),
|
|
117
|
+
).resolves.toBeUndefined();
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("resolves when the hook throws and reports nothing", async () => {
|
|
121
|
+
const { cloud, report } = createCloud({
|
|
122
|
+
enabled: true,
|
|
123
|
+
beforeReport: () => {
|
|
124
|
+
throw new Error("hook");
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
await expect(
|
|
128
|
+
new CloudRunReporter(cloud).report({
|
|
129
|
+
threadId: "t",
|
|
130
|
+
status: "completed",
|
|
131
|
+
}),
|
|
132
|
+
).resolves.toBeUndefined();
|
|
133
|
+
expect(report).not.toHaveBeenCalled();
|
|
134
|
+
});
|
|
135
|
+
});
|
package/src/version.ts
ADDED