From 42cf4db6017a949c2decd1bb9b6cac2468aceeaf Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Thu, 16 Jan 2025 00:14:04 -0800 Subject: [PATCH] parser: fix parsing Modelfiles with multiple FROM commands (#8449) --- parser/parser.go | 8 +++++++- parser/parser_test.go | 11 ++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/parser/parser.go b/parser/parser.go index d5df479a5..6832351fb 100644 --- a/parser/parser.go +++ b/parser/parser.go @@ -62,7 +62,13 @@ func (f Modelfile) CreateRequest(relativeDir string) (*api.CreateRequest, error) return nil, err } - req.Files = digestMap + if req.Files == nil { + req.Files = digestMap + } else { + for k, v := range digestMap { + req.Files[k] = v + } + } case "adapter": path, err := expandPath(c.Args, relativeDir) if err != nil { diff --git a/parser/parser_test.go b/parser/parser_test.go index 429bdc64b..eb52ee679 100644 --- a/parser/parser_test.go +++ b/parser/parser_test.go @@ -793,15 +793,20 @@ func createBinFile(t *testing.T, kv map[string]any, ti []llm.Tensor) (string, st } func TestCreateRequestFiles(t *testing.T) { - name, digest := createBinFile(t, nil, nil) + n1, d1 := createBinFile(t, nil, nil) + n2, d2 := createBinFile(t, map[string]any{"foo": "bar"}, nil) cases := []struct { input string expected *api.CreateRequest }{ { - fmt.Sprintf("FROM %s", name), - &api.CreateRequest{Files: map[string]string{name: digest}}, + fmt.Sprintf("FROM %s", n1), + &api.CreateRequest{Files: map[string]string{n1: d1}}, + }, + { + fmt.Sprintf("FROM %s\nFROM %s", n1, n2), + &api.CreateRequest{Files: map[string]string{n1: d1, n2: d2}}, }, }