cmd.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package cmd
  2. import (
  3. "context"
  4. "log"
  5. "net"
  6. "net/http"
  7. "os"
  8. "path"
  9. "time"
  10. "github.com/jmorganca/ollama/api"
  11. "github.com/jmorganca/ollama/server"
  12. "github.com/spf13/cobra"
  13. )
  14. func sockpath() string {
  15. home, err := os.UserHomeDir()
  16. if err != nil {
  17. panic(err)
  18. }
  19. return path.Join(home, ".ollama", "ollama.sock")
  20. }
  21. func running() bool {
  22. // Set a timeout duration
  23. timeout := time.Second
  24. // Dial the unix socket
  25. conn, err := net.DialTimeout("unix", sockpath(), timeout)
  26. if err != nil {
  27. return false
  28. }
  29. if conn != nil {
  30. defer conn.Close()
  31. }
  32. return true
  33. }
  34. func serve() error {
  35. sp := sockpath()
  36. if err := os.MkdirAll(path.Dir(sp), 0o700); err != nil {
  37. return err
  38. }
  39. if err := os.RemoveAll(sp); err != nil {
  40. return err
  41. }
  42. ln, err := net.Listen("unix", sp)
  43. if err != nil {
  44. return err
  45. }
  46. if err := os.Chmod(sp, 0o700); err != nil {
  47. return err
  48. }
  49. return server.Serve(ln)
  50. }
  51. func NewAPIClient() (*api.Client, error) {
  52. var err error
  53. home, err := os.UserHomeDir()
  54. if err != nil {
  55. return nil, err
  56. }
  57. socket := path.Join(home, ".ollama", "ollama.sock")
  58. dialer := &net.Dialer{
  59. Timeout: 10 * time.Second,
  60. }
  61. return &api.Client{
  62. URL: "http://localhost",
  63. HTTP: http.Client{
  64. Transport: &http.Transport{
  65. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  66. return dialer.DialContext(ctx, "unix", socket)
  67. },
  68. },
  69. },
  70. }, nil
  71. }
  72. func NewCLI() *cobra.Command {
  73. log.SetFlags(log.LstdFlags | log.Lshortfile)
  74. rootCmd := &cobra.Command{
  75. Use: "ollama",
  76. Short: "Large language model runner",
  77. CompletionOptions: cobra.CompletionOptions{
  78. DisableDefaultCmd: true,
  79. },
  80. PersistentPreRun: func(cmd *cobra.Command, args []string) {
  81. // Disable usage printing on errors
  82. cmd.SilenceUsage = true
  83. },
  84. }
  85. cobra.EnableCommandSorting = false
  86. runCmd := &cobra.Command{
  87. Use: "run MODEL",
  88. Short: "Run a model",
  89. Args: cobra.ExactArgs(1),
  90. RunE: func(cmd *cobra.Command,args []string) error {
  91. return nil
  92. },
  93. }
  94. serveCmd := &cobra.Command{
  95. Use: "serve",
  96. Aliases: []string{"start"},
  97. Short: "Start ollama",
  98. RunE: func(cmd *cobra.Command, args []string) error {
  99. return serve()
  100. },
  101. }
  102. rootCmd.AddCommand(
  103. serveCmd,
  104. runCmd,
  105. )
  106. return rootCmd
  107. }