智能助手网
标签聚合 Mode

/tag/Mode

linux.do · 2026-04-18 20:40:28+08:00 · tech

any路由器因为跟claude code有一些参数适配的问题,所以我们可以在本地架设一个简单的网关,将参数在本地拦截,然后修改一下,再传给any大善人,就可以绕过这些参数适配的小问题了。 claudecode最新版本适用,不需要回退版本 这个本地网关做了什么 在本地监听 127.0.0.1:1998。 把 Claude Code 的请求转发到上游any的端口。 自动补认证头(Authorization / x-api-key)。 对 haiku 请求额外修正:补 context-1m-2025-08-07,并加 thinking.budget_tokens=1024。 把请求和响应写到 gateway_requests.jsonl 方便排错。 极简启动步骤 先开网关 export ANTHROPIC_BASE_URL=“any大善人地址” export ANTHROPIC_AUTH_TOKEN=“你的真实token” python3 /Users/Apple/Desktop/code/claude_gateway.py 新开一个终端再开 Claude Code ANTHROPIC_BASE_URL=“ http://127.0.0.1:1998 ” claude --enable-auto-mode 截图为证: 网关代码如下(vibe写的,很多冗余,大佬可以自行修改): #!/usr/bin/env python3 import base64 import json import os import threading from datetime import datetime, timezone from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from urllib.error import HTTPError, URLError from urllib.parse import urlsplit, urlunsplit from urllib.request import Request, urlopen LISTEN_HOST = os.getenv("CLAUDE_GATEWAY_HOST", "127.0.0.1") LISTEN_PORT = int(os.getenv("CLAUDE_GATEWAY_PORT", "1998")) UPSTREAM_BASE_URL = os.getenv( "ANTHROPIC_BASE_URL", "https://a-ocnfniawgw.cn-shanghai.fcapp.run" ) UPSTREAM_AUTH_TOKEN = os.getenv("ANTHROPIC_AUTH_TOKEN", "") UPSTREAM_TIMEOUT = float(os.getenv("CLAUDE_GATEWAY_TIMEOUT", "120")) LOG_PATH = os.getenv( "CLAUDE_GATEWAY_LOG", os.path.join(os.path.dirname(__file__), "gateway_requests.jsonl") ) LOG_LOCK = threading.Lock() def utc_now_iso() -> str: return datetime.now(timezone.utc).isoformat() def ensure_log_parent_exists() -> None: parent = os.path.dirname(LOG_PATH) if parent: os.makedirs(parent, exist_ok=True) def decode_body_for_log(body: bytes) -> dict: if not body: return {"encoding": "utf-8", "text": ""} try: return {"encoding": "utf-8", "text": body.decode("utf-8")} except UnicodeDecodeError: return {"encoding": "base64", "text": base64.b64encode(body).decode("ascii")} def append_log(record: dict) -> None: ensure_log_parent_exists() line = json.dumps(record, ensure_ascii=False) with LOG_LOCK: with open(LOG_PATH, "a", encoding="utf-8") as f: f.write(line + "\n") def build_upstream_url(base_url: str, incoming_path: str) -> str: base = urlsplit(base_url) incoming = urlsplit(incoming_path) incoming_path_only = incoming.path or "/" base_path = base.path.rstrip("/") if base_path: merged_path = f"{base_path}{incoming_path_only}" else: merged_path = incoming_path_only return urlunsplit((base.scheme, base.netloc, merged_path, incoming.query, "")) def rewrite_request_headers(headers: dict, path: str) -> dict: rewritten = dict(headers) if UPSTREAM_AUTH_TOKEN: has_x_api_key = any(k.lower() == "x-api-key" for k in rewritten) has_authorization = any(k.lower() == "authorization" for k in rewritten) if not has_x_api_key: rewritten["x-api-key"] = UPSTREAM_AUTH_TOKEN if not has_authorization: rewritten["Authorization"] = f"Bearer {UPSTREAM_AUTH_TOKEN}" # 先做骨架,后续按 any 规则逐步覆写。 return rewritten def rewrite_request_body(body: bytes, headers: dict, path: str) -> bytes: if not body: return body content_type = "" for k, v in headers.items(): if k.lower() == "content-type": content_type = v break if "application/json" not in content_type.lower(): return body try: payload = json.loads(body.decode("utf-8")) except (UnicodeDecodeError, json.JSONDecodeError): return body model = str(payload.get("model", "")).lower() if not model.startswith("claude-haiku"): return body beta_key = None for k in headers.keys(): if k.lower() == "anthropic-beta": beta_key = k break raw_beta = headers.get(beta_key, "") if beta_key else "" beta_features = [item.strip() for item in raw_beta.split(",") if item.strip()] if "context-1m-2025-08-07" not in beta_features: beta_features.append("context-1m-2025-08-07") merged_beta = ",".join(beta_features) if beta_key: headers[beta_key] = merged_beta else: headers["anthropic-beta"] = merged_beta payload["thinking"] = {"type": "enabled", "budget_tokens": 1024} return json.dumps(payload, ensure_ascii=False, separators=(",", ":")).encode("utf-8") class ClaudeGatewayHandler(BaseHTTPRequestHandler): protocol_version = "HTTP/1.1" def do_GET(self): self._handle_proxy() def do_POST(self): self._handle_proxy() def do_PUT(self): self._handle_proxy() def do_PATCH(self): self._handle_proxy() def do_DELETE(self): self._handle_proxy() def do_OPTIONS(self): self._handle_proxy() def do_HEAD(self): self._handle_proxy() def log_message(self, fmt, *args): return def _read_request_body(self) -> bytes: content_length = int(self.headers.get("Content-Length", "0") or "0") if content_length <= 0: return b"" return self.rfile.read(content_length) def _copy_request_headers(self) -> dict: headers = {} for key, value in self.headers.items(): key_l = key.lower() if key_l in {"host", "content-length", "connection", "accept-encoding"}: continue headers[key] = value return headers def _send_response(self, status: int, headers: dict, body: bytes) -> None: self.send_response(status) ignored = {"transfer-encoding", "content-length", "connection"} for k, v in headers.items(): if k.lower() in ignored: continue self.send_header(k, v) self.send_header("Content-Length", str(len(body))) self.send_header("Connection", "close") self.end_headers() if self.command != "HEAD" and body: self.wfile.write(body) def _handle_proxy(self): req_body = self._read_request_body() req_headers = self._copy_request_headers() req_headers = rewrite_request_headers(req_headers, self.path) req_body = rewrite_request_body(req_body, req_headers, self.path) upstream_url = build_upstream_url(UPSTREAM_BASE_URL, self.path) request_log = { "timestamp": utc_now_iso(), "client_ip": self.client_address[0] if self.client_address else "", "method": self.command, "path": self.path, "upstream_url": upstream_url, "headers": dict(self.headers.items()), "body": decode_body_for_log(req_body), "body_length": len(req_body), } try: upstream_req = Request( url=upstream_url, data=req_body if req_body else None, headers=req_headers, method=self.command, ) with urlopen(upstream_req, timeout=UPSTREAM_TIMEOUT) as resp: resp_status = resp.getcode() resp_headers = dict(resp.headers.items()) resp_body = resp.read() request_log["response"] = { "status": resp_status, "headers": resp_headers, "body": decode_body_for_log(resp_body), "body_length": len(resp_body), } append_log(request_log) self._send_response(resp_status, resp_headers, resp_body) return except HTTPError as e: err_body = e.read() if hasattr(e, "read") else b"" err_headers = dict(e.headers.items()) if getattr(e, "headers", None) else {} request_log["response"] = { "status": e.code, "headers": err_headers, "body": decode_body_for_log(err_body), "body_length": len(err_body), } append_log(request_log) self._send_response(e.code, err_headers, err_body) return except (URLError, TimeoutError, Exception) as e: error_payload = { "error": "gateway_upstream_error", "message": str(e), } error_body = json.dumps(error_payload, ensure_ascii=False).encode("utf-8") request_log["response"] = { "status": 502, "headers": {"Content-Type": "application/json; charset=utf-8"}, "body": {"encoding": "utf-8", "text": error_body.decode("utf-8")}, "body_length": len(error_body), } append_log(request_log) self._send_response( 502, {"Content-Type": "application/json; charset=utf-8"}, error_body, ) def main(): server = ThreadingHTTPServer((LISTEN_HOST, LISTEN_PORT), ClaudeGatewayHandler) print(f"[gateway] listening on http://{LISTEN_HOST}:{LISTEN_PORT}") print(f"[gateway] upstream: {UPSTREAM_BASE_URL}") print(f"[gateway] auth token configured: {bool(UPSTREAM_AUTH_TOKEN)}") print(f"[gateway] log file: {LOG_PATH}") server.serve_forever() if __name__ == "__main__": main() 3 个帖子 - 2 位参与者 阅读完整话题

hnrss.org · 2026-04-17 23:51:56+08:00 · tech

I read HN every day, usually late at night and have seen people request a dark mode many times. Basically, I couldn't find one that I liked, so I built the one that I've always wanted. It's inspired by terminal and IDE themes. A few cool features: - j/k to move, Enter to open, v to cycle density, 1–9 to switch themes, Esc to close - Three density modes: compact, comfortable, and an immersive reading view - 8 terminal-inspired themes (dracula, solarized, monokai, one dark, etc.) - Article preview pane that pulls OG metadata so you can skim without leaving the feed Stack: vanilla TypeScript + Vite, Cloudflare Pages Functions, CapacitorJS for the iOS/Android wrappers. Android and iOS apps coming soon, if folks request it. Would especially appreciate feedback and upvotes. Thanks for reading this far! Comments URL: https://news.ycombinator.com/item?id=47807269 Points: 2 # Comments: 1

www.ithome.com · 2026-04-17 22:38:14+08:00 · tech

IT之家 4 月 17 日消息,据彭博社今日报道,特斯拉正准备最早于下周在印度推出更大尺寸、六座长轴距配置的 Model Y L。 标准五座版 Model Y 自去年 7 月起已在印度开售。这将是特斯拉自去年 7 月进入印度市场以来,在该国推出的首款新品。 新增的六座车型将从特斯拉上海超级工厂出口。截至目前,上海工厂是唯一生产该车型的工厂,同时也是特斯拉向印度进口标准版和长续航版 Model Y 的供应来源。 由于印度进口汽车面临 70% 至 110% 不等的关税,所以 Model Y 入门版在印度的价格高达 600-610 万卢比(IT之家注:现汇率约合 43.8 - 44.5 万元人民币),长续航版约 678.9 万至 680 万卢比(现汇率约合 49.6 万至 49.6 万元人民币)。 根据印度官方车辆注册数据,2025 年全年特斯拉在该国注册量仅 227 辆。彭博社今年 1 月报道称,由于需求不及预期,特斯拉被迫提供 20 万卢比(现汇率约合 14602 元人民币)的折扣以消化印度库存车。据称,该公司最初的目标是去年用完其每年 2500 辆的全部进口配额,但未能完成。 特斯拉去年 8 月在中国率先发布了 Model Y L,起售价约为 33.9 万元人民币,定位高于标准版 Model Y。该公司此前已表示,Model Y L 并非中国市场独有产品。该车型已确认将进入澳大利亚和新西兰等市场,特斯拉还暗示其他地区也可能跟进。

linux.do · 2026-04-17 18:01:53+08:00 · tech

一、/命令: 新手/powerup 新手教程 /model; /config; /effort; /permissions alt + t 开启当前session是否额外思考 alt+m 权限切换 Esc Esc 回滚状态 /tasks 查看后台任务,运行命令 +& 可以后台测试 /remote-control 远程操控 /teleport 将远程历史结果等拉到本地 /status 查看状态 /context 查看上下文使用情况 /compact 传递指令怎么进行上下文压缩,比如保留xx计划 /diff opens an interactive viewer for uncommitted changes — useful for reviewing what Claude has done before committing. /doctor checks installation health 二、Memory: /init 生成CLAUDE.md; /memory在线修改, CLAUDE.md三级 repo/home/ per-directory overrides 对于较大的项目,可以将指令拆分成 .claude/rules/ .md 文件。规则可以是全局的项目,也可以用 Frontmatter 范围到路径。一条带有路径的规则:src/api/**/ .ts 只有在 Claude 处理匹配文件时才会激活: paths: src/api/**/*.ts --- All API endpoints must validate input with Zod. Return 400 with field-level errors on validation failure. CLAUDE_CODE_NEW_INIT=1; CLAUDE_CODE_DISABLE_AUTO_MEMORY=1; 默认自动维护memory; 记住某件事,就自然地问,比如“记住API测试需要Redis。”如果你想把它写进 CLAUDE.md,可以明确要求Claude把它加进去。 三、Project Setup: 代码开始进行init; CLAUDE.md怎么写: A good `CLAUDE.md` is concise and specific. Aim for under 200 lines per file. Every line should be relevant to nearly every session — if something only matters for one feature, put it in a path-scoped rules file instead. The most valuable sections are: tech stack and versions, development commands (install, test, build, lint), naming conventions that aren’t obvious, and known gotchas that would trip up a new developer. eg: # Project: Payment Service ## Stack - Node.js 20, TypeScript 5, PostgreSQL 15 - Express for API, Prisma for ORM, Jest for tests ## Commands - `npm run dev` — start with hot reload - `npm test` — run test suite - `npm run migrate` — apply pending migrations - `npm run lint` — ESLint + Prettier check ## Conventions - All monetary values stored as integers (cents) - Use `Result<T, E>` pattern for error handling, never throw in service layer - Database columns: snake_case; TypeScript: camelCase 三层配置文件: .claude/settings.local.json, .claude/settings.json, ~/.claude/settings.json 四、Commands in Depth 进阶命令 当上下文不够时组合命令: /context /compact focus on the auth refactor /branch /rename auth-refactor-v2 /export auth-refactor-v2.md claude code 内置skills: /simplify:指的是对最近修改的文件进行代码质量审查,同时启动多个并行的审查代理,每个代理专注于不同的审查方面(如安全性、性能、可读性等)。 /batch <instruction>: 对大量文件进行大规模修改,会先规划工作流程,确保变更有序进行。使用隔离的 Git 工作树,以避免对主分支造成干扰,确保操作安全。能够协调验证过程,并支持以拉取请求(PR)为导向的后续跟进,提高协作效率。 /loop 5m check deploy status:以5分钟为间隔周期性执行“检查部署状态”的操作。 会按设定的时间间隔反复运行一个提示或检查任务。 这种重复检查机制特别适用于监控耗时较长的后台操作(如部署、构建等)的状态变化。 /debug:该命令用于启用详细日志记录,帮助诊断Claude行为或工具使用过程中出现的问题。 /claude-api:该命令用于加载项目所用语言的Anthropic SDK参考文档,当检测到项目中导入了@anthropic-ai/sdk或Python的anthropic包时会自动激活。 eg: /simplify /batch add JSDoc comments to all public functions in src/ /loop 2m check if the build finished /debug Fast Mode 使 Claude Opus 4.6 的速度约为 2.5 倍,但token更多;不会降低质量,有次数限制,但/effort会降低质量;{快速模式符号↯} eg: /fast # toggle on/off /fast on # explicitly enable /fast off # explicitly disable 五、快捷键: Ctrl+O :实时查看工具调用和思考步骤 /btw:用于提出一个附加问题或补充信息,不会将其加入对话历史,适合用于核实事实或询问语法细节,避免干扰当前对话上下文。 Ctrl+B:将正在运行的bash命令或代理任务置于后台执行,使用户可以在不中断任务的情况下继续向Claude发出其他指令。 Ctrl+X Ctrl+K:官方快捷键,用于终止所有在后台运行的代理任务 /insights :生成会话分析报告,包含统计数据,说明已完成的任务。 六、Skills .claude/skills/code-review/ ├── SKILL.md # Instructions (required) ├── templates/ │ └── review-checklist.md └── scripts/ └── analyze-metrics.py 技能描述存储:上下文1%+8000字符;更多通过辅助文件引入:比如 For the full review checklist, see [templates/review-checklist.md](templates/review-checklist.md). SKILL.md 通过bash读入,不超过500行,超过的建议加到单个文件中引入; !command 举例: name: pr-summary description: Summarize pull request changes. Use when asked to review or summarize a PR. context: fork agent: Explore --- ## PR context - Diff: !`gh pr diff` - Comments: !`gh pr view --comments` - Changed files: !`gh pr diff --name-only` Summarize the intent and key changes in this pull request. 技能调用: disable-model-invocation: true; 模型不能自动调用skill,deploys, pushes, sends等操作 user-invocable: false,用户不调用,让模型调用 paths: 接受一个 YAML 格式的通配符列表,用于限定技能适用的范围。工作目录匹配这些通配符时,技能才会被加载 eg: --- name: api-generator description: Generate REST API endpoints from schema definitions. paths: ["src/**/*.ts", "tests/**"] --- 七、Hooks 定义: 在 Claude Code 会话中特定事件触发时自动执行的脚本,用于响应系统事件并执行预设操作。 它们通过标准输入(stdin)接收 JSON 格式的输入数据,以便获取事件相关信息。 它们通过退出码和标准输出(stdout)返回 JSON 格式的执行结果,实现与系统通信。 钩子架构与配置 钩子在设置文件中通过一个名为 hooks 的键进行配置。 每个事件都包含一个匹配器数组,每个匹配器又包含一个钩子定义数组。 匹配器字段是一个正则表达式模式,用于匹配工具名称——‘Bash’ 仅精确匹配该工具名,‘Write|Edit’ 匹配其中任意一个,‘ ’ 匹配所有工具,'mcp__github__. ’ 匹配所有以 mcp__github__ 开头的 GitHub MCP 工具。 eg: { "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "command": "python3 \"$CLAUDE_PROJECT_DIR/.claude/hooks/validate-bash.py\"", "timeout": 10 } ] } ] } } Matchers也支持一个条件性的if字段(v2.1.85),该字段使用权限规则语法进一步过滤钩子触发的时机。 虽然matcher通过名称选择工具,但if可将范围缩小到该工具的特定调用。 当您只关注工具调用的子集时这很有用——例如,仅拦截git push命令而不对每次Bash调用都执行操作。 eg: { "hooks": { "PreToolUse": [ { "matcher": "Bash", "if": "Bash(git push*)", "hooks": [ { "type": "command", "command": "/path/to/check-push.sh" } ] } ] } } Claude Code 支持30多个钩子事件。日常工作中最有用的有: PreToolUse(在工具运行前进行验证,可阻止执行) PostToolUse(在工具执行后观察或响应,可添加上下文) UserPromptSubmit(在 Claude 处理用户输入前拦截输入) Stop(在 Claude 完成响应时执行检查) (PermissionRequest), 还有用于权限处理的事件 notifications, 通知事件 subagent lifecycle (SubagentStart, SubagentStop)子代理生命周期事件; failures (PostToolUseFailure, StopFailure),故障事件 config changes, 配置变更事件; file watching (FileChanged) 文件监视事件; context compaction (PreCompact, PostCompact), 上下文压缩事件; worktree management 工作树管理事件。 多个新事件扩展了钩子可响应的范围。 CwdChanged(v2.1.83)在工作目录变更时触发,支持类似 direnv 的动态环境管理——例如,当 Claude 进入项目目录时自动加载环境变量。 TaskCreated(v2.1.84)在使用 TaskCreate 工具时触发,可用于记录或验证新任务的创建。 WorktreeCreate(v2.1.84)在创建工作树代理时触发,并支持 type: ‘http’ 类型的远程通知——适用于在并行工作开始时向外部服务发送警报。 Elicitation(v2.1.76)在 MCP 服务器通过交互式对话请求任务中的结构化用户输入时触发,可拦截并修改该请求内容,在展示给用户前进行调整。 ElicitationResult(v2.1.76)在用户对 MCP 的 elicitation 响应后触发,可拦截并覆盖响应内容,在发送回 MCP 服务器前进行修改。 “PreCompact” 是一个事件名称,指在 Claude Code 执行对话压缩以释放上下文空间之前触发的钩子事件。 它在压缩操作正式开始前运行,允许开发者或系统在关键时刻介入处理。 该事件可用于阻止压缩操作的进行,例如当需要保存当前状态、向用户发出警告或拒绝可能丢失关键信息的自动压缩时。 事件的 matcher 字段用于判断触发原因:当值为 ‘manual’ 时表示用户手动执行了 /compact 命令;当值为 ‘auto’ 时表示系统因上下文容量已满而自动触发了压缩。 若要阻止压缩发生,可通过返回退出码 2 或使用 JSON 决策负载(payload)来实现,例如: { "hooks": { "PreCompact": [ { "matcher": "auto", "hooks": [ { "type": "command", "command": "./scripts/snapshot-context.sh" } ] } ] } } 钩子返回: {"decision": "block", "reason": "active refactor in flight"} 钩子脚本通过 stdin 接收 JSON。Python 钩子的读法是这样的: import json, sys data = json.load(sys.stdin) tool_name = data.get("tool_name", "") tool_input = data.get("tool_input", {}) 退出码0表示成功,需从标准输出(stdout)中解析JSON格式的输出结果。 退出码2表示阻断性错误,Claude会停止运行,并显示你标准错误(stderr)中的信息。 其他任何退出码均表示非阻断性警告,仅在详细模式(verbose mode)下显示。 钩子(Hook)的常见分类和典型应用方式 在执行写入或编辑操作后触发的 工具使用后钩子 ,用于自动化后续处理。 系统会自动调用指定的格式化程序来整理内容。 确保 Claude 的输出始终整洁,表示无论用户输入如何,最终输出都会保持良好的排版和结构。 eg: #!/bin/bash INPUT=$(cat) FILE=$(echo "$INPUT" | python3 -c "import sys,json; print(json.load(sys.stdin).get('tool_input',{}).get('file_path',''))") case "$FILE" in *.ts|*.tsx|*.js) prettier --write "$FILE" 2>/dev/null ;; *.py) black "$FILE" 2>/dev/null ;; *.go) gofmt -w "$FILE" 2>/dev/null ;; esac exit 0 安全扫描在写入时使用PostToolUse和additionalContext输出警告Claude关于它刚刚写入的可能机密信息, 例如 SECRET_PATTERNS = [ (r"api[_-]?key\s*=\s*['\"][^'\"]+['\"]", "Potential hardcoded API key"), (r"password\s*=\s*['\"][^'\"]+['\"]", "Potential hardcoded password"), ] # ... check content, then: output = {"hookSpecificOutput": {"hookEventName": "PostToolUse", "additionalContext": f"Security warnings: {'; '.join(warnings)}"}} print(json.dumps(output)) 使用PreToolUse和正则表达式检查以及退出代码2来阻止危险命令: BLOCKED = [(r"\brm\s+-rf\s+/", "Blocking dangerous rm -rf /")] for pattern, message in BLOCKED: if re.search(pattern, command): print(message, file=sys.stderr) sys.exit(2) Advanced: Prompt Hooks and Component Scope 提示钩子和作用域 prompt 钩子 对于 Stop 和 SubagentStop 停止事件, prompt 类型的钩子使用LLM来评估任务完成情况。LLM阅读对话并返回一个关于是否让Claude停止或继续工作的结构化决策。这对于具有明确完成标准的工作任务来说非常强大。 eg: { "hooks": { "Stop": [ { "hooks": [ { "type": "prompt", "prompt": "Check: 1) Were all files modified? 2) Do tests pass? 3) Is the PR description updated? If anything is missing, explain what.", "timeout": 30 } ] } ] } } agent 钩子 钩子类型 “agent” 会派生一个子代理进行评估——与提示钩子(单轮)不同,代理钩子可以使用工具并执行多步推理。当检查需要读取文件或运行命令时使用此功能。 钩子也可以通过hooks frontmatter字段针对单个技能和代理进行范围限定。一个技能的前置工具使用钩子仅在执行该技能时触发: eg: --- name: production-deploy hooks: PreToolUse: - matcher: "Bash" hooks: - type: command command: "./scripts/production-safety-check.sh" once: true --- once : true : 只在会话中运行一次钩子,而不是在每次匹配工具使用时都运行。这对于只需要发生一次的设置检查很有用。 2 个帖子 - 1 位参与者 阅读完整话题

www.ithome.com · 2026-04-16 17:01:47+08:00 · tech

IT之家 4 月 16 日消息,特斯拉 Model S 和 Model X 的生产将以 350 辆签名版车型收尾,每辆车都附带大量专属权益,定价也十分高昂。除此之外,购车者必须同意:自交付之日起至少一年内不得转售。特斯拉此前曾尝试推行此类规定,但均以失败告终。而这一次,他们或许找到了能真正起效的约束手段。 据外媒 Not A Tesla App 曝光的订单文件显示,购买最后一批 Model S Plaid 与 Model X Plaid 签名纪念版的用户,在提车前必须签署一份严格的禁止转售协议。车主需承诺在车辆交付后的第一年内,不得出售、甚至不得尝试出售该车。一旦违约,车主将需支付 5 万美元(IT之家注:现汇率约合 34.2 万元人民币)违约金,或赔偿其转售获利金额,以两者中数额更高者为准。 此举显然是为了防止投机者立刻倒卖这最后的 350 台纪念版,从中牟取暴利。特斯拉仅生产 250 台 Model S、100 台 Model X 纪念版,均采用专属的石榴红车漆、金色车标与独特装饰套件。 IT之家注意到,特斯拉此前在 Cybertruck 上也试过类似手段,但最终整个计划宣告失败。该政策刚推出就遭到强烈反对。车主们认为,特斯拉试图管控他们已经付费购买的车辆;还有人直接无视条款,依旧把皮卡挂出转售。短短数月内,随着 Cybertruck 供应量上升、市场降温,特斯拉便悄悄取消了这一限制。而这一次,情况有几个关键差异。 新版协议条款更清晰,执行难度也可能更低。Cybertruck 的合同依赖模糊的“不可预见原因”等表述,而纪念版协议直接写明:车主在一年内不得出售或以任何方式尝试出售车辆。 特斯拉这次的约束力也更强,因为这批车是真正的限量款:总计仅 350 台,远少于 Cybertruck 的数千台产量。最重要的是,特斯拉将 FSD、免费超充、高级车载连接服务等核心权益设为不可转让。这意味着即便一年后,车辆对二手买家的价值也会降低,从根源上削弱了倒卖动机。 相关阅读: 《 特斯拉将限量发售“签名版”Model S/X Plaid,售价近 16 万美元 》