mirror of
https://github.com/mudler/LocalAI.git
synced 2026-10-28 09:08:54 -04:00
Add the GEM-X native backend with live pose and root displacement output, bounded duplex WebSocket streaming, session authorization, metrics and usage accounting. Share the embedded bidirectional RPC channel adapter across streaming backends.
Include backend build and gallery integration, API documentation, schemas and tests.
Assisted-by: Codex:gpt-6
Signed-off-by: Richard Palethorpe <io@richiejp.com>
(cherry picked from commit 016dc3d71a)
53 lines
1.8 KiB
Go
53 lines
1.8 KiB
Go
// SPDX-License-Identifier: MIT
|
|
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"github.com/ebitengine/purego"
|
|
)
|
|
|
|
var liveCreate func(string, string, string, string, string, *uint32, int64, *uintptr, *byte, uint64) int32
|
|
var liveDestroy func(uintptr)
|
|
var liveDefinition func(uintptr, *byte, uint64, *uint64, *byte, uint64) int32
|
|
var liveReset func(uintptr, *byte, uint64) int32
|
|
var liveSubmit func(uintptr, *byte, uint64, uint32, uint32, uint64, uint64, int64, *float32, uint64, uint64, *uintptr, *byte, uint64) int32
|
|
var resultDestroy func(uintptr)
|
|
var resultInfo func(uintptr, *uint64, *int64, *uint64, *uint64, *uint32, *uint32, *byte, uint64) int32
|
|
var resultIntervalStart func(uintptr, *int64, *byte, uint64) int32
|
|
var resultCopy func(uintptr, uint32, *float32, uint64, *uint64, *byte, uint64) int32
|
|
|
|
func loadNativeLibrary(path string) error {
|
|
lib, err := purego.Dlopen(path, purego.RTLD_NOW|purego.RTLD_GLOBAL)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, b := range []struct {
|
|
fn any
|
|
name string
|
|
}{
|
|
{&liveCreate, "localai_gemx_create"}, {&liveDestroy, "gemx_live_destroy"},
|
|
{&liveDefinition, "gemx_live_definition"}, {&liveReset, "gemx_live_reset"},
|
|
{&liveSubmit, "gemx_live_submit"}, {&resultDestroy, "gemx_live_result_destroy"},
|
|
{&resultInfo, "gemx_live_result_info"}, {&resultCopy, "gemx_live_result_copy"},
|
|
} {
|
|
symbol, err := purego.Dlsym(lib, b.name)
|
|
if err != nil {
|
|
return fmt.Errorf("streaming ABI: %w", err)
|
|
}
|
|
purego.RegisterFunc(b.fn, symbol)
|
|
}
|
|
// Optional additive ABI; old libraries can still stream poses.
|
|
resultIntervalStart = nil
|
|
if symbol, err := purego.Dlsym(lib, "gemx_live_result_interval_start"); err == nil {
|
|
purego.RegisterFunc(&resultIntervalStart, symbol)
|
|
}
|
|
return nil
|
|
}
|
|
func nativeError(code int32, buf []byte) error {
|
|
if code == 0 {
|
|
return nil
|
|
}
|
|
return fmt.Errorf("gemx (%d): %s", code, bytes.TrimRight(buf, "\x00"))
|
|
}
|