1- import { getUserConfig } from '../../config/index.mjs'
1+ import { getUserConfig , Models } from '../../config/index.mjs'
22import { pushRecord , setAbortController } from './shared.mjs'
33import { fetchSSE } from '../../utils/fetch-sse.mjs'
44import { isEmpty } from 'lodash-es'
5+ import { getConversationPairs } from '../../utils/get-conversation-pairs.mjs'
56
67/**
78 * @param {Runtime.Port } port
@@ -11,28 +12,28 @@ import { isEmpty } from 'lodash-es'
1112export async function generateAnswersWithClaudeApi ( port , question , session ) {
1213 const { controller, messageListener, disconnectListener } = setAbortController ( port )
1314 const config = await getUserConfig ( )
15+ const modelName = session . modelName
1416
15- let prompt = ''
16- for ( const record of session . conversationRecords . slice ( - config . maxConversationContextLength ) ) {
17- prompt += '\n\nHuman: ' + record . question + '\n\nAssistant: ' + record . answer
18- }
19- prompt += `\n\nHuman: ${ question } \n\nAssistant:`
17+ const prompt = getConversationPairs (
18+ session . conversationRecords . slice ( - config . maxConversationContextLength ) ,
19+ false ,
20+ )
21+ prompt . push ( { role : 'user' , content : question } )
2022
2123 let answer = ''
22- await fetchSSE ( `https://api.anthropic.com/v1/complete ` , {
24+ await fetchSSE ( `https://api.anthropic.com/v1/messages ` , {
2325 method : 'POST' ,
2426 signal : controller . signal ,
2527 headers : {
2628 'Content-Type' : 'application/json' ,
27- accept : 'application/json' ,
2829 'anthropic-version' : '2023-06-01' ,
2930 'x-api-key' : config . claudeApiKey ,
3031 } ,
3132 body : JSON . stringify ( {
32- model : 'claude-2' ,
33- prompt : prompt ,
33+ model : Models [ modelName ] . value ,
34+ messages : prompt ,
3435 stream : true ,
35- max_tokens_to_sample : config . maxResponseTokenLength ,
36+ max_tokens : config . maxResponseTokenLength ,
3637 temperature : config . temperature ,
3738 } ) ,
3839 onMessage ( message ) {
@@ -45,22 +46,17 @@ export async function generateAnswersWithClaudeApi(port, question, session) {
4546 console . debug ( 'json error' , error )
4647 return
4748 }
48-
49- // The Claude v2 API may send metadata fields, handle them here
50- if ( data . conversationId ) session . conversationId = data . conversationId
51- if ( data . parentMessageId ) session . parentMessageId = data . parentMessageId
52-
53- // In Claude's case, the "completion" key holds the text
54- if ( data . completion ) {
55- answer += data . completion
56- port . postMessage ( { answer : answer , done : false , session : null } )
57- }
58-
59- // Check if the message indicates that Claude is done
60- if ( data . stop_reason === 'stop_sequence' ) {
49+ if ( data ?. type === 'message_stop' ) {
6150 pushRecord ( session , question , answer )
6251 console . debug ( 'conversation history' , { content : session . conversationRecords } )
6352 port . postMessage ( { answer : null , done : true , session : session } )
53+ return
54+ }
55+
56+ const delta = data ?. delta ?. text
57+ if ( delta ) {
58+ answer += delta
59+ port . postMessage ( { answer : answer , done : false , session : null } )
6460 }
6561 } ,
6662 async onStart ( ) { } ,
0 commit comments