@theokit/sdk 1.9.0 → 2.0.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/CHANGELOG.md +14 -1
- package/package.json +1 -11
- package/dist/rag/index.cjs +0 -136
- package/dist/rag/index.cjs.map +0 -1
- package/dist/rag/index.d.cts +0 -11
- package/dist/rag/index.d.ts +0 -11
- package/dist/rag/index.js +0 -129
- package/dist/rag/index.js.map +0 -1
- package/dist/rag/reranker.d.cts +0 -26
- package/dist/rag/reranker.d.ts +0 -26
- package/dist/rag/retriever.d.cts +0 -25
- package/dist/rag/retriever.d.ts +0 -25
- package/dist/rag/text-splitter.d.cts +0 -12
- package/dist/rag/text-splitter.d.ts +0 -12
- package/dist/rag/types.d.cts +0 -37
- package/dist/rag/types.d.ts +0 -37
- package/dist/voice/index.d.ts +0 -7
- package/dist/voice/openai-realtime.d.ts +0 -21
- package/dist/voice/types.d.ts +0 -35
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.0.0
|
|
4
|
+
|
|
5
|
+
### Major Changes
|
|
6
|
+
|
|
7
|
+
- b9f30a6: Carve the non-Harness surface out of `@theokit/sdk` (plan `monorepo-cohesion-split`). The SDK now ships only the Agent-AI Harness.
|
|
8
|
+
|
|
9
|
+
BREAKING (no retro-compat, authorized):
|
|
10
|
+
|
|
11
|
+
- Removed the `@theokit/sdk/rag` sub-path export and the embedded `voice` module — they moved to standalone `@theokit/rag` / `@theokit/voice` packages (repos `theokit-rag` / `theokit-voice`). Import those packages instead.
|
|
12
|
+
- Decorator-first DX is no longer required of Harness features (ADR D431). `@theokit/di` / `@theokit/di-agent` / `@theokit/orm` moved to `theokit-backend-dx`, the gateway packages to `theokit-gateways`, `@theokit/react` to `theokit-react`, and `@theokit/skills-google-workspace` to the Skills pillar. Decorators remain available as an optional layer via the externally-published `@theokit/di`.
|
|
13
|
+
|
|
14
|
+
The surviving `@theokit/sdk-*` extension peer specifiers stay as semver ranges (`>=1.7.0`), satisfying the publish-readiness gate.
|
|
15
|
+
|
|
3
16
|
## 1.9.0
|
|
4
17
|
|
|
5
18
|
### Minor Changes
|
|
@@ -53,7 +66,7 @@
|
|
|
53
66
|
|
|
54
67
|
- **Compression config resolution module (T2.2 step 2/N of plan `sdk-superiority-2026-06-07`, ADR D440)**: `resolveCompressionConfig(agentModel, config): ResolvedCompressionConfig` bridges the compression-model-registry (step 1) with the `Agent.create({compression})` override surface. Resolves: (a) compression model — registry default OR explicit `config.model` override; (b) API key — first-match chain: explicit `config.apiKey` → `THEOKIT_COMPRESSION_API_KEY` env var → undefined (signals aux-LLM client to use agent's main CredentialPool); (c) maxAttempts (default 3) + grace (default 1). Pure config resolution — no I/O. 11 new tests at `tests/internal/runtime/compression-config.test.ts`. Foundation for step 3 (aux-llm-client with OTel span) and step 4 (agent-loop wire).
|
|
55
68
|
|
|
56
|
-
- **Model capabilities introspection registry (T3.10c step 1 of plan `sdk-superiority-2026-06-07`, DR3 #17)**: pre-T3.10c the SDK had no way to query a model's capability flags before sending a request — consumers who sent vision content to a text-only model or structured-output requests to a model without
|
|
69
|
+
- **Model capabilities introspection registry (T3.10c step 1 of plan `sdk-superiority-2026-06-07`, DR3 #17)**: pre-T3.10c the SDK had no way to query a model's capability flags before sending a request — consumers who sent vision content to a text-only model or structured-output requests to a model without json*schema support got an opaque 400 from the provider. T3.10c step 1 adds the foundation pure-function registry `resolveModelCapabilities(modelId): ModelCapabilities` with typed per-model flags: `supportsVision`, `supportsStructuredOutput`, `supportsToolUse`, `supportsCacheControl`, `maxContextTokens`, `maxOutputTokens`. Resolution algorithm: strip routing prefixes (openrouter/, vertex/, bedrock/), exact-match against the vendor-model registry, then infer vendor from model name (claude-* → anthropic/, gpt-\_ → openai/, gemini-\* → google/) for routing-prefixed lookups. Unknown models return conservative defaults (all false, 4096/4096 token counts) — never optimistic assumptions. Initial registry covers OpenAI (gpt-4o/4o-mini/4-turbo/o1/o3) and Anthropic (claude-opus-4/sonnet-4/3-5-sonnet/3-haiku/3-opus) families. 9 new tests at `tests/internal/llm/model-capabilities.test.ts`. Foundation for step 2 (public `Theokit.models.capabilities()` API) and step 3 (Agent.create boundary gate + `CapabilityNotSupportedError`).
|
|
57
70
|
|
|
58
71
|
### Fixed
|
|
59
72
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theokit/sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "TypeScript SDK for the Theo agent harness — same surface, local or cloud.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/usetheo/theokit-sdk#readme",
|
|
@@ -158,16 +158,6 @@
|
|
|
158
158
|
"default": "./dist/internal/security/index.cjs"
|
|
159
159
|
}
|
|
160
160
|
},
|
|
161
|
-
"./rag": {
|
|
162
|
-
"import": {
|
|
163
|
-
"types": "./dist/rag/index.d.ts",
|
|
164
|
-
"default": "./dist/rag/index.js"
|
|
165
|
-
},
|
|
166
|
-
"require": {
|
|
167
|
-
"types": "./dist/rag/index.d.cts",
|
|
168
|
-
"default": "./dist/rag/index.cjs"
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
161
|
"./a2a": {
|
|
172
162
|
"import": {
|
|
173
163
|
"types": "./dist/a2a/index.d.ts",
|
package/dist/rag/index.cjs
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// src/rag/reranker.ts
|
|
4
|
-
var NoopReranker = class {
|
|
5
|
-
async rerank(_query, chunks) {
|
|
6
|
-
return chunks.map((c, i) => ({
|
|
7
|
-
text: c.text,
|
|
8
|
-
score: c.score,
|
|
9
|
-
originalIndex: i,
|
|
10
|
-
metadata: c.metadata
|
|
11
|
-
}));
|
|
12
|
-
}
|
|
13
|
-
};
|
|
14
|
-
var CohereReranker = class {
|
|
15
|
-
_apiKey;
|
|
16
|
-
_model;
|
|
17
|
-
_mockRerank;
|
|
18
|
-
constructor(opts) {
|
|
19
|
-
this._apiKey = opts.apiKey;
|
|
20
|
-
this._model = opts.model ?? "rerank-v3.5";
|
|
21
|
-
this._mockRerank = opts._mockRerank;
|
|
22
|
-
}
|
|
23
|
-
async rerank(query, chunks) {
|
|
24
|
-
if (chunks.length === 0) return [];
|
|
25
|
-
if (this._mockRerank) {
|
|
26
|
-
return this._mockRerank(query, chunks);
|
|
27
|
-
}
|
|
28
|
-
const response = await fetch("https://api.cohere.com/v2/rerank", {
|
|
29
|
-
method: "POST",
|
|
30
|
-
headers: {
|
|
31
|
-
Authorization: `Bearer ${this._apiKey}`,
|
|
32
|
-
"Content-Type": "application/json"
|
|
33
|
-
},
|
|
34
|
-
body: JSON.stringify({
|
|
35
|
-
model: this._model,
|
|
36
|
-
query,
|
|
37
|
-
documents: chunks.map((c) => c.text),
|
|
38
|
-
top_n: chunks.length
|
|
39
|
-
})
|
|
40
|
-
});
|
|
41
|
-
if (!response.ok) {
|
|
42
|
-
throw new Error(`Cohere rerank failed: ${response.status} ${response.statusText}`);
|
|
43
|
-
}
|
|
44
|
-
const data = await response.json();
|
|
45
|
-
return data.results.map((r) => {
|
|
46
|
-
const chunk = chunks[r.index];
|
|
47
|
-
return {
|
|
48
|
-
text: chunk?.text ?? "",
|
|
49
|
-
score: r.relevance_score,
|
|
50
|
-
originalIndex: r.index,
|
|
51
|
-
metadata: chunk?.metadata
|
|
52
|
-
};
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
// src/rag/retriever.ts
|
|
58
|
-
var VectorRetriever = class {
|
|
59
|
-
_index;
|
|
60
|
-
_defaultTopK;
|
|
61
|
-
constructor(opts) {
|
|
62
|
-
this._index = opts.index;
|
|
63
|
-
this._defaultTopK = opts.topK ?? 5;
|
|
64
|
-
}
|
|
65
|
-
async retrieve(query, options) {
|
|
66
|
-
const topK = options?.topK ?? this._defaultTopK;
|
|
67
|
-
return this._index.search(query, topK);
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
// src/rag/text-splitter.ts
|
|
72
|
-
function makeChunks(texts) {
|
|
73
|
-
return texts.filter((t) => t.length > 0).map((text, index) => ({ text, index }));
|
|
74
|
-
}
|
|
75
|
-
function splitByCharacter(text, opts) {
|
|
76
|
-
if (text.length === 0) return [];
|
|
77
|
-
const { chunkSize, overlap = 0 } = opts;
|
|
78
|
-
const step = Math.max(1, chunkSize - overlap);
|
|
79
|
-
const parts = [];
|
|
80
|
-
for (let i = 0; i < text.length; i += step) {
|
|
81
|
-
parts.push(text.slice(i, i + chunkSize));
|
|
82
|
-
}
|
|
83
|
-
return makeChunks(parts);
|
|
84
|
-
}
|
|
85
|
-
var SENTENCE_RE = /(?<=[.!?])\s+/;
|
|
86
|
-
function splitBySentence(text, opts) {
|
|
87
|
-
if (text.length === 0) return [];
|
|
88
|
-
const { chunkSize } = opts;
|
|
89
|
-
const sentences = text.split(SENTENCE_RE);
|
|
90
|
-
const parts = [];
|
|
91
|
-
let current = "";
|
|
92
|
-
for (const sentence of sentences) {
|
|
93
|
-
if (current.length + sentence.length + 1 > chunkSize && current.length > 0) {
|
|
94
|
-
parts.push(current.trim());
|
|
95
|
-
current = sentence;
|
|
96
|
-
} else {
|
|
97
|
-
current = current.length > 0 ? `${current} ${sentence}` : sentence;
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
if (current.length > 0) parts.push(current.trim());
|
|
101
|
-
return makeChunks(parts);
|
|
102
|
-
}
|
|
103
|
-
var PARAGRAPH_RE = /\n\n+/;
|
|
104
|
-
function splitRecursive(text, opts) {
|
|
105
|
-
if (text.length === 0) return [];
|
|
106
|
-
const { chunkSize, overlap = 0 } = opts;
|
|
107
|
-
const paragraphs = text.split(PARAGRAPH_RE).filter((p) => p.length > 0);
|
|
108
|
-
const result = [];
|
|
109
|
-
for (const para of paragraphs) {
|
|
110
|
-
if (para.length <= chunkSize) {
|
|
111
|
-
result.push(para);
|
|
112
|
-
} else {
|
|
113
|
-
const sentenceChunks = splitBySentence(para, { chunkSize});
|
|
114
|
-
for (const sc of sentenceChunks) {
|
|
115
|
-
if (sc.text.length <= chunkSize) {
|
|
116
|
-
result.push(sc.text);
|
|
117
|
-
} else {
|
|
118
|
-
const charChunks = splitByCharacter(sc.text, { chunkSize, overlap });
|
|
119
|
-
for (const cc of charChunks) {
|
|
120
|
-
result.push(cc.text);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return makeChunks(result);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
exports.CohereReranker = CohereReranker;
|
|
130
|
-
exports.NoopReranker = NoopReranker;
|
|
131
|
-
exports.VectorRetriever = VectorRetriever;
|
|
132
|
-
exports.splitByCharacter = splitByCharacter;
|
|
133
|
-
exports.splitBySentence = splitBySentence;
|
|
134
|
-
exports.splitRecursive = splitRecursive;
|
|
135
|
-
//# sourceMappingURL=index.cjs.map
|
|
136
|
-
//# sourceMappingURL=index.cjs.map
|
package/dist/rag/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rag/reranker.ts","../../src/rag/retriever.ts","../../src/rag/text-splitter.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Reranker implementations for RAG pipelines (T11.1, ADR D448).\n *\n * NoopReranker: passes through results unchanged (baseline).\n * CohereReranker: calls the Cohere Rerank API (optional peer dep).\n *\n * @public\n */\n\nimport type { RankedChunk, Reranker, RetrievalResult } from \"./types.js\";\n\nexport class NoopReranker implements Reranker {\n async rerank(_query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]> {\n return chunks.map((c, i) => ({\n text: c.text,\n score: c.score,\n originalIndex: i,\n metadata: c.metadata,\n }));\n }\n}\n\ntype MockRerankFn = (query: string, docs: RetrievalResult[]) => Promise<RankedChunk[]>;\n\nexport interface CohereRerankerOptions {\n apiKey: string;\n model?: string;\n _mockRerank?: MockRerankFn;\n}\n\nexport class CohereReranker implements Reranker {\n private readonly _apiKey: string;\n private readonly _model: string;\n private readonly _mockRerank?: MockRerankFn;\n\n constructor(opts: CohereRerankerOptions) {\n this._apiKey = opts.apiKey;\n this._model = opts.model ?? \"rerank-v3.5\";\n this._mockRerank = opts._mockRerank;\n }\n\n async rerank(query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]> {\n if (chunks.length === 0) return [];\n\n if (this._mockRerank) {\n return this._mockRerank(query, chunks);\n }\n\n const response = await fetch(\"https://api.cohere.com/v2/rerank\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this._model,\n query,\n documents: chunks.map((c) => c.text),\n top_n: chunks.length,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Cohere rerank failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n results: Array<{ index: number; relevance_score: number }>;\n };\n\n return data.results.map((r) => {\n const chunk = chunks[r.index];\n return {\n text: chunk?.text ?? \"\",\n score: r.relevance_score,\n originalIndex: r.index,\n metadata: chunk?.metadata,\n };\n });\n }\n}\n","/**\n * Retriever implementations for RAG pipelines (T11.1, ADR D448).\n *\n * VectorRetriever wraps any index that implements `search(query, topK)`.\n * The Retriever interface is the contract — consumers depend on the interface,\n * implementations depend on the index adapter (DIP per architecture.md § 2).\n *\n * @public\n */\n\nimport type { RetrievalResult, Retriever } from \"./types.js\";\n\nexport interface VectorIndex {\n search(query: string, topK: number): Promise<RetrievalResult[]>;\n}\n\nexport interface VectorRetrieverOptions {\n index: VectorIndex;\n topK?: number;\n}\n\nexport class VectorRetriever implements Retriever {\n private readonly _index: VectorIndex;\n private readonly _defaultTopK: number;\n\n constructor(opts: VectorRetrieverOptions) {\n this._index = opts.index;\n this._defaultTopK = opts.topK ?? 5;\n }\n\n async retrieve(query: string, options?: { topK?: number }): Promise<RetrievalResult[]> {\n const topK = options?.topK ?? this._defaultTopK;\n return this._index.search(query, topK);\n }\n}\n","/**\n * Text splitting strategies for RAG pipelines (T11.1, ADR D448).\n *\n * Three strategies: character, sentence, recursive (paragraph→sentence→char).\n * All return Chunk[] with text + index. Empty input → empty array (EC-5).\n *\n * @public\n */\n\nimport type { Chunk, SplitOptions } from \"./types.js\";\n\nfunction makeChunks(texts: string[]): Chunk[] {\n return texts.filter((t) => t.length > 0).map((text, index) => ({ text, index }));\n}\n\nexport function splitByCharacter(text: string, opts: SplitOptions): Chunk[] {\n if (text.length === 0) return [];\n const { chunkSize, overlap = 0 } = opts;\n const step = Math.max(1, chunkSize - overlap);\n const parts: string[] = [];\n for (let i = 0; i < text.length; i += step) {\n parts.push(text.slice(i, i + chunkSize));\n }\n return makeChunks(parts);\n}\n\nconst SENTENCE_RE = /(?<=[.!?])\\s+/;\n\nexport function splitBySentence(text: string, opts: SplitOptions): Chunk[] {\n if (text.length === 0) return [];\n const { chunkSize } = opts;\n const sentences = text.split(SENTENCE_RE);\n const parts: string[] = [];\n let current = \"\";\n for (const sentence of sentences) {\n if (current.length + sentence.length + 1 > chunkSize && current.length > 0) {\n parts.push(current.trim());\n current = sentence;\n } else {\n current = current.length > 0 ? `${current} ${sentence}` : sentence;\n }\n }\n if (current.length > 0) parts.push(current.trim());\n return makeChunks(parts);\n}\n\nconst PARAGRAPH_RE = /\\n\\n+/;\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: recursive splitter inherently cascades through 3 levels (paragraph→sentence→char)\nexport function splitRecursive(text: string, opts: SplitOptions): Chunk[] {\n if (text.length === 0) return [];\n const { chunkSize, overlap = 0 } = opts;\n\n // Level 1: split by paragraph\n const paragraphs = text.split(PARAGRAPH_RE).filter((p) => p.length > 0);\n const result: string[] = [];\n\n for (const para of paragraphs) {\n if (para.length <= chunkSize) {\n result.push(para);\n } else {\n // Level 2: split by sentence\n const sentenceChunks = splitBySentence(para, { chunkSize, overlap });\n for (const sc of sentenceChunks) {\n if (sc.text.length <= chunkSize) {\n result.push(sc.text);\n } else {\n // Level 3: split by character\n const charChunks = splitByCharacter(sc.text, { chunkSize, overlap });\n for (const cc of charChunks) {\n result.push(cc.text);\n }\n }\n }\n }\n }\n\n return makeChunks(result);\n}\n"]}
|
package/dist/rag/index.d.cts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RAG (Retrieval-Augmented Generation) sub-path barrel (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* Exported via `@theokit/sdk/rag`.
|
|
5
|
-
*
|
|
6
|
-
* @public
|
|
7
|
-
*/
|
|
8
|
-
export { CohereReranker, type CohereRerankerOptions, NoopReranker } from "./reranker.js";
|
|
9
|
-
export { type VectorIndex, VectorRetriever, type VectorRetrieverOptions } from "./retriever.js";
|
|
10
|
-
export { splitByCharacter, splitBySentence, splitRecursive } from "./text-splitter.js";
|
|
11
|
-
export type { Chunk, Document, RankedChunk, Reranker, RetrievalResult, Retriever, SplitOptions, } from "./types.js";
|
package/dist/rag/index.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RAG (Retrieval-Augmented Generation) sub-path barrel (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* Exported via `@theokit/sdk/rag`.
|
|
5
|
-
*
|
|
6
|
-
* @public
|
|
7
|
-
*/
|
|
8
|
-
export { CohereReranker, type CohereRerankerOptions, NoopReranker } from "./reranker.js";
|
|
9
|
-
export { type VectorIndex, VectorRetriever, type VectorRetrieverOptions } from "./retriever.js";
|
|
10
|
-
export { splitByCharacter, splitBySentence, splitRecursive } from "./text-splitter.js";
|
|
11
|
-
export type { Chunk, Document, RankedChunk, Reranker, RetrievalResult, Retriever, SplitOptions, } from "./types.js";
|
package/dist/rag/index.js
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
// src/rag/reranker.ts
|
|
2
|
-
var NoopReranker = class {
|
|
3
|
-
async rerank(_query, chunks) {
|
|
4
|
-
return chunks.map((c, i) => ({
|
|
5
|
-
text: c.text,
|
|
6
|
-
score: c.score,
|
|
7
|
-
originalIndex: i,
|
|
8
|
-
metadata: c.metadata
|
|
9
|
-
}));
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
var CohereReranker = class {
|
|
13
|
-
_apiKey;
|
|
14
|
-
_model;
|
|
15
|
-
_mockRerank;
|
|
16
|
-
constructor(opts) {
|
|
17
|
-
this._apiKey = opts.apiKey;
|
|
18
|
-
this._model = opts.model ?? "rerank-v3.5";
|
|
19
|
-
this._mockRerank = opts._mockRerank;
|
|
20
|
-
}
|
|
21
|
-
async rerank(query, chunks) {
|
|
22
|
-
if (chunks.length === 0) return [];
|
|
23
|
-
if (this._mockRerank) {
|
|
24
|
-
return this._mockRerank(query, chunks);
|
|
25
|
-
}
|
|
26
|
-
const response = await fetch("https://api.cohere.com/v2/rerank", {
|
|
27
|
-
method: "POST",
|
|
28
|
-
headers: {
|
|
29
|
-
Authorization: `Bearer ${this._apiKey}`,
|
|
30
|
-
"Content-Type": "application/json"
|
|
31
|
-
},
|
|
32
|
-
body: JSON.stringify({
|
|
33
|
-
model: this._model,
|
|
34
|
-
query,
|
|
35
|
-
documents: chunks.map((c) => c.text),
|
|
36
|
-
top_n: chunks.length
|
|
37
|
-
})
|
|
38
|
-
});
|
|
39
|
-
if (!response.ok) {
|
|
40
|
-
throw new Error(`Cohere rerank failed: ${response.status} ${response.statusText}`);
|
|
41
|
-
}
|
|
42
|
-
const data = await response.json();
|
|
43
|
-
return data.results.map((r) => {
|
|
44
|
-
const chunk = chunks[r.index];
|
|
45
|
-
return {
|
|
46
|
-
text: chunk?.text ?? "",
|
|
47
|
-
score: r.relevance_score,
|
|
48
|
-
originalIndex: r.index,
|
|
49
|
-
metadata: chunk?.metadata
|
|
50
|
-
};
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
// src/rag/retriever.ts
|
|
56
|
-
var VectorRetriever = class {
|
|
57
|
-
_index;
|
|
58
|
-
_defaultTopK;
|
|
59
|
-
constructor(opts) {
|
|
60
|
-
this._index = opts.index;
|
|
61
|
-
this._defaultTopK = opts.topK ?? 5;
|
|
62
|
-
}
|
|
63
|
-
async retrieve(query, options) {
|
|
64
|
-
const topK = options?.topK ?? this._defaultTopK;
|
|
65
|
-
return this._index.search(query, topK);
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// src/rag/text-splitter.ts
|
|
70
|
-
function makeChunks(texts) {
|
|
71
|
-
return texts.filter((t) => t.length > 0).map((text, index) => ({ text, index }));
|
|
72
|
-
}
|
|
73
|
-
function splitByCharacter(text, opts) {
|
|
74
|
-
if (text.length === 0) return [];
|
|
75
|
-
const { chunkSize, overlap = 0 } = opts;
|
|
76
|
-
const step = Math.max(1, chunkSize - overlap);
|
|
77
|
-
const parts = [];
|
|
78
|
-
for (let i = 0; i < text.length; i += step) {
|
|
79
|
-
parts.push(text.slice(i, i + chunkSize));
|
|
80
|
-
}
|
|
81
|
-
return makeChunks(parts);
|
|
82
|
-
}
|
|
83
|
-
var SENTENCE_RE = /(?<=[.!?])\s+/;
|
|
84
|
-
function splitBySentence(text, opts) {
|
|
85
|
-
if (text.length === 0) return [];
|
|
86
|
-
const { chunkSize } = opts;
|
|
87
|
-
const sentences = text.split(SENTENCE_RE);
|
|
88
|
-
const parts = [];
|
|
89
|
-
let current = "";
|
|
90
|
-
for (const sentence of sentences) {
|
|
91
|
-
if (current.length + sentence.length + 1 > chunkSize && current.length > 0) {
|
|
92
|
-
parts.push(current.trim());
|
|
93
|
-
current = sentence;
|
|
94
|
-
} else {
|
|
95
|
-
current = current.length > 0 ? `${current} ${sentence}` : sentence;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
if (current.length > 0) parts.push(current.trim());
|
|
99
|
-
return makeChunks(parts);
|
|
100
|
-
}
|
|
101
|
-
var PARAGRAPH_RE = /\n\n+/;
|
|
102
|
-
function splitRecursive(text, opts) {
|
|
103
|
-
if (text.length === 0) return [];
|
|
104
|
-
const { chunkSize, overlap = 0 } = opts;
|
|
105
|
-
const paragraphs = text.split(PARAGRAPH_RE).filter((p) => p.length > 0);
|
|
106
|
-
const result = [];
|
|
107
|
-
for (const para of paragraphs) {
|
|
108
|
-
if (para.length <= chunkSize) {
|
|
109
|
-
result.push(para);
|
|
110
|
-
} else {
|
|
111
|
-
const sentenceChunks = splitBySentence(para, { chunkSize});
|
|
112
|
-
for (const sc of sentenceChunks) {
|
|
113
|
-
if (sc.text.length <= chunkSize) {
|
|
114
|
-
result.push(sc.text);
|
|
115
|
-
} else {
|
|
116
|
-
const charChunks = splitByCharacter(sc.text, { chunkSize, overlap });
|
|
117
|
-
for (const cc of charChunks) {
|
|
118
|
-
result.push(cc.text);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
return makeChunks(result);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
export { CohereReranker, NoopReranker, VectorRetriever, splitByCharacter, splitBySentence, splitRecursive };
|
|
128
|
-
//# sourceMappingURL=index.js.map
|
|
129
|
-
//# sourceMappingURL=index.js.map
|
package/dist/rag/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/rag/reranker.ts","../../src/rag/retriever.ts","../../src/rag/text-splitter.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Reranker implementations for RAG pipelines (T11.1, ADR D448).\n *\n * NoopReranker: passes through results unchanged (baseline).\n * CohereReranker: calls the Cohere Rerank API (optional peer dep).\n *\n * @public\n */\n\nimport type { RankedChunk, Reranker, RetrievalResult } from \"./types.js\";\n\nexport class NoopReranker implements Reranker {\n async rerank(_query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]> {\n return chunks.map((c, i) => ({\n text: c.text,\n score: c.score,\n originalIndex: i,\n metadata: c.metadata,\n }));\n }\n}\n\ntype MockRerankFn = (query: string, docs: RetrievalResult[]) => Promise<RankedChunk[]>;\n\nexport interface CohereRerankerOptions {\n apiKey: string;\n model?: string;\n _mockRerank?: MockRerankFn;\n}\n\nexport class CohereReranker implements Reranker {\n private readonly _apiKey: string;\n private readonly _model: string;\n private readonly _mockRerank?: MockRerankFn;\n\n constructor(opts: CohereRerankerOptions) {\n this._apiKey = opts.apiKey;\n this._model = opts.model ?? \"rerank-v3.5\";\n this._mockRerank = opts._mockRerank;\n }\n\n async rerank(query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]> {\n if (chunks.length === 0) return [];\n\n if (this._mockRerank) {\n return this._mockRerank(query, chunks);\n }\n\n const response = await fetch(\"https://api.cohere.com/v2/rerank\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${this._apiKey}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n model: this._model,\n query,\n documents: chunks.map((c) => c.text),\n top_n: chunks.length,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Cohere rerank failed: ${response.status} ${response.statusText}`);\n }\n\n const data = (await response.json()) as {\n results: Array<{ index: number; relevance_score: number }>;\n };\n\n return data.results.map((r) => {\n const chunk = chunks[r.index];\n return {\n text: chunk?.text ?? \"\",\n score: r.relevance_score,\n originalIndex: r.index,\n metadata: chunk?.metadata,\n };\n });\n }\n}\n","/**\n * Retriever implementations for RAG pipelines (T11.1, ADR D448).\n *\n * VectorRetriever wraps any index that implements `search(query, topK)`.\n * The Retriever interface is the contract — consumers depend on the interface,\n * implementations depend on the index adapter (DIP per architecture.md § 2).\n *\n * @public\n */\n\nimport type { RetrievalResult, Retriever } from \"./types.js\";\n\nexport interface VectorIndex {\n search(query: string, topK: number): Promise<RetrievalResult[]>;\n}\n\nexport interface VectorRetrieverOptions {\n index: VectorIndex;\n topK?: number;\n}\n\nexport class VectorRetriever implements Retriever {\n private readonly _index: VectorIndex;\n private readonly _defaultTopK: number;\n\n constructor(opts: VectorRetrieverOptions) {\n this._index = opts.index;\n this._defaultTopK = opts.topK ?? 5;\n }\n\n async retrieve(query: string, options?: { topK?: number }): Promise<RetrievalResult[]> {\n const topK = options?.topK ?? this._defaultTopK;\n return this._index.search(query, topK);\n }\n}\n","/**\n * Text splitting strategies for RAG pipelines (T11.1, ADR D448).\n *\n * Three strategies: character, sentence, recursive (paragraph→sentence→char).\n * All return Chunk[] with text + index. Empty input → empty array (EC-5).\n *\n * @public\n */\n\nimport type { Chunk, SplitOptions } from \"./types.js\";\n\nfunction makeChunks(texts: string[]): Chunk[] {\n return texts.filter((t) => t.length > 0).map((text, index) => ({ text, index }));\n}\n\nexport function splitByCharacter(text: string, opts: SplitOptions): Chunk[] {\n if (text.length === 0) return [];\n const { chunkSize, overlap = 0 } = opts;\n const step = Math.max(1, chunkSize - overlap);\n const parts: string[] = [];\n for (let i = 0; i < text.length; i += step) {\n parts.push(text.slice(i, i + chunkSize));\n }\n return makeChunks(parts);\n}\n\nconst SENTENCE_RE = /(?<=[.!?])\\s+/;\n\nexport function splitBySentence(text: string, opts: SplitOptions): Chunk[] {\n if (text.length === 0) return [];\n const { chunkSize } = opts;\n const sentences = text.split(SENTENCE_RE);\n const parts: string[] = [];\n let current = \"\";\n for (const sentence of sentences) {\n if (current.length + sentence.length + 1 > chunkSize && current.length > 0) {\n parts.push(current.trim());\n current = sentence;\n } else {\n current = current.length > 0 ? `${current} ${sentence}` : sentence;\n }\n }\n if (current.length > 0) parts.push(current.trim());\n return makeChunks(parts);\n}\n\nconst PARAGRAPH_RE = /\\n\\n+/;\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: recursive splitter inherently cascades through 3 levels (paragraph→sentence→char)\nexport function splitRecursive(text: string, opts: SplitOptions): Chunk[] {\n if (text.length === 0) return [];\n const { chunkSize, overlap = 0 } = opts;\n\n // Level 1: split by paragraph\n const paragraphs = text.split(PARAGRAPH_RE).filter((p) => p.length > 0);\n const result: string[] = [];\n\n for (const para of paragraphs) {\n if (para.length <= chunkSize) {\n result.push(para);\n } else {\n // Level 2: split by sentence\n const sentenceChunks = splitBySentence(para, { chunkSize, overlap });\n for (const sc of sentenceChunks) {\n if (sc.text.length <= chunkSize) {\n result.push(sc.text);\n } else {\n // Level 3: split by character\n const charChunks = splitByCharacter(sc.text, { chunkSize, overlap });\n for (const cc of charChunks) {\n result.push(cc.text);\n }\n }\n }\n }\n }\n\n return makeChunks(result);\n}\n"]}
|
package/dist/rag/reranker.d.cts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reranker implementations for RAG pipelines (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* NoopReranker: passes through results unchanged (baseline).
|
|
5
|
-
* CohereReranker: calls the Cohere Rerank API (optional peer dep).
|
|
6
|
-
*
|
|
7
|
-
* @public
|
|
8
|
-
*/
|
|
9
|
-
import type { RankedChunk, Reranker, RetrievalResult } from "./types.js";
|
|
10
|
-
export declare class NoopReranker implements Reranker {
|
|
11
|
-
rerank(_query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]>;
|
|
12
|
-
}
|
|
13
|
-
type MockRerankFn = (query: string, docs: RetrievalResult[]) => Promise<RankedChunk[]>;
|
|
14
|
-
export interface CohereRerankerOptions {
|
|
15
|
-
apiKey: string;
|
|
16
|
-
model?: string;
|
|
17
|
-
_mockRerank?: MockRerankFn;
|
|
18
|
-
}
|
|
19
|
-
export declare class CohereReranker implements Reranker {
|
|
20
|
-
private readonly _apiKey;
|
|
21
|
-
private readonly _model;
|
|
22
|
-
private readonly _mockRerank?;
|
|
23
|
-
constructor(opts: CohereRerankerOptions);
|
|
24
|
-
rerank(query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]>;
|
|
25
|
-
}
|
|
26
|
-
export {};
|
package/dist/rag/reranker.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Reranker implementations for RAG pipelines (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* NoopReranker: passes through results unchanged (baseline).
|
|
5
|
-
* CohereReranker: calls the Cohere Rerank API (optional peer dep).
|
|
6
|
-
*
|
|
7
|
-
* @public
|
|
8
|
-
*/
|
|
9
|
-
import type { RankedChunk, Reranker, RetrievalResult } from "./types.js";
|
|
10
|
-
export declare class NoopReranker implements Reranker {
|
|
11
|
-
rerank(_query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]>;
|
|
12
|
-
}
|
|
13
|
-
type MockRerankFn = (query: string, docs: RetrievalResult[]) => Promise<RankedChunk[]>;
|
|
14
|
-
export interface CohereRerankerOptions {
|
|
15
|
-
apiKey: string;
|
|
16
|
-
model?: string;
|
|
17
|
-
_mockRerank?: MockRerankFn;
|
|
18
|
-
}
|
|
19
|
-
export declare class CohereReranker implements Reranker {
|
|
20
|
-
private readonly _apiKey;
|
|
21
|
-
private readonly _model;
|
|
22
|
-
private readonly _mockRerank?;
|
|
23
|
-
constructor(opts: CohereRerankerOptions);
|
|
24
|
-
rerank(query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]>;
|
|
25
|
-
}
|
|
26
|
-
export {};
|
package/dist/rag/retriever.d.cts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retriever implementations for RAG pipelines (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* VectorRetriever wraps any index that implements `search(query, topK)`.
|
|
5
|
-
* The Retriever interface is the contract — consumers depend on the interface,
|
|
6
|
-
* implementations depend on the index adapter (DIP per architecture.md § 2).
|
|
7
|
-
*
|
|
8
|
-
* @public
|
|
9
|
-
*/
|
|
10
|
-
import type { RetrievalResult, Retriever } from "./types.js";
|
|
11
|
-
export interface VectorIndex {
|
|
12
|
-
search(query: string, topK: number): Promise<RetrievalResult[]>;
|
|
13
|
-
}
|
|
14
|
-
export interface VectorRetrieverOptions {
|
|
15
|
-
index: VectorIndex;
|
|
16
|
-
topK?: number;
|
|
17
|
-
}
|
|
18
|
-
export declare class VectorRetriever implements Retriever {
|
|
19
|
-
private readonly _index;
|
|
20
|
-
private readonly _defaultTopK;
|
|
21
|
-
constructor(opts: VectorRetrieverOptions);
|
|
22
|
-
retrieve(query: string, options?: {
|
|
23
|
-
topK?: number;
|
|
24
|
-
}): Promise<RetrievalResult[]>;
|
|
25
|
-
}
|
package/dist/rag/retriever.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retriever implementations for RAG pipelines (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* VectorRetriever wraps any index that implements `search(query, topK)`.
|
|
5
|
-
* The Retriever interface is the contract — consumers depend on the interface,
|
|
6
|
-
* implementations depend on the index adapter (DIP per architecture.md § 2).
|
|
7
|
-
*
|
|
8
|
-
* @public
|
|
9
|
-
*/
|
|
10
|
-
import type { RetrievalResult, Retriever } from "./types.js";
|
|
11
|
-
export interface VectorIndex {
|
|
12
|
-
search(query: string, topK: number): Promise<RetrievalResult[]>;
|
|
13
|
-
}
|
|
14
|
-
export interface VectorRetrieverOptions {
|
|
15
|
-
index: VectorIndex;
|
|
16
|
-
topK?: number;
|
|
17
|
-
}
|
|
18
|
-
export declare class VectorRetriever implements Retriever {
|
|
19
|
-
private readonly _index;
|
|
20
|
-
private readonly _defaultTopK;
|
|
21
|
-
constructor(opts: VectorRetrieverOptions);
|
|
22
|
-
retrieve(query: string, options?: {
|
|
23
|
-
topK?: number;
|
|
24
|
-
}): Promise<RetrievalResult[]>;
|
|
25
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Text splitting strategies for RAG pipelines (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* Three strategies: character, sentence, recursive (paragraph→sentence→char).
|
|
5
|
-
* All return Chunk[] with text + index. Empty input → empty array (EC-5).
|
|
6
|
-
*
|
|
7
|
-
* @public
|
|
8
|
-
*/
|
|
9
|
-
import type { Chunk, SplitOptions } from "./types.js";
|
|
10
|
-
export declare function splitByCharacter(text: string, opts: SplitOptions): Chunk[];
|
|
11
|
-
export declare function splitBySentence(text: string, opts: SplitOptions): Chunk[];
|
|
12
|
-
export declare function splitRecursive(text: string, opts: SplitOptions): Chunk[];
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Text splitting strategies for RAG pipelines (T11.1, ADR D448).
|
|
3
|
-
*
|
|
4
|
-
* Three strategies: character, sentence, recursive (paragraph→sentence→char).
|
|
5
|
-
* All return Chunk[] with text + index. Empty input → empty array (EC-5).
|
|
6
|
-
*
|
|
7
|
-
* @public
|
|
8
|
-
*/
|
|
9
|
-
import type { Chunk, SplitOptions } from "./types.js";
|
|
10
|
-
export declare function splitByCharacter(text: string, opts: SplitOptions): Chunk[];
|
|
11
|
-
export declare function splitBySentence(text: string, opts: SplitOptions): Chunk[];
|
|
12
|
-
export declare function splitRecursive(text: string, opts: SplitOptions): Chunk[];
|
package/dist/rag/types.d.cts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RAG types — Document, Chunk, RetrievalResult (T11.1, ADR D448).
|
|
3
|
-
* @public
|
|
4
|
-
*/
|
|
5
|
-
export interface Document {
|
|
6
|
-
id: string;
|
|
7
|
-
text: string;
|
|
8
|
-
metadata?: Record<string, unknown>;
|
|
9
|
-
}
|
|
10
|
-
export interface Chunk {
|
|
11
|
-
text: string;
|
|
12
|
-
index: number;
|
|
13
|
-
metadata?: Record<string, unknown>;
|
|
14
|
-
}
|
|
15
|
-
export interface RetrievalResult {
|
|
16
|
-
text: string;
|
|
17
|
-
score: number;
|
|
18
|
-
metadata?: Record<string, unknown>;
|
|
19
|
-
}
|
|
20
|
-
export interface RankedChunk {
|
|
21
|
-
text: string;
|
|
22
|
-
score: number;
|
|
23
|
-
originalIndex: number;
|
|
24
|
-
metadata?: Record<string, unknown>;
|
|
25
|
-
}
|
|
26
|
-
export interface SplitOptions {
|
|
27
|
-
chunkSize: number;
|
|
28
|
-
overlap?: number;
|
|
29
|
-
}
|
|
30
|
-
export interface Retriever {
|
|
31
|
-
retrieve(query: string, options?: {
|
|
32
|
-
topK?: number;
|
|
33
|
-
}): Promise<RetrievalResult[]>;
|
|
34
|
-
}
|
|
35
|
-
export interface Reranker {
|
|
36
|
-
rerank(query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]>;
|
|
37
|
-
}
|
package/dist/rag/types.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* RAG types — Document, Chunk, RetrievalResult (T11.1, ADR D448).
|
|
3
|
-
* @public
|
|
4
|
-
*/
|
|
5
|
-
export interface Document {
|
|
6
|
-
id: string;
|
|
7
|
-
text: string;
|
|
8
|
-
metadata?: Record<string, unknown>;
|
|
9
|
-
}
|
|
10
|
-
export interface Chunk {
|
|
11
|
-
text: string;
|
|
12
|
-
index: number;
|
|
13
|
-
metadata?: Record<string, unknown>;
|
|
14
|
-
}
|
|
15
|
-
export interface RetrievalResult {
|
|
16
|
-
text: string;
|
|
17
|
-
score: number;
|
|
18
|
-
metadata?: Record<string, unknown>;
|
|
19
|
-
}
|
|
20
|
-
export interface RankedChunk {
|
|
21
|
-
text: string;
|
|
22
|
-
score: number;
|
|
23
|
-
originalIndex: number;
|
|
24
|
-
metadata?: Record<string, unknown>;
|
|
25
|
-
}
|
|
26
|
-
export interface SplitOptions {
|
|
27
|
-
chunkSize: number;
|
|
28
|
-
overlap?: number;
|
|
29
|
-
}
|
|
30
|
-
export interface Retriever {
|
|
31
|
-
retrieve(query: string, options?: {
|
|
32
|
-
topK?: number;
|
|
33
|
-
}): Promise<RetrievalResult[]>;
|
|
34
|
-
}
|
|
35
|
-
export interface Reranker {
|
|
36
|
-
rerank(query: string, chunks: RetrievalResult[]): Promise<RankedChunk[]>;
|
|
37
|
-
}
|
package/dist/voice/index.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Voice sub-path barrel (T12.3).
|
|
3
|
-
* Exported via `@theokit/sdk/voice`.
|
|
4
|
-
* @public @experimental
|
|
5
|
-
*/
|
|
6
|
-
export { OpenAIRealtimeVoiceProvider } from "./openai-realtime.js";
|
|
7
|
-
export type { STTOptions, STTResult, TTSOptions, TTSResult, VoiceProvider } from "./types.js";
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI Realtime voice provider — TTS via OpenAI Audio API (T12.3).
|
|
3
|
-
*
|
|
4
|
-
* Optional peer dep: none (uses native fetch).
|
|
5
|
-
*
|
|
6
|
-
* @public @experimental
|
|
7
|
-
*/
|
|
8
|
-
import type { STTOptions, STTResult, TTSOptions, TTSResult, VoiceProvider } from "./types.js";
|
|
9
|
-
interface OpenAIRealtimeVoiceProviderOptions {
|
|
10
|
-
apiKey: string;
|
|
11
|
-
baseUrl?: string;
|
|
12
|
-
}
|
|
13
|
-
export declare class OpenAIRealtimeVoiceProvider implements VoiceProvider {
|
|
14
|
-
readonly name = "openai-realtime";
|
|
15
|
-
private readonly _apiKey;
|
|
16
|
-
private readonly _baseUrl;
|
|
17
|
-
constructor(opts: OpenAIRealtimeVoiceProviderOptions);
|
|
18
|
-
textToSpeech(text: string, opts?: TTSOptions): Promise<TTSResult>;
|
|
19
|
-
speechToText(audio: Buffer | Uint8Array, opts?: STTOptions): Promise<STTResult>;
|
|
20
|
-
}
|
|
21
|
-
export {};
|
package/dist/voice/types.d.ts
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* VoiceProvider interface — foundation for TTS/STT adapters (T12.3).
|
|
3
|
-
* @public @experimental
|
|
4
|
-
*/
|
|
5
|
-
export interface TTSOptions {
|
|
6
|
-
model?: string;
|
|
7
|
-
voice?: string;
|
|
8
|
-
speed?: number;
|
|
9
|
-
format?: "mp3" | "opus" | "aac" | "flac" | "wav" | "pcm";
|
|
10
|
-
}
|
|
11
|
-
export interface STTOptions {
|
|
12
|
-
model?: string;
|
|
13
|
-
language?: string;
|
|
14
|
-
prompt?: string;
|
|
15
|
-
}
|
|
16
|
-
export interface TTSResult {
|
|
17
|
-
audio: Buffer | Uint8Array;
|
|
18
|
-
format: string;
|
|
19
|
-
durationMs?: number;
|
|
20
|
-
}
|
|
21
|
-
export interface STTResult {
|
|
22
|
-
text: string;
|
|
23
|
-
language?: string;
|
|
24
|
-
durationMs?: number;
|
|
25
|
-
segments?: Array<{
|
|
26
|
-
start: number;
|
|
27
|
-
end: number;
|
|
28
|
-
text: string;
|
|
29
|
-
}>;
|
|
30
|
-
}
|
|
31
|
-
export interface VoiceProvider {
|
|
32
|
-
readonly name: string;
|
|
33
|
-
textToSpeech(text: string, opts?: TTSOptions): Promise<TTSResult>;
|
|
34
|
-
speechToText(audio: Buffer | Uint8Array, opts?: STTOptions): Promise<STTResult>;
|
|
35
|
-
}
|