Skip to content

Commit 743ae0f

Browse files
authored
Merge pull request #71 from sashirestela/70-error-with-threadrunstepdelta
Fixing errors with ThreadRunStepDelta
2 parents f39b244 + 3fb41e9 commit 743ae0f

File tree

8 files changed

+1714
-14
lines changed

8 files changed

+1714
-14
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>io.github.sashirestela</groupId>
88
<artifactId>simple-openai</artifactId>
9-
<version>2.1.0</version>
9+
<version>2.1.1</version>
1010
<packaging>jar</packaging>
1111

1212
<name>simple-openai</name>

src/demo/java/io/github/sashirestela/openai/demo/AssistantServiceDemo.java

Lines changed: 72 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@
1111
import io.github.sashirestela.openai.domain.assistant.ThreadRequest;
1212
import io.github.sashirestela.openai.domain.assistant.ThreadRun;
1313
import io.github.sashirestela.openai.domain.assistant.ThreadRunRequest;
14+
import io.github.sashirestela.openai.domain.assistant.ThreadRunStep;
15+
import io.github.sashirestela.openai.domain.assistant.ThreadRunStepDelta;
16+
import io.github.sashirestela.openai.domain.assistant.ThreadRunStepDelta.MessageCreationStepDetail;
17+
import io.github.sashirestela.openai.domain.assistant.ThreadRunStepDelta.ToolCallsStepDetail;
1418
import io.github.sashirestela.openai.domain.file.FileRequest;
1519
import io.github.sashirestela.openai.domain.file.PurposeType;
1620

@@ -101,10 +105,70 @@ public void demoRunThreadAndWaitUntilComplete() {
101105
public void demoRunThreadAndStream() {
102106
var request = ThreadRunRequest.builder().assistantId(assistantId).build();
103107
var response = openAI.threads().createRunStream(threadId, request).join();
104-
response.filter(e -> e.getName().equals(Events.THREAD_MESSAGE_DELTA))
105-
.map(e -> ((TextContent) ((ThreadMessageDelta) e.getData()).getDelta().getContent().get(0)).getValue())
106-
.forEach(System.out::print);
107-
System.out.println();
108+
response.forEach(e -> {
109+
switch (e.getName()) {
110+
case Events.THREAD_RUN_STEP_CREATED:
111+
var runStepCreated = (ThreadRunStep) e.getData();
112+
System.out.println("\n===== Thread Run Step Created - " + runStepCreated.getType() + " - "
113+
+ runStepCreated.getId());
114+
break;
115+
case Events.THREAD_RUN_STEP_COMPLETED:
116+
var runStepCompleted = (ThreadRunStep) e.getData();
117+
System.out.println("\n----- Thread Run Step Completed - " + runStepCompleted.getType() + " - "
118+
+ runStepCompleted.getId());
119+
break;
120+
case Events.THREAD_RUN_STEP_DELTA:
121+
var runStepDeltaDetails = ((ThreadRunStepDelta) e.getData()).getDelta().getStepDetails();
122+
if (runStepDeltaDetails instanceof MessageCreationStepDetail) {
123+
System.out.println(
124+
((MessageCreationStepDetail) runStepDeltaDetails).getMessageCreation().getMessageId());
125+
} else if (runStepDeltaDetails instanceof ToolCallsStepDetail) {
126+
var toolCall = ((ToolCallsStepDetail) runStepDeltaDetails).getToolCalls().get(0);
127+
if (toolCall.getType().equals("code_interpreter")) {
128+
var codeInterpreter = toolCall.getCodeInterpreter();
129+
if (codeInterpreter.getInput() != null) {
130+
System.out.print(codeInterpreter.getInput());
131+
}
132+
if (codeInterpreter.getOutputs() != null && codeInterpreter.getOutputs().size() > 0) {
133+
var codeInterpreterOutput = codeInterpreter.getOutputs().get(0);
134+
if (codeInterpreterOutput.getType().equals("logs")) {
135+
System.out.print("\nOutput Logs = " + codeInterpreterOutput.getLogs());
136+
} else if (codeInterpreterOutput.getType().equals("image")) {
137+
System.out.print(
138+
"\nOutput Image File Id = " + codeInterpreterOutput.getImage().getFileId());
139+
}
140+
}
141+
} else if (toolCall.getType().equals("function")) {
142+
var functionTool = toolCall.getFunction();
143+
if (functionTool.getName() != null) {
144+
System.out.println("Function Name = " + functionTool.getName());
145+
System.out.print("Function Arguments = ");
146+
}
147+
if (functionTool.getArguments() != null) {
148+
System.out.print(functionTool.getArguments());
149+
}
150+
if (functionTool.getOutput() != null) {
151+
System.out.print("\nFunction Output = " + functionTool.getOutput());
152+
}
153+
} else if (toolCall.getType().equals("retrieval")) {
154+
// Currently OpenAI is replying an empty Map.
155+
}
156+
}
157+
break;
158+
case Events.THREAD_MESSAGE_DELTA:
159+
var messageDeltaFirstContent = ((ThreadMessageDelta) e.getData()).getDelta().getContent().get(0);
160+
if (messageDeltaFirstContent instanceof TextContent) {
161+
System.out.print(((TextContent) messageDeltaFirstContent).getValue());
162+
} else if (messageDeltaFirstContent instanceof ImageFileContent) {
163+
System.out.println(
164+
"File Id = "
165+
+ ((ImageFileContent) messageDeltaFirstContent).getImageFile().getFileId());
166+
}
167+
break;
168+
default:
169+
break;
170+
}
171+
});
108172
}
109173

110174
public void demoGetAssistantMessages() {
@@ -135,8 +199,9 @@ public void demoGetAssistantMessages() {
135199
}
136200
}
137201

138-
public void demoDeleteAssistant() {
202+
public void demoDeleteAssistantAndThread() {
139203
openAI.assistants().delete(assistantId).join();
204+
openAI.threads().delete(threadId).join();
140205
}
141206

142207
private static void sleep(int seconds) {
@@ -155,10 +220,10 @@ public static void main(String[] args) {
155220
demo.addTitleAction("Demo Call Assistant List", demo::demoListAssistants);
156221
demo.addTitleAction("Demo Call Assistant File Upload", demo::demoUploadAssistantFile);
157222
demo.addTitleAction("Demo Call Assistant Thread Create", demo::demoCreateThread);
158-
demo.addTitleAction("Demo Call Assistant Thread Run", demo::demoRunThreadAndWaitUntilComplete);
223+
//demo.addTitleAction("Demo Call Assistant Thread Run", demo::demoRunThreadAndWaitUntilComplete);
159224
demo.addTitleAction("Demo Call Assistant Thread Run Stream", demo::demoRunThreadAndStream);
160225
demo.addTitleAction("Demo Call Assistant Messages Get", demo::demoGetAssistantMessages);
161-
demo.addTitleAction("Demo Call Assistant Delete", demo::demoDeleteAssistant);
226+
demo.addTitleAction("Demo Call Assistant & Thread Delete", demo::demoDeleteAssistantAndThread);
162227

163228
demo.run();
164229
}

src/main/java/io/github/sashirestela/openai/domain/assistant/ThreadRunStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public static class MessageCreation {
8787
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
8888
public static class ToolCall {
8989

90-
private String index;
90+
private int index;
9191
private String id;
9292
private String type;
9393
private CodeInterpreter codeInterpreter;

src/main/java/io/github/sashirestela/openai/domain/assistant/ThreadRunStepDelta.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class ThreadRunStepDelta {
2424
@Getter
2525
@ToString
2626
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
27-
public class ThreadRunStepDeltaDetail {
27+
public static class ThreadRunStepDeltaDetail {
2828

2929
private StepDetails stepDetails;
3030

@@ -35,14 +35,14 @@ public class ThreadRunStepDeltaDetail {
3535
@JsonSubTypes.Type(value = MessageCreationStepDetail.class, name = "message_creation"),
3636
@JsonSubTypes.Type(value = ToolCallsStepDetail.class, name = "tool_calls")
3737
})
38-
public interface StepDetails {
38+
public static interface StepDetails {
3939
}
4040

4141
@NoArgsConstructor
4242
@Getter
4343
@ToString
4444
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
45-
public class MessageCreationStepDetail implements StepDetails {
45+
public static class MessageCreationStepDetail implements StepDetails {
4646

4747
private MessageCreation messageCreation;
4848

@@ -52,7 +52,7 @@ public class MessageCreationStepDetail implements StepDetails {
5252
@Getter
5353
@ToString
5454
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
55-
public class ToolCallsStepDetail implements StepDetails {
55+
public static class ToolCallsStepDetail implements StepDetails {
5656

5757
private List<ThreadRunStep.ToolCall> toolCalls;
5858

@@ -62,7 +62,7 @@ public class ToolCallsStepDetail implements StepDetails {
6262
@Getter
6363
@ToString
6464
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
65-
public class MessageCreation {
65+
public static class MessageCreation {
6666

6767
private String messageId;
6868

src/test/java/io/github/sashirestela/openai/domain/assistant/ThreadDomainTest.java

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import io.github.sashirestela.openai.SimpleOpenAI;
44
import io.github.sashirestela.openai.domain.DomainTestingHelper;
5+
import io.github.sashirestela.openai.domain.assistant.ThreadRunStepDelta.MessageCreationStepDetail;
6+
import io.github.sashirestela.openai.domain.assistant.ThreadRunStepDelta.ToolCallsStepDetail;
57
import org.junit.jupiter.api.BeforeAll;
68
import org.junit.jupiter.api.Test;
79

@@ -163,6 +165,23 @@ void testThreadsRunsCreate() throws IOException {
163165
assertNotNull(response);
164166
}
165167

168+
@Test
169+
void testThreadsRunsCreateStream() throws IOException {
170+
DomainTestingHelper.get().mockForStream(httpClient, "src/test/resources/threads_runs_create_stream.txt");
171+
var request = ThreadRunRequest.builder()
172+
.assistantId(assistantId)
173+
.model("gpt-4-1106-preview")
174+
.instructions("instructions")
175+
.additionalInstructions("additional Instructions")
176+
.metadata(Map.of("key1", "value1"))
177+
.build();
178+
var response = openAI.threads().createRunStream(threadId, request).join();
179+
response.filter(e -> e.getName().equals(Events.THREAD_MESSAGE_DELTA))
180+
.map(e -> ((TextContent) ((ThreadMessageDelta) e.getData()).getDelta().getContent().get(0)).getValue())
181+
.forEach(System.out::print);
182+
assertNotNull(response);
183+
}
184+
166185
@Test
167186
void testThreadsRunsModify() throws IOException {
168187
DomainTestingHelper.get().mockForObject(httpClient, "src/test/resources/threads_runs_modify.json");
@@ -237,6 +256,89 @@ void testThreadsRunsCreateBoth() throws IOException {
237256
assertNotNull(response);
238257
}
239258

259+
@Test
260+
void testThreadsRunsCreateBothStream() throws IOException {
261+
DomainTestingHelper.get().mockForStream(httpClient, "src/test/resources/threads_runs_create_both_stream.txt");
262+
var request = ThreadCreateAndRunRequest.builder()
263+
.assistantId(assistantId)
264+
.thread(ThreadMessageList.builder()
265+
.message(ThreadMessageRequest.builder()
266+
.role("user")
267+
.content(
268+
"Inspect the content of the attached text file. After that plot graph of the formula requested in it.")
269+
.build())
270+
.metadata(Map.of("stage", "test"))
271+
.build())
272+
.metadata(Map.of("phase", "test"))
273+
.build();
274+
var response = openAI.threads().createThreadAndRunStream(request).join();
275+
response.forEach(e -> {
276+
switch (e.getName()) {
277+
case Events.THREAD_RUN_STEP_CREATED:
278+
var runStepCreated = (ThreadRunStep) e.getData();
279+
System.out.println("\n===== Thread Run Step Created - " + runStepCreated.getType() + " - "
280+
+ runStepCreated.getId());
281+
break;
282+
case Events.THREAD_RUN_STEP_COMPLETED:
283+
var runStepCompleted = (ThreadRunStep) e.getData();
284+
System.out.println("\n----- Thread Run Step Completed - " + runStepCompleted.getType() + " - "
285+
+ runStepCompleted.getId());
286+
break;
287+
case Events.THREAD_RUN_STEP_DELTA:
288+
var runStepDeltaDetails = ((ThreadRunStepDelta) e.getData()).getDelta().getStepDetails();
289+
if (runStepDeltaDetails instanceof MessageCreationStepDetail) {
290+
System.out.println(
291+
((MessageCreationStepDetail) runStepDeltaDetails).getMessageCreation().getMessageId());
292+
} else if (runStepDeltaDetails instanceof ToolCallsStepDetail) {
293+
var toolCall = ((ToolCallsStepDetail) runStepDeltaDetails).getToolCalls().get(0);
294+
if (toolCall.getType().equals("code_interpreter")) {
295+
var codeInterpreter = toolCall.getCodeInterpreter();
296+
if (codeInterpreter.getInput() != null) {
297+
System.out.print(codeInterpreter.getInput());
298+
}
299+
if (codeInterpreter.getOutputs() != null && codeInterpreter.getOutputs().size() > 0) {
300+
var codeInterpreterOutput = codeInterpreter.getOutputs().get(0);
301+
if (codeInterpreterOutput.getType().equals("logs")) {
302+
System.out.print("\nOutput Logs = " + codeInterpreterOutput.getLogs());
303+
} else if (codeInterpreterOutput.getType().equals("image")) {
304+
System.out.print(
305+
"\nOutput Image File Id = " + codeInterpreterOutput.getImage().getFileId());
306+
}
307+
}
308+
} else if (toolCall.getType().equals("function")) {
309+
var functionTool = toolCall.getFunction();
310+
if (functionTool.getName() != null) {
311+
System.out.println("Function Name = " + functionTool.getName());
312+
System.out.print("Function Arguments = ");
313+
}
314+
if (functionTool.getArguments() != null) {
315+
System.out.print(functionTool.getArguments());
316+
}
317+
if (functionTool.getOutput() != null) {
318+
System.out.print("\nFunction Output = " + functionTool.getOutput());
319+
}
320+
} else if (toolCall.getType().equals("retrieval")) {
321+
// Currently OpenAI is replying an empty Map.
322+
}
323+
}
324+
break;
325+
case Events.THREAD_MESSAGE_DELTA:
326+
var messageDeltaFirstContent = ((ThreadMessageDelta) e.getData()).getDelta().getContent().get(0);
327+
if (messageDeltaFirstContent instanceof TextContent) {
328+
System.out.print(((TextContent) messageDeltaFirstContent).getValue());
329+
} else if (messageDeltaFirstContent instanceof ImageFileContent) {
330+
System.out.println(
331+
"File Id = "
332+
+ ((ImageFileContent) messageDeltaFirstContent).getImageFile().getFileId());
333+
}
334+
break;
335+
default:
336+
break;
337+
}
338+
});
339+
assertNotNull(response);
340+
}
341+
240342
@Test
241343
void testThreadsRunsCancel() throws IOException {
242344
DomainTestingHelper.get().mockForObject(httpClient, "src/test/resources/threads_runs_cancel.json");

0 commit comments

Comments
 (0)