Imp v0.4.0
Imp is a framework for typed, optimizable language-model programs on the BEAM.
Declare a task as named inputs and outputs, call it like any other Elixir
program, measure it on examples, compile it with an optimizer, and run the
selected program under OTP.
This release absorbs the protocol adapters that previously lived on main
only, and changes three published shapes. It is 0.4.0 rather than a patch
because a program written against v0.3.2 can need edits.
Install
v0.4.0 is a Git source release from a public repository; no credentials are
required.
{:imp, github: "deepfates/imp", tag: "v0.4.0"}Imp is not published to Hex. Use a path dependency only while developing
against a local checkout.
ExMCP is declared runtime: false, so an OTP release that uses Imp.ACP or
Imp.MCP must list applications: [ex_mcp: :load] in its release
definition; see protocol runtime in
releases.
Ordinary Imp startup starts no protocol endpoint.
Headline changes
Imp.ACPandImp.MCP.connect/2are in the tag. The separateimp_acp
package is retired with no compatibility shim: a consumer that depended on
it now depends onimpalone.Imp.MCP.connect/2also gains OAuth
credentials for remote HTTP servers (Imp.MCP.OAuth),bearer_env
descriptor auth,on_failure: :dropwith anunavailablelist, and a
per-dial timeout.:reasoning_effortis the one reasoning option onImp.Clients.ReqLLM.
:openrouter_reasoningis gone; the wire encoding is the separate
:openrouter_reasoning_wire.- ReActV2 sends the tool roster natively and no longer declares a
tools
input field or writes its instructions intosignature.instructions. Loop
guidance travels to the adapter through:adapter_opts. - The
:model_responseevent'smetadata.costis a plain USD float ornil,
with any provider breakdown undermetadata.billing. - Structured values in a prompt render complete, the way DSPy renders a dict,
instead of a truncatedinspect/1.
Breaking changes from v0.3.2
- Replace
openrouter_reasoning: ...withreasoning_effort: .... Saved
programs allowlist:reasoning_effortand:openrouter_reasoning_wirein
its place, so rebuild artifacts that carried the old key. - A caller that passed or read ReActV2's
toolsinput field no longer has
one; the roster is sent natively. - A host that read
metadata.costas a provider billing map reads a number
now, and finds the map undermetadata.billingwhen the provider sent one.
Upgrade path
- Rename the reasoning option and rebuild saved artifacts with
0.4.0. - Drop any
toolshandling around ReActV2. - Sum spend from
metadata.costas a number. - If you depended on
{:imp, github: "deepfates/imp", branch: "main"}for the
adapters, move to the tag. - Run your held-out evaluation and application smoke test against the tagged
dependency.
New in this release: Benchmarks
and its results table
carry every number this repository publishes with the command that produces it,
and the ticket-routing rows were re-measured live for this release, a month
after the first run, with both runs recorded.
The CHANGELOG records every user-visible change in this
release. Generated module documentation is the complete API reference. Start
with Imp, Imp.Signature, Imp.Module, Imp.Evaluate, Imp.Optimizer,
Imp.ACP, Imp.MCP, and Imp.Telemetry.