-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathrequest.go
More file actions
260 lines (217 loc) · 4.78 KB
/
Copy pathrequest.go
File metadata and controls
260 lines (217 loc) · 4.78 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
package litellm
import (
"encoding/json"
"fmt"
"unicode/utf8"
)
type Role string
const (
RoleSystem Role = "system"
RoleUser Role = "user"
RoleAssistant Role = "assistant"
RoleTool Role = "tool"
)
type Block interface {
isBlock()
}
type Annotation struct {
Type string
Text string
URL string
Extra json.RawMessage
}
type TextBlock struct {
Text string
Annotations []Annotation
Logprobs json.RawMessage
Cache *CacheControl
}
type ImageBlock struct {
URL string
Data []byte
MIME string
FileURI string
Detail string
Cache *CacheControl
}
type ReasoningBlock struct {
Text string
Summary bool
Signature string
Redacted []byte
Extra json.RawMessage
Cache *CacheControl
}
type ToolUseBlock struct {
ID string
Name string
Arguments json.RawMessage
Signature string
Extra json.RawMessage
Cache *CacheControl
}
type ToolResultBlock struct {
ToolUseID string
Content []Block
IsError bool
Cache *CacheControl
}
type ToolReferenceBlock struct {
ToolName string
Extra json.RawMessage
Cache *CacheControl
}
func (TextBlock) isBlock() {}
func (ImageBlock) isBlock() {}
func (ReasoningBlock) isBlock() {}
func (ToolUseBlock) isBlock() {}
func (ToolResultBlock) isBlock() {}
func (ToolReferenceBlock) isBlock() {}
type Message struct {
Role Role
Blocks []Block
}
type CacheControl struct {
Type string
TTL string
}
const (
CacheTypeEphemeral = "ephemeral"
CacheTTL5m = "5m"
CacheTTL1h = "1h"
)
type Schema json.RawMessage
func SchemaFrom(v any) (Schema, error) {
switch s := v.(type) {
case nil:
return nil, nil
case Schema:
return cloneBytes([]byte(s)), nil
case json.RawMessage:
if !json.Valid(s) {
return nil, fmt.Errorf("schema must be valid JSON")
}
return Schema(cloneBytes(s)), nil
case []byte:
if !json.Valid(s) {
return nil, fmt.Errorf("schema must be valid JSON")
}
return Schema(cloneBytes(s)), nil
case string:
b := []byte(s)
if !json.Valid(b) {
return nil, fmt.Errorf("schema must be valid JSON")
}
return Schema(cloneBytes(b)), nil
default:
b, err := json.Marshal(v)
if err != nil {
return nil, fmt.Errorf("marshal schema: %w", err)
}
if !json.Valid(b) {
return nil, fmt.Errorf("schema must be valid JSON")
}
return Schema(b), nil
}
}
type StrictMode int
const (
StrictDefault StrictMode = iota
StrictEnabled
StrictDisabled
)
type Tool struct {
Name string
Description string
Parameters Schema
Strict StrictMode
}
func NewTool(name, description string, parameters any) (Tool, error) {
schema, err := SchemaFrom(parameters)
if err != nil {
return Tool{}, err
}
return Tool{Name: name, Description: description, Parameters: schema}, nil
}
type ToolChoice any
type ResponseFormat struct {
Type ResponseFormatType
JSONSchema *JSONSchema
}
type ResponseFormatType string
const (
ResponseFormatText ResponseFormatType = "text"
ResponseFormatJSONObject ResponseFormatType = "json_object"
ResponseFormatJSONSchema ResponseFormatType = "json_schema"
)
type JSONSchema struct {
Name string
Description string
Schema Schema
Strict StrictMode
}
type Thinking struct {
Mode ThinkingMode
Effort string
BudgetTokens *int
IncludeOutput bool
}
func (t *Thinking) HasOptions() bool {
return t != nil && (t.Effort != "" || t.BudgetTokens != nil || t.IncludeOutput)
}
func (t *Thinking) Validate() error {
if t == nil {
return nil
}
if !utf8.ValidString(t.Effort) {
return NewError(ErrorTypeValidation, "thinking effort must be valid UTF-8")
}
if t.Mode == ThinkingUnspecified && t.HasOptions() {
return NewError(ErrorTypeValidation, "thinking mode must be enabled or disabled when thinking options are set")
}
if t.Mode == ThinkingDisabled && t.HasOptions() {
return NewError(ErrorTypeValidation, "thinking options cannot be set when thinking is disabled")
}
return nil
}
type ThinkingMode int
const (
ThinkingUnspecified ThinkingMode = iota
ThinkingDisabled
ThinkingEnabled
)
type CachePolicy struct {
Retention string
Placement CachePlacement
}
type CachePlacement string
const (
CachePlacementPrefix CachePlacement = "prefix"
)
type ProviderOptions map[string]any
type Request struct {
Model string
Messages []Message
MaxTokens *int
Temperature *float64
TopP *float64
Stop []string
Tools []Tool
ToolChoice ToolChoice
ResponseFormat *ResponseFormat
Thinking *Thinking
Cache *CachePolicy
ProviderOptions ProviderOptions
captureRawResponse bool
}
func (r *Request) CaptureRawResponse() bool {
return r != nil && r.captureRawResponse
}
func cloneBytes(b []byte) []byte {
if len(b) == 0 {
return nil
}
out := make([]byte, len(b))
copy(out, b)
return out
}