Skip to content

Commit 2b2a8a7

Browse files
committed
feat(protocol): integrate typed prompt request with ACP
1 parent ab7bfb9 commit 2b2a8a7

3 files changed

Lines changed: 85 additions & 0 deletions

File tree

‎src/main/java/io/github/easy4j/kimi/acp/KimiAcpClient.java‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
import org.slf4j.LoggerFactory;
4242

4343
import io.github.easy4j.kimi.KimiException;
44+
import io.github.easy4j.kimi.model.KimiPromptRequest;
45+
import io.github.easy4j.kimi.model.KimiPromptResult;
4446
import tools.jackson.databind.JsonNode;
4547
import tools.jackson.databind.ObjectMapper;
4648
import tools.jackson.databind.json.JsonMapper;
@@ -349,6 +351,28 @@ public CompletableFuture<KimiAcpTurnResult> promptAsync(String sessionId, String
349351
return future;
350352
}
351353

354+
/**
355+
* Runs one typed prompt turn asynchronously while preserving the legacy
356+
* string-based ACP API.
357+
*/
358+
public CompletableFuture<KimiPromptResult> promptAsync(
359+
KimiPromptRequest request, Consumer<String> onDelta) {
360+
Objects.requireNonNull(request, "request");
361+
return promptAsync(request.getSessionId(), request.getText(), onDelta)
362+
.thenApply(result -> KimiPromptResult.of(
363+
result.getSessionId(), result.getStopReason(), result.getContent()));
364+
}
365+
366+
/**
367+
* Runs one typed prompt turn while preserving the legacy string-based ACP API.
368+
*/
369+
public KimiPromptResult prompt(KimiPromptRequest request, Consumer<String> onDelta) {
370+
Objects.requireNonNull(request, "request");
371+
KimiAcpTurnResult result = prompt(request.getSessionId(), request.getText(), onDelta);
372+
return KimiPromptResult.of(
373+
result.getSessionId(), result.getStopReason(), result.getContent());
374+
}
375+
352376
/**
353377
* Runs one prompt turn, blocking until it completes.
354378
*
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright (c) 2018-present, easy-4-java.
3+
* Licensed under the Apache License, Version 2.0.
4+
*/
5+
package io.github.easy4j.kimi.model;
6+
7+
/**
8+
* Immutable typed prompt request for an existing Kimi session.
9+
*/
10+
public final class KimiPromptRequest {
11+
12+
private final String sessionId;
13+
private final String text;
14+
15+
private KimiPromptRequest(Builder builder) {
16+
this.sessionId = builder.sessionId;
17+
this.text = builder.text;
18+
}
19+
20+
public static Builder builder() {
21+
return new Builder();
22+
}
23+
24+
public String getSessionId() {
25+
return sessionId;
26+
}
27+
28+
public String getText() {
29+
return text;
30+
}
31+
32+
public static final class Builder {
33+
private String sessionId;
34+
private String text;
35+
36+
public Builder sessionId(String sessionId) {
37+
this.sessionId = sessionId;
38+
return this;
39+
}
40+
41+
public Builder text(String text) {
42+
this.text = text;
43+
return this;
44+
}
45+
46+
public KimiPromptRequest build() {
47+
if (sessionId == null || sessionId.trim().isEmpty()) {
48+
throw new IllegalStateException("sessionId is required");
49+
}
50+
if (text == null) {
51+
throw new IllegalStateException("text is required");
52+
}
53+
return new KimiPromptRequest(this);
54+
}
55+
}
56+
}

‎src/main/java/io/github/easy4j/kimi/model/KimiPromptResult.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ public final class KimiPromptResult {
2424
this.extensions = KimiSession.immutableExtensions(extensions);
2525
}
2626

27+
public static KimiPromptResult of(String sessionId, String stopReason, String content) {
28+
return new KimiPromptResult(sessionId, KimiStopReason.of(stopReason),
29+
content, null, java.util.Collections.<String, JsonNode>emptyMap());
30+
}
31+
2732
public String getSessionId() { return sessionId; }
2833
public KimiStopReason getStopReason() { return stopReason; }
2934
public String getContent() { return content; }

0 commit comments

Comments
 (0)