-
Notifications
You must be signed in to change notification settings - Fork 214
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Extend support for useFileOutput
to stream
#309
Conversation
if ( | ||
useFileOutput && | ||
typeof data === "string" && | ||
(data.startsWith("https:") || data.startsWith("data:")) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we want to explicitly match that data
consists of only a valid data uri. There is a reasonable chance that a language model might emit a data:
line that starts with "data:" but less so that it will emit a line that consists only of a well formed data-uri.
🤔 That said, I did think today after reading this post on other AI apis that we should move to structured outputs.
Perhaps the file stream should emit JSON.
data: {"type": "url", value: "data://..."}
And in future we refactor the text streaming interface to do the same:
data: {"type": "string", "data: and some more text"}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think we want to explicitly match that
data
consists of only a valid data uri. There is a reasonable chance that a language model might emit adata:
line that starts with "data:" but less so that it will emit a line that consists only of a well formed data-uri.
That's a good callout. The trick is finding a good way to validate without parsing the whole thing and throwing away the result. I think we can still read lazily if we use a regex to apply some heuristics about its first chunk of content.
🤔 That said, I did think today after reading this post on other AI apis that we should move to structured outputs.
Perhaps the file stream should emit JSON.
data: {"type": "url", value: "data://..."}
And in future we refactor the text streaming interface to do the same:
data: {"type": "string", "data: and some more text"}
I see the advantages of typed outputs, but also quite like the experience we have now of emitting raw tokens. In any case, structured outputs would be a backwards-incompatible change, so we'd have to be clever about a migration.
One way we could support both would be keeping Accept: text/event-stream
as-is, but adding support for Accept: text/event-stream+json
. The client libraries could start sending that as needed to opt into structured outputs.
No description provided.