Skip to content

Commit 9f20115

Browse files
committed
Merge branch 'main' into 3318-RavenDB-state-store-new
2 parents 60a96f2 + 9f0aec6 commit 9f20115

File tree

22 files changed

+1280
-538
lines changed

22 files changed

+1280
-538
lines changed

.build-tools/go.mod

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,19 @@ require (
1212
)
1313

1414
require (
15-
github.com/dapr/kit v0.15.3-0.20250616160611-598b032bce69 // indirect
15+
github.com/dapr/kit v0.15.3-0.20250710140356-9d4f384c5763 // indirect
16+
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
1617
github.com/gogo/protobuf v1.3.2 // indirect
1718
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect
1819
github.com/inconshreveable/mousetrap v1.0.1 // indirect
1920
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect
2021
github.com/spf13/cast v1.8.0 // indirect
2122
github.com/spf13/pflag v1.0.6 // indirect
23+
github.com/x448/float16 v0.8.4 // indirect
2224
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
2325
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
2426
gopkg.in/inf.v0 v0.9.1 // indirect
25-
k8s.io/apimachinery v0.27.4 // indirect
27+
k8s.io/apimachinery v0.33.0 // indirect
2628
)
2729

2830
replace github.com/dapr/components-contrib => ../

.build-tools/go.sum

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
2-
github.com/dapr/kit v0.15.3-0.20250616160611-598b032bce69 h1:I1Uoy3fn906AZZdG8+n8fHitgY7Wn9c+smz4WQdOy1Q=
3-
github.com/dapr/kit v0.15.3-0.20250616160611-598b032bce69/go.mod h1:6w2Pr38zOAtBn+ld/jknwI4kgMfwanCIcFVnPykdPZQ=
2+
github.com/dapr/kit v0.15.3-0.20250710140356-9d4f384c5763 h1:9H0+baON+6+x4A/nQ2Lj+1JNk8MSlNv6sik6zfxdvsE=
3+
github.com/dapr/kit v0.15.3-0.20250710140356-9d4f384c5763/go.mod h1:40ZWs5P6xfYf7O59XgwqZkIyDldTIXlhTQhGop8QoSM=
44
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
55
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
66
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
77
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
88
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
9+
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
10+
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
911
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
1012
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
1113
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
1214
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
1315
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
14-
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
15-
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
1616
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=
1717
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
1818
github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc=
@@ -30,8 +30,8 @@ github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1
3030
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
3131
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
3232
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
33-
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
34-
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
33+
github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
34+
github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
3535
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
3636
github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk=
3737
github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
@@ -45,6 +45,8 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
4545
github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
4646
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
4747
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
48+
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
49+
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
4850
github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
4951
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
5052
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
@@ -57,8 +59,6 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
5759
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
5860
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
5961
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
60-
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a h1:Q8/wZp0KX97QFTc2ywcOE0YRjZPVIx+MXInMzdvQqcA=
61-
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a/go.mod h1:idGWGoKP1toJGkd5/ig9ZLuPcZBC3ewk7SzmH0uou08=
6262
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
6363
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
6464
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -87,7 +87,9 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
8787
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
8888
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
8989
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
90-
k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs=
91-
k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E=
90+
k8s.io/apimachinery v0.33.0 h1:1a6kHrJxb2hs4t8EE5wuR/WxKDwGN1FKH3JvDtA0CIQ=
91+
k8s.io/apimachinery v0.33.0/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
92+
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
93+
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
9294
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
9395
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=

conversation/converse.go

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"context"
1919
"io"
2020

21+
"github.com/tmc/langchaingo/llms"
2122
"google.golang.org/protobuf/types/known/anypb"
2223

2324
"github.com/dapr/components-contrib/metadata"
@@ -28,18 +29,16 @@ type Conversation interface {
2829

2930
Init(ctx context.Context, meta Metadata) error
3031

31-
Converse(ctx context.Context, req *ConversationRequest) (*ConversationResponse, error)
32+
Converse(ctx context.Context, req *Request) (*Response, error)
3233

3334
io.Closer
3435
}
3536

36-
type ConversationInput struct {
37-
Message string `json:"string"`
38-
Role Role `json:"role"`
39-
}
40-
41-
type ConversationRequest struct {
42-
Inputs []ConversationInput `json:"inputs"`
37+
type Request struct {
38+
// Message can be user input prompt/instructions and/or tool call responses.
39+
Message *[]llms.MessageContent
40+
Tools *[]llms.Tool
41+
ToolChoice *string
4342
Parameters map[string]*anypb.Any `json:"parameters"`
4443
ConversationContext string `json:"conversationContext"`
4544
Temperature float64 `json:"temperature"`
@@ -51,22 +50,27 @@ type ConversationRequest struct {
5150
Policy string `json:"loadBalancingPolicy"`
5251
}
5352

54-
type ConversationResult struct {
55-
Result string `json:"result"`
56-
Parameters map[string]*anypb.Any `json:"parameters"`
53+
type Response struct {
54+
ConversationContext string `json:"conversationContext"`
55+
Outputs []Result `json:"outputs"`
56+
}
57+
58+
type Result struct {
59+
StopReason string `json:"stopReason"`
60+
Choices []Choice `json:"choices,omitempty"`
5761
}
5862

59-
type ConversationResponse struct {
60-
ConversationContext string `json:"conversationContext"`
61-
Outputs []ConversationResult `json:"outputs"`
63+
type Choice struct {
64+
FinishReason string `json:"finishReason"`
65+
Index int64 `json:"index"`
66+
Message Message `json:"message"`
6267
}
6368

64-
type Role string
69+
// Message represents the content of a choice
70+
// where it can be a text message or a tool call.
71+
type Message struct {
72+
Content string `json:"content,omitempty"`
73+
ToolCallRequest *[]llms.ToolCall `json:"toolCallRequest,omitempty"`
6574

66-
const (
67-
RoleSystem = "system"
68-
RoleUser = "user"
69-
RoleAssistant = "assistant"
70-
RoleFunction = "function"
71-
RoleTool = "tool"
72-
)
75+
// Note: we do not have refusal passed back bc langchain does not support it.
76+
}

conversation/deepseek/deepseek.go

Lines changed: 25 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,20 +20,26 @@ import (
2020
"reflect"
2121

2222
"github.com/dapr/components-contrib/conversation"
23+
"github.com/dapr/components-contrib/conversation/langchaingokit"
2324
"github.com/dapr/components-contrib/metadata"
2425
"github.com/dapr/kit/logger"
2526
kmeta "github.com/dapr/kit/metadata"
2627

27-
deepseek_go "github.com/cohesion-org/deepseek-go"
28+
"github.com/tmc/langchaingo/llms/openai"
2829
)
2930

3031
type Deepseek struct {
31-
llm *deepseek_go.Client
32-
md DeepseekMetadata
32+
langchaingokit.LLM
33+
md DeepseekMetadata
3334

3435
logger logger.Logger
3536
}
3637

38+
const (
39+
defaultModel = "deepseek-chat"
40+
defaultEndpoint = "https://api.deepseek.com"
41+
)
42+
3743
func NewDeepseek(logger logger.Logger) conversation.Conversation {
3844
o := &Deepseek{
3945
logger: logger,
@@ -48,8 +54,23 @@ func (d *Deepseek) Init(ctx context.Context, meta conversation.Metadata) error {
4854
if err != nil {
4955
return err
5056
}
57+
model := defaultModel
58+
if md.Model != "" {
59+
model = md.Model
60+
}
61+
62+
options := []openai.Option{
63+
openai.WithModel(model),
64+
openai.WithToken(md.Key),
65+
openai.WithBaseURL(md.Endpoint),
66+
}
67+
68+
llm, err := openai.New(options...)
69+
if err != nil {
70+
return err
71+
}
5172

52-
d.llm = deepseek_go.NewClient(md.Key)
73+
d.LLM.Model = llm
5374
d.md = md
5475
return nil
5576
}
@@ -60,50 +81,6 @@ func (d *Deepseek) GetComponentMetadata() (metadataInfo metadata.MetadataMap) {
6081
return
6182
}
6283

63-
func (d *Deepseek) Converse(ctx context.Context, r *conversation.ConversationRequest) (res *conversation.ConversationResponse, err error) {
64-
messages := make([]deepseek_go.ChatCompletionMessage, 0, len(r.Inputs))
65-
66-
for _, input := range r.Inputs {
67-
messages = append(messages, deepseek_go.ChatCompletionMessage{
68-
Role: string(input.Role),
69-
Content: input.Message,
70-
})
71-
}
72-
73-
request := &deepseek_go.ChatCompletionRequest{
74-
Model: deepseek_go.DeepSeekChat,
75-
Messages: messages,
76-
}
77-
78-
if d.md.MaxTokens > 0 {
79-
request.MaxTokens = d.md.MaxTokens
80-
}
81-
82-
if r.Temperature > 0 {
83-
request.Temperature = float32(r.Temperature)
84-
}
85-
86-
resp, err := d.llm.CreateChatCompletion(ctx, request)
87-
if err != nil {
88-
return nil, err
89-
}
90-
91-
outputs := make([]conversation.ConversationResult, 0, len(resp.Choices))
92-
93-
for i := range resp.Choices {
94-
outputs = append(outputs, conversation.ConversationResult{
95-
Result: resp.Choices[i].Message.Content,
96-
Parameters: r.Parameters,
97-
})
98-
}
99-
100-
res = &conversation.ConversationResponse{
101-
Outputs: outputs,
102-
}
103-
104-
return res, nil
105-
}
106-
10784
func (d *Deepseek) Close() error {
10885
return nil
10986
}

conversation/deepseek/metadata.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ package deepseek
2020
type DeepseekMetadata struct {
2121
Key string `json:"key"`
2222
MaxTokens int `json:"maxTokens"`
23+
Model string `json:"model"`
24+
Endpoint string `json:"endpoint"`
2325
}

conversation/deepseek/metadata.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,20 @@ authenticationProfiles:
2121
example: "**********"
2222
default: ""
2323
metadata:
24+
- name: model
25+
required: false
26+
description: |
27+
The Deepseek LLM to use.
28+
type: string
29+
example: 'deepseek-reasoner'
30+
default: 'deepseek-chat'
31+
- name: endpoint
32+
required: false
33+
description: |
34+
Custom API endpoint URL for Deepseek. If not specified, the default endpoint will be used.
35+
type: string
36+
example: 'https://api.deepseek.com'
37+
default: 'https://api.deepseek.com'
2438
- name: maxTokens
2539
required: false
2640
description: |

0 commit comments

Comments
 (0)