Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Go] move most of genkit package into core #244

Merged
merged 2 commits into from
May 24, 2024
Merged

[Go] move most of genkit package into core #244

merged 2 commits into from
May 24, 2024

Conversation

jba
Copy link
Contributor

@jba jba commented May 24, 2024

This PR greatly simplifies the genkit package, limiting it to
the symbols that Genkit app developers, as exemplified by
the programs in the "samples" directory, would need.

To accomplish this, it moves most of the code to a new package, named
core. The core package, rather than the genkit package, is now imported
by the ai package and plugins. End-user applications should not normally
require it.

This overlapped with #229, so unfortunately those (minor) changes
are incorporated here as well, in a slightly different form.

This PR greatly simplifies the genkit package, limiting it to
the symbols that Genkit app developers, as exemplified by
the programs in the "samples" directory, would need.

To accomplish this, it moves most of the code to a new package, named
core. The core package, rather than the genkit package, is now imported
by the ai package and plugins. End-user applications should not normally
require it.

This overlapped with #229, so unfortunately those (minor) changes
are incorporated here as well, in a slightly different form.
@jba jba requested review from randall77 and ianlancetaylor May 24, 2024 17:44
@jba
Copy link
Contributor Author

jba commented May 24, 2024

Here is the output of go doc -all on the genkit package:

package genkit // import "github.com/firebase/genkit/go/genkit"

Package genkit provides Genkit functionality for application developers.

FUNCTIONS

func DefineFlow[I, O, S any](name string, fn core.Func[I, O, S]) *core.Flow[I, O, S]
DefineFlow creates a Flow that runs fn, and registers it as an action.

func NewFlowServeMux() *http.ServeMux
NewFlowServeMux constructs a net/http.ServeMux where each defined flow is
a route. All routes take a single query parameter, "stream", which if true
will stream the flow's results back to the client. (Not all flows support
streaming, however.)

To use the returned ServeMux as part of a server with other routes, either
add routes to it, or install it as part of another ServeMux, like so:

    mainMux := http.NewServeMux()
    mainMux.Handle("POST /flow/", http.StripPrefix("/flow/", NewFlowServeMux()))

func Run[T any](ctx context.Context, name string, f func() (T, error)) (T, error)
Run runs the function f in the context of the current flow. It returns an
error if no flow is active.

Each call to Run results in a new step in the flow. A step has its own span
in the trace, and its result is cached so that if the flow is restarted,
f will not be called a second time.

func RunFlow[I, O, S any](ctx context.Context, flow *core.Flow[I, O, S], input I) (O, error)
RunFlow runs flow in the context of another flow. The flow must run to
completion when started (that is, it must not have interrupts).

func StartFlowServer(addr string) error
StartFlowServer starts a server serving the routes described in
NewFlowServeMux. It listens on addr, or if empty, the value of the PORT
environment variable, or if that is empty, ":3400".

In development mode (if the environment variable GENKIT_ENV=dev), it also
starts a dev server.

StartFlowServer always returns a non-nil error, the one returned by
http.ListenAndServe.

func StreamFlow[I, O, S any](ctx context.Context, flow *core.Flow[I, O, S], input I) func(func(*StreamFlowValue[O, S], error) bool)
StreamFlow runs flow on input and delivers both the streamed values and
the final output. It returns a function whose argument function (the "yield
function") will be repeatedly called with the results.

If the yield function is passed a non-nil error, the flow has failed with
that error; the yield function will not be called again. An error is also
passed if the flow fails to complete (that is, it has an interrupt).
Genkit Go does not yet support interrupts.

If the yield function's StreamFlowValue argument has Done == true, the
value's Output field contains the final output; the yield function will not
be called again.

Otherwise the Stream field of the passed StreamFlowValue holds a streamed
result.

TYPES

type NoStream = core.NoStream

type StreamFlowValue[O, S any] struct {
Done bool
Output O // valid if Done is true
Stream S // valid if Done is false
}
StreamFlowValue is either a streamed value or a final output of a flow.

// See the License for the specific language governing permissions and
// limitations under the License.

// Package core implements Genkit actions, flows and other essential machinery.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe also add something like "This package is primarily intended for genkit internals and for plugins. Applications using genkit should use the genkit package."

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

)

// DefineFlow creates a Flow that runs fn, and registers it as an action.
func DefineFlow[I, O, S any](name string, fn core.Func[I, O, S]) *core.Flow[I, O, S] {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if we should define the type of fn in this package as an alias to func(...), so that people looking at the godoc will more clearly understand what to pass. We can make core.Func also a type alias and just duplicate the definition.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I inlined core.Func at that point. Bit of a mouthful, but I agree it's ultimately clearer.
I can't make core.Func a type alias because it has generic parameters, but it worked to insert a cast.

@jba jba merged commit 43fe9bd into main May 24, 2024
5 checks passed
@jba jba deleted the jba-pkgs branch May 24, 2024 19:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants