agentsclimarketplace

Atai newton fusion model

Skill archetypeai/agent-skills/skills/atai-newton-fusion-model

Call Newton's C 2.6 fusion model (`Newton::c2_6_8b_fp8_260424d7a55d5e`) on the prod `/query` endpoint with text, image, and video inputs in a single stateless request — no session, no batch job, no SSE plumbing. Use this skill when the user wants per-call multimodal reasoning (describe an image, summarize a clip, classify a state from sensor + visual context) without managing session lifecycle, or when they need the Newton C checkpoint that reasons over video frames via `/query`. Covers the request shape per modality, the two image-attachment paths (file_ids vs base64), multi-image mode, both video paths (`.mp4` + `max_frames`, and client-sampled frames + `query_metadata`), generation parameters, JSON-output prompting, latency budgets, and the C 2.6 identifier gotcha. Do NOT use for streaming / session-based activity monitoring, large multi-file batch jobs, or time-series embedding (KNN / anomaly) classification.From its SKILL.md

Install
npx -y skills add archetypeai/agent-skills --skill atai-newton-fusion-model

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

4 things to look at

  • reads credentialsReads from 2 credential sources: `ATAI_API_KEY` and 1 more.
  • 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 2 commands, including `curl -X POST $ATAI_API_ENDPOINT/v0.5/files -H "Authorization: Bearer $ATAI_API_KEY" -F "[email protected];type=image/png"` and 1 more.
  • fetches URLsInstructs the agent to fetch 1 URL, including {ATAI_API_ENDPOINT}/v0.5/query.

SKILL.md

18.5 KB, ~4.8k tokens by cl100k_base, as published. Nobody here has run it

Newton C 2.6 Fusion Model — Multimodal /query in One Hop

Single stateless POST to /query for text, image, or video reasoning against the C 2.6 fusion checkpoint. No Lens session, no batch pipeline, no SSE. One call → one response.

When to Apply

  • User wants to describe / classify / extract structure from an image with one API call
  • User wants the same for a short video in a single /query call
  • User wants stateless multimodal reasoning (no per-session warmup, no orphan cleanup)
  • User wants JSON output from a multimodal input (the prompt is the schema)
  • User is building a serverless / per-request handler where a streaming Lens session would be the wrong shape

Do not use this skill when:

  • The workload is live, streaming video → text from a long-running camera feed — a session-based activity monitor is the right shape, not stateless /query
  • The workload is a large multi-file batch job
  • The task is time-series classification via embeddings (KNN / anomaly detection)

The Model Identifier

Newton::c2_6_8b_fp8_260424d7a55d5e

The full Newton:: prefix and the _fp8_ segment are required. Variants that omit either are rejected with 400 invalid_model_version:

c2_6_8b_fp8_260424d7a55d5e            ❌ missing Newton:: prefix
Newton::c2_6_8b_260424d7a55d5e        ❌ missing _fp8_
c2_6_8b_260424d7a55d5e                ❌ both missing

This was probed end-to-end against https://api.u1.archetypeai.app/v0.5/query on prod.

Endpoint

POST {ATAI_API_ENDPOINT}/v0.5/query
Authorization: Bearer <API_KEY>
Content-Type: application/json

Both ATAI_API_KEY and ATAI_API_ENDPOINT are required — there is no default endpoint, so a wrong-deployment mistake fails loudly at startup instead of silently at query time. Prod is https://api.u1.archetypeai.app/v0.5. The same endpoint serves all three modalities below — what changes is the request body.

Wire Shapes

Text + JSON

{
  "query": "Classify the operational state. Respond with ONLY the JSON object.",
  "instruction_prompt": "You output {\"state\": \"...\", \"confidence\": <0..1>}.",
  "file_ids": [],
  "model": "Newton::c2_6_8b_fp8_260424d7a55d5e",
  "max_new_tokens": 300
}
  • Put the system turn in instruction_prompt. That is the only field C 2.6 honors — a directive sent in the legacy system_prompt field alone is silently ignored (verified against Newton::c2_6_8b_fp8_260424d7a55d5e: the same directive is obeyed in instruction_prompt and dropped in system_prompt), so omit system_prompt entirely.
  • JSON output: put the schema in instruction_prompt, the input in query, and explicitly tell the model not to wrap in markdown fences. The model otherwise often returns <code>json ... </code>.

For reasoning over an attached text file: upload it as text/plain (a .txt file) via /v0.5/files, then put the filename in file_ids. The model then sees the file contents in its prompt context. Critical: this only works for text/plain. A file uploaded as text/csv (a .csv) is accepted and stored byte-identically, but its contents never reach the model on /query — it silently confabulates from priors (see the gotcha below and csv_vs_txt_proof.py). application/json uploads are rejected outright. So put tabular data in a .txt, or inline it in query.

See text_query.py for runnable demos of all three patterns. Its examples are framed as smart-home WiFi flow analysis; the attached flow log in example 3 is real data from the GHOST-IoT dataset (Anagnostopoulos et al., Sensors 2020, DOI:10.3390/s20226600) — see the script's docstring for full attribution.

Image

Two attachment paths, both reach the same fusion model — pick by use case — plus a flag for sending several images at once:

(a) Upload + reference by filename in file_ids — best when the same image is reused across queries (one upload, many /query calls):

curl -X POST $ATAI_API_ENDPOINT/v0.5/files \
  -H "Authorization: Bearer $ATAI_API_KEY" \
  -F "[email protected];type=image/png"
{
  "query": "Describe this image in three bullets.",
  "instruction_prompt": "...",
  "file_ids": ["dashboard.png"],
  "model": "Newton::c2_6_8b_fp8_260424d7a55d5e",
  "max_new_tokens": 300
}

(b) Inline base64 in a data.base64_img event — best for one-shot calls where the upload roundtrip is wasted:

{
  "query": "What is in this image? One sentence.",
  "instruction_prompt": "...",
  "file_ids": [],
  "model": "Newton::c2_6_8b_fp8_260424d7a55d5e",
  "max_new_tokens": 200,
  "events": [
    {
      "type": "data.base64_img",
      "event_data": {
        "contents": "<base64 string>",
        "mime_type": "image/png"
      }
    }
  ]
}

(c) Multiple images — set multi_image: true for multi-image mode: each attachment is an independent image (before/after, multi-view, "is the same person in these images?"), not frames of a video. Platform limit: 16 images max per request. Without multi_image: true, an image list means "frames of one video" and requires query_metadata (see the Video section); lacking both, the request fails with 400 query_failed:

{
  "query": "Image 1 is the bench BEFORE the task; image 2 is DURING. What changed?",
  "instruction_prompt": "...",
  "file_ids": ["assembly_before.png", "assembly_after.png"],
  "model": "Newton::c2_6_8b_fp8_260424d7a55d5e",
  "max_new_tokens": 400,
  "multi_image": true
}

See image_query.py for runnable demos of all three paths.

Video

C 2.6 reasons over video on /query two ways. This distinguishes it from the C 2.4 / 2.5 text checkpoints, which accept an .mp4 but ignore the frames and reply "I can't see videos."

(a) .mp4 + max_frames — upload the clip, and GPQ decodes and uniformly samples it server-side before the model sees the frames. No client-side video tooling needed:

curl -X POST $ATAI_API_ENDPOINT/v0.5/files \
  -H "Authorization: Bearer $ATAI_API_KEY" \
  -F "[email protected];type=video/mp4"
{
  "query": "Evaluate the assembly steps shown in the attached video.",
  "instruction_prompt": "<task / inspection prompt>",
  "file_ids": ["clip.mp4"],
  "model": "Newton::c2_6_8b_fp8_260424d7a55d5e",
  "max_new_tokens": 500,
  "max_frames": 32
}

(b) Client-sampled frames + query_metadata — send the frames yourself (one data.base64_img event each, or image file_ids), set multi_image: false, and include a query_metadata block with the video-metadata triple. The query_metadata block is what makes this work — without it the request fails with 400 query_failed:

{
  "query": "This is a short video. Describe the sequence of actions in order.",
  "instruction_prompt": "...",
  "model": "Newton::c2_6_8b_fp8_260424d7a55d5e",
  "multi_image": false,
  "max_new_tokens": 150,
  "events": [
    {"type": "data.base64_img", "event_data": {"contents": "<frame_0 base64>"}},
    {"type": "data.base64_img", "event_data": {"contents": "<frame_1 base64>"}}
  ],
  "query_metadata": {"raw_fps": 1.0, "frames_indices": [0, 1], "total_num_frames": 2}
}

Both shapes verified live (the file_ids variant of (b) works too). Notes:

  • max_frames — frames GPQ samples uniformly from the video before feeding the model. Default 32, platform max 64. Increase for longer / higher-detail clips; decrease to cap latency. Values above 64 fail silently: the request returns 200, but the video is dropped and the model confabulates a scene from priors (verified: max_frames: 80 on the assembly clip described "a person holding a smartphone"). Stay at ≤ 64.
  • Timeout — set the client request timeout to at least 600s. Video latency scales with max_frames and clip length; default 30–60s timeouts will trip on non-trivial clips.
  • .mp4-direct on C 2.6 is a recent platform change. Earlier the .mp4 path silently dropped the frames for every model (a known GPQ bug), so older notes say "video doesn't work on /query." On C 2.6 today it does, via max_frames.
  • multi_image selects between video and multi-image mode. multi_image: false (with query_metadata) = the attached images are frames of one video. multi_image: true = multi-image mode — the images are independent (before/after, multi-view), and query_metadata is not needed.

See video_query.py for runnable demos of both paths (mp4 direct, a max_frames tradeoff, and a frame-list demo) using a worker-assembly PASS/FAIL inspection prompt.

Generation Parameters

All C-model generations via /query accept sampling controls in the request body (verified accepted + honored on prod with C 2.6):

ParamDefaultNotes
max_new_tokens256Hard ceiling on generated tokens (~4 chars each) — stops mid-sentence at the cap
temperature0.0 = greedy/deterministic-ish; 0.7–1.0 for creative output. Capped at 2.0
do_sampletrueMaster switch: false forces greedy decoding (temperature → 0, top_p/top_k stripped) — use for reproducibility
repetition_penalty1.0Multiplicative logit penalty on already-emitted tokens; try 1.1–1.3 if the model loops on a phrase or repeats numbers
presence_penalty0.0Additive penalty on any token that has appeared at least once (frequency-independent). Range ≈ −2..+2. C 2.6 only
top_p0.8Nucleus sampling — keep the smallest token set with cumulative probability ≥ top_p
top_kHard cap on candidate tokens per step (applied before top_p); 0 disables

For "extract X"-style tasks, do_sample: false (or temperature: 0.0) plus a tight max_new_tokens is the right starting point.

Reproducibility caveat (verified): the sampling knobs are honored — on the same prompt, 5 runs gave 2 distinct outputs greedy (do_sample: false), 3 distinct at defaults, 5 distinct at temperature: 1.9 — but greedy is not bit-deterministic on this deployment (fp8 numerics / batching sit outside the decoder), contrary to the platform note that do_sample: false output "is deterministic given the prompt". On borderline judgments the residual wobble is enough to flip the answer: the same greedy assembly-inspection body returned all-PASS on one run and two FAILs on another. If a verdict matters, aggregate over a few calls rather than trusting one.

Latency Budgets

Observed against prod with the sample assets in references/sample_assets/:

ModalityBodyp50Notes
Text only{"query": "...", "file_ids": []}~500 msConfirmed during model-identifier probing
Text + JSON outputinstruction prompt has schema~600 msSame shape, slightly longer with verbose schema
Image via file_idsone 1.9 MB PNG~1.3–1.9 sobserved (wind-turbines.png)
Image via inline base64same~0.8–2.5 sbase64 inflates the request; scales with image size
Two images, multi_image: true2 × ~400 KB PNG~2.9 sbefore/after comparison (assembly frames)
Video, mp4 + max_frames=32~31 s assembly clip~2–6 sserver-side decode/sample
Video, 2 frames + query_metadata2 × ~400 KB PNG~1.9 sclient-sampled frame-list path

Numbers are smoke-test order-of-magnitude. Production data may be 5–10× heavier and proportionally slower.

Response Shape

{
  "query_id": "...",
  "status": "completed",
  "inference_time_sec": 0.42,
  "query_response_time_sec": 0.49,
  "response": {
    "response": ["<the model output as a string>"]
  }
}

Walk payload["response"]["response"][0] as the canonical extraction path. The reference scripts' extract_text() helper handles every shape variant we've seen.

Common Pitfalls

  • Wrong model identifier. c2_6_8b_fp8_260424d7a55d5e without Newton:: returns 400 invalid_model_version. So does the variant without _fp8_. Always use the full Newton::c2_6_8b_fp8_260424d7a55d5e.
  • JSON wrapped in markdown fences. The model sometimes returns <code>json ... </code> even when explicitly told not to. Either parse defensively (text.strip().removeprefix("```json").removesuffix("```")) or restate the no-fences rule in the user query as well as instruction_prompt.
  • Video timeout. Default requests.post timeout of 30–60s will fail on anything but trivial clips. Set timeout ≥ 600s.
  • Multiple images without multi_image: true need the query_metadata triple. A list of images defaults to "frames of one video" — but that path requires query_metadata: {"raw_fps": ..., "frames_indices": [...], "total_num_frames": N} in the body; without it the request fails with 400 query_failed (the error doesn't hint at the missing field). For independent images (before/after, multi-view), set multi_image: true instead — max 16 images, no query_metadata needed.
  • max_frames above 64 fails silently. The platform max is 64. max_frames: 80 still returns 200, but the video never reaches the model — it confabulates a scene from priors (same failure mode as the CSV gotcha below). Keep max_frames ≤ 64.
  • "Video doesn't work on /query" is stale. Older notes say C 2.6 (and 2.4/2.5) can't see video. That was a GPQ bug that silently dropped .mp4 frames before any model. C 2.6 reads video now via .mp4 + max_frames — verified. The 2.4/2.5 text checkpoints still ignore frames.
  • file_ids takes the filename, not the fil_... uid. On upload the API returns both {"file_id": "<filename>", "file_uid": "fil_..."}. /query resolves file_ids by the filename (the file_id value, e.g. "dashboard.png"), not the fil_... file_uid. Passing the file_uid fails with a misleading 400 unsupported_file_type ("Found unsupported file type with file: fil_…") — it looks like a content-type problem but is really the wrong identifier. Verified: file_ids=["wind-turbines.png"] → 200; file_ids=["fil_…"] → 400.
  • Text attachments must be text/plain, not text/csv. A .csv upload (text/csv) is accepted, stored byte-for-byte, and returns status: completed — but its contents never reach the model on /query; the model silently confabulates from priors (e.g. answers "TCP"/"port 80" for an all-SSH file). The identical bytes uploaded as .txt (text/plain) are read faithfully. There is no warning — the failure is silent, so you can only catch it by validating the answer. Upload tabular/text data as .txt, or inline it in query. Verify yourself with csv_vs_txt_proof.py (.txt reads 5/5, .csv 0/5 on identical content). application/json uploads are rejected with 400 invalid_file_type.
  • Mixed-modality calls. You can attach both an image and a video file_id, but the fusion model's attention is finite. Stick to one modality per call for predictable results.

Local Setup

# In a virtualenv (system pythons are often PEP 668 "externally managed"):
python3 -m venv .venv && source .venv/bin/activate
pip install -r skills/atai-newton-fusion-model/references/requirements.txt

# Drop a .env at the repo root (or anywhere up the tree from the run dir).
# BOTH variables are required — there is no default endpoint:
cat > .env <<EOF
ATAI_API_KEY=sk_...
ATAI_API_ENDPOINT=https://api.u1.archetypeai.app/v0.5
EOF

python skills/atai-newton-fusion-model/references/text_query.py
python skills/atai-newton-fusion-model/references/image_query.py
python skills/atai-newton-fusion-model/references/video_query.py

The scripts are built on the official Archetype AI python client (pip install archetypeai): uploads go through client.files.local.upload(...), base64 encoding through archetypeai.utils.base64_encode(...) (utf-8), and each script creates one client and passes it into the helpers. They auto-load .env if python-dotenv is installed — find_dotenv() walks up from cwd so the file works at the repo root, the project root, or inside references/. Without python-dotenv, the scripts fall back to plain environment variables (export ATAI_API_KEY=... ATAI_API_ENDPOINT=...).

File Layout

skills/atai-newton-fusion-model/
├── SKILL.md                  ← this file
├── references/
│   ├── _common.py            ← shared helpers on the official archetypeai client
│   ├── text_query.py         ← 3 text patterns (plain, JSON output, .txt flow-log attachment)
│   ├── image_query.py        ← 4 image patterns (file_ids, base64, JSON extraction, multi-image)
│   ├── video_query.py        ← 3 video patterns (mp4 direct, max_frames tradeoff, frame list + query_metadata)
│   ├── csv_vs_txt_proof.py   ← diagnostic: proves text/csv attachments aren't read, text/plain are
│   ├── requirements.txt      ← runtime deps (pip install -r requirements.txt)
│   ├── .env.example          ← copy to .env and fill in
│   └── sample_assets/
│       ├── wind-turbines.png ← AI-generated photo (default for image_query.py)
│       ├── assembly_before.png / assembly_after.png ← frames from the clip below (multi-image demo)
│       ├── 1_pass_2_pass_3_pass_B.mp4 ← assembly-inspection clip (default for video_query.py)
│       └── README.md         ← provenance of the samples
└── tests/
    └── test_references.py    ← network-free unit tests (python -m unittest)

What ships with it: 13 files

10345.1 KB alongside SKILL.md, 6 of them executable

tests/

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.