local-agent
Version:
A CLI agentic system for orchestrating tools and memory with per-folder scoping
133 lines • 5.61 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProviderFactory = void 0;
/**
* @fileoverview
* Factory for creating and managing AI providers.
* Uses lazy loading to only import providers when needed.
*/
const types_1 = require("./types");
/**
* Factory for creating and managing AI providers.
* Uses lazy loading to only import providers when needed.
*/
class ProviderFactory {
static providers = {};
static providerModules = {
'openai': () => Promise.resolve().then(() => __importStar(require('./openai-provider'))),
'anthropic': () => Promise.resolve().then(() => __importStar(require('./anthropic-provider'))),
'google': () => Promise.resolve().then(() => __importStar(require('./google-provider'))),
'openrouter': () => Promise.resolve().then(() => __importStar(require('./openrouter-provider'))),
};
/**
* Parses a model string into provider and model name components.
* Handles backward compatibility for model strings without a provider prefix.
*
* @param modelString The model string to parse (e.g., "openai/gpt-4o" or "gpt-4o")
* @returns The parsed provider and model name
*/
static parseModelString(modelString) {
if (!modelString.includes('/')) {
// Backward compatibility: treat as openai
return { provider: 'openai', modelName: modelString };
}
const [provider, ...rest] = modelString.split('/');
return {
provider: provider.toLowerCase(),
modelName: rest.join('/')
};
}
/**
* Gets or lazily initializes a provider instance for the specified provider name.
*
* @param providerName The name of the provider to get
* @returns The provider instance
* @throws ProviderError if the provider is not supported or cannot be loaded
*/
static async getProvider(providerName) {
const normalizedName = providerName.toLowerCase();
// Return cached provider if available
if (this.providers[normalizedName]) {
return this.providers[normalizedName];
}
// Check if provider is supported
if (!this.providerModules[normalizedName]) {
throw new types_1.ProviderError(`Unsupported AI provider: ${providerName}`, providerName, false);
}
try {
// Dynamically import the provider module
const module = await this.providerModules[normalizedName]();
const provider = new module.default();
// Cache the provider instance
this.providers[normalizedName] = provider;
return provider;
}
catch (error) {
const message = error instanceof Error ? error.message : String(error);
throw new types_1.ProviderError(`Failed to load provider ${providerName}: ${message}`, providerName, true);
}
}
/**
* Convenience method to get a model instance for a given model string.
* Parses the model string, gets the provider, and returns the model instance.
*
* @param modelString The model string (e.g., "openai/gpt-4o" or "gpt-4o")
* @param keys API keys for provider initialization
* @returns A Promise resolving to the model instance
*/
static async getModelFromString(modelString, keys = {}) {
const { provider: providerName, modelName } = this.parseModelString(modelString);
try {
const provider = await this.getProvider(providerName);
// Initialize the provider with API keys if required
if (provider.requiresApiKey()) {
provider.initialize(keys);
}
return provider.getModel(modelName);
}
catch (error) {
if (error instanceof types_1.ProviderError) {
throw error;
}
else {
const message = error instanceof Error ? error.message : String(error);
throw new types_1.ProviderError(`Error getting model for ${modelString}: ${message}`, providerName, true);
}
}
}
}
exports.ProviderFactory = ProviderFactory;
//# sourceMappingURL=provider-factory.js.map