ThinkThen

Java functions that answer questions about text

One Door class over the C library, for Java 21. Each call returns its answer and its run facts.

Install

ChannelNote
io.github.botassembly:thinkthen-jvm:VERSIONThe Maven coordinate.
thinkthen-jvm-VERSION-TARGET.tar.gzThe door, Kotlin and Scala JARs, from each release.
thinkthen-c-VERSION-TARGET.tar.gzThe C library it calls, from the same release.

Set THINKTHEN_API_KEY in the environment.

A first call

import static java.nio.charset.StandardCharsets.UTF_8;

import thinkthen.Door;
import thinkthen.Door.Outcome;

public class FirstCall {
    public static void main(String[] args) {
        try (var tt = new Door()) {
            var question =
                "Does the customer ask for a refund?";
            var isRefund = tt.decide(
                question,
                "Please refund my order. It arrived broken."
                    .getBytes(UTF_8));
            assert Door.outcome(isRefund.value())
                == Outcome.YES;

            var refund = "{\"decide\": \"" + question
                + "\", \"threshold\": \"0.2:0.8\"}";
            isRefund = tt.decide(
                refund,
                "I want to send this back."
                    .getBytes(UTF_8));
            assert Door.outcome(isRefund.value())
                == Outcome.NOT_SURE;
        }
    }
}
Build and run it beside the unpacked archives, thinkthen-c/ and thinkthen-jvm/
javac --enable-preview --release 21 \
    -cp thinkthen-jvm/thinkthen-door.jar \
    FirstCall.java
java --enable-preview -ea \
    --enable-native-access=ALL-UNNAMED \
    -Dthinkthen.library="$PWD/thinkthen-c/lib/libthinkthen.so" \
    -cp thinkthen-jvm/thinkthen-door.jar:. \
    FirstCall

Not sure comes back as Outcome.NOT_SURE. Branch on it and send those cases to a person.

Run facts

decide returns a TypedResult. Its value() holds the answer, and its facts() holds this call's run facts as a Map.

Errors

A failed call throws a Door.NativeFailure. Its failure names one of six FailureKind values, with the message and the retry flag.

Settings and recording

new Door(settingsJson) takes the settings as JSON. "record" writes a recording to a folder. "replay" answers from that recording with no connection. The Settings page lists every setting.

Jev, Liquid d1 and Ollama from Java

Java reads its backend from the environment. Set THINKTHEN_BACKEND to the name below. Set the backend's key variable in the shell, and the same sample asks that backend.

BackendNameKey variable
TypeSafe JevtypesafeTYPESAFE_API_KEY
Liquid d1liquidLIQUIDAI_API_KEY, then LIQUID_API_KEY
OllamaollamaOLLAMA_API_KEY. A local address needs no key.
Ask TypeSafe Jev.
export THINKTHEN_BACKEND=typesafe
export TYPESAFE_API_KEY=...
Ask Liquid d1.
export THINKTHEN_BACKEND=liquid
export LIQUIDAI_API_KEY=...
Ask Ollama. This block names a second port, 11535, as the site's runs do. On the default port, leave THINKTHEN_BASE_URL out.
export THINKTHEN_BACKEND=ollama
export THINKTHEN_BASE_URL=http://localhost:11535/v1
import static java.nio.charset.StandardCharsets.UTF_8;

import thinkthen.Door;
import thinkthen.Door.Outcome;

public class Backends {
    public static void main(String[] args) {
        try (var tt = new Door()) {
            var question =
                "Does the customer ask for a refund?";
            var brokenIsRefund = tt.decide(
                question,
                "Please refund my order. It arrived broken."
                    .getBytes(UTF_8));
            var thanksIsRefund = tt.decide(
                question,
                "Thanks for the quick help yesterday!"
                    .getBytes(UTF_8));
            assert Door.outcome(brokenIsRefund.value())
                == Outcome.YES;
            assert Door.outcome(thanksIsRefund.value())
                == Outcome.NO;
        }
    }
}
Build and run it beside the unpacked archives, thinkthen-c/ and thinkthen-jvm/
javac --enable-preview --release 21 \
    -cp thinkthen-jvm/thinkthen-door.jar \
    Backends.java
java --enable-preview -ea \
    --enable-native-access=ALL-UNNAMED \
    -Dthinkthen.library="$PWD/thinkthen-c/lib/libthinkthen.so" \
    -cp thinkthen-jvm/thinkthen-door.jar:. \
    Backends

The configuration file's backend names a default backend for every run. The Configuration page shows the file.

OpenAI Decisions API from Java

OpenAI announced its Decisions API on 2026-09-29 in its DevDay 2026 recap. OpenAI has published no address, schema or price, so ThinkThen cannot call it. The OpenAI Decisions API page says what ThinkThen knows.

What is different in Java