"errors"
"fmt"
"io"
- "log"
+ "log/slog"
"os"
"path/filepath"
"strconv"
// probeName is the agent name of a probe run. The cache key comes from
// it.
probeName = "Probe"
+
+ // probeCallLimit is the most model calls of a probe run.
+ probeCallLimit = 660
)
// probe runs "onechat probe LOG COUNT [BUILDS]". It appends the first COUNT
// messages of LOG, one JSON object {kind, text} per line, to a new chat in
// probe/ in the data directory, and builds its tree with the real compactor.
// Before each user message it waits for the builds, as a turn does. It stops at
-// the first failed call, after buildCallLimit calls, or when the used percent
+// the first failed call, after probeCallLimit calls, or when the used percent
// of a quota window grows by more than buildQuotaLimit points. At the end it
// reports the calls, the time per call, the calls at once, the cached share,
// the quota, the retries, and the line sizes. BUILDS, from 1 to buildMax,
usagePath := filepath.Join(root, "usage.jsonl")
client := newModelClient(address, auth, "onechat-"+probeName, usagePath)
- client.LimitCalls(buildCallLimit)
+ client.LimitCalls(probeCallLimit)
+
summarizer := ProbeSlotSummarizer{
inner: newCompactor(client, probePrompt, config.Compactor),
slots: make(chan struct{}, builds),
// The report of the probe counts the failed calls, so the lines of the
// failed builds are not needed.
- memory, err := openMemory(ctx, root, time.Now, summarizer, log.New(io.Discard, "", 0))
+ memory, err := openMemory(ctx, root, time.Now, summarizer, slog.New(slog.DiscardHandler))
if err != nil {
return fmt.Errorf("open probe memory: %w", err)
}
scanner := bufio.NewScanner(file)
scanner.Buffer(make([]byte, 64*1024), buildLineBytes)
+
for len(entries) < count && scanner.Scan() {
var entry DatedMessage
+
err = json.Unmarshal(scanner.Bytes(), &entry)
if err != nil {
return nil, fmt.Errorf("probe log line %d: %w", len(entries)+1, err)