@@ -8,13 +8,16 @@ import (
88 "io"
99 "os"
1010 "os/signal"
11+ "strconv"
1112 "strings"
1213 "syscall"
1314
1415 "github.com/charmbracelet/glamour"
1516 "github.com/docker/model-runner/cmd/cli/commands/completion"
1617 "github.com/docker/model-runner/cmd/cli/desktop"
1718 "github.com/docker/model-runner/cmd/cli/readline"
19+ "github.com/docker/model-runner/pkg/inference"
20+ "github.com/docker/model-runner/pkg/inference/scheduling"
1821 "github.com/fatih/color"
1922 "github.com/muesli/termenv"
2023 "github.com/spf13/cobra"
@@ -90,11 +93,12 @@ func readMultilineInput(cmd *cobra.Command, scanner *bufio.Scanner) (string, err
9093func generateInteractiveWithReadline (cmd * cobra.Command , desktopClient * desktop.Client , model string ) error {
9194 usage := func () {
9295 fmt .Fprintln (os .Stderr , "Available Commands:" )
93- fmt .Fprintln (os .Stderr , " /set system Set or update the system message" )
9496 fmt .Fprintln (os .Stderr , " /bye Exit" )
97+ fmt .Fprintln (os .Stderr , " /set Set a session variable" )
9598 fmt .Fprintln (os .Stderr , " /?, /help Help for a command" )
9699 fmt .Fprintln (os .Stderr , " /? shortcuts Help for keyboard shortcuts" )
97100 fmt .Fprintln (os .Stderr , " /? files Help for file inclusion with @ symbol" )
101+ fmt .Fprintln (os .Stderr , " /? set Help for /set command" )
98102 fmt .Fprintln (os .Stderr , "" )
99103 fmt .Fprintln (os .Stderr , `Use """ to begin a multi-line message.` )
100104 fmt .Fprintln (os .Stderr , "" )
@@ -134,6 +138,13 @@ func generateInteractiveWithReadline(cmd *cobra.Command, desktopClient *desktop.
134138 fmt .Fprintln (os .Stderr , "" )
135139 }
136140
141+ usageSet := func () {
142+ fmt .Fprintln (os .Stderr , "Available /set commands:" )
143+ fmt .Fprintln (os .Stderr , " /set system <message> Set system message for the conversation" )
144+ fmt .Fprintln (os .Stderr , " /set parameter num_ctx <n> Set context window size (in tokens)" )
145+ fmt .Fprintln (os .Stderr , "" )
146+ }
147+
137148 scanner , err := readline .New (readline.Prompt {
138149 Prompt : "> " ,
139150 AltPrompt : ". " ,
@@ -204,36 +215,79 @@ func generateInteractiveWithReadline(cmd *cobra.Command, desktopClient *desktop.
204215 case scanner .Pasting :
205216 fmt .Fprintln (& sb , line )
206217 continue
207- case strings .HasPrefix (line , "/help" ), strings . HasPrefix ( line , "/? " ):
218+ case strings .HasPrefix (line , "/" ):
208219 args := strings .Fields (line )
209- if len (args ) > 1 {
220+ switch args [0 ] {
221+ case "/help" , "/?" :
222+ if len (args ) > 1 {
223+ switch args [1 ] {
224+ case "shortcut" , "shortcuts" :
225+ usageShortcuts ()
226+ case "file" , "files" :
227+ usageFiles ()
228+ case "set" :
229+ usageSet ()
230+ default :
231+ usage ()
232+ }
233+ } else {
234+ usage ()
235+ }
236+ case "/exit" , "/bye" :
237+ return nil
238+ case "/set" :
239+ if len (args ) < 2 {
240+ usageSet ()
241+ continue
242+ }
210243 switch args [1 ] {
211- case "shortcut" , "shortcuts" :
212- usageShortcuts ()
213- case "file" , "files" :
214- usageFiles ()
244+ case "system" :
245+ // Extract the system prompt text after "/set system"
246+ if len (args ) > 2 {
247+ systemPrompt = strings .Join (args [2 :], " " )
248+ } else {
249+ systemPrompt = ""
250+ }
251+ if systemPrompt == "" {
252+ fmt .Fprintln (os .Stderr , "Cleared system message." )
253+ } else {
254+ fmt .Fprintln (os .Stderr , "Set system message." )
255+ }
256+ case "parameter" :
257+ if len (args ) < 4 {
258+ fmt .Fprintln (os .Stderr , "Usage: /set parameter <name> <value>" )
259+ fmt .Fprintln (os .Stderr , "Available parameters: num_ctx" )
260+ continue
261+ }
262+ paramName , paramValue := args [2 ], args [3 ]
263+ switch paramName {
264+ case "num_ctx" :
265+ if val , err := strconv .ParseInt (paramValue , 10 , 32 ); err == nil && val > 0 {
266+ ctx := int32 (val )
267+ if err := desktopClient .ConfigureBackend (scheduling.ConfigureRequest {
268+ Model : model ,
269+ BackendConfiguration : inference.BackendConfiguration {
270+ ContextSize : & ctx ,
271+ },
272+ }); err != nil {
273+ fmt .Fprintf (os .Stderr , "Failed to set num_ctx: %v\n " , err )
274+ } else {
275+ fmt .Fprintf (os .Stderr , "Set num_ctx to %d\n " , val )
276+ }
277+ } else {
278+ fmt .Fprintf (os .Stderr , "Invalid value for num_ctx: %s (must be a positive integer)\n " , paramValue )
279+ }
280+ default :
281+ fmt .Fprintf (os .Stderr , "Unknown parameter: %s\n " , paramName )
282+ fmt .Fprintln (os .Stderr , "Available parameters: num_ctx" )
283+ }
215284 default :
216- usage ()
285+ usageSet ()
217286 }
218- } else {
219- usage ()
220- }
221- continue
222- case strings .HasPrefix (line , "/set system " ) || line == "/set system" :
223- // Extract the system prompt text after "/set system "
224- systemPrompt = strings .TrimPrefix (line , "/set system " )
225- systemPrompt = strings .TrimSpace (systemPrompt )
226- if systemPrompt == "" {
227- fmt .Fprintln (os .Stderr , "Cleared system message." )
228- } else {
229- fmt .Fprintln (os .Stderr , "Set system message." )
287+ default :
288+ fmt .Printf ("Unknown command '%s'. Type /? for help\n " , args [0 ])
230289 }
231290 continue
232- case strings .HasPrefix (line , "/exit" ), strings .HasPrefix (line , "/bye" ):
233- return nil
234- case strings .HasPrefix (line , "/" ):
235- fmt .Printf ("Unknown command '%s'. Type /? for help\n " , strings .Fields (line )[0 ])
236- continue
237291 default :
238292 sb .WriteString (line )
239293 }
0 commit comments