11import json
22import logging
33import os
4+ import time
45from typing import AsyncIterable
56from arkitect .launcher .local .serve import launch_serve
67from arkitect .telemetry .trace import task
7- from arkitect .types .llm .model import ArkChatRequest , ArkChatParameters
8+ from arkitect .types .llm .model import (
9+ ArkChatRequest ,
10+ ArkChatParameters ,
11+ ArkChatCompletionChunk ,
12+ BotUsage ,
13+ ActionDetail ,
14+ ToolDetail ,
15+ )
816from volcenginesdkarkruntime .types .chat import ChatCompletionChunk
917
1018from arkitect .core .component .context .context import Context
1119
1220from arkitect .core .runtime import Response
13- from volcenginesdkarkruntime .types .chat .chat_completion_chunk import Choice , ChoiceDelta
1421
1522from arkitect .core .component .context .model import State
1623
1926
2027logger = logging .getLogger (__name__ )
2128
22- DOUBAO_VLM_ENDPOINT = "doubao-1-5-vision-pro-32k-250115"
29+ DOUBAO_VLM_ENDPOINT = "doubao-1-5-pro-32k-250115"
30+
31+
32+ @task ()
33+ def get_vector_search_result_chunk (result : str ) -> ArkChatCompletionChunk :
34+ return ArkChatCompletionChunk (
35+ id = "" ,
36+ created = int (time .time ()),
37+ model = "" ,
38+ object = "chat.completion.chunk" ,
39+ choices = [],
40+ bot_usage = BotUsage (
41+ action_details = [
42+ ActionDetail (
43+ name = "vector_search" ,
44+ count = 1 ,
45+ tool_details = [
46+ ToolDetail (
47+ name = "vector_search" , input = None , output = json .loads (result )
48+ )
49+ ],
50+ )
51+ ]
52+ ),
53+ )
2354
2455
2556@task ()
2657async def default_model_calling (
2758 request : ArkChatRequest ,
28- ) -> AsyncIterable [ChatCompletionChunk ]:
59+ ) -> AsyncIterable [ArkChatCompletionChunk | ChatCompletionChunk ]:
2960 parameters = ArkChatParameters (** request .__dict__ )
3061 image_urls = [
3162 content .get ("image_url" , {}).get ("url" , "" )
@@ -36,6 +67,12 @@ async def default_model_calling(
3667 ]
3768 image_url = image_urls [- 1 ] if len (image_urls ) > 0 else ""
3869
70+ # only search for relevant product
71+ if request .metadata and request .metadata .get ("search" ):
72+ result = await vector_search ("" , image_url )
73+ yield get_vector_search_result_chunk (result )
74+ return
75+
3976 async def modify_url_hook (
4077 state : State , param : ChatCompletionMessageToolCallParam
4178 ) -> ChatCompletionMessageToolCallParam :
@@ -55,12 +92,8 @@ async def modify_url_hook(
5592 async for chunk in stream :
5693 if tool_call and chunk .choices :
5794 tool_result = ctx .get_latest_message ()
58- chunk .choices .append (
59- Choice (
60- role = "tool" ,
61- delta = ChoiceDelta (content = tool_result .get ("content" )),
62- index = len (chunk .choices ),
63- )
95+ yield get_vector_search_result_chunk (
96+ str (tool_result .get ("content" , "" ))
6497 )
6598 tool_call = False
6699 yield chunk
0 commit comments