Skip to content

Commit 07cb5a1

Browse files
committed
feat: fixes after testing e2e
1 parent 452354d commit 07cb5a1

2 files changed

Lines changed: 38 additions & 12 deletions

File tree

cmd/cli/commands/launch.go

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ import (
1717
// openaiPathSuffix is the path appended to the base URL for OpenAI-compatible endpoints.
1818
const 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.
2225
type 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".
4044
var 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.
244270
func 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

cmd/cli/commands/launch_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,9 @@ func TestResolveBaseEndpointsDesktop(t *testing.T) {
6161
}
6262

6363
func TestResolveBaseEndpointsMobyManual(t *testing.T) {
64-
expectedHost := "http://localhost:8080"
64+
hostURL := "http://localhost:8080"
6565
ctx, err := desktop.NewContextForTest(
66-
expectedHost,
66+
hostURL,
6767
nil,
6868
types.ModelRunnerEngineKindMobyManual,
6969
)
@@ -72,8 +72,8 @@ func TestResolveBaseEndpointsMobyManual(t *testing.T) {
7272

7373
ep, err := resolveBaseEndpoints(nil)
7474
require.NoError(t, err)
75-
require.Equal(t, expectedHost, ep.container)
76-
require.Equal(t, expectedHost, ep.host)
75+
require.Equal(t, "http://host.docker.internal:8080", ep.container)
76+
require.Equal(t, hostURL, ep.host)
7777
}
7878

7979
func TestResolveBaseEndpointsCloud(t *testing.T) {
@@ -237,7 +237,7 @@ func TestLaunchHostAppDryRunOpenai(t *testing.T) {
237237
require.Contains(t, output, "Would run: ls")
238238
require.Contains(t, output, "OPENAI_API_BASE="+testBaseURL+"/engines/v1")
239239
require.Contains(t, output, "OPENAI_BASE_URL="+testBaseURL+"/engines/v1")
240-
require.Contains(t, output, "OPENAI_API_KEY=docker-model-runner")
240+
require.Contains(t, output, "OPENAI_API_KEY="+dummyAPIKey)
241241
}
242242

243243
func TestLaunchHostAppDryRunCodex(t *testing.T) {
@@ -251,7 +251,7 @@ func TestLaunchHostAppDryRunCodex(t *testing.T) {
251251
output := buf.String()
252252
require.Contains(t, output, "Would run: ls")
253253
require.Contains(t, output, "OPENAI_BASE_URL="+testBaseURL+"/v1")
254-
require.Contains(t, output, "OPENAI_API_KEY=docker-model-runner")
254+
require.Contains(t, output, "OPENAI_API_KEY="+dummyAPIKey)
255255
require.NotContains(t, output, "/engines/v1")
256256
}
257257

@@ -278,7 +278,7 @@ func TestLaunchHostAppDryRunAnthropic(t *testing.T) {
278278
output := buf.String()
279279
require.Contains(t, output, "Would run: ls")
280280
require.Contains(t, output, "ANTHROPIC_BASE_URL="+testBaseURL+"/anthropic")
281-
require.Contains(t, output, "ANTHROPIC_API_KEY=docker-model-runner")
281+
require.Contains(t, output, "ANTHROPIC_API_KEY="+dummyAPIKey)
282282
require.NotContains(t, output, "OPENAI_")
283283
}
284284

0 commit comments

Comments
 (0)