use crate::support::*;
#[cfg(feature = "rlm")]
pub trait RlmTurnBuilderExt: Sized {
fn require_finish(self) -> Result<Self>;
fn require_finish_schema(self, schema: serde_json::Value) -> Result<Self>;
fn allow_prose_or_finish(self) -> Result<Self>;
}
#[cfg(feature = "rlm")]
impl RlmTurnBuilderExt for TurnBuilder {
fn require_finish(self) -> Result<Self> {
rlm_termination(
self,
lash_rlm_types::RlmTermination::FinishRequired { schema: None },
)
}
fn require_finish_schema(self, schema: serde_json::Value) -> Result<Self> {
rlm_termination(
self,
lash_rlm_types::RlmTermination::FinishRequired {
schema: Some(schema),
},
)
}
fn allow_prose_or_finish(self) -> Result<Self> {
rlm_termination(self, lash_rlm_types::RlmTermination::Natural)
}
}
#[cfg(feature = "rlm")]
pub trait RlmSessionBuilderExt: Sized {
fn final_answer_format(self, format: lash_rlm_types::RlmFinalAnswerFormat) -> Result<Self>;
}
#[cfg(feature = "rlm")]
impl RlmSessionBuilderExt for SessionBuilder {
fn final_answer_format(mut self, format: lash_rlm_types::RlmFinalAnswerFormat) -> Result<Self> {
let mut extras = self
.plugin_options
.decode::<lash_rlm_types::RlmCreateExtras>(lash_protocol_rlm::RLM_PROTOCOL_PLUGIN_ID)
.ok()
.flatten()
.unwrap_or_default();
extras.final_answer_format = Some(format);
self = self.plugin_option(lash_protocol_rlm::RLM_PROTOCOL_PLUGIN_ID, extras)?;
Ok(self)
}
}
pub use lash_lashlang_runtime::{
LASHLANG_SURFACE_EXTENSION_ID, LashlangAbilities, LashlangHostCatalog, LashlangHostEnvironment,
LashlangLanguageFeatures, LashlangProcessEngine, LashlangSurface, LashlangSurfaceContribution,
};
pub use lash_protocol_rlm::{
NamedDataType, RlmProtocolPluginConfig, RlmProtocolPluginFactory, TypeExpr, TypeField,
format_type_expr,
};
pub use lash_protocol_rlm::{
ProjectionRegistry, RlmProjectedBindings, RlmTurnInputExt, rlm_session_projection_extension,
};
pub use lash_rlm_types::RlmFinalAnswerFormat;
#[cfg(feature = "rlm")]
pub use lash_protocol_rlm::{
LashlangCompileSurface, LashlangCompileSurfaceRequest, LashlangModuleCompileError,
LashlangModuleCompileRequest, ModuleCompileOutput,
};
#[cfg(feature = "rlm")]
fn rlm_termination(
mut builder: TurnBuilder,
termination: lash_rlm_types::RlmTermination,
) -> Result<TurnBuilder> {
let override_options = ProtocolTurnOptions::typed(lash_rlm_types::RlmCreateExtras {
termination,
final_answer_format: None,
})?;
let options = builder
.protocol_turn_options
.as_ref()
.map(|current| current.merged_with_override(&override_options))
.unwrap_or(override_options);
builder.protocol_turn_options = Some(options);
Ok(builder)
}