1
1
import { Tweet } from "agent-twitter-client" ;
2
- import { getEmbeddingZeroVector } from "@elizaos/core" ;
2
+ import { getEmbeddingZeroVector , composeContext , elizaLogger } from "@elizaos/core" ;
3
3
import type { Content , Memory , UUID , IAgentRuntime } from "@elizaos/core" ;
4
4
5
5
import { stringToUuid } from "@elizaos/core" ;
6
6
import { ClientBase } from "./base" ;
7
- import { elizaLogger } from "@elizaos/core" ;
8
7
import { DEFAULT_MAX_TWEET_LENGTH } from "./environment" ;
9
8
import { Media } from "@elizaos/core" ;
10
9
import fs from "fs" ;
@@ -440,46 +439,50 @@ export async function analyzeConversation(
440
439
runtime : IAgentRuntime
441
440
) : Promise < void > {
442
441
const conversation = await runtime . databaseAdapter . getConversation ( conversationId ) ;
443
- console . log ( "analyzeConversation" , conversation )
444
- // Get all messages in order
445
- const messages = await Promise . all (
446
- JSON . parse ( conversation . messageIds ) . map ( id =>
447
- runtime . messageManager . getMemoryById ( id )
448
- )
449
- ) ;
450
-
451
- // Group messages by user
452
- const userMessages = new Map < string , string [ ] > ( ) ;
453
- for ( const message of messages ) {
454
- if ( message . userId === runtime . agentId ) continue ; // Skip agent's messages
455
-
456
- const username = message . content . username || message . userId ;
457
- if ( ! userMessages . has ( username ) ) {
458
- userMessages . set ( username , [ ] ) ;
459
- }
460
- userMessages . get ( username ) ?. push ( message . content . text ) ;
442
+ if ( ! conversation ) {
443
+ elizaLogger . error ( "No conversation found for analysis" , conversationId ) ;
444
+ return ;
461
445
}
462
446
463
- // Format conversation for per-user analysis
464
- const prompt = `Analyze each user's messages in this conversation and provide a sentiment score from -1.0 (very negative) to 1.0 (very positive).
465
- Consider factors like: politeness, engagement, friendliness, and cooperation.
447
+ // Get all messages in order
448
+ const messages = await runtime . databaseAdapter . getConversationMessages ( conversationId ) ;
449
+ if ( messages . length === 0 ) {
450
+ elizaLogger . error ( "No messages found in conversation for analysis" , conversationId ) ;
451
+ return ;
452
+ }
466
453
467
- Context: ${ conversation . context }
454
+ // Get the last message to use for state building
455
+ const lastMessage = messages [ messages . length - 1 ] ;
468
456
469
- ${ Array . from ( userMessages . entries ( ) ) . map ( ( [ username , msgs ] ) =>
470
- `Messages from @${ username } :\n${ msgs . join ( '\n' ) } `
471
- ) . join ( '\n\n' ) }
457
+ // Build state with conversation context
458
+ const state = await runtime . composeState ( lastMessage , {
459
+ conversationId : conversationId ,
460
+ twitterUserName : runtime . getSetting ( "TWITTER_USERNAME" )
461
+ } ) ;
472
462
473
- Return ONLY a JSON object with usernames as keys and scores as values. Example format:
474
- {
475
- "@user1": 0.8,
476
- "@user2": -0.3
477
- }` ;
463
+ // Format conversation for per-user analysis
464
+ const analysisTemplate = `
465
+ #Recent Conversations:
466
+ {{recentUserConversations}}
467
+
468
+ #Instructions:
469
+ Evaluate the messages the other users sent to you in this conversation.
470
+ Rate each users messages sent to you as a whole using these metrics: [-5] very bad, [0] neutral, [5] very good.
471
+ Evaluates these messages as the character ${ runtime . character . name } with the context of the whole conversation.
472
+ If you aren't sure if the message was directed to you, or you're missing context to give a good answer, give the score [0] neutral.
473
+
474
+ Return ONLY a JSON object with usernames as keys and scores as values. Example format:
475
+ {
476
+ "@user1": 0.8,
477
+ "@user2": -0.3
478
+ }` ;
479
+ const context = composeContext ( {
480
+ state,
481
+ template : analysisTemplate
482
+ } ) ;
478
483
479
484
const analysis = await runtime . generateText ( {
480
- prompt,
481
- temperature : 0.7 ,
482
- maxTokens : 500
485
+ prompt : context ,
483
486
} ) ;
484
487
485
488
elizaLogger . log ( "User sentiment scores:" , analysis ) ;
@@ -495,13 +498,17 @@ Return ONLY a JSON object with usernames as keys and scores as values. Example f
495
498
496
499
// Update user rapport based on sentiment scores
497
500
for ( const [ username , score ] of Object . entries ( sentimentScores ) ) {
498
- const userId = messages . find ( m => m . content . username === username . replace ( '@' , '' ) ) ?. userId ;
501
+ const userId = messages . find ( m =>
502
+ ( m . content . username || m . userId ) === username . replace ( '@' , '' )
503
+ ) ?. userId ;
504
+
499
505
if ( userId ) {
500
- await runtime . databaseAdapter . updateUserRapport ( {
506
+ await runtime . databaseAdapter . setUserRapport (
501
507
userId ,
502
- agentId : runtime . agentId ,
503
- sentimentScore : score as number
504
- } ) ;
508
+ runtime . agentId ,
509
+ score as number
510
+ ) ;
511
+ elizaLogger . log ( `Updated rapport for user ${ username } :` , score ) ;
505
512
}
506
513
}
507
514
} catch ( error ) {
0 commit comments