microsoft / promptflow

Build high-quality LLM apps - from prototyping, testing to production deployment and monitoring.
https://microsoft.github.io/promptflow/
MIT License
9.58k stars 876 forks source link

[Feature Request] Make flow output json dump configurable to allow object as output #3099

Open duongthaiha opened 7 months ago

duongthaiha commented 7 months ago

Is your feature request related to a problem? Please describe. I want to return an class as output for the python tool however it shows error JSON dump failed: For example for the following code: it will return an error image

@dataclass
class ThoughtStep:
    title: str
    description: Optional[Any]
    props: Optional[dict[str, Any]] = None

# The inputs section will change based on the arguments of the tool function, after you save the code
# Adding type to arguments and return value will help the system show the types properly
# Please update the function name/signature per need
@tool
def my_python_tool(zone_instruction: str, modify_query:str, answer_question:str) -> list:
    thought_steps = [
        ThoughtStep(title="Look up Zone Instruction", description=zone_instruction, props=None),
        ThoughtStep(title="Modify the query with history and zone instruction", description=modify_query, props=None),
        ThoughtStep(title="Search relevant documentation", description=None, props=None),
        ThoughtStep(title="Answer the questions", description=answer_question, props=None)
    ]
    return thought_steps

Describe the solution you'd like Allow option to inject how to serialise an complex object

Describe alternatives you've considered My current work around is to manually use jsonoutput = json.dumps(thought_steps, default=lambda o: o.dict) inside the pythong tool and return a string instead

Additional context Happy to connect to explain in more detail if it helps

ferBV commented 7 months ago

For me this would be of great utility too, before migrating to Azure AI Studio in our project we were using Instructor package that uses pydantic for validate the outputs and was an almost perfect solution. I would be willing to contribute to make an enhancement feature.

0mza987 commented 6 months ago

@duongthaiha, Thanks for the feedback, I want to confirm that do you just want to pass a customized object inside a flow (from a node to another node)? If that's the case you can refer to Function based flow — Prompt flow documentation, with this type of flow you can pass any object inside a flow, actually there is no concept of node anymore, no dag either.

If you still want to use dag flow and return a customized object for a node (or flow output) just like your sample code, then we need a comprehensive design for this feature, it could be a long-term task to implement this feature.

@ferBV,

Thanks for your comments, really appreciate it. Could you please provide a more detailed design for this work? Maybe a doc or something? We would love it if community can contribute to prompt flow project.

duongthaiha commented 6 months ago

@0mza987 Yes it was the idea please. It will be a great feature as it will extend so much more use cases please

0mza987 commented 6 months ago

Hi @duongthaiha , thanks for the feedback, our team does not have the bandwidth now, I'll mark this as a long-term item and will pick it up once we have the bandwidth. Thanks.