@@ -17,6 +17,9 @@ import (
1717// openaiPathSuffix is the path appended to the base URL for OpenAI-compatible endpoints.
1818const openaiPathSuffix = "/engines/v1"
1919
20+ // dummyAPIKey is a placeholder API key for Docker Model Runner (which doesn't require auth).
21+ const dummyAPIKey = "sk-docker-model-runner"
22+
2023// engineEndpoints holds the resolved base URLs (without path) for both
2124// client locations.
2225type engineEndpoints struct {
@@ -34,12 +37,19 @@ type containerApp struct {
3437 defaultHostPort int
3538 containerPort int
3639 envFn func (baseURL string ) []string
40+ extraDockerArgs []string // additional docker run args (e.g., volume mounts)
3741}
3842
3943// containerApps are launched via "docker run --rm".
4044var containerApps = map [string ]containerApp {
41- "anythingllm" : {defaultImage : "mintplexlabs/anythingllm:latest" , defaultHostPort : 3001 , containerPort : 3001 , envFn : openaiEnv (openaiPathSuffix )},
42- "openwebui" : {defaultImage : "ghcr.io/open-webui/open-webui:latest" , defaultHostPort : 3000 , containerPort : 8080 , envFn : openaiEnv (openaiPathSuffix )},
45+ "anythingllm" : {
46+ defaultImage : "mintplexlabs/anythingllm:latest" ,
47+ defaultHostPort : 3001 ,
48+ containerPort : 3001 ,
49+ envFn : anythingllmEnv ,
50+ extraDockerArgs : []string {"-v" , "anythingllm_storage:/app/server/storage" },
51+ },
52+ "openwebui" : {defaultImage : "ghcr.io/open-webui/open-webui:latest" , defaultHostPort : 3000 , containerPort : 8080 , envFn : openaiEnv (openaiPathSuffix )},
4353}
4454
4555// hostApp describes a native CLI app launched on the host.
@@ -123,7 +133,11 @@ func resolveBaseEndpoints(runner *standaloneRunner) (engineEndpoints, error) {
123133 }, nil
124134 case types .ModelRunnerEngineKindMobyManual :
125135 ep := strings .TrimRight (modelRunner .URL ("" ), "/" )
126- return engineEndpoints {container : ep , host : ep }, nil
136+ containerEP := strings .NewReplacer (
137+ "localhost" , "host.docker.internal" ,
138+ "127.0.0.1" , "host.docker.internal" ,
139+ ).Replace (ep )
140+ return engineEndpoints {container : containerEP , host : ep }, nil
127141 case types .ModelRunnerEngineKindCloud , types .ModelRunnerEngineKindMoby :
128142 if runner == nil {
129143 return engineEndpoints {}, errors .New ("unable to determine standalone runner endpoint" )
@@ -164,6 +178,7 @@ func launchContainerApp(cmd *cobra.Command, ca containerApp, baseURL string, ima
164178 dockerArgs = append (dockerArgs ,
165179 "-p" , fmt .Sprintf ("%d:%d" , hostPort , ca .containerPort ),
166180 )
181+ dockerArgs = append (dockerArgs , ca .extraDockerArgs ... )
167182 if ca .envFn == nil {
168183 return fmt .Errorf ("container app requires envFn to be set" )
169184 }
@@ -235,16 +250,27 @@ func openaiEnv(suffix string) func(string) []string {
235250 return []string {
236251 "OPENAI_API_BASE=" + ep ,
237252 "OPENAI_BASE_URL=" + ep ,
238- "OPENAI_API_KEY=docker-model-runner" ,
253+ "OPENAI_API_BASE_URL=" + ep ,
254+ "OPENAI_API_KEY=" + dummyAPIKey ,
255+ "OPEN_AI_KEY=" + dummyAPIKey , // AnythingLLM uses this
239256 }
240257 }
241258}
242259
260+ // anythingllmEnv returns environment variables for AnythingLLM with Docker Model Runner provider.
261+ func anythingllmEnv (baseURL string ) []string {
262+ return []string {
263+ "STORAGE_DIR=/app/server/storage" ,
264+ "LLM_PROVIDER=docker-model-runner" ,
265+ "DOCKER_MODEL_RUNNER_BASE_PATH=" + baseURL ,
266+ }
267+ }
268+
243269// anthropicEnv returns Anthropic-compatible environment variables.
244270func anthropicEnv (baseURL string ) []string {
245271 return []string {
246272 "ANTHROPIC_BASE_URL=" + baseURL + "/anthropic" ,
247- "ANTHROPIC_API_KEY=docker-model-runner" ,
273+ "ANTHROPIC_API_KEY=" + dummyAPIKey ,
248274 }
249275}
250276
0 commit comments