这是一份入门AI/LLM大模型的逐步指南,包含教程和演示代码,带你从API走进本地大模型部署和微调,代码文件会提供Kaggle或Colab在线版本,即便没有显卡也可以进行学习。项目中还开设了一个小型的代码游乐场🎡,你可以尝试在里面实验一些有意思的AI脚本。同时,包含李宏毅 (HUNG-YI LEE)2024生成式人工智能导论课程的完整中文镜像作业。
This report summarizes scanner evidence for Hoper-J/AI-Guide-and-Demos-zh_CN, a Python project with 4,676 GitHub stars. SynthScan examined 42,487 lines of code across 80 source files, recording 149 pattern matches distributed across 10 syntactic categories. The legacy adjusted pattern signal is 8.0 (Moderate pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 43 finding(s).
Are imports declared and package/API names verified? 44 finding(s).
Are wrappers, guards, and repeated structures necessary? 86 finding(s).
Which changes need focused human review? 149 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 149 distinct pattern matches across 10 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | Guide/DeepSeek API 流式输出解析 - OpenAI SDK.md | 28 | api_key="your-api-key", | CODE |
| HIGH | Guide/DeepSeek API 流式输出解析 - OpenAI SDK.md | 216 | api_key="your-api-key", | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 49 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 81 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 199 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 305 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 364 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 405 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 465 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/DeepSeek API 多轮对话 - OpenAI SDK.md | 553 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" | CODE |
| HIGH | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 57 | export OPENAI_API_KEY="your-api-key" | CODE |
| HIGH | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 63 | set OPENAI_API_KEY=your-api-key | CODE |
| HIGH⚡ | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 75 | echo 'export OPENAI_API_KEY="your-api-key"' >> ~/.bashrc | CODE |
| HIGH⚡ | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 82 | echo 'export OPENAI_API_KEY="your-api-key"' >> ~/.zshrc | CODE |
| HIGH⚡ | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 91 | echo export OPENAI_API_KEY="your-api-key" >> %USERPROFILE%\Documents\WindowsPowerShell\Microsoft.PowerShell_profile. | CODE |
| HIGH | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 102 | os.environ['OPENAI_API_KEY'] = 'your-api-key' | CODE |
| HIGH | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 152 | api_key=os.getenv('OPENAI_API_KEY'), # 如果你没有配置环境变量,使用 api_key="your-api-key" 替换 | CODE |
| HIGH | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 175 | >注意,不要误用成 `api_key=os.getenv("your-api-key")`,`os.getenv()`用于获取对应系统环境变量的值,API本身并不是这个环境变量,正确的用法是 ``api_key="your-api-key" | CODE |
| HIGH | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 319 | os.environ['ZHIPUAI_API_KEY'] = 'your-api-key' # 1 | CODE |
| HIGH | Guide/01. 初识 LLM API:环境配置与多轮对话演示.md | 453 | os.environ['DEEPSEEK_API_KEY'] = 'your-api-key' # 1 | CODE |
| HIGH | Guide/DeepSeek API 统一模型对话逻辑与流式输出.md | 189 | "api_key": "your-api-key", | CODE |
| HIGH | Guide/DeepSeek API 统一模型对话逻辑与流式输出.md | 205 | > api_key="your-api-key", | CODE |
| HIGH | Guide/DeepSeek API 统一模型对话逻辑与流式输出.md | 413 | "api_key": "your-api-key", | CODE |
| HIGH | Guide/DeepSeek API 统一模型对话逻辑与流式输出.md | 435 | "api_key": "your-api-key", | CODE |
| HIGH | Guide/DeepSeek API 输出解析 - OpenAI SDK.md | 30 | api_key="your-api-key", # 1:替换成对应的 API_Key,可以使用环境变量而非明文填写,即 api_key=os.getenv("DEEPSEEK_API_KEY") | CODE |
| HIGH | Guide/DeepSeek API 输出解析 - OpenAI SDK.md | 66 | - api_key="your-api-key", #1 | CODE |
| HIGH | Guide/DeepSeek API 输出解析 - OpenAI SDK.md | 73 | + api_key="your-api-key", #1 | CODE |
| HIGH | Guide/DeepSeek API 输出解析 - OpenAI SDK.md | 87 | api_key="your-api-key", # 1:替换成对应的 API_Key | CODE |
| HIGH | Guide/DeepSeek API 输出解析 - OpenAI SDK.md | 293 | api_key="your-api-key", # 1:替换成对应的 API_Key | CODE |
| HIGH | Guide/DeepSeek API 的获取与对话示例.md | 72 | os.environ["DEEPSEEK_API_KEY"] = "your-api-key" # 1 | CODE |
| HIGH | Guide/DeepSeek API 的获取与对话示例.md | 139 | os.environ["SILICONFLOW_API_KEY"] = "your-api-key" # 1 | CODE |
| HIGH | Guide/DeepSeek API 的获取与对话示例.md | 223 | os.environ["DASHSCOPE_API_KEY"] = "your-api-key" # 1 | CODE |
| HIGH | Guide/DeepSeek API 的获取与对话示例.md | 290 | os.environ["BAIDU_API_KEY"] = "your-api-key" # 1 | CODE |
| HIGH | Guide/DeepSeek API 的获取与对话示例.md | 408 | os.environ["ARK_API_KEY"] = "your-api-key" # 1 | CODE |
| HIGH | CodePlayground/README.md | 117 | uv run python summarizer.py file_path [--api_key YOUR_API_KEY] [--output_dir OUTPUT_DIR] [其他可选参数] | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Guide/03. 进阶指南:自定义 Prompt 提升大模型解题能力.md | 98 | except Exception as e: | CODE |
| LOW | Guide/03. 进阶指南:自定义 Prompt 提升大模型解题能力.md | 151 | except Exception: | CODE |
| LOW | Guide/03. 进阶指南:自定义 Prompt 提升大模型解题能力.md | 195 | except Exception as e: | CODE |
| LOW | Guide/03. 进阶指南:自定义 Prompt 提升大模型解题能力.md | 216 | except Exception as e: | CODE |
| LOW | Guide/03. 进阶指南:自定义 Prompt 提升大模型解题能力.md | 237 | except Exception as e: | CODE |
| LOW | Guide/02. 简单入门:通过 API 与 Gradio 构建 AI 应用.md | 70 | except Exception as e: | CODE |
| LOW | Guide/02. 简单入门:通过 API 与 Gradio 构建 AI 应用.md | 287 | except Exception as e: | CODE |
| LOW | Guide/02. 简单入门:通过 API 与 Gradio 构建 AI 应用.md | 425 | except Exception as e: | CODE |
| LOW | …6. 用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画.md | 142 | except Exception: | CODE |
| LOW | …6. 用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画.md | 440 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 1238 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 1363 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 1421 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 1882 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 1927 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 2019 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 2071 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 2082 | except Exception as e: | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 2092 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 239 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 257 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 274 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 285 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 502 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 516 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 532 | except Exception as e: | CODE |
| LOW | …GUF 模型(分片 & Shared & Split & 00001-of-0000...的解决方法).md | 543 | except Exception as e: | CODE |
| LOW | …9b. 从加载到对话:使用 Llama-cpp-python 本地运行量化 LLM 大模型(GGUF).md | 476 | except Exception as e: | CODE |
| LOW | CodePlayground/chat.py | 91 | except Exception as e: | CODE |
| LOW | CodePlayground/chat.py | 197 | except Exception as e: | CODE |
| LOW | CodePlayground/chat.py | 371 | except Exception as e: | CODE |
| LOW | CodePlayground/chat.py | 439 | except Exception as e: | CODE |
| LOW | CodePlayground/summarizer.py | 90 | except Exception as e: | CODE |
| LOW | CodePlayground/summarizer.py | 145 | except Exception as e: | CODE |
| LOW | CodePlayground/summarizer.py | 200 | except Exception as e: | CODE |
| LOW | CodePlayground/summarizer.py | 348 | except Exception as e: | STRING |
| LOW | CodePlayground/sd_lora.py | 97 | except Exception as e: | CODE |
| LOW | CodePlayground/utils/config_manager.py | 48 | except Exception as e: | CODE |
| LOW | CodePlayground/utils/config_manager.py | 81 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_func_metadata.py | 30 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_func_metadata.py | 155 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_func_metadata.py | 213 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 135 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 180 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 272 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 324 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 335 | except Exception as e: | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 345 | except Exception as e: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 561 | # --------------------------- | COMMENT |
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 563 | # --------------------------- | COMMENT |
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 574 | # --------------------------- | COMMENT |
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 576 | # --------------------------- | COMMENT |
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 622 | # --------------------------- | COMMENT |
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 624 | # --------------------------- | COMMENT |
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 660 | # --------------------------- | COMMENT |
| MEDIUM | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 662 | # --------------------------- | COMMENT |
| MEDIUM | CodePlayground/chat.py | 1 | # =============================================================== | COMMENT |
| MEDIUM | CodePlayground/chat.py | 16 | # =============================================================== | COMMENT |
| MEDIUM | CodePlayground/summarizer.py | 1 | # =============================================================== | COMMENT |
| MEDIUM | CodePlayground/summarizer.py | 15 | # =============================================================== | COMMENT |
| MEDIUM | CodePlayground/sd_lora.py | 1 | # =============================================================== | COMMENT |
| MEDIUM | CodePlayground/sd_lora.py | 14 | # =============================================================== | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Guide/17. 浅谈 RTN 模型量化:非对称 vs 对称.md | 530 | def pytorch_quantize_symmetric(fp32_tensor): | CODE |
| LOW | Guide/17. 浅谈 RTN 模型量化:非对称 vs 对称.md | 559 | def custom_quantize_compare_symmetric(fp32_values): | CODE |
| LOW | Guide/14. PEFT:在大模型中快速应用 LoRA.md | 153 | def print_trainable_parameters(model): | CODE |
| LOW | Guide/07. 探究模型参数与显存的关系以及不同精度造成的影响.md | 383 | def load_model_and_measure_memory(precision, model_name, device): | CODE |
| LOW | Guide/21. BPE vs WordPiece:理解 Tokenizer 的工作原理与子词分割方法.md | 544 | def count_char_pairs_wordpiece(word_freq): | CODE |
| LOW | Guide/21. BPE vs WordPiece:理解 Tokenizer 的工作原理与子词分割方法.md | 715 | def count_char_pairs_wordpiece(word_freq): | CODE |
| LOW | …e/f. 交叉熵损失函数 nn.CrossEntropyLoss() 详解和要点提醒(PyTorch).md | 538 | def custom_weighted_cross_entropy(logits, targets, weights): | CODE |
| LOW | …e/f. 交叉熵损失函数 nn.CrossEntropyLoss() 详解和要点提醒(PyTorch).md | 559 | def custom_label_smoothing_cross_entropy(logits, targets, alpha): | CODE |
| LOW | …e/f. 交叉熵损失函数 nn.CrossEntropyLoss() 详解和要点提醒(PyTorch).md | 581 | def custom_both_cross_entropy(logits, targets, weights, alpha): | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 1933 | def demo_prompt_render_simulation(): | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 1968 | def simulate_render_conversion(result): | CODE |
| LOW | …e/深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器.md | 2041 | def debug_pydantic_union_behavior(): | CODE |
| LOW | …de/Agents/Claude Code 必备的用量监控工具:claude-monitor 实践指南.md | 558 | def calculate_hourly_burn_rate( | CODE |
| LOW | PaperNotes/Transformer 论文精读.md | 693 | def scaled_dot_product_attention(Q, K, V, mask=None): | CODE |
| LOW | PaperNotes/Transformer 论文精读.md | 1090 | def scaled_dot_product_attention(Q, K, V, mask=None): | CODE |
| LOW | PaperNotes/Transformer 论文精读.md | 1216 | def scaled_dot_product_attention(Q, K, V, mask=None): | CODE |
| LOW | PaperNotes/Transformer 论文精读.md | 1355 | def scaled_dot_product_attention(Q, K, V, mask=None): | CODE |
| LOW | PaperNotes/Transformer 论文精读.md | 1375 | def scaled_dot_product_attention(Q, K, V, mask=None): | CODE |
| LOW | PaperNotes/Transformer 论文精读.md | 1401 | def scaled_dot_product_attention(Q, K, V, mask=None): | CODE |
| LOW | PaperNotes/Transformer 论文精读.md | 1564 | def scaled_dot_product_attention(Q, K, V, mask=None): | CODE |
| LOW | CodePlayground/utils/environment_manager.py | 59 | def check_pytorch_transformers(self): | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 186 | def demo_prompt_render_simulation(): | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 221 | def simulate_render_conversion(result): | CODE |
| LOW | Demos/mcp/debug_message_validator.py | 294 | def debug_pydantic_union_behavior(): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | Guide/20. RAG 入门实践:从文档拆分到向量数据库与问答构建.md | 1 | # RAG 入门实践:从文档拆分到向量数据库与问答构建 | COMMENT |
| MEDIUM | …us 4.7,Auto 模式开放,新的思考等级 xhigh,以及“限免3次”的 ultrareview.md | 101 | > *More effort control: Opus 4.7 introduces a new `xhigh` (“extra high”) [effort level](https://platform.claude.com/docs | CODE |
| MEDIUM | PaperNotes/GPT 论文精读.md | 63 | - [关于 Zero-shot](#关于-zero-shot) | CODE |
| MEDIUM | PaperNotes/GPT 论文精读.md | 79 | - [Q1:Zero-Shot、One-Shot 和 Few-Shot 的区别是什么?和 In-Context Learning 有什么关系?与微调有什么不同?](#q1zero-shotone-shot-和-few-shot | CODE |
| MEDIUM | PaperNotes/Transformer 论文精读.md | 3060 | ### Q4: 词嵌入 Word Embedding(输入处理)和句子嵌入 Sentence Embedding(e.g., in RAG)是同一回事吗? | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | Guide/17. 浅谈 RTN 模型量化:非对称 vs 对称.md | 671 | > torch.ao.quantization.observer.UniformQuantizationObserverBase._calculate_qparams() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Guide/18. 模型量化技术概述及 GGUF & GGML 文件格式解析.md | 521 | // The value is a 16-bit signed little-endian integer. | COMMENT |
| LOW | Guide/18. 模型量化技术概述及 GGUF & GGML 文件格式解析.md | 581 | // - It must be a hierarchical key, where each segment is `lower_snake_case` and separated by a `.`. | COMMENT |
| LOW | Guide/18. 模型量化技术概述及 GGUF & GGML 文件格式解析.md | 621 | struct gguf_tensor_info_t { | COMMENT |
| LOW | Guide/18. 模型量化技术概述及 GGUF & GGML 文件格式解析.md | 641 | }; | COMMENT |
| LOW | Guide/18. 模型量化技术概述及 GGUF & GGML 文件格式解析.md | 661 | // This is arbitrary binary data corresponding to the weights of the model. This data should be close | COMMENT |
| LOW | CodePlayground/chat.py | 1 | # =============================================================== | COMMENT |
| LOW | CodePlayground/summarizer.py | 1 | # =============================================================== | COMMENT |
| LOW | CodePlayground/sd_lora.py | 1 | # =============================================================== | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CodePlayground/summarizer.py | 27 | CODE | |
| LOW | CodePlayground/summarizer.py | 28 | CODE | |
| LOW | CodePlayground/summarizer.py | 31 | CODE | |
| LOW | CodePlayground/summarizer.py | 44 | CODE | |
| LOW | CodePlayground/sd_lora.py | 20 | CODE | |
| LOW | Demos/mcp/debug_func_metadata.py | 8 | CODE | |
| LOW | Demos/mcp/debug_func_metadata.py | 8 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | CodePlayground/chat.py | 291 | CODE | |
| LOW | CodePlayground/chat.py | 48 | CODE | |
| LOW | CodePlayground/summarizer.py | 271 | CODE | |
| LOW | CodePlayground/sd_lora.py | 375 | CODE | |
| LOW | Demos/mcp/debug_message_validator.py | 186 | CODE | |
| LOW | Demos/mcp/debug_message_validator.py | 221 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Guide/Agents/Sub2API 自建中转:把 AI 订阅变成自己的 API Key.md | 644 | http_headers = { "x-openai-actor-authorization" = "placeholder" } | CODE |