import trodo from 'trodo-node';
trodo.init({ siteId: process.env.TRODO_SITE_ID });
const LLM_URL = 'http://ollama.internal/api/chat';
export async function answer(userId, question) {
const { result } = await trodo.wrapAgent('raw-http-agent', async (run) => {
run.setInput({ question });
const body = {
model: 'llama3.1:70b',
messages: [{ role: 'user', content: question }],
};
// Option A — withSpan + setLlm. Explicit control over span timing.
const respA = await trodo.withSpan({ kind: 'llm', name: 'ollama.chat' }, async (span) => {
span.setInput(body);
const r = await fetch(LLM_URL, { method: 'POST', body: JSON.stringify(body) }).then((x) => x.json());
span.setLlm({
model: r.model,
provider: 'ollama',
inputTokens: r.prompt_eval_count,
outputTokens: r.eval_count,
});
span.setOutput(r);
return r;
});
// Option B — trackLlmCall. One-shot, less code.
const r = await fetch(LLM_URL, { method: 'POST', body: JSON.stringify(body) }).then((x) => x.json());
await trodo.trackLlmCall({
model: r.model,
provider: 'ollama',
inputTokens: r.prompt_eval_count,
outputTokens: r.eval_count,
prompt: body,
completion: r,
metadata: { endpoint: '/api/chat' },
});
run.setOutput({ answer: r.message?.content });
return r.message?.content;
}, { distinctId: userId });
return result;
}