main
py 131 lines 3.94 KB
Raw
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 # ruff: noqa: E501
4
5 """Example Python client for multimodal rerank API which is compatible with
6 Jina and Cohere https://jina.ai/reranker
7
8 Run `vllm serve <model> --runner pooling` to start up the server in vLLM.
9 e.g.
10 vllm serve jinaai/jina-reranker-m0 --runner pooling
11
12 vllm serve Qwen/Qwen3-VL-Reranker-2B \
13 --runner pooling \
14 --max-model-len 4096 \
15 --hf_overrides '{"architectures": ["Qwen3VLForSequenceClassification"],"classifier_from_token": ["no", "yes"],"is_original_qwen3_reranker": true}' \
16 --chat-template examples/pooling/score/template/qwen3_vl_reranker.jinja
17 """
18
19 import argparse
20 import pprint
21
22 import requests
23
24 from vllm.multimodal.utils import encode_image_url, fetch_image
25
26 query = "A woman playing with her dog on a beach at sunset."
27 document = (
28 "A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, "
29 "as the dog offers its paw in a heartwarming display of companionship and trust."
30 )
31 image_url = "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"
32 video_url = "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen3-Omni/demo/draw.mp4"
33 documents = [
34 {
35 "type": "text",
36 "text": document,
37 },
38 {
39 "type": "image_url",
40 "image_url": {"url": image_url},
41 },
42 {
43 "type": "image_url",
44 "image_url": {"url": encode_image_url(fetch_image(image_url))},
45 },
46 {
47 "type": "video_url",
48 "video_url": {"url": video_url},
49 },
50 ]
51
52
53 def parse_args():
54 parser = argparse.ArgumentParser()
55 parser.add_argument("--host", type=str, default="localhost")
56 parser.add_argument("--port", type=int, default=8000)
57 return parser.parse_args()
58
59
60 def main(args):
61 base_url = f"http://{args.host}:{args.port}"
62 models_url = base_url + "/v1/models"
63 rerank_url = base_url + "/rerank"
64
65 response = requests.get(models_url)
66 model = response.json()["data"][0]["id"]
67
68 print("Query: string & Document: list of string")
69 prompt = {"model": model, "query": query, "documents": [document]}
70 response = requests.post(rerank_url, json=prompt)
71 pprint.pprint(response.json())
72
73 print("Query: string & Document: text")
74 prompt = {"model": model, "query": query, "documents": {"content": [documents[0]]}}
75 response = requests.post(rerank_url, json=prompt)
76 pprint.pprint(response.json())
77
78 print("Query: string & Document: image url")
79 prompt = {
80 "model": model,
81 "query": query,
82 "documents": {"content": [documents[1]]},
83 }
84 response = requests.post(rerank_url, json=prompt)
85 pprint.pprint(response.json())
86
87 print("Query: string & Document: image base64")
88 prompt = {
89 "model": model,
90 "query": query,
91 "documents": {"content": [documents[2]]},
92 }
93 response = requests.post(rerank_url, json=prompt)
94 pprint.pprint(response.json())
95
96 print("Query: string & Document: video url")
97 prompt = {
98 "model": model,
99 "query": query,
100 "documents": {"content": [documents[3]]},
101 }
102 response = requests.post(rerank_url, json=prompt)
103 pprint.pprint(response.json())
104
105 print("Query: string & Document: text + image url")
106 prompt = {
107 "model": model,
108 "query": query,
109 "documents": {"content": [documents[0], documents[1]]},
110 }
111 response = requests.post(rerank_url, json=prompt)
112 pprint.pprint(response.json())
113
114 print("Query: string & Document: list")
115 prompt = {
116 "model": model,
117 "query": query,
118 "documents": [
119 document,
120 {"content": [documents[0]]},
121 {"content": [documents[1]]},
122 {"content": [documents[0], documents[1]]},
123 ],
124 }
125 response = requests.post(rerank_url, json=prompt)
126 pprint.pprint(response.json())
127
128
129 if __name__ == "__main__":
130 args = parse_args()
131 main(args)