diff --git a/packages/cli/src/modules/agents/builder/__tests__/builder-model-live-lookup.service.test.ts b/packages/cli/src/modules/agents/builder/__tests__/builder-model-live-lookup.service.test.ts index d99ace86cd1..5ae4b9a9e8d 100644 --- a/packages/cli/src/modules/agents/builder/__tests__/builder-model-live-lookup.service.test.ts +++ b/packages/cli/src/modules/agents/builder/__tests__/builder-model-live-lookup.service.test.ts @@ -218,6 +218,33 @@ describe('BuilderModelLiveLookupService', () => { expect(result).toEqual({ status: 'unavailable', policy: 'endpoint-only', error }); }); + it('returns endpoint-only models for ollama and maps baseUrl', async () => { + const { service, credentialsService, credentialsHelper } = makeService(); + credentialsService.getCredentialsAUserCanUseInAWorkflow.mockResolvedValue( + usable('cred-1', 'ollamaApi'), + ); + credentialsHelper.getDecrypted.mockResolvedValue({ + baseUrl: 'http://localhost:11434', + apiKey: '', + }); + listModelsForProvider.mockResolvedValue([{ id: 'llama3.1', name: 'llama3.1' }]); + + const result = await service.lookup(user, projectId, 'cred-1', 'ollamaApi', 'ollama'); + + expect(result).toEqual({ + status: 'success', + policy: 'endpoint-only', + models: [{ name: 'llama3.1', value: 'llama3.1' }], + }); + expect(listModelsForProvider).toHaveBeenCalledWith( + 'ollama', + expect.objectContaining({ + apiKey: '', + baseURL: 'http://localhost:11434', + }), + ); + }); + it('preserves endpoint-only policy when custom OpenAI discovery is empty', async () => { const { service, credentialsService, credentialsHelper } = makeService(); credentialsService.getCredentialsAUserCanUseInAWorkflow.mockResolvedValue( diff --git a/packages/cli/src/modules/agents/json-config/__tests__/credential-field-mapping.test.ts b/packages/cli/src/modules/agents/json-config/__tests__/credential-field-mapping.test.ts index e3e34c44020..31c7d859ac1 100644 --- a/packages/cli/src/modules/agents/json-config/__tests__/credential-field-mapping.test.ts +++ b/packages/cli/src/modules/agents/json-config/__tests__/credential-field-mapping.test.ts @@ -38,6 +38,29 @@ describe('mapCredentialForProvider', () => { }); }); + describe('ollama', () => { + it('maps the credential baseUrl onto baseURL', () => { + expect( + mapCredentialForProvider('ollama', { + apiKey: 'test-key', + baseUrl: 'http://localhost:11434', + }), + ).toEqual({ apiKey: 'test-key', baseURL: 'http://localhost:11434' }); + }); + + it('passes through when the optional apiKey is unset', () => { + expect(mapCredentialForProvider('ollama', { baseUrl: 'http://srv:11434' })).toEqual({ + apiKey: undefined, + baseURL: 'http://srv:11434', + }); + }); + + it('is a supported agent provider', () => { + expect(isSupportedAgentProvider('ollama')).toBe(true); + expect(SUPPORTED_AGENT_PROVIDERS).toContain('ollama'); + }); + }); + it('passes an unmapped provider through unchanged', () => { const raw = { apiKey: 'key', url: 'https://example.com', someOtherField: 'kept' };