pub struct LocalRenderer { /* private fields */ }Expand description
A chat template rendered in-process.
Implementations§
Source§impl LocalRenderer
impl LocalRenderer
Sourcepub fn new(template: String, context: Map<String, Value>) -> Result<Self>
pub fn new(template: String, context: Map<String, Value>) -> Result<Self>
Compile template, adding context to every render.
The context carries the variables transformers supplies besides the
messages, such as bos_token and eos_token; a template that starts
with {{- bos_token }} needs them.
Examples found in repository?
examples/local_template.rs (line 49)
35async fn main() -> Result<()> {
36 let path = std::env::var("JEV_BRIDGE_CHAT_TEMPLATE").unwrap_or_else(|_| "template.jinja".to_string());
37 let source = std::fs::read_to_string(&path)
38 .with_context(|| format!("reading {path} failed; see the module docs for how to obtain it"))?;
39
40 let context: Value = serde_json::from_str(
41 &std::env::var("JEV_BRIDGE_CHAT_CONTEXT").unwrap_or_else(|_| "{}".to_string()),
42 )
43 .context("JEV_BRIDGE_CHAT_CONTEXT must be a JSON object")?;
44 let context = context
45 .as_object()
46 .cloned()
47 .ok_or_else(|| anyhow::anyhow!("JEV_BRIDGE_CHAT_CONTEXT must be a JSON object"))?;
48
49 let renderer = LocalRenderer::new(source, context).context("compiling the chat template failed")?;
50
51 let messages = direct_messages(
52 &json!("I was charged twice and need a refund today."),
53 "Which queue should handle this request?",
54 &[
55 RowOption {
56 id: "access".to_string(),
57 description: "Account access and authentication.".to_string(),
58 },
59 RowOption {
60 id: "billing".to_string(),
61 description: "Billing, payments, and refunds.".to_string(),
62 },
63 RowOption {
64 id: "sales".to_string(),
65 description: "Pricing and new contracts.".to_string(),
66 },
67 ],
68 );
69
70 let prompt = renderer.render(&messages, &json!({"enable_thinking": false}))?;
71 println!("rendered {} bytes:\n", prompt.len());
72 println!("{prompt}");
73 println!("\n--- debug ---");
74 println!("{:?}", prompt);
75 println!(
76 "\nThis is the exact text the upstream model must be scored on. Point the bridge at it \
77 with --chat-template-file so the prompt contract stays byte-identical."
78 );
79 Ok(())
80}Sourcepub fn render<M: Serialize + ?Sized>(
&self,
messages: &M,
chat_template_kwargs: &Value,
) -> Result<String>
pub fn render<M: Serialize + ?Sized>( &self, messages: &M, chat_template_kwargs: &Value, ) -> Result<String>
Render messages, with chat_template_kwargs taking precedence over the
configured context.
messages is generic over Serialize so this module stays independent
of the prompt layer: any chat-shaped value renders.
Examples found in repository?
examples/local_template.rs (line 70)
35async fn main() -> Result<()> {
36 let path = std::env::var("JEV_BRIDGE_CHAT_TEMPLATE").unwrap_or_else(|_| "template.jinja".to_string());
37 let source = std::fs::read_to_string(&path)
38 .with_context(|| format!("reading {path} failed; see the module docs for how to obtain it"))?;
39
40 let context: Value = serde_json::from_str(
41 &std::env::var("JEV_BRIDGE_CHAT_CONTEXT").unwrap_or_else(|_| "{}".to_string()),
42 )
43 .context("JEV_BRIDGE_CHAT_CONTEXT must be a JSON object")?;
44 let context = context
45 .as_object()
46 .cloned()
47 .ok_or_else(|| anyhow::anyhow!("JEV_BRIDGE_CHAT_CONTEXT must be a JSON object"))?;
48
49 let renderer = LocalRenderer::new(source, context).context("compiling the chat template failed")?;
50
51 let messages = direct_messages(
52 &json!("I was charged twice and need a refund today."),
53 "Which queue should handle this request?",
54 &[
55 RowOption {
56 id: "access".to_string(),
57 description: "Account access and authentication.".to_string(),
58 },
59 RowOption {
60 id: "billing".to_string(),
61 description: "Billing, payments, and refunds.".to_string(),
62 },
63 RowOption {
64 id: "sales".to_string(),
65 description: "Pricing and new contracts.".to_string(),
66 },
67 ],
68 );
69
70 let prompt = renderer.render(&messages, &json!({"enable_thinking": false}))?;
71 println!("rendered {} bytes:\n", prompt.len());
72 println!("{prompt}");
73 println!("\n--- debug ---");
74 println!("{:?}", prompt);
75 println!(
76 "\nThis is the exact text the upstream model must be scored on. Point the bridge at it \
77 with --chat-template-file so the prompt contract stays byte-identical."
78 );
79 Ok(())
80}Auto Trait Implementations§
impl !Freeze for LocalRenderer
impl !RefUnwindSafe for LocalRenderer
impl !UnwindSafe for LocalRenderer
impl Send for LocalRenderer
impl Sync for LocalRenderer
impl Unpin for LocalRenderer
impl UnsafeUnpin for LocalRenderer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<A, B, T> HttpServerConnExec<A, B> for Twhere
B: Body,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more