Files
lm-sys--fastchat/tests/test_openai_vision_api.py
wehub-resource-sync 8153d5ec9f
Python package / build (3.10) (push) Successful in 8m51s
chore: import upstream snapshot with attribution
2026-07-13 12:35:30 +08:00

163 lines
4.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
Test the OpenAI compatible server
Launch:
python3 launch_openai_api_test_server.py --multimodal
"""
import openai
from fastchat.utils import run_cmd
openai.api_key = "EMPTY" # Not support yet
openai.base_url = "http://localhost:8000/v1/"
def encode_image(image):
import base64
from io import BytesIO
import requests
from PIL import Image
if image.startswith("http://") or image.startswith("https://"):
response = requests.get(image)
image = Image.open(BytesIO(response.content)).convert("RGB")
else:
image = Image.open(image).convert("RGB")
buffered = BytesIO()
image.save(buffered, format="PNG")
img_b64_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
return img_b64_str
def test_list_models():
model_list = openai.models.list()
names = [x.id for x in model_list.data]
return names
def test_chat_completion(model):
image_url = "https://picsum.photos/seed/picsum/1024/1024"
base64_image_url = f"data:image/jpeg;base64,{encode_image(image_url)}"
# No Image
completion = openai.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Tell me about alpacas."},
],
}
],
temperature=0,
)
print(completion.choices[0].message.content)
print("=" * 25)
# Image using url link
completion = openai.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Whats in this image?"},
{"type": "image_url", "image_url": {"url": image_url}},
],
}
],
temperature=0,
)
print(completion.choices[0].message.content)
print("=" * 25)
# Image using base64 image url
completion = openai.chat.completions.create(
model=model,
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "Whats in this image?"},
{"type": "image_url", "image_url": {"url": base64_image_url}},
],
}
],
temperature=0,
)
print(completion.choices[0].message.content)
print("=" * 25)
def test_chat_completion_stream(model):
image_url = "https://picsum.photos/seed/picsum/1024/1024"
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "Whats in this image?"},
{"type": "image_url", "image_url": {"url": image_url}},
],
}
]
res = openai.chat.completions.create(
model=model, messages=messages, stream=True, temperature=0
)
for chunk in res:
try:
content = chunk.choices[0].delta.content
if content is None:
content = ""
except Exception as e:
content = chunk.choices[0].delta.get("content", "")
print(content, end="", flush=True)
print()
def test_openai_curl():
run_cmd(
"""curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llava-v1.5-7b",
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Whats in this image?"
},
{
"type": "image_url",
"image_url": {
"url": "https://picsum.photos/seed/picsum/1024/1024"
}
}
]
}
],
"max_tokens": 300
}'
"""
)
print()
if __name__ == "__main__":
models = test_list_models()
print(f"models: {models}")
for model in models:
print(f"===== Test {model} ======")
test_chat_completion(model)
test_chat_completion_stream(model)
test_openai_curl()