@@ -24,8 +24,8 @@ struct DefaultPolyAIService: PolyAIService {
24
24
switch configuration {
25
25
case . openAI( let apiKey, let organizationID, let configuration, let decoder) :
26
26
openAIService = OpenAIServiceFactory . service ( apiKey: apiKey, organizationID: organizationID, configuration: configuration, decoder: decoder)
27
- case . anthropic( let apiKey, let apiVersion , let configuration) :
28
- anthropicService = AnthropicServiceFactory . service ( apiKey: apiKey, apiVersion : apiVersion , configuration: configuration)
27
+ case . anthropic( let apiKey, let configuration) :
28
+ anthropicService = AnthropicServiceFactory . service ( apiKey: apiKey, configuration: configuration)
29
29
}
30
30
}
31
31
}
@@ -37,20 +37,62 @@ struct DefaultPolyAIService: PolyAIService {
37
37
async throws -> LLMMessageResponse
38
38
{
39
39
switch parameter {
40
- case . openAI( let model, let messages, let maxTokens, _ ) :
40
+ case . openAI( let model, let messages, let maxTokens) :
41
41
guard let openAIService else {
42
- throw PolyAIError . missingLLMConfiguration ( " You Must provide a valid configuration for the \( parameter. llm ) API " )
42
+ throw PolyAIError . missingLLMConfiguration ( " You Must provide a valid configuration for the \( parameter. llmService ) API " )
43
43
}
44
44
let messageParams : [ SwiftOpenAI . ChatCompletionParameters . Message ] = messages. map { . init( role: . init( rawValue: $0. role) ?? . user, content: . text( $0. content) ) }
45
- let messageParameter = ChatCompletionParameters ( messages: messageParams, model: . custom ( model) , maxTokens: maxTokens)
45
+ let messageParameter = ChatCompletionParameters ( messages: messageParams, model: model, maxTokens: maxTokens)
46
46
return try await openAIService. startChat ( parameters: messageParameter)
47
- case . anthropic( let model, let messages, let maxTokens, _ ) :
47
+ case . anthropic( let model, let messages, let maxTokens) :
48
48
guard let anthropicService else {
49
- throw PolyAIError . missingLLMConfiguration ( " You Must provide a valid configuration for the \( parameter. llm ) API " )
49
+ throw PolyAIError . missingLLMConfiguration ( " You Must provide a valid configuration for the \( parameter. llmService ) API " )
50
50
}
51
51
let messageParams : [ SwiftAnthropic . MessageParameter . Message ] = messages. map { MessageParameter . Message ( role: SwiftAnthropic . MessageParameter. Message. Role ( rawValue: $0. role) ?? . user, content: . text( $0. content) ) }
52
- let messageParameter = MessageParameter ( model: . other ( model) , messages: messageParams, maxTokens: maxTokens, stream: false )
52
+ let messageParameter = MessageParameter ( model: model, messages: messageParams, maxTokens: maxTokens, stream: false )
53
53
return try await anthropicService. createMessage ( messageParameter, beta: nil )
54
54
}
55
55
}
56
+
57
+ func streamMessage(
58
+ _ parameter: LLMParameter )
59
+ async throws -> AsyncThrowingStream < LLMMessageStreamResponse , Error >
60
+ {
61
+ switch parameter {
62
+ case . openAI( let model, let messages, let maxTokens) :
63
+ guard let openAIService else {
64
+ throw PolyAIError . missingLLMConfiguration ( " You Must provide a valid configuration for the \( parameter. llmService) API " )
65
+ }
66
+ let messageParams : [ SwiftOpenAI . ChatCompletionParameters . Message ] = messages. map { . init( role: . init( rawValue: $0. role) ?? . user, content: . text( $0. content) ) }
67
+ let messageParameter = ChatCompletionParameters ( messages: messageParams, model: model, maxTokens: maxTokens)
68
+ let stream = try await openAIService. startStreamedChat ( parameters: messageParameter)
69
+ return try mapToLLMMessageStreamResponse ( stream: stream)
70
+ case . anthropic( let model, let messages, let maxTokens) :
71
+ guard let anthropicService else {
72
+ throw PolyAIError . missingLLMConfiguration ( " You Must provide a valid configuration for the \( parameter. llmService) API " )
73
+ }
74
+ let messageParams : [ SwiftAnthropic . MessageParameter . Message ] = messages. map { MessageParameter . Message ( role: SwiftAnthropic . MessageParameter. Message. Role ( rawValue: $0. role) ?? . user, content: . text( $0. content) ) }
75
+ let messageParameter = MessageParameter ( model: model, messages: messageParams, maxTokens: maxTokens, stream: false )
76
+ let stream = try await anthropicService. streamMessage ( messageParameter, beta: nil )
77
+ return try mapToLLMMessageStreamResponse ( stream: stream)
78
+ }
79
+ }
80
+
81
+ private func mapToLLMMessageStreamResponse< T: LLMMessageStreamResponse > ( stream: AsyncThrowingStream < T , Error > )
82
+ throws -> AsyncThrowingStream < LLMMessageStreamResponse , Error >
83
+ {
84
+ let mappedStream = AsyncThrowingStream < LLMMessageStreamResponse , Error > { continuation in
85
+ Task {
86
+ do {
87
+ for try await chunk in stream {
88
+ continuation. yield ( chunk)
89
+ }
90
+ continuation. finish ( )
91
+ } catch {
92
+ continuation. finish ( throwing: error)
93
+ }
94
+ }
95
+ }
96
+ return mappedStream
97
+ }
56
98
}
0 commit comments