agentlang 0.0.12 → 0.0.13

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.
@@ -2,18 +2,138 @@ import { ChatOpenAI } from '@langchain/openai';
2
2
  import { AgentServiceProvider, AIResponse, asAIResponse } from '../provider.js';
3
3
  import { BaseMessage } from '@langchain/core/messages';
4
4
 
5
+ export interface OpenAIConfig {
6
+ model?: string;
7
+ temperature?: number;
8
+ maxTokens?: number;
9
+ topP?: number;
10
+ frequencyPenalty?: number;
11
+ presencePenalty?: number;
12
+ maxRetries?: number;
13
+ apiKey?: string;
14
+ configuration?: {
15
+ baseURL?: string;
16
+ defaultHeaders?: Record<string, string>;
17
+ [key: string]: any;
18
+ };
19
+ streamUsage?: boolean;
20
+ logprobs?: boolean;
21
+ topLogprobs?: number;
22
+ }
23
+
5
24
  export class OpenAIProvider implements AgentServiceProvider {
6
25
  private model: ChatOpenAI;
26
+ private config: OpenAIConfig;
7
27
 
8
28
  constructor(config?: Map<string, any>) {
9
- let modelName = 'gpt-4.1-2025-04-14';
10
- if (config) {
11
- modelName = config.get('model') || modelName;
29
+ this.config = this.parseConfig(config);
30
+
31
+ const chatConfig: any = {
32
+ model: this.config.model,
33
+ temperature: this.config.temperature,
34
+ maxTokens: this.config.maxTokens,
35
+ topP: this.config.topP,
36
+ frequencyPenalty: this.config.frequencyPenalty,
37
+ presencePenalty: this.config.presencePenalty,
38
+ maxRetries: this.config.maxRetries,
39
+ streamUsage: this.config.streamUsage,
40
+ logprobs: this.config.logprobs,
41
+ topLogprobs: this.config.topLogprobs,
42
+ };
43
+
44
+ if (this.config.apiKey) {
45
+ chatConfig.apiKey = this.config.apiKey;
46
+ }
47
+
48
+ if (this.config.configuration) {
49
+ chatConfig.configuration = this.config.configuration;
12
50
  }
13
- this.model = new ChatOpenAI({ model: modelName });
51
+
52
+ this.model = new ChatOpenAI(chatConfig);
53
+ }
54
+
55
+ private parseConfig(config?: Map<string, any>): OpenAIConfig {
56
+ const defaultConfig: OpenAIConfig = {
57
+ model: 'gpt-4o',
58
+ temperature: 0.7,
59
+ maxTokens: 4096,
60
+ topP: 1.0,
61
+ frequencyPenalty: 0,
62
+ presencePenalty: 0,
63
+ maxRetries: 2,
64
+ streamUsage: true,
65
+ logprobs: false,
66
+ };
67
+
68
+ if (!config) {
69
+ return {
70
+ ...defaultConfig,
71
+ apiKey: process.env.OPENAI_API_KEY,
72
+ };
73
+ }
74
+
75
+ const apiKey = config.get('apiKey') || config.get('api_key') || process.env.OPENAI_API_KEY;
76
+
77
+ return {
78
+ model: config.get('model') || defaultConfig.model,
79
+ temperature: config.get('temperature') ?? defaultConfig.temperature,
80
+ maxTokens: config.get('maxTokens') || config.get('max_tokens') || defaultConfig.maxTokens,
81
+ topP: config.get('topP') || config.get('top_p') || defaultConfig.topP,
82
+ frequencyPenalty:
83
+ config.get('frequencyPenalty') ||
84
+ config.get('frequency_penalty') ||
85
+ defaultConfig.frequencyPenalty,
86
+ presencePenalty:
87
+ config.get('presencePenalty') ||
88
+ config.get('presence_penalty') ||
89
+ defaultConfig.presencePenalty,
90
+ maxRetries: config.get('maxRetries') || config.get('max_retries') || defaultConfig.maxRetries,
91
+ streamUsage:
92
+ config.get('streamUsage') || config.get('stream_usage') || defaultConfig.streamUsage,
93
+ logprobs: config.get('logprobs') ?? defaultConfig.logprobs,
94
+ topLogprobs: config.get('topLogprobs') || config.get('top_logprobs'),
95
+ apiKey,
96
+ configuration: config.get('configuration'),
97
+ };
14
98
  }
15
99
 
16
100
  async invoke(messages: BaseMessage[]): Promise<AIResponse> {
101
+ if (!this.config.apiKey) {
102
+ throw new Error(
103
+ 'OpenAI API key is required. Set OPENAI_API_KEY environment variable or provide apiKey in config.'
104
+ );
105
+ }
17
106
  return asAIResponse(await this.model.invoke(messages));
18
107
  }
108
+
109
+ getConfig(): OpenAIConfig {
110
+ return { ...this.config };
111
+ }
112
+
113
+ updateConfig(newConfig: Partial<OpenAIConfig>): void {
114
+ this.config = { ...this.config, ...newConfig };
115
+
116
+ const chatConfig: any = {
117
+ model: this.config.model,
118
+ temperature: this.config.temperature,
119
+ maxTokens: this.config.maxTokens,
120
+ topP: this.config.topP,
121
+ frequencyPenalty: this.config.frequencyPenalty,
122
+ presencePenalty: this.config.presencePenalty,
123
+ maxRetries: this.config.maxRetries,
124
+ streamUsage: this.config.streamUsage,
125
+ logprobs: this.config.logprobs,
126
+ topLogprobs: this.config.topLogprobs,
127
+ };
128
+
129
+ if (this.config.apiKey) {
130
+ chatConfig.apiKey = this.config.apiKey;
131
+ }
132
+
133
+ if (this.config.configuration) {
134
+ chatConfig.configuration = this.config.configuration;
135
+ }
136
+
137
+ this.model = new ChatOpenAI(chatConfig);
138
+ }
19
139
  }
@@ -1,9 +1,56 @@
1
1
  import { OpenAIProvider } from './impl/openai.js';
2
+ import { AnthropicProvider } from './impl/anthropic.js';
2
3
 
3
- const Providers = new Map().set('openai', OpenAIProvider);
4
+ const Providers = new Map().set('openai', OpenAIProvider).set('anthropic', AnthropicProvider);
4
5
 
5
6
  export function provider(service: string) {
6
- const p = Providers.get(service.toLowerCase());
7
- if (p) return p;
8
- else throw new Error(`No provider found for ${service}`);
7
+ const requestedService = service.toLowerCase();
8
+ let p = Providers.get(requestedService);
9
+
10
+ if (p) {
11
+ // Check if the requested provider has its API key available
12
+ if (isProviderAvailable(requestedService)) {
13
+ return p;
14
+ } else {
15
+ // Try to find an alternative available provider
16
+ const availableService = getAvailableProvider();
17
+ if (availableService && availableService !== requestedService) {
18
+ p = Providers.get(availableService);
19
+ if (p) return p;
20
+ }
21
+ throw new Error(
22
+ `${service} provider requested but ${service.toUpperCase()}_API_KEY not found. Available providers: ${getAvailableProviders().join(', ') || 'none'}`
23
+ );
24
+ }
25
+ } else {
26
+ throw new Error(`No provider found for ${service}`);
27
+ }
28
+ }
29
+
30
+ function isProviderAvailable(service: string): boolean {
31
+ switch (service) {
32
+ case 'openai':
33
+ return !!process.env.OPENAI_API_KEY;
34
+ case 'anthropic':
35
+ return !!process.env.ANTHROPIC_API_KEY;
36
+ default:
37
+ return false;
38
+ }
39
+ }
40
+
41
+ function getAvailableProvider(): string | null {
42
+ if (process.env.ANTHROPIC_API_KEY) {
43
+ return 'anthropic';
44
+ }
45
+ if (process.env.OPENAI_API_KEY) {
46
+ return 'openai';
47
+ }
48
+ return null;
49
+ }
50
+
51
+ function getAvailableProviders(): string[] {
52
+ const available: string[] = [];
53
+ if (process.env.ANTHROPIC_API_KEY) available.push('anthropic');
54
+ if (process.env.OPENAI_API_KEY) available.push('openai');
55
+ return available;
9
56
  }
@@ -17,7 +17,7 @@ export async function importModule(path: string, name: string, moduleFileName?:
17
17
  }
18
18
  path = `${s}${sep}${path}`;
19
19
  }
20
- if ((path.startsWith(sep) || path.startsWith('.')) && moduleFileName) {
20
+ if (!(path.startsWith(sep) || path.startsWith('.'))) {
21
21
  path = process.cwd() + sep + path;
22
22
  }
23
23
  const m = await import(/* @vite-ignore */ path);
package/out/cli/docs.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export declare const generateSwaggerDoc: (fileName: string) => Promise<void>;
2
- //# sourceMappingURL=docs.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docs.d.ts","sourceRoot":"","sources":["../../src/cli/docs.ts"],"names":[],"mappings":"AA8OA,eAAO,MAAM,kBAAkB,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAcvE,CAAC"}
package/out/cli/docs.js DELETED
@@ -1,236 +0,0 @@
1
- import { z } from 'zod/v4';
2
- import yaml from 'yaml';
3
- import { OpenApiGeneratorV3, OpenAPIRegistry, extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
4
- import { getUserModuleNames, fetchModule } from '../runtime/module.js';
5
- import * as fs from 'node:fs/promises';
6
- import * as path from 'node:path';
7
- extendZodWithOpenApi(z);
8
- const registry = new OpenAPIRegistry();
9
- const bearerAuth = registry.registerComponent('securitySchemes', 'bearerAuth', {
10
- type: 'http',
11
- scheme: 'bearer',
12
- bearerFormat: 'JWT',
13
- });
14
- function getOpenApiDocumentation(registry, name, version) {
15
- const generator = new OpenApiGeneratorV3(registry.definitions);
16
- return generator.generateDocument({
17
- openapi: '3.0.0',
18
- info: {
19
- version: version,
20
- title: name,
21
- description: 'This is the API',
22
- },
23
- servers: [{ url: 'v1' }],
24
- });
25
- }
26
- function writeDocumentation(registry, docDir, name, version) {
27
- const docs = getOpenApiDocumentation(registry, name, version);
28
- const fileContent = yaml.stringify(docs);
29
- fs.mkdir(path.join(docDir, 'docs'), { recursive: true });
30
- fs.writeFile(`${docDir}/docs/openapi-docs.yml`, fileContent, {
31
- encoding: 'utf-8'
32
- });
33
- }
34
- function generateEntitiesEntries() {
35
- const modules = getUserModuleNames();
36
- return modules.map((moduleName) => {
37
- const module = fetchModule(moduleName);
38
- const entities = module.getEntityEntries();
39
- return entities.map((entity) => {
40
- const entityPath = `${moduleName}/${entity.name}`;
41
- const entitySchema = z.object(Object.fromEntries(Array.from(entity.schema.entries()).map(([key, value]) => [
42
- key,
43
- value.type === 'UUID' ? z.uuid() :
44
- value.type === 'String' ? z.string() :
45
- value.type === 'Int' ? z.number() :
46
- value.type === 'Float' ? z.number() :
47
- value.type === 'Boolean' ? z.boolean() :
48
- value.type === 'Date' ? z.string() :
49
- value.type === 'DateTime' ? z.string() :
50
- z.any()
51
- ]))).openapi(`${entity.name}Schema`);
52
- const sc = z.object({
53
- [entityPath]: entitySchema
54
- });
55
- const scresp = z.array(entitySchema);
56
- registry.registerPath({
57
- method: 'post',
58
- path: `/api/${entityPath}`,
59
- security: [{ [bearerAuth.name]: [] }],
60
- tags: [`${entityPath}`],
61
- request: {
62
- body: {
63
- content: {
64
- 'application/json': {
65
- schema: sc
66
- }
67
- }
68
- }
69
- },
70
- responses: {
71
- 200: {
72
- description: 'Success',
73
- content: {
74
- 'application/json': {
75
- schema: entitySchema
76
- },
77
- },
78
- },
79
- 500: {
80
- description: 'Internal Server Error'
81
- }
82
- },
83
- });
84
- registry.registerPath({
85
- method: 'get',
86
- path: `/api/${entityPath}`,
87
- security: [{ [bearerAuth.name]: [] }],
88
- tags: [`${entityPath}`],
89
- responses: {
90
- 200: {
91
- description: 'Success',
92
- content: {
93
- 'application/json': {
94
- schema: scresp
95
- },
96
- },
97
- },
98
- 404: {
99
- description: 'Not Found'
100
- },
101
- 500: {
102
- description: 'Internal Server Error'
103
- }
104
- },
105
- });
106
- registry.registerPath({
107
- method: 'put',
108
- path: `/api/${entityPath}/{id}`,
109
- tags: [`${entityPath}`],
110
- parameters: [{
111
- name: 'id',
112
- in: 'path',
113
- required: true,
114
- schema: { type: 'string' }
115
- }],
116
- security: [{ [bearerAuth.name]: [] }],
117
- request: {
118
- body: {
119
- content: {
120
- 'application/json': {
121
- schema: sc
122
- }
123
- }
124
- }
125
- },
126
- responses: {
127
- 200: {
128
- description: 'Success',
129
- content: {
130
- 'application/json': {
131
- schema: entitySchema
132
- },
133
- },
134
- },
135
- 404: {
136
- description: 'Not Found'
137
- },
138
- 500: {
139
- description: 'Internal Server Error'
140
- }
141
- },
142
- });
143
- registry.registerPath({
144
- method: 'delete',
145
- path: `/api/${entityPath}/{id}`,
146
- security: [{ [bearerAuth.name]: [] }],
147
- tags: [`${entityPath}`],
148
- parameters: [{
149
- name: 'id',
150
- in: 'path',
151
- required: true,
152
- schema: { type: 'string' }
153
- }],
154
- responses: {
155
- 200: {
156
- description: 'Success'
157
- },
158
- 404: {
159
- description: 'Not Found'
160
- },
161
- 500: {
162
- description: 'Internal Server Error'
163
- }
164
- },
165
- });
166
- });
167
- });
168
- }
169
- function generateEventsEntries() {
170
- const modules = getUserModuleNames();
171
- return modules.map((moduleName) => {
172
- const module = fetchModule(moduleName);
173
- const events = module.getEventEntries();
174
- return events.map((event) => {
175
- const eventPath = `${moduleName}/${event.name}`;
176
- const eventSchema = z.object(Object.fromEntries(Array.from(event.schema.entries()).map(([key, value]) => [
177
- key,
178
- value.type === 'UUID' ? z.uuid() :
179
- value.type === 'String' ? z.string() :
180
- value.type === 'Int' ? z.number() :
181
- value.type === 'Float' ? z.number() :
182
- value.type === 'Boolean' ? z.boolean() :
183
- value.type === 'Date' ? z.string() :
184
- value.type === 'DateTime' ? z.string() :
185
- z.any()
186
- ]))).openapi(`${event.name}Schema`);
187
- const sc = z.object({
188
- [eventPath]: eventSchema
189
- });
190
- registry.registerPath({
191
- method: 'post',
192
- path: `/api/${eventPath}`,
193
- security: [{ [bearerAuth.name]: [] }],
194
- tags: ['Events'],
195
- request: {
196
- body: {
197
- content: {
198
- 'application/json': {
199
- schema: sc
200
- }
201
- }
202
- }
203
- },
204
- responses: {
205
- 200: {
206
- description: 'Success'
207
- },
208
- 404: {
209
- description: 'Not Found'
210
- },
211
- 500: {
212
- description: 'Internal Server Error'
213
- }
214
- }
215
- });
216
- return {
217
- path: eventPath,
218
- name: event.name,
219
- schema: event.schema
220
- };
221
- });
222
- });
223
- }
224
- export const generateSwaggerDoc = async (fileName) => {
225
- console.log('Generating documentation...');
226
- const docDir = path.dirname(fileName) === '.' ? process.cwd() : path.resolve(process.cwd(), fileName);
227
- const packagePath = path.join(docDir, 'package.json');
228
- const packageContent = await fs.readFile(packagePath, 'utf-8');
229
- const pkg = JSON.parse(packageContent);
230
- const name = pkg.name || 'app';
231
- const version = pkg.version || '0.0.1';
232
- generateEntitiesEntries();
233
- generateEventsEntries();
234
- writeDocumentation(registry, docDir, name, version);
235
- };
236
- //# sourceMappingURL=docs.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docs.js","sourceRoot":"","sources":["../../src/cli/docs.ts"],"names":[],"mappings":"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"}