cmd.go 2.6 KB

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