This library provides an unofficial Go client for DeepSeek,it also supports QwQ, OpenAI.enabling interaction with both online and local models. It supports the following features:
- Chat Completion
- Stream Chat Completion
- FIM (Fill-in-Middle) Completion
- Function Calling
- API balance query
- Embeddings
To install the library, run:
go get github.com/p9966/go-deepseek
Note: This library requires Go version 1.23 or higher.
Here’s an example of how to use the library for chat completion:
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
// client := deepseek.Client{
// BaseUrl: "https://api.deepseek.ai/v1", // deepseek
// BaseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1", // qwq
// BaseUrl: "https://api.openai.com/v1/",// openai
// AuthToken: os.Getenv("DEEPSEEK_API_KEY"),
// }
request := deepseek.ChatCompletionRequest{
Model: deepseek.DeepSeekChat,
Messages: []deepseek.ChatCompletionMessage{
{
Role: deepseek.ChatMessageRoleUser,
Content: "Hello!",
},
},
}
ctx := context.Background()
resp, err := client.CreateChatCompletion(ctx, &request)
if err != nil {
log.Fatalf("ChatCompletion failed: %v", err)
}
if len(resp.Choices) == 0 {
log.Fatal("No response choices available")
}
fmt.Println(resp.Choices[0].Message.Content)
}
Here’s an example of how to use the library for stream chat completion:
package main
import (
"bufio"
"context"
"errors"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
// client := deepseek.Client{
// BaseUrl: "https://api.deepseek.ai/v1", // Custom API addresses
// AuthToken: os.Getenv("DEEPSEEK_API_KEY"),
// }
scanner := bufio.NewScanner(os.Stdin)
var messages []deepseek.ChatCompletionMessage
for {
fmt.Print("You: ")
if !scanner.Scan() {
if err := scanner.Err(); err != nil {
log.Fatalf("Failed to read input: %v", err)
}
break
}
input := scanner.Text()
if input == "exit" {
break
}
messages = append(messages, deepseek.ChatCompletionMessage{
Role: deepseek.ChatMessageRoleUser,
Content: input,
})
request := deepseek.StreamChatCompletionRequest{
Model: deepseek.DeepSeekChat,
Messages: messages,
}
ctx := context.Background()
stream, err := client.CreateChatCompletionStream(ctx, request)
if err != nil {
log.Fatalf("ChatCompletionStream failed: %v", err)
}
defer stream.Close()
fmt.Print("DeepSeek: ")
for {
response, err := stream.Recv()
if errors.Is(err, io.EOF) {
fmt.Println()
break
}
if err != nil {
log.Fatalf("ChatCompletionStream stream.Recv() failed: %v", err)
}
if len(response.Choices) > 0 && response.Choices[0].FinishReason == "" {
content := response.Choices[0].Delta.Content
messages = append(messages, deepseek.ChatCompletionMessage{
Role: deepseek.ChatMessageRoleAssistant,
Content: content,
})
fmt.Print(content)
}
}
}
}
To use a local model with Ollama:
package main
import (
"context"
"fmt"
"log"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.Client{
BaseUrl: "http://localhost:11434",
}
request := deepseek.OllamaChatRequest{
Model: "deepseek-r1:7b",
Messages: []deepseek.OllamaChatMessage{
{
Role: "user",
Content: "Hello!",
},
},
}
response, err := client.CreateOllamaChatCompletion(context.TODO(), &request)
if err != nil {
log.Fatalf("Error: %v", err)
}
fmt.Println(response.Message.Content)
}
- Visit the DeepSeek website DeepSeek website.
- Sign up or log in to your account.
- Navigate to the API key management page.
- Click "Create new secret key".
- Enter a name for your key and confirm.
- Your API key will be displayed. Use it to interact with the DeepSeek API.
Important: Keep your API key secure and do not share it publicly.
- Visit the Ollama website.
- Download and install Ollama.
- Open a terminal and run the following command to download the model:
ollama run deepseek-r1
- You can now use the model locally.
Note: You can also download other models from theOllama model library and use them in the same way.
FIM (Fill-in-Middle) Completion
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
request := deepseek.FINCompletionRequest{
Model: deepseek.DeepSeekChat,
Prompt: "What is the weather like today?",
}
ctx := context.Background()
resp, err := client.CreateFINCompletion(ctx, &request)
if err != nil {
log.Fatalf("Error creating completion: %v", err)
}
if len(resp.Choices) == 0 {
log.Fatal("No response choices available")
}
fmt.Println(resp.Choices[0].Text)
}
Function Calling
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
request := deepseek.ChatCompletionRequest{
Model: deepseek.DeepSeekChat,
Messages: []deepseek.ChatCompletionMessage{
{
Role: deepseek.ChatMessageRoleUser,
Content: "How's the weather in Hangzhou?",
},
},
Tools: []deepseek.Tools{
{
Type: "function",
Function: deepseek.Function{
Name: "get_weather",
Description: "Get weather of an location, the user shoud supply a location first",
Parameters: &deepseek.Parameters{
Type: "object",
Properties: map[string]interface{}{
"location": map[string]interface{}{
"description": "The location to get weather",
"type": "string",
},
},
Required: []string{"location"},
},
},
},
},
}
ctx := context.Background()
resp, err := client.CreateChatCompletion(ctx, &request)
if err != nil {
log.Fatalf("ChatCompletion failed: %v", err)
}
if len(resp.Choices) == 0 {
log.Fatal("No response choices available")
}
if len(resp.Choices[0].Message.ToolCalls) == 0 {
log.Fatal("No function calls available")
}
fmt.Printf("Function name: %v, args:%s\n", resp.Choices[0].Message.ToolCalls[0].Function.Name, resp.Choices[0].Message.ToolCalls[0].Function.Arguments)
}
// ---------------------qwq---------------------
package main
import (
"context"
"encoding/json"
"errors"
"fmt"
"io"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.Client{
BaseUrl: "https://dashscope.aliyuncs.com/compatible-mode/v1",
AuthToken: os.Getenv("QWQ_AUTH_TOKEN"), // 获取地址:https://bailian.console.aliyun.com/?apiKey=1#/api-key
}
request := deepseek.StreamChatCompletionRequest{
Model: deepseek.QwQ_32b,
Messages: []deepseek.ChatCompletionMessage{
{
Role: deepseek.ChatMessageRoleUser,
Content: "成都天气怎么样",
},
},
Tools: []deepseek.Tools{
{
Type: "function",
Function: deepseek.Function{
Name: "get_weather",
Description: "当你想查询指定城市的天气时非常有用",
Parameters: &deepseek.Parameters{
Type: "object",
Properties: map[string]interface{}{
"location": map[string]interface{}{
"description": "城市或县区,比如北京市、杭州市、成都市、余杭区等",
"type": "string",
},
},
Required: []string{"location"},
},
},
},
},
}
ctx := context.Background()
stream, err := client.CreateChatCompletionStream(ctx, request)
if err != nil {
log.Fatalf("ChatCompletionStream failed: %v", err)
}
defer stream.Close()
fmt.Print("QWQ: ")
for {
response, err := stream.Recv()
if errors.Is(err, io.EOF) {
fmt.Println()
break
}
if err != nil {
log.Fatalf("ChatCompletionStream stream.Recv() failed: %v", err)
}
if len(response.Choices) > 0 && response.Choices[0].FinishReason == "" {
content := response.Choices[0].Delta.ReasoningContent
fmt.Print(content)
if len(response.Choices[0].Delta.ToolCalls) > 0 {
if buf, err := json.Marshal(response.Choices[0].Delta.ToolCalls); err == nil {
fmt.Println(string(buf))
}
}
}
}
}
Embeddings
package main
import (
"context"
"fmt"
"log"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.Client{
BaseUrl: "http://localhost:11434",
}
request := deepseek.OllamaEmbedRequest{
Model: "deepseek-r1:7b",
Input: "Why is the sky blue?", // []string{"Why is the sky blue?", "Why is the grass green?"}
}
response, err := client.CreateOllamaEmbed(context.TODO(), &request)
if err != nil {
log.Fatalf("failed to create ollama embed: %v", err)
}
fmt.Println(response.Embeddings)
}
API balance query
package main
import (
"context"
"fmt"
"log"
"os"
"github.com/p9966/go-deepseek"
)
func main() {
client := deepseek.NewClient(os.Getenv("DEEPSEEK_API_KEY"))
if resp, err := client.GetBalance(context.TODO()); err != nil {
log.Fatal(err)
} else {
fmt.Println(resp.IsAvailable)
}
}
If you encounter a 503 error when trying to access DeepSeek’s API platform:
- Check if DeepSeek’s services are down or under maintenance.
- Clear your browser cache and cookies.
- Try accessing the platform from a different network or device.
- Contact DeepSeek’s support team for further assistance. [email protected]
This project is licensed under the MIT License.