forked from kent/consciousness
StreamToken::Token is now a struct variant with an optional TokenReadout (shape [n_layers][n_concepts]) per token — parsed from the vLLM completion response's choices[i].readout field when the server has readout enabled. ApiClient gains a fetch_readout_manifest() method that hits GET /v1/readout/manifest. Returns Ok(None) on 404 (server has readout disabled), so callers can gracefully fall back when pointed at a non-readout-enabled endpoint. Co-Authored-By: Proof of Concept <poc@bcachefs.org>
46 lines
1.6 KiB
Rust
46 lines
1.6 KiB
Rust
// generate.rs — Continuation generation for scoring / comparison flows.
|
|
//
|
|
// Shared by the finetune pipeline (learn.rs) and the compare screen:
|
|
// given a context prefix and a skip predicate, generate what the model
|
|
// would say as the next assistant turn.
|
|
|
|
use crate::agent::api::{ApiClient, SamplingParams, StreamToken};
|
|
use crate::agent::context::{AstNode, ContextState};
|
|
use crate::agent::tokenizer;
|
|
|
|
/// Generate an assistant continuation from the context up to `entry_idx`,
|
|
/// with `skip` applied to identity + conversation entries during prompt
|
|
/// assembly. The model is whichever `client` points at — the default
|
|
/// runtime client for memory-ablation alternates, a test-model client
|
|
/// for F7 comparison.
|
|
pub async fn gen_continuation<F>(
|
|
context: &ContextState,
|
|
entry_idx: usize,
|
|
skip: F,
|
|
client: &ApiClient,
|
|
) -> anyhow::Result<String>
|
|
where F: FnMut(&AstNode) -> bool,
|
|
{
|
|
let (mut prompt, images, _) = context.wire_prompt(0..entry_idx, skip);
|
|
|
|
prompt.push(tokenizer::IM_START);
|
|
prompt.extend(tokenizer::encode("assistant\n"));
|
|
|
|
let sampling = SamplingParams {
|
|
temperature: 0.6,
|
|
top_p: 0.95,
|
|
top_k: 20,
|
|
};
|
|
let (mut rx, _guard) = client.stream_completion_mm(&prompt, &images, sampling, Some(-5));
|
|
|
|
let mut tokens = Vec::new();
|
|
while let Some(tok) = rx.recv().await {
|
|
match tok {
|
|
StreamToken::Token { id, .. } => tokens.push(id),
|
|
StreamToken::Done { .. } => break,
|
|
StreamToken::Error(e) => anyhow::bail!("generation error: {}", e),
|
|
}
|
|
}
|
|
|
|
Ok(tokenizer::decode(&tokens))
|
|
}
|