[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-0x4D31--galah":3,"tool-0x4D31--galah":61},[4,18,26,36,44,52],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":17},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,3,"2026-04-06T06:32:30",[13,14,15,16],"Agent","开发框架","图像","数据工具","ready",{"id":19,"name":20,"github_repo":21,"description_zh":22,"stars":23,"difficulty_score":10,"last_commit_at":24,"category_tags":25,"status":17},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[14,15,13],{"id":27,"name":28,"github_repo":29,"description_zh":30,"stars":31,"difficulty_score":32,"last_commit_at":33,"category_tags":34,"status":17},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",141543,2,"2026-04-06T11:32:54",[14,13,35],"语言模型",{"id":37,"name":38,"github_repo":39,"description_zh":40,"stars":41,"difficulty_score":32,"last_commit_at":42,"category_tags":43,"status":17},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[14,15,13],{"id":45,"name":46,"github_repo":47,"description_zh":48,"stars":49,"difficulty_score":10,"last_commit_at":50,"category_tags":51,"status":17},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[35,15,13,14],{"id":53,"name":54,"github_repo":55,"description_zh":56,"stars":57,"difficulty_score":10,"last_commit_at":58,"category_tags":59,"status":17},4292,"Deep-Live-Cam","hacksider\u002FDeep-Live-Cam","Deep-Live-Cam 是一款专注于实时换脸与视频生成的开源工具，用户仅需一张静态照片，即可通过“一键操作”实现摄像头画面的即时变脸或制作深度伪造视频。它有效解决了传统换脸技术流程繁琐、对硬件配置要求极高以及难以实时预览的痛点，让高质量的数字内容创作变得触手可及。\n\n这款工具不仅适合开发者和技术研究人员探索算法边界，更因其极简的操作逻辑（仅需三步：选脸、选摄像头、启动），广泛适用于普通用户、内容创作者、设计师及直播主播。无论是为了动画角色定制、服装展示模特替换，还是制作趣味短视频和直播互动，Deep-Live-Cam 都能提供流畅的支持。\n\n其核心技术亮点在于强大的实时处理能力，支持口型遮罩（Mouth Mask）以保留使用者原始的嘴部动作，确保表情自然精准；同时具备“人脸映射”功能，可同时对画面中的多个主体应用不同面孔。此外，项目内置了严格的内容安全过滤机制，自动拦截涉及裸露、暴力等不当素材，并倡导用户在获得授权及明确标注的前提下合规使用，体现了技术发展与伦理责任的平衡。",88924,"2026-04-06T03:28:53",[14,15,13,60],"视频",{"id":62,"github_repo":63,"name":64,"description_en":65,"description_zh":66,"ai_summary_zh":66,"readme_en":67,"readme_zh":68,"quickstart_zh":69,"use_case_zh":70,"hero_image_url":71,"owner_login":72,"owner_name":73,"owner_avatar_url":74,"owner_bio":75,"owner_company":76,"owner_location":77,"owner_email":76,"owner_twitter":76,"owner_website":78,"owner_url":79,"languages":80,"stars":89,"forks":90,"last_commit_at":91,"license":92,"difficulty_score":93,"env_os":94,"env_gpu":95,"env_ram":96,"env_deps":97,"category_tags":103,"github_topics":105,"view_count":32,"oss_zip_url":76,"oss_zip_packed_at":76,"status":17,"created_at":113,"updated_at":114,"faqs":115,"releases":146},4483,"0x4D31\u002Fgalah","galah","Galah: An LLM-powered web honeypot.","Galah 是一款由大语言模型（LLM）驱动的智能网络蜜罐，旨在模拟各类 Web 应用并动态响应任意 HTTP 请求。与传统蜜罐依赖人工预定义规则或固定漏洞场景不同，Galah 利用 LLM 的生成能力，实时构造包含特定头部和正文内容的逼真响应，从而更灵活地诱捕和记录攻击者的探测行为。\n\n这一设计有效解决了传统蜜罐覆盖场景有限、易被识别以及维护成本高的问题。通过引入缓存机制，Galah 能对相同请求复用响应，在保持交互真实性的同时显著降低 API 调用成本；此外，它还支持集成 Suricata 规则，对传入请求进行深度特征匹配，进一步提升了检测的精准度。\n\nGalah 特别适合网络安全研究人员、红蓝对抗演练人员以及希望探索 LLM 在安全领域应用的开发者使用。其独特的技术亮点在于将大模型的语义理解与生成能力应用于网络协议交互，能够根据攻击者的输入“即兴表演”出合理的服务器反馈，极大增加了攻击者分析蜜罐的难度。需要注意的是，由于响应生成依赖外部模型，部署时建议配置好 API 用量限制以防资源耗尽。作为一个开源项目，Galah 为研究新型交互式防御策略提供了有趣的实验平台。","\u003Cimg align=\"left\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002F0x4D31_galah_readme_b3dc21c25c1f.png\" width=\"200px\">\n\nTL;DR: Galah (\u002Fɡəˈlɑː\u002F - pronounced ‘guh-laa’) is an LLM-powered web honeypot designed to mimic various applications and dynamically respond to arbitrary HTTP requests. Galah supports major LLM providers, including OpenAI, GoogleAI, GCP's Vertex AI, Anthropic, Cohere, and Ollama.\n\nUnlike traditional web honeypots that manually emulate specific web applications or vulnerabilities, Galah dynamically crafts relevant responses—including HTTP headers and body content—to any HTTP request. Responses generated by the LLM are cached for a configurable period to prevent repetitive generation for identical requests, reducing API costs. The caching is port-specific, ensuring that responses generated for a particular port will not be reused for the same request on a different port.\n\nGalah can optionally inspect incoming HTTP requests against a set of Suricata rules, matching on various HTTP buffers including method, URI, headers, cookies, and request body (the current implementation doesn't support all Suricata keywords, and PCRE handling is limited). To enable and configure rule matching, see [Suricata HTTP Rule Matching](docs\u002FSURICATA.md).\n\nThe prompt configuration is key in this honeypot. While you can update the prompt in the configuration file, it is crucial to maintain the segment directing the LLM to produce responses in the specified JSON format.\n\n> **Note:** Galah was developed as a fun weekend project to explore the capabilities of LLMs in crafting HTTP messages. The honeypot may be identifiable through various methods such as network fingerprinting techniques, prolonged response times depending on the LLM provider and model, and non-standard responses. To protect against Denial of Wallet attacks, be sure to **set usage limits on your LLM API**.\n\n## Getting Started\n\n### Local Deployment\n\n- Ensure you have Go version 1.22+ installed.\n- Depending on your LLM provider, create an API key (e.g., from [here](https:\u002F\u002Fplatform.openai.com\u002Fapi-keys) for OpenAI and [here](https:\u002F\u002Faistudio.google.com\u002Fapp\u002Fapikey) for GoogleAI Studio) or set up authentication credentials (e.g., Application Default Credentials for GCP's Vertex AI).\n- If you want to serve HTTPS ports, generate TLS certificates.\n- Clone the repo and install the dependencies.\n- Update the `config.yaml` file if needed.\n- Build and run the Go binary!\n\n```bash\ngit clone git@github.com:0x4D31\u002Fgalah.git\ncd galah\ngo mod download\nmkdir bin\ngo build -o bin\u002Fgalah .\u002Fcmd\u002Fgalah\n.\u002Fbin\u002Fgalah --help\n\n ██████   █████  ██       █████  ██   ██ \n██       ██   ██ ██      ██   ██ ██   ██ \n██   ███ ███████ ██      ███████ ███████ \n██    ██ ██   ██ ██      ██   ██ ██   ██ \n ██████  ██   ██ ███████ ██   ██ ██   ██ \n  llm-based web honeypot | version 1.1.1\n         author: Adel \"0x4D31\" Ka\n\nUsage: galah --provider PROVIDER --model MODEL [--server-url SERVER-URL] [--temperature TEMPERATURE] [--api-key API-KEY] [--cloud-location CLOUD-LOCATION] [--cloud-project CLOUD-PROJECT] [--interface INTERFACE] [--config-file CONFIG-FILE] [--rules-config-file RULES-CONFIG-FILE] [--event-log-file EVENT-LOG-FILE] [--cache-db-file CACHE-DB-FILE] [--cache-duration CACHE-DURATION] [--log-level LOG-LEVEL] [--suricata-enabled] [--suricata-rules-dir SURICATA-RULES-DIR]\n\nOptions:\n  --provider PROVIDER, -p PROVIDER\n                         LLM provider (openai, googleai, gcp-vertex, anthropic, cohere, ollama) [env: LLM_PROVIDER]\n  --model MODEL, -m MODEL\n                         LLM model (e.g. gpt-3.5-turbo-1106, gemini-1.5-pro-preview-0409) [env: LLM_MODEL]\n  --server-url SERVER-URL, -u SERVER-URL\n                         LLM Server URL (required for Ollama) [env: LLM_SERVER_URL]\n  --temperature TEMPERATURE, -t TEMPERATURE\n                         LLM sampling temperature (0-2). Higher values make the output more random [default: 1, env: LLM_TEMPERATURE]\n  --api-key API-KEY, -k API-KEY\n                         LLM API Key [env: LLM_API_KEY]\n  --cloud-location CLOUD-LOCATION\n                         LLM cloud location region (required for GCP's Vertex AI) [env: LLM_CLOUD_LOCATION]\n  --cloud-project CLOUD-PROJECT\n                         LLM cloud project ID (required for GCP's Vertex AI) [env: LLM_CLOUD_PROJECT]\n  --interface INTERFACE, -i INTERFACE\n                         interface to serve on\n  --config-file CONFIG-FILE, -c CONFIG-FILE\n                         Path to config file [default: config\u002Fconfig.yaml]\n  --rules-config-file RULES-CONFIG-FILE, -r RULES-CONFIG-FILE\n                         Path to rules config file (rule engine disabled if omitted)\n  --event-log-file EVENT-LOG-FILE, -o EVENT-LOG-FILE\n                         Path to event log file [default: event_log.json]\n  --cache-db-file CACHE-DB-FILE, -f CACHE-DB-FILE\n                         Path to database file for response caching [default: cache.db]\n  --cache-duration CACHE-DURATION, -d CACHE-DURATION\n                         Cache duration for generated responses (in hours). Use 0 to disable caching, and -1 for unlimited caching (no expiration). [default: 24]\n  --log-level LOG-LEVEL, -l LOG-LEVEL\n                         Log level (debug, info, error, fatal) [default: info]\n  --suricata-enabled     Enable Suricata HTTP rule checking (default: false)\n  --suricata-rules-dir SURICATA-RULES-DIR\n                         Directory containing Suricata .rules files to check HTTP requests against\n  --help, -h             display this help and exit\n```\n\n### Run in Docker\n\n- Ensure you have Docker CE or EE installed locally.\n- Clone the repo and build the docker image.\n- You can mount a local directory to the container to store the logs.\n- Run the docker container.\n\n```bash\n% git clone git@github.com:0x4D31\u002Fgalah.git\n% cd galah\n% mkdir logs\n% export LLM_API_KEY=your-api-key\n% docker build -t galah-image .\n% docker run -d --name galah-container -p 8080:8080 -v $(pwd)\u002Flogs:\u002Fgalah\u002Flogs -e LLM_API_KEY galah-image -o logs\u002Fgalah.json -p openai -m gpt-3.5-turbo-1106\n```\n\n## Example Usage\n\n```bash\n.\u002Fgalah -p openai -m gpt-4.1-mini --suricata-enabled --suricata-rules-dir rules\n```\n\nTest:\n```bash\ncurl --http1.1 --path-as-is -X POST \\\n  -H 'SOAPAction: \"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002FGetGuestNetworkSettings\"' \\\n  -H 'Content-Type: text\u002Fxml' \\\n  --data '\u003CGetGuestNetworkSettings xmlns=\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\">' \\\n  http:\u002F\u002F127.0.0.1:8888\u002FHNAP1\u002F -v\nNote: Unnecessary use of -X or --request, POST is already inferred.\n*   Trying 127.0.0.1:8888...\n* Connected to 127.0.0.1 (127.0.0.1) port 8888\n> POST \u002FHNAP1\u002F HTTP\u002F1.1\n> Host: 127.0.0.1:8888\n> User-Agent: curl\u002F8.7.1\n> Accept: *\u002F*\n> SOAPAction: \"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002FGetGuestNetworkSettings\"\n> Content-Type: text\u002Fxml\n> Content-Length: 64\n> \n* upload completely sent off: 64 bytes\n\n\u003C HTTP\u002F1.1 200 OK\n\u003C Server: TP-LINK HTTP Server\u002F1.0\n\u003C Date: Mon, 21 Apr 2025 01:28:43 GMT\n\u003C Content-Length: 545\n\u003C Content-Type: text\u002Fxml; charset=utf-8\n\u003C \n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CGetGuestNetworkSettingsResponse xmlns=\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\">\n  \u003CGetGuestNetworkSettingsResult>OK\u003C\u002FGetGuestNetworkSettingsResult>\n  \u003CGuestNetworkEnabled>true\u003C\u002FGuestNetworkEnabled>\n  \u003CGuestNetworkSSID>TPLink_Guest\u003C\u002FGuestNetworkSSID>\n  \u003CGuestNetworkSecurity>WPA2-PSK\u003C\u002FGuestNetworkSecurity>\n  \u003CGuestNetworkPassword>guest1234\u003C\u002FGuestNetworkPassword>\n  \u003CGuestNetworkIsolation>true\u003C\u002FGuestNetworkIsolation>\n  \u003CGuestNetworkSSIDBroadcast>true\u003C\u002FGuestNetworkSSIDBroadcast>\n```\n\nJSON event log:\n```json\n{\n  \"eventTime\": \"2025-04-21T02:28:43.583386+01:00\",\n  \"httpRequest\": {\n    \"body\": \"\u003CGetGuestNetworkSettings xmlns=\\\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\\\">\",\n    \"bodySha256\": \"836c42168ebbad0b7192daa70ad8e4ea8d5930097162f513045f5ecb6ae9d5bd\",\n    \"headers\": {\n      \"Accept\": \"*\u002F*\",\n      \"Content-Length\": \"64\",\n      \"Content-Type\": \"text\u002Fxml\",\n      \"Soapaction\": \"\\\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002FGetGuestNetworkSettings\\\"\",\n      \"User-Agent\": \"curl\u002F8.7.1\"\n    },\n    \"headersSorted\": \"Accept,Content-Length,Content-Type,Soapaction,User-Agent\",\n    \"headersSortedSha256\": \"3a44fecf9284eca3947c45ffeb2301ce6d9b3d0a3cc5a7491ccea2b6ed61edaa\",\n    \"method\": \"POST\",\n    \"protocolVersion\": \"HTTP\u002F1.1\",\n    \"request\": \"\u002FHNAP1\u002F\",\n    \"sessionID\": \"1745198923587092000_qHLNEPBNPrH6qw==\",\n    \"userAgent\": \"curl\u002F8.7.1\"\n  },\n  \"httpResponse\": {\n    \"headers\": {\n      \"Content-Length\": \"454\",\n      \"Content-Type\": \"text\u002Fxml; charset=utf-8\",\n      \"Server\": \"TP-LINK HTTP Server\u002F1.0\"\n    },\n    \"body\": \"\u003C?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?> \u003CGetGuestNetworkSettingsResponse xmlns=\\\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\\\">   \u003CGetGuestNetworkSettingsResult>OK\u003C\u002FGetGuestNetworkSettingsResult>   \u003CGuestNetworkEnabled>true\u003C\u002FGuestNetworkEnabled>   \u003CGuestNetworkSSID>TPLink_Guest\u003C\u002FGuestNetworkSSID>   \u003CGuestNetworkSecurity>WPA2-PSK\u003C\u002FGuestNetworkSecurity>   \u003CGuestNetworkPassword>guest1234\u003C\u002FGuestNetworkPassword>   \u003CGuestNetworkIsolation>true\u003C\u002FGuestNetworkIsolation>   \u003CGuestNetworkSSIDBroadcast>true\u003C\u002FGuestNetworkSSIDBroadcast> \u003C\u002FGetGuestNetworkSettingsResponse>\"\n  },\n  \"level\": \"info\",\n  \"msg\": \"successfulResponse\",\n  \"port\": \"8888\",\n  \"responseMetadata\": {\n    \"generationSource\": \"llm\",\n    \"info\": {\n      \"model\": \"gpt-4.1-mini\",\n      \"provider\": \"openai\",\n      \"temperature\": 1\n    }\n  },\n  \"sensorName\": \"mbp\",\n  \"srcHost\": \"localhost\",\n  \"srcIP\": \"127.0.0.1\",\n  \"srcPort\": \"62418\",\n  \"suricataMatches\": [\n    {\n      \"msg\": \"ET WEB_SPECIFIC_APPS D-Link DIR-823G Multiple HNAP SOAPAction Endpoints Authentication Bypass\",\n      \"sid\": \"2061623\"\n    }\n  ],\n  \"tags\": null,\n  \"time\": \"2025-04-21T02:28:43.587152+01:00\"\n}\n```\n\nSee more examples [here](docs\u002FEXAMPLES.md).\n\n\n## Library Usage\n\nThe `galah` package can be used as a standalone library. Create a `galah.Service` and call `GenerateHTTPResponse` with an `http.Request` to produce a response. If `ConfigFile`, `EventLogFile`, or `CacheDBFile` are omitted, their default paths (`config\u002Fconfig.yaml`, `event_log.json`, and `cache.db`) are used. Specify `RulesConfigFile` to enable rule checking; leaving it empty disables the rule engine entirely. Options.Logger can be supplied with a *log.Logger; if nil, Galah creates a default text logger.\n\n```go\nsvc, err := galah.NewService(context.Background(), galah.Options{\n    LLMProvider: \"openai\",\n    LLMModel:    \"gpt-4.1-mini\",\n    LLMAPIKey:   \"YOUR_KEY\",\n    ConfigFile:  \"config\u002Fconfig.yaml\",\n    RulesConfigFile: \"config\u002Frules.yaml\", \u002F\u002F omit to disable rule engine\n    EventLogFile: \"event_log.json\",\n    CacheDBFile:  \"cache.db\",\n    Logger:       log.NewWithOptions(os.Stderr, log.Options{}),\n})\nif err != nil {\n    log.Fatal(err)\n}\nreq, _ := http.NewRequest(\"GET\", \"https:\u002F\u002Fexample.com\", nil)\nrespBytes, err := svc.GenerateHTTPResponse(req, \"8080\")\nif err != nil {\n    log.Fatal(err)\n}\nfmt.Println(string(respBytes))\n```\n\nYou can also build a service from an already loaded configuration:\n\n```go\ncfg, _ := config.LoadConfig(\"config.yaml\")\nrulesCfg, _ := config.LoadRules(\"rules.yaml\")\nsvc, err := galah.NewServiceFromConfig(context.Background(), cfg, rulesCfg.Rules, galah.Options{\n    LLMProvider: \"openai\",\n    LLMModel:    \"gpt-4.1-mini\",\n    LLMAPIKey:   \"YOUR_KEY\",\n    EventLogFile: \"event_log.json\", \u002F\u002F use default if empty\n    CacheDBFile:  \"cache.db\",       \u002F\u002F use default if empty\n    Logger:       log.NewWithOptions(os.Stderr, log.Options{}),\n})\n```\n\nTo turn off rule checking completely, omit `RulesConfigFile` when creating a service or pass `nil`\u002Fan empty slice to `NewServiceFromConfig`. Any unused option fields can be left empty to rely on their defaults.\n\nThe service also exposes helper methods for cache and event logging when used as a library:\n\n```go\nrespBytes, _ := svc.CheckCache(req, \"8080\") \u002F\u002F returns nil if no cached entry\n\nsvc.LogEvent(req, llm.JSONResponse{Headers: map[string]string{\"Content-Type\": \"text\u002Fplain\"}, Body: \"hi\"}, \"8080\", \"llm\", nil)\n```\n","\u003Cimg align=\"left\" src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002F0x4D31_galah_readme_b3dc21c25c1f.png\" width=\"200px\">\n\n简而言之：Galah（发音为“guh-laa”）是一款基于大语言模型的网络蜜罐，旨在模拟各种应用程序，并动态响应任意 HTTP 请求。Galah 支持多家主流的大语言模型提供商，包括 OpenAI、Google AI、GCP 的 Vertex AI、Anthropic、Cohere 和 Ollama。\n\n与传统手动模拟特定 Web 应用程序或漏洞的蜜罐不同，Galah 能够根据任何 HTTP 请求动态生成相关响应，包括 HTTP 头部和消息体内容。由大语言模型生成的响应会被缓存一段时间（可配置），以避免对相同请求重复生成，从而降低 API 使用成本。缓存机制是按端口独立的，确保为某一端口生成的响应不会被复用于其他端口上的相同请求。\n\nGalah 还可以选择性地使用 Suricata 规则集来检查传入的 HTTP 请求，匹配的内容涵盖方法、URI、头部、Cookie 以及请求体等多个 HTTP 缓冲区（当前实现尚未支持所有 Suricata 关键字，且 PCRE 处理功能有限）。如需启用并配置规则匹配，请参阅 [Suricata HTTP 规则匹配](docs\u002FSURICATA.md)。\n\n在本蜜罐中，提示词配置至关重要。虽然您可以在配置文件中更新提示词，但务必保留引导大语言模型按照指定 JSON 格式生成响应的部分。\n\n> **注意**：Galah 是作为一个有趣的周末项目开发的，旨在探索大语言模型在构造 HTTP 消息方面的潜力。该蜜罐可能通过多种方式被识别，例如网络指纹技术、依赖于大语言模型提供商和模型的较长响应时间，以及非标准响应等。为防止“钱包拒绝服务”攻击，请务必 **为您的大语言模型 API 设置使用限制**。\n\n## 快速入门\n\n### 本地部署\n\n- 确保已安装 Go 1.22 或更高版本。\n- 根据您使用的大语言模型提供商，创建 API 密钥（例如，OpenAI 可从 [这里](https:\u002F\u002Fplatform.openai.com\u002Fapi-keys) 获取，Google AI Studio 可从 [这里](https:\u002F\u002Faistudio.google.com\u002Fapp\u002Fapikey) 获取）或设置身份验证凭据（例如，GCP 的 Vertex AI 需要应用默认凭据）。\n- 如果需要提供 HTTPS 端口，请生成 TLS 证书。\n- 克隆仓库并安装依赖项。\n- 如有需要，更新 `config.yaml` 文件。\n- 构建并运行 Go 二进制文件！\n\n```bash\ngit clone git@github.com:0x4D31\u002Fgalah.git\ncd galah\ngo mod download\nmkdir bin\ngo build -o bin\u002Fgalah .\u002Fcmd\u002Fgalah\n.\u002Fbin\u002Fgalah --help\n\n ██████   █████  ██       █████  ██   ██ \n██       ██   ██ ██      ██   ██ ██   ██ \n██   ███ ███████ ██      ███████ ███████ \n██    ██ ██   ██ ██      ██   ██ ██   ██ \n ██████  ██   ██ ███████ ██   ██ ██   ██ \n  基于大语言模型的网络蜜罐 | 版本 1.1.1\n         作者：Adel \"0x4D31\" Ka\n\n用法：gallah --provider PROVIDER --model MODEL [--server-url SERVER-URL] [--temperature TEMPERATURE] [--api-key API-KEY] [--cloud-location CLOUD-LOCATION] [--cloud-project CLOUD-PROJECT] [--interface INTERFACE] [--config-file CONFIG-FILE] [--rules-config-file RULES-CONFIG-FILE] [--event-log-file EVENT-LOG-FILE] [--cache-db-file CACHE-DB-FILE] [--cache-duration CACHE-DURATION] [--log-level LOG-LEVEL] [--suricata-enabled] [--suricata-rules-dir SURICATA-RULES-DIR]\n\n选项：\n  --provider PROVIDER, -p PROVIDER\n                         大语言模型提供商（openai、googleai、gcp-vertex、anthropic、cohere、ollama）[环境变量：LLM_PROVIDER]\n  --model MODEL, -m MODEL\n                         大语言模型型号（例如 gpt-3.5-turbo-1106、gemini-1.5-pro-preview-0409）[环境变量：LLM_MODEL]\n  --server-url SERVER-URL, -u SERVER-URL\n                         大语言模型服务器 URL（Ollama 需要）[环境变量：LLM_SERVER_URL]\n  --temperature TEMPERATURE, -t TEMPERATURE\n                         大语言模型采样温度（0-2）。值越高，输出越随机 [默认：1，环境变量：LLM_TEMPERATURE]\n  --api-key API-KEY, -k API-KEY\n                         大语言模型 API 密钥 [环境变量：LLM_API_KEY]\n  --cloud-location CLOUD-LOCATION\n                         大语言模型云位置区域（GCP 的 Vertex AI 需要）[环境变量：LLM_CLOUD_LOCATION]\n  --cloud-project CLOUD-PROJECT\n                         大语言模型云项目 ID（GCP 的 Vertex AI 需要）[环境变量：LLM_CLOUD_PROJECT]\n  --interface INTERFACE, -i INTERFACE\n                         服务的接口\n  --config-file CONFIG-FILE, -c CONFIG-FILE\n                         配置文件路径 [默认：config\u002Fconfig.yaml]\n  --rules-config-file RULES-CONFIG-FILE, -r RULES-CONFIG-FILE\n                         规则配置文件路径（若省略，则规则引擎将被禁用）\n  --event-log-file EVENT-LOG-FILE, -o EVENT-LOG-FILE\n                         事件日志文件路径 [默认：event_log.json]\n  --cache-db-file CACHE-DB-FILE, -f CACHE-DB-FILE\n                         用于响应缓存的数据库文件路径 [默认：cache.db]\n  --cache-duration CACHE-DURATION, -d CACHE-DURATION\n                         已生成响应的缓存时长（单位：小时）。设置为 0 表示禁用缓存，设置为 -1 表示无限期缓存（无过期）。[默认：24]\n  --log-level LOG-LEVEL, -l LOG-LEVEL\n                         日志级别（debug、info、error、fatal）[默认：info]\n  --suricata-enabled     启用 Suricata HTTP 规则检查（默认：false）\n  --suricata-rules-dir SURICATA-RULES-DIR\n                         包含 Suricata .rules 文件的目录，用于检查 HTTP 请求\n  --help, -h             显示此帮助信息并退出\n```\n\n### 在 Docker 中运行\n\n- 确保本地已安装 Docker CE 或 EE。\n- 克隆仓库并构建 Docker 镜像。\n- 您可以将本地目录挂载到容器中，用于存储日志。\n- 运行 Docker 容器。\n\n```bash\n% git clone git@github.com:0x4D31\u002Fgalah.git\n% cd galah\n% mkdir logs\n% export LLM_API_KEY=your-api-key\n% docker build -t galah-image .\n% docker run -d --name galah-container -p 8080:8080 -v $(pwd)\u002Flogs:\u002Fgalah\u002Flogs -e LLM_API_KEY galah-image -o logs\u002Fgalah.json -p openai -m gpt-3.5-turbo-1106\n```\n\n## 示例用法\n\n```bash\n.\u002Fgalah -p openai -m gpt-4.1-mini --suricata-enabled --suricata-rules-dir rules\n```\n\n测试：\n```bash\ncurl --http1.1 --path-as-is -X POST \\\n  -H 'SOAPAction: \"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002FGetGuestNetworkSettings\"' \\\n  -H 'Content-Type: text\u002Fxml' \\\n  --data '\u003CGetGuestNetworkSettings xmlns=\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\">'\n  http:\u002F\u002F127.0.0.1:8888\u002FHNAP1\u002F -v\n注意：无需使用 -X 或 --request，POST 已被推断。\n* 正在尝试连接到 127.0.0.1:8888...\n* 已连接到 127.0.0.1 (127.0.0.1)，端口 8888\n> POST \u002FHNAP1\u002F HTTP\u002F1.1\n> 主机：127.0.0.1:8888\n> 用户代理：curl\u002F8.7.1\n> 接受：*\u002F*\n> SOAPAction：“http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002FGetGuestNetworkSettings”\n> 内容类型：text\u002Fxml\n> 内容长度：64\n> \n* 完全发送了 64 字节的数据\n\n\u003C HTTP\u002F1.1 200 OK\n\u003C 服务器：TP-LINK HTTP Server\u002F1.0\n\u003C 日期：2025年4月21日 星期一 01:28:43 GMT\n\u003C 内容长度：545\n\u003C 内容类型：text\u002Fxml; charset=utf-8\n\u003C \n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CGetGuestNetworkSettingsResponse xmlns=\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\">\n  \u003CGetGuestNetworkSettingsResult>OK\u003C\u002FGetGuestNetworkSettingsResult>\n  \u003CGuestNetworkEnabled>true\u003C\u002FGuestNetworkEnabled>\n  \u003CGuestNetworkSSID>TPLink_Guest\u003C\u002FGuestNetworkSSID>\n  \u003CGuestNetworkSecurity>WPA2-PSK\u003C\u002FGuestNetworkSecurity>\n  \u003CGuestNetworkPassword>guest1234\u003C\u002FGuestNetworkPassword>\n  \u003CGuestNetworkIsolation>true\u003C\u002FGuestNetworkIsolation>\n  \u003CGuestNetworkSSIDBroadcast>true\u003C\u002FGuestNetworkSSIDBroadcast>\n```\n\nJSON 事件日志：\n```json\n{\n  \"eventTime\": \"2025-04-21T02:28:43.583386+01:00\",\n  \"httpRequest\": {\n    \"body\": \"\u003CGetGuestNetworkSettings xmlns=\\\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\\\">\",\n    \"bodySha256\": \"836c42168ebbad0b7192daa70ad8e4ea8d5930097162f513045f5ecb6ae9d5bd\",\n    \"headers\": {\n      \"Accept\": \"*\u002F*\",\n      \"Content-Length\": \"64\",\n      \"Content-Type\": \"text\u002Fxml\",\n      \"Soapaction\": \"\\\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002FGetGuestNetworkSettings\\\"\",\n      \"User-Agent\": \"curl\u002F8.7.1\"\n    },\n    \"headersSorted\": \"Accept,Content-Length,Content-Type,Soapaction,User-Agent\",\n    \"headersSortedSha256\": \"3a44fecf9284eca3947c45ffeb2301ce6d9b3d0a3cc5a7491ccea2b6ed61edaa\",\n    \"method\": \"POST\",\n    \"protocolVersion\": \"HTTP\u002F1.1\",\n    \"request\": \"\u002FHNAP1\u002F\",\n    \"sessionID\": \"1745198923587092000_qHLNEPBNPrH6qw==\",\n    \"userAgent\": \"curl\u002F8.7.1\"\n  },\n  \"httpResponse\": {\n    \"headers\": {\n      \"Content-Length\": \"454\",\n      \"Content-Type\": \"text\u002Fxml; charset=utf-8\",\n      \"Server\": \"TP-LINK HTTP Server\u002F1.0\"\n    },\n    \"body\": \"\u003C?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?> \u003CGetGuestNetworkSettingsResponse xmlns=\\\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\\\">   \u003CGetGuestNetworkSettingsResult>OK\u003C\u002FGetGuestNetworkSettingsResult>   \u003CGuestNetworkEnabled>true\u003C\u002FGuestNetworkEnabled>   \u003CGuestNetworkSSID>TPLink_Guest\u003C\u002FGuestNetworkSSID>   \u003CGuestNetworkSecurity>WPA2-PSK\u003C\u002FGuestNetworkSecurity>   \u003CGuestNetworkPassword>guest1234\u003C\u002FGuestNetworkPassword>   \u003CGuestNetworkIsolation>true\u003C\u002FGuestNetworkIsolation>   \u003CGuestNetworkSSIDBroadcast>true\u003C\u002FGuestNetworkSSIDBroadcast> \u003C\u002FGetGuestNetworkSettingsResponse>\"\n  },\n  \"level\": \"info\",\n  \"msg\": \"successfulResponse\",\n  \"port\": \"8888\",\n  \"responseMetadata\": {\n    \"generationSource\": \"llm\",\n    \"info\": {\n      \"model\": \"gpt-4.1-mini\",\n      \"provider\": \"openai\",\n      \"temperature\": 1\n    }\n  },\n  \"sensorName\": \"mbp\",\n  \"srcHost\": \"localhost\",\n  \"srcIP\": \"127.0.0.1\",\n  \"srcPort\": \"62418\",\n  \"suricataMatches\": [\n    {\n      \"msg\": \"ET WEB_SPECIFIC_APPS D-Link DIR-823G Multiple HNAP SOAPAction Endpoints Authentication Bypass\",\n      \"sid\": \"2061623\"\n    }\n  ],\n  \"tags\": null,\n  \"time\": \"2025-04-21T02:28:43.587152+01:00\"\n}\n```\n\n更多示例请参阅 [这里](docs\u002FEXAMPLES.md)。\n\n\n## 库的使用\n\n`galah` 包可以作为一个独立的库使用。创建一个 `galah.Service` 并调用 `GenerateHTTPResponse` 方法，传入一个 `http.Request` 对象即可生成响应。如果省略 `ConfigFile`、`EventLogFile` 或 `CacheDBFile`，将使用它们的默认路径（`config\u002Fconfig.yaml`、`event_log.json` 和 `cache.db`）。指定 `RulesConfigFile` 可启用规则检查；若留空，则完全禁用规则引擎。`Options.Logger` 可以提供一个 *log.Logger；如果为 nil，Galah 将创建一个默认的文本日志记录器。\n\n```go\nsvc, err := galah.NewService(context.Background(), galah.Options{\n    LLMProvider: \"openai\",\n    LLMModel:    \"gpt-4.1-mini\",\n    LLMAPIKey:   \"YOUR_KEY\",\n    ConfigFile:  \"config\u002Fconfig.yaml\",\n    RulesConfigFile: \"config\u002Frules.yaml\", \u002F\u002F 留空以禁用规则引擎\n    EventLogFile: \"event_log.json\",\n    CacheDBFile:  \"cache.db\",\n    Logger:       log.NewWithOptions(os.Stderr, log.Options{}),\n})\nif err != nil {\n    log.Fatal(err)\n}\nreq, _ := http.NewRequest(\"GET\", \"https:\u002F\u002Fexample.com\", nil)\nrespBytes, err := svc.GenerateHTTPResponse(req, \"8080\")\nif err != nil {\n    log.Fatal(err)\n}\nfmt.Println(string(respBytes))\n```\n\n你也可以从已加载的配置构建服务：\n\n```go\ncfg, _ := config.LoadConfig(\"config.yaml\")\nrulesCfg, _ := config.LoadRules(\"rules.yaml\")\nsvc, err := galah.NewServiceFromConfig(context.Background(), cfg, rulesCfg.Rules, galah.Options{\n    LLMProvider: \"openai\",\n    LLMModel:    \"gpt-4.1-mini\",\n    LLMAPIKey:   \"YOUR_KEY\",\n    EventLogFile: \"event_log.json\", \u002F\u002F 留空则使用默认值\n    CacheDBFile:  \"cache.db\",       \u002F\u002F 留空则使用默认值\n    Logger:       log.NewWithOptions(os.Stderr, log.Options{}),\n})\n```\n\n要完全关闭规则检查，在创建服务时省略 `RulesConfigFile`，或在调用 `NewServiceFromConfig` 时传入 `nil`\u002F空切片。任何未使用的选项字段都可以留空，以使用其默认值。\n\n该服务还提供了作为库使用时用于缓存和事件日志记录的辅助方法：\n\n```go\nrespBytes, _ := svc.CheckCache(req, \"8080\") \u002F\u002F 如果没有缓存条目，则返回 nil\n\nsvc.LogEvent(req, llm.JSONResponse{Headers: map[string]string{\"Content-Type\": \"text\u002Fplain\"}, Body: \"hi\"}, \"8080\", \"llm\", nil)\n```","# Galah 快速上手指南\n\nGalah 是一个由大语言模型（LLM）驱动的 Web 蜜罐，能够动态模拟各种应用程序并响应任意的 HTTP 请求。它支持 OpenAI、Google AI、Vertex AI、Anthropic、Cohere 和 Ollama 等主流 LLM 提供商。\n\n## 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**：Linux、macOS 或 Windows（需配置 Go 环境）。\n*   **Go 语言环境**：版本需为 **1.22** 或更高。\n    *   国内用户推荐使用清华源或阿里源加速安装：\n        ```bash\n        export GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\n        ```\n*   **LLM API 密钥**：根据您选择的模型提供商准备好 API Key（如 OpenAI、Google AI Studio 等）或认证凭证（如 GCP Vertex AI 的应用默认凭证）。\n*   **可选依赖**：\n    *   若需启用 HTTPS，请预先生成 TLS 证书。\n    *   若需使用 Suricata 规则匹配功能，需准备相关的 `.rules` 文件。\n\n> **安全提示**：为防止“钱包拒绝服务攻击”（Denial of Wallet），请务必在您的 LLM 提供商控制台设置 **API 使用限额**。\n\n## 安装步骤\n\n### 方式一：本地编译部署\n\n1.  **克隆仓库并安装依赖**\n    ```bash\n    git clone git@github.com:0x4D31\u002Fgalah.git\n    cd galah\n    go mod download\n    ```\n\n2.  **构建二进制文件**\n    ```bash\n    mkdir bin\n    go build -o bin\u002Fgalah .\u002Fcmd\u002Fgalah\n    ```\n\n3.  **验证安装**\n    ```bash\n    .\u002Fbin\u002Fgalah --help\n    ```\n\n### 方式二：Docker 部署\n\n1.  **构建镜像**\n    ```bash\n    git clone git@github.com:0x4D31\u002Fgalah.git\n    cd galah\n    mkdir logs\n    docker build -t galah-image .\n    ```\n\n2.  **运行容器**\n    将本地 `logs` 目录挂载到容器中以便保存日志，并通过环境变量传入 API Key。\n    ```bash\n    export LLM_API_KEY=your-api-key\n    docker run -d --name galah-container \\\n      -p 8080:8080 \\\n      -v $(pwd)\u002Flogs:\u002Fgalah\u002Flogs \\\n      -e LLM_API_KEY \\\n      galah-image \\\n      -o logs\u002Fgalah.json \\\n      -p openai \\\n      -m gpt-3.5-turbo-1106\n    ```\n\n## 基本使用\n\n### 1. 启动蜜罐服务\n\n使用命令行参数指定 LLM 提供商、模型及端口。以下示例使用 OpenAI 的 `gpt-4.1-mini` 模型，并启用 Suricata 规则检测：\n\n```bash\n.\u002Fgalah -p openai -m gpt-4.1-mini --suricata-enabled --suricata-rules-dir rules\n```\n\n**常用参数说明：**\n*   `-p, --provider`: LLM 提供商 (openai, googleai, gcp-vertex, anthropic, cohere, ollama)\n*   `-m, --model`: 模型名称 (例如 `gpt-3.5-turbo-1106`)\n*   `-k, --api-key`: LLM API Key (也可通过环境变量 `LLM_API_KEY` 设置)\n*   `-i, --interface`: 监听的网络接口\n*   `--config-file`: 配置文件路径 (默认 `config\u002Fconfig.yaml`)\n\n### 2. 测试交互\n\n使用 `curl` 发送一个模拟攻击或探测的 HTTP 请求。Galah 将根据请求内容动态生成逼真的响应。\n\n```bash\ncurl --http1.1 --path-as-is -X POST \\\n  -H 'SOAPAction: \"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002FGetGuestNetworkSettings\"' \\\n  -H 'Content-Type: text\u002Fxml' \\\n  --data '\u003CGetGuestNetworkSettings xmlns=\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\">' \\\n  http:\u002F\u002F127.0.0.1:8888\u002FHNAP1\u002F -v\n```\n\n**预期响应示例：**\nGalah 会返回一个看似真实的 TP-LINK 路由器响应：\n```text\n\u003C HTTP\u002F1.1 200 OK\n\u003C Server: TP-LINK HTTP Server\u002F1.0\n\u003C Content-Type: text\u002Fxml; charset=utf-8\n\u003C \n\u003C?xml version=\"1.0\" encoding=\"utf-8\"?>\n\u003CGetGuestNetworkSettingsResponse xmlns=\"http:\u002F\u002Fpurenetworks.com\u002FHNAP1\u002F\">\n  \u003CGetGuestNetworkSettingsResult>OK\u003C\u002FGetGuestNetworkSettingsResult>\n  \u003CGuestNetworkEnabled>true\u003C\u002FGuestNetworkEnabled>\n  \u003CGuestNetworkSSID>TPLink_Guest\u003C\u002FGuestNetworkSSID>\n  ...\n\u003C\u002FGetGuestNetworkSettingsResponse>\n```\n\n### 3. 查看事件日志\n\n所有请求和生成的响应都会记录在 JSON 格式的事件日志中（默认为 `event_log.json`），包含详细的 HTTP 头、Body、Suricata 匹配结果及 LLM 生成元数据。\n\n```json\n{\n  \"eventTime\": \"2025-04-21T02:28:43.583386+01:00\",\n  \"httpRequest\": { ... },\n  \"httpResponse\": { ... },\n  \"suricataMatches\": [\n    {\n      \"msg\": \"ET WEB_SPECIFIC_APPS D-Link DIR-823G Multiple HNAP SOAPAction Endpoints Authentication Bypass\",\n      \"sid\": \"2061623\"\n    }\n  ],\n  \"responseMetadata\": {\n    \"generationSource\": \"llm\",\n    \"info\": { \"model\": \"gpt-4.1-mini\", \"provider\": \"openai\" }\n  }\n}\n```\n\n### 4. 作为 Go 库使用\n\n您也可以将 `galah` 集成到自己的 Go 项目中：\n\n```go\nsvc, err := galah.NewService(context.Background(), galah.Options{\n    LLMProvider: \"openai\",\n    LLMModel:    \"gpt-4.1-mini\",\n    LLMAPIKey:   \"YOUR_KEY\",\n    EventLogFile: \"event_log.json\",\n    CacheDBFile:  \"cache.db\",\n})\nif err != nil {\n    log.Fatal(err)\n}\n\n\u002F\u002F 生成响应\nreq, _ := http.NewRequest(\"GET\", \"https:\u002F\u002Fexample.com\", nil)\nrespBytes, err := svc.GenerateHTTPResponse(req, \"8080\")\nif err != nil {\n    log.Fatal(err)\n}\nfmt.Println(string(respBytes))\n```","某安全团队在云环境中部署蜜罐以诱捕针对 Web 应用的自动化扫描与攻击，但传统静态蜜罐难以应对多变的探测手法。\n\n### 没有 galah 时\n- **维护成本高昂**：为了模拟多种应用（如 WordPress、Jenkins），需手动编写大量固定的 HTML 响应和漏洞页面，更新滞后。\n- **易被识别绕过**：攻击者通过指纹识别发现响应内容千篇一律或逻辑僵硬，轻易判断出是蜜罐并停止攻击，导致数据收集失败。\n- **覆盖场景有限**：只能预设几种常见漏洞路径，对于攻击者尝试的冷门 URI 或畸形 HTTP 请求，往往直接返回 404 或连接重置，错失记录新型攻击载荷的机会。\n- **缺乏动态交互**：无法根据攻击者的具体输入（如特定的 SQL 注入语句）生成看似合理的“报错”或“成功”反馈，难以深入诱导攻击者暴露更多意图。\n\n### 使用 galah 后\n- **动态生成响应**：galah 利用大模型实时理解任意 HTTP 请求，自动生成符合上下文的头部、状态码及身体内容，无需人工预定义成千上万个页面。\n- **逼真迷惑性强**：面对不同探测流量，galah 能模仿真实业务的语气和逻辑返回差异化结果，显著增加攻击者识别蜜罐的难度，延长其停留时间。\n- **全量威胁捕获**：无论攻击者探测何种奇怪路径或提交何种 Payload，galah 都能给出“像样”的回应并完整记录交互过程，极大提升了未知攻击矢量的可见性。\n- **智能成本优化**：内置缓存机制确保相同请求不再重复调用大模型 API，既保持了响应的动态性，又有效控制了云端 Token 消耗。\n\ngalah 通过将大模型的生成能力引入蜜罐，将原本僵硬的“静态陷阱”升级为能主动周旋的“动态诱饵”，大幅提升了威胁情报的获取质量与效率。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002F0x4D31_galah_83fa4ec2.png","0x4D31","Adel Ka","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002F0x4D31_d6607e02.jpg","Security Engineer, Detection & Response",null,"Virgo Cluster","twitter.com\u002F0x4d31","https:\u002F\u002Fgithub.com\u002F0x4D31",[81,85],{"name":82,"color":83,"percentage":84},"Go","#00ADD8",99.9,{"name":86,"color":87,"percentage":88},"Dockerfile","#384d54",0.1,644,66,"2026-03-30T03:10:52","Apache-2.0",4,"Linux, macOS, Windows","不需要本地 GPU（基于云端 LLM API 或本地 Ollama 服务，若使用本地 Ollama 则取决于所选模型的需求）","未说明（取决于运行的 Go 进程及可选的本地 LLM 模型大小）",{"notes":98,"python":99,"dependencies":100},"该工具主要由 Go 语言编写，无需 Python 环境。运行需要配置支持的 LLM 提供商 API 密钥（如 OpenAI, Google AI, Anthropic 等）或搭建本地 Ollama 服务。若启用 Suricata 规则匹配功能，需准备相应的 .rules 文件。为防止产生高额 API 费用，建议在 LLM 提供商处设置使用限额。支持通过 Docker 容器化部署。","不需要（主要基于 Go 语言开发）",[101,102],"Go 1.22+","Docker (可选)",[104,35,14],"插件",[106,107,108,109,110,111,112],"golang","honeypot","llm","openai","openai-api","security","security-tools","2026-03-27T02:49:30.150509","2026-04-07T00:06:13.605967",[116,121,126,131,136,141],{"id":117,"question_zh":118,"answer_zh":119,"source_url":120},20392,"在 Docker 环境中运行时出现 'no such host' 反向 DNS 查找错误，如何解决？","这是 Docker 嵌入式 DNS 的预期行为。Docker 的嵌入式 DNS 仅为用户定义的桥接或 Swarm 网络上的命名容器\u002F服务发布 PTR 记录，不会为每个 RFC 1918 私有地址自动生成反向区域。因此，当 Galah 尝试对桥接网关（如 172.26.0.1）或其他私有 IP 进行反向 DNS 查找时，总会收到 'no such host' 错误。\n\n解决方案是更新丰富逻辑以跳过私有 IP 的查找。代码逻辑应如下：\n```go\nimport \"net\"\n\nfunc enrich(srcIP string) {\n    ip := net.ParseIP(srcIP)\n    if ip == nil ||\n       ip.IsLoopback() ||\n       ip.IsPrivate() ||\n       ip.IsLinkLocalUnicast() {\n        \u002F\u002F 跳过 localhost、Docker 桥接等的反向 DNS\n        return\n    }\n    names, err := net.LookupAddr(srcIP)\n    \u002F\u002F ...处理 names\u002Ferr...\n}\n```","https:\u002F\u002Fgithub.com\u002F0x4D31\u002Fgalah\u002Fissues\u002F19",{"id":122,"question_zh":123,"answer_zh":124,"source_url":125},20393,"使用 `-u` 参数提供自定义 OpenAI 服务器 URL 时为何不生效？","当前版本中，当使用 OpenAI 作为提供者时，自定义 URL 参数会被忽略，请求会直接发送到 OpenAI 官方服务器。只有在使用 Ollama 作为提供者时才能设置自定义 URL。\n\n如果您需要使用 OpenAI Enterprise 或其他兼容 OpenAI 接口的私有部署，目前需要等待后续功能更新以支持非 Ollama 提供者的自定义 URL，或者您可以提交 PR 来添加此功能。","https:\u002F\u002Fgithub.com\u002F0x4D31\u002Fgalah\u002Fissues\u002F18",{"id":127,"question_zh":128,"answer_zh":129,"source_url":130},20394,"如何在 Docker 中配置 Google Cloud Platform (GCP) Vertex API 的凭证？","如果您使用 Docker 运行，需要将 Google 凭证文件复制到 Docker 挂载目录中，并通过环境变量引用它。具体步骤如下：\n1. 将凭证文件放入 Docker 数据目录。\n2. 运行容器时添加环境变量：`-e GOOGLE_API_CREDENTIALS=.`（指向凭证文件路径）。\n\n另外，您也可以先使用 `gcloud` CLI 进行认证（参考 https:\u002F\u002Fcloud.google.com\u002Fvertex-ai\u002Fdocs\u002Fauthentication#gcloud），然后在启动 Galah 时设置云项目 ID 和云位置参数。","https:\u002F\u002Fgithub.com\u002F0x4D31\u002Fgalah\u002Fissues\u002F17",{"id":132,"question_zh":133,"answer_zh":134,"source_url":135},20395,"在 Docker 中通过 `-e LLM_API_KEY` 设置 API 密钥为何报错 'Incorrect API key'？","这是因为 Docker 镜像版本与代码仓库版本不一致导致的。如果您使用的是旧的 `infosecb\u002Fgalah` 镜像，环境变量名称应为 `API_KEY` 而不是 `LLM_API_KEY`。\n\n解决方法有两种：\n1. 修改命令使用旧变量名：`-e API_KEY='my-Key'`\n2. 或者从最新源码构建新的 Docker 镜像以支持 `LLM_API_KEY`。","https:\u002F\u002Fgithub.com\u002F0x4D31\u002Fgalah\u002Fissues\u002F6",{"id":137,"question_zh":138,"answer_zh":139,"source_url":140},20396,"遇到 LLM 返回不完整或被截断的 JSON 响应导致解析错误怎么办？","该问题通常由模型（如 Google 的 gemini-1.0-pro-002）生成不完整的 JSON 数据引起。维护者已通过提交修复了此问题（Commit: 0bce8feef74df2bb010070611446b69851775729），增强了系统处理不完整响应和无效 JSON 结构的能力。请确保您使用的是包含此修复的最新版本。","https:\u002F\u002Fgithub.com\u002F0x4D31\u002Fgalah\u002Fissues\u002F7",{"id":142,"question_zh":143,"answer_zh":144,"source_url":145},20397,"使用 `gpt-4-1106-preview` 模型时出现 JSON 解析错误（invalid character '`'）如何解决？","此问题是因为某些 OpenAI 模型返回的 JSON 数据包含多余的 Markdown 代码块标记（如 ```json ... ```）。\n\n解决方案已在最近的合并请求中实现：利用 OpenAI 的 `response_format` 参数强制模型返回纯 JSON，并结合 `cleanResponse` 函数清理响应内容，从而避免解析错误。请更新至最新版本以获取此修复。","https:\u002F\u002Fgithub.com\u002F0x4D31\u002Fgalah\u002Fissues\u002F3",[147,152,157],{"id":148,"version":149,"summary_zh":150,"released_at":151},118981,"v1.1.1","- 更新 Galah 服务，暴露缓存和事件日志记录辅助工具\r\n- 重构日志记录","2025-07-24T03:37:24",{"id":153,"version":154,"summary_zh":155,"released_at":156},118982,"v1.1.0","重大变更：\n- 增加 Suricata 的 HTTP 规则匹配功能\n- 添加 galah 服务软件包\n","2025-07-23T23:31:53",{"id":158,"version":159,"summary_zh":160,"released_at":161},118983,"v1.0.0","主要更新：\n- 支持多家大模型提供商：新增对 Google AI、GCP Vertex AI、Anthropic、Cohere 和 Ollama 的支持。\n- 优化了系统提示和用户提示。","2024-05-26T17:36:11"]