Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 7 additions & 30 deletions app/Agents/Providers/DynamicProviderResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
use App\Models\IntegrationSetting;
use App\Models\User;
use InvalidArgumentException;
use OpenCompany\PrismRelay\Meta\ProviderMeta;
use OpenCompany\PrismRelay\RelayManager;

class DynamicProviderResolver
{
Expand Down Expand Up @@ -74,7 +76,7 @@ public function resolveFromParts(string $providerKey, string $model): array
*/
private function isGlmProvider(string $providerKey): bool
{
return in_array($providerKey, ['glm', 'glm-coding', 'kimi', 'kimi-coding', 'minimax', 'minimax-cn']);
return (new RelayManager)->isRelayProvider($providerKey);
}

/**
Expand Down Expand Up @@ -192,15 +194,8 @@ private function applyIntegrationConfig(string $providerKey): void
*/
private function getDefaultGlmUrl(string $providerKey): string
{
return match ($providerKey) {
'glm' => 'https://open.bigmodel.cn/api/paas/v4',
'glm-coding' => 'https://api.z.ai/api/coding/paas/v4',
'kimi' => 'https://api.moonshot.ai/v1',
'kimi-coding' => 'https://api.moonshot.ai/v1',
'minimax' => 'https://api.minimax.io/anthropic/v1',
'minimax-cn' => 'https://api.minimaxi.com/anthropic/v1',
default => throw new InvalidArgumentException("Unknown custom provider: {$providerKey}"),
};
return (new ProviderMeta)->url($providerKey)
?? throw new InvalidArgumentException("Unknown custom provider: {$providerKey}");
}

/**
Expand All @@ -216,25 +211,7 @@ private function getDefaultModel(string $providerKey): string
return array_key_first($models);
}

// Hardcoded fallbacks for providers without DB-stored models
return match ($providerKey) {
'glm' => 'glm-4-plus',
'glm-coding' => 'glm-4.7',
'kimi' => 'kimi-k2.5',
'kimi-coding' => 'kimi-k2.5',
'minimax' => 'MiniMax-M1',
'minimax-cn' => 'MiniMax-M1',
'codex' => 'gpt-5.3-codex',
'anthropic' => 'claude-sonnet-4-5-20250929',
'openai' => 'gpt-4o',
'gemini' => 'gemini-2.0-flash',
'groq' => 'llama-3.3-70b-versatile',
'xai' => 'grok-2',
'deepseek' => 'deepseek-chat',
'mistral' => 'mistral-large-latest',
'ollama' => 'llama3.2',
'openrouter' => 'anthropic/claude-sonnet-4-5-20250929',
default => 'default',
};
// Fall back to prism-relay's provider metadata registry
return (new ProviderMeta)->defaultModel($providerKey) ?? 'default';
}
}
44 changes: 4 additions & 40 deletions app/Providers/AppServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,6 @@
use Laravel\Ai\AiManager;
use Laravel\Ai\Providers\OpenAiProvider;
use Prism\Prism\PrismManager;
use Prism\Prism\Providers\Anthropic\Anthropic;
use Prism\Prism\Providers\DeepSeek\DeepSeek;

class AppServiceProvider extends ServiceProvider
{
Expand All @@ -32,6 +30,8 @@ class AppServiceProvider extends ServiceProvider
*/
public function register(): void
{
$this->app->singleton(ToolRegistry::class);

// Override the default config-based credential resolver with DB-backed one
$this->app->singleton(
\OpenCompany\IntegrationCore\Contracts\CredentialResolver::class,
Expand Down Expand Up @@ -80,44 +80,8 @@ public function boot(): void
});
}

// Register GLM (Zhipu AI) as custom Prism providers
// GLM uses OpenAI-compatible chat/completions API (same as DeepSeek)
$prismManager = $this->app->make(PrismManager::class);
$glmPrismFactory = function ($app, array $config) {
return new DeepSeek(
apiKey: $config['api_key'] ?? '',
url: $config['url'] ?? 'https://api.z.ai/api/coding/paas/v4',
);
};
$prismManager->extend('glm', $glmPrismFactory);
$prismManager->extend('glm-coding', $glmPrismFactory);

// Register Kimi (Moonshot AI) as custom Prism providers (same pattern as GLM)
$kimiPrismFactory = function ($app, array $config) {
return new DeepSeek(
apiKey: $config['api_key'] ?? '',
url: $config['url'] ?? 'https://api.moonshot.ai/v1',
);
};
$prismManager->extend('kimi', $kimiPrismFactory);
$prismManager->extend('kimi-coding', $kimiPrismFactory);

// Register MiniMax Coding Plan as custom Prism providers (Anthropic-compatible API)
$minimaxPrismFactory = function ($app, array $config) {
return new Anthropic(
apiKey: $config['api_key'] ?? '',
apiVersion: '2023-06-01',
url: $config['url'] ?? 'https://api.minimax.io/anthropic/v1',
);
};
$prismManager->extend('minimax', $minimaxPrismFactory);
$prismManager->extend('minimax-cn', function ($app, array $config) {
return new Anthropic(
apiKey: $config['api_key'] ?? '',
apiVersion: '2023-06-01',
url: $config['url'] ?? 'https://api.minimaxi.com/anthropic/v1',
);
});
// Custom Prism providers (GLM, Kimi, MiniMax) are registered by
// PrismRelayServiceProvider via afterResolving(PrismManager::class).

// Register 'glm' and 'glm-coding' as custom AI SDK drivers.
// These use GlmPrismGateway which routes to our custom 'glm' Prism provider
Expand Down
Loading
Loading