@@ -8,25 +8,75 @@ struct APIMessage: Codable {
88 let content : String
99}
1010
11- /// Request format for model calls, matching the backend API contract
12- struct ModelCallRequest : Codable {
11+ /// Base protocol for model call requests
12+ protocol ModelCallRequestBase : Codable {
13+ var provider : ModelProvider { get }
14+ var model : String { get }
15+ var temperature : Float ? { get }
16+ var maxTokens : Int ? { get }
17+ }
18+
19+ /// Request format for completion (non-streaming) model calls
20+ struct CompletionRequest : ModelCallRequestBase {
21+ let provider : ModelProvider
22+ let model : String
23+ let systemPrompt : String ?
24+ let userPrompt : String
25+ let temperature : Float ?
26+ let maxTokens : Int ?
27+
28+ init ( using metadata: ModelMetadata , systemPrompt: String ? = nil , userPrompt: String ) {
29+ self . provider = metadata. provider
30+ self . model = metadata. model
31+ self . systemPrompt = systemPrompt
32+ self . userPrompt = userPrompt
33+ self . temperature = metadata. temperature
34+ self . maxTokens = metadata. maxTokens
35+ }
36+ }
37+
38+ /// Request format for streaming model calls
39+ struct StreamRequest : ModelCallRequestBase {
1340 let provider : ModelProvider
14- let model : Model
15- let messages : [ APIMessage ]
41+ let model : String
42+ let messages : [ Message ]
43+ let temperature : Float ?
44+ let maxTokens : Int ?
1645
1746 init ( using metadata: ModelMetadata , messages: [ Message ] ) {
1847 self . provider = metadata. provider
1948 self . model = metadata. model
49+ self . messages = messages
50+ self . temperature = metadata. temperature
51+ self . maxTokens = metadata. maxTokens
2052
21- Logger . modelCalls. debug ( " Converting \( messages. count) messages to API format " )
22- let apiMessages = messages. map { message in
23- APIMessage ( role: message. role. rawValue, content: message. content)
24- }
25- self . messages = apiMessages
53+ Logger . modelCalls. debug ( " Preparing stream request with \( messages. count) messages " )
2654 }
2755}
2856
29- struct ModelCallResponse : Codable , Sendable {
30- let role : String
57+ /// Response format for completion calls
58+ struct CompletionResponse : Codable , Sendable {
59+ let content : String
60+ }
61+
62+ /// Response format for streaming calls - each chunk
63+ struct StreamChunk : Codable , Sendable {
3164 let content : String
3265}
66+
67+ // Helper for encoding/decoding Message content arrays for the API
68+ extension Message {
69+ var apiContent : String {
70+ content. map { content in
71+ switch content. content {
72+ case . text( let text) :
73+ return text
74+ case . image( let image) :
75+ return """
76+ [Image: \( image. mimeType. rawValue) ,
77+ Base64: \( image. base64Data. prefix ( 20 ) ) ...]
78+ """
79+ }
80+ } . joined ( separator: " \n " )
81+ }
82+ }
0 commit comments