immersive2/server/services/providerConfig.js
Michael Mainguy 74a2d179b9 Add Ollama as alternative AI provider and modify_connection tool
Ollama Integration:
- Add providerConfig.js for managing AI provider settings
- Add toolConverter.js to convert between Claude and Ollama formats
- Add ollama.js API handler with function calling support
- Update diagramAI.ts with Ollama models (llama3.1, mistral, qwen2.5)
- Route requests to appropriate provider based on selected model
- Use 127.0.0.1 to avoid IPv6 resolution issues

New modify_connection Tool:
- Add modify_connection tool to change connection labels and colors
- Support finding connections by label or by from/to entities
- Add chatModifyConnection event handler in diagramManager
- Clarify in tool descriptions that empty string removes labels

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 12:08:17 -06:00

98 lines
2.4 KiB
JavaScript

/**
* AI Provider Configuration
* Manages configuration for different AI providers (Claude, Ollama)
*/
// Default configuration
const DEFAULT_PROVIDER = 'claude';
// Use 127.0.0.1 instead of localhost to avoid IPv6 resolution issues
const DEFAULT_OLLAMA_URL = 'http://127.0.0.1:11434';
/**
* Get the current AI provider
* @returns {string} Provider name ('claude' or 'ollama')
*/
export function getProvider() {
return process.env.AI_PROVIDER || DEFAULT_PROVIDER;
}
/**
* Get Ollama API URL
* @returns {string} Ollama base URL
*/
export function getOllamaUrl() {
return process.env.OLLAMA_URL || DEFAULT_OLLAMA_URL;
}
/**
* Get Anthropic API URL
* @returns {string} Anthropic base URL
*/
export function getAnthropicUrl() {
return process.env.ANTHROPIC_API_URL || 'https://api.anthropic.com';
}
/**
* Get provider configuration for a specific provider
* @param {string} provider - Provider name
* @returns {object} Provider configuration
*/
export function getProviderConfig(provider) {
switch (provider) {
case 'ollama':
return {
name: 'ollama',
baseUrl: getOllamaUrl(),
chatEndpoint: '/api/chat',
requiresAuth: false
};
case 'claude':
default:
return {
name: 'claude',
baseUrl: getAnthropicUrl(),
chatEndpoint: '/v1/messages',
requiresAuth: true,
apiKey: process.env.ANTHROPIC_API_KEY
};
}
}
/**
* Determine provider from model ID
* @param {string} modelId - Model identifier
* @returns {string} Provider name
*/
export function getProviderFromModel(modelId) {
if (!modelId) return getProvider();
// Claude models start with 'claude-'
if (modelId.startsWith('claude-')) {
return 'claude';
}
// Known Ollama models
const ollamaModels = [
'llama', 'mistral', 'qwen', 'codellama', 'phi',
'gemma', 'neural-chat', 'starling', 'orca', 'vicuna',
'deepseek', 'dolphin', 'nous-hermes', 'openhermes'
];
for (const prefix of ollamaModels) {
if (modelId.toLowerCase().startsWith(prefix)) {
return 'ollama';
}
}
// Default to configured provider
return getProvider();
}
export default {
getProvider,
getOllamaUrl,
getAnthropicUrl,
getProviderConfig,
getProviderFromModel
};