==> tests/request.c <==1/* infer.rs's requests_parse, plus the error texts. */
2#include "mesh/check.h"
3#include "mesh/infer_request.h"
4
5#include <stdlib.h>
6
7int main(void) {
8 mesh_infer_request r;
9 char *err = NULL;
10 CHECK_I(mesh_infer_parse("exact max 16 prefill=0 decode=3 The quick brown fox", &r, &err), 0);
11 CHECK_S(r.mode, "exact");
12 CHECK_U(r.max, 16);
13 CHECK(r.has_prefill && r.prefill == 0 && r.has_decode && r.decode == 3 && !r.has_mono);
14 CHECK_S(r.prompt, "The quick brown fox");
15 mesh_infer_request_free(&r);
16 CHECK_I(mesh_infer_parse("Hello there", &r, &err), 0);
17 CHECK_S(r.mode, "fast");
18 CHECK_U(r.max, 32);
19 CHECK_S(r.prompt, "Hello there");
20 mesh_infer_request_free(&r);
21 CHECK_I(mesh_infer_parse("max=5 mono=1 hi", &r, &err), 0);
22 CHECK(r.has_mono && r.mono == 1 && r.max == 5);
23 mesh_infer_request_free(&r);
24 CHECK_I(mesh_infer_parse("prefill=1 hi", &r, &err), -1);
25 CHECK_S(err, "prefill= and decode= go together (" MESH_INFER_USAGE ")");
26 free(err);
27 mesh_infer_request_free(&r);
28 CHECK_I(mesh_infer_parse("mono=1 prefill=0 decode=1 hi", &r, &err), -1);
29 free(err);
30 mesh_infer_request_free(&r);
31 CHECK_I(mesh_infer_parse("exact max 8", &r, &err), -1);
32 CHECK_S(err, "no prompt (" MESH_INFER_USAGE ")");
33 free(err);
34 mesh_infer_request_free(&r);
35 CHECK_I(mesh_infer_parse("max x hi", &r, &err), -1);
36 CHECK_S(err, "max: not a number (" MESH_INFER_USAGE ")");
37 free(err);
38 mesh_infer_request_free(&r);
39 CHECK_I(mesh_infer_parse("max=0 hi", &r, &err), -1);
40 CHECK_S(err, "max 0: 1..=1000");
41 free(err);
42 mesh_infer_request_free(&r);
43 CHECK_I(mesh_infer_parse("repeat=5000 len=7 hi ", &r, &err), 0);
44 CHECK(r.repeat == 1000 && r.len == 7);
45 CHECK_S(r.prompt, "hi");
46 mesh_infer_request_free(&r);
47
48 bool full;
49 CHECK_I(mesh_infer_from_query("prompt=Hello%2C+world&max=4&mode=exact&prefill=0&decode=1&format=full", &r, &full, &err), 0);
50 CHECK_S(r.prompt, "Hello, world");
51 CHECK(r.max == 4 && r.prefill == 0 && r.decode == 1 && full);
52 CHECK_S(r.mode, "exact");
53 mesh_infer_request_free(&r);
54 CHECK_I(mesh_infer_from_query("max=4", &r, &full, &err), -1);
55 CHECK_S(err, "no prompt= parameter");
56 free(err);
57 CHECK_I(mesh_infer_from_query("prompt=x&evil=1", &r, &full, &err), -1);
58 CHECK_S(err, "unknown parameter \"evil\" (prompt, max, mode, prefill, decode, mono, format)");
59 free(err);
60 char *d = mesh_infer_url_decode("a%zz%41%4");
61 CHECK_S(d, "a%zzA%4");
62 free(d);
63
64 mesh_infer_msg m;
65 mesh_infer_msg_init(&m);
66 mesh_infer_msg_set(&m, "tok_s", "41.2");
67 mesh_infer_msg_set(&m, "gen_tokens", "8");
68 mesh_infer_msg_set_body(&m, "the end");
69 mesh_buf t = MESH_BUF_INIT;
70 mesh_infer_text(&t, &m);
71 CHECK_S(mesh_buf_str(&t), "gen_tokens 8\ntok_s 41.2\ntext the end\n");
72 mesh_buf_free(&t);
73 mesh_infer_msg_free(&m);
74 return mesh_check_done();
75}