AI Researcher 🧑‍🔬 | DevOps Engineer from profession | Indie hacker by heart | Love to build things

San Francisco, CA
Joined July 2026
Every time I hit a wall with one model, I used to paste my whole thread into another one and explain the project from scratch. That part wasted more time than the actual work. llmwise.ai puts 16 models from 7 companies in one chat, on one plan. Switch models mid-chat and the next model sees the whole conversation. No re-explaining your project. I pick a model per message, and the message count shows before I send. My usual move: start on a fast model for the boring first pass, then switch to a stronger one for the hard part, same thread. Pro is $20 a month plus tax. The monthly allowance is mixable, up to 125 messages on Claude Sonnet 5-class models, plus 60 fast messages a day. Helps anyone juggling more than one AI subscription.
7
1
49
3,166
an agent fails at 2am. the trace says the tool call succeeded. then you find the input was wrong. what do you log for every tool call so you can debug it later? tool name, args, output, latency, tokens, error, call id, parent step? reply with your list.
2
3
33
agent logs and app logs answer different questions. app logs show the request. agent logs show the steps, the tool calls, and the model output in order. so where do you split them in your setup? one trace id across both, or separate stores joined by a run id?
33
Default probes assume your app starts in seconds. A model server does not. Readiness fails after 3 missed checks. Kubernetes defaults are periodSeconds 10 and failureThreshold 3. That is 30 seconds. Your weights are still loading. The pod stays Running. It never joins the Service endpoints. You get 503s and an empty Endpoints list, and nothing in the logs looks wrong. Three probes, three different jobs: 1. startupProbe gives slow boot a budget. The other probes stay off until it passes. 2. readinessProbe gates traffic. A failure removes the pod from endpoints. No restart. 3. livenessProbe restarts the container. Use it only for real deadlocks. Gotchas I hit: - Liveness with a short budget kills the pod mid load. It restarts, reloads, dies again. - Readiness that checks the port only. The port opens before the model can answer. - No startupProbe, so you raise initialDelaySeconds instead. You pay that delay on every restart, even fast ones. - Readiness checks that run a real inference call. That burns GPU time and times out under load. Concrete setup: startupProbe with periodSeconds 10 and failureThreshold 60. That is a 10 minute boot budget. readinessProbe at periodSeconds 5 and failureThreshold 2. Keep livenessProbe on a long period, or drop it if you have no deadlock risk. Then add a /healthz that returns 200 only after weights load and one warmup pass finishes. Return 503 before that, with a body that names the pending stage: downloading, loading, warming. Avoid: probing with a real prompt. Avoid: the same numbers on all three probes. What does your /healthz return while the weights are still loading?
41
Who else is building with AI this week? I build AI agents for small teams. I am also a senior SRE, 10+ years with Kubernetes, AWS and Terraform. The hardest part is scope. Users ask for five skills at once. I pick the one they hit every day, ship it, then watch where they stop. Reply with what you're building. I follow back builders.
3
83
Interesting repo: Pinvou/pinvou-agent (2650 stars). It is an open-source desktop AI agent workspace. It is written in Rust. It puts everyday work, visual design, and coding in one app. The goal is a result, not another chat reply. What you can do with it: Attach PDF, Office documents, images, and text files. Drag, drop, or paste them in. Build a local knowledge base with full-text and vector retrieval. Attach several collections to one chat and switch each one on or off. Run Codex, Claude Code, or Kimi through ACP in the same desktop window. The coding agent reads and edits a real project. It runs commands. It shows plans, tool steps, permission requests, and file changes. One concrete detail from the readme: the artifact panel collects every file the agent creates or edits. You preview, locate, and open them in one place. Markdown artifacts are editable. You can select a passage and ask the agent to revise it. Second detail: Plan and YOLO modes. Plan mode shows the plan first for complex work. YOLO mode executes directly when the task is clear. Third detail: sessions stay bound to their workspace. You can continue a session after you restart the app. Privacy: run a local model for a fully private loop, or connect any OpenAI-compatible endpoint. Extend it with MCP servers, CLI connectors, Skills, and workflows. A memory center captures long-term preferences. You review and confirm each candidate before it is saved. A persona card pool lets you save specialist roles for different domains. There is also a 90-second feature demo in the readme (Chinese). Bookmark it if you want a desktop agent that ends with a file, not a paragraph of text.
1
2
170
Hello @X Let's connect and learn from each other
1
31
Most PDF tools upload your file to a server. PaperPilot does not. PaperPilot is a PDF toolkit written in Rust. One engine runs on five surfaces. These are an MCP server, a CLI, a browser build, a desktop app, and a local REST API. The browser build uses WASM. The desktop app uses Tauri and Svelte. No Chromium. No C++ runtime. No cloud calls. It is at v0.6, and the community edition is Apache 2.0. What it means for builders: 1. Your coding agent gets PDF tools. PaperPilot ships a local stdio MCP server. Codex, Claude Code, Kimi Code, Pi, Claude Desktop and Cursor connect to it. Add the binary to claude_desktop_config.json, restart, then ask it to merge two PDFs and compress the result. 2. The CLI covers batch work. Merge with paperpilot merge --inputs doc1.pdf doc2.pdf --output merged.pdf. Compress with --quality 75. Rotate pages 1 and 3 to 5 with --angle 90. 3. The REST API is one command. Run paperpilot serve --port 7823. Then POST to /api/v1/pdf/merge from Python, Node or n8n. Swagger docs sit at localhost:7823/docs. 4. The browser build never uploads. Open usepaperpilot.com and watch the Network tab. You will see no file uploads. Files stay in browser memory. 5. v0.6 does real work. Organize: merge, split, rotate, delete, reorder, extract, booklet imposition, N-up grid. Optimize: compress. Extract: plain text and OCR through pure-Rust PaddleOCR via rten. Security: watermark, validate signatures, remove signatures, PII scan, deep sanitize. Office data: Excel to JSON and Excel to CSV. The honest limit: the export formats are not here yet. PDF to Markdown, HTML and JSON land in v0.7. PDF to Word, Excel and PowerPoint land in v0.8. Encrypt, decrypt, redact, forms and annotations are v0.9. Build it yourself if you want. You need Rust 1.75 or newer, Node.js, and pnpm. Then run cargo build --release with the cli, mcp and gateway packages. Which PDF step do you still do by hand in your agent pipeline?
3
101
Unit tests for the happy path take five minutes. The edge cases take the afternoon. These prompts do that part. 1. "Here is one function. List every input it can receive: empty, null, zero, negative, maximum, and wrong type. Do not write tests yet." 2. "For each input in that list, name the branch it hits and the line number. Mark any input that hits no branch." 3. "Write one test per boundary: empty string, one character, the maximum length, and one character past it. Use the test framework already in this file." 4. "Write the failure tests first. Assert the exact error type and the exact message. Do not assert only that it throws." 5. "Add a test that calls the function twice with the same input. Assert both results are equal. Name the state that could break this." 6. "Pass a wrong type on purpose. Show what the function does today, not what it should do. Mark the gap in a comment." 7. "List every dependency this function calls. Write one test that fakes each dependency, and one test where each dependency fails." 8. "Here is one line from the function: <paste line>. Show the test that fails if someone deletes it. If no test fails, tell me the suite has a gap." 9. "Name each test so the failure message says what broke. Use this format: functionName_condition_expectedResult." 10. "Give me the smallest set of tests that hits every branch. Delete any test that does not change the result. Show the count before and after." The last one is the one I run most. Most generated suites are too long and too shallow. Save this before your next refactor. Reply with the prompt you would add, and I will test it on a real function.
2
64
A 200 status code only tells you the request arrived. It says nothing about the data inside. I built a tool that fetched records. The API answered 200 every time. Some calls came back with an empty list. My agent did not notice. It wrote a report about nothing and passed it downstream. An empty result is not an error to the HTTP layer. It is an error to your tool. So check the payload, not the status. Here is the checklist I run now. 1. Read the status code. Then ignore it and check the shape. 2. Validate the schema, not just the field names. A field can exist and be null. 3. Count the rows. If the tool promises a list, assert the list is not empty. 4. Check required fields on every item. One missing id breaks the next step. 5. Compare against a baseline. If the last good run returned records and this one returns zero, stop. 6. Log the raw payload on failure. Truncate the values, keep the keys. 7. Fail loud. Raise a typed error. Do not return an empty list. The last point matters most. An empty list moves downstream and looks like valid data. A raised error stops the chain. Concrete detail: put the check in one place, a wrapper around every tool call. Validate with a schema library first, then add a minimum item count. Something like `if not items: raise ToolOutputError(name, raw)`. Keep the raw payload inside the error object. You will want it when you debug later. Two things to avoid. Do not trust `response.ok` and move on. Do not retry on empty data. Retry on errors. Empty data needs a different query, or a human look. How do you validate tool output in your agents? Schema only, or counts and baselines too? Share your approach.
30
You can run many Claude Code and Codex agents at once. The hard part is knowing which one waits on you. Harp puts every agent session in one sidebar. Each row shows the state. What it is: Harp is an unofficial fork of the open source Warp terminal. It replaces the tab bar with a sidebar built for long running coding agents. The rest of Warp stays as it is. A row shows one of three states: working, waiting for you, or done. An unread mark stays until you look. A dot means background work still runs. Cmd+R renames a tab. What it means for builders: 1. Groups survive a restart. Put tabs into named groups. With the tmux integration on, the group and the order are stored on the tmux sessions. Other tmux clients see the same layout. 2. Limit rings sit in the footer. Two rings per provider: the 5 hour window and the weekly limit. Hover one for the numbers and the reset times. Codex values come from its logs in ~/.codex/sessions. Claude values come from Claude Code's status line. Harp fetches nothing and reads no credentials. 3. It runs next to Warp. Harp has its own bundle id, its own URL scheme and its own settings folder at ~/.harp. Nothing is shared. Settings live in ~/.harp/settings.toml and the app reloads the file when it changes. 4. Updates come from GitHub releases. Harp checks the latest release every 10 minutes. It downloads the DMG in the background, checks the signature against Harp's Developer ID team, then offers a restart. 5. The extras are off by default. Turn tmux sync on in settings.toml. It reads names, groups, order and flags, and polls every 10 seconds. The limit rings are the exception and start on. One honest limit. Logging in through Harp is untested. The Claude rings also need a Claude.ai plan, not an API key. They appear after Claude Code's next answer. Which signal do you check first when several agents run at once?
3
1
7
432
A single timeout on the whole run is the wrong control. It kills your good long task and lets the stuck step sit there. Most agents have one timeout for the whole run. Two failures come from that. The run dies at the limit while a long but healthy task is almost done. And a stuck tool call holds the run open until the same limit. The fix is two timeouts. Per step timeout. One limit for each unit of work: a model call, an HTTP fetch, a shell command, a database query. Each step gets its own budget. A file read and a browser fetch do not need the same number. Run deadline. One limit for the whole job. Keep it as a final guard, not as the main control. Set it from the sum of your step budgets plus slack. Do not pick a round number once and forget it. Checklist: - Put a timeout on every outbound call, not only the top level. - Cancel the work on timeout. Do not only stop waiting. A shell command keeps running after you stop reading it. - Log the step name, the elapsed time, and the input on every timeout. A slow step and a stuck step look the same without this. - Make retries safe. A retried step must not write twice. - Add a heartbeat for long steps. A step that reports progress is alive, even after a long time. - Checkpoint before a write. A run deadline that fires mid write leaves partial state. Avoid one shared constant for all steps. That constant is too short for the slow step or too long for the stuck one. In my step config I keep two fields: timeout_ms for the step and deadline_ms for the run. The run deadline is derived, not typed by hand. Do you set the timeout per step or per run? Tell me which step in your agent always needs the longer budget.
2
143
the reward function is still the hard part, the rest is just compute.
Meta’s Muse Spark Open is live on the Baseten Loops SDK for post-training. Train it on your data with your reward functions; Loops runs the training and sampling infrastructure. When your checkpoint is ready, deploy it straight to a production inference endpoint. docs.baseten.co/loops/quicks…
1
1
104
Quick connect post: I build AI agents for small teams. The one handoff I trust is planner to checker. The checker gets the written plan only, not the chat history. The plan must stand alone, so weak steps show up fast. I have 10+ years as a senior SRE with Kubernetes, AWS and Terraform. I also write arXiv papers on chain-of-thought faithfulness. That work makes me trust written steps over hidden reasoning. Reply with what you're building. I follow back builders.
4
2
170
an agent passes in staging and fails in production. the gap is usually env drift: different vars, different keys, different model version, different network rules. what is your first check when that happens? not the full list, just the one thing you run before anything else.
30
one prompt change can shift output quality. no code diff shows it. a single prompt edit is hard to roll back without a naming scheme. how do you name and version your prompts so you can roll back one change? file per version, git, a registry, or something else?
3
5
137