jina-ai/jina

Flow with http doesn't support docarray float attribute

ZiniuYu opened this issue · 0 comments

Describe the bug

The flow will raise an error when sending float in HTTP. GRPC works fine

from typing import Optional

from docarray import BaseDoc, DocList
from jina import Flow, Executor, requests

class DummyDoc(BaseDoc):
    number: float

class DummyExecutor(Executor):
    @requests
    def foo(self, docs: DocList[DummyDoc], **kwargs) -> DocList[DummyDoc]:
        result: DocList[DummyDoc] = DocList[DummyDoc]()
        for d in docs:
            result.append(DummyDoc(number=d.number * 2))
        return result

with Flow(protocol='http').add(uses=DummyExecutor) as f:
    result = f.post(on='/foo', inputs=DocList([DummyDoc(number=0.5)]))
    print(result[0].number)

Throws

Traceback (most recent call last):                                                                                                                                                                                                                                                                      
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/jina/serve/runtimes/worker/request_handling.py", line 1049, in process_data                                                                                                                                                              
           result = await self.handle(                                                                                                                                                                                                                                                                         
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/jina/serve/runtimes/worker/request_handling.py", line 647, in handle                                                                                                                                                                     
           len_docs = len(requests[0].docs)  # TODO we can optimize here and access the                                                                                                                                                                                                                        
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/jina/types/request/data.py", line 278, in docs                                                                                                                                                                                           
           return self.data.docs                                                                                                                                                                                                                                                                               
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/jina/types/request/data.py", line 47, in docs                                                                                                                                                                                            
           self._loaded_doc_array = self.document_array_cls.from_protobuf(                                                                                                                                                                                                                                     
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/docarray/array/doc_list/doc_list.py", line 310, in from_protobuf                                                                                                                                                                         
           return super().from_protobuf(pb_msg)                                                                                                                                                                                                                                                                
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/docarray/array/doc_list/io.py", line 122, in from_protobuf                                                                                                                                                                               
           return cls(cls.doc_type.from_protobuf(doc_proto) for doc_proto in pb_msg.docs)                                                                                                                                                                                                                      
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/docarray/array/doc_list/doc_list.py", line 130, in __init__                                                                                                                                                                              
           super().__init__(docs)                                                                                                                                                                                                                                                                              
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/docarray/array/doc_list/doc_list.py", line 157, in _validate_docs                                                                                                                                                                        
           for doc in docs:                                                                                                                                                                                                                                                                                    
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/docarray/array/doc_list/io.py", line 122, in <genexpr>                                                                                                                                                                                   
           return cls(cls.doc_type.from_protobuf(doc_proto) for doc_proto in pb_msg.docs)                                                                                                                                                                                                                      
         File "/opt/anaconda3/envs/py310/lib/python3.10/site-packages/docarray/base_doc/mixins/io.py", line 250, in from_protobuf                                                                                                                                                                              
           return cls(**fields)                                                                                                                                                                                                                                                                                
         File "pydantic/main.py", line 341, in pydantic.main.BaseModel.__init__                                                                                                                                                                                                                                
       pydantic.error_wrappers.ValidationError: 1 validation error for DummyDoc                                                                                                                                                                                                                                
       number                                                                                                                                                                                                                                                                                                  
         none is not an allowed value (type=type_error.none.not_allowed)

Deployment dones't have such issues

with Deployment(protocol='http', uses=DummyExecutor) as f:
    result = f.post(on='/foo', inputs=DocList([DummyDoc(number=0.5)]))

Describe how you solve it


Environment

Screenshots