A

AgentJev 0.6B

AgentJevv0.6BCurrent
Released September 21, 2026
Context2.0K tokens
CategoryDecision Model

About AgentJev 0.6B

AgentJev 0.6B is a fast decision model for AI agent loops. The GitHub README describes a Qwen3-0.6B-backed model that takes unstructured state plus typed boolean, choice, or score questions and returns probability distributions without decoded output tokens.

Capabilities

classificationroutingagent decisioningprobability scoring

Input Modalities

textstructured-state

Output Modalities

probability-distribution

Technical Details

API Identifier
aimeigaoshou/agent-jev
Category
Decision Model
Context Window
2,048 tokens

Tags

agent-jevdecision-modelagent-routingqwen3open-weightsprobability-scoringai-agents

Run this model yourself

Local and cloud setup for AgentJev 0.6B, with exact configurations, sources and clear evidence limits.

Find a model for your hardware
Local hardwareDocumented setupSources checked Oct 17, 2026

Score boolean, choice and ordered decisions with AgentJev v1 on an owned CPU desktop

Serve the complete trained AgentJev v1 backbone and decision head in CPU float32. A private serial endpoint checks a fictional library schedule with all three native primitives and full relative probability distributions. Each complete causal candidate path is bounded at 2048 tokenizer positions; there is no language decoding or generated output budget. Native calibration is preserved. Memory fit, speed and domain accuracy remain unmeasured.

Hardware
Intel Core i5-12400 desktop, 4 inference threads, 32 GiB RAM
Runtime
Native AgentJev v1 complete CPU FP32 decision backbone and head Source3b0042a; Torch2.6.0CPU; Transformers4.57.6; Python3.12 · CPU
Model format
safetensors · CPU FP32, strict complete state; exact v1 size/hash/BF16 header required despite HF F32 summary. · Native v1 serialized BF16 per publisher verifier; explicit CPU FP32 execution
Workload
2,048 token context · 1 concurrent

Based on source documentation; this setup has not been executed by OpenTools. Memory: unknown. No compatible measurement available.

Read the complete setup guide

Before you start

  • Use an owned Intel Core i5-12400 Ubuntu 24.04 x86_64 workstation with 32 GiB RAM and 40 GiB free disk; allocate four CPU threads. Verify actual installed resources.
  • Read the pinned native Apache 2.0 source license and v1 card plus upstream notice. Retain notices and review applicable conditions; no legal clearance is asserted.
  • Use the complete exact v1 checkpoint, calibration and tokenizer assets. Do not substitute the later default-branch F32 checkpoint, a language decoder, separate base weights, adapters or a routing-only fine-tune.
  • Python 3.12, CPU Torch 2.6.0 and Transformers 4.57.6 are explicit source-qualified reader choices. Native pyproject requires Torch at least 2.5 despite older README wording; resolved transitive packages must be recorded. No installation or model execution was performed by the author.
  • This private educational workflow accepts bounded text states and all three decision primitives. The supplied original fictional library fixture is low stakes; probabilities do not establish domain calibration, truth, safety or permission to automate actions.

Exact model and requirements

Artifact:
aimeigaoshou (native release), malevrigns (official source) / AgentJev v1 complete trained Qwen3 backbone and candidate decision head · checkpoint aimeigaoshou/agent-jev v1
Publisher revision:
7d433994fbde17a3f0993c2f2b02fe8ca1370db1
Artifact digest:
sha256:8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215
Download size:
1.11 GiB
Memory requirement (unknown):
Unknown — No measured peak for both networks, CPU tensors, native decoding, dependencies and serialization.
System RAM / disk:
Unknown / Unknown
Placement:
single device. One CPU host; path microbatch one, serial HTTP request handling. Complete trained backbone and head on CPU; no separate language decoder, base weights, GPU or offload.
KV cache:
Complete independent causal paths use native backbone use_cache=False; no autoregressive output decoding or shared-prefix compute is requested.
Workload:
2,048 token context; Unknown; Not applicable; concurrency 1; batch 1; cache unknown; repetitions Unknown.
Tokenizer:
Exact v1 local Qwen3 tokenizer, native path framing without added special tokens · 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
Sampling / reasoning:
No autoregressive sampler. Exact pinned boolean, choice and score temperature scalars are loaded and checked against the complete native calibration file; these are relative head distributions, not arbitrary-domain calibration or action-success probabilities. Each candidate is a complete causal [STATE], [QUESTION], [CANDIDATE] path. The bare v1 strict safetensors route has no training config and rejects paths beyond 2048 rather than truncating. Native config positional capacity 32768 is distinct from this service bound. Boolean returns true mass and threshold; choice returns relative argmax, top probability and margin; score returns ordered expected level plus argmax. Transport identifiers are not semantic inputs; no tool or action executes.
Runtime prerequisites:
Ubuntu24.04 x86_64; See prerequisites above.

Official artifact · License

The native source contains Apache 2.0 and the exact v1 model card declares Apache 2.0; the snapshot lists no separate license file. Retain applicable copyright, license, notices and modification notices; Apache trademark and patent conditions apply. The identified Qwen3 upstream currently publishes Apache 2.0 too, but its training revision and Base versus non-Base labeling are not proven by these sources. Source access is not legal clearance or permission for unrelated data. No decision accuracy or fitness guarantee.

  • temperatures.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • config.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • tokenizer.json · 0.01 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • tokenizer_config.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • vocab.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • merges.txt · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • Native model file is 1,196,881,242 bytes; all seven required release assets total 1,208,372,367 bytes. These are artifact sizes, not RAM requirements.
  • Publisher verifier counts 598,418,689 parameter elements; their FP32 storage lower bound is 2,393,674,756 bytes before loading copies, activations, masks, tokenizer, libraries and OS. Peak and fit remain unknown.
  • Four CPU threads, 32 GiB RAM and 40 GiB free disk are planning allocations, not measured minima.

One-time setup and hardware

hardware
Unknown — Existing desktop purchase price and incremental hardware cost depend on the reader; unknown.
Existing desktop purchase price and incremental hardware cost depend on the reader; unknown. Tax: unknown.
setup
Unknown — Initial provisioning/build time and labor cost are unknown.
Initial provisioning/build time and labor cost are unknown. Tax: unknown.

Recurring costs

electricity
Unknown — Actual wall power, electricity rate and powered hours are unknown; no TDP-to-wall-power conversion.
Actual wall power, electricity rate and powered hours are unknown; no TDP-to-wall-power conversion. Tax: unknown.
storage
Unknown — Incremental cost of local disk capacity is unknown. The 40 GiB free-disk walkthrough allocation is an author choice, not a measured requirement.
Incremental cost of local disk capacity is unknown. The 40 GiB free-disk walkthrough allocation is an author choice, not a measured requirement. Tax: unknown.
egress
Unknown — Data transfer price, allowances and traffic volume are unknown.
Data transfer price, allowances and traffic volume are unknown. Tax: unknown.
administration
Unknown — Maintenance labor rate and hours are unknown.
Maintenance labor rate and hours are unknown. Tax: unknown.

Install the runtime

  1. 1. Install the exact native CPU dependency path

    Use the official hashed CPU wheel and complete pinned source package without stripping dependencies. The imported native losses, data, model, encoders and service path are source-audited. Eager Qwen3 attention is selected through the released Transformers API; no CUDA driver or flash-attention package is required. Record the resolved environment; target execution remains unverified.

    Command
    set -e
    sudo apt-get update
    sudo apt-get install -y python3.12 python3.12-venv git curl ca-certificates openssl
    mkdir -p "$HOME/agentjev-v1-hosting/model"
    cd "$HOME/agentjev-v1-hosting"
    python3.12 -m venv .venv
    .venv/bin/python -m pip install 'https://download.pytorch.org/whl/cpu/torch-2.6.0%2Bcpu-cp312-cp312-linux_x86_64.whl#sha256=59e78aa0c690f70734e42670036d6b541930b8eabbaa18d94e090abf14cc4d91'
    git clone https://github.com/malevrigns/agent-jev.git runtime
    git -C runtime checkout --detach 3b0042a6171124c5d2942748ae01f453ed2cce61
    test "$(git -C runtime rev-parse HEAD)" = '3b0042a6171124c5d2942748ae01f453ed2cce61'
    .venv/bin/python -m pip install 'transformers==4.57.6' 'numpy==1.26.4' 'PyYAML==6.0.2' 'tqdm==4.67.1' 'safetensors==0.6.2' -e ./runtime
    .venv/bin/python -m pip check
    .venv/bin/python -m pip freeze > resolved-environment.txt

    Expected result: Pinned source checkout, direct package versions and pip check succeed; resolved environment saved. Stop on any dependency failure.

Download the model

  1. 1. Download all seven exact v1 assets and notices

    All hashes and sizes come from the native release verifier and pinned public metadata. Download no alternate branch. The wrapper checks every size and digest and the publisher BF16 header composition before importing the native loader. HF API F32 summary disagrees with the verifier; a mismatch is a stop, not permission to relabel the release.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    curl --fail --location --output model/model.safetensors 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/model.safetensors'
    curl --fail --location --output model/temperatures.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/temperatures.json'
    curl --fail --location --output model/config.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/config.json'
    curl --fail --location --output model/tokenizer.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/tokenizer.json'
    curl --fail --location --output model/tokenizer_config.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/tokenizer_config.json'
    curl --fail --location --output model/vocab.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/vocab.json'
    curl --fail --location --output model/merges.txt 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/merges.txt'
    sha256sum --check <<'SHA256'
    8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215  model/model.safetensors
    5e5032896d77c72feb86b4725abe418488b8a1c7476014c706bd8215eb43c86c  model/temperatures.json
    504a6b58c4271583724e66584b6b7698aea18450209df6b2f7582df0e89cee59  model/config.json
    c0382117ea329cdf097041132f6d735924b697924d6f6fc3945713e96ce87539  model/tokenizer.json
    3c04ed3ca964ea2f6b2b5faf0dc4d31aec1cb1e8b4bcf63f402d295046b422b5  model/tokenizer_config.json
    ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910  model/vocab.json
    8831e4f1a044471340f7c0a83d7bd71306a5b867e95fd870f74d0c5308a904d5  model/merges.txt
    SHA256
    curl --fail --location --output AGENTJEV-LICENSE 'https://raw.githubusercontent.com/malevrigns/agent-jev/3b0042a6171124c5d2942748ae01f453ed2cce61/LICENSE'
    printf '%s  %s\n' 'f4d9b0aad8ff9e650f5890fa3eeb7c1311479cab901f8a9b416a2d9acaf54266' 'AGENTJEV-LICENSE' | sha256sum --check
    curl --fail --location --output QWEN-UPSTREAM-LICENSE 'https://huggingface.co/Qwen/Qwen3-0.6B-Base/resolve/da87bfb608c14b7cf20ba1ce41287e8de496c0cd/LICENSE'
    printf '%s  %s\n' '832dd9e00a68dd83b3c3fb9f5588dad7dcf337a0db50f7d9483f310cd292e92e' 'QWEN-UPSTREAM-LICENSE' | sha256sum --check

    Expected result: Every asset and both retained notices pass SHA checks. Native weights have not been fetched by the author.

Configure

  1. 1. Write the manifest, original fixture and persistent key

    Create a key only when absent; an empty existing key must fail rather than silently rotate. Protect files and review the original synthetic state and criteria.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    cat > release-manifest.json <<'MANIFEST'
    {
      "repository": "aimeigaoshou/agent-jev",
      "revision": "7d433994fbde17a3f0993c2f2b02fe8ca1370db1",
      "files": [
        {
          "path": "model.safetensors",
          "bytes": 1196881242,
          "sha256": "8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215"
        },
        {
          "path": "temperatures.json",
          "bytes": 389,
          "sha256": "5e5032896d77c72feb86b4725abe418488b8a1c7476014c706bd8215eb43c86c"
        },
        {
          "path": "config.json",
          "bytes": 727,
          "sha256": "504a6b58c4271583724e66584b6b7698aea18450209df6b2f7582df0e89cee59"
        },
        {
          "path": "tokenizer.json",
          "bytes": 7031645,
          "sha256": "c0382117ea329cdf097041132f6d735924b697924d6f6fc3945713e96ce87539"
        },
        {
          "path": "tokenizer_config.json",
          "bytes": 9678,
          "sha256": "3c04ed3ca964ea2f6b2b5faf0dc4d31aec1cb1e8b4bcf63f402d295046b422b5"
        },
        {
          "path": "vocab.json",
          "bytes": 2776833,
          "sha256": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910"
        },
        {
          "path": "merges.txt",
          "bytes": 1671853,
          "sha256": "8831e4f1a044471340f7c0a83d7bd71306a5b867e95fd870f74d0c5308a904d5"
        }
      ]
    }
    MANIFEST
    cat > fixture.json <<'FIXTURE'
    {
      "id": "original-library-schedule",
      "state": "A fictional community library opens weekdays 9am–6pm, Saturday 10am–4pm, and is closed Sunday. These are original synthetic facts for a low-stakes demonstration.",
      "questions": [
        {
          "id": "sunday",
          "type": "boolean",
          "question": "Is the library open on Sunday according to this state?",
          "criteria": {
            "true": "The supplied state says it is open Sunday.",
            "false": "The supplied state says it is closed Sunday."
          }
        },
        {
          "id": "saturday-hours",
          "type": "choice",
          "question": "How many hours is the library open on Saturday?",
          "options": {
            "four": "Four hours.",
            "six": "Six hours.",
            "nine": "Nine hours."
          }
        },
        {
          "id": "weekday-duration",
          "type": "score",
          "question": "Rate the weekday opening duration by the ordered definitions.",
          "levels": [
            "At most four hours open per weekday.",
            "More than four but at most eight hours open per weekday.",
            "More than eight hours open per weekday."
          ]
        }
      ]
    }
    FIXTURE
    if [ ! -e .api-key ]; then (umask 077; openssl rand -hex 32 > .api-key); fi
    test -s .api-key
    chmod 600 .api-key

    Expected result: Manifest and fictional fixture saved; private nonempty key retained.

  2. 2. Write request and result boundaries

    Reader-authored service code is independent of publisher HTTP serving code. It rejects unknown fields, duplicate JSON keys, unsupported content framing and malformed probability algebra. No publisher model code executes while writing this file.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    cat > reader-decision-server.py <<'PYWRAPPER'
    """Reader-authored serial private AgentJev decision service; no native imports at import time."""
    import hashlib,hmac,json,math,pathlib,re,socket,struct
    from http.server import HTTPServer,BaseHTTPRequestHandler
    PORT=8999
    EXPECTED_WEIGHT='8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215'
    def digest(path):
     h=hashlib.sha256()
     with open(path,'rb')as f:
      for b in iter(lambda:f.read(4*1024*1024),b''):h.update(b)
     return h.hexdigest()
    def verify_files(root,manifest):
     for row in manifest:
      f=root/row['path']
      if not f.is_file()or f.stat().st_size!=row['bytes']or digest(f)!=row['sha256']:raise ValueError('Pinned release asset mismatch')
    def header_check(path):
     with open(path,'rb')as f:
      raw=f.read(8)
      if len(raw)!=8:raise ValueError('Missing safetensors header')
      n=struct.unpack('<Q',raw)[0]
      if not 1<=n<=1048576:raise ValueError('Header bound')
      h=json.loads(f.read(n))
     tensors=[v for k,v in h.items()if k!='__metadata__']
     if len(tensors)!=343 or any(v.get('dtype')!='BF16'for v in tensors):raise ValueError('Expected exact publisher v1 BF16 header; metadata discrepancy is not waived')
     total=0
     for v in tensors:
      shape=v.get('shape')
      if not isinstance(shape,list)or any(type(x)is not int or x<0 for x in shape):raise ValueError('Invalid shape')
      total+=math.prod(shape)
     if total!=598418689:raise ValueError('Full parameter composition mismatch')
    def parse_request(raw):
     def unique(pairs):
      d={}
      for k,v in pairs:
       if k in d:raise ValueError('Duplicate field')
       d[k]=v
      return d
     p=json.loads(raw.decode('utf-8'),object_pairs_hook=unique,parse_constant=lambda _:(_ for _ in()).throw(ValueError('Nonfinite JSON')))
     if not isinstance(p,dict)or set(p)!={'id','state','questions'}:raise ValueError('Exact state request schema')
     def text(v,limit):
      if not isinstance(v,str)or not v.strip()or len(v.encode())>limit or any(x in v for x in ['[STATE]','[QUESTION]','[CANDIDATE]']):raise ValueError('Bounded plain text required')
     text(p['id'],80);text(p['state'],4096)
     if not isinstance(p['questions'],list)or not 1<=len(p['questions'])<=3:raise ValueError('One to three questions required')
     ids=set()
     for q in p['questions']:
      if not isinstance(q,dict):raise ValueError('Question object required')
      t=q.get('type')
      if not isinstance(t,str):raise ValueError('Typed primitive string required')
      extra={'boolean':'criteria','choice':'options','score':'levels'}.get(t)
      if extra is None or set(q)!={'id','type','question',extra}:raise ValueError('Exact typed question schema')
      text(q['id'],80);text(q['question'],1024)
      if q['id']in ids:raise ValueError('Duplicate question id')
      ids.add(q['id']);v=q[extra]
      if t=='boolean':
       if not isinstance(v,dict)or set(v)!={'true','false'}:raise ValueError('Both boolean criteria required')
       vals=list(v.values())
      elif t=='choice':
       if not isinstance(v,dict)or not 2<=len(v)<=8:raise ValueError('Two to eight choice options')
       for k in v:text(k,80)
       vals=list(v.values())
      else:
       if not isinstance(v,list)or not 2<=len(v)<=5:raise ValueError('Two to five ordered score levels')
       vals=v
      for v in vals:text(v,1024)
      if len(set(vals))!=len(vals):raise ValueError('Distinct descriptions required')
     return p
    def request_length(headers):
     vals=headers.get_all('Content-Length',[])
     if headers.get('Transfer-Encoding')is not None or len(vals)!=1 or not re.fullmatch('[0-9]{1,5}',vals[0]):raise ValueError('One bounded decimal length')
     n=int(vals[0])
     if not 1<=n<=16384:raise ValueError('Body outside limit')
     return n
    def validate_result(request,result):
     if result.get('api_version')!='agentjev.decision.v1':raise ValueError('Native API version mismatch')
     usage=result.get('usage',{})
     if any(type(usage.get(k))is not int or usage[k]!=0 for k in ['generated_tokens','truncated_inputs']):raise ValueError('No decoding or truncation allowed')
     rows=result.get('results');questions=request['questions']
     if not isinstance(rows,list)or len(rows)!=1 or rows[0].get('id')!=request['id']:raise ValueError('Native state identity mismatch')
     answers=rows[0].get('answers')
     if not isinstance(answers,list)or len(answers)!=len(questions):raise ValueError('Missing typed answers')
     paths=0
     for q,a in zip(questions,answers):
      t=q['type'];keys=['true','false']if t=='boolean'else list(q['options'])if t=='choice'else[str(i)for i in range(len(q['levels']))];paths+=len(keys)
      dist=a.get('distribution')
      if a.get('id')!=q['id']or a.get('type')!=t or not isinstance(dist,dict)or list(dist)!=keys:raise ValueError('Typed answer identity mismatch')
      probs=list(dist.values())
      if any(type(x)not in(int,float)or not math.isfinite(x)or not 0<=x<=1 for x in probs)or abs(sum(probs)-1)>1e-4:raise ValueError('Invalid finite distribution')
      best=max(range(len(probs)),key=probs.__getitem__)
      def close(a,b):return type(a)in(int,float)and math.isfinite(a)and abs(a-b)<=1e-6
      if t=='boolean':
       if type(a.get('value'))is not bool or a['value']!=(probs[0]>=.5)or not close(a.get('probability'),probs[0]):raise ValueError('Boolean semantics mismatch')
      elif t=='choice':
       ranked=sorted(probs,reverse=True)
       if a.get('value')!=keys[best]or a.get('description')!=q['options'][keys[best]]or not close(a.get('top_probability'),probs[best])or not close(a.get('margin'),ranked[0]-ranked[1]):raise ValueError('Relative choice semantics mismatch')
      elif type(a.get('level'))is not int or a['level']!=best or a.get('legend')!=q['levels']or not close(a.get('score'),sum(i*x for i,x in enumerate(probs))):raise ValueError('Ordered expected-score semantics mismatch')
     if usage.get('questions')!=len(questions)or usage.get('candidate_paths')!=paths or type(usage.get('input_path_tokens'))is not int or not paths<=usage['input_path_tokens']<=paths*2048:raise ValueError('Native path usage mismatch')
     return result
    PYWRAPPER

    Expected result: First wrapper portion saved.

  3. 3. Write strict native loading and serial loopback HTTP

    Startup verifies every native file and header before loading the complete trained state with strict=True. It checks CPU FP32, all three calibration scalars and native identity/path mode. It has a 30 second socket-read timeout, no native inference deadline and no public-service hardening.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    cat >> reader-decision-server.py <<'PYWRAPPER'
    class Engine:
     def __init__(self,root):
      import os
      manifest=json.loads((root/'release-manifest.json').read_text())['files'];verify_files(root/'model',manifest);header_check(root/'model/model.safetensors')
      os.environ.update(HF_HUB_OFFLINE='1',TRANSFORMERS_OFFLINE='1')
      import torch
      from jev_service.engine import DecisionEngine
      from jev_service.contract import prepare,encode_paths
      torch.set_default_dtype(torch.float32);torch.set_num_threads(4);torch.set_num_interop_threads(1)
      self.engine=DecisionEngine(root/'model/model.safetensors',str(root/'model'),device='cpu',max_tokens=2048,path_batch=1,encoder='path',temperatures=root/'model/temperatures.json')
      self.engine.model.path_encoder.backbone.set_attn_implementation('eager')
      if self.engine.model.path_encoder.backbone.config._attn_implementation!='eager':raise ValueError('Explicit eager attention required')
      if any(p.is_floating_point()and p.dtype!=torch.float32 for p in self.engine.model.parameters()):raise ValueError('CPU FP32 parameters required')
      info=self.engine.info();expected=json.loads((root/'model/temperatures.json').read_text());temps={k:v['temperature']for k,v in expected.items()}
      if set(temps)!={'boolean','choice','score'}or temps!={'boolean':1.0717734625362931,'choice':1.0352649238413776,'score':1.0717734625362931}:raise ValueError('Complete exact calibration required')
      if info['api_version']!='agentjev.decision.v1'or info['checkpoint_sha256']!=EXPECTED_WEIGHT or info['encoder']!='path'or info['max_path_tokens']!=2048 or info['temperatures']!=temps or info['types']!=['boolean','choice','score']or info['output_token_decoding']is not False or info['shared_prefix_compute']is not False:raise ValueError('Native release/calibration identity mismatch')
      self.prepare=prepare;self.encode_paths=encode_paths;self.info=info
     def evaluate(self,request):
      paths,_,_=self.encode_paths(self.prepare(request),self.engine.tokenizer,2048)
      if not paths or any(not p or len(p)>2048 for p in paths):raise ValueError('Complete per-path bound')
      return validate_result(request,self.engine.evaluate(request))
    def serve(engine,key):
     class Handler(BaseHTTPRequestHandler):
      protocol_version='HTTP/1.0'
      def setup(self):super().setup();self.connection.settimeout(30)
      def log_message(self,*a):pass
      def reply(self,status,obj):
       b=json.dumps(obj,ensure_ascii=False,allow_nan=False).encode();self.send_response(status);self.send_header('Content-Type','application/json');self.send_header('Content-Length',str(len(b)));self.end_headers();self.wfile.write(b)
      def auth(self):
       v=self.headers.get_all('Authorization',[])
       try:return len(v)==1 and hmac.compare_digest(v[0].encode('ascii'),('Bearer '+key).encode('ascii'))
       except UnicodeError:return False
      def do_GET(self):
       if not self.auth():return self.reply(401,{'error':'Unauthorized'})
       if self.path!='/health':return self.reply(404,{'error':'Not found'})
       return self.reply(200,{'ready':True,'native':engine.info,'reader_path_microbatch':1,'reader_context_per_path':2048})
      def do_POST(self):
       if not self.auth():return self.reply(401,{'error':'Unauthorized'})
       if self.path!='/api/evaluate':return self.reply(404,{'error':'Not found'})
       try:
        if self.headers.get('Content-Type')!='application/json':raise ValueError('JSON required')
        n=request_length(self.headers);b=self.rfile.read(n)
        if len(b)!=n:raise ValueError('Incomplete body')
        req=parse_request(b)
       except(ValueError,UnicodeError,socket.timeout):return self.reply(400,{'error':'Invalid bounded request'})
       try:out=engine.evaluate(req)
       except Exception:return self.reply(422,{'error':'Native path or finite-distribution check failed; no action executed'})
       return self.reply(200,out)
     server=HTTPServer(('127.0.0.1',PORT),Handler)
     try:server.serve_forever()
     finally:server.server_close()
    if __name__=='__main__':
     root=pathlib.Path(__file__).resolve().parent;key=(root/'.api-key').read_text().strip()
     if not re.fullmatch('[a-f0-9]{64}',key):raise ValueError('Restore private service key')
     serve(Engine(root),key)
    PYWRAPPER
    printf '%s  %s\n' 'a997d981592ccc21575be799483bf41f65ce43990175e579936cc643d5d59cce' 'reader-decision-server.py' | sha256sum --check
    .venv/bin/python -m py_compile reader-decision-server.py

    Expected result: Exact wrapper SHA and Python syntax pass; no inference has run.

Start the model

  1. 1. Start the private CPU decision service

    Run in a foreground shell. Four intra-op threads and one inter-op thread are explicit CPU settings. Complete independent candidate paths use native path microbatch one and no shared-prefix compute. Health means initialized and checked, not successful model inference.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    export OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1
    .venv/bin/python reader-decision-server.py

    Expected result: Exact native checkpoint/calibration identity checks pass and port 8999 binds only to loopback. Any size, hash, header, state-key, dtype or attention failure aborts startup.

Connect to your endpoint

http://127.0.0.1:8999/api/evaluate

Trusted workstation loopback only; supplied verification runs on that workstation.

Access: loopback. A locally generated private Bearer key is required for health and evaluation. Requests contain one state and one to three typed questions. Complete native answer distributions and zero decoding usage are returned. This serial reader wrapper has no TLS, public exposure or multiuser isolation; protect host files and SSH credentials.

Verify the setup

  1. 1. Verify authentication, native algebra and grounded fixture

    Run in a second shell on the same host. Require unauthorized health to return 401, then check native identity and all three primitives. The checker independently revalidates complete distributions and manual fixture answers: Sunday closed, Saturday six hours, weekday duration above eight hours. Score is the probability-weighted ordinal expectation, not forced to its argmax. Wrong preferred alternatives fail; passing one fixture is not accuracy evidence.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    .venv/bin/python - <<'PYVERIFY'
    import json,urllib.request,urllib.error,pathlib
    root=pathlib.Path.cwd();key=(root/'.api-key').read_text().strip();base='http://127.0.0.1:8999'
    try:urllib.request.urlopen(base+'/health',timeout=10)
    except urllib.error.HTTPError as e:assert e.code==401
    else:raise AssertionError('Missing authentication rejection')
    h=json.load(urllib.request.urlopen(urllib.request.Request(base+'/health',headers={'Authorization':'Bearer '+key}),timeout=30))
    assert h['ready']is True and h['native']['types']==['boolean','choice','score']
    assert h['native']['output_token_decoding']is False and h['native']['shared_prefix_compute']is False
    assert h['native']['checkpoint_sha256']=='8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215'
    request=json.loads((root/'fixture.json').read_text());body=json.dumps(request).encode()
    r=urllib.request.Request(base+'/api/evaluate',data=body,headers={'Authorization':'Bearer '+key,'Content-Type':'application/json'})
    out=json.load(urllib.request.urlopen(r,timeout=900));(root/'result.json').write_text(json.dumps(out,indent=2)+'\n')
    from importlib.util import spec_from_file_location,module_from_spec
    s=spec_from_file_location('reader',root/'reader-decision-server.py');module=module_from_spec(s);s.loader.exec_module(module)
    module.validate_result(request,out)
    a=out['results'][0]['answers'];assert a[0]['value']is False and a[1]['value']=='six' and a[2]['level']==2
    assert out['usage']['generated_tokens']==0 and out['usage']['truncated_inputs']==0
    print(json.dumps(out,indent=2));print('Fixture structure and grounded preferred alternatives pass; no domain accuracy guarantee.')
    PYVERIFY

    Expected result: Complete native result is saved. All native probabilities are finite, normalized and consistent with boolean mass, choice argmax/margin and ordinal expectation; eight candidate paths and zero generated tokens are checked.

Performance evidence

No compatible measurement available. Documented support and estimated memory do not establish response speed.

Limits and troubleshooting

  • Documentation and source checks only: no weights, native model imports, tokenizer execution, installation, build, inference, fit, latency or quality measurements were performed.
  • Native v1 verifier expects 343 BF16 tensors while HF API safetensors summary says F32. Exact release size, SHA and header composition must all pass before strict whole-state loading; do not replace with the later checkpoint.
  • The integrated model is a trained Qwen3 backbone plus candidate head, not a language decoder or adapter. CPU defaults and this explicit reader path use FP32; README BF16 examples do not establish CPU dtype.
  • Native path limit is 2048 positions including complete state/question/candidate framing. Sums across eight fixture paths do not share this context bound. The service refuses overlength paths and reports truncated_inputs zero; there is no generated output budget.
  • Native source accepts larger candidate counts; this reader boundary allows at most three questions, eight choice candidates or five ordered score levels, a 16 KiB body and bounded UTF-8 fields. Requests are serial and there is no inference deadline.
  • The native calibration file is preserved and all three scalars checked. Boolean and relative choice probabilities and ordered expected scores are model distributions; arbitrary-domain calibration, action success and correctness are unknown. No external action executes.
  • The original fictional fixture checks meaningful outputs for all three native primitives. A protocol pass or preferred answer is not a general model accuracy benchmark.
  • Native source package metadata says version 1.0.0 while its module reports 0.1.0; exact source commit governs. Training upstream revision and Base versus non-Base model-card labeling remain unresolved provenance details.
  • 32 GiB RAM and 40 GiB disk are planning allocations. Full load copies, CPU activations and scratch add to the FP32 parameter lower bound; actual required memory, fit, speed, quality and task spend are unknown.
  • Larger batches, shared-prefix encoders, routing-only checkpoints, GPU execution and other native workflows remain open. Required family guide total is null; this pair is not exhaustive.
Native asset, header or strict state load fails
Stop. Restore the exact seven v1 files and inspect actual diagnostics; do not waive missing keys, switch to another checkpoint or conceal the dtype discrepancy.
Path too long or invalid native distribution
Treat the request as failed. Shorten the complete state/question/candidate paths deliberately; do not truncate or clamp probabilities, margins or ordinal scores.
HTTP 401 or loopback connection failure
Check the exact service key, foreground process and intended workstation loopback port.
Out of memory or very slow inference
Stop and preserve actual logs. Planning allocations and parameter storage do not prove fit or latency. Any larger resource choice needs its own reviewed configuration.

Stop the model

  1. 1. Stop the foreground service

    Press Ctrl+C in the server shell, then confirm the intended listener is gone.

    Command
    curl --max-time 3 --fail http://127.0.0.1:8999/health

    Expected result: Connection is refused after shutdown. A 401 indicates the service is still running; an auth rejection is not stopped proof.

Uninstall

  1. 1. Remove the dedicated files

    Preserve desired result, environment record and notices first. Verify the exact dedicated path before removing its private key, assets, source and environment. Shared Ubuntu packages remain.

    Command
    rm -r -- "$HOME/agentjev-v1-hosting"

    Expected result: Dedicated source, model, virtual environment, fixture, results and key removed.

Sources and verification

Sources checked Oct 17, 2026. Verification source

Compare this configuration
Cloud serverDocumented setupSources checked Oct 17, 2026

Score boolean, choice and ordered decisions with AgentJev v1 on a private AWS CPU host

Serve the complete trained AgentJev v1 backbone and decision head in CPU float32. A private serial endpoint checks a fictional library schedule with all three native primitives and full relative probability distributions. Each complete causal candidate path is bounded at 2048 tokenizer positions; there is no language decoding or generated output budget. Native calibration is preserved. Memory fit, speed and domain accuracy remain unmeasured.

Hardware
AWS r7i.xlarge, 32 GiB RAM, Ubuntu x86_64
Runtime
Native AgentJev v1 complete CPU FP32 decision backbone and head Source3b0042a; Torch2.6.0CPU; Transformers4.57.6; Python3.12 · CPU
Model format
safetensors · CPU FP32, strict complete state; exact v1 size/hash/BF16 header required despite HF F32 summary. · Native v1 serialized BF16 per publisher verifier; explicit CPU FP32 execution
Workload
2,048 token context · 1 concurrent

Based on source documentation; this setup has not been executed by OpenTools. Memory: unknown. No compatible measurement available.

Read the complete setup guide

Before you start

  • Use an existing private AWS r7i.xlarge Ubuntu 24.04 x86_64 host in us-east-1 with 4 vCPU, 32 GiB RAM and 40 GiB disk. Keep port 8999 closed publicly; use an existing trusted SSH identity.
  • Read the pinned native Apache 2.0 source license and v1 card plus upstream notice. Retain notices and review applicable conditions; no legal clearance is asserted.
  • Use the complete exact v1 checkpoint, calibration and tokenizer assets. Do not substitute the later default-branch F32 checkpoint, a language decoder, separate base weights, adapters or a routing-only fine-tune.
  • Python 3.12, CPU Torch 2.6.0 and Transformers 4.57.6 are explicit source-qualified reader choices. Native pyproject requires Torch at least 2.5 despite older README wording; resolved transitive packages must be recorded. No installation or model execution was performed by the author.
  • This private educational workflow accepts bounded text states and all three decision primitives. The supplied original fictional library fixture is low stakes; probabilities do not establish domain calibration, truth, safety or permission to automate actions.

Exact model and requirements

Artifact:
aimeigaoshou (native release), malevrigns (official source) / AgentJev v1 complete trained Qwen3 backbone and candidate decision head · checkpoint aimeigaoshou/agent-jev v1
Publisher revision:
7d433994fbde17a3f0993c2f2b02fe8ca1370db1
Artifact digest:
sha256:8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215
Download size:
1.11 GiB
Memory requirement (unknown):
Unknown — No measured peak for both networks, CPU tensors, native decoding, dependencies and serialization.
System RAM / disk:
Unknown / Unknown
Placement:
single device. One CPU host; path microbatch one, serial HTTP request handling. Complete trained backbone and head on CPU; no separate language decoder, base weights, GPU or offload.
KV cache:
Complete independent causal paths use native backbone use_cache=False; no autoregressive output decoding or shared-prefix compute is requested.
Workload:
2,048 token context; Unknown; Not applicable; concurrency 1; batch 1; cache unknown; repetitions Unknown.
Tokenizer:
Exact v1 local Qwen3 tokenizer, native path framing without added special tokens · 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
Sampling / reasoning:
No autoregressive sampler. Exact pinned boolean, choice and score temperature scalars are loaded and checked against the complete native calibration file; these are relative head distributions, not arbitrary-domain calibration or action-success probabilities. Each candidate is a complete causal [STATE], [QUESTION], [CANDIDATE] path. The bare v1 strict safetensors route has no training config and rejects paths beyond 2048 rather than truncating. Native config positional capacity 32768 is distinct from this service bound. Boolean returns true mass and threshold; choice returns relative argmax, top probability and margin; score returns ordered expected level plus argmax. Transport identifiers are not semantic inputs; no tool or action executes.
Runtime prerequisites:
Ubuntu24.04 x86_64; See prerequisites above.

Official artifact · License

The native source contains Apache 2.0 and the exact v1 model card declares Apache 2.0; the snapshot lists no separate license file. Retain applicable copyright, license, notices and modification notices; Apache trademark and patent conditions apply. The identified Qwen3 upstream currently publishes Apache 2.0 too, but its training revision and Base versus non-Base labeling are not proven by these sources. Source access is not legal clearance or permission for unrelated data. No decision accuracy or fitness guarantee.

  • temperatures.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • config.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • tokenizer.json · 0.01 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • tokenizer_config.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • vocab.json · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • merges.txt · 0 GiB · revision 7d433994fbde17a3f0993c2f2b02fe8ca1370db1
  • Native model file is 1,196,881,242 bytes; all seven required release assets total 1,208,372,367 bytes. These are artifact sizes, not RAM requirements.
  • Publisher verifier counts 598,418,689 parameter elements; their FP32 storage lower bound is 2,393,674,756 bytes before loading copies, activations, masks, tokenizer, libraries and OS. Peak and fit remain unknown.
  • Four CPU threads, 32 GiB RAM and 40 GiB free disk are planning allocations, not measured minima.

One-time setup and hardware

hardware
Not applicable — AWS hardware acquisition is included in compute rental; no purchased GPU required. Any separate hardware cost is not applicable.
AWS hardware acquisition is included in compute rental; no purchased GPU required. Any separate hardware cost is not applicable. Tax: unknown.
setup
Unknown — Initial provisioning/build time and labor cost are unknown.
Initial provisioning/build time and labor cost are unknown. Tax: unknown.

Recurring costs

compute
$0.26 / hour
AWS public us-east-1 Linux On-Demand rate USD 0.2646 per billed instance-hour, no paid preinstalled software. Eight hours USD 2.1168; 24 hours USD 6.3504 compute. Idle running hours bill. Storage, egress, tax and administration separate; no Spot/reservation/discount assumed. Capacity/quota unverified. Region: us-east-1. SKU: r7i.xlarge Linux On-Demand. Tax: excluded. Price dated Oct 15, 2026. Price source
storage
$0.08 / GB month
US East (N. Virginia) gp3 USD 0.08 per GB-month; AWS defines GB as 1024^3 bytes. Selected 40 GiB root volume is USD 3.20 per full month, prorated by provisioned duration. Baseline 3000 IOPS / 125 MB/s; no extras assumed. Retained snapshots/resources separate; storage persists after instance stop. Tax excluded. Region: us-east-1. SKU: EBS gp3 baseline 3000 IOPS / 125 MB/s. Tax: excluded. Price dated Oct 16, 2026. Price source
egress
Unknown — Data transfer price, allowances and traffic volume are unknown.
Data transfer price, allowances and traffic volume are unknown. Tax: unknown.
administration
Unknown — Maintenance labor rate and hours are unknown.
Maintenance labor rate and hours are unknown. Tax: unknown.

Install the runtime

  1. 1. Install the exact native CPU dependency path

    Use the official hashed CPU wheel and complete pinned source package without stripping dependencies. The imported native losses, data, model, encoders and service path are source-audited. Eager Qwen3 attention is selected through the released Transformers API; no CUDA driver or flash-attention package is required. Record the resolved environment; target execution remains unverified.

    Command
    set -e
    sudo apt-get update
    sudo apt-get install -y python3.12 python3.12-venv git curl ca-certificates openssl
    mkdir -p "$HOME/agentjev-v1-hosting/model"
    cd "$HOME/agentjev-v1-hosting"
    python3.12 -m venv .venv
    .venv/bin/python -m pip install 'https://download.pytorch.org/whl/cpu/torch-2.6.0%2Bcpu-cp312-cp312-linux_x86_64.whl#sha256=59e78aa0c690f70734e42670036d6b541930b8eabbaa18d94e090abf14cc4d91'
    git clone https://github.com/malevrigns/agent-jev.git runtime
    git -C runtime checkout --detach 3b0042a6171124c5d2942748ae01f453ed2cce61
    test "$(git -C runtime rev-parse HEAD)" = '3b0042a6171124c5d2942748ae01f453ed2cce61'
    .venv/bin/python -m pip install 'transformers==4.57.6' 'numpy==1.26.4' 'PyYAML==6.0.2' 'tqdm==4.67.1' 'safetensors==0.6.2' -e ./runtime
    .venv/bin/python -m pip check
    .venv/bin/python -m pip freeze > resolved-environment.txt

    Expected result: Pinned source checkout, direct package versions and pip check succeed; resolved environment saved. Stop on any dependency failure.

Download the model

  1. 1. Download all seven exact v1 assets and notices

    All hashes and sizes come from the native release verifier and pinned public metadata. Download no alternate branch. The wrapper checks every size and digest and the publisher BF16 header composition before importing the native loader. HF API F32 summary disagrees with the verifier; a mismatch is a stop, not permission to relabel the release.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    curl --fail --location --output model/model.safetensors 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/model.safetensors'
    curl --fail --location --output model/temperatures.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/temperatures.json'
    curl --fail --location --output model/config.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/config.json'
    curl --fail --location --output model/tokenizer.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/tokenizer.json'
    curl --fail --location --output model/tokenizer_config.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/tokenizer_config.json'
    curl --fail --location --output model/vocab.json 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/vocab.json'
    curl --fail --location --output model/merges.txt 'https://huggingface.co/aimeigaoshou/agent-jev/resolve/7d433994fbde17a3f0993c2f2b02fe8ca1370db1/merges.txt'
    sha256sum --check <<'SHA256'
    8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215  model/model.safetensors
    5e5032896d77c72feb86b4725abe418488b8a1c7476014c706bd8215eb43c86c  model/temperatures.json
    504a6b58c4271583724e66584b6b7698aea18450209df6b2f7582df0e89cee59  model/config.json
    c0382117ea329cdf097041132f6d735924b697924d6f6fc3945713e96ce87539  model/tokenizer.json
    3c04ed3ca964ea2f6b2b5faf0dc4d31aec1cb1e8b4bcf63f402d295046b422b5  model/tokenizer_config.json
    ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910  model/vocab.json
    8831e4f1a044471340f7c0a83d7bd71306a5b867e95fd870f74d0c5308a904d5  model/merges.txt
    SHA256
    curl --fail --location --output AGENTJEV-LICENSE 'https://raw.githubusercontent.com/malevrigns/agent-jev/3b0042a6171124c5d2942748ae01f453ed2cce61/LICENSE'
    printf '%s  %s\n' 'f4d9b0aad8ff9e650f5890fa3eeb7c1311479cab901f8a9b416a2d9acaf54266' 'AGENTJEV-LICENSE' | sha256sum --check
    curl --fail --location --output QWEN-UPSTREAM-LICENSE 'https://huggingface.co/Qwen/Qwen3-0.6B-Base/resolve/da87bfb608c14b7cf20ba1ce41287e8de496c0cd/LICENSE'
    printf '%s  %s\n' '832dd9e00a68dd83b3c3fb9f5588dad7dcf337a0db50f7d9483f310cd292e92e' 'QWEN-UPSTREAM-LICENSE' | sha256sum --check

    Expected result: Every asset and both retained notices pass SHA checks. Native weights have not been fetched by the author.

Configure

  1. 1. Write the manifest, original fixture and persistent key

    Create a key only when absent; an empty existing key must fail rather than silently rotate. Protect files and review the original synthetic state and criteria.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    cat > release-manifest.json <<'MANIFEST'
    {
      "repository": "aimeigaoshou/agent-jev",
      "revision": "7d433994fbde17a3f0993c2f2b02fe8ca1370db1",
      "files": [
        {
          "path": "model.safetensors",
          "bytes": 1196881242,
          "sha256": "8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215"
        },
        {
          "path": "temperatures.json",
          "bytes": 389,
          "sha256": "5e5032896d77c72feb86b4725abe418488b8a1c7476014c706bd8215eb43c86c"
        },
        {
          "path": "config.json",
          "bytes": 727,
          "sha256": "504a6b58c4271583724e66584b6b7698aea18450209df6b2f7582df0e89cee59"
        },
        {
          "path": "tokenizer.json",
          "bytes": 7031645,
          "sha256": "c0382117ea329cdf097041132f6d735924b697924d6f6fc3945713e96ce87539"
        },
        {
          "path": "tokenizer_config.json",
          "bytes": 9678,
          "sha256": "3c04ed3ca964ea2f6b2b5faf0dc4d31aec1cb1e8b4bcf63f402d295046b422b5"
        },
        {
          "path": "vocab.json",
          "bytes": 2776833,
          "sha256": "ca10d7e9fb3ed18575dd1e277a2579c16d108e32f27439684afa0e10b1440910"
        },
        {
          "path": "merges.txt",
          "bytes": 1671853,
          "sha256": "8831e4f1a044471340f7c0a83d7bd71306a5b867e95fd870f74d0c5308a904d5"
        }
      ]
    }
    MANIFEST
    cat > fixture.json <<'FIXTURE'
    {
      "id": "original-library-schedule",
      "state": "A fictional community library opens weekdays 9am–6pm, Saturday 10am–4pm, and is closed Sunday. These are original synthetic facts for a low-stakes demonstration.",
      "questions": [
        {
          "id": "sunday",
          "type": "boolean",
          "question": "Is the library open on Sunday according to this state?",
          "criteria": {
            "true": "The supplied state says it is open Sunday.",
            "false": "The supplied state says it is closed Sunday."
          }
        },
        {
          "id": "saturday-hours",
          "type": "choice",
          "question": "How many hours is the library open on Saturday?",
          "options": {
            "four": "Four hours.",
            "six": "Six hours.",
            "nine": "Nine hours."
          }
        },
        {
          "id": "weekday-duration",
          "type": "score",
          "question": "Rate the weekday opening duration by the ordered definitions.",
          "levels": [
            "At most four hours open per weekday.",
            "More than four but at most eight hours open per weekday.",
            "More than eight hours open per weekday."
          ]
        }
      ]
    }
    FIXTURE
    if [ ! -e .api-key ]; then (umask 077; openssl rand -hex 32 > .api-key); fi
    test -s .api-key
    chmod 600 .api-key

    Expected result: Manifest and fictional fixture saved; private nonempty key retained.

  2. 2. Write request and result boundaries

    Reader-authored service code is independent of publisher HTTP serving code. It rejects unknown fields, duplicate JSON keys, unsupported content framing and malformed probability algebra. No publisher model code executes while writing this file.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    cat > reader-decision-server.py <<'PYWRAPPER'
    """Reader-authored serial private AgentJev decision service; no native imports at import time."""
    import hashlib,hmac,json,math,pathlib,re,socket,struct
    from http.server import HTTPServer,BaseHTTPRequestHandler
    PORT=8999
    EXPECTED_WEIGHT='8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215'
    def digest(path):
     h=hashlib.sha256()
     with open(path,'rb')as f:
      for b in iter(lambda:f.read(4*1024*1024),b''):h.update(b)
     return h.hexdigest()
    def verify_files(root,manifest):
     for row in manifest:
      f=root/row['path']
      if not f.is_file()or f.stat().st_size!=row['bytes']or digest(f)!=row['sha256']:raise ValueError('Pinned release asset mismatch')
    def header_check(path):
     with open(path,'rb')as f:
      raw=f.read(8)
      if len(raw)!=8:raise ValueError('Missing safetensors header')
      n=struct.unpack('<Q',raw)[0]
      if not 1<=n<=1048576:raise ValueError('Header bound')
      h=json.loads(f.read(n))
     tensors=[v for k,v in h.items()if k!='__metadata__']
     if len(tensors)!=343 or any(v.get('dtype')!='BF16'for v in tensors):raise ValueError('Expected exact publisher v1 BF16 header; metadata discrepancy is not waived')
     total=0
     for v in tensors:
      shape=v.get('shape')
      if not isinstance(shape,list)or any(type(x)is not int or x<0 for x in shape):raise ValueError('Invalid shape')
      total+=math.prod(shape)
     if total!=598418689:raise ValueError('Full parameter composition mismatch')
    def parse_request(raw):
     def unique(pairs):
      d={}
      for k,v in pairs:
       if k in d:raise ValueError('Duplicate field')
       d[k]=v
      return d
     p=json.loads(raw.decode('utf-8'),object_pairs_hook=unique,parse_constant=lambda _:(_ for _ in()).throw(ValueError('Nonfinite JSON')))
     if not isinstance(p,dict)or set(p)!={'id','state','questions'}:raise ValueError('Exact state request schema')
     def text(v,limit):
      if not isinstance(v,str)or not v.strip()or len(v.encode())>limit or any(x in v for x in ['[STATE]','[QUESTION]','[CANDIDATE]']):raise ValueError('Bounded plain text required')
     text(p['id'],80);text(p['state'],4096)
     if not isinstance(p['questions'],list)or not 1<=len(p['questions'])<=3:raise ValueError('One to three questions required')
     ids=set()
     for q in p['questions']:
      if not isinstance(q,dict):raise ValueError('Question object required')
      t=q.get('type')
      if not isinstance(t,str):raise ValueError('Typed primitive string required')
      extra={'boolean':'criteria','choice':'options','score':'levels'}.get(t)
      if extra is None or set(q)!={'id','type','question',extra}:raise ValueError('Exact typed question schema')
      text(q['id'],80);text(q['question'],1024)
      if q['id']in ids:raise ValueError('Duplicate question id')
      ids.add(q['id']);v=q[extra]
      if t=='boolean':
       if not isinstance(v,dict)or set(v)!={'true','false'}:raise ValueError('Both boolean criteria required')
       vals=list(v.values())
      elif t=='choice':
       if not isinstance(v,dict)or not 2<=len(v)<=8:raise ValueError('Two to eight choice options')
       for k in v:text(k,80)
       vals=list(v.values())
      else:
       if not isinstance(v,list)or not 2<=len(v)<=5:raise ValueError('Two to five ordered score levels')
       vals=v
      for v in vals:text(v,1024)
      if len(set(vals))!=len(vals):raise ValueError('Distinct descriptions required')
     return p
    def request_length(headers):
     vals=headers.get_all('Content-Length',[])
     if headers.get('Transfer-Encoding')is not None or len(vals)!=1 or not re.fullmatch('[0-9]{1,5}',vals[0]):raise ValueError('One bounded decimal length')
     n=int(vals[0])
     if not 1<=n<=16384:raise ValueError('Body outside limit')
     return n
    def validate_result(request,result):
     if result.get('api_version')!='agentjev.decision.v1':raise ValueError('Native API version mismatch')
     usage=result.get('usage',{})
     if any(type(usage.get(k))is not int or usage[k]!=0 for k in ['generated_tokens','truncated_inputs']):raise ValueError('No decoding or truncation allowed')
     rows=result.get('results');questions=request['questions']
     if not isinstance(rows,list)or len(rows)!=1 or rows[0].get('id')!=request['id']:raise ValueError('Native state identity mismatch')
     answers=rows[0].get('answers')
     if not isinstance(answers,list)or len(answers)!=len(questions):raise ValueError('Missing typed answers')
     paths=0
     for q,a in zip(questions,answers):
      t=q['type'];keys=['true','false']if t=='boolean'else list(q['options'])if t=='choice'else[str(i)for i in range(len(q['levels']))];paths+=len(keys)
      dist=a.get('distribution')
      if a.get('id')!=q['id']or a.get('type')!=t or not isinstance(dist,dict)or list(dist)!=keys:raise ValueError('Typed answer identity mismatch')
      probs=list(dist.values())
      if any(type(x)not in(int,float)or not math.isfinite(x)or not 0<=x<=1 for x in probs)or abs(sum(probs)-1)>1e-4:raise ValueError('Invalid finite distribution')
      best=max(range(len(probs)),key=probs.__getitem__)
      def close(a,b):return type(a)in(int,float)and math.isfinite(a)and abs(a-b)<=1e-6
      if t=='boolean':
       if type(a.get('value'))is not bool or a['value']!=(probs[0]>=.5)or not close(a.get('probability'),probs[0]):raise ValueError('Boolean semantics mismatch')
      elif t=='choice':
       ranked=sorted(probs,reverse=True)
       if a.get('value')!=keys[best]or a.get('description')!=q['options'][keys[best]]or not close(a.get('top_probability'),probs[best])or not close(a.get('margin'),ranked[0]-ranked[1]):raise ValueError('Relative choice semantics mismatch')
      elif type(a.get('level'))is not int or a['level']!=best or a.get('legend')!=q['levels']or not close(a.get('score'),sum(i*x for i,x in enumerate(probs))):raise ValueError('Ordered expected-score semantics mismatch')
     if usage.get('questions')!=len(questions)or usage.get('candidate_paths')!=paths or type(usage.get('input_path_tokens'))is not int or not paths<=usage['input_path_tokens']<=paths*2048:raise ValueError('Native path usage mismatch')
     return result
    PYWRAPPER

    Expected result: First wrapper portion saved.

  3. 3. Write strict native loading and serial loopback HTTP

    Startup verifies every native file and header before loading the complete trained state with strict=True. It checks CPU FP32, all three calibration scalars and native identity/path mode. It has a 30 second socket-read timeout, no native inference deadline and no public-service hardening.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    cat >> reader-decision-server.py <<'PYWRAPPER'
    class Engine:
     def __init__(self,root):
      import os
      manifest=json.loads((root/'release-manifest.json').read_text())['files'];verify_files(root/'model',manifest);header_check(root/'model/model.safetensors')
      os.environ.update(HF_HUB_OFFLINE='1',TRANSFORMERS_OFFLINE='1')
      import torch
      from jev_service.engine import DecisionEngine
      from jev_service.contract import prepare,encode_paths
      torch.set_default_dtype(torch.float32);torch.set_num_threads(4);torch.set_num_interop_threads(1)
      self.engine=DecisionEngine(root/'model/model.safetensors',str(root/'model'),device='cpu',max_tokens=2048,path_batch=1,encoder='path',temperatures=root/'model/temperatures.json')
      self.engine.model.path_encoder.backbone.set_attn_implementation('eager')
      if self.engine.model.path_encoder.backbone.config._attn_implementation!='eager':raise ValueError('Explicit eager attention required')
      if any(p.is_floating_point()and p.dtype!=torch.float32 for p in self.engine.model.parameters()):raise ValueError('CPU FP32 parameters required')
      info=self.engine.info();expected=json.loads((root/'model/temperatures.json').read_text());temps={k:v['temperature']for k,v in expected.items()}
      if set(temps)!={'boolean','choice','score'}or temps!={'boolean':1.0717734625362931,'choice':1.0352649238413776,'score':1.0717734625362931}:raise ValueError('Complete exact calibration required')
      if info['api_version']!='agentjev.decision.v1'or info['checkpoint_sha256']!=EXPECTED_WEIGHT or info['encoder']!='path'or info['max_path_tokens']!=2048 or info['temperatures']!=temps or info['types']!=['boolean','choice','score']or info['output_token_decoding']is not False or info['shared_prefix_compute']is not False:raise ValueError('Native release/calibration identity mismatch')
      self.prepare=prepare;self.encode_paths=encode_paths;self.info=info
     def evaluate(self,request):
      paths,_,_=self.encode_paths(self.prepare(request),self.engine.tokenizer,2048)
      if not paths or any(not p or len(p)>2048 for p in paths):raise ValueError('Complete per-path bound')
      return validate_result(request,self.engine.evaluate(request))
    def serve(engine,key):
     class Handler(BaseHTTPRequestHandler):
      protocol_version='HTTP/1.0'
      def setup(self):super().setup();self.connection.settimeout(30)
      def log_message(self,*a):pass
      def reply(self,status,obj):
       b=json.dumps(obj,ensure_ascii=False,allow_nan=False).encode();self.send_response(status);self.send_header('Content-Type','application/json');self.send_header('Content-Length',str(len(b)));self.end_headers();self.wfile.write(b)
      def auth(self):
       v=self.headers.get_all('Authorization',[])
       try:return len(v)==1 and hmac.compare_digest(v[0].encode('ascii'),('Bearer '+key).encode('ascii'))
       except UnicodeError:return False
      def do_GET(self):
       if not self.auth():return self.reply(401,{'error':'Unauthorized'})
       if self.path!='/health':return self.reply(404,{'error':'Not found'})
       return self.reply(200,{'ready':True,'native':engine.info,'reader_path_microbatch':1,'reader_context_per_path':2048})
      def do_POST(self):
       if not self.auth():return self.reply(401,{'error':'Unauthorized'})
       if self.path!='/api/evaluate':return self.reply(404,{'error':'Not found'})
       try:
        if self.headers.get('Content-Type')!='application/json':raise ValueError('JSON required')
        n=request_length(self.headers);b=self.rfile.read(n)
        if len(b)!=n:raise ValueError('Incomplete body')
        req=parse_request(b)
       except(ValueError,UnicodeError,socket.timeout):return self.reply(400,{'error':'Invalid bounded request'})
       try:out=engine.evaluate(req)
       except Exception:return self.reply(422,{'error':'Native path or finite-distribution check failed; no action executed'})
       return self.reply(200,out)
     server=HTTPServer(('127.0.0.1',PORT),Handler)
     try:server.serve_forever()
     finally:server.server_close()
    if __name__=='__main__':
     root=pathlib.Path(__file__).resolve().parent;key=(root/'.api-key').read_text().strip()
     if not re.fullmatch('[a-f0-9]{64}',key):raise ValueError('Restore private service key')
     serve(Engine(root),key)
    PYWRAPPER
    printf '%s  %s\n' 'a997d981592ccc21575be799483bf41f65ce43990175e579936cc643d5d59cce' 'reader-decision-server.py' | sha256sum --check
    .venv/bin/python -m py_compile reader-decision-server.py

    Expected result: Exact wrapper SHA and Python syntax pass; no inference has run.

Start the model

  1. 1. Start the private CPU decision service

    Run in a foreground shell. Four intra-op threads and one inter-op thread are explicit CPU settings. Complete independent candidate paths use native path microbatch one and no shared-prefix compute. Health means initialized and checked, not successful model inference.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    export OMP_NUM_THREADS=4 MKL_NUM_THREADS=4 HF_HUB_OFFLINE=1 TRANSFORMERS_OFFLINE=1
    .venv/bin/python reader-decision-server.py

    Expected result: Exact native checkpoint/calibration identity checks pass and port 8999 binds only to loopback. Any size, hash, header, state-key, dtype or attention failure aborts startup.

Connect to your endpoint

http://127.0.0.1:8999/api/evaluate

VM loopback; supplied verification runs inside the VM. A separate operator may use the explicit SSH tunnel to the existing host.

Access: loopback. A locally generated private Bearer key is required for health and evaluation. Requests contain one state and one to three typed questions. Complete native answer distributions and zero decoding usage are returned. This serial reader wrapper has no TLS, public exposure or multiuser isolation; protect host files and SSH credentials.

Verify the setup

  1. 1. Verify authentication, native algebra and grounded fixture

    Run in a second shell on the same host. Require unauthorized health to return 401, then check native identity and all three primitives. The checker independently revalidates complete distributions and manual fixture answers: Sunday closed, Saturday six hours, weekday duration above eight hours. Score is the probability-weighted ordinal expectation, not forced to its argmax. Wrong preferred alternatives fail; passing one fixture is not accuracy evidence.

    Command
    set -e
    cd "$HOME/agentjev-v1-hosting"
    .venv/bin/python - <<'PYVERIFY'
    import json,urllib.request,urllib.error,pathlib
    root=pathlib.Path.cwd();key=(root/'.api-key').read_text().strip();base='http://127.0.0.1:8999'
    try:urllib.request.urlopen(base+'/health',timeout=10)
    except urllib.error.HTTPError as e:assert e.code==401
    else:raise AssertionError('Missing authentication rejection')
    h=json.load(urllib.request.urlopen(urllib.request.Request(base+'/health',headers={'Authorization':'Bearer '+key}),timeout=30))
    assert h['ready']is True and h['native']['types']==['boolean','choice','score']
    assert h['native']['output_token_decoding']is False and h['native']['shared_prefix_compute']is False
    assert h['native']['checkpoint_sha256']=='8166e46dc6019ae13f0d8fc97d603cdbcc2d20eb1882c7350c8deb9fc6bae215'
    request=json.loads((root/'fixture.json').read_text());body=json.dumps(request).encode()
    r=urllib.request.Request(base+'/api/evaluate',data=body,headers={'Authorization':'Bearer '+key,'Content-Type':'application/json'})
    out=json.load(urllib.request.urlopen(r,timeout=900));(root/'result.json').write_text(json.dumps(out,indent=2)+'\n')
    from importlib.util import spec_from_file_location,module_from_spec
    s=spec_from_file_location('reader',root/'reader-decision-server.py');module=module_from_spec(s);s.loader.exec_module(module)
    module.validate_result(request,out)
    a=out['results'][0]['answers'];assert a[0]['value']is False and a[1]['value']=='six' and a[2]['level']==2
    assert out['usage']['generated_tokens']==0 and out['usage']['truncated_inputs']==0
    print(json.dumps(out,indent=2));print('Fixture structure and grounded preferred alternatives pass; no domain accuracy guarantee.')
    PYVERIFY

    Expected result: Complete native result is saved. All native probabilities are finite, normalized and consistent with boolean mass, choice argmax/margin and ordinal expectation; eight candidate paths and zero generated tokens are checked.

  2. 2. Open a trusted SSH tunnel

    From the operator machine, replace HOST with the existing instance address and use the existing SSH identity. Keep inference port 8999 closed in the security group. Choose a free local port if needed and adjust the client address accordingly.

    Command
    ssh -N -L 8999:127.0.0.1:8999 ubuntu@HOST

    Expected result: Tunnel forwards the operator loopback port to VM loopback. Keep this shell open only while using the private endpoint.

Performance evidence

No compatible measurement available. Documented support and estimated memory do not establish response speed.

Limits and troubleshooting

  • Documentation and source checks only: no weights, native model imports, tokenizer execution, installation, build, inference, fit, latency or quality measurements were performed.
  • Native v1 verifier expects 343 BF16 tensors while HF API safetensors summary says F32. Exact release size, SHA and header composition must all pass before strict whole-state loading; do not replace with the later checkpoint.
  • The integrated model is a trained Qwen3 backbone plus candidate head, not a language decoder or adapter. CPU defaults and this explicit reader path use FP32; README BF16 examples do not establish CPU dtype.
  • Native path limit is 2048 positions including complete state/question/candidate framing. Sums across eight fixture paths do not share this context bound. The service refuses overlength paths and reports truncated_inputs zero; there is no generated output budget.
  • Native source accepts larger candidate counts; this reader boundary allows at most three questions, eight choice candidates or five ordered score levels, a 16 KiB body and bounded UTF-8 fields. Requests are serial and there is no inference deadline.
  • The native calibration file is preserved and all three scalars checked. Boolean and relative choice probabilities and ordered expected scores are model distributions; arbitrary-domain calibration, action success and correctness are unknown. No external action executes.
  • The original fictional fixture checks meaningful outputs for all three native primitives. A protocol pass or preferred answer is not a general model accuracy benchmark.
  • Native source package metadata says version 1.0.0 while its module reports 0.1.0; exact source commit governs. Training upstream revision and Base versus non-Base model-card labeling remain unresolved provenance details.
  • 32 GiB RAM and 40 GiB disk are planning allocations. Full load copies, CPU activations and scratch add to the FP32 parameter lower bound; actual required memory, fit, speed, quality and task spend are unknown.
  • Larger batches, shared-prefix encoders, routing-only checkpoints, GPU execution and other native workflows remain open. Required family guide total is null; this pair is not exhaustive.
Native asset, header or strict state load fails
Stop. Restore the exact seven v1 files and inspect actual diagnostics; do not waive missing keys, switch to another checkpoint or conceal the dtype discrepancy.
Path too long or invalid native distribution
Treat the request as failed. Shorten the complete state/question/candidate paths deliberately; do not truncate or clamp probabilities, margins or ordinal scores.
HTTP 401 or loopback connection failure
Check the exact service key, VM readiness and intended SSH tunnel; keep public port closed.
Out of memory or very slow inference
Stop and preserve actual logs. Planning allocations and parameter storage do not prove fit or latency. Any larger resource choice needs its own reviewed configuration.

Stop the model

  1. 1. Stop the foreground service

    Press Ctrl+C in the server shell, then confirm the intended listener is gone. Close the SSH tunnel too. This does not stop instance billing.

    Command
    curl --max-time 3 --fail http://127.0.0.1:8999/health

    Expected result: Connection is refused after shutdown. A 401 indicates the service is still running; an auth rejection is not stopped proof.

Uninstall

  1. 1. Remove the dedicated files

    Preserve desired result, environment record and notices first. Verify the exact dedicated path before removing its private key, assets, source and environment. Shared Ubuntu packages remain.

    Command
    rm -r -- "$HOME/agentjev-v1-hosting"

    Expected result: Dedicated source, model, virtual environment, fixture, results and key removed.

Shut down cloud resources

  1. 1. End cloud billing resources

    In EC2 us-east-1, stop for later reuse or terminate this exact VM. Review Delete on termination for its root volume. Delete unwanted detached EBS volumes, snapshots and reserved/Elastic/public IP resources. Stopped VM storage and retained resources may still bill. Check Bills/Cost Explorer later for final usage.

    Expected result: Exact instance is stopped/terminated as intended; no unwanted attached/retained billed resources remain. Instance compute stops only after its lifecycle transition, not when the Python service stops.

Sources and verification

Sources checked Oct 17, 2026. Verification source

Compare this configuration

Benchmarks

Performance scores for AgentJev 0.6B across standard benchmarks.

Typed Decisions top-1 accuracyhttps://github.com/malevrigns/agent-jev · Sep 2026
79.3
Context window tokenshttps://github.com/malevrigns/agent-jev · Sep 2026
2048

Pricing and access

Open weights are linked from the GitHub README on Hugging Face. Runtime cost depends on local or hosted inference hardware; no official hosted API pricing was found in the reviewed source.