diff --git a/pkg/runner/input.go b/pkg/runner/input.go index a211ec9d..23228813 100644 --- a/pkg/runner/input.go +++ b/pkg/runner/input.go @@ -15,12 +15,14 @@ func (r *Runner) handleInput(callCtx engine.Context, monitor Monitor, env []stri } for _, inputToolRef := range inputToolRefs { - inputData, err := json.Marshal(map[string]any{ - "input": input, - }) + data := map[string]any{} + _ = json.Unmarshal([]byte(input), &data) + data["input"] = input + inputData, err := json.Marshal(data) if err != nil { return "", fmt.Errorf("failed to marshal input: %w", err) } + res, err := r.subCall(callCtx.Ctx, callCtx, monitor, env, inputToolRef.ToolID, string(inputData), "", engine.InputToolCategory) if err != nil { return "", err diff --git a/pkg/tests/runner2_test.go b/pkg/tests/runner2_test.go index 27d4c226..93899c84 100644 --- a/pkg/tests/runner2_test.go +++ b/pkg/tests/runner2_test.go @@ -55,3 +55,27 @@ Yo dawg`, "") resp, err := r.Chat(context.Background(), nil, prg, nil, "input 1") r.AssertStep(t, resp, err) } + +func TestInputFilterMoreArgs(t *testing.T) { + r := tester.NewRunner(t) + prg, err := loader.ProgramFromSource(context.Background(), ` +chat: true +inputfilters: stuff + +Say hi + +--- +name: stuff +params: foo: bar +params: input: baz + +#!/bin/bash +echo ${FOO}:${INPUT} +`, "") + require.NoError(t, err) + + resp, err := r.Chat(context.Background(), nil, prg, nil, `{"foo":"123"}`) + r.AssertStep(t, resp, err) + resp, err = r.Chat(context.Background(), nil, prg, nil, `"foo":"123"}`) + r.AssertStep(t, resp, err) +} diff --git a/pkg/tests/testdata/TestInputFilterMoreArgs/call1-resp.golden b/pkg/tests/testdata/TestInputFilterMoreArgs/call1-resp.golden new file mode 100644 index 00000000..2861a036 --- /dev/null +++ b/pkg/tests/testdata/TestInputFilterMoreArgs/call1-resp.golden @@ -0,0 +1,9 @@ +`{ + "role": "assistant", + "content": [ + { + "text": "TEST RESULT CALL: 1" + } + ], + "usage": {} +}` diff --git a/pkg/tests/testdata/TestInputFilterMoreArgs/call1.golden b/pkg/tests/testdata/TestInputFilterMoreArgs/call1.golden new file mode 100644 index 00000000..30693444 --- /dev/null +++ b/pkg/tests/testdata/TestInputFilterMoreArgs/call1.golden @@ -0,0 +1,25 @@ +`{ + "model": "gpt-4o", + "internalSystemPrompt": false, + "messages": [ + { + "role": "system", + "content": [ + { + "text": "Say hi" + } + ], + "usage": {} + }, + { + "role": "user", + "content": [ + { + "text": "123:{\"foo\":\"123\"}\n" + } + ], + "usage": {} + } + ], + "chat": true +}` diff --git a/pkg/tests/testdata/TestInputFilterMoreArgs/call2-resp.golden b/pkg/tests/testdata/TestInputFilterMoreArgs/call2-resp.golden new file mode 100644 index 00000000..997ca1b9 --- /dev/null +++ b/pkg/tests/testdata/TestInputFilterMoreArgs/call2-resp.golden @@ -0,0 +1,9 @@ +`{ + "role": "assistant", + "content": [ + { + "text": "TEST RESULT CALL: 2" + } + ], + "usage": {} +}` diff --git a/pkg/tests/testdata/TestInputFilterMoreArgs/call2.golden b/pkg/tests/testdata/TestInputFilterMoreArgs/call2.golden new file mode 100644 index 00000000..5a39730d --- /dev/null +++ b/pkg/tests/testdata/TestInputFilterMoreArgs/call2.golden @@ -0,0 +1,25 @@ +`{ + "model": "gpt-4o", + "internalSystemPrompt": false, + "messages": [ + { + "role": "system", + "content": [ + { + "text": "Say hi" + } + ], + "usage": {} + }, + { + "role": "user", + "content": [ + { + "text": ":\"foo\":\"123\"}\n" + } + ], + "usage": {} + } + ], + "chat": true +}` diff --git a/pkg/tests/testdata/TestInputFilterMoreArgs/step1.golden b/pkg/tests/testdata/TestInputFilterMoreArgs/step1.golden new file mode 100644 index 00000000..a04d4508 --- /dev/null +++ b/pkg/tests/testdata/TestInputFilterMoreArgs/step1.golden @@ -0,0 +1,48 @@ +`{ + "done": false, + "content": "TEST RESULT CALL: 1", + "toolID": "inline:", + "state": { + "continuation": { + "state": { + "input": "123:{\"foo\":\"123\"}\n", + "completion": { + "model": "gpt-4o", + "internalSystemPrompt": false, + "messages": [ + { + "role": "system", + "content": [ + { + "text": "Say hi" + } + ], + "usage": {} + }, + { + "role": "user", + "content": [ + { + "text": "123:{\"foo\":\"123\"}\n" + } + ], + "usage": {} + }, + { + "role": "assistant", + "content": [ + { + "text": "TEST RESULT CALL: 1" + } + ], + "usage": {} + } + ], + "chat": true + } + }, + "result": "TEST RESULT CALL: 1" + }, + "continuationToolID": "inline:" + } +}` diff --git a/pkg/tests/testdata/TestInputFilterMoreArgs/step2.golden b/pkg/tests/testdata/TestInputFilterMoreArgs/step2.golden new file mode 100644 index 00000000..aa41f1dd --- /dev/null +++ b/pkg/tests/testdata/TestInputFilterMoreArgs/step2.golden @@ -0,0 +1,48 @@ +`{ + "done": false, + "content": "TEST RESULT CALL: 2", + "toolID": "inline:", + "state": { + "continuation": { + "state": { + "input": ":\"foo\":\"123\"}\n", + "completion": { + "model": "gpt-4o", + "internalSystemPrompt": false, + "messages": [ + { + "role": "system", + "content": [ + { + "text": "Say hi" + } + ], + "usage": {} + }, + { + "role": "user", + "content": [ + { + "text": ":\"foo\":\"123\"}\n" + } + ], + "usage": {} + }, + { + "role": "assistant", + "content": [ + { + "text": "TEST RESULT CALL: 2" + } + ], + "usage": {} + } + ], + "chat": true + } + }, + "result": "TEST RESULT CALL: 2" + }, + "continuationToolID": "inline:" + } +}`