11import BingSearchService
22import Foundation
33import LangChain
4+ import OpenAIService
45
56enum SearchEvent {
67 case startAction( String )
@@ -42,7 +43,10 @@ func search(_ query: String) async throws
4243 ) ,
4344 ]
4445
45- let chatModel = OpenAIChat ( temperature: 0 , stream: true )
46+ let chatModel = OpenAIChat (
47+ configuration: UserPreferenceChatGPTConfiguration ( ) . overriding { $0. temperature = 0 } ,
48+ stream: true
49+ )
4650
4751 let agentExecutor = AgentExecutor (
4852 agent: ChatAgent (
@@ -55,63 +59,37 @@ func search(_ query: String) async throws
5559 earlyStopHandleType: . generate
5660 )
5761
58- class ResultCallbackManager : ChainCallbackManager {
62+ return ( AsyncThrowingStream < SearchEvent , Error > { continuation in
5963 var accumulation : String = " "
6064 var isGeneratingFinalAnswer = false
61- var onFinalAnswerToken : ( String ) -> Void
62- var onAgentActionStart : ( String ) -> Void
63- var onAgentActionEnd : ( String ) -> Void
64-
65- init (
66- onFinalAnswerToken: @escaping ( String ) -> Void ,
67- onAgentActionStart: @escaping ( String ) -> Void ,
68- onAgentActionEnd: @escaping ( String ) -> Void
69- ) {
70- self . onFinalAnswerToken = onFinalAnswerToken
71- self . onAgentActionStart = onAgentActionStart
72- self . onAgentActionEnd = onAgentActionEnd
73- }
74-
75- func onChainStart< T> ( type: T . Type , input: T . Input ) where T: LangChain . Chain { }
7665
77- func onAgentFinish( output: LangChain . AgentFinish ) { }
78-
79- func onAgentActionStart( action: LangChain . AgentAction ) {
80- onAgentActionStart ( " \( action. toolName) : \( action. toolInput) " )
81- }
82-
83- func onAgentActionEnd( action: LangChain . AgentAction ) {
84- onAgentActionEnd ( " \( action. toolName) : \( action. toolInput) " )
85- }
86-
87- func onLLMNewToken( token: String ) {
88- if isGeneratingFinalAnswer {
89- onFinalAnswerToken ( token)
90- return
66+ let callbackManager = CallbackManager { manager in
67+ manager. on ( CallbackEvents . AgentActionDidStart. self) {
68+ continuation. yield ( . startAction( " \( $0. toolName) : \( $0. toolInput) " ) )
9169 }
92- accumulation. append ( token)
93- if accumulation. hasSuffix ( " Final Answer: " ) {
94- isGeneratingFinalAnswer = true
95- accumulation = " "
70+
71+ manager. on ( CallbackEvents . AgentActionDidEnd. self) {
72+ continuation. yield ( . endAction( " \( $0. toolName) : \( $0. toolInput) " ) )
9673 }
97- }
98- }
9974
100- return ( AsyncThrowingStream < SearchEvent , Error > { continuation in
101- let callback = ResultCallbackManager (
102- onFinalAnswerToken : {
103- continuation . yield ( . answerToken ( $0 ) )
104- } ,
105- onAgentActionStart : {
106- continuation . yield ( . startAction ( $0 ) )
107- } ,
108- onAgentActionEnd : {
109- continuation . yield ( . endAction ( $0 ) )
75+ manager . on ( CallbackEvents . LLMDidProduceNewToken . self ) {
76+ if isGeneratingFinalAnswer {
77+ continuation . yield ( . answerToken ( $0 ) )
78+ return
79+ }
80+ accumulation . append ( $0 )
81+ if accumulation . hasSuffix ( " Final Answer: " ) {
82+ isGeneratingFinalAnswer = true
83+ accumulation = " "
84+ }
11085 }
111- )
86+ }
11287 Task {
11388 do {
114- let finalAnswer = try await agentExecutor. run ( query, callbackManagers: [ callback] )
89+ let finalAnswer = try await agentExecutor. run (
90+ query,
91+ callbackManagers: [ callbackManager]
92+ )
11593 continuation. yield ( . finishAnswer( finalAnswer, linkStorage. links) )
11694 continuation. finish ( )
11795 } catch {
0 commit comments