@@ -22,39 +22,29 @@ var _ llm.Context = (*session)(nil)
2222///////////////////////////////////////////////////////////////////////////////
2323// LIFECYCLE
2424
25- // Return am empty session context object for the model,
26- // setting session options
25+ // Return an empty session context object for the model, setting session options
2726func (model * model ) Context (opts ... llm.Opt ) llm.Context {
2827 return & session {
2928 model : model ,
3029 opts : opts ,
3130 }
3231}
3332
34- // Convenience method to create a session context object
35- // with a user prompt, which panics on error
33+ // Convenience method to create a session context object with a user prompt, which
34+ // panics on error
3635func (model * model ) UserPrompt (prompt string , opts ... llm.Opt ) llm.Context {
37- // Apply attachments
38- opt , err := apply (opts ... )
36+ context := model .Context (opts ... )
37+
38+ meta , err := userPrompt (prompt , opts ... )
3939 if err != nil {
4040 panic (err )
4141 }
4242
43- meta := MessageMeta {
44- Role : "user" ,
45- Content : make ([]* Content , 1 , len (opt .data )+ 1 ),
46- }
47-
48- // Append the text
49- meta .Content [0 ] = NewTextContent (prompt )
50-
51- // Append any additional data
52- for _ , data := range opt .data {
53- meta .Content = append (meta .Content , data )
54- }
43+ // Add to the sequence
44+ context .(* session ).seq = append (context .(* session ).seq , meta )
5545
5646 // Return success
57- return nil
47+ return context
5848}
5949
6050///////////////////////////////////////////////////////////////////////////////
@@ -98,14 +88,85 @@ func (session *session) Text() string {
9888 return string (data )
9989}
10090
101- // Generate a response from a user prompt (with attachments and
91+ // Return the current session tool calls, or empty if no tool calls were made
92+ func (session * session ) ToolCalls () []llm.ToolCall {
93+ // Sanity check for tool call
94+ if len (session .seq ) == 0 {
95+ return nil
96+ }
97+ meta := session .seq [len (session .seq )- 1 ]
98+ if meta .Role != "assistant" {
99+ return nil
100+ }
101+
102+ // Gather tool calls
103+ var result []llm.ToolCall
104+ for _ , content := range meta .Content {
105+ if content .Type == "tool_use" {
106+ result = append (result , NewToolCall (content ))
107+ }
108+ }
109+ return result
110+ }
111+
112+ // Generate a response from a user prompt (with attachments) and
102113// other empheral options
103- func (session * session ) FromUser (context.Context , string , ... llm.Opt ) (llm.Context , error ) {
104- return nil , llm .ErrNotImplemented
114+ func (session * session ) FromUser (ctx context.Context , prompt string , opts ... llm.Opt ) error {
115+ // Append the user prompt to the sequence
116+ meta , err := userPrompt (prompt , opts ... )
117+ if err != nil {
118+ return err
119+ } else {
120+ session .seq = append (session .seq , meta )
121+ }
122+
123+ // The options come from the session options and the user options
124+ chatopts := make ([]llm.Opt , 0 , len (session .opts )+ len (opts ))
125+ chatopts = append (chatopts , session .opts ... )
126+ chatopts = append (chatopts , opts ... )
127+
128+ // Call the 'chat' method
129+ client := session .model .client
130+ r , err := client .Messages (ctx , session , chatopts ... )
131+ if err != nil {
132+ return err
133+ } else {
134+ session .seq = append (session .seq , & r .MessageMeta )
135+ }
136+
137+ // Return success
138+ return nil
105139}
106140
107141// Generate a response from a tool, passing the call identifier or
108142// function name, and the result
109- func (session * session ) FromTool (context.Context , string , any , ... llm.Opt ) (llm.Context , error ) {
110- return nil , llm .ErrNotImplemented
143+ func (session * session ) FromTool (context.Context , string , any , ... llm.Opt ) error {
144+ return llm .ErrNotImplemented
145+ }
146+
147+ ///////////////////////////////////////////////////////////////////////////////
148+ // PRIVATE METHODS
149+
150+ func userPrompt (prompt string , opts ... llm.Opt ) (* MessageMeta , error ) {
151+ // Apply attachments
152+ opt , err := apply (opts ... )
153+ if err != nil {
154+ return nil , err
155+ }
156+
157+ meta := MessageMeta {
158+ Role : "user" ,
159+ Content : make ([]* Content , 1 , len (opt .data )+ 1 ),
160+ }
161+
162+ // Append the text
163+ meta .Content [0 ] = NewTextContent (prompt )
164+
165+ // Append any additional data
166+ for _ , data := range opt .data {
167+ meta .Content = append (meta .Content , data )
168+ }
169+
170+ // Return success
171+ return & meta , nil
111172}
0 commit comments