new api of vertai ai function call

還是報錯哎
由上往下是錯誤訊息跟我使用城市碼,然後我用城市碼,基本上就是直接貼上你給我的程式碼


import requests
import base64
import json
import os
from datetime import datetime

# 設置API密鑰和自定義base URL
API_KEY = 'sk-KjjI60Yf0JFWtfgRmXqFWyGtWUd9GZnmi3KlvowmRWpWpQRo'
BASE_URL = 'http://localhost:8001/v1'
SAVE_DIR = 'safe_output'  # 保存 JSON 輸出的目錄

def ensure_save_directory():
    if not os.path.exists(SAVE_DIR):
        os.makedirs(SAVE_DIR)

def image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

def get_model_response(image_base64):
    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {API_KEY}"
    }

    tools = [
        {
            "type": "function",
            "function": {
                "name": "extract_underlined_text",
                "description": "從圖片中提取紅色下劃線的文字",
                "parameters": {
                    "type": "object",
                    "properties": {
                        "underlined_text": {
                            "type": "array",
                            "items": {"type": "string"},
                            "description": "紅色下劃線的文字列表"
                        }
                    },
                    "required": ["underlined_text"]
                }
            }
        }
    ]

    payload = {
        "model": "claude-3-5-sonnet",
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": "請仔細分析圖片,並提取所有使用紅色筆在單字、單詞或句子下方畫有橫線的文字。只提取有紅色下劃線的文字,忽略其他未標記的文字。將結果以 JSON 格式輸出,格式為 {\"underlined_text\": [\"文字1\", \"文字2\", ...]}。"
                    },
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/jpeg;base64,{image_base64}"
                        }
                    }
                ]
            }
        ],
        # "stream": True,
        "tools": tools,
        "tool_choice": {"type": "function", "function": {"name": "extract_underlined_text"}},
        "max_tokens": 1000
    }

    try:
        response = requests.post(f"{BASE_URL}/chat/completions", headers=headers, json=payload, timeout=30)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        return f"Error: {e}"

def save_json_output(data):
    ensure_save_directory()
    timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
    filename = f"{SAVE_DIR}/output_{timestamp}.json"
    with open(filename, 'w', encoding='utf-8') as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
    return filename

def main(image_path):
    image_base64 = image_to_base64(image_path)

    response = get_model_response(image_base64)

    print("模型回應:")
    print(json.dumps(response, indent=2, ensure_ascii=False))

    if isinstance(response, str) and response.startswith("Error"):
        print(response)
        return

    if 'choices' in response and response['choices']:
        message = response['choices'][0]['message']
        if 'tool_calls' in message:
            tool_call = message['tool_calls'][0]
            if tool_call['function']['name'] == 'extract_underlined_text':
                function_args = json.loads(tool_call['function']['arguments'])
                print("\n提取的紅色下劃線文字:")
                print(json.dumps(function_args, indent=2, ensure_ascii=False))

                # 保存 JSON 輸出
                saved_file = save_json_output(function_args)
                print(f"\nJSON 輸出已保存至: {saved_file}")
            else:
                print("\n模型調用了未預期的函數。")
        else:
            print("\n模型沒有調用工具。")
    else:
        print("\n無法解析回應。")

if __name__ == "__main__":
    image_path = "1.jpg"  # 替換為您的圖像路徑
    main(image_path)

你好,又修复了一些 bug,完全使用你的代码,仅修改了API key和端口号,在vertex claude3.5上测试是成功有响应的,截图如下:

666 這個人好牛

如果还有啥 bug,和需求都可以随时联系我。:heart:

1 Like