fix: ollama and lm studio url issue fix for docker and build (#1008)
Browse files* fix: ollama and lm studio url issue fix for docker and build
* vite config fix
- Dockerfile +5 -3
- app/lib/modules/llm/providers/lmstudio.ts +30 -5
- app/lib/modules/llm/providers/ollama.ts +21 -4
- vite.config.ts +7 -2
Dockerfile
CHANGED
|
@@ -45,13 +45,14 @@ ENV WRANGLER_SEND_METRICS=false \
|
|
| 45 |
TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \
|
| 46 |
AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \
|
| 47 |
VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \
|
| 48 |
-
DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}
|
|
|
|
| 49 |
|
| 50 |
# Pre-configure wrangler to disable metrics
|
| 51 |
RUN mkdir -p /root/.config/.wrangler && \
|
| 52 |
echo '{"enabled":false}' > /root/.config/.wrangler/metrics.json
|
| 53 |
|
| 54 |
-
RUN
|
| 55 |
|
| 56 |
CMD [ "pnpm", "run", "dockerstart"]
|
| 57 |
|
|
@@ -84,7 +85,8 @@ ENV GROQ_API_KEY=${GROQ_API_KEY} \
|
|
| 84 |
TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \
|
| 85 |
AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \
|
| 86 |
VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \
|
| 87 |
-
DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}
|
|
|
|
| 88 |
|
| 89 |
RUN mkdir -p ${WORKDIR}/run
|
| 90 |
CMD pnpm run dev --host
|
|
|
|
| 45 |
TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \
|
| 46 |
AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \
|
| 47 |
VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \
|
| 48 |
+
DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}\
|
| 49 |
+
RUNNING_IN_DOCKER=true
|
| 50 |
|
| 51 |
# Pre-configure wrangler to disable metrics
|
| 52 |
RUN mkdir -p /root/.config/.wrangler && \
|
| 53 |
echo '{"enabled":false}' > /root/.config/.wrangler/metrics.json
|
| 54 |
|
| 55 |
+
RUN pnpm run build
|
| 56 |
|
| 57 |
CMD [ "pnpm", "run", "dockerstart"]
|
| 58 |
|
|
|
|
| 85 |
TOGETHER_API_BASE_URL=${TOGETHER_API_BASE_URL} \
|
| 86 |
AWS_BEDROCK_CONFIG=${AWS_BEDROCK_CONFIG} \
|
| 87 |
VITE_LOG_LEVEL=${VITE_LOG_LEVEL} \
|
| 88 |
+
DEFAULT_NUM_CTX=${DEFAULT_NUM_CTX}\
|
| 89 |
+
RUNNING_IN_DOCKER=true
|
| 90 |
|
| 91 |
RUN mkdir -p ${WORKDIR}/run
|
| 92 |
CMD pnpm run dev --host
|
app/lib/modules/llm/providers/lmstudio.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { ModelInfo } from '~/lib/modules/llm/types';
|
|
| 3 |
import type { IProviderSetting } from '~/types/model';
|
| 4 |
import { createOpenAI } from '@ai-sdk/openai';
|
| 5 |
import type { LanguageModelV1 } from 'ai';
|
|
|
|
| 6 |
|
| 7 |
export default class LMStudioProvider extends BaseProvider {
|
| 8 |
name = 'LMStudio';
|
|
@@ -22,7 +23,7 @@ export default class LMStudioProvider extends BaseProvider {
|
|
| 22 |
settings?: IProviderSetting,
|
| 23 |
serverEnv: Record<string, string> = {},
|
| 24 |
): Promise<ModelInfo[]> {
|
| 25 |
-
|
| 26 |
apiKeys,
|
| 27 |
providerSettings: settings,
|
| 28 |
serverEnv,
|
|
@@ -31,7 +32,18 @@ export default class LMStudioProvider extends BaseProvider {
|
|
| 31 |
});
|
| 32 |
|
| 33 |
if (!baseUrl) {
|
| 34 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
}
|
| 36 |
|
| 37 |
const response = await fetch(`${baseUrl}/v1/models`);
|
|
@@ -51,13 +63,26 @@ export default class LMStudioProvider extends BaseProvider {
|
|
| 51 |
providerSettings?: Record<string, IProviderSetting>;
|
| 52 |
}) => LanguageModelV1 = (options) => {
|
| 53 |
const { apiKeys, providerSettings, serverEnv, model } = options;
|
| 54 |
-
|
| 55 |
apiKeys,
|
| 56 |
-
providerSettings,
|
| 57 |
serverEnv: serverEnv as any,
|
| 58 |
-
defaultBaseUrlKey: '
|
| 59 |
defaultApiTokenKey: '',
|
| 60 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
const lmstudio = createOpenAI({
|
| 62 |
baseUrl: `${baseUrl}/v1`,
|
| 63 |
apiKey: '',
|
|
|
|
| 3 |
import type { IProviderSetting } from '~/types/model';
|
| 4 |
import { createOpenAI } from '@ai-sdk/openai';
|
| 5 |
import type { LanguageModelV1 } from 'ai';
|
| 6 |
+
import { logger } from '~/utils/logger';
|
| 7 |
|
| 8 |
export default class LMStudioProvider extends BaseProvider {
|
| 9 |
name = 'LMStudio';
|
|
|
|
| 23 |
settings?: IProviderSetting,
|
| 24 |
serverEnv: Record<string, string> = {},
|
| 25 |
): Promise<ModelInfo[]> {
|
| 26 |
+
let { baseUrl } = this.getProviderBaseUrlAndKey({
|
| 27 |
apiKeys,
|
| 28 |
providerSettings: settings,
|
| 29 |
serverEnv,
|
|
|
|
| 32 |
});
|
| 33 |
|
| 34 |
if (!baseUrl) {
|
| 35 |
+
throw new Error('No baseUrl found for LMStudio provider');
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
if (typeof window === 'undefined') {
|
| 39 |
+
/*
|
| 40 |
+
* Running in Server
|
| 41 |
+
* Backend: Check if we're running in Docker
|
| 42 |
+
*/
|
| 43 |
+
const isDocker = process.env.RUNNING_IN_DOCKER === 'true';
|
| 44 |
+
|
| 45 |
+
baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl;
|
| 46 |
+
baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl;
|
| 47 |
}
|
| 48 |
|
| 49 |
const response = await fetch(`${baseUrl}/v1/models`);
|
|
|
|
| 63 |
providerSettings?: Record<string, IProviderSetting>;
|
| 64 |
}) => LanguageModelV1 = (options) => {
|
| 65 |
const { apiKeys, providerSettings, serverEnv, model } = options;
|
| 66 |
+
let { baseUrl } = this.getProviderBaseUrlAndKey({
|
| 67 |
apiKeys,
|
| 68 |
+
providerSettings: providerSettings?.[this.name],
|
| 69 |
serverEnv: serverEnv as any,
|
| 70 |
+
defaultBaseUrlKey: 'LMSTUDIO_API_BASE_URL',
|
| 71 |
defaultApiTokenKey: '',
|
| 72 |
});
|
| 73 |
+
|
| 74 |
+
if (!baseUrl) {
|
| 75 |
+
throw new Error('No baseUrl found for LMStudio provider');
|
| 76 |
+
}
|
| 77 |
+
|
| 78 |
+
if (typeof window === 'undefined') {
|
| 79 |
+
const isDocker = process.env.RUNNING_IN_DOCKER === 'true';
|
| 80 |
+
baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl;
|
| 81 |
+
baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
logger.debug('LMStudio Base Url used: ', baseUrl);
|
| 85 |
+
|
| 86 |
const lmstudio = createOpenAI({
|
| 87 |
baseUrl: `${baseUrl}/v1`,
|
| 88 |
apiKey: '',
|
app/lib/modules/llm/providers/ollama.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { ModelInfo } from '~/lib/modules/llm/types';
|
|
| 3 |
import type { IProviderSetting } from '~/types/model';
|
| 4 |
import type { LanguageModelV1 } from 'ai';
|
| 5 |
import { ollama } from 'ollama-ai-provider';
|
|
|
|
| 6 |
|
| 7 |
interface OllamaModelDetails {
|
| 8 |
parent_model: string;
|
|
@@ -45,7 +46,7 @@ export default class OllamaProvider extends BaseProvider {
|
|
| 45 |
settings?: IProviderSetting,
|
| 46 |
serverEnv: Record<string, string> = {},
|
| 47 |
): Promise<ModelInfo[]> {
|
| 48 |
-
|
| 49 |
apiKeys,
|
| 50 |
providerSettings: settings,
|
| 51 |
serverEnv,
|
|
@@ -54,7 +55,18 @@ export default class OllamaProvider extends BaseProvider {
|
|
| 54 |
});
|
| 55 |
|
| 56 |
if (!baseUrl) {
|
| 57 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
}
|
| 59 |
|
| 60 |
const response = await fetch(`${baseUrl}/api/tags`);
|
|
@@ -78,18 +90,23 @@ export default class OllamaProvider extends BaseProvider {
|
|
| 78 |
const { apiKeys, providerSettings, serverEnv, model } = options;
|
| 79 |
let { baseUrl } = this.getProviderBaseUrlAndKey({
|
| 80 |
apiKeys,
|
| 81 |
-
providerSettings,
|
| 82 |
serverEnv: serverEnv as any,
|
| 83 |
defaultBaseUrlKey: 'OLLAMA_API_BASE_URL',
|
| 84 |
defaultApiTokenKey: '',
|
| 85 |
});
|
| 86 |
|
| 87 |
// Backend: Check if we're running in Docker
|
| 88 |
-
|
|
|
|
|
|
|
| 89 |
|
|
|
|
| 90 |
baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl;
|
| 91 |
baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl;
|
| 92 |
|
|
|
|
|
|
|
| 93 |
const ollamaInstance = ollama(model, {
|
| 94 |
numCtx: DEFAULT_NUM_CTX,
|
| 95 |
}) as LanguageModelV1 & { config: any };
|
|
|
|
| 3 |
import type { IProviderSetting } from '~/types/model';
|
| 4 |
import type { LanguageModelV1 } from 'ai';
|
| 5 |
import { ollama } from 'ollama-ai-provider';
|
| 6 |
+
import { logger } from '~/utils/logger';
|
| 7 |
|
| 8 |
interface OllamaModelDetails {
|
| 9 |
parent_model: string;
|
|
|
|
| 46 |
settings?: IProviderSetting,
|
| 47 |
serverEnv: Record<string, string> = {},
|
| 48 |
): Promise<ModelInfo[]> {
|
| 49 |
+
let { baseUrl } = this.getProviderBaseUrlAndKey({
|
| 50 |
apiKeys,
|
| 51 |
providerSettings: settings,
|
| 52 |
serverEnv,
|
|
|
|
| 55 |
});
|
| 56 |
|
| 57 |
if (!baseUrl) {
|
| 58 |
+
throw new Error('No baseUrl found for OLLAMA provider');
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
if (typeof window === 'undefined') {
|
| 62 |
+
/*
|
| 63 |
+
* Running in Server
|
| 64 |
+
* Backend: Check if we're running in Docker
|
| 65 |
+
*/
|
| 66 |
+
const isDocker = process.env.RUNNING_IN_DOCKER === 'true';
|
| 67 |
+
|
| 68 |
+
baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl;
|
| 69 |
+
baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl;
|
| 70 |
}
|
| 71 |
|
| 72 |
const response = await fetch(`${baseUrl}/api/tags`);
|
|
|
|
| 90 |
const { apiKeys, providerSettings, serverEnv, model } = options;
|
| 91 |
let { baseUrl } = this.getProviderBaseUrlAndKey({
|
| 92 |
apiKeys,
|
| 93 |
+
providerSettings: providerSettings?.[this.name],
|
| 94 |
serverEnv: serverEnv as any,
|
| 95 |
defaultBaseUrlKey: 'OLLAMA_API_BASE_URL',
|
| 96 |
defaultApiTokenKey: '',
|
| 97 |
});
|
| 98 |
|
| 99 |
// Backend: Check if we're running in Docker
|
| 100 |
+
if (!baseUrl) {
|
| 101 |
+
throw new Error('No baseUrl found for OLLAMA provider');
|
| 102 |
+
}
|
| 103 |
|
| 104 |
+
const isDocker = process.env.RUNNING_IN_DOCKER === 'true';
|
| 105 |
baseUrl = isDocker ? baseUrl.replace('localhost', 'host.docker.internal') : baseUrl;
|
| 106 |
baseUrl = isDocker ? baseUrl.replace('127.0.0.1', 'host.docker.internal') : baseUrl;
|
| 107 |
|
| 108 |
+
logger.debug('Ollama Base Url used: ', baseUrl);
|
| 109 |
+
|
| 110 |
const ollamaInstance = ollama(model, {
|
| 111 |
numCtx: DEFAULT_NUM_CTX,
|
| 112 |
}) as LanguageModelV1 & { config: any };
|
vite.config.ts
CHANGED
|
@@ -4,9 +4,11 @@ import { defineConfig, type ViteDevServer } from 'vite';
|
|
| 4 |
import { nodePolyfills } from 'vite-plugin-node-polyfills';
|
| 5 |
import { optimizeCssModules } from 'vite-plugin-optimize-css-modules';
|
| 6 |
import tsconfigPaths from 'vite-tsconfig-paths';
|
| 7 |
-
|
| 8 |
import { execSync } from 'child_process';
|
| 9 |
|
|
|
|
|
|
|
| 10 |
// Get git hash with fallback
|
| 11 |
const getGitHash = () => {
|
| 12 |
try {
|
|
@@ -17,18 +19,21 @@ const getGitHash = () => {
|
|
| 17 |
};
|
| 18 |
|
| 19 |
|
|
|
|
|
|
|
| 20 |
export default defineConfig((config) => {
|
| 21 |
return {
|
| 22 |
define: {
|
| 23 |
__COMMIT_HASH: JSON.stringify(getGitHash()),
|
| 24 |
__APP_VERSION: JSON.stringify(process.env.npm_package_version),
|
|
|
|
| 25 |
},
|
| 26 |
build: {
|
| 27 |
target: 'esnext',
|
| 28 |
},
|
| 29 |
plugins: [
|
| 30 |
nodePolyfills({
|
| 31 |
-
include: ['path', 'buffer'],
|
| 32 |
}),
|
| 33 |
config.mode !== 'test' && remixCloudflareDevProxy(),
|
| 34 |
remixVitePlugin({
|
|
|
|
| 4 |
import { nodePolyfills } from 'vite-plugin-node-polyfills';
|
| 5 |
import { optimizeCssModules } from 'vite-plugin-optimize-css-modules';
|
| 6 |
import tsconfigPaths from 'vite-tsconfig-paths';
|
| 7 |
+
import * as dotenv from 'dotenv';
|
| 8 |
import { execSync } from 'child_process';
|
| 9 |
|
| 10 |
+
dotenv.config();
|
| 11 |
+
|
| 12 |
// Get git hash with fallback
|
| 13 |
const getGitHash = () => {
|
| 14 |
try {
|
|
|
|
| 19 |
};
|
| 20 |
|
| 21 |
|
| 22 |
+
|
| 23 |
+
|
| 24 |
export default defineConfig((config) => {
|
| 25 |
return {
|
| 26 |
define: {
|
| 27 |
__COMMIT_HASH: JSON.stringify(getGitHash()),
|
| 28 |
__APP_VERSION: JSON.stringify(process.env.npm_package_version),
|
| 29 |
+
// 'process.env': JSON.stringify(process.env)
|
| 30 |
},
|
| 31 |
build: {
|
| 32 |
target: 'esnext',
|
| 33 |
},
|
| 34 |
plugins: [
|
| 35 |
nodePolyfills({
|
| 36 |
+
include: ['path', 'buffer', 'process'],
|
| 37 |
}),
|
| 38 |
config.mode !== 'test' && remixCloudflareDevProxy(),
|
| 39 |
remixVitePlugin({
|