67 lines
2.4 KiB
C
67 lines
2.4 KiB
C
#include "gem/server.h"
|
|
|
|
#include <arpa/inet.h>
|
|
#include <errno.h>
|
|
#include <netinet/in.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/socket.h>
|
|
#include <unistd.h>
|
|
|
|
struct fixture { int generated; };
|
|
|
|
static int generate(void *opaque, const struct gem_chat_request *request,
|
|
gem_stream_emit_fn emit, void *user,
|
|
size_t *input_tokens, size_t *output_tokens,
|
|
const char **finish_reason, char *error, size_t error_size)
|
|
{
|
|
struct fixture *fixture = opaque;
|
|
if (!strstr(request->prompt, "<|turn>user\nhello<turn|>")) {
|
|
(void)snprintf(error, error_size, "unexpected fixture prompt");
|
|
return -1;
|
|
}
|
|
static const char answer[] = "native hax ok";
|
|
struct gem_stream_event event = {
|
|
.kind = GEM_STREAM_TEXT, .text = answer, .text_size = sizeof(answer) - 1,
|
|
};
|
|
if (emit(&event, user) != 0) return -1;
|
|
*input_tokens = 4; *output_tokens = 3; *finish_reason = "stop";
|
|
fixture->generated = 1;
|
|
return 0;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
int listener = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (listener < 0) return 1;
|
|
struct sockaddr_in address = {.sin_family = AF_INET};
|
|
if (inet_pton(AF_INET, "127.0.0.1", &address.sin_addr) != 1 ||
|
|
bind(listener, (struct sockaddr *)&address, sizeof(address)) != 0 ||
|
|
listen(listener, 8) != 0) {
|
|
close(listener); return 1;
|
|
}
|
|
socklen_t address_size = sizeof(address);
|
|
if (getsockname(listener, (struct sockaddr *)&address, &address_size) != 0) {
|
|
close(listener); return 1;
|
|
}
|
|
printf("%u\n", (unsigned)ntohs(address.sin_port));
|
|
fflush(stdout);
|
|
struct fixture fixture = {0};
|
|
struct gem_server_config config = {
|
|
.model_id = "gem-test", .context_length = 32768, .default_max_tokens = 32,
|
|
.sampler = {.temperature = 0, .top_k = 1, .top_p = 1,
|
|
.repeat_penalty = 1, .repeat_last_n = 64, .seed = 1},
|
|
.backend = &fixture, .generate = generate,
|
|
};
|
|
for (unsigned request = 0; request < 8 && !fixture.generated; ++request) {
|
|
int client;
|
|
do { client = accept(listener, NULL, NULL); } while (client < 0 && errno == EINTR);
|
|
if (client < 0) { close(listener); return 1; }
|
|
char error[256];
|
|
(void)gem_server_handle_connection(client, &config, error, sizeof(error));
|
|
close(client);
|
|
}
|
|
close(listener);
|
|
return fixture.generated ? 0 : 1;
|
|
}
|