@gns-foundation/hive-worker 0.1.1 → 0.1.3
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/dist/executor.d.ts +1 -1
- package/dist/executor.js +28 -2
- package/dist/executor.js.map +1 -1
- package/dist/jobs.d.ts +7 -2
- package/dist/jobs.js +22 -3
- package/dist/jobs.js.map +1 -1
- package/package.json +1 -1
- package/src/executor.ts +28 -3
- package/src/jobs.ts +38 -5
package/dist/executor.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface ExecutorOptions {
|
|
|
9
9
|
onToken?: (token: string) => void;
|
|
10
10
|
onLog?: (line: string) => void;
|
|
11
11
|
}
|
|
12
|
-
export declare function executeJob(job: HiveJob,
|
|
12
|
+
export declare function executeJob(job: HiveJob, onTokenOrOpts?: ((t: string) => void) | ExecutorOptions): Promise<JobResult>;
|
|
13
13
|
export declare function listCachedModels(): Array<{
|
|
14
14
|
modelId: string;
|
|
15
15
|
sizeMb: number;
|
package/dist/executor.js
CHANGED
|
@@ -93,7 +93,10 @@ export async function downloadModel(modelId, url, onProgress) {
|
|
|
93
93
|
fs.renameSync(tmpDest, dest);
|
|
94
94
|
return dest;
|
|
95
95
|
}
|
|
96
|
-
export async function executeJob(job,
|
|
96
|
+
export async function executeJob(job, onTokenOrOpts = {}) {
|
|
97
|
+
const opts = typeof onTokenOrOpts === 'function'
|
|
98
|
+
? { onToken: onTokenOrOpts }
|
|
99
|
+
: onTokenOrOpts;
|
|
97
100
|
const llamaCli = findLlamaCli();
|
|
98
101
|
if (!llamaCli) {
|
|
99
102
|
throw new Error('llama-cli not found. Install llama.cpp: https://github.com/ggerganov/llama.cpp');
|
|
@@ -126,7 +129,30 @@ function runLlamaCli(binary, modelPath, job, opts) {
|
|
|
126
129
|
});
|
|
127
130
|
let stdout = '';
|
|
128
131
|
let stderr = '';
|
|
129
|
-
|
|
132
|
+
let streamBuffer = ''; // buffer for <|assistant|> detection before streaming
|
|
133
|
+
let streamingStarted = false;
|
|
134
|
+
proc.stdout.on('data', (chunk) => {
|
|
135
|
+
const text = chunk.toString();
|
|
136
|
+
stdout += text;
|
|
137
|
+
// Stream tokens to caller once we've passed the <|assistant|> marker
|
|
138
|
+
if (opts.onToken) {
|
|
139
|
+
if (!streamingStarted) {
|
|
140
|
+
streamBuffer += text;
|
|
141
|
+
const markerIdx = streamBuffer.lastIndexOf('<|assistant|>');
|
|
142
|
+
if (markerIdx !== -1) {
|
|
143
|
+
// Found marker — emit everything after it
|
|
144
|
+
streamingStarted = true;
|
|
145
|
+
const afterMarker = streamBuffer.slice(markerIdx + '<|assistant|>'.length);
|
|
146
|
+
if (afterMarker.length > 0)
|
|
147
|
+
opts.onToken(afterMarker);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
// Already past marker — emit each chunk immediately
|
|
152
|
+
opts.onToken(text);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
});
|
|
130
156
|
proc.stderr.on('data', (chunk) => {
|
|
131
157
|
stderr += chunk.toString();
|
|
132
158
|
opts.onLog?.(chunk.toString().slice(0, 60).trim());
|
package/dist/executor.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/dist/jobs.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface HiveJob {
|
|
|
23
23
|
submitter_pk: string;
|
|
24
24
|
created_at: string;
|
|
25
25
|
timeout_at: string;
|
|
26
|
+
streaming: boolean;
|
|
27
|
+
chunks_count: number | null;
|
|
26
28
|
}
|
|
27
29
|
export interface JobResult {
|
|
28
30
|
resultText: string;
|
|
@@ -32,7 +34,10 @@ export interface JobResult {
|
|
|
32
34
|
}
|
|
33
35
|
export declare function claimJob(workerPk: string, h3Cell: string, modelId?: string): Promise<HiveJob | null>;
|
|
34
36
|
export declare function markComputing(jobId: string): Promise<void>;
|
|
35
|
-
export declare function postResult(jobId: string, result: JobResult
|
|
37
|
+
export declare function postResult(jobId: string, result: JobResult & {
|
|
38
|
+
chunksCount?: number;
|
|
39
|
+
}): Promise<void>;
|
|
40
|
+
export declare function postChunk(jobId: string, chunkIndex: number, content: string): Promise<void>;
|
|
36
41
|
export declare function postFailure(jobId: string, errorMsg: string): Promise<void>;
|
|
37
42
|
export declare function cleanupTimedOutJobs(): Promise<void>;
|
|
38
43
|
export declare function fetchJob(jobId: string): Promise<HiveJob | null>;
|
|
@@ -49,5 +54,5 @@ export declare function startJobPoller(opts: {
|
|
|
49
54
|
onJobCompleted: (job: HiveJob, result: JobResult) => void;
|
|
50
55
|
onJobFailed: (job: HiveJob, error: string) => void;
|
|
51
56
|
onLog: (msg: string) => void;
|
|
52
|
-
executor: (job: HiveJob) => Promise<JobResult>;
|
|
57
|
+
executor: (job: HiveJob, onToken?: (t: string) => void) => Promise<JobResult>;
|
|
53
58
|
}): PollController;
|
package/dist/jobs.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// SKIP LOCKED (Postgres handles races — no app-level locking needed)
|
|
5
5
|
// ============================================================
|
|
6
6
|
const SUPABASE_URL = 'https://kaqwkxfaclyqjlfhxrmt.supabase.co';
|
|
7
|
-
const SUPABASE_ANON = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
|
|
7
|
+
const SUPABASE_ANON = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImthcXdreGZhY2x5cWpsZmh4cm10Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDA3NTE1NjEsImV4cCI6MjA1NjMyNzU2MX0.ClyWNGRxQjpKYzIROPZBqTXDsWvJioGe9pQymDOYBTc';
|
|
8
8
|
const HEADERS = {
|
|
9
9
|
'apikey': SUPABASE_ANON,
|
|
10
10
|
'Authorization': `Bearer ${SUPABASE_ANON}`,
|
|
@@ -39,10 +39,23 @@ export async function postResult(jobId, result) {
|
|
|
39
39
|
result_text: result.resultText,
|
|
40
40
|
tokens_generated: result.tokensGenerated,
|
|
41
41
|
tokens_per_second: result.tokensPerSecond,
|
|
42
|
+
chunks_count: result.chunksCount ?? null,
|
|
42
43
|
completed_at: new Date().toISOString(),
|
|
43
44
|
error_message: null,
|
|
44
45
|
});
|
|
45
46
|
}
|
|
47
|
+
// ─── Post chunk (streaming) ──────────────────────────────────
|
|
48
|
+
export async function postChunk(jobId, chunkIndex, content) {
|
|
49
|
+
const resp = await fetch(`${SUPABASE_URL}/rest/v1/hive_job_chunks`, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
headers: { ...HEADERS, 'Prefer': 'return=minimal' },
|
|
52
|
+
body: JSON.stringify({ job_id: jobId, chunk_index: chunkIndex, content }),
|
|
53
|
+
});
|
|
54
|
+
if (!resp.ok && resp.status !== 201 && resp.status !== 204) {
|
|
55
|
+
// Non-fatal — log but don't throw (batch result will still arrive)
|
|
56
|
+
console.error(`postChunk failed: ${resp.status}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
46
59
|
// ─── Post failure ─────────────────────────────────────────────
|
|
47
60
|
export async function postFailure(jobId, errorMsg) {
|
|
48
61
|
await patchJob(jobId, {
|
|
@@ -103,8 +116,14 @@ export function startJobPoller(opts) {
|
|
|
103
116
|
opts.onJobClaimed(job);
|
|
104
117
|
try {
|
|
105
118
|
await markComputing(job.id);
|
|
106
|
-
|
|
107
|
-
|
|
119
|
+
let chunkIndex = 0;
|
|
120
|
+
const onToken = job.streaming
|
|
121
|
+
? async (token) => {
|
|
122
|
+
await postChunk(job.id, chunkIndex++, token).catch(() => { });
|
|
123
|
+
}
|
|
124
|
+
: undefined;
|
|
125
|
+
const result = await opts.executor(job, onToken);
|
|
126
|
+
await postResult(job.id, { ...result, chunksCount: chunkIndex });
|
|
108
127
|
opts.onJobCompleted(job, result);
|
|
109
128
|
}
|
|
110
129
|
catch (execErr) {
|
package/dist/jobs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,0BAA0B;AAC1B,2DAA2D;AAC3D,qEAAqE;AACrE,+DAA+D;AAE/D,MAAM,YAAY,GAAG,0CAA0C,CAAC;AAChE,MAAM,aAAa,GAAG,kNAAkN,CAAC;AAEzO,MAAM,OAAO,GAAG;IACd,QAAQ,EAAE,aAAa;IACvB,eAAe,EAAE,UAAU,aAAa,EAAE;IAC1C,cAAc,EAAE,kBAAkB;CACnC,CAAC;
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/executor.ts
CHANGED
|
@@ -131,8 +131,11 @@ export interface ExecutorOptions {
|
|
|
131
131
|
|
|
132
132
|
export async function executeJob(
|
|
133
133
|
job: HiveJob,
|
|
134
|
-
|
|
134
|
+
onTokenOrOpts: ((t: string) => void) | ExecutorOptions = {},
|
|
135
135
|
): Promise<JobResult> {
|
|
136
|
+
const opts: ExecutorOptions = typeof onTokenOrOpts === 'function'
|
|
137
|
+
? { onToken: onTokenOrOpts }
|
|
138
|
+
: onTokenOrOpts;
|
|
136
139
|
const llamaCli = findLlamaCli();
|
|
137
140
|
if (!llamaCli) {
|
|
138
141
|
throw new Error(
|
|
@@ -181,8 +184,30 @@ function runLlamaCli(
|
|
|
181
184
|
|
|
182
185
|
let stdout = '';
|
|
183
186
|
let stderr = '';
|
|
184
|
-
|
|
185
|
-
|
|
187
|
+
let streamBuffer = ''; // buffer for <|assistant|> detection before streaming
|
|
188
|
+
let streamingStarted = false;
|
|
189
|
+
|
|
190
|
+
proc.stdout.on('data', (chunk: Buffer) => {
|
|
191
|
+
const text = chunk.toString();
|
|
192
|
+
stdout += text;
|
|
193
|
+
|
|
194
|
+
// Stream tokens to caller once we've passed the <|assistant|> marker
|
|
195
|
+
if (opts.onToken) {
|
|
196
|
+
if (!streamingStarted) {
|
|
197
|
+
streamBuffer += text;
|
|
198
|
+
const markerIdx = streamBuffer.lastIndexOf('<|assistant|>');
|
|
199
|
+
if (markerIdx !== -1) {
|
|
200
|
+
// Found marker — emit everything after it
|
|
201
|
+
streamingStarted = true;
|
|
202
|
+
const afterMarker = streamBuffer.slice(markerIdx + '<|assistant|>'.length);
|
|
203
|
+
if (afterMarker.length > 0) opts.onToken(afterMarker);
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
// Already past marker — emit each chunk immediately
|
|
207
|
+
opts.onToken(text);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
});
|
|
186
211
|
proc.stderr.on('data', (chunk: Buffer) => {
|
|
187
212
|
stderr += chunk.toString();
|
|
188
213
|
opts.onLog?.(chunk.toString().slice(0, 60).trim());
|
package/src/jobs.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
// ============================================================
|
|
6
6
|
|
|
7
7
|
const SUPABASE_URL = 'https://kaqwkxfaclyqjlfhxrmt.supabase.co';
|
|
8
|
-
const SUPABASE_ANON = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
|
|
8
|
+
const SUPABASE_ANON = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImthcXdreGZhY2x5cWpsZmh4cm10Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NDA3NTE1NjEsImV4cCI6MjA1NjMyNzU2MX0.ClyWNGRxQjpKYzIROPZBqTXDsWvJioGe9pQymDOYBTc';
|
|
9
9
|
|
|
10
10
|
const HEADERS = {
|
|
11
11
|
'apikey': SUPABASE_ANON,
|
|
@@ -40,6 +40,8 @@ export interface HiveJob {
|
|
|
40
40
|
submitter_pk: string;
|
|
41
41
|
created_at: string;
|
|
42
42
|
timeout_at: string;
|
|
43
|
+
streaming: boolean;
|
|
44
|
+
chunks_count: number | null;
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
export interface JobResult {
|
|
@@ -86,17 +88,42 @@ export async function markComputing(jobId: string): Promise<void> {
|
|
|
86
88
|
|
|
87
89
|
// ─── Post result ──────────────────────────────────────────────
|
|
88
90
|
|
|
89
|
-
export async function postResult(
|
|
91
|
+
export async function postResult(
|
|
92
|
+
jobId: string,
|
|
93
|
+
result: JobResult & { chunksCount?: number },
|
|
94
|
+
): Promise<void> {
|
|
90
95
|
await patchJob(jobId, {
|
|
91
96
|
status: 'completed',
|
|
92
97
|
result_text: result.resultText,
|
|
93
98
|
tokens_generated: result.tokensGenerated,
|
|
94
99
|
tokens_per_second: result.tokensPerSecond,
|
|
100
|
+
chunks_count: result.chunksCount ?? null,
|
|
95
101
|
completed_at: new Date().toISOString(),
|
|
96
102
|
error_message: null,
|
|
97
103
|
});
|
|
98
104
|
}
|
|
99
105
|
|
|
106
|
+
// ─── Post chunk (streaming) ──────────────────────────────────
|
|
107
|
+
|
|
108
|
+
export async function postChunk(
|
|
109
|
+
jobId: string,
|
|
110
|
+
chunkIndex: number,
|
|
111
|
+
content: string,
|
|
112
|
+
): Promise<void> {
|
|
113
|
+
const resp = await fetch(
|
|
114
|
+
`${SUPABASE_URL}/rest/v1/hive_job_chunks`,
|
|
115
|
+
{
|
|
116
|
+
method: 'POST',
|
|
117
|
+
headers: { ...HEADERS, 'Prefer': 'return=minimal' },
|
|
118
|
+
body: JSON.stringify({ job_id: jobId, chunk_index: chunkIndex, content }),
|
|
119
|
+
},
|
|
120
|
+
);
|
|
121
|
+
if (!resp.ok && resp.status !== 201 && resp.status !== 204) {
|
|
122
|
+
// Non-fatal — log but don't throw (batch result will still arrive)
|
|
123
|
+
console.error(`postChunk failed: ${resp.status}`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
100
127
|
// ─── Post failure ─────────────────────────────────────────────
|
|
101
128
|
|
|
102
129
|
export async function postFailure(jobId: string, errorMsg: string): Promise<void> {
|
|
@@ -177,7 +204,7 @@ export function startJobPoller(opts: {
|
|
|
177
204
|
onJobCompleted: (job: HiveJob, result: JobResult) => void;
|
|
178
205
|
onJobFailed: (job: HiveJob, error: string) => void;
|
|
179
206
|
onLog: (msg: string) => void;
|
|
180
|
-
executor: (job: HiveJob) => Promise<JobResult>;
|
|
207
|
+
executor: (job: HiveJob, onToken?: (t: string) => void) => Promise<JobResult>;
|
|
181
208
|
}): PollController {
|
|
182
209
|
let running = true;
|
|
183
210
|
let busy = false;
|
|
@@ -199,9 +226,15 @@ export function startJobPoller(opts: {
|
|
|
199
226
|
try {
|
|
200
227
|
await markComputing(job.id);
|
|
201
228
|
|
|
202
|
-
|
|
229
|
+
let chunkIndex = 0;
|
|
230
|
+
const onToken = job.streaming
|
|
231
|
+
? async (token: string) => {
|
|
232
|
+
await postChunk(job.id, chunkIndex++, token).catch(() => {});
|
|
233
|
+
}
|
|
234
|
+
: undefined;
|
|
235
|
+
const result = await opts.executor(job, onToken);
|
|
203
236
|
|
|
204
|
-
await postResult(job.id, result);
|
|
237
|
+
await postResult(job.id, { ...result, chunksCount: chunkIndex });
|
|
205
238
|
opts.onJobCompleted(job, result);
|
|
206
239
|
} catch (execErr) {
|
|
207
240
|
const errMsg = execErr instanceof Error ? execErr.message : String(execErr);
|