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
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinyAI - The 5KB AI SDK
|
|
3
|
+
* AI utilities that fit in a tweet. Zero dependencies. Just works.
|
|
4
|
+
*/
|
|
5
|
+
import { type TinyAIConfig, type TinyAIClient } from './core/client.js';
|
|
6
|
+
import type { SchemaObject, InferSchema } from './core/schema.js';
|
|
7
|
+
export type { TinyAIConfig, TinyAIClient } from './core/client.js';
|
|
8
|
+
export type { SchemaObject, InferSchema } from './core/schema.js';
|
|
9
|
+
export type { SummarizeOptions } from './primitives/summarize.js';
|
|
10
|
+
export type { ClassifyOptions } from './primitives/classify.js';
|
|
11
|
+
export type { ExtractOptions } from './primitives/extract.js';
|
|
12
|
+
export type { TranslateOptions } from './primitives/translate.js';
|
|
13
|
+
export type { AskOptions } from './primitives/ask.js';
|
|
14
|
+
export type { EmbedOptions } from './primitives/embed.js';
|
|
15
|
+
export type { GenerateOptions } from './primitives/generate.js';
|
|
16
|
+
export { summarize, summarizeStream } from './primitives/summarize.js';
|
|
17
|
+
export { classify } from './primitives/classify.js';
|
|
18
|
+
export { extract } from './primitives/extract.js';
|
|
19
|
+
export { translate, translateStream } from './primitives/translate.js';
|
|
20
|
+
export { ask, askStream } from './primitives/ask.js';
|
|
21
|
+
export { embed, cosineSimilarity } from './primitives/embed.js';
|
|
22
|
+
export { generate, generateStream } from './primitives/generate.js';
|
|
23
|
+
export { createClient } from './core/client.js';
|
|
24
|
+
export { toReadableStream, collectStream } from './core/streaming.js';
|
|
25
|
+
/**
|
|
26
|
+
* TinyAI instance with all methods bound
|
|
27
|
+
*/
|
|
28
|
+
export interface TinyAI {
|
|
29
|
+
/** Summarize text */
|
|
30
|
+
summarize(text: string, options?: {
|
|
31
|
+
maxLength?: number;
|
|
32
|
+
}): Promise<string>;
|
|
33
|
+
/** Classify text into categories */
|
|
34
|
+
classify<T extends readonly string[]>(text: string, categories: T): Promise<T[number]>;
|
|
35
|
+
/** Extract structured data with type inference */
|
|
36
|
+
extract<T extends SchemaObject>(text: string, schema: T): Promise<InferSchema<T>>;
|
|
37
|
+
/** Translate text to another language */
|
|
38
|
+
translate(text: string, targetLanguage: string): Promise<string>;
|
|
39
|
+
/** Ask a question */
|
|
40
|
+
ask(question: string, options?: {
|
|
41
|
+
context?: string;
|
|
42
|
+
}): Promise<string>;
|
|
43
|
+
/** Generate embeddings */
|
|
44
|
+
embed(text: string): Promise<number[]>;
|
|
45
|
+
/** Low-level text generation */
|
|
46
|
+
generate(prompt: string, options?: {
|
|
47
|
+
system?: string;
|
|
48
|
+
}): Promise<string>;
|
|
49
|
+
/** Streaming versions */
|
|
50
|
+
stream: {
|
|
51
|
+
summarize(text: string, options?: {
|
|
52
|
+
maxLength?: number;
|
|
53
|
+
}): AsyncGenerator<string>;
|
|
54
|
+
translate(text: string, targetLanguage: string): AsyncGenerator<string>;
|
|
55
|
+
ask(question: string, options?: {
|
|
56
|
+
context?: string;
|
|
57
|
+
}): AsyncGenerator<string>;
|
|
58
|
+
generate(prompt: string, options?: {
|
|
59
|
+
system?: string;
|
|
60
|
+
}): AsyncGenerator<string>;
|
|
61
|
+
};
|
|
62
|
+
/** The underlying client */
|
|
63
|
+
client: TinyAIClient;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a TinyAI instance with a fluent API
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* import { tinyai } from 'tinyai';
|
|
71
|
+
*
|
|
72
|
+
* const ai = tinyai({ provider: 'openai', apiKey: '...' });
|
|
73
|
+
*
|
|
74
|
+
* const summary = await ai.summarize(longText);
|
|
75
|
+
* const sentiment = await ai.classify(review, ['positive', 'negative']);
|
|
76
|
+
* const data = await ai.extract(email, { name: 'string', amount: 'number' });
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare function tinyai(config?: TinyAIConfig): TinyAI;
|
|
80
|
+
export default tinyai;
|
|
81
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,kBAAkB,CAAC;AAQ1B,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAGlE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAClE,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,qBAAqB;IACrB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE3E,oCAAoC;IACpC,QAAQ,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,GACZ,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAEtB,kDAAkD;IAClD,OAAO,CAAC,CAAC,SAAS,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAElF,yCAAyC;IACzC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEjE,qBAAqB;IACrB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvE,0BAA0B;IAC1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvC,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEzE,yBAAyB;IACzB,MAAM,EAAE;QACN,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAClF,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACxE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;KACjF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,MAAM,GAAE,YAAiB,GAAG,MAAM,CAsBxD;AAGD,eAAe,MAAM,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TinyAI - The 5KB AI SDK
|
|
3
|
+
* AI utilities that fit in a tweet. Zero dependencies. Just works.
|
|
4
|
+
*/
|
|
5
|
+
import { createClient, setDefaultClient, } from './core/client.js';
|
|
6
|
+
import { summarize, summarizeStream } from './primitives/summarize.js';
|
|
7
|
+
import { classify } from './primitives/classify.js';
|
|
8
|
+
import { extract } from './primitives/extract.js';
|
|
9
|
+
import { translate, translateStream } from './primitives/translate.js';
|
|
10
|
+
import { ask, askStream } from './primitives/ask.js';
|
|
11
|
+
import { embed } from './primitives/embed.js';
|
|
12
|
+
import { generate, generateStream } from './primitives/generate.js';
|
|
13
|
+
// Re-export standalone functions
|
|
14
|
+
export { summarize, summarizeStream } from './primitives/summarize.js';
|
|
15
|
+
export { classify } from './primitives/classify.js';
|
|
16
|
+
export { extract } from './primitives/extract.js';
|
|
17
|
+
export { translate, translateStream } from './primitives/translate.js';
|
|
18
|
+
export { ask, askStream } from './primitives/ask.js';
|
|
19
|
+
export { embed, cosineSimilarity } from './primitives/embed.js';
|
|
20
|
+
export { generate, generateStream } from './primitives/generate.js';
|
|
21
|
+
export { createClient } from './core/client.js';
|
|
22
|
+
export { toReadableStream, collectStream } from './core/streaming.js';
|
|
23
|
+
/**
|
|
24
|
+
* Creates a TinyAI instance with a fluent API
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```ts
|
|
28
|
+
* import { tinyai } from 'tinyai';
|
|
29
|
+
*
|
|
30
|
+
* const ai = tinyai({ provider: 'openai', apiKey: '...' });
|
|
31
|
+
*
|
|
32
|
+
* const summary = await ai.summarize(longText);
|
|
33
|
+
* const sentiment = await ai.classify(review, ['positive', 'negative']);
|
|
34
|
+
* const data = await ai.extract(email, { name: 'string', amount: 'number' });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function tinyai(config = {}) {
|
|
38
|
+
const client = createClient(config);
|
|
39
|
+
// Set as default so standalone functions work
|
|
40
|
+
setDefaultClient(client);
|
|
41
|
+
return {
|
|
42
|
+
summarize: (text, options) => summarize(text, { ...options, client }),
|
|
43
|
+
classify: (text, categories) => classify(text, categories, { client }),
|
|
44
|
+
extract: (text, schema) => extract(text, schema, { client }),
|
|
45
|
+
translate: (text, lang) => translate(text, lang, { client }),
|
|
46
|
+
ask: (question, options) => ask(question, { ...options, client }),
|
|
47
|
+
embed: (text) => embed(text, { client }),
|
|
48
|
+
generate: (prompt, options) => generate(prompt, { ...options, client }),
|
|
49
|
+
stream: {
|
|
50
|
+
summarize: (text, options) => summarizeStream(text, { ...options, client }),
|
|
51
|
+
translate: (text, lang) => translateStream(text, lang, { client }),
|
|
52
|
+
ask: (question, options) => askStream(question, { ...options, client }),
|
|
53
|
+
generate: (prompt, options) => generateStream(prompt, { ...options, client }),
|
|
54
|
+
},
|
|
55
|
+
client,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// Default export
|
|
59
|
+
export default tinyai;
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ask() - Simple Q&A
|
|
3
|
+
*/
|
|
4
|
+
import type { TinyAIClient } from '../core/client.js';
|
|
5
|
+
export interface AskOptions {
|
|
6
|
+
context?: string;
|
|
7
|
+
client?: TinyAIClient;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Asks a question and gets an answer
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const answer = await ask("What's the capital of France?");
|
|
15
|
+
* const specific = await ask("What's the price?", { context: invoiceText });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function ask(question: string, options?: AskOptions): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Asks a question with streaming response
|
|
21
|
+
*/
|
|
22
|
+
export declare function askStream(question: string, options?: AskOptions): AsyncGenerator<string, void, unknown>;
|
|
23
|
+
//# sourceMappingURL=ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../../src/primitives/ask.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,GAAG,CACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAuB,SAAS,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,UAAe,GACvB,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAQvC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ask() - Simple Q&A
|
|
3
|
+
*/
|
|
4
|
+
import { getDefaultClient } from '../core/client.js';
|
|
5
|
+
import { PROMPTS } from '../utils/prompts.js';
|
|
6
|
+
import { withRetry } from '../utils/retry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Asks a question and gets an answer
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const answer = await ask("What's the capital of France?");
|
|
13
|
+
* const specific = await ask("What's the price?", { context: invoiceText });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export async function ask(question, options = {}) {
|
|
17
|
+
const client = options.client ?? getDefaultClient();
|
|
18
|
+
const prompt = PROMPTS.ask(question, options.context);
|
|
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
|
+
* Asks a question with streaming response
|
|
27
|
+
*/
|
|
28
|
+
export async function* askStream(question, options = {}) {
|
|
29
|
+
const client = options.client ?? getDefaultClient();
|
|
30
|
+
const prompt = PROMPTS.ask(question, options.context);
|
|
31
|
+
yield* client.provider.chatStream([
|
|
32
|
+
{ role: 'system', content: prompt.system },
|
|
33
|
+
{ role: 'user', content: prompt.user },
|
|
34
|
+
]);
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=ask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../../src/primitives/ask.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;AAO9C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,QAAgB,EAChB,UAAsB,EAAE;IAExB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtD,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,SAAS,CAC9B,QAAgB,EAChB,UAAsB,EAAE;IAExB,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAEtD,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
|
+
* classify() - Classify text into categories
|
|
3
|
+
*/
|
|
4
|
+
import type { TinyAIClient } from '../core/client.js';
|
|
5
|
+
export interface ClassifyOptions {
|
|
6
|
+
client?: TinyAIClient;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Classifies text into one of the provided categories
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const sentiment = await classify(review, ['positive', 'negative', 'neutral']);
|
|
14
|
+
* const category = await classify(email, ['urgent', 'normal', 'spam']);
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function classify<T extends readonly string[]>(text: string, categories: T, options?: ClassifyOptions): Promise<T[number]>;
|
|
18
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/primitives/classify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,QAAQ,CAAC,CAAC,SAAS,SAAS,MAAM,EAAE,EACxD,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,CAAC,EACb,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAsCpB"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* classify() - Classify text into categories
|
|
3
|
+
*/
|
|
4
|
+
import { getDefaultClient } from '../core/client.js';
|
|
5
|
+
import { PROMPTS } from '../utils/prompts.js';
|
|
6
|
+
import { withRetry } from '../utils/retry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Classifies text into one of the provided categories
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const sentiment = await classify(review, ['positive', 'negative', 'neutral']);
|
|
13
|
+
* const category = await classify(email, ['urgent', 'normal', 'spam']);
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export async function classify(text, categories, options = {}) {
|
|
17
|
+
if (categories.length < 2) {
|
|
18
|
+
throw new Error('At least 2 categories required');
|
|
19
|
+
}
|
|
20
|
+
const client = options.client ?? getDefaultClient();
|
|
21
|
+
const prompt = PROMPTS.classify(text, categories);
|
|
22
|
+
const response = await withRetry(() => client.provider.chat([
|
|
23
|
+
{ role: 'system', content: prompt.system },
|
|
24
|
+
{ role: 'user', content: prompt.user },
|
|
25
|
+
]));
|
|
26
|
+
const result = response.content.trim().toLowerCase();
|
|
27
|
+
// Find the best matching category
|
|
28
|
+
const normalizedCategories = categories.map((c) => c.toLowerCase());
|
|
29
|
+
const exactMatch = normalizedCategories.find((c) => c === result || result.includes(c));
|
|
30
|
+
if (exactMatch) {
|
|
31
|
+
const index = normalizedCategories.indexOf(exactMatch);
|
|
32
|
+
return categories[index];
|
|
33
|
+
}
|
|
34
|
+
// If no exact match, return the first category mentioned
|
|
35
|
+
for (const category of categories) {
|
|
36
|
+
if (result.includes(category.toLowerCase())) {
|
|
37
|
+
return category;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// Fallback: return first category (shouldn't happen with good prompts)
|
|
41
|
+
console.warn(`TinyAI: Unexpected classify response "${result}", using first category`);
|
|
42
|
+
return categories[0];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=classify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/primitives/classify.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,QAAQ,CAC5B,IAAY,EACZ,UAAa,EACb,UAA2B,EAAE;IAE7B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAElD,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,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErD,kCAAkC;IAClC,MAAM,oBAAoB,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACpE,MAAM,UAAU,GAAG,oBAAoB,CAAC,IAAI,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAC1C,CAAC;IAEF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACvD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,yDAAyD;IACzD,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;QAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,OAAO,CAAC,IAAI,CAAC,yCAAyC,MAAM,yBAAyB,CAAC,CAAC;IACvF,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embed() - Generate text embeddings
|
|
3
|
+
*/
|
|
4
|
+
import type { TinyAIClient } from '../core/client.js';
|
|
5
|
+
export interface EmbedOptions {
|
|
6
|
+
client?: TinyAIClient;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generates an embedding vector for text
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const embedding = await embed("Hello, world!");
|
|
14
|
+
* // embedding is number[] with 1536 dimensions (OpenAI)
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function embed(text: string, options?: EmbedOptions): Promise<number[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Computes cosine similarity between two embeddings
|
|
20
|
+
*/
|
|
21
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
22
|
+
//# sourceMappingURL=embed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed.d.ts","sourceRoot":"","sources":["../../src/primitives/embed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAgBjE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embed() - Generate text embeddings
|
|
3
|
+
*/
|
|
4
|
+
import { getDefaultClient } from '../core/client.js';
|
|
5
|
+
import { withRetry } from '../utils/retry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generates an embedding vector for text
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const embedding = await embed("Hello, world!");
|
|
12
|
+
* // embedding is number[] with 1536 dimensions (OpenAI)
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export async function embed(text, options = {}) {
|
|
16
|
+
const client = options.client ?? getDefaultClient();
|
|
17
|
+
const response = await withRetry(() => client.provider.embed(text));
|
|
18
|
+
return response.embedding;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Computes cosine similarity between two embeddings
|
|
22
|
+
*/
|
|
23
|
+
export function cosineSimilarity(a, b) {
|
|
24
|
+
if (a.length !== b.length) {
|
|
25
|
+
throw new Error('Embeddings must have same length');
|
|
26
|
+
}
|
|
27
|
+
let dotProduct = 0;
|
|
28
|
+
let normA = 0;
|
|
29
|
+
let normB = 0;
|
|
30
|
+
for (let i = 0; i < a.length; i++) {
|
|
31
|
+
dotProduct += a[i] * b[i];
|
|
32
|
+
normA += a[i] * a[i];
|
|
33
|
+
normB += b[i] * b[i];
|
|
34
|
+
}
|
|
35
|
+
return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=embed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embed.js","sourceRoot":"","sources":["../../src/primitives/embed.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAM9C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,IAAY,EACZ,UAAwB,EAAE;IAE1B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IAEpD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAEpE,OAAO,QAAQ,CAAC,SAAS,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1B,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,UAAU,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extract() - Extract structured data from text
|
|
3
|
+
* The crown jewel of TinyAI - Zod-like type inference without dependencies
|
|
4
|
+
*/
|
|
5
|
+
import type { TinyAIClient } from '../core/client.js';
|
|
6
|
+
import { type SchemaObject, type InferSchema } from '../core/schema.js';
|
|
7
|
+
export interface ExtractOptions {
|
|
8
|
+
client?: TinyAIClient;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Extracts structured data from text with full type inference
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const invoice = await extract(pdfText, {
|
|
16
|
+
* vendor: 'string',
|
|
17
|
+
* total: 'number',
|
|
18
|
+
* items: [{ name: 'string', price: 'number' }],
|
|
19
|
+
* date: 'date',
|
|
20
|
+
* });
|
|
21
|
+
* // invoice has type: { vendor: string, total: number, items: {...}[], date: Date }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function extract<T extends SchemaObject>(text: string, schema: T, options?: ExtractOptions): Promise<InferSchema<T>>;
|
|
25
|
+
//# sourceMappingURL=extract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/primitives/extract.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,WAAW,EAGjB,MAAM,mBAAmB,CAAC;AAI3B,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS,YAAY,EAClD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CA2BzB"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* extract() - Extract structured data from text
|
|
3
|
+
* The crown jewel of TinyAI - Zod-like type inference without dependencies
|
|
4
|
+
*/
|
|
5
|
+
import { getDefaultClient } from '../core/client.js';
|
|
6
|
+
import { schemaToJsonSchema, parseResponse, } from '../core/schema.js';
|
|
7
|
+
import { PROMPTS } from '../utils/prompts.js';
|
|
8
|
+
import { withRetry } from '../utils/retry.js';
|
|
9
|
+
/**
|
|
10
|
+
* Extracts structured data from text with full type inference
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const invoice = await extract(pdfText, {
|
|
15
|
+
* vendor: 'string',
|
|
16
|
+
* total: 'number',
|
|
17
|
+
* items: [{ name: 'string', price: 'number' }],
|
|
18
|
+
* date: 'date',
|
|
19
|
+
* });
|
|
20
|
+
* // invoice has type: { vendor: string, total: number, items: {...}[], date: Date }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export async function extract(text, schema, options = {}) {
|
|
24
|
+
const client = options.client ?? getDefaultClient();
|
|
25
|
+
const jsonSchema = schemaToJsonSchema(schema);
|
|
26
|
+
const prompt = PROMPTS.extract(text, jsonSchema);
|
|
27
|
+
const response = await withRetry(() => client.provider.chat([
|
|
28
|
+
{ role: 'system', content: prompt.system },
|
|
29
|
+
{ role: 'user', content: prompt.user },
|
|
30
|
+
]));
|
|
31
|
+
// Parse JSON response
|
|
32
|
+
let data;
|
|
33
|
+
try {
|
|
34
|
+
// Handle potential markdown code blocks
|
|
35
|
+
let jsonStr = response.content.trim();
|
|
36
|
+
if (jsonStr.startsWith('```')) {
|
|
37
|
+
jsonStr = jsonStr.replace(/^```(?:json)?\n?/, '').replace(/\n?```$/, '');
|
|
38
|
+
}
|
|
39
|
+
data = JSON.parse(jsonStr);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error(`Failed to parse AI response as JSON: ${response.content}`);
|
|
43
|
+
}
|
|
44
|
+
// Convert types (especially dates)
|
|
45
|
+
return parseResponse(data, schema);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=extract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/primitives/extract.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAGL,kBAAkB,EAClB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAM9C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,MAAS,EACT,UAA0B,EAAE;IAE5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAEjD,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,sBAAsB;IACtB,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QACH,wCAAwC;QACxC,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wCAAwC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,mCAAmC;IACnC,OAAO,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generate() - Low-level text generation
|
|
3
|
+
*/
|
|
4
|
+
import type { TinyAIClient } from '../core/client.js';
|
|
5
|
+
export interface GenerateOptions {
|
|
6
|
+
system?: string;
|
|
7
|
+
client?: TinyAIClient;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Generates text from a prompt
|
|
11
|
+
* Lower-level than other primitives, for custom use cases
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```ts
|
|
15
|
+
* const poem = await generate("Write a haiku about coding");
|
|
16
|
+
* const story = await generate("Once upon a time...", {
|
|
17
|
+
* system: "You are a creative storyteller"
|
|
18
|
+
* });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function generate(prompt: string, options?: GenerateOptions): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Generates text with streaming
|
|
24
|
+
*/
|
|
25
|
+
export declare function generateStream(prompt: string, options?: GenerateOptions): AsyncGenerator<string, void, unknown>;
|
|
26
|
+
//# sourceMappingURL=generate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/primitives/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,mBAAmB,CAAC;AAInE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAuB,cAAc,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,eAAoB,GAC5B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAUvC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* generate() - Low-level text generation
|
|
3
|
+
*/
|
|
4
|
+
import { getDefaultClient } from '../core/client.js';
|
|
5
|
+
import { withRetry } from '../utils/retry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generates text from a prompt
|
|
8
|
+
* Lower-level than other primitives, for custom use cases
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const poem = await generate("Write a haiku about coding");
|
|
13
|
+
* const story = await generate("Once upon a time...", {
|
|
14
|
+
* system: "You are a creative storyteller"
|
|
15
|
+
* });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export async function generate(prompt, options = {}) {
|
|
19
|
+
const client = options.client ?? getDefaultClient();
|
|
20
|
+
const messages = [];
|
|
21
|
+
if (options.system) {
|
|
22
|
+
messages.push({ role: 'system', content: options.system });
|
|
23
|
+
}
|
|
24
|
+
messages.push({ role: 'user', content: prompt });
|
|
25
|
+
const response = await withRetry(() => client.provider.chat(messages));
|
|
26
|
+
return response.content;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generates text with streaming
|
|
30
|
+
*/
|
|
31
|
+
export async function* generateStream(prompt, options = {}) {
|
|
32
|
+
const client = options.client ?? getDefaultClient();
|
|
33
|
+
const messages = [];
|
|
34
|
+
if (options.system) {
|
|
35
|
+
messages.push({ role: 'system', content: options.system });
|
|
36
|
+
}
|
|
37
|
+
messages.push({ role: 'user', content: prompt });
|
|
38
|
+
yield* client.provider.chatStream(messages);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/primitives/generate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAO9C;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAc,EACd,UAA2B,EAAE;IAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IAEpD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEvE,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACnC,MAAc,EACd,UAA2B,EAAE;IAE7B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IAEpD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAEjD,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* summarize() - Summarize text
|
|
3
|
+
*/
|
|
4
|
+
import type { TinyAIClient } from '../core/client.js';
|
|
5
|
+
export interface SummarizeOptions {
|
|
6
|
+
maxLength?: number;
|
|
7
|
+
client?: TinyAIClient;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Summarizes text using AI
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const summary = await summarize(longArticle);
|
|
15
|
+
* const brief = await summarize(document, { maxLength: 50 });
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare function summarize(text: string, options?: SummarizeOptions): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Summarizes text with streaming
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* for await (const chunk of summarizeStream(text)) {
|
|
25
|
+
* process.stdout.write(chunk);
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare function summarizeStream(text: string, options?: SummarizeOptions): AsyncGenerator<string, void, unknown>;
|
|
30
|
+
//# sourceMappingURL=summarize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/primitives/summarize.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;;;;;;;;GASG;AACH,wBAAuB,eAAe,CACpC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,gBAAqB,GAC7B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAQvC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* summarize() - Summarize text
|
|
3
|
+
*/
|
|
4
|
+
import { getDefaultClient } from '../core/client.js';
|
|
5
|
+
import { PROMPTS } from '../utils/prompts.js';
|
|
6
|
+
import { withRetry } from '../utils/retry.js';
|
|
7
|
+
/**
|
|
8
|
+
* Summarizes text using AI
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const summary = await summarize(longArticle);
|
|
13
|
+
* const brief = await summarize(document, { maxLength: 50 });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export async function summarize(text, options = {}) {
|
|
17
|
+
const client = options.client ?? getDefaultClient();
|
|
18
|
+
const prompt = PROMPTS.summarize(text, options);
|
|
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
|
+
* Summarizes text with streaming
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```ts
|
|
30
|
+
* for await (const chunk of summarizeStream(text)) {
|
|
31
|
+
* process.stdout.write(chunk);
|
|
32
|
+
* }
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export async function* summarizeStream(text, options = {}) {
|
|
36
|
+
const client = options.client ?? getDefaultClient();
|
|
37
|
+
const prompt = PROMPTS.summarize(text, options);
|
|
38
|
+
yield* client.provider.chatStream([
|
|
39
|
+
{ role: 'system', content: prompt.system },
|
|
40
|
+
{ role: 'user', content: prompt.user },
|
|
41
|
+
]);
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/primitives/summarize.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;AAO9C;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,IAAY,EACZ,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEhD,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;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,IAAY,EACZ,UAA4B,EAAE;IAE9B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,gBAAgB,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEhD,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,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* translate() - Translate text to another language
|
|
3
|
+
*/
|
|
4
|
+
import type { TinyAIClient } from '../core/client.js';
|
|
5
|
+
export interface TranslateOptions {
|
|
6
|
+
client?: TinyAIClient;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Translates text to the specified language
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* const spanish = await translate('Hello, world!', 'spanish');
|
|
14
|
+
* const french = await translate(text, 'french');
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare function translate(text: string, targetLanguage: string, options?: TranslateOptions): Promise<string>;
|
|
18
|
+
/**
|
|
19
|
+
* Translates text with streaming
|
|
20
|
+
*/
|
|
21
|
+
export declare function translateStream(text: string, targetLanguage: string, options?: TranslateOptions): AsyncGenerator<string, void, unknown>;
|
|
22
|
+
//# sourceMappingURL=translate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translate.d.ts","sourceRoot":"","sources":["../../src/primitives/translate.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAKtD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAuB,eAAe,CACpC,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,gBAAqB,GAC7B,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAQvC"}
|