@aeye/ai 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.
Files changed (54) hide show
  1. package/README.md +1324 -0
  2. package/dist/ai.d.ts +204 -0
  3. package/dist/ai.d.ts.map +1 -0
  4. package/dist/ai.js +837 -0
  5. package/dist/ai.js.map +1 -0
  6. package/dist/apis/base.d.ts +181 -0
  7. package/dist/apis/base.d.ts.map +1 -0
  8. package/dist/apis/base.js +359 -0
  9. package/dist/apis/base.js.map +1 -0
  10. package/dist/apis/chat.d.ts +82 -0
  11. package/dist/apis/chat.d.ts.map +1 -0
  12. package/dist/apis/chat.js +214 -0
  13. package/dist/apis/chat.js.map +1 -0
  14. package/dist/apis/embed.d.ts +27 -0
  15. package/dist/apis/embed.d.ts.map +1 -0
  16. package/dist/apis/embed.js +70 -0
  17. package/dist/apis/embed.js.map +1 -0
  18. package/dist/apis/image.d.ts +77 -0
  19. package/dist/apis/image.d.ts.map +1 -0
  20. package/dist/apis/image.js +313 -0
  21. package/dist/apis/image.js.map +1 -0
  22. package/dist/apis/models.d.ts +108 -0
  23. package/dist/apis/models.d.ts.map +1 -0
  24. package/dist/apis/models.js +118 -0
  25. package/dist/apis/models.js.map +1 -0
  26. package/dist/apis/speech.d.ts +27 -0
  27. package/dist/apis/speech.d.ts.map +1 -0
  28. package/dist/apis/speech.js +79 -0
  29. package/dist/apis/speech.js.map +1 -0
  30. package/dist/apis/transcribe.d.ts +26 -0
  31. package/dist/apis/transcribe.d.ts.map +1 -0
  32. package/dist/apis/transcribe.js +103 -0
  33. package/dist/apis/transcribe.js.map +1 -0
  34. package/dist/common.d.ts +10 -0
  35. package/dist/common.d.ts.map +1 -0
  36. package/dist/common.js +17 -0
  37. package/dist/common.js.map +1 -0
  38. package/dist/index.d.ts +17 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +17 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/modelDetection.d.ts +31 -0
  43. package/dist/modelDetection.d.ts.map +1 -0
  44. package/dist/modelDetection.js +78 -0
  45. package/dist/modelDetection.js.map +1 -0
  46. package/dist/registry.d.ts +150 -0
  47. package/dist/registry.d.ts.map +1 -0
  48. package/dist/registry.js +639 -0
  49. package/dist/registry.js.map +1 -0
  50. package/dist/types.d.ts +767 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +8 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +53 -0
package/dist/ai.d.ts ADDED
@@ -0,0 +1,204 @@
1
+ /**
2
+ * AI Class - Main Entry Point
3
+ *
4
+ * Instance-based AI library similar to OpenAI's SDK.
5
+ * Provides type-safe, scoped access to AI capabilities with hooks and context injection.
6
+ */
7
+ import { Agent, Extend, MessageContentType, Prompt, Tool, ToolCompatible, Tuple } from '@aeye/core';
8
+ import { ChatAPI } from './apis/chat';
9
+ import { EmbedAPI } from './apis/embed';
10
+ import { ImageAPI } from './apis/image';
11
+ import { ModelsAPI } from './apis/models';
12
+ import { SpeechAPI } from './apis/speech';
13
+ import { TranscribeAPI } from './apis/transcribe';
14
+ import { ModelRegistry } from './registry';
15
+ import type { AgentInput, AIBaseMetadata, AIBaseTypes, AIConfig, AIConfigOf, AIContext, AIContextOptional, AIContextRequired, AIContextUser, AIHooks, AIMetadata, AIMetadataRequired, AIMetadataUser, AIProviderNames, AIProviders, AITypesInfer, ComponentFor, ComponentInput, ComponentOutput, Context, LibraryStats, Message, ModelInfo, ModelOverride, PromptInput, Providers, Request, SelectedModelFor, ToolInput, Usage } from './types';
16
+ /**
17
+ * AI Class
18
+ *
19
+ * @template T - AIBaseTypes container with all type information
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const ai = AI.with<AppContext, AppMetadata>()
24
+ * .providers({ openai, openrouter })
25
+ * .create({
26
+ * defaultContext: { baseURL: 'https://api.example.com' },
27
+ * providedContext: async (ctx) => ({ db, user }),
28
+ * hooks: {
29
+ * beforeRequest: async (ctx, request, selected, estimatedTokens, estimatedCost) => {
30
+ * // Check budget
31
+ * },
32
+ * afterRequest: async (ctx, request, response, responseComplete, selected, usage, cost) => {
33
+ * // Track usage
34
+ * }
35
+ * }
36
+ * });
37
+ *
38
+ * // Use the API
39
+ * const response = await ai.chat.get([{ role: 'user', content: 'Hi' }]);
40
+ * ```
41
+ */
42
+ export declare class AI<T extends AIBaseTypes> {
43
+ readonly config: AIConfigOf<T>;
44
+ readonly registry: ModelRegistry<AIProviders<T>>;
45
+ readonly chat: ChatAPI<T>;
46
+ readonly image: ImageAPI<T>;
47
+ readonly speech: SpeechAPI<T>;
48
+ readonly transcribe: TranscribeAPI<T>;
49
+ readonly embed: EmbedAPI<T>;
50
+ readonly models: ModelsAPI<AIProviders<T>>;
51
+ readonly providers: AIProviders<T>;
52
+ readonly components: ComponentFor<T>[];
53
+ hooks: AIHooks<T>;
54
+ private cumulativeCost;
55
+ private cumulativeLatency;
56
+ private cumulativeRequestCount;
57
+ readonly tokens: Record<MessageContentType, {
58
+ divisor: number;
59
+ base64Divisor: number;
60
+ fallback: number;
61
+ max?: number;
62
+ }>;
63
+ /**
64
+ * Static builder for creating AI instances with type inference
65
+ */
66
+ static with<TContext extends AIContextUser = {}, TMetadata extends AIMetadataUser = {}>(): {
67
+ providers: <TProviders extends Providers>(providers: TProviders) => {
68
+ create: <TConfig extends Omit<AIConfig<TContext, TMetadata, TProviders>, "providers">>(config: TConfig) => AI<AITypesInfer<TContext, TMetadata, TProviders, TConfig>>;
69
+ };
70
+ };
71
+ constructor(config: AIConfigOf<T>);
72
+ /**
73
+ * Sets the hooks for this AI instance and returns the instance.
74
+ *
75
+ * @param hooks - Hooks to set
76
+ * @returns this
77
+ */
78
+ withHooks(hooks: AIHooks<T>): this;
79
+ /**
80
+ * Build full context from required context
81
+ *
82
+ * Merges defaults → provided → required in that order
83
+ *
84
+ * @param requiredCtx - Required context provided by caller
85
+ * @returns Full AIContext with all fields populated
86
+ */
87
+ buildContext(requiredCtx: AIContextRequired<T>): Promise<AIContext<T>>;
88
+ /**
89
+ * Build core context with executor and streamer injected from ChatAPI
90
+ *
91
+ * This is used by Prompts to get stream/execute functions in the context.
92
+ *
93
+ * @param requiredCtx - Required context provided by caller
94
+ * @returns Full context with stream and execute functions
95
+ */
96
+ buildCoreContext(requiredCtx: AIContextRequired<T>): Promise<Context<T>>;
97
+ /**
98
+ * Build full metadata from required metadata
99
+ *
100
+ * Merges defaults → provided → required in that order
101
+ *
102
+ * @param requiredMetadata - Required metadata provided by caller
103
+ * @returns Full AIMetadata with all fields populated
104
+ */
105
+ buildMetadata(requiredMetadata: AIMetadataRequired<T>): Promise<AIMetadata<T>>;
106
+ /**
107
+ * Merges multiple metadata objects into one. Some properties may be
108
+ * merged in a special way depending on their type. The metadata objects
109
+ * are merged in the order they are provided, with later objects
110
+ * overriding earlier ones.
111
+ *
112
+ * @param metadatas
113
+ * @returns
114
+ */
115
+ mergeMetadata(...metadatas: Array<Partial<AIMetadata<T> | undefined>>): AIMetadata<T>;
116
+ /**
117
+ * Select a model based on metadata (used by API classes)
118
+ * @internal
119
+ */
120
+ selectModel(metadata: AIMetadata<T>): SelectedModelFor<T> | undefined;
121
+ /**
122
+ * Estimate usage for a message (used by API classes and Prompts)
123
+ *
124
+ * @param message - Message to estimate usage for
125
+ * @returns Usage statistics structured to match ModelPricing
126
+ */
127
+ estimateMessageUsage(message: Message): Usage;
128
+ /**
129
+ * Estimate usage for a request (used by API classes)
130
+ * @internal
131
+ */
132
+ estimateRequestUsage(request: Request): Usage;
133
+ /**
134
+ * Calculate cost for a request (used by API classes)
135
+ * Matches the structure of Usage to ModelPricing for accurate cost calculation.
136
+ * @internal
137
+ */
138
+ calculateCost(model: ModelInfo<AIProviderNames<T>>, usage: Usage): number;
139
+ /**
140
+ * Determines whether a given override matches a model.
141
+ *
142
+ * @param model - Model information
143
+ * @param override - Model override to check
144
+ * @returns
145
+ */
146
+ matchesOverride(model: ModelInfo, override: ModelOverride): boolean;
147
+ /**
148
+ * Run a component with AI instance context.
149
+ *
150
+ * @param component - Component to run
151
+ * @param input - Input for the component
152
+ * @param ctx - Optional context
153
+ */
154
+ run<C extends ComponentFor<T>>(component: C, input: ComponentInput<C>, ...[ctx]: AIContextOptional<T>): Promise<ComponentOutput<C>>;
155
+ /**
156
+ * Create an enhanced prompt bound to this AI instance.
157
+ *
158
+ * @template TName - Name of the prompt.
159
+ * @template TInput - Input type for the prompt.
160
+ * @template TOutput - Output type for the prompt.
161
+ * @template TTools - Tools used by the prompt.
162
+ * @param options - Prompt configuration options.
163
+ * @returns - An enhanced prompt instance.
164
+ */
165
+ prompt<TName extends string = string, TInput extends object = {}, TOutput extends object | string = string, TTools extends Tuple<ToolCompatible<AIContextRequired<T>, AIMetadataRequired<T>>> = []>(options: Omit<PromptInput<AIContext<T>, AIMetadata<T>, TName, TInput, TOutput, TTools>, 'types'>): Prompt<Partial<Omit<import("./types").AIBaseContext<T>, "ai">> & Omit<import("./types").Relax<T["Context"], T["DefaultContext"] & T["ProvidedContext"]>, keyof import("./types").AIBaseContext<AIBaseTypes>> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never, AIBaseMetadata<AIProviders<T>> & Omit<import("./types").Relax<T["Metadata"], T["DefaultMetadata"] & T["ProvidedMetadata"]>, keyof import("./types").AIMetadataAny> extends infer T_2 ? { [K_1 in keyof T_2]: T_2[K_1]; } : never, TName, TInput, TOutput, TTools>;
166
+ /**
167
+ * Create an enhanced tool bound to this AI instance
168
+ */
169
+ tool<TName extends string = string, TParams extends object = {}, TOutput = unknown, TRefs extends Tuple<ComponentFor<T>> = []>(options: Omit<ToolInput<AIContext<T>, AIMetadata<T>, TName, TParams, TOutput, TRefs>, 'types'>): Tool<Partial<Omit<import("./types").AIBaseContext<T>, "ai">> & Omit<import("./types").Relax<T["Context"], T["DefaultContext"] & T["ProvidedContext"]>, keyof import("./types").AIBaseContext<AIBaseTypes>> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never, AIBaseMetadata<AIProviders<T>> & Omit<import("./types").Relax<T["Metadata"], T["DefaultMetadata"] & T["ProvidedMetadata"]>, keyof import("./types").AIMetadataAny> extends infer T_2 ? { [K_1 in keyof T_2]: T_2[K_1]; } : never, TName, TParams, Promise<TOutput>, TRefs>;
170
+ /**
171
+ * Create an enhanced agent bound to this AI instance
172
+ */
173
+ agent<TName extends string = string, TInput extends object = {}, TOutput = unknown, TRefs extends Tuple<ComponentFor<T>> = []>(options: Omit<AgentInput<AIContext<T>, AIMetadata<T>, TName, TInput, TOutput, TRefs>, 'types'>): Agent<Partial<Omit<import("./types").AIBaseContext<T>, "ai">> & Omit<import("./types").Relax<T["Context"], T["DefaultContext"] & T["ProvidedContext"]>, keyof import("./types").AIBaseContext<AIBaseTypes>> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never, AIBaseMetadata<AIProviders<T>> & Omit<import("./types").Relax<T["Metadata"], T["DefaultMetadata"] & T["ProvidedMetadata"]>, keyof import("./types").AIMetadataAny> extends infer T_2 ? { [K_1 in keyof T_2]: T_2[K_1]; } : never, TName, TInput, Promise<TOutput>, TRefs>;
174
+ /**
175
+ * Extend this AI instance with additional context type
176
+ *
177
+ * Creates a new AI instance that shares the base model registry but can have
178
+ * its own models, overrides, handlers, and extended context type.
179
+ *
180
+ * @example
181
+ * ```typescript
182
+ * const chatAI = ai.extend<{ chat: Chat, chatMessage: ChatMessage }>({
183
+ * defaultContext: { chat, chatMessage },
184
+ * modelOverrides: [...]
185
+ * });
186
+ * const chatAgent = chatAI.agent({...});
187
+ * ```
188
+ */
189
+ extend<TExtendedContext extends object = {}, TExtendedMetadata extends object = {}>(config?: Partial<AIConfig<Extend<T['Context'], TExtendedContext>, Extend<T['Metadata'], TExtendedMetadata>, AIProviders<T>>>): AI<AITypesInfer<Extend<T["Context"], TExtendedContext>, Extend<T["Metadata"], TExtendedMetadata>, AIProviders<T>, Partial<AIConfig<Extend<T["Context"], TExtendedContext>, Extend<T["Metadata"], TExtendedMetadata>, AIProviders<T>>>>>;
190
+ /**
191
+ * Track a request's cost and latency for statistics.
192
+ * Called internally by API classes after successful requests.
193
+ *
194
+ * @param cost - Cost of the request in dollars
195
+ * @param latency - Latency of the request in milliseconds
196
+ * @internal
197
+ */
198
+ trackRequest(cost: number, latency: number): void;
199
+ /**
200
+ * Get library statistics
201
+ */
202
+ stats(): LibraryStats;
203
+ }
204
+ //# sourceMappingURL=ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../src/ai.ts"],"names":[],"mappings":"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"}