Hi, I am Simon Sun

AI Engineering | Backend Developer | Open Source Enthusiast

“You Said No MCP!”

Source: “You Said No MCP!” — Earendil Author: Earendil Engineering · Originally published: September 29, 2026 Reprint note: The English article below is reproduced from the supplied PDF, with its original wording and links retained. The session replay has been completed using the supplied transcript; visit the source for the interactive replay. Statements about product behavior reflect the original publication date. If you went to pi.dev in the past, you found a proud declaration that Pi does not support MCP. If you listen to podcasts where we talked about Pi, you will have found more than one dismissive statement about MCP from us. Including a post by Mario about it. And yet, if you upgrade to Pi you will find MCP is now a supported piece of functionality. What happened? ...

September 30, 2026 · 8 min · 1652 words · Earendil Engineering

OpenAI Programmatic Tool Calling: Orchestrate Tools with JavaScript

Source: OpenAI API documentation — Programmatic Tool Calling Editorial note: This independently published companion preserves the guide’s technical structure and key examples in a condensed form. The official documentation is the canonical and most current reference. Programmatic Tool Calling lets a model write and run JavaScript that coordinates its available tools. Instead of returning every intermediate result to the model, a generated program can run calls concurrently, apply loops and conditions, combine results, and emit a smaller final value. ...

September 11, 2026 · 10 min · 1945 words · OpenAI

OpenAI Tool Search: Load Large Tool Catalogs on Demand

Source: OpenAI API documentation — Tool search Editorial note: This is an independently published companion to the official guide. It preserves the technical structure and key examples in a condensed form. The official documentation remains the canonical and most current reference. As an agent’s tool catalog grows, loading every definition into the model context becomes expensive. Parameter schemas consume input tokens even when the associated tools are irrelevant to the current task, and changing those definitions can invalidate a cached prompt prefix. ...

September 11, 2026 · 9 min · 1831 words · OpenAI

How Claude Code Auto Mode Works

This is a short note and some thoughts after reading this post: How we built Claude Code auto mode: a safer way to skip permissions When using Claude Code, you often run into permission prompts, also known as human-in-the-loop approval. If you give CC a complex task and then walk away from your computer, the task may get stuck waiting for one of these approvals. So people have come up with all kinds of hacks, such as using happy or remote desktop software to connect back to their machines. ...

June 14, 2026 · 4 min · 663 words · Simon Sun

In-Depth Analysis of MiroThinker 1.7: Engineering Optimizations and Guardrails for Long-Horizon Reasoning Agents

MiroThinker 1.7 has achieved SOTA results in the field of long-horizon question reasoning. These outstanding results stem from the combination of a powerful Model and a solid Harness. This article documents key engineering optimizations in its Harness implementation. Prerequisite Background MiroThinker is a deep research Agent — given a complex question (“what are the titles of the cs papers on arxiv today”), it autonomously breaks down the task, searches, scrapes webpages, runs Python for verification, and finally outputs the \boxed{answer}. The foundation is classic ReAct: each turn involves LLM reasoning + tool calling, the results are written back to the history, looping 200~300 times until convergence. ...

April 29, 2026 · 10 min · 1954 words · Simon Sun

Demystifying Evals for AI Agents

Source: Anthropic Engineering — Demystifying evals for AI agents Good evaluations help teams ship AI agents more confidently. Without them, it’s easy to get stuck in reactive loops—catching issues only in production, where fixing one failure creates others. Evals make problems and behavioral changes visible before they affect users, and their value compounds over the lifecycle of an agent. ...

February 14, 2026 · 29 min · 6086 words · Anthropic

OpenIM Self-Hosting Pitfalls (1): Stuck Online/Offline Process

We deployed OpenIM version 3.5.1 in our Kubernetes environment for our company’s IM scenarios. During development and operation, we encountered some issues. Here, I’ll document the details of the problems and the resolution process. Problem Trigger Scenario We wrote a stress testing program to simulate typical user scenarios: Establish connection (Online) Send message Receive reply Disconnect (Offline) Test settings: 100 concurrent user accounts, with each account continuously repeating the above process to simulate high-frequency online/offline scenarios. ...

February 12, 2026 · 6 min · 1142 words · Simon Sun

OpenIM Self-Hosting Pitfalls (2): Socket Leak

We deployed OpenIM version 3.5.1 in our Kubernetes environment for our company’s IM scenarios. During development and operation, we encountered some issues. Here, I’ll document the details of the problems and the resolution process. Problem Trigger Scenario 300 users online simultaneously, sending one-on-one messages irregularly. Problem Phenomenon From the monitoring metrics, we can see: A large number of goroutines in openimserver-openim-push and openimserver-openim-msggateway. A large number of socket connections in openimserver-openim-push and openimserver-openim-msggateway pods. ...

February 12, 2026 · 2 min · 268 words · Simon Sun

OpenIM Self-Hosting Pitfalls (3): Scaling Errors

We deployed OpenIM version 3.5.1 in our Kubernetes environment for our company’s IM scenarios. During development and operation, we encountered some issues. Here, I’ll document the details of the problems and the resolution process. Problem Description Simply put: Users are clearly online but cannot receive real-time messages. They can only receive push notifications, and messages only appear in the chat interface after a delay. This problem only occurs after scaling out. Everything works fine with a single node. The root cause is an inconsistency in OpenIM’s internal load balancing mechanism, causing messages to be sent to the wrong service node. ...

February 12, 2026 · 4 min · 683 words · Simon Sun