rd-mini-browser 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -0
- package/dist/index.d.ts +147 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +183 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Raindrop Browser SDK
|
|
2
|
+
|
|
3
|
+
Lightweight client-side SDK for AI observability.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @raindrop/browser
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { RaindropBrowser } from "@raindrop/browser";
|
|
15
|
+
|
|
16
|
+
const raindrop = new RaindropBrowser({
|
|
17
|
+
apiKey: "your-api-key",
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Identify user
|
|
21
|
+
raindrop.identify("user-123", {
|
|
22
|
+
name: "John Doe",
|
|
23
|
+
email: "john@example.com",
|
|
24
|
+
plan: "pro",
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
// Send feedback on AI responses
|
|
28
|
+
raindrop.feedback(traceId, {
|
|
29
|
+
type: "thumbs_up",
|
|
30
|
+
comment: "Great response!",
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Or with numeric score
|
|
34
|
+
raindrop.feedback(traceId, {
|
|
35
|
+
score: 0.8,
|
|
36
|
+
comment: "Mostly accurate",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Track custom events
|
|
40
|
+
raindrop.track("chat_started", {
|
|
41
|
+
properties: {
|
|
42
|
+
source: "homepage",
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
### `new RaindropBrowser(config)`
|
|
50
|
+
|
|
51
|
+
- `apiKey` (required): Your Raindrop API key
|
|
52
|
+
- `baseUrl` (optional): API base URL (default: `https://api.raindrop.ai`)
|
|
53
|
+
- `debug` (optional): Enable debug logging
|
|
54
|
+
|
|
55
|
+
### `identify(userId, traits?)`
|
|
56
|
+
|
|
57
|
+
Identify a user for all subsequent calls.
|
|
58
|
+
|
|
59
|
+
### `feedback(traceId, options)`
|
|
60
|
+
|
|
61
|
+
Send feedback for a specific AI trace.
|
|
62
|
+
|
|
63
|
+
Options:
|
|
64
|
+
- `type`: `"thumbs_up"` | `"thumbs_down"`
|
|
65
|
+
- `score`: `0-1` numeric score
|
|
66
|
+
- `comment`: Text feedback
|
|
67
|
+
- `signalType`: `"default"` | `"feedback"` | `"edit"`
|
|
68
|
+
- `properties`: Additional properties
|
|
69
|
+
|
|
70
|
+
### `track(event, options?)`
|
|
71
|
+
|
|
72
|
+
Track a custom event.
|
|
73
|
+
|
|
74
|
+
### `flush()`
|
|
75
|
+
|
|
76
|
+
Manually flush pending events (called automatically on page unload).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raindrop Browser SDK
|
|
3
|
+
*
|
|
4
|
+
* Lightweight client-side SDK for AI observability.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* const raindrop = new Raindrop({ apiKey: "..." });
|
|
8
|
+
*
|
|
9
|
+
* // Single-shot AI event
|
|
10
|
+
* const { eventIds } = await raindrop.trackAi({
|
|
11
|
+
* event: "chat",
|
|
12
|
+
* userId: "user_123",
|
|
13
|
+
* model: "gpt-4o",
|
|
14
|
+
* input: "hello",
|
|
15
|
+
* output: "hi there",
|
|
16
|
+
* });
|
|
17
|
+
*
|
|
18
|
+
* // Partial AI event (streaming)
|
|
19
|
+
* const partial = await raindrop.trackAiPartial({
|
|
20
|
+
* eventId: "evt_123",
|
|
21
|
+
* event: "chat",
|
|
22
|
+
* userId: "user_123",
|
|
23
|
+
* model: "gpt-4o",
|
|
24
|
+
* });
|
|
25
|
+
* await partial.finish({ output: "final response" });
|
|
26
|
+
*/
|
|
27
|
+
export interface RaindropConfig {
|
|
28
|
+
apiKey: string;
|
|
29
|
+
baseUrl?: string;
|
|
30
|
+
debug?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export interface UserTraits {
|
|
33
|
+
name?: string;
|
|
34
|
+
email?: string;
|
|
35
|
+
plan?: string;
|
|
36
|
+
[key: string]: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface Attachment {
|
|
39
|
+
type: "code" | "text" | "image" | "iframe";
|
|
40
|
+
name?: string;
|
|
41
|
+
value: string;
|
|
42
|
+
role: "input" | "output";
|
|
43
|
+
language?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface TrackAiOptions {
|
|
46
|
+
event: string;
|
|
47
|
+
userId?: string;
|
|
48
|
+
eventId?: string;
|
|
49
|
+
model?: string;
|
|
50
|
+
input?: string;
|
|
51
|
+
output?: string;
|
|
52
|
+
convoId?: string;
|
|
53
|
+
properties?: Record<string, unknown>;
|
|
54
|
+
attachments?: Attachment[];
|
|
55
|
+
}
|
|
56
|
+
export interface TrackAiPartialOptions {
|
|
57
|
+
eventId: string;
|
|
58
|
+
event?: string;
|
|
59
|
+
userId?: string;
|
|
60
|
+
model?: string;
|
|
61
|
+
input?: string;
|
|
62
|
+
output?: string;
|
|
63
|
+
convoId?: string;
|
|
64
|
+
properties?: Record<string, unknown>;
|
|
65
|
+
attachments?: Attachment[];
|
|
66
|
+
}
|
|
67
|
+
export interface PartialEvent {
|
|
68
|
+
eventId: string;
|
|
69
|
+
finish: (options?: {
|
|
70
|
+
output?: string;
|
|
71
|
+
properties?: Record<string, unknown>;
|
|
72
|
+
}) => Promise<{
|
|
73
|
+
success: boolean;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
export interface SignalOptions {
|
|
77
|
+
eventId: string;
|
|
78
|
+
name: string;
|
|
79
|
+
type?: "default" | "feedback" | "edit";
|
|
80
|
+
sentiment?: "POSITIVE" | "NEGATIVE";
|
|
81
|
+
comment?: string;
|
|
82
|
+
after?: string;
|
|
83
|
+
attachmentId?: string;
|
|
84
|
+
properties?: Record<string, unknown>;
|
|
85
|
+
}
|
|
86
|
+
export interface FeedbackOptions {
|
|
87
|
+
type?: "thumbs_up" | "thumbs_down";
|
|
88
|
+
score?: number;
|
|
89
|
+
comment?: string;
|
|
90
|
+
signalType?: "default" | "feedback" | "edit" | "standard";
|
|
91
|
+
properties?: Record<string, unknown>;
|
|
92
|
+
}
|
|
93
|
+
export interface IdentifyOptions {
|
|
94
|
+
userId: string;
|
|
95
|
+
traits?: UserTraits;
|
|
96
|
+
}
|
|
97
|
+
export declare class Raindrop {
|
|
98
|
+
private apiKey;
|
|
99
|
+
private baseUrl;
|
|
100
|
+
private debug;
|
|
101
|
+
private currentUserId;
|
|
102
|
+
private partialEvents;
|
|
103
|
+
constructor(config: RaindropConfig);
|
|
104
|
+
/**
|
|
105
|
+
* Identify a user for all subsequent calls.
|
|
106
|
+
*/
|
|
107
|
+
identify(options: IdentifyOptions | IdentifyOptions[]): Promise<{
|
|
108
|
+
success: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
/**
|
|
111
|
+
* Track a single-shot AI event.
|
|
112
|
+
*/
|
|
113
|
+
trackAi(options: TrackAiOptions): Promise<{
|
|
114
|
+
eventIds: string[];
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* Start a partial AI event (for streaming or multi-turn).
|
|
118
|
+
* Returns an object with finish() to complete the event.
|
|
119
|
+
*/
|
|
120
|
+
trackAiPartial(options: TrackAiPartialOptions): Promise<PartialEvent>;
|
|
121
|
+
/**
|
|
122
|
+
* Finish a partial AI event.
|
|
123
|
+
*/
|
|
124
|
+
private finishPartial;
|
|
125
|
+
/**
|
|
126
|
+
* Track a signal (feedback, edit, etc.) on an AI event.
|
|
127
|
+
*/
|
|
128
|
+
trackSignal(options: SignalOptions): Promise<{
|
|
129
|
+
success: boolean;
|
|
130
|
+
}>;
|
|
131
|
+
/**
|
|
132
|
+
* Send feedback for a specific trace (convenience wrapper for trackSignal).
|
|
133
|
+
*/
|
|
134
|
+
feedback(traceId: string, options: FeedbackOptions): Promise<{
|
|
135
|
+
success: boolean;
|
|
136
|
+
}>;
|
|
137
|
+
/**
|
|
138
|
+
* Send data to the API.
|
|
139
|
+
*/
|
|
140
|
+
private send;
|
|
141
|
+
/**
|
|
142
|
+
* Generate a unique event ID.
|
|
143
|
+
*/
|
|
144
|
+
private generateId;
|
|
145
|
+
}
|
|
146
|
+
export default Raindrop;
|
|
147
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAChH;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,CAAC;IACvC,SAAS,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,WAAW,GAAG,aAAa,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,UAAU,CAAC;CACrB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,KAAK,CAAU;IACvB,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,aAAa,CAAiD;gBAE1D,MAAM,EAAE,cAAc;IAUlC;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,eAAe,GAAG,eAAe,EAAE,GAC3C,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAuBhC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA2BvE;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,CAAC;IAkC3E;;OAEG;YACW,aAAa;IAgD3B;;OAEG;IACG,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IAwBxE;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IA2BhC;;OAEG;YACW,IAAI;IAyBlB;;OAEG;IACH,OAAO,CAAC,UAAU;CAYnB;AAED,eAAe,QAAQ,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
class Raindrop {
|
|
3
|
+
apiKey;
|
|
4
|
+
baseUrl;
|
|
5
|
+
debug;
|
|
6
|
+
currentUserId = null;
|
|
7
|
+
partialEvents = new Map;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.apiKey = config.apiKey;
|
|
10
|
+
this.baseUrl = config.baseUrl || "https://api.raindrop.ai";
|
|
11
|
+
this.debug = config.debug || false;
|
|
12
|
+
if (this.debug) {
|
|
13
|
+
console.log("[raindrop] Browser SDK initialized");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async identify(options) {
|
|
17
|
+
const items = Array.isArray(options) ? options : [options];
|
|
18
|
+
for (const item of items) {
|
|
19
|
+
if (!this.currentUserId) {
|
|
20
|
+
this.currentUserId = item.userId;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
const payload = items.map((item) => ({
|
|
24
|
+
user_id: item.userId,
|
|
25
|
+
traits: item.traits || {}
|
|
26
|
+
}));
|
|
27
|
+
await this.send("/users/identify", payload);
|
|
28
|
+
if (this.debug) {
|
|
29
|
+
console.log(`[raindrop] Identified ${items.length} user(s)`);
|
|
30
|
+
}
|
|
31
|
+
return { success: true };
|
|
32
|
+
}
|
|
33
|
+
async trackAi(options) {
|
|
34
|
+
const eventId = options.eventId || this.generateId();
|
|
35
|
+
const event = {
|
|
36
|
+
event_id: eventId,
|
|
37
|
+
user_id: options.userId || this.currentUserId,
|
|
38
|
+
event: options.event,
|
|
39
|
+
timestamp: new Date().toISOString(),
|
|
40
|
+
properties: options.properties || {},
|
|
41
|
+
ai_data: {
|
|
42
|
+
model: options.model,
|
|
43
|
+
input: options.input,
|
|
44
|
+
output: options.output,
|
|
45
|
+
convo_id: options.convoId
|
|
46
|
+
},
|
|
47
|
+
...options.attachments && { attachments: options.attachments }
|
|
48
|
+
};
|
|
49
|
+
await this.send("/events/track", [event]);
|
|
50
|
+
if (this.debug) {
|
|
51
|
+
console.log(`[raindrop] AI event tracked: ${eventId}`);
|
|
52
|
+
}
|
|
53
|
+
return { eventIds: [eventId] };
|
|
54
|
+
}
|
|
55
|
+
async trackAiPartial(options) {
|
|
56
|
+
const existing = this.partialEvents.get(options.eventId);
|
|
57
|
+
if (existing) {
|
|
58
|
+
if (options.output) {
|
|
59
|
+
existing.output = (existing.output || "") + options.output;
|
|
60
|
+
}
|
|
61
|
+
if (options.properties) {
|
|
62
|
+
existing.properties = { ...existing.properties, ...options.properties };
|
|
63
|
+
}
|
|
64
|
+
if (options.attachments) {
|
|
65
|
+
existing.attachments = [
|
|
66
|
+
...existing.attachments || [],
|
|
67
|
+
...options.attachments
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
} else {
|
|
71
|
+
this.partialEvents.set(options.eventId, { ...options });
|
|
72
|
+
}
|
|
73
|
+
if (this.debug) {
|
|
74
|
+
console.log(`[raindrop] Partial event updated: ${options.eventId}`);
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
eventId: options.eventId,
|
|
78
|
+
finish: async (finishOptions) => {
|
|
79
|
+
return this.finishPartial(options.eventId, finishOptions);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async finishPartial(eventId, options) {
|
|
84
|
+
const partial = this.partialEvents.get(eventId);
|
|
85
|
+
if (!partial) {
|
|
86
|
+
if (this.debug) {
|
|
87
|
+
console.warn(`[raindrop] No partial event found: ${eventId}`);
|
|
88
|
+
}
|
|
89
|
+
return { success: false };
|
|
90
|
+
}
|
|
91
|
+
if (options?.output) {
|
|
92
|
+
partial.output = options.output;
|
|
93
|
+
}
|
|
94
|
+
if (options?.properties) {
|
|
95
|
+
partial.properties = { ...partial.properties, ...options.properties };
|
|
96
|
+
}
|
|
97
|
+
const event = {
|
|
98
|
+
event_id: eventId,
|
|
99
|
+
user_id: partial.userId || this.currentUserId,
|
|
100
|
+
event: partial.event || "ai_interaction",
|
|
101
|
+
timestamp: new Date().toISOString(),
|
|
102
|
+
properties: partial.properties || {},
|
|
103
|
+
ai_data: {
|
|
104
|
+
model: partial.model,
|
|
105
|
+
input: partial.input,
|
|
106
|
+
output: partial.output,
|
|
107
|
+
convo_id: partial.convoId
|
|
108
|
+
},
|
|
109
|
+
...partial.attachments && { attachments: partial.attachments }
|
|
110
|
+
};
|
|
111
|
+
await this.send("/events/track", [event]);
|
|
112
|
+
this.partialEvents.delete(eventId);
|
|
113
|
+
if (this.debug) {
|
|
114
|
+
console.log(`[raindrop] Partial event finished: ${eventId}`);
|
|
115
|
+
}
|
|
116
|
+
return { success: true };
|
|
117
|
+
}
|
|
118
|
+
async trackSignal(options) {
|
|
119
|
+
const signal = {
|
|
120
|
+
event_id: options.eventId,
|
|
121
|
+
signal_name: options.name,
|
|
122
|
+
signal_type: options.type || "default",
|
|
123
|
+
sentiment: options.sentiment || "NEGATIVE",
|
|
124
|
+
timestamp: new Date().toISOString(),
|
|
125
|
+
...options.attachmentId && { attachment_id: options.attachmentId },
|
|
126
|
+
properties: {
|
|
127
|
+
...options.comment && { comment: options.comment },
|
|
128
|
+
...options.after && { after: options.after },
|
|
129
|
+
...options.properties
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
await this.send("/signals/track", [signal]);
|
|
133
|
+
if (this.debug) {
|
|
134
|
+
console.log(`[raindrop] Signal tracked: ${options.name} on ${options.eventId}`);
|
|
135
|
+
}
|
|
136
|
+
return { success: true };
|
|
137
|
+
}
|
|
138
|
+
async feedback(traceId, options) {
|
|
139
|
+
const name = options.score !== undefined ? options.score >= 0.5 ? "thumbs_up" : "thumbs_down" : options.type || "thumbs_down";
|
|
140
|
+
const sentiment = options.score !== undefined ? options.score >= 0.5 ? "POSITIVE" : "NEGATIVE" : options.type === "thumbs_up" ? "POSITIVE" : "NEGATIVE";
|
|
141
|
+
return this.trackSignal({
|
|
142
|
+
eventId: traceId,
|
|
143
|
+
name,
|
|
144
|
+
type: options.signalType === "standard" ? "default" : options.signalType,
|
|
145
|
+
sentiment,
|
|
146
|
+
comment: options.comment,
|
|
147
|
+
properties: options.properties
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
async send(endpoint, data) {
|
|
151
|
+
const url = `${this.baseUrl}/v1${endpoint}`;
|
|
152
|
+
const body = JSON.stringify(data);
|
|
153
|
+
try {
|
|
154
|
+
const response = await fetch(url, {
|
|
155
|
+
method: "POST",
|
|
156
|
+
headers: {
|
|
157
|
+
"Content-Type": "application/json",
|
|
158
|
+
Authorization: `Bearer ${this.apiKey}`
|
|
159
|
+
},
|
|
160
|
+
body,
|
|
161
|
+
keepalive: true
|
|
162
|
+
});
|
|
163
|
+
if (!response.ok && this.debug) {
|
|
164
|
+
console.warn(`[raindrop] API error: ${response.status}`);
|
|
165
|
+
}
|
|
166
|
+
} catch (error) {
|
|
167
|
+
if (this.debug) {
|
|
168
|
+
console.error(`[raindrop] Failed to send:`, error);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
generateId() {
|
|
173
|
+
if (typeof crypto !== "undefined" && crypto.randomUUID) {
|
|
174
|
+
return crypto.randomUUID();
|
|
175
|
+
}
|
|
176
|
+
return "evt_" + Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
var src_default = Raindrop;
|
|
180
|
+
export {
|
|
181
|
+
src_default as default,
|
|
182
|
+
Raindrop
|
|
183
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "rd-mini-browser",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Raindrop browser SDK for client-side AI observability",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "bun build src/index.ts --outdir dist --target browser && tsc --emitDeclarationOnly",
|
|
20
|
+
"dev": "bun build src/index.ts --outdir dist --target browser --watch"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"raindrop",
|
|
24
|
+
"ai",
|
|
25
|
+
"observability",
|
|
26
|
+
"browser",
|
|
27
|
+
"analytics"
|
|
28
|
+
],
|
|
29
|
+
"author": "Raindrop",
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@types/bun": "latest",
|
|
33
|
+
"typescript": "^5.3.0"
|
|
34
|
+
}
|
|
35
|
+
}
|