tinyai 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 +302 -0
- package/dist/core/client.d.ts +48 -0
- package/dist/core/client.d.ts.map +1 -0
- package/dist/core/client.js +53 -0
- package/dist/core/client.js.map +1 -0
- package/dist/core/schema.d.ts +26 -0
- package/dist/core/schema.d.ts.map +1 -0
- package/dist/core/schema.js +112 -0
- package/dist/core/schema.js.map +1 -0
- package/dist/core/streaming.d.ts +15 -0
- package/dist/core/streaming.d.ts.map +1 -0
- package/dist/core/streaming.js +33 -0
- package/dist/core/streaming.js.map +1 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/primitives/ask.d.ts +23 -0
- package/dist/primitives/ask.d.ts.map +1 -0
- package/dist/primitives/ask.js +36 -0
- package/dist/primitives/ask.js.map +1 -0
- package/dist/primitives/classify.d.ts +18 -0
- package/dist/primitives/classify.d.ts.map +1 -0
- package/dist/primitives/classify.js +44 -0
- package/dist/primitives/classify.js.map +1 -0
- package/dist/primitives/embed.d.ts +22 -0
- package/dist/primitives/embed.d.ts.map +1 -0
- package/dist/primitives/embed.js +37 -0
- package/dist/primitives/embed.js.map +1 -0
- package/dist/primitives/extract.d.ts +25 -0
- package/dist/primitives/extract.d.ts.map +1 -0
- package/dist/primitives/extract.js +47 -0
- package/dist/primitives/extract.js.map +1 -0
- package/dist/primitives/generate.d.ts +26 -0
- package/dist/primitives/generate.d.ts.map +1 -0
- package/dist/primitives/generate.js +40 -0
- package/dist/primitives/generate.js.map +1 -0
- package/dist/primitives/summarize.d.ts +30 -0
- package/dist/primitives/summarize.d.ts.map +1 -0
- package/dist/primitives/summarize.js +43 -0
- package/dist/primitives/summarize.js.map +1 -0
- package/dist/primitives/translate.d.ts +22 -0
- package/dist/primitives/translate.d.ts.map +1 -0
- package/dist/primitives/translate.js +36 -0
- package/dist/primitives/translate.js.map +1 -0
- package/dist/providers/groq.d.ts +18 -0
- package/dist/providers/groq.d.ts.map +1 -0
- package/dist/providers/groq.js +113 -0
- package/dist/providers/groq.js.map +1 -0
- package/dist/providers/ollama.d.ts +24 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +123 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openai.d.ts +12 -0
- package/dist/providers/openai.d.ts.map +1 -0
- package/dist/providers/openai.js +127 -0
- package/dist/providers/openai.js.map +1 -0
- package/dist/utils/prompts.d.ts +29 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +29 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/utils/retry.d.ts +10 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +44 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* translate() - Translate text to another language
|
|
3
|
+
*/
|
|
4
|
+
import { getDefaultClient } from '../core/client.js';
|
|
5
|
+
import { PROMPTS } from '../utils/prompts.js';
|
|
6
|
+
import { withRetry } from '../utils/retry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Translates text to the specified language
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const spanish = await translate('Hello, world!', 'spanish');
|
|
13
|
+
* const french = await translate(text, 'french');
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export async function translate(text, targetLanguage, options = {}) {
|
|
17
|
+
const client = options.client ?? getDefaultClient();
|
|
18
|
+
const prompt = PROMPTS.translate(text, targetLanguage);
|
|
19
|
+
const response = await withRetry(() => client.provider.chat([
|
|
20
|
+
{ role: 'system', content: prompt.system },
|
|
21
|
+
{ role: 'user', content: prompt.user },
|
|
22
|
+
]));
|
|
23
|
+
return response.content.trim();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Translates text with streaming
|
|
27
|
+
*/
|
|
28
|
+
export async function* translateStream(text, targetLanguage, options = {}) {
|
|
29
|
+
const client = options.client ?? getDefaultClient();
|
|
30
|
+
const prompt = PROMPTS.translate(text, targetLanguage);
|
|
31
|
+
yield* client.provider.chatStream([
|
|
32
|
+
{ role: 'system', content: prompt.system },
|
|
33
|
+
{ role: 'user', content: prompt.user },
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=translate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.js","sourceRoot":"","sources":["../../src/primitives/translate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAM9C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,cAAsB,EACtB,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CACpC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;KACvC,CAAC,CACH,CAAC;IAEF,OAAO,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,IAAY,EACZ,cAAsB,EACtB,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAEvD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;QAChC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAC1C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE;KACvC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Groq Provider
|
|
3
|
+
* Free tier: 14,400 tokens/min, 30 requests/min
|
|
4
|
+
* Models: llama-3.3-70b, llama-3.1-8b, mixtral-8x7b, gemma2-9b
|
|
5
|
+
*/
|
|
6
|
+
import type { Provider, ProviderConfig } from '../core/client.js';
|
|
7
|
+
export interface GroqConfig extends ProviderConfig {
|
|
8
|
+
model?: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare const GROQ_MODELS: {
|
|
12
|
+
readonly 'llama-3.3-70b': "llama-3.3-70b-versatile";
|
|
13
|
+
readonly 'llama-3.1-8b': "llama-3.1-8b-instant";
|
|
14
|
+
readonly mixtral: "mixtral-8x7b-32768";
|
|
15
|
+
readonly gemma2: "gemma2-9b-it";
|
|
16
|
+
};
|
|
17
|
+
export declare function createGroqProvider(config?: GroqConfig): Provider;
|
|
18
|
+
//# sourceMappingURL=groq.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groq.d.ts","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAA4C,MAAM,mBAAmB,CAAC;AAI5G,MAAM,WAAW,UAAW,SAAQ,cAAc;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,eAAO,MAAM,WAAW;;;;;CAKd,CAAC;AAEX,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,UAAe,GAAG,QAAQ,CAwGpE"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Groq Provider
|
|
3
|
+
* Free tier: 14,400 tokens/min, 30 requests/min
|
|
4
|
+
* Models: llama-3.3-70b, llama-3.1-8b, mixtral-8x7b, gemma2-9b
|
|
5
|
+
*/
|
|
6
|
+
const GROQ_API_URL = 'https://api.groq.com/openai/v1';
|
|
7
|
+
// Free, fast models on Groq
|
|
8
|
+
export const GROQ_MODELS = {
|
|
9
|
+
'llama-3.3-70b': 'llama-3.3-70b-versatile',
|
|
10
|
+
'llama-3.1-8b': 'llama-3.1-8b-instant',
|
|
11
|
+
'mixtral': 'mixtral-8x7b-32768',
|
|
12
|
+
'gemma2': 'gemma2-9b-it',
|
|
13
|
+
};
|
|
14
|
+
export function createGroqProvider(config = {}) {
|
|
15
|
+
const apiKey = config.apiKey ?? getEnvApiKey();
|
|
16
|
+
const model = config.model ?? GROQ_MODELS['llama-3.3-70b'];
|
|
17
|
+
const baseUrl = config.baseUrl ?? GROQ_API_URL;
|
|
18
|
+
if (!apiKey) {
|
|
19
|
+
throw new Error('Groq API key required. Get a FREE key at https://console.groq.com/keys\n' +
|
|
20
|
+
'Set GROQ_API_KEY env var or pass apiKey in config.');
|
|
21
|
+
}
|
|
22
|
+
async function chat(messages) {
|
|
23
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
24
|
+
method: 'POST',
|
|
25
|
+
headers: {
|
|
26
|
+
'Content-Type': 'application/json',
|
|
27
|
+
Authorization: `Bearer ${apiKey}`,
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
model,
|
|
31
|
+
messages: messages.map((m) => ({ role: m.role, content: m.content })),
|
|
32
|
+
temperature: 0.7,
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
const error = await response.text();
|
|
37
|
+
throw new Error(`Groq API error (${response.status}): ${error}`);
|
|
38
|
+
}
|
|
39
|
+
const data = (await response.json());
|
|
40
|
+
const content = data.choices[0]?.message?.content ?? '';
|
|
41
|
+
return {
|
|
42
|
+
content,
|
|
43
|
+
usage: {
|
|
44
|
+
promptTokens: data.usage?.prompt_tokens ?? 0,
|
|
45
|
+
completionTokens: data.usage?.completion_tokens ?? 0,
|
|
46
|
+
totalTokens: data.usage?.total_tokens ?? 0,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
async function* chatStream(messages) {
|
|
51
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
52
|
+
method: 'POST',
|
|
53
|
+
headers: {
|
|
54
|
+
'Content-Type': 'application/json',
|
|
55
|
+
Authorization: `Bearer ${apiKey}`,
|
|
56
|
+
},
|
|
57
|
+
body: JSON.stringify({
|
|
58
|
+
model,
|
|
59
|
+
messages: messages.map((m) => ({ role: m.role, content: m.content })),
|
|
60
|
+
temperature: 0.7,
|
|
61
|
+
stream: true,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
const error = await response.text();
|
|
66
|
+
throw new Error(`Groq API error (${response.status}): ${error}`);
|
|
67
|
+
}
|
|
68
|
+
const reader = response.body?.getReader();
|
|
69
|
+
if (!reader)
|
|
70
|
+
throw new Error('No response body');
|
|
71
|
+
const decoder = new TextDecoder();
|
|
72
|
+
let buffer = '';
|
|
73
|
+
while (true) {
|
|
74
|
+
const { done, value } = await reader.read();
|
|
75
|
+
if (done)
|
|
76
|
+
break;
|
|
77
|
+
buffer += decoder.decode(value, { stream: true });
|
|
78
|
+
const lines = buffer.split('\n');
|
|
79
|
+
buffer = lines.pop() ?? '';
|
|
80
|
+
for (const line of lines) {
|
|
81
|
+
const trimmed = line.trim();
|
|
82
|
+
if (!trimmed || trimmed === 'data: [DONE]')
|
|
83
|
+
continue;
|
|
84
|
+
if (!trimmed.startsWith('data: '))
|
|
85
|
+
continue;
|
|
86
|
+
try {
|
|
87
|
+
const json = JSON.parse(trimmed.slice(6));
|
|
88
|
+
const content = json.choices[0]?.delta?.content;
|
|
89
|
+
if (content)
|
|
90
|
+
yield content;
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Skip malformed JSON
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function embed(_text) {
|
|
99
|
+
// Groq doesn't support embeddings yet
|
|
100
|
+
throw new Error('Groq does not support embeddings. Use OpenAI or Ollama for embeddings.');
|
|
101
|
+
}
|
|
102
|
+
return { chat, chatStream, embed };
|
|
103
|
+
}
|
|
104
|
+
function getEnvApiKey() {
|
|
105
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
106
|
+
return process.env.GROQ_API_KEY;
|
|
107
|
+
}
|
|
108
|
+
if (typeof Deno !== 'undefined') {
|
|
109
|
+
return Deno.env.get('GROQ_API_KEY');
|
|
110
|
+
}
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=groq.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"groq.js","sourceRoot":"","sources":["../../src/providers/groq.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Provider
|
|
3
|
+
* 100% FREE - runs models locally on your machine
|
|
4
|
+
* Install: https://ollama.ai
|
|
5
|
+
* Models: llama3, mistral, codellama, phi, gemma, etc.
|
|
6
|
+
*/
|
|
7
|
+
import type { Provider, ProviderConfig } from '../core/client.js';
|
|
8
|
+
export interface OllamaConfig extends ProviderConfig {
|
|
9
|
+
model?: string;
|
|
10
|
+
baseUrl?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare const OLLAMA_MODELS: {
|
|
13
|
+
readonly llama3: "llama3";
|
|
14
|
+
readonly 'llama3.2': "llama3.2";
|
|
15
|
+
readonly mistral: "mistral";
|
|
16
|
+
readonly codellama: "codellama";
|
|
17
|
+
readonly phi: "phi";
|
|
18
|
+
readonly gemma: "gemma";
|
|
19
|
+
readonly gemma2: "gemma2";
|
|
20
|
+
readonly qwen: "qwen";
|
|
21
|
+
readonly deepseek: "deepseek-r1";
|
|
22
|
+
};
|
|
23
|
+
export declare function createOllamaProvider(config?: OllamaConfig): Provider;
|
|
24
|
+
//# sourceMappingURL=ollama.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAA4C,MAAM,mBAAmB,CAAC;AAI5G,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAGD,eAAO,MAAM,aAAa;;;;;;;;;;CAUhB,CAAC;AAEX,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,YAAiB,GAAG,QAAQ,CAyHxE"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ollama Provider
|
|
3
|
+
* 100% FREE - runs models locally on your machine
|
|
4
|
+
* Install: https://ollama.ai
|
|
5
|
+
* Models: llama3, mistral, codellama, phi, gemma, etc.
|
|
6
|
+
*/
|
|
7
|
+
const OLLAMA_DEFAULT_URL = 'http://localhost:11434';
|
|
8
|
+
// Popular free models for Ollama
|
|
9
|
+
export const OLLAMA_MODELS = {
|
|
10
|
+
'llama3': 'llama3',
|
|
11
|
+
'llama3.2': 'llama3.2',
|
|
12
|
+
'mistral': 'mistral',
|
|
13
|
+
'codellama': 'codellama',
|
|
14
|
+
'phi': 'phi',
|
|
15
|
+
'gemma': 'gemma',
|
|
16
|
+
'gemma2': 'gemma2',
|
|
17
|
+
'qwen': 'qwen',
|
|
18
|
+
'deepseek': 'deepseek-r1',
|
|
19
|
+
};
|
|
20
|
+
export function createOllamaProvider(config = {}) {
|
|
21
|
+
const model = config.model ?? 'llama3.2';
|
|
22
|
+
const baseUrl = config.baseUrl ?? OLLAMA_DEFAULT_URL;
|
|
23
|
+
async function chat(messages) {
|
|
24
|
+
const response = await fetch(`${baseUrl}/api/chat`, {
|
|
25
|
+
method: 'POST',
|
|
26
|
+
headers: {
|
|
27
|
+
'Content-Type': 'application/json',
|
|
28
|
+
},
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
model,
|
|
31
|
+
messages: messages.map((m) => ({ role: m.role, content: m.content })),
|
|
32
|
+
stream: false,
|
|
33
|
+
}),
|
|
34
|
+
});
|
|
35
|
+
if (!response.ok) {
|
|
36
|
+
if (response.status === 404) {
|
|
37
|
+
throw new Error(`Model "${model}" not found. Run: ollama pull ${model}`);
|
|
38
|
+
}
|
|
39
|
+
const error = await response.text();
|
|
40
|
+
throw new Error(`Ollama error (${response.status}): ${error}`);
|
|
41
|
+
}
|
|
42
|
+
const data = (await response.json());
|
|
43
|
+
return {
|
|
44
|
+
content: data.message?.content ?? '',
|
|
45
|
+
usage: {
|
|
46
|
+
promptTokens: data.prompt_eval_count ?? 0,
|
|
47
|
+
completionTokens: data.eval_count ?? 0,
|
|
48
|
+
totalTokens: (data.prompt_eval_count ?? 0) + (data.eval_count ?? 0),
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async function* chatStream(messages) {
|
|
53
|
+
const response = await fetch(`${baseUrl}/api/chat`, {
|
|
54
|
+
method: 'POST',
|
|
55
|
+
headers: {
|
|
56
|
+
'Content-Type': 'application/json',
|
|
57
|
+
},
|
|
58
|
+
body: JSON.stringify({
|
|
59
|
+
model,
|
|
60
|
+
messages: messages.map((m) => ({ role: m.role, content: m.content })),
|
|
61
|
+
stream: true,
|
|
62
|
+
}),
|
|
63
|
+
});
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
if (response.status === 404) {
|
|
66
|
+
throw new Error(`Model "${model}" not found. Run: ollama pull ${model}`);
|
|
67
|
+
}
|
|
68
|
+
const error = await response.text();
|
|
69
|
+
throw new Error(`Ollama error (${response.status}): ${error}`);
|
|
70
|
+
}
|
|
71
|
+
const reader = response.body?.getReader();
|
|
72
|
+
if (!reader)
|
|
73
|
+
throw new Error('No response body');
|
|
74
|
+
const decoder = new TextDecoder();
|
|
75
|
+
let buffer = '';
|
|
76
|
+
while (true) {
|
|
77
|
+
const { done, value } = await reader.read();
|
|
78
|
+
if (done)
|
|
79
|
+
break;
|
|
80
|
+
buffer += decoder.decode(value, { stream: true });
|
|
81
|
+
const lines = buffer.split('\n');
|
|
82
|
+
buffer = lines.pop() ?? '';
|
|
83
|
+
for (const line of lines) {
|
|
84
|
+
if (!line.trim())
|
|
85
|
+
continue;
|
|
86
|
+
try {
|
|
87
|
+
const json = JSON.parse(line);
|
|
88
|
+
if (json.message?.content) {
|
|
89
|
+
yield json.message.content;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// Skip malformed JSON
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function embed(text) {
|
|
99
|
+
const response = await fetch(`${baseUrl}/api/embeddings`, {
|
|
100
|
+
method: 'POST',
|
|
101
|
+
headers: {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
},
|
|
104
|
+
body: JSON.stringify({
|
|
105
|
+
model,
|
|
106
|
+
prompt: text,
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
if (!response.ok) {
|
|
110
|
+
const error = await response.text();
|
|
111
|
+
throw new Error(`Ollama error (${response.status}): ${error}`);
|
|
112
|
+
}
|
|
113
|
+
const data = (await response.json());
|
|
114
|
+
return {
|
|
115
|
+
embedding: data.embedding,
|
|
116
|
+
usage: {
|
|
117
|
+
totalTokens: 0, // Ollama doesn't report token usage for embeddings
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return { chat, chatStream, embed };
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=ollama.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider
|
|
3
|
+
* Minimal implementation using native fetch
|
|
4
|
+
*/
|
|
5
|
+
import type { Provider, ProviderConfig } from '../core/client.js';
|
|
6
|
+
export interface OpenAIConfig extends ProviderConfig {
|
|
7
|
+
model?: string;
|
|
8
|
+
embeddingModel?: string;
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function createOpenAIProvider(config?: OpenAIConfig): Provider;
|
|
12
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAA4C,MAAM,mBAAmB,CAAC;AAI5G,MAAM,WAAW,YAAa,SAAQ,cAAc;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,GAAE,YAAiB,GAAG,QAAQ,CA6HxE"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Provider
|
|
3
|
+
* Minimal implementation using native fetch
|
|
4
|
+
*/
|
|
5
|
+
const OPENAI_API_URL = 'https://api.openai.com/v1';
|
|
6
|
+
export function createOpenAIProvider(config = {}) {
|
|
7
|
+
const apiKey = config.apiKey ?? getEnvApiKey();
|
|
8
|
+
const model = config.model ?? 'gpt-4o-mini';
|
|
9
|
+
const embeddingModel = config.embeddingModel ?? 'text-embedding-3-small';
|
|
10
|
+
const baseUrl = config.baseUrl ?? OPENAI_API_URL;
|
|
11
|
+
if (!apiKey) {
|
|
12
|
+
throw new Error('OpenAI API key required. Set OPENAI_API_KEY env var or pass apiKey in config.');
|
|
13
|
+
}
|
|
14
|
+
async function chat(messages) {
|
|
15
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
headers: {
|
|
18
|
+
'Content-Type': 'application/json',
|
|
19
|
+
Authorization: `Bearer ${apiKey}`,
|
|
20
|
+
},
|
|
21
|
+
body: JSON.stringify({
|
|
22
|
+
model,
|
|
23
|
+
messages: messages.map((m) => ({ role: m.role, content: m.content })),
|
|
24
|
+
temperature: 0.7,
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
const error = await response.text();
|
|
29
|
+
throw new Error(`OpenAI API error (${response.status}): ${error}`);
|
|
30
|
+
}
|
|
31
|
+
const data = (await response.json());
|
|
32
|
+
const content = data.choices[0]?.message?.content ?? '';
|
|
33
|
+
return {
|
|
34
|
+
content,
|
|
35
|
+
usage: {
|
|
36
|
+
promptTokens: data.usage?.prompt_tokens ?? 0,
|
|
37
|
+
completionTokens: data.usage?.completion_tokens ?? 0,
|
|
38
|
+
totalTokens: data.usage?.total_tokens ?? 0,
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async function* chatStream(messages) {
|
|
43
|
+
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
44
|
+
method: 'POST',
|
|
45
|
+
headers: {
|
|
46
|
+
'Content-Type': 'application/json',
|
|
47
|
+
Authorization: `Bearer ${apiKey}`,
|
|
48
|
+
},
|
|
49
|
+
body: JSON.stringify({
|
|
50
|
+
model,
|
|
51
|
+
messages: messages.map((m) => ({ role: m.role, content: m.content })),
|
|
52
|
+
temperature: 0.7,
|
|
53
|
+
stream: true,
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
if (!response.ok) {
|
|
57
|
+
const error = await response.text();
|
|
58
|
+
throw new Error(`OpenAI API error (${response.status}): ${error}`);
|
|
59
|
+
}
|
|
60
|
+
const reader = response.body?.getReader();
|
|
61
|
+
if (!reader)
|
|
62
|
+
throw new Error('No response body');
|
|
63
|
+
const decoder = new TextDecoder();
|
|
64
|
+
let buffer = '';
|
|
65
|
+
while (true) {
|
|
66
|
+
const { done, value } = await reader.read();
|
|
67
|
+
if (done)
|
|
68
|
+
break;
|
|
69
|
+
buffer += decoder.decode(value, { stream: true });
|
|
70
|
+
const lines = buffer.split('\n');
|
|
71
|
+
buffer = lines.pop() ?? '';
|
|
72
|
+
for (const line of lines) {
|
|
73
|
+
const trimmed = line.trim();
|
|
74
|
+
if (!trimmed || trimmed === 'data: [DONE]')
|
|
75
|
+
continue;
|
|
76
|
+
if (!trimmed.startsWith('data: '))
|
|
77
|
+
continue;
|
|
78
|
+
try {
|
|
79
|
+
const json = JSON.parse(trimmed.slice(6));
|
|
80
|
+
const content = json.choices[0]?.delta?.content;
|
|
81
|
+
if (content)
|
|
82
|
+
yield content;
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Skip malformed JSON
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function embed(text) {
|
|
91
|
+
const response = await fetch(`${baseUrl}/embeddings`, {
|
|
92
|
+
method: 'POST',
|
|
93
|
+
headers: {
|
|
94
|
+
'Content-Type': 'application/json',
|
|
95
|
+
Authorization: `Bearer ${apiKey}`,
|
|
96
|
+
},
|
|
97
|
+
body: JSON.stringify({
|
|
98
|
+
model: embeddingModel,
|
|
99
|
+
input: text,
|
|
100
|
+
}),
|
|
101
|
+
});
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
const error = await response.text();
|
|
104
|
+
throw new Error(`OpenAI API error (${response.status}): ${error}`);
|
|
105
|
+
}
|
|
106
|
+
const data = (await response.json());
|
|
107
|
+
return {
|
|
108
|
+
embedding: data.data[0].embedding,
|
|
109
|
+
usage: {
|
|
110
|
+
totalTokens: data.usage?.total_tokens ?? 0,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
return { chat, chatStream, embed };
|
|
115
|
+
}
|
|
116
|
+
function getEnvApiKey() {
|
|
117
|
+
// Works in Node, Deno, Bun, and Cloudflare Workers
|
|
118
|
+
if (typeof process !== 'undefined' && process.env) {
|
|
119
|
+
return process.env.OPENAI_API_KEY;
|
|
120
|
+
}
|
|
121
|
+
// Deno
|
|
122
|
+
if (typeof Deno !== 'undefined') {
|
|
123
|
+
return Deno.env.get('OPENAI_API_KEY');
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimized prompts for each primitive
|
|
3
|
+
* These are carefully crafted to be concise yet effective
|
|
4
|
+
*/
|
|
5
|
+
export declare const PROMPTS: {
|
|
6
|
+
readonly summarize: (text: string, options?: {
|
|
7
|
+
maxLength?: number;
|
|
8
|
+
}) => {
|
|
9
|
+
system: string;
|
|
10
|
+
user: string;
|
|
11
|
+
};
|
|
12
|
+
readonly classify: (text: string, categories: readonly string[]) => {
|
|
13
|
+
system: string;
|
|
14
|
+
user: string;
|
|
15
|
+
};
|
|
16
|
+
readonly extract: (text: string, jsonSchema: object) => {
|
|
17
|
+
system: string;
|
|
18
|
+
user: string;
|
|
19
|
+
};
|
|
20
|
+
readonly translate: (text: string, targetLanguage: string) => {
|
|
21
|
+
system: string;
|
|
22
|
+
user: string;
|
|
23
|
+
};
|
|
24
|
+
readonly ask: (question: string, context?: string) => {
|
|
25
|
+
system: string;
|
|
26
|
+
user: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,OAAO;+BACA,MAAM,YAAY;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;;;;8BAOzC,MAAM,cAAc,SAAS,MAAM,EAAE;;;;6BAKtC,MAAM,cAAc,MAAM;;;;+BAKxB,MAAM,kBAAkB,MAAM;;;;6BAKhC,MAAM,YAAY,MAAM;;;;CAIhC,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimized prompts for each primitive
|
|
3
|
+
* These are carefully crafted to be concise yet effective
|
|
4
|
+
*/
|
|
5
|
+
export const PROMPTS = {
|
|
6
|
+
summarize: (text, options) => ({
|
|
7
|
+
system: 'You are a concise summarizer. Output only the summary, no preamble.',
|
|
8
|
+
user: options?.maxLength
|
|
9
|
+
? `Summarize in ${options.maxLength} words or less:\n\n${text}`
|
|
10
|
+
: `Summarize:\n\n${text}`,
|
|
11
|
+
}),
|
|
12
|
+
classify: (text, categories) => ({
|
|
13
|
+
system: `You are a classifier. Respond with exactly one of these categories: ${categories.join(', ')}. No explanation.`,
|
|
14
|
+
user: `Classify:\n\n${text}`,
|
|
15
|
+
}),
|
|
16
|
+
extract: (text, jsonSchema) => ({
|
|
17
|
+
system: `Extract data matching this JSON schema. Respond with valid JSON only, no markdown.\nSchema: ${JSON.stringify(jsonSchema)}`,
|
|
18
|
+
user: text,
|
|
19
|
+
}),
|
|
20
|
+
translate: (text, targetLanguage) => ({
|
|
21
|
+
system: `You are a translator. Translate to ${targetLanguage}. Output only the translation.`,
|
|
22
|
+
user: text,
|
|
23
|
+
}),
|
|
24
|
+
ask: (question, context) => ({
|
|
25
|
+
system: 'Answer concisely and accurately.',
|
|
26
|
+
user: context ? `Context: ${context}\n\nQuestion: ${question}` : question,
|
|
27
|
+
}),
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,SAAS,EAAE,CAAC,IAAY,EAAE,OAAgC,EAAE,EAAE,CAAC,CAAC;QAC9D,MAAM,EAAE,qEAAqE;QAC7E,IAAI,EAAE,OAAO,EAAE,SAAS;YACtB,CAAC,CAAC,gBAAgB,OAAO,CAAC,SAAS,sBAAsB,IAAI,EAAE;YAC/D,CAAC,CAAC,iBAAiB,IAAI,EAAE;KAC5B,CAAC;IAEF,QAAQ,EAAE,CAAC,IAAY,EAAE,UAA6B,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,EAAE,uEAAuE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB;QACvH,IAAI,EAAE,gBAAgB,IAAI,EAAE;KAC7B,CAAC;IAEF,OAAO,EAAE,CAAC,IAAY,EAAE,UAAkB,EAAE,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,+FAA+F,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE;QACnI,IAAI,EAAE,IAAI;KACX,CAAC;IAEF,SAAS,EAAE,CAAC,IAAY,EAAE,cAAsB,EAAE,EAAE,CAAC,CAAC;QACpD,MAAM,EAAE,sCAAsC,cAAc,gCAAgC;QAC5F,IAAI,EAAE,IAAI;KACX,CAAC;IAEF,GAAG,EAAE,CAAC,QAAgB,EAAE,OAAgB,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,EAAE,kCAAkC;QAC1C,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,OAAO,iBAAiB,QAAQ,EAAE,CAAC,CAAC,CAAC,QAAQ;KAC1E,CAAC;CACM,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry with exponential backoff
|
|
3
|
+
*/
|
|
4
|
+
export interface RetryOptions {
|
|
5
|
+
maxRetries?: number;
|
|
6
|
+
baseDelay?: number;
|
|
7
|
+
maxDelay?: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function withRetry<T>(fn: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
10
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CA0BZ"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry with exponential backoff
|
|
3
|
+
*/
|
|
4
|
+
const DEFAULT_OPTIONS = {
|
|
5
|
+
maxRetries: 3,
|
|
6
|
+
baseDelay: 1000,
|
|
7
|
+
maxDelay: 10000,
|
|
8
|
+
};
|
|
9
|
+
export async function withRetry(fn, options = {}) {
|
|
10
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
11
|
+
let lastError;
|
|
12
|
+
for (let attempt = 0; attempt <= opts.maxRetries; attempt++) {
|
|
13
|
+
try {
|
|
14
|
+
return await fn();
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
18
|
+
// Don't retry on non-retryable errors
|
|
19
|
+
if (!isRetryable(lastError)) {
|
|
20
|
+
throw lastError;
|
|
21
|
+
}
|
|
22
|
+
if (attempt < opts.maxRetries) {
|
|
23
|
+
const delay = Math.min(opts.baseDelay * Math.pow(2, attempt), opts.maxDelay);
|
|
24
|
+
await sleep(delay);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
throw lastError;
|
|
29
|
+
}
|
|
30
|
+
function isRetryable(error) {
|
|
31
|
+
const message = error.message.toLowerCase();
|
|
32
|
+
// Rate limits and server errors are retryable
|
|
33
|
+
if (message.includes('rate limit') || message.includes('429'))
|
|
34
|
+
return true;
|
|
35
|
+
if (message.includes('500') || message.includes('502') || message.includes('503'))
|
|
36
|
+
return true;
|
|
37
|
+
if (message.includes('timeout') || message.includes('network'))
|
|
38
|
+
return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
function sleep(ms) {
|
|
42
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/utils/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,MAAM,eAAe,GAA2B;IAC9C,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,IAAI;IACf,QAAQ,EAAE,KAAK;CAChB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,UAAwB,EAAE;IAE1B,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;IAChD,IAAI,SAA4B,CAAC;IAEjC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;QAC5D,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,SAAS,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAEtE,sCAAsC;YACtC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5B,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,EACrC,IAAI,CAAC,QAAQ,CACd,CAAC;gBACF,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,KAAY;IAC/B,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAC5C,8CAA8C;IAC9C,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3E,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/F,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|