From f83578fdc9264019a1a1cef8c5484a161167d3dd Mon Sep 17 00:00:00 2001 From: t Date: Tue, 7 Jul 2026 11:26:32 -0600 Subject: initial commit, moved libpanto over from the pantograph repo --- libpanto-go/README.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 libpanto-go/README.md (limited to 'libpanto-go/README.md') diff --git a/libpanto-go/README.md b/libpanto-go/README.md new file mode 100644 index 0000000..0b21137 --- /dev/null +++ b/libpanto-go/README.md @@ -0,0 +1,56 @@ +# libpanto-go + +Idiomatic Go bindings for `libpanto-c` via cgo. + +## Build + +Build the C ABI first: + +```sh +cd .. +zig build +``` + +Then use the Go package from this directory: + +```sh +go test ./... +``` + +At runtime, make sure `../zig-out/lib` (or the installed equivalent) is on your platform's dynamic library path. + +## Example + +```go +panto.Init() +defer panto.Deinit() + +agent, err := panto.NewAgent(panto.Config{ + Provider: panto.ProviderConfig{ + OpenAIChat: &panto.OpenAIChatConfig{ + APIKey: os.Getenv("OPENAI_API_KEY"), + BaseURL: "https://api.openai.com/v1", + Model: "gpt-4.1-mini", + }, + }, +}) +if err != nil { /* handle */ } +defer agent.Close() + +stream, err := agent.Run(panto.UserMessage(panto.TextBlock("hello"))) +if err != nil { /* handle */ } +defer stream.Close() + +for ev := range stream.Iter() { + // ev is an Event interface; type-switch on the concrete event, or branch + // on ev.EventType(). Breaking out of the loop is safe: the session store + // is current at every step. + switch ev := ev.(type) { + case panto.ContentDeltaEvent: + fmt.Print(ev.Delta) + case panto.MessageCompleteEvent: + // full message at agent.Conversation().Message(ev.MessageIndex) + } +} +if err := stream.Err(); err != nil { /* handle */ } +``` -- cgit v1.3