Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ const stream = client.stream({
query: 'MacBook Neo',
filter: 'frandroid.com',
markdown: true,
style: 'editorial',
language: 'fr',
});

Expand Down Expand Up @@ -113,7 +112,6 @@ Returns a `StreamHandle`:
| `sources` | `{ sources: AnswerV2Source[] }` |
| `assistant` | `{ delta: string }` |
| `citation` | `{ reference_ids: number[] }` |
| `usages` | `{ usages: AnswerV2UsageEntry[] }` |
| `related` | `{ related_queries: string[] }` |
| `done` | `{ finish_reason: string }` |

Expand Down
2 changes: 0 additions & 2 deletions examples/basic-create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ try {
filter: 'frandroid.com',
markdown: true,
related_queries: true,
style: 'editorial',
language: 'fr',
});

Expand All @@ -40,7 +39,6 @@ try {
console.log(` [${u.step}] in: ${u.input_tokens}, out: ${u.output_tokens}`);
}
}
console.log(`\ngeneration_ms: ${result.generation_ms}`);
} catch (err) {
if (err instanceof AnswerApiError) {
console.error(`API error ${err.status}:`, err.body);
Expand Down
6 changes: 0 additions & 6 deletions examples/stream-events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ const stream = client.stream({
filter: 'frandroid.com',
markdown: true,
related_queries: true,
style: 'editorial',
language: 'fr',
});

Expand All @@ -40,11 +39,6 @@ try {
case 'related':
console.error('\n[related]', event.related_queries.join(' | '));
break;
case 'usages':
for (const u of event.usages) {
console.error(`\n[usage] ${u.step} — in: ${u.input_tokens}, out: ${u.output_tokens}`);
}
break;
case 'done':
console.error(`\n[done] finish_reason: ${event.finish_reason}`);
break;
Expand Down
11 changes: 6 additions & 5 deletions src/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,18 +49,16 @@ const MOCK_RESULT: AnswerV2Result = {
request_id: 'req_42',
answer: 'Paris is the capital of France.',
citations: [{ position: 0, source_id: 'src_1' }],
finish_reason: 'stop',
related_queries: ['What is the population of Paris?'],
sources: [{ id: 'src_1', url: 'https://example.com', title: 'Example' }],
usages: [{ step: 'answer', input_tokens: 10, output_tokens: 20 }],
generation_ms: 350,
};

const STREAM_CHUNKS = [
sseChunk('sources', [{ id: 'src_1', url: 'https://example.com', title: 'Example' }]),
sseChunk('assistant', 'Paris'),
sseChunk('citation', { reference_ids: [1] }),
sseChunk('usages', [{ step: 'answer', input_tokens: 10, output_tokens: 20 }]),
sseChunk('related', { related_queries: ['What is the population of Paris?'] }),
sseChunk('done', { finish_reason: 'stop' }),
];

Expand Down Expand Up @@ -176,7 +174,10 @@ describe('AnswerClient.stream()', () => {
expect(events[0]).toMatchObject({ type: 'sources' });
expect(events[1]).toEqual({ type: 'assistant', delta: 'Paris' });
expect(events[2]).toEqual({ type: 'citation', reference_ids: [1] });
expect(events[3]).toMatchObject({ type: 'usages' });
expect(events[3]).toEqual({
type: 'related',
related_queries: ['What is the population of Paris?'],
});
expect(events[4]).toEqual({ type: 'done', finish_reason: 'stop' });
});

Expand All @@ -199,7 +200,7 @@ describe('AnswerClient.stream()', () => {
}

expect(callbackEvents).toEqual(forAwaitEvents);
expect(callbackEvents).toEqual(['sources', 'assistant', 'citation', 'usages', 'done']);
expect(callbackEvents).toEqual(['sources', 'assistant', 'citation', 'related', 'done']);
});

it('onEvent() unsubscribe prevents further callbacks', async () => {
Expand Down
4 changes: 1 addition & 3 deletions src/sse.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { AnswerV2Event, AnswerV2Source, AnswerV2UsageEntry } from './types.js';
import type { AnswerV2Event, AnswerV2Source } from './types.js';
import { AnswerNetworkError } from './errors.js';

// ─── SSE block parser ─────────────────────────────────────────────────────────
Expand Down Expand Up @@ -38,8 +38,6 @@ export function mapSseEvent(name: string, data: unknown): AnswerV2Event | null {
type: 'citation',
reference_ids: (data as { reference_ids: number[] }).reference_ids,
};
case 'usages':
return { type: 'usages', usages: data as AnswerV2UsageEntry[] };
case 'related':
return {
type: 'related',
Expand Down
13 changes: 4 additions & 9 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,21 @@
export type AnswerV2Input = {
/** User question (required). */
query: string;
/** Domain filter for search — e.g. `'www.example.com'`. */
/** Canonical domain filter for search, without www or URL scheme — e.g. `'example.com'`. */
filter?: string;
/** Conversation history (max 20 messages). */
history?: Array<{ role: 'user' | 'assistant'; content: string }>;
/** Response length. Default: `'short'`. */
mode?: 'short' | 'long';
/** Answer style. Default: `'editorial'`. Currently only `'editorial'` is supported. */
style?: 'editorial';
/** Answer language. MVP: French only. Default: `'fr'`. */
language?: 'fr';
/** Answer language. Default: `'fr'`. */
language?: 'fr' | 'en';
/** Whether the response uses Markdown formatting. Default: `false`. */
markdown?: boolean;
/** Whether to generate related follow-up questions. Default: `false`. */
related_queries?: boolean;
/** Whether to rewrite the query before search. Default: `true`. */
query_rewrite?: boolean;
/** Caller-supplied sources — bypasses Bloom search when provided. Max 20. */
/** Caller-supplied sources — bypasses Bloom search when provided. Max 10. */
sources?: Array<{ url?: string; content?: string; title?: string }>;
/** How to handle caller-supplied sources. Default: `'search'`. */
sources_mode?: 'search' | 'context';
Expand Down Expand Up @@ -48,11 +46,9 @@ export type AnswerV2Result = {
request_id: string;
answer: string;
citations: AnswerV2Citation[];
finish_reason: string;
related_queries: string[];
sources: AnswerV2Source[];
usages: AnswerV2UsageEntry[];
generation_ms: number;
};

// ─── Stream events ────────────────────────────────────────────────────────────
Expand All @@ -61,7 +57,6 @@ export type AnswerV2Event =
| { type: 'sources'; sources: AnswerV2Source[] }
| { type: 'assistant'; delta: string }
| { type: 'citation'; reference_ids: number[] }
| { type: 'usages'; usages: AnswerV2UsageEntry[] }
| { type: 'related'; related_queries: string[] }
| { type: 'done'; finish_reason: string };

Expand Down
Loading