htaf commited on
Commit
936c57a
·
1 Parent(s): 9145b80

added mock of llms and full pipeline test

Browse files
src/providers/mock_provider.mjs ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // src/providers/mock_provider.mjs
2
+ // Simple deterministic provider for tests and local dry-runs.
3
+ // Controlled via GENERATOR_PROVIDER/VERIFIER_PROVIDER/REWARD_PROVIDER/QUESTION_PROVIDER=mock
4
+ import { BaseProvider } from './base.mjs';
5
+
6
+ export class MockProvider extends BaseProvider {
7
+ constructor(stage = 'generator') {
8
+ super();
9
+ this.stage = stage;
10
+ }
11
+
12
+ async generate(prompt) {
13
+ switch (this.stage) {
14
+ case 'question':
15
+ // Return JSON so the question parser can pick it up directly
16
+ return JSON.stringify({
17
+ questions: [
18
+ 'What is the main idea?',
19
+ 'How does the text justify its claim?',
20
+ ],
21
+ });
22
+ case 'generator':
23
+ return `<think>mock reasoning</think>Here is a grounded answer.`;
24
+ case 'verifier':
25
+ return 'yes\nmock verifier rationale';
26
+ case 'reward':
27
+ return '0.9 good';
28
+ default:
29
+ return 'ok';
30
+ }
31
+ }
32
+ }
33
+
34
+ export default MockProvider;
src/providers/provider.mjs CHANGED
@@ -2,6 +2,7 @@
2
  import { OllamaProvider } from "./ollama_provider.mjs";
3
  import { OpenAIProvider } from "./openai_provider.mjs";
4
  import { HttpProvider } from "./http_provider.mjs";
 
5
 
6
  /**
7
  * Load provider for a specific pipeline stage:
@@ -16,6 +17,8 @@ export function loadProviderFor(stage) {
16
  const type = process.env[key] || process.env.PROVIDER_TYPE || "ollama";
17
 
18
  switch (type) {
 
 
19
  case "ollama":
20
  return new OllamaProvider(stage);
21
 
 
2
  import { OllamaProvider } from "./ollama_provider.mjs";
3
  import { OpenAIProvider } from "./openai_provider.mjs";
4
  import { HttpProvider } from "./http_provider.mjs";
5
+ import { MockProvider } from "./mock_provider.mjs";
6
 
7
  /**
8
  * Load provider for a specific pipeline stage:
 
17
  const type = process.env[key] || process.env.PROVIDER_TYPE || "ollama";
18
 
19
  switch (type) {
20
+ case "mock":
21
+ return new MockProvider(stage);
22
  case "ollama":
23
  return new OllamaProvider(stage);
24
 
tests/pipeline.full.mock.test.mjs ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import os from 'os';
3
+ import path from 'path';
4
+
5
+ /**
6
+ * Full pipeline test using mock providers + JSONL chunks.
7
+ * Ensures we can run a question-first batch without real LLMs or ES.
8
+ */
9
+ describe('full pipeline (mock providers)', () => {
10
+ beforeEach(() => {
11
+ vi.resetModules();
12
+ process.env.PIPELINE_CHUNK_SOURCE = 'jsonl';
13
+ process.env.GENERATOR_PROVIDER = 'mock';
14
+ process.env.VERIFIER_PROVIDER = 'mock';
15
+ process.env.REWARD_PROVIDER = 'mock';
16
+ process.env.QUESTION_PROVIDER = 'mock';
17
+ });
18
+
19
+ afterEach(() => {
20
+ delete process.env.PIPELINE_CHUNK_SOURCE;
21
+ delete process.env.GENERATOR_PROVIDER;
22
+ delete process.env.VERIFIER_PROVIDER;
23
+ delete process.env.REWARD_PROVIDER;
24
+ delete process.env.QUESTION_PROVIDER;
25
+ vi.restoreAllMocks();
26
+ vi.unmock('../src/retrieval/jsonl_chunks.mjs');
27
+ });
28
+
29
+ it('processes mock chunks end-to-end and writes accepted samples', async () => {
30
+ // Mock chunk loader to avoid filesystem dependency
31
+ vi.doMock('../src/retrieval/jsonl_chunks.mjs', () => ({
32
+ loadRagChunks: vi.fn(async () => [
33
+ { id: 'chunk-1', content: 'Mock content A' },
34
+ { id: 'chunk-2', content: 'Mock content B' },
35
+ ]),
36
+ }));
37
+
38
+ // Ensure no accidental ES calls
39
+ vi.doMock('../src/retrieval/retrieval.mjs', () => ({
40
+ fetchChunksFromIndex: vi.fn(),
41
+ }));
42
+
43
+ const { runPipelineBatch } = await import('../src/pipeline/batch.mjs');
44
+
45
+ const outPath = path.join(os.tmpdir(), `mock-pipeline-${Date.now()}.jsonl`);
46
+ const result = await runPipelineBatch({
47
+ seedMode: 'question-first',
48
+ limit: 3, // question cap
49
+ outPath,
50
+ verbose: false,
51
+ logger: { log() {}, error() {} },
52
+ });
53
+
54
+ expect(result.mode).toBe('question-first');
55
+ expect(result.processed).toBe(3);
56
+ expect(result.accepted).toBe(3);
57
+ expect(result.statusCounts.accepted).toBe(3);
58
+ });
59
+ });