BxDolAIModelFactory.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php defined('BX_DOL') or die('hack attempt');
  2. /**
  3. * Copyright (c) UNA, Inc - https://una.io
  4. * MIT License - https://opensource.org/licenses/MIT
  5. *
  6. * @defgroup UnaCore UNA Core
  7. * @{
  8. */
  9. class BxDolAIModelFactory extends BxDolFactory
  10. {
  11. public static function getModelInstance(int $iId): NeuronAI\Providers\AIProviderInterface | NeuronAI\RAG\Embeddings\EmbeddingsProviderInterface
  12. {
  13. if (isset($GLOBALS['bxDolClasses'][__CLASS__ . '_Model_' . $iId]))
  14. return $GLOBALS['bxDolClasses'][__CLASS__ . '_Model_' . $iId];
  15. $aProvidersWithKey = ['anthropic'];
  16. $a = BxDolAIQuery::getModelObject($iId);
  17. if (!$a) {
  18. bx_log('sys_agents', "Agent AI Model with id {$iId} not found", BX_LOG_ERR);
  19. throw new Exception("Agent AI Model with id {$iId} not found");
  20. }
  21. if (in_array($a['type'], $aProvidersWithKey) && empty($a['key'])) {
  22. bx_log('sys_agents', "Model with id {$iId} has empty key, can't be used", BX_LOG_ERR);
  23. throw new Exception("Model with id {$iId} has empty key, can't be used");
  24. }
  25. if (!$a['active']) {
  26. bx_log('sys_agents', "Model with id {$iId} is not active, can't be used", BX_LOG_ERR);
  27. throw new Exception("Model with id {$iId} is not active, can't be used");
  28. }
  29. $aParametersSystem = !empty($a['params']) ? json_decode($a['params'], true) : [];
  30. $aParametersUser = !empty($a['params_user']) ? json_decode($a['params_user'], true) : [];
  31. $aParameters = array_merge($aParametersSystem, $aParametersUser);
  32. // replace markers {key} {model} in $aParameters recoursively
  33. $aParameters = bx_replace_markers($aParameters, [
  34. 'key' => $a['key'],
  35. 'model' => $a['model']
  36. ]);
  37. switch($a['type']) {
  38. // regular AI providers ------------------------
  39. case 'anthropic':
  40. $o = new NeuronAI\Providers\Anthropic\Anthropic(
  41. key: $a['key'],
  42. model: $a['model'],
  43. version: $aParameters['version'] ?? '2023-06-01',
  44. max_tokens: $aParameters['max_tokens'] ?? 8192,
  45. parameters: $aParameters['parameters'] ?? [],
  46. );
  47. break;
  48. case 'openai-responses':
  49. $o = new NeuronAI\Providers\OpenAI\Responses\OpenAIResponses(
  50. key: $a['key'],
  51. model: $a['model'],
  52. parameters: $aParameters['parameters'] ?? [],
  53. strict_response: $aParameters['strict_response'] ?? false,
  54. );
  55. break;
  56. case 'azure-openai':
  57. $o = new NeuronAI\Providers\OpenAI\AzureOpenAI(
  58. key: $a['key'],
  59. model: $a['model'],
  60. endpoint: $aParameters['endpoint'],
  61. version: $aParameters['version'],
  62. parameters: $aParameters['parameters'] ?? [],
  63. strict_response: $aParameters['strict_response'] ?? false,
  64. );
  65. break;
  66. case 'openai-like':
  67. $o = new NeuronAI\Providers\OpenAILike(
  68. baseUri: $aParameters['baseUri'],
  69. key: $a['key'],
  70. model: $a['model'],
  71. parameters: $aParameters['parameters'] ?? [],
  72. strict_response: $aParameters['strict_response'] ?? false,
  73. );
  74. break;
  75. case 'ollama':
  76. $o = new NeuronAI\Providers\Ollama\Ollama(
  77. url: $aParameters['url'] ?? 'http://localhost:11434/api',
  78. model: $a['model'],
  79. parameters: $aParameters['parameters'] ?? [],
  80. );
  81. break;
  82. case 'gemini':
  83. $o = new NeuronAI\Providers\Gemini\Gemini(
  84. key: $a['key'],
  85. model: $a['model'],
  86. parameters: $aParameters['parameters'] ?? [],
  87. );
  88. break;
  89. case 'mistral':
  90. $o = new NeuronAI\Providers\Mistral\Mistral(
  91. key: $a['key'],
  92. model: $a['model'],
  93. parameters: $aParameters['parameters'] ?? [],
  94. strict_response: $aParameters['strict_response'] ?? false,
  95. );
  96. break;
  97. case 'huggingface':
  98. $o = new NeuronAI\Providers\HuggingFace\HuggingFace(
  99. key: $a['key'],
  100. model: $a['model'],
  101. inferenceProvider: $aParameters['inferenceProvider'] ?? 'hf-inference/models', // cohere, groq, etc - https://github.com/neuron-core/neuron-ai/blob/3.x/src/Providers/HuggingFace/InferenceProvider.php
  102. parameters: $aParameters['parameters'] ?? [],
  103. strict_response: $aParameters['strict_response'] ?? false,
  104. );
  105. break;
  106. case 'deepseek':
  107. $o = new NeuronAI\Providers\Deepseek\Deepseek(
  108. key: $a['key'],
  109. model: $a['model'],
  110. parameters: $aParameters['parameters'] ?? [],
  111. strict_response: $aParameters['strict_response'] ?? false,
  112. );
  113. break;
  114. case 'grok':
  115. $o = new NeuronAI\Providers\XAI\Grok(
  116. key: $a['key'],
  117. model: $a['model'],
  118. parameters: $aParameters['parameters'] ?? [],
  119. strict_response: $aParameters['strict_response'] ?? false,
  120. );
  121. break;
  122. case 'aws-bedrock':
  123. $oClient = new Aws\BedrockRuntime\BedrockRuntimeClient($aParameters['client_params']);
  124. $o = new NeuronAI\Providers\AWS\BedrockRuntime(
  125. client: $oClient,
  126. model: $a['model'],
  127. inferenceConfig: $aParameters['inferenceConfig'] ?? [],
  128. );
  129. break;
  130. case 'cohere':
  131. $o = new NeuronAI\Providers\Cohere\Cohere(
  132. key: $a['key'],
  133. model: $a['model'],
  134. baseUri: $aParameters['baseUri'] ?? 'https://api.cohere.ai/v2',
  135. parameters: $aParameters['parameters'] ?? [],
  136. strict_response: $aParameters['strict_response'] ?? false,
  137. );
  138. break;
  139. // embeddings models ------------------------
  140. case 'ollama-embeddings':
  141. $o = new NeuronAI\RAG\Embeddings\OllamaEmbeddingsProvider(
  142. model: $a['model'],
  143. url: $aParameters['url'] ?? 'http://localhost:11434/api',
  144. parameters: $aParameters['parameters'] ?? [],
  145. );
  146. break;
  147. case 'voyageai-embeddings':
  148. $o = new NeuronAI\RAG\Embeddings\VoyageEmbeddingsProvider(
  149. key: $a['key'],
  150. model: $a['model'],
  151. dimensions: !empty($aParameters['dimensions']) ? (int)$aParameters['dimensions'] : null
  152. );
  153. break;
  154. case 'openai-embeddings':
  155. $o = new NeuronAI\RAG\Embeddings\OpenAIEmbeddingsProvider(
  156. key: $a['key'],
  157. model: $a['model'],
  158. dimensions: !empty($aParameters['dimensions']) ? (int)$aParameters['dimensions'] : 1024
  159. );
  160. break;
  161. case 'openai-like-embeddings':
  162. $o = new NeuronAI\RAG\Embeddings\OpenAILikeEmbeddings(
  163. baseUri: $aParameters['baseUri'],
  164. key: $a['key'],
  165. model: $a['model'],
  166. dimensions: !empty($aParameters['dimensions']) ? (int)$aParameters['dimensions'] : 1024
  167. );
  168. break;
  169. case 'aws-bedrock-embeddings':
  170. $oClient = new Aws\BedrockRuntime\BedrockRuntimeClient($aParameters['client_params']);
  171. $o = new NeuronAI\RAG\Embeddings\AwsBedrockEmbeddingsProvider(
  172. client: $oClient,
  173. model: $a['model']
  174. );
  175. break;
  176. default:
  177. bx_log('sys_agents', "Model type {$a['type']} is not supported", BX_LOG_ERR);
  178. throw new Exception("Model type {$a['type']} is not supported");
  179. }
  180. $GLOBALS['bxDolClasses'][__CLASS__ . '_Model_' . $iId] = $o;
  181. return $o;
  182. }
  183. }