GitHub Copilot Chat Assistant
image-analyze-skill — skill.md
说明
- 这是一个可直接用作 Function Calling 的技能说明与示例实现(skill.md)。
- 包含可放进 models function list 的 JSON schema、示例调用、以及可运行的最小后端示例(Python Flask + Pillow + pytesseract)。
- 你可以复制并保存为 skill.md。
概述
这个技能接收一张图片(公开 URL 或 base64),并根据请求的 task 返回:图片描述(自然语言)、对象检测结果、OCR 文本或为无障碍场景生成替代文字(alt text)。设计目标是简单、可扩展、安全。
Function Calling 定义(JSON schema)
{ "name": "analyze_image", "description": "接收图片(image_url 或 image_base64),并完成指定视觉任务:describe、detect_objects、ocr、generate_alt_text、caption。", "parameters": { "type": "object", "properties": { "image_url": { "type": "string", "description": "图片的公开可访问 URL(优先使用)。" }, "image_base64": { "type": "string", "description": "base64 编码的图片数据(与 image_url 二选一)。" }, "content_type": { "type": "string", "description": "图片 MIME 类型,如 image/png 或 image/jpeg(可选)。" }, "task": { "type": "string", "enum": ["describe","detect_objects","ocr","generate_alt_text","caption"], "description": "要执行的任务。" }, "options": { "type": "object", "description": "任务特定可选项。", "properties": { "max_objects": { "type": "integer", "default": 10 }, "language": { "type": "string", "default": "zh-CN" }, "include_confidence": { "type": "boolean", "default": true } } } }, "required": ["task"], "oneOf": [ { "required": ["image_url"] }, { "required": ["image_base64"] } ] } }
示例返回结构(实现应返回相似 JSON): { "description": "一张在公园的白天照片,前景有两个人坐在长椅上,背景有树和一条小路。", "objects": [ { "label": "person", "confidence": 0.98, "bbox": [100,50,200,400] }, { "label": "bench", "confidence": 0.89, "bbox": [80,300,300,370] } ], "ocr_text": "示例识别文本", "alt_text": "两人在公园长椅上,背景为树木和小路。", "raw": { "source": "local" } }
使用示例(function-calling JSON)
示例(传 URL): { "name": "analyze_image", "arguments": { "image_url": "https://example.com/photo.jpg", "task": "describe", "options": { "language": "zh-CN" } } }
示例(传 base64): { "name": "analyze_image", "arguments": { "image_base64": "", "task": "ocr", "options": { "language": "zh-CN" } } }
curl JSON 调用示例(调用本地 HTTP 服务): curl -X POST "http://localhost:5000/analyze-image" -H "Content-Type: application/json" -d '{"image_url":"https://example.com/photo.jpg","task":"describe"}'
最小可运行后端(Python Flask 示例)
说明:此示例实现 OCR(pytesseract)和基本描述模板。对象检测/高级 caption 可接入第三方视觉模型或云视觉 API(示后)。限制:需安装依赖并配置 tesseract。
依赖(pip):
- flask
- pillow
- requests
- pytesseract
系统需安装 tesseract(例如 apt install tesseract-ocr)。
app.py: from flask import Flask, request, jsonify from PIL import Image import io, base64, requests, pytesseract
app = Flask(name)
def load_image_from_url(url, timeout=5): resp = requests.get(url, timeout=timeout) resp.raise_for_status() return Image.open(io.BytesIO(resp.content)).convert("RGB")
def load_image_from_base64(b64): header_removed = b64.split(",",1)[-1] data = base64.b64decode(header_removed) return Image.open(io.BytesIO(data)).convert("RGB")
def do_ocr(img, lang="chi_sim"): try: text = pytesseract.image_to_string(img, lang=lang) return text.strip() except Exception as e: return ""
@app.route("/analyze-image", methods=["POST"]) def analyze_image_http(): payload = request.get_json() if not payload or "task" not in payload: return jsonify({"error":"missing task"}), 400 task = payload["task"] options = payload.get("options", {}) lang = options.get("language", "zh-CN") try: if "image_url" in payload: img = load_image_from_url(payload["image_url"]) elif "image_base64" in payload: img = load_image_from_base64(payload["image_base64"]) else: return jsonify({"error":"missing image_url or image_base64"}), 400 except Exception as e: return jsonify({"error":"failed to load image","detail": str(e)}), 400
result = {"raw": {"source": "local"}}
if task == "ocr":
# pytesseract language codes vary; map zh-CN -> chi_sim if tesseract trained data present
t_lang = "chi_sim" if lang.startswith("zh") else "eng"
result["ocr_text"] = do_ocr(img, lang=t_lang)
elif task == "describe" or task == "generate_alt_text" or task == "caption":
# Minimal rule-based description (placeholder). Replace with model API for better results.
w,h = img.size
result["description"] = f"图片尺寸 {w}x{h},可能包含人物或场景。请使用更强的模型生成自然语言描述。"
if task == "generate_alt_text":
result["alt_text"] = "自动生成的替代文字:一张照片,包含人物或场景。"
elif task == "detect_objects":
# Placeholder: no detector here. Return empty list.
result["objects"] = []
result["note"] = "未启用本地对象检测。可接入 YOLO/Detectron/云视觉 API。"
else:
return jsonify({"error":"unsupported task"}), 400
return jsonify(result)
if name == "main": app.run(host="0.0.0.0", port=5000, debug=True)
运行:
- pip install flask pillow requests pytesseract
- 安装系统 tesseract(例如 Debian/Ubuntu: apt install tesseract-ocr tesseract-ocr-chi-sim)
- python app.py
扩展点:
- 对象检测:接入 ultralytics YOLOv8(pip install ultralytics)或 torch + detectron2。
- 图片描述/caption:接入开源视觉-语言模型(如 BLIP、OFASys 等)或云服务(Google Vision + Vertex AI、Azure Vision、AWS Rekognition)。
使用云视觉服务(快速替代)
如果希望精确、立即可用的检测/描述,推荐接入 Google Vision 或 Azure Computer Vision(按其 REST API 调用)。优点:准确、易部署;缺点:需云账号与付费。
示例思路:
- 将 image_url 传给云 API 的图像分析端点
- 返回的 objects/labels/ocr/caption 填入技能返回结构
安全与生产注意事项
- 防止 SSRF:对 image_url 进行白名单或拒绝私有 IP(127.0.0.1, 10., 172.16., 192.168.*);使用短超时与最大响应体大小限制。
- 限制 base64 大小(建议 <= 5MB 或你能处理的阈值)。
- 并发与队列:对耗时任务(模型推理)采用队列与限流,避免请求风暴。
- 隐私:不要把敏感图片存入日志;如需存储,应告知用户并加密存储。
- 内容检测:若提供公开服务,考虑对成人/暴力等内容进行检测与处理。
集成建议(模型 function-calling)
- 把上面的 JSON schema 放入调用模型时的 functions 列表。
- 当模型选择调用函数,按 schema 传入 image_url 或 image_base64 与 task。
- 后端接收到 function 调用参数后,执行分析并返回 JSON,模型会把结果整合进对话。
限制与改进路线
- 当前提供的本地示例仅做演示(OCR + 占位描述)。生产需要接入更强的视觉模型或云视觉 API。
- 推荐路线:
- 快速起步:使用云视觉(Google/Azure/AWS)
- 可控部署:部署轻量级本地模型(YOLOv8 + BLIP)
- 精细化:多任务流水线并行处理(OCR、检测、caption),缓存结果,提供分页/裁剪大图
文件署名与 License
- 推荐放置 MIT 或 Apache-2.0 许可证头。这里示例使用 MIT(请在仓库中添加 LICENSE 文件)。
如果你还需要我把这个文件上传到仓库并给你 raw 下载链接,或者生成一个 public gist,或者把示例改成 Node.js/TypeScript 实现,告诉我你想要哪种我再继续.