@juspay/neurolink 9.68.13 → 9.68.15

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.
@@ -1,33 +1,24 @@
1
1
  import type { AIProviderName } from "../constants/enums.js";
2
- import { BaseProvider } from "../core/baseProvider.js";
3
- import type { NeurolinkCredentials, StreamOptions, StreamResult, ValidationSchema } from "../types/index.js";
4
- import type { LanguageModel } from "../types/index.js";
2
+ import type { NeurolinkCredentials } from "../types/index.js";
3
+ import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
5
4
  /**
6
- * Groq Provider
5
+ * Groq Provider — direct HTTP, no AI SDK.
7
6
  *
8
7
  * Sub-100ms inference of Llama / Mistral / Gemma at api.groq.com/openai/v1
9
8
  * (OpenAI-compatible). Best for low-latency tier; trade-off vs other open
10
9
  * model hosts is throughput latency, not quality.
11
10
  *
11
+ * All request/stream/tool-loop orchestration lives in
12
+ * `OpenAIChatCompletionsProvider`; this class only declares configuration
13
+ * and provider-specific error mapping.
14
+ *
12
15
  * @see https://console.groq.com/docs/quickstart
13
16
  */
14
- export declare class GroqProvider extends BaseProvider {
15
- private model;
16
- private apiKey;
17
- private baseURL;
17
+ export declare class GroqProvider extends OpenAIChatCompletionsProvider {
18
18
  constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["groq"]);
19
- protected executeStream(options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
20
- private executeStreamInner;
21
19
  protected getProviderName(): AIProviderName;
22
20
  protected getDefaultModel(): string;
23
- protected getAISDKModel(): LanguageModel;
21
+ protected getFallbackModelName(): string;
22
+ protected getFallbackModels(): string[];
24
23
  protected formatProviderError(error: unknown): Error;
25
- validateConfiguration(): Promise<boolean>;
26
- getConfiguration(): {
27
- provider: AIProviderName;
28
- model: string;
29
- defaultModel: string;
30
- baseURL: string;
31
- };
32
24
  }
33
- export default GroqProvider;
@@ -1,144 +1,59 @@
1
- import { createOpenAI } from "@ai-sdk/openai";
2
1
  import { GroqModels } from "../constants/enums.js";
3
- import { BaseProvider } from "../core/baseProvider.js";
4
- import { DEFAULT_MAX_STEPS } from "../core/constants.js";
5
- import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
6
- import { isNeuroLink } from "../neurolink.js";
7
- import { createLoggingFetch } from "../utils/loggingFetch.js";
8
- import { tracers, ATTR, withClientStreamSpan } from "../telemetry/index.js";
9
2
  import { AuthenticationError, InvalidModelError, ProviderError, RateLimitError, } from "../types/index.js";
10
3
  import { logger } from "../utils/logger.js";
11
4
  import { createGroqConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
12
- import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
13
- import { emitToolEndFromStepFinish } from "../utils/toolEndEmitter.js";
14
- import { resolveToolChoice } from "../utils/toolChoice.js";
15
- import { toAnalyticsStreamResult } from "./providerTypeUtils.js";
16
- import { stepCountIs } from "../utils/tool.js";
17
- import { streamText } from "../utils/generation.js";
5
+ import { TimeoutError } from "../utils/timeout.js";
6
+ import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
18
7
  const GROQ_DEFAULT_BASE_URL = "https://api.groq.com/openai/v1";
19
8
  const getGroqApiKey = () => validateApiKey(createGroqConfig());
20
9
  const getDefaultGroqModel = () => getProviderModel("GROQ_MODEL", GroqModels.LLAMA_3_3_70B_VERSATILE);
21
10
  /**
22
- * Groq Provider
11
+ * Groq Provider — direct HTTP, no AI SDK.
23
12
  *
24
13
  * Sub-100ms inference of Llama / Mistral / Gemma at api.groq.com/openai/v1
25
14
  * (OpenAI-compatible). Best for low-latency tier; trade-off vs other open
26
15
  * model hosts is throughput latency, not quality.
27
16
  *
17
+ * All request/stream/tool-loop orchestration lives in
18
+ * `OpenAIChatCompletionsProvider`; this class only declares configuration
19
+ * and provider-specific error mapping.
20
+ *
28
21
  * @see https://console.groq.com/docs/quickstart
29
22
  */
30
- export class GroqProvider extends BaseProvider {
31
- model;
32
- apiKey;
33
- baseURL;
23
+ export class GroqProvider extends OpenAIChatCompletionsProvider {
34
24
  constructor(modelName, sdk, _region, credentials) {
35
- const validatedNeurolink = isNeuroLink(sdk) ? sdk : undefined;
36
- super(modelName, "groq", validatedNeurolink);
37
25
  const overrideApiKey = credentials?.apiKey?.trim();
38
- this.apiKey =
39
- overrideApiKey && overrideApiKey.length > 0
40
- ? overrideApiKey
41
- : getGroqApiKey();
42
- this.baseURL =
43
- credentials?.baseURL ??
44
- process.env.GROQ_BASE_URL ??
45
- GROQ_DEFAULT_BASE_URL;
46
- const groq = createOpenAI({
47
- apiKey: this.apiKey,
48
- baseURL: this.baseURL,
49
- fetch: createLoggingFetch("groq"),
50
- });
51
- this.model = groq.chat(this.modelName);
26
+ const apiKey = overrideApiKey && overrideApiKey.length > 0
27
+ ? overrideApiKey
28
+ : getGroqApiKey();
29
+ const baseURL = credentials?.baseURL?.trim() ||
30
+ process.env.GROQ_BASE_URL?.trim() ||
31
+ GROQ_DEFAULT_BASE_URL;
32
+ super("groq", modelName, sdk, { baseURL, apiKey });
52
33
  logger.debug("Groq Provider initialized", {
53
34
  modelName: this.modelName,
54
35
  providerName: this.providerName,
55
- baseURL: this.baseURL,
36
+ baseURL: this.config.baseURL,
56
37
  });
57
38
  }
58
- async executeStream(options, _analysisSchema) {
59
- return withClientStreamSpan({
60
- name: "neurolink.provider.stream",
61
- tracer: tracers.provider,
62
- attributes: {
63
- [ATTR.GEN_AI_SYSTEM]: "groq",
64
- [ATTR.GEN_AI_MODEL]: this.modelName,
65
- [ATTR.GEN_AI_OPERATION]: "stream",
66
- [ATTR.NL_STREAM_MODE]: true,
67
- },
68
- }, async () => this.executeStreamInner(options), (r) => r.stream, (r, wrapped) => ({ ...r, stream: wrapped }));
69
- }
70
- async executeStreamInner(options) {
71
- this.validateStreamOptions(options);
72
- // Resolve per-call credentials first, then fall back to instance-level.
73
- const perCallCreds = options.credentials?.groq;
74
- const effectiveApiKey = perCallCreds?.apiKey?.trim() || this.apiKey;
75
- const effectiveBaseURL = perCallCreds?.baseURL || this.baseURL;
76
- const startTime = Date.now();
77
- const timeout = this.getTimeout(options);
78
- const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
79
- try {
80
- // Use the canonical BaseProvider helper: merges base tools (MCP/built-in)
81
- // with user-provided tools (RAG, etc.) and applies per-call filtering.
82
- const shouldUseTools = !options.disableTools && this.supportsTools();
83
- const tools = await this.getToolsForStream(options);
84
- const messages = await this.buildMessagesForStream(options);
85
- // When per-call credentials differ from instance, build a fresh client.
86
- const hasDifferentCreds = effectiveApiKey !== this.apiKey || effectiveBaseURL !== this.baseURL;
87
- const model = hasDifferentCreds
88
- ? createOpenAI({
89
- apiKey: effectiveApiKey,
90
- baseURL: effectiveBaseURL,
91
- fetch: createLoggingFetch("groq"),
92
- }).chat(this.modelName)
93
- : await this.getAISDKModelWithMiddleware(options);
94
- const result = await streamText({
95
- model,
96
- messages,
97
- temperature: options.temperature,
98
- maxOutputTokens: options.maxTokens,
99
- tools,
100
- stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
101
- toolChoice: resolveToolChoice(options, tools, shouldUseTools),
102
- abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
103
- experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
104
- experimental_repairToolCall: this.getToolCallRepairFn(options),
105
- onStepFinish: ({ toolCalls, toolResults }) => {
106
- emitToolEndFromStepFinish(this.neurolink?.getEventEmitter(), toolResults);
107
- this.handleToolExecutionStorage(toolCalls, toolResults, options, new Date()).catch((error) => {
108
- logger.warn("[GroqProvider] Failed to store tool executions", {
109
- provider: this.providerName,
110
- error: error instanceof Error ? error.message : String(error),
111
- });
112
- });
113
- },
114
- });
115
- timeoutController?.cleanup();
116
- const transformedStream = this.createTextStream(result);
117
- const analyticsPromise = streamAnalyticsCollector.createAnalytics(this.providerName, this.modelName, toAnalyticsStreamResult(result), Date.now() - startTime, {
118
- requestId: `groq-stream-${Date.now()}`,
119
- streamingMode: true,
120
- });
121
- return {
122
- stream: transformedStream,
123
- provider: this.providerName,
124
- model: this.modelName,
125
- analytics: analyticsPromise,
126
- metadata: { startTime, streamId: `groq-${Date.now()}` },
127
- };
128
- }
129
- catch (error) {
130
- timeoutController?.cleanup();
131
- throw this.handleProviderError(error);
132
- }
133
- }
134
39
  getProviderName() {
135
- return this.providerName;
40
+ return "groq";
136
41
  }
137
42
  getDefaultModel() {
138
43
  return getDefaultGroqModel();
139
44
  }
140
- getAISDKModel() {
141
- return this.model;
45
+ getFallbackModelName() {
46
+ return GroqModels.LLAMA_3_1_8B_INSTANT;
47
+ }
48
+ getFallbackModels() {
49
+ return [
50
+ GroqModels.LLAMA_3_3_70B_VERSATILE,
51
+ GroqModels.LLAMA_3_1_8B_INSTANT,
52
+ GroqModels.GEMMA_2_9B_IT,
53
+ GroqModels.MIXTRAL_8X7B_32768,
54
+ GroqModels.LLAMA_3_2_90B_VISION_PREVIEW,
55
+ GroqModels.LLAMA_3_2_11B_VISION_PREVIEW,
56
+ ];
142
57
  }
143
58
  formatProviderError(error) {
144
59
  if (error instanceof TimeoutError) {
@@ -166,17 +81,5 @@ export class GroqProvider extends BaseProvider {
166
81
  }
167
82
  return new ProviderError(`Groq error: ${message}`, "groq");
168
83
  }
169
- async validateConfiguration() {
170
- return typeof this.apiKey === "string" && this.apiKey.trim().length > 0;
171
- }
172
- getConfiguration() {
173
- return {
174
- provider: this.providerName,
175
- model: this.modelName,
176
- defaultModel: getDefaultGroqModel(),
177
- baseURL: this.baseURL,
178
- };
179
- }
180
84
  }
181
- export default GroqProvider;
182
85
  //# sourceMappingURL=groq.js.map
@@ -1,78 +1,51 @@
1
- import { AIProviderName } from "../constants/enums.js";
2
- import { BaseProvider } from "../core/baseProvider.js";
3
- import type { NeuroLink } from "../neurolink.js";
4
- import type { EnhancedGenerateResult, TextGenerationOptions, ValidationSchema, StreamOptions, StreamResult } from "../types/index.js";
5
- import type { LanguageModel } from "../types/index.js";
1
+ import type { AIProviderName } from "../constants/enums.js";
2
+ import type { EnhancedGenerateResult, NeurolinkCredentials, OpenAICompatStreamLifecycleListeners, TextGenerationOptions } from "../types/index.js";
3
+ import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
6
4
  /**
7
- * OpenAI Provider v2 - BaseProvider Implementation
8
- * Migrated to use factory pattern with exact Google AI provider pattern
5
+ * OpenAI Provider direct HTTP, no AI SDK.
6
+ *
7
+ * OpenAI chat completions at api.openai.com/v1. All request / stream /
8
+ * tool-loop orchestration lives in `OpenAIChatCompletionsProvider`; this
9
+ * class adds:
10
+ * - OTel span wrap with cost (`onStreamStart`)
11
+ * - Native `/v1/embeddings` (`embed` / `embedMany`)
12
+ * - Image generation via `/v1/images/generations` (`executeImageGeneration`)
13
+ * - OpenAI-specific error mapping (`formatProviderError`)
14
+ *
15
+ * @see https://platform.openai.com/docs/api-reference
9
16
  */
10
- export declare class OpenAIProvider extends BaseProvider {
11
- private model;
12
- private credentials?;
13
- constructor(modelName?: string, neurolink?: NeuroLink, _region?: string, credentials?: {
14
- apiKey?: string;
15
- baseURL?: string;
16
- });
17
+ export declare class OpenAIProvider extends OpenAIChatCompletionsProvider {
18
+ constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["openai"]);
19
+ protected getProviderName(): AIProviderName;
20
+ protected getDefaultModel(): string;
21
+ formatProviderError(error: unknown): Error;
17
22
  /**
18
- * Check if this provider supports tool/function calling
23
+ * Wrap the stream in an OTel span to capture provider-level latency,
24
+ * token usage, finish reason, and cost. Mirrors the pre-migration
25
+ * `streamText`-span behaviour.
19
26
  */
20
- supportsTools(): boolean;
21
- getProviderName(): AIProviderName;
22
- getDefaultModel(): string;
27
+ protected onStreamStart(modelId: string): OpenAICompatStreamLifecycleListeners | undefined;
23
28
  /**
24
- * Get the default embedding model for OpenAI
25
- * @returns The default OpenAI embedding model name
29
+ * Default embedding model, overridable via OPENAI_EMBEDDING_MODEL env var.
26
30
  */
27
31
  protected getDefaultEmbeddingModel(): string;
28
32
  /**
29
- * Returns the Vercel AI SDK model instance for OpenAI
30
- */
31
- getAISDKModel(): LanguageModel;
32
- /**
33
- * OpenAI-specific tool validation and filtering
34
- * Filters out tools that might cause streaming issues
35
- */
36
- private validateAndFilterToolsForOpenAI;
37
- /**
38
- * Validate Zod schema structure
39
- */
40
- private validateZodSchema;
41
- /**
42
- * Validate tool structure for OpenAI compatibility
43
- * More lenient validation to avoid filtering out valid tools
44
- */
45
- /** Shared helper: mark a stream span as ERROR, record the exception, and end it. */
46
- private endStreamSpanWithError;
47
- private isValidToolStructure;
48
- /**
49
- * Validate tool parameters for OpenAI compatibility
50
- * Ensures the tool has either valid Zod schema or valid JSON schema
51
- */
52
- private isValidToolParameters;
53
- formatProviderError(error: unknown): Error;
54
- /**
55
- * executeGenerate method removed - generation is now handled by BaseProvider.
56
- * For details on the changes and migration steps, refer to the BaseProvider documentation
57
- * and the migration guide in the project repository.
58
- */
59
- protected executeStream(options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
60
- private createOpenAITransformedStream;
61
- private extractOpenAIChunkContent;
62
- /**
63
- * Generate embeddings for text using OpenAI text-embedding models
33
+ * Generate an embedding for a single text input via native /v1/embeddings.
34
+ *
64
35
  * @param text - The text to embed
65
36
  * @param modelName - The embedding model to use (default: text-embedding-3-small)
66
37
  * @returns Promise resolving to the embedding vector
67
38
  */
68
39
  embed(text: string, modelName?: string): Promise<number[]>;
69
40
  /**
70
- * Generate embeddings for multiple texts in a single batch
41
+ * Generate embeddings for multiple texts in a single batch via native /v1/embeddings.
42
+ *
71
43
  * @param texts - The texts to embed
72
44
  * @param modelName - The embedding model to use (default: text-embedding-3-small)
73
45
  * @returns Promise resolving to an array of embedding vectors
74
46
  */
75
47
  embedMany(texts: string[], modelName?: string): Promise<number[][]>;
48
+ private callEmbeddings;
76
49
  /**
77
50
  * Image generation via the OpenAI Images API (`/v1/images/generations`).
78
51
  *
@@ -95,4 +68,3 @@ export declare class OpenAIProvider extends BaseProvider {
95
68
  */
96
69
  private aspectRatioToOpenAISize;
97
70
  }
98
- export default OpenAIProvider;