# PRAXO-CORE Perl Core PRAXO-CORE is an embeddable, MIT-licensed agent framework. This distribution is its native Perl Core: an agent loop with tool registration and dispatch, policy hooks, typed events, memory, checkpoints, context budgets, middleware, OTel and Harmovela sinks, MCP, retriever and synchronous delegation seams, JSON Schema validation, and plugin manifest parsing. The normative contract is [`spec/`](../../spec/README.md); Go remains the reference implementation. - `SPEC_VERSION`: `0.2.0` - Core version: `0.4.0` - Tier: core - License: MIT - Dependencies: Perl core modules only (`JSON::PP`, `File::Spec`, `Cwd`) ## Registry and Coding-Agent Entry - Registry introduction: [REGISTRY.md](https://github.com/axisvela/praxo-core/blob/main/language/perl/REGISTRY.md) - Machine-readable entry: [llms.txt](https://github.com/axisvela/praxo-core/blob/main/language/perl/llms.txt) and [llms.md](https://github.com/axisvela/praxo-core/blob/main/language/perl/llms.md) - Coding-agent contract: [docs/getting-started/coding-agents.md](https://github.com/axisvela/praxo-core/blob/main/docs/getting-started/coding-agents.md) - Registry: [CPAN (MetaCPAN index)](https://metacpan.org/dist/Praxo-Core) ## Scope The Core implements all eleven vector groups: toolcall, JSON Schema, plugin, memory, event, stream, checkpoint, policy, context, middleware, and the agent loop. It includes a public API snapshot and a dependency-free test runner. The distribution root package is `Praxo::Core`; `Praxo::Agent` and the other modules remain available. ## Build and test ```bash perl language/perl/conformance/run.pl perl language/perl/api-snapshot.pl --check perl language/perl/tests/run.pl ``` ## Quickstart ```perl use lib 'language/perl/lib'; use Praxo::Models (); use Praxo::Agent (); my $model = Praxo::Agent::StaticModel->new('hello'); my $options = Praxo::Agent::AgentOptions->new($model); my $result = Praxo::Agent::run_agent( $options, Praxo::Models::session(id => 'demo'), 'hello', ); print $result->{output}; ``` Tools register on the options object: ```perl use Praxo::Agent (); my $registry = Praxo::Agent::ToolRegistry->new; $registry->register(Praxo::Agent::FuncTool->new('echo', 'Echo arguments', sub { return $_[0]; })); my $options = Praxo::Agent::AgentOptions->new($model); $options->{tools} = $registry; $options->{max_steps} = 8; ``` ## OpenAI-Compatible Model ```perl use Praxo::Adapters::OpenAICompatible (); my $model = Praxo::Adapters::OpenAICompatible->new( base_url => 'https://api.openai.com/v1', model => 'gpt-4o-mini', api_key => $ENV{PRAXO_API_KEY}, ); my $options = Praxo::Agent::AgentOptions->new($model); ``` The adapter uses non-streaming `POST /chat/completions`, maps tool calls and usage, and passes `tool_choice`, `response_format`, and `temperature` through. It uses core `HTTP::Tiny` and `JSON::PP`; no provider SDK is required. ## Anthropic and Gemini Models ```perl use Praxo::Adapters::Anthropic (); use Praxo::Adapters::Gemini (); my $claude = Praxo::Adapters::Anthropic->new( model => 'claude-sonnet-4-5', api_key => $ENV{ANTHROPIC_API_KEY}, ); my $gemini = Praxo::Adapters::Gemini->new( model => 'gemini-2.5-pro', api_key => $ENV{GEMINI_API_KEY}, ); ``` Both adapters accept a `transport` callback for deterministic tests and use core `HTTP::Tiny` otherwise. ## MCP Client Praxo::Adapters::MCP implements MCP initialize, paginated tool listing, and tool calls over an injected transport callback. ## Harmovela Event Sink `Praxo::Adapters::Harmovela` posts each event to `{base_url}/events`. ```perl use Praxo::Adapters::Harmovela (); my $sink = Praxo::Adapters::Harmovela->new( base_url => 'http://127.0.0.1:8790/aep/api', ); $options->{events} = $sink; ``` A 2xx status is success; other statuses raise `HARMOVELA_HTTP` with the status and a bounded body. Inject `transport` (and `clock`) to test without a network. The sink adds no authentication, retries, buffering, ordering, or exactly-once delivery. Use HTTPS and filter sensitive event data first. ## Layout - `lib/Praxo/` package source. - `conformance/run.pl` vector runner. - `api-snapshot.pl` and `api/` public API snapshot. - `tests/run.pl` test suite. ## Release Tag shape: `perl/v0.4.0`. The tag targets `SPEC_VERSION` `0.2.0`. CPAN publication uses `.github/workflows/perl-release.yml`; see [PUBLISHING.md](PUBLISHING.md).