11import { DiscordApplication } from "@chat/discord/DiscordRest"
2- import { AiInput , AiLanguageModel , Tokenizer } from "@effect/ai"
2+ import { LanguageModel , Prompt , Tokenizer } from "@effect/ai"
33import { OpenAiClient , OpenAiLanguageModel } from "@effect/ai-openai"
44import { HttpClient } from "@effect/platform"
55import { NodeHttpClient } from "@effect/platform-node"
@@ -44,7 +44,7 @@ export class AiHelpers extends Effect.Service<AiHelpers>()("app/AiHelpers", {
4444 { concurrency : "unbounded" }
4545 ) ,
4646 Effect . map ( ( { messages, openingMessage } ) =>
47- AiInput . make (
47+ Prompt . make (
4848 [ ...( message ? [ message ] : [ ] ) , ...messages , openingMessage ]
4949 . reverse ( )
5050 . filter (
@@ -54,59 +54,73 @@ export class AiHelpers extends Effect.Service<AiHelpers>()("app/AiHelpers", {
5454 )
5555 . filter ( ( msg ) => msg . content . trim ( ) . length > 0 )
5656 . map (
57- ( msg ) : AiInput . Message =>
57+ ( msg ) : Prompt . Message =>
5858 msg . author . id === botUser . id
59- ? AiInput . AssistantMessage . make ( {
60- parts : [ new AiInput . TextPart ( { text : msg . content } ) ]
59+ ? Prompt . makeMessage ( "assistant" , {
60+ content : [ Prompt . makePart ( "text" , { text : msg . content } ) ]
6161 } )
62- : AiInput . UserMessage . make ( {
63- parts : [ new AiInput . TextPart ( { text : msg . content } ) ] ,
64- userName : msg . author . username
62+ : Prompt . makeMessage ( "user" , {
63+ content : [
64+ Prompt . makePart ( "text" , {
65+ text : `<@${ msg . author . id } >: ${ msg . content } `
66+ } )
67+ ]
6568 } )
6669 )
6770 )
6871 )
6972 )
7073
7174 const generateTitle = ( prompt : string ) =>
72- AiLanguageModel . generateText ( {
73- prompt,
74- system :
75- `You are a helpful assistant for the Effect Typescript library Discord community.
75+ LanguageModel . generateText ( {
76+ prompt : [
77+ {
78+ role : "system" ,
79+ content :
80+ `You are a helpful assistant for the Effect Typescript library Discord community.
7681
7782Create a short title summarizing the message. Do not include markdown in the title.`
83+ } ,
84+ { role : "user" , content : [ { type : "text" , text : prompt } ] }
85+ ]
7886 } ) . pipe (
7987 Effect . provide ( model ) ,
8088 OpenAiLanguageModel . withConfigOverride ( {
81- temperature : 0.25 ,
82- max_tokens : 64
89+ temperature : 0.25
90+ // TODO
91+ // max_tokens: 64
8392 } ) ,
8493 Effect . map ( ( _ ) => cleanTitle ( _ . text ) ) ,
8594 Effect . withSpan ( "Ai.generateTitle" , { attributes : { prompt } } )
8695 )
8796
8897 const generateDocs = Effect . fn ( "AiHelpers.generateDocs" ) ( function * (
8998 title : string ,
90- messages : AiInput . AiInput ,
99+ messages : Prompt . Prompt ,
91100 instruction =
92101 "Create a documentation article from the above chat messages. The article should be written in markdown and should contain code examples where appropiate."
93102 ) {
94103 const tokenizer = yield * Tokenizer . Tokenizer
95104 const prompt = yield * tokenizer . truncate (
96- AiInput . concat ( messages , AiInput . make ( instruction ) ) ,
105+ Prompt . merge ( messages , Prompt . make ( instruction ) ) ,
97106 30_000
98107 )
99- const response = yield * AiLanguageModel . generateText ( {
100- prompt,
101- system :
102- `You are a helpful assistant for the Effect Typescript library Discord community.
108+ const response = yield * LanguageModel . generateText ( {
109+ prompt : Prompt . merge (
110+ Prompt . make ( [ {
111+ role : "system" ,
112+ content :
113+ `You are a helpful assistant for the Effect Typescript library Discord community.
103114
104115The title of this chat is "${ title } ".`
116+ } ] ) ,
117+ prompt
118+ )
105119 } )
106120 return response . text
107121 } , Effect . provide ( model ) )
108122
109- const generateSummary = ( title : string , messages : AiInput . AiInput ) =>
123+ const generateSummary = ( title : string , messages : Prompt . Prompt ) =>
110124 generateDocs (
111125 title ,
112126 messages ,
0 commit comments