cmd.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package cmd
  2. import (
  3. "context"
  4. "fmt"
  5. "io/ioutil"
  6. "log"
  7. "net"
  8. "net/http"
  9. "os"
  10. "path"
  11. "time"
  12. "github.com/spf13/cobra"
  13. "github.com/ollama/ollama/api"
  14. "github.com/ollama/ollama/server"
  15. )
  16. func NewAPIClient(cmd *cobra.Command) (*api.Client, error) {
  17. var rawKey []byte
  18. var err error
  19. home, err := os.UserHomeDir()
  20. if err != nil {
  21. return nil, err
  22. }
  23. socket := path.Join(home, ".ollama", "ollama.sock")
  24. dialer := &net.Dialer{
  25. Timeout: 10 * time.Second,
  26. }
  27. k, _ := cmd.Flags().GetString("key")
  28. if k != "" {
  29. fn := path.Join(home, ".ollama/keys/", k)
  30. rawKey, err = ioutil.ReadFile(fn)
  31. if err != nil {
  32. return nil, err
  33. }
  34. }
  35. return &api.Client{
  36. URL: "http://localhost",
  37. HTTP: http.Client{
  38. Transport: &http.Transport{
  39. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  40. return dialer.DialContext(ctx, "unix", socket)
  41. },
  42. },
  43. },
  44. PrivateKey: rawKey,
  45. }, nil
  46. }
  47. func NewCLI() *cobra.Command {
  48. log.SetFlags(log.LstdFlags | log.Lshortfile)
  49. rootCmd := &cobra.Command{
  50. Use: "gollama",
  51. Short: "Run any large language model on any machine.",
  52. CompletionOptions: cobra.CompletionOptions{
  53. DisableDefaultCmd: true,
  54. },
  55. PersistentPreRun: func(cmd *cobra.Command, args []string) {
  56. // Disable usage printing on errors
  57. cmd.SilenceUsage = true
  58. },
  59. }
  60. rootCmd.PersistentFlags().StringP("key", "k", "", "Private key to use for authenticating")
  61. cobra.EnableCommandSorting = false
  62. modelsCmd := &cobra.Command{
  63. Use: "models",
  64. Args: cobra.MaximumNArgs(1),
  65. Short: "List models",
  66. Long: "List the models",
  67. RunE: func(cmd *cobra.Command, args []string) error {
  68. client, err := NewAPIClient(cmd)
  69. if err != nil {
  70. return err
  71. }
  72. fmt.Printf("client = %q\n", client)
  73. return nil
  74. },
  75. }
  76. /*
  77. runCmd := &cobra.Command{
  78. Use: "run",
  79. Short: "Run a model and submit prompts.",
  80. RunE: func(cmd *cobra.Command. args []string) error {
  81. },
  82. }
  83. */
  84. serveCmd := &cobra.Command{
  85. Use: "serve",
  86. Aliases: []string{"start"},
  87. Short: "Start ollama",
  88. RunE: func(cmd *cobra.Command, args []string) error {
  89. home, err := os.UserHomeDir()
  90. if err != nil {
  91. return err
  92. }
  93. socket := path.Join(home, ".ollama", "ollama.sock")
  94. if err := os.MkdirAll(path.Dir(socket), 0o700); err != nil {
  95. return err
  96. }
  97. if err := os.RemoveAll(socket); err != nil {
  98. return err
  99. }
  100. ln, err := net.Listen("unix", socket)
  101. if err != nil {
  102. return err
  103. }
  104. if err := os.Chmod(socket, 0o700); err != nil {
  105. return err
  106. }
  107. return server.Serve(ln)
  108. },
  109. }
  110. rootCmd.AddCommand(
  111. modelsCmd,
  112. serveCmd,
  113. )
  114. return rootCmd
  115. }