///|
/// moon-agent quickstart: minimal LLMChain invocation.
///
/// This example demonstrates:
/// 1. Loading unified config from `config.json` or env vars
/// 2. Building a ChatPromptTemplate with system + user messages
/// 3. Constructing an LLMChain with an OpenAI-compatible provider
/// 4. Invoking the chain with template variables
///
/// Configuration:
/// Create `config.json` at project root (see `config.example.json`):
/// ```json
/// {
/// "api_key": "sk-...",
/// "base_url": "https://api.deepseek.com",
/// "model": "deepseek-chat"
/// }
/// ```
/// Or set env vars: OPENAI_API_KEY, OPENAI_BASE_URL (optional), OPENAI_MODEL (optional)
///
/// Run with:
/// moon run examples/quickstart --target js
fn main {
// Load config from config.json or env vars (unified with cmd/chat)
let config = match @config.load_config() {
Some(c) => c
None => {
println("Please configure API access first.")
println(
"Create `config.json` at project root (see `config.example.json`)",
)
println(
"or set env vars: OPENAI_API_KEY, OPENAI_BASE_URL (optional), OPENAI_MODEL (optional)",
)
return
}
}
// Build the prompt template (system + user, {topic} is a placeholder)
let prompt = @prompts.ChatPromptTemplate::new()
|> @prompts.ChatPromptTemplate::with_system("You are a helpful assistant.")
|> @prompts.ChatPromptTemplate::with_user(
"What is {topic}? Answer in one sentence.",
)
// Render for demonstration
let vars : Map[String, String] = Map([])
vars["topic"] = "MoonBit"
let messages = prompt.render(vars)
for msg in messages {
println("[" + @llm.Role::to_string(msg.role) + "] " + msg.get_text())
}
// Build provider from config (supports DeepSeek, OpenAI, any OpenAI-compatible endpoint)
let model = @openai.OpenAIProvider::new_compat(
config.base_url,
config.model,
api_key=config.api_key,
max_tokens=config.max_tokens,
system_prompt=config.system_prompt,
)
let chain = @chains.LLMChain::new(@llm.BoxedProvider::new(model), prompt)
println("\nEndpoint: " + config.base_url + " | Model: " + config.model)
println("\nAssistant:")
let result = chain.invoke(vars)
println(result)
}