@mcp-abap-adt/openai-llm 11.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # @mcp-abap-adt/openai-llm
2
+
3
+ OpenAI LLM provider for `@mcp-abap-adt/llm-agent` / `@mcp-abap-adt/llm-agent-server`.
4
+
5
+ Exports:
6
+ - `OpenAIProvider` — implements ILlm, calls OpenAI /v1/chat/completions.
7
+ - `OpenAIConfig` — configuration type.
8
+
9
+ Optional peer dependency of `@mcp-abap-adt/llm-agent-server`. Install when your smart-server.yaml names `openai` as the LLM provider, or when constructing OpenAIProvider programmatically.
@@ -0,0 +1,3 @@
1
+ export type { OpenAIConfig } from './openai-provider.js';
2
+ export { OpenAIProvider } from './openai-provider.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export { OpenAIProvider } from './openai-provider.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * OpenAI LLM Provider
3
+ */
4
+ import type { IModelInfo, LLMCallOptions, LLMProviderConfig, LLMResponse, Message } from '@mcp-abap-adt/llm-agent';
5
+ import { BaseLLMProvider } from '@mcp-abap-adt/llm-agent';
6
+ import { type AxiosInstance } from 'axios';
7
+ export interface OpenAIConfig extends LLMProviderConfig {
8
+ model?: string;
9
+ temperature?: number;
10
+ maxTokens?: number;
11
+ organization?: string;
12
+ project?: string;
13
+ }
14
+ export declare class OpenAIProvider extends BaseLLMProvider<OpenAIConfig> {
15
+ readonly client: AxiosInstance;
16
+ readonly model: string;
17
+ protected readonly providerName: string;
18
+ constructor(config: OpenAIConfig);
19
+ chat(messages: Message[], tools?: unknown[], options?: LLMCallOptions): Promise<LLMResponse>;
20
+ streamChat(messages: Message[], tools?: unknown[], options?: LLMCallOptions): AsyncIterable<LLMResponse>;
21
+ getModels(): Promise<IModelInfo[]>;
22
+ getEmbeddingModels(): Promise<IModelInfo[]>;
23
+ /**
24
+ * Return the appropriate token limit parameter for the model.
25
+ * Newer models (o1, o3, gpt-5+) require max_completion_tokens;
26
+ * legacy models use max_tokens.
27
+ */
28
+ protected getTokenLimitParam(model: string, maxTokens: number): Record<string, number>;
29
+ /**
30
+ * Format messages for OpenAI API with strict protocol enforcement.
31
+ */
32
+ protected formatMessages(messages: Message[]): Array<Record<string, unknown>>;
33
+ }
34
+ //# sourceMappingURL=openai-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.d.ts","sourceRoot":"","sources":["../src/openai-provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,OAAO,EACR,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAElD,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,eAAe,CAAC,YAAY,CAAC;IAC/D,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAY;gBAEvC,MAAM,EAAE,YAAY;IA2B1B,IAAI,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC;IA6ChB,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAAC,WAAW,CAAC;IA6EvB,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAOlC,kBAAkB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAOjD;;;;OAIG;IACH,SAAS,CAAC,kBAAkB,CAC1B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAChB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQzB;;OAEG;IACH,SAAS,CAAC,cAAc,CACtB,QAAQ,EAAE,OAAO,EAAE,GAClB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAmClC"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * OpenAI LLM Provider
3
+ */
4
+ import { BaseLLMProvider } from '@mcp-abap-adt/llm-agent';
5
+ import axios from 'axios';
6
+ export class OpenAIProvider extends BaseLLMProvider {
7
+ client;
8
+ model;
9
+ providerName = 'OpenAI';
10
+ constructor(config) {
11
+ super(config);
12
+ this.validateConfig();
13
+ this.model = config.model || 'gpt-4o-mini';
14
+ const headers = {
15
+ Authorization: `Bearer ${config.apiKey}`,
16
+ 'Content-Type': 'application/json',
17
+ };
18
+ // Add organization header if provided
19
+ if (config.organization) {
20
+ headers['OpenAI-Organization'] = config.organization;
21
+ }
22
+ // Add project header if provided
23
+ if (config.project) {
24
+ headers['OpenAI-Project'] = config.project;
25
+ }
26
+ this.client = axios.create({
27
+ baseURL: config.baseURL || 'https://api.openai.com/v1',
28
+ headers,
29
+ });
30
+ }
31
+ async chat(messages, tools, options) {
32
+ try {
33
+ const model = options?.model ?? this.model;
34
+ const temperature = options?.temperature ?? this.config.temperature ?? 0.7;
35
+ const maxTokens = options?.maxTokens ?? this.config.maxTokens ?? 4096;
36
+ const response = await this.client.post('/chat/completions', {
37
+ model,
38
+ messages: this.formatMessages(messages),
39
+ tools: tools && tools.length > 0 ? tools : undefined,
40
+ tool_choice: tools && tools.length > 0 ? 'auto' : undefined,
41
+ temperature,
42
+ ...this.getTokenLimitParam(model, maxTokens),
43
+ ...(options?.topP !== undefined ? { top_p: options.topP } : {}),
44
+ ...(options?.stop ? { stop: options.stop } : {}),
45
+ });
46
+ const choice = response.data.choices[0];
47
+ const usage = response.data.usage
48
+ ? {
49
+ prompt_tokens: response.data.usage.prompt_tokens,
50
+ completion_tokens: response.data.usage.completion_tokens,
51
+ total_tokens: response.data.usage.total_tokens,
52
+ }
53
+ : undefined;
54
+ return {
55
+ content: choice.message.content || '',
56
+ finishReason: choice.finish_reason,
57
+ raw: response.data,
58
+ usage,
59
+ };
60
+ }
61
+ catch (error) {
62
+ const message = axios.isAxiosError(error)
63
+ ? error.response?.data?.error
64
+ ?.message || error.message
65
+ : error instanceof Error
66
+ ? error.message
67
+ : String(error);
68
+ throw new Error(`${this.providerName} API error: ${message}`);
69
+ }
70
+ }
71
+ async *streamChat(messages, tools, options) {
72
+ try {
73
+ const model = options?.model ?? this.model;
74
+ const temperature = options?.temperature ?? this.config.temperature ?? 0.7;
75
+ const maxTokens = options?.maxTokens ?? this.config.maxTokens ?? 4096;
76
+ const response = await this.client.post('/chat/completions', {
77
+ model,
78
+ messages: this.formatMessages(messages),
79
+ tools: tools && tools.length > 0 ? tools : undefined,
80
+ tool_choice: tools && tools.length > 0 ? 'auto' : undefined,
81
+ temperature,
82
+ ...this.getTokenLimitParam(model, maxTokens),
83
+ ...(options?.topP !== undefined ? { top_p: options.topP } : {}),
84
+ ...(options?.stop ? { stop: options.stop } : {}),
85
+ stream: true,
86
+ stream_options: { include_usage: true },
87
+ }, { responseType: 'stream' });
88
+ const stream = response.data;
89
+ let buffer = '';
90
+ for await (const chunk of stream) {
91
+ buffer += chunk.toString();
92
+ const lines = buffer.split('\n');
93
+ buffer = lines.pop() || '';
94
+ for (const line of lines) {
95
+ const trimmed = line.trim();
96
+ if (!trimmed?.startsWith('data: '))
97
+ continue;
98
+ const data = trimmed.slice(6);
99
+ if (data === '[DONE]')
100
+ break;
101
+ try {
102
+ const parsed = JSON.parse(data);
103
+ const choice = parsed.choices?.[0];
104
+ if (choice?.delta) {
105
+ yield {
106
+ content: choice.delta.content || '',
107
+ finishReason: choice.finish_reason,
108
+ raw: parsed,
109
+ };
110
+ }
111
+ // Usage-only chunk (stream_options: include_usage)
112
+ if (parsed.usage && !choice?.delta) {
113
+ yield {
114
+ content: '',
115
+ raw: parsed,
116
+ usage: {
117
+ prompt_tokens: parsed.usage.prompt_tokens,
118
+ completion_tokens: parsed.usage.completion_tokens,
119
+ total_tokens: parsed.usage.total_tokens,
120
+ },
121
+ };
122
+ }
123
+ }
124
+ catch (_e) {
125
+ // Ignore parse errors for incomplete chunks
126
+ }
127
+ }
128
+ }
129
+ }
130
+ catch (error) {
131
+ const message = axios.isAxiosError(error)
132
+ ? error.response?.data?.error
133
+ ?.message || error.message
134
+ : error instanceof Error
135
+ ? error.message
136
+ : String(error);
137
+ throw new Error(`${this.providerName} Streaming error: ${message}`);
138
+ }
139
+ }
140
+ async getModels() {
141
+ const response = await this.client.get('/models');
142
+ return response.data.data.map((m) => ({ id: m.id, owned_by: m.owned_by }));
143
+ }
144
+ async getEmbeddingModels() {
145
+ const response = await this.client.get('/models');
146
+ return response.data.data
147
+ .filter((m) => /embed/i.test(m.id))
148
+ .map((m) => ({ id: m.id, owned_by: m.owned_by }));
149
+ }
150
+ /**
151
+ * Return the appropriate token limit parameter for the model.
152
+ * Newer models (o1, o3, gpt-5+) require max_completion_tokens;
153
+ * legacy models use max_tokens.
154
+ */
155
+ getTokenLimitParam(model, maxTokens) {
156
+ const normalized = model.toLowerCase();
157
+ const needsCompletionTokens = /^(o[13]|gpt-5)/.test(normalized);
158
+ return needsCompletionTokens
159
+ ? { max_completion_tokens: maxTokens }
160
+ : { max_tokens: maxTokens };
161
+ }
162
+ /**
163
+ * Format messages for OpenAI API with strict protocol enforcement.
164
+ */
165
+ formatMessages(messages) {
166
+ const formatted = [];
167
+ for (const msg of messages) {
168
+ if (msg.role === 'tool' && !msg.tool_call_id) {
169
+ continue;
170
+ }
171
+ const entry = {
172
+ role: msg.role,
173
+ content: msg.content ?? '',
174
+ };
175
+ if (msg.role === 'assistant' &&
176
+ msg.tool_calls &&
177
+ msg.tool_calls.length > 0) {
178
+ entry.tool_calls = msg.tool_calls;
179
+ entry.content = msg.content || null;
180
+ }
181
+ if (msg.role === 'tool') {
182
+ entry.tool_call_id = msg.tool_call_id;
183
+ entry.content =
184
+ typeof msg.content === 'string'
185
+ ? msg.content
186
+ : JSON.stringify(msg.content ?? '');
187
+ }
188
+ formatted.push(entry);
189
+ }
190
+ return formatted;
191
+ }
192
+ }
193
+ //# sourceMappingURL=openai-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-provider.js","sourceRoot":"","sources":["../src/openai-provider.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@mcp-abap-adt/openai-llm",
3
+ "version": "11.0.0",
4
+ "description": "OpenAI LLM provider (ILlm) for @mcp-abap-adt/llm-agent.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "clean": "tsc -p tsconfig.json --clean",
23
+ "test": "node --import tsx/esm --test --test-reporter=spec 'src/**/*.test.ts'"
24
+ },
25
+ "dependencies": {
26
+ "@mcp-abap-adt/llm-agent": "*",
27
+ "axios": "^1.14.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^25.6.0"
31
+ },
32
+ "license": "MIT",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "git+https://github.com/fr0ster/llm-agent.git"
36
+ },
37
+ "publishConfig": {
38
+ "access": "public"
39
+ }
40
+ }