Skip to content

Embedding and Resource Ownership

Use query for a procedure body, bind for a complete file, and interactive for incremental fragments. Low-level compilation is appropriate when the host owns source loading, execution, and resource cleanup.

A Complete Deterministic Host

import asyncio

from kedi.lang import compile_program, parse_program

source = """
@total(values: list[int]) -> int:
    = `sum(values)`

= `total(values)`
"""

runtime = compile_program(
    parse_program(source, source_path="<totals>"),
    runtime_globals={"values": [2, 3, 5]},
)
try:
    assert runtime.run_main() == 10
finally:
    asyncio.run(runtime.aclose())

No model is called. In an async host, use await runtime.aclose() in its existing event loop rather than nesting asyncio.run. Close caller-owned adapters and external clients according to their integration's contract.

Which Configuration Surface?

Entry point Owns Does not provide
configure, context Default/temporary backend, profile and execution options A running incremental session
query, bind Callable-local overrides and optional response memoization Executor or subagent-limit constructor parameters
interactive Incremental runtime; executor, engine, cwd, subagent limits Parallel or re-entrant fragment execution
compile_program Parsed program and low-level runtime construction High-level decorator configuration merging
session Shared conversation/artifact lifetime across separate calls Persistent Kedi variables or declaration frames

Do not pass an executor or subagent limit through configure(**adapter_kwargs) expecting it to configure the runtime. Those extra kwargs construct the adapter. See Public Parameters for accepted names.

Bound Agent Surfaces

AgentSurface binds a prepared agent, profile, tool specifications, and optional conversation/artifact manager for a complete native run. Its constructor takes agent, profile, tool_specs, conversation_state, optional artifact_manager, and close_conversation_state=False.

Keep run_scope() open for the complete run or stream consumption. A surface rejects overlapping runs, use after close, and close during an active run. close()/aclose() are idempotent and close the conversation only when explicitly requested. The caller still owns the adapter and runtime. This is an advanced integration surface, not a replacement for the ordinary decorators.

Error Ownership

A context manager restores configuration, not external side effects. A failed fragment may leave earlier writes committed. Catch KediExecutionError from kedi.errors to inspect Kedi frames and the original exception; never interpret an execution failure as a valid empty result. Interactive persistence failures use SessionPersistenceError, with SessionDumpError and SessionLoadError identifying the operation.