Instructions to use AJKADZ/PHI_CODER with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- llama.cpp
How to use AJKADZ/PHI_CODER with llama.cpp:
Install (macOS, Linux)
curl -LsSf https://llama.app/install.sh | sh # Start a local OpenAI-compatible server with a web UI: llama serve -hf AJKADZ/PHI_CODER:Q4_K_M # Run inference directly in the terminal: llama cli -hf AJKADZ/PHI_CODER:Q4_K_M
Install from WinGet (Windows)
winget install llama.cpp # Start a local OpenAI-compatible server with a web UI: llama serve -hf AJKADZ/PHI_CODER:Q4_K_M # Run inference directly in the terminal: llama cli -hf AJKADZ/PHI_CODER:Q4_K_M
Use pre-built binary
# Download pre-built binary from: # https://github.com/ggerganov/llama.cpp/releases # Start a local OpenAI-compatible server with a web UI: ./llama-server -hf AJKADZ/PHI_CODER:Q4_K_M # Run inference directly in the terminal: ./llama-cli -hf AJKADZ/PHI_CODER:Q4_K_M
Build from source code
git clone https://github.com/ggerganov/llama.cpp.git cd llama.cpp cmake -B build cmake --build build -j --target llama-server llama-cli # Start a local OpenAI-compatible server with a web UI: ./build/bin/llama-server -hf AJKADZ/PHI_CODER:Q4_K_M # Run inference directly in the terminal: ./build/bin/llama-cli -hf AJKADZ/PHI_CODER:Q4_K_M
Use Docker
docker model run hf.co/AJKADZ/PHI_CODER:Q4_K_M
- Llama new
- LM Studio
- Jan
- Ollama
How to use AJKADZ/PHI_CODER with Ollama:
ollama run hf.co/AJKADZ/PHI_CODER:Q4_K_M
- Unsloth Desktop
- Docker Model Runner
How to use AJKADZ/PHI_CODER with Docker Model Runner:
docker model run hf.co/AJKADZ/PHI_CODER:Q4_K_M
- Lemonade
How to use AJKADZ/PHI_CODER with Lemonade:
Pull the model
# Download Lemonade from https://lemonade-server.ai/ lemonade pull AJKADZ/PHI_CODER:Q4_K_M
Run and chat with the model
lemonade run user.PHI_CODER-Q4_K_M
List all available models
lemonade list
- Atomic Chat
Download phi-coder-hf/llama.cpp/tools/mtmd/clip-impl.h from AJKADZ/PHI_CODER: direct link, hf CLI and curl.
- Browser
- Download file 17.2 kB
-
https://huggingface.co/AJKADZ/PHI_CODER/resolve/main/phi-coder-hf/llama.cpp/tools/mtmd/clip-impl.h
- Command line
-
hf download hf://AJKADZ/PHI_CODER/phi-coder-hf/llama.cpp/tools/mtmd/clip-impl.h
-
curl -L -o clip-impl.h https://huggingface.co/AJKADZ/PHI_CODER/resolve/main/phi-coder-hf/llama.cpp/tools/mtmd/clip-impl.h
17.2 kB
| // Internal header for clip.cpp | |
| // vision-specific | |
| // audio-specific | |
| // | |
| // tensor name constants | |
| // | |
| // mimicpmv | |
| // ultravox | |
| // align x to upper multiple of n | |
| enum projector_type { | |
| PROJECTOR_TYPE_MLP, | |
| PROJECTOR_TYPE_MLP_NORM, | |
| PROJECTOR_TYPE_LDP, | |
| PROJECTOR_TYPE_LDPV2, | |
| PROJECTOR_TYPE_MINICPMV, | |
| PROJECTOR_TYPE_GLM_EDGE, | |
| PROJECTOR_TYPE_QWEN2VL, | |
| PROJECTOR_TYPE_GEMMA3, | |
| PROJECTOR_TYPE_IDEFICS3, | |
| PROJECTOR_TYPE_PIXTRAL, | |
| PROJECTOR_TYPE_QWEN25VL, | |
| PROJECTOR_TYPE_ULTRAVOX, | |
| PROJECTOR_TYPE_INTERNVL, | |
| PROJECTOR_TYPE_LLAMA4, | |
| PROJECTOR_TYPE_QWEN2A, | |
| PROJECTOR_TYPE_QWEN25O, // will be replaced by QWEN2A or QWEN25VL depending on clip_ctx | |
| PROJECTOR_TYPE_VOXTRAL, | |
| PROJECTOR_TYPE_UNKNOWN, | |
| }; | |
| static std::map<projector_type, std::string> PROJECTOR_TYPE_NAMES = { | |
| { PROJECTOR_TYPE_MLP, "mlp" }, | |
| { PROJECTOR_TYPE_LDP, "ldp" }, | |
| { PROJECTOR_TYPE_LDPV2, "ldpv2"}, | |
| { PROJECTOR_TYPE_MINICPMV, "resampler"}, | |
| { PROJECTOR_TYPE_GLM_EDGE, "adapter"}, | |
| { PROJECTOR_TYPE_QWEN2VL, "qwen2vl_merger"}, | |
| { PROJECTOR_TYPE_QWEN25VL, "qwen2.5vl_merger"}, | |
| { PROJECTOR_TYPE_GEMMA3, "gemma3"}, | |
| { PROJECTOR_TYPE_IDEFICS3, "idefics3"}, | |
| { PROJECTOR_TYPE_PIXTRAL, "pixtral"}, | |
| { PROJECTOR_TYPE_ULTRAVOX, "ultravox"}, | |
| { PROJECTOR_TYPE_INTERNVL, "internvl"}, | |
| { PROJECTOR_TYPE_LLAMA4, "llama4"}, | |
| { PROJECTOR_TYPE_QWEN2A, "qwen2a"}, | |
| { PROJECTOR_TYPE_QWEN25O, "qwen2.5o"}, | |
| { PROJECTOR_TYPE_VOXTRAL, "voxtral"}, | |
| }; | |
| static projector_type clip_projector_type_from_string(const std::string & str) { | |
| for (const auto & pair : PROJECTOR_TYPE_NAMES) { | |
| if (pair.second == str) { | |
| return pair.first; | |
| } | |
| } | |
| return PROJECTOR_TYPE_UNKNOWN; | |
| } | |
| // RGB uint8 image | |
| struct clip_image_u8 { | |
| int nx; | |
| int ny; | |
| std::vector<uint8_t> buf; | |
| }; | |
| // For images, buf.size() == nx*ny*3 | |
| // Memory layout: RGBRGBRGB... | |
| // For audio, only one channel is used, buf.size() == nx*ny | |
| // nx will be n_frames and ny will be n_mel | |
| struct clip_image_f32 { | |
| int nx; | |
| int ny; | |
| std::vector<float> buf; | |
| }; | |
| // | |
| // logging | |
| // | |
| static void clip_log_callback_default(enum ggml_log_level level, const char * text, void * user_data) { | |
| (void) level; | |
| (void) user_data; | |
| fputs(text, stderr); | |
| fflush(stderr); | |
| } | |
| struct clip_logger_state { | |
| ggml_log_level verbosity_thold; | |
| ggml_log_callback log_callback; | |
| void * log_callback_user_data; | |
| }; | |
| extern struct clip_logger_state g_logger_state; | |
| static void clip_log_internal_v(enum ggml_log_level level, const char * format, va_list args) { | |
| if (format == NULL) { | |
| return; | |
| } | |
| va_list args_copy; | |
| va_copy(args_copy, args); | |
| char buffer[128]; | |
| int len = vsnprintf(buffer, 128, format, args); | |
| if (len < 128) { | |
| g_logger_state.log_callback(level, buffer, g_logger_state.log_callback_user_data); | |
| } else { | |
| char * buffer2 = (char *) calloc(len + 1, sizeof(char)); | |
| vsnprintf(buffer2, len + 1, format, args_copy); | |
| buffer2[len] = 0; | |
| g_logger_state.log_callback(level, buffer2, g_logger_state.log_callback_user_data); | |
| free(buffer2); | |
| } | |
| va_end(args_copy); | |
| } | |
| static void clip_log_internal(enum ggml_log_level level, const char * format, ...) { | |
| va_list args; | |
| va_start(args, format); | |
| clip_log_internal_v(level, format, args); | |
| va_end(args); | |
| } | |
| do { \ | |
| if ((level) >= g_logger_state.verbosity_thold) { \ | |
| clip_log_internal((level), __VA_ARGS__); \ | |
| } \ | |
| } while (0) | |
| // | |
| // cpp wrappers | |
| // | |
| // wrapper for clip_image_size | |
| struct clip_image_size_deleter { | |
| void operator()(clip_image_size * val) { clip_image_size_free(val); } | |
| }; | |
| typedef std::unique_ptr<clip_image_size, clip_image_size_deleter> clip_image_size_ptr; | |
| // wrapper for clip_image_u8 | |
| struct clip_image_u8_deleter { | |
| void operator()(clip_image_u8 * val) { clip_image_u8_free(val); } | |
| }; | |
| typedef std::unique_ptr<clip_image_u8, clip_image_u8_deleter> clip_image_u8_ptr; | |
| // wrapper for clip_image_f32 | |
| struct clip_image_f32_deleter { | |
| void operator()(clip_image_f32 * val) { clip_image_f32_free(val); } | |
| }; | |
| typedef std::unique_ptr<clip_image_f32, clip_image_f32_deleter> clip_image_f32_ptr; | |
| struct clip_image_u8_batch { | |
| std::vector<clip_image_u8_ptr> entries; | |
| }; | |
| struct clip_image_f32_batch { | |
| std::vector<clip_image_f32_ptr> entries; | |
| bool is_audio = false; | |
| // for llava-uhd style models, we need to know the grid size | |
| // note: entries.size() == grid_x * grid_y + 1 (one overview image) | |
| int grid_x = 0; | |
| int grid_y = 0; | |
| clip_image_f32_batch clone() const { | |
| clip_image_f32_batch new_batch{ | |
| /* entries */ {}, | |
| /* is_audio */ is_audio, | |
| /* grid_x */ grid_x, | |
| /* grid_y */ grid_y, | |
| }; | |
| new_batch.entries.reserve(entries.size()); | |
| for (const auto & entry : entries) { | |
| new_batch.entries.emplace_back(new clip_image_f32(*entry)); | |
| } | |
| return new_batch; | |
| } | |
| }; | |
| // | |
| // common utils | |
| // | |
| static std::string string_format(const char * fmt, ...) { | |
| va_list ap; | |
| va_list ap2; | |
| va_start(ap, fmt); | |
| va_copy(ap2, ap); | |
| int size = vsnprintf(NULL, 0, fmt, ap); | |
| GGML_ASSERT(size >= 0 && size < INT_MAX); // NOLINT | |
| std::vector<char> buf(size + 1); | |
| int size2 = vsnprintf(buf.data(), size + 1, fmt, ap2); | |
| GGML_ASSERT(size2 == size); | |
| va_end(ap2); | |
| va_end(ap); | |
| return std::string(buf.data(), buf.size()); | |
| } | |
| static void string_replace_all(std::string & s, const std::string & search, const std::string & replace) { | |
| if (search.empty()) { | |
| return; | |
| } | |
| std::string builder; | |
| builder.reserve(s.length()); | |
| size_t pos = 0; | |
| size_t last_pos = 0; | |
| while ((pos = s.find(search, last_pos)) != std::string::npos) { | |
| builder.append(s, last_pos, pos - last_pos); | |
| builder.append(replace); | |
| last_pos = pos + search.length(); | |
| } | |
| builder.append(s, last_pos, std::string::npos); | |
| s = std::move(builder); | |
| } | |
| // split string by a `std::string delim` instead of `char delim` | |
| static std::vector<std::string> string_split_str(std::string s, const std::string & delimiter) { | |
| std::vector<std::string> tokens; | |
| size_t pos = 0; | |
| std::string token; | |
| while ((pos = s.find(delimiter)) != std::string::npos) { | |
| token = s.substr(0, pos); | |
| tokens.push_back(token); | |
| s.erase(0, pos + delimiter.length()); | |
| } | |
| tokens.push_back(s); | |
| return tokens; | |
| } | |
| // | |
| // gguf utils | |
| // | |
| static std::string gguf_data_to_str(enum gguf_type type, const void * data, int i) { | |
| switch (type) { | |
| case GGUF_TYPE_UINT8: return std::to_string(((const uint8_t *)data)[i]); | |
| case GGUF_TYPE_INT8: return std::to_string(((const int8_t *)data)[i]); | |
| case GGUF_TYPE_UINT16: return std::to_string(((const uint16_t *)data)[i]); | |
| case GGUF_TYPE_INT16: return std::to_string(((const int16_t *)data)[i]); | |
| case GGUF_TYPE_UINT32: return std::to_string(((const uint32_t *)data)[i]); | |
| case GGUF_TYPE_INT32: return std::to_string(((const int32_t *)data)[i]); | |
| case GGUF_TYPE_UINT64: return std::to_string(((const uint64_t *)data)[i]); | |
| case GGUF_TYPE_INT64: return std::to_string(((const int64_t *)data)[i]); | |
| case GGUF_TYPE_FLOAT32: return std::to_string(((const float *)data)[i]); | |
| case GGUF_TYPE_FLOAT64: return std::to_string(((const double *)data)[i]); | |
| case GGUF_TYPE_BOOL: return ((const bool *)data)[i] ? "true" : "false"; | |
| default: return string_format("unknown type %d", type); | |
| } | |
| } | |
| static std::string gguf_kv_to_str(const struct gguf_context * ctx_gguf, int i) { | |
| const enum gguf_type type = gguf_get_kv_type(ctx_gguf, i); | |
| switch (type) { | |
| case GGUF_TYPE_STRING: | |
| return gguf_get_val_str(ctx_gguf, i); | |
| case GGUF_TYPE_ARRAY: | |
| { | |
| const enum gguf_type arr_type = gguf_get_arr_type(ctx_gguf, i); | |
| int arr_n = gguf_get_arr_n(ctx_gguf, i); | |
| const void * data = arr_type == GGUF_TYPE_STRING ? nullptr : gguf_get_arr_data(ctx_gguf, i); | |
| std::stringstream ss; | |
| ss << "["; | |
| for (int j = 0; j < arr_n; j++) { | |
| if (arr_type == GGUF_TYPE_STRING) { | |
| std::string val = gguf_get_arr_str(ctx_gguf, i, j); | |
| // escape quotes | |
| string_replace_all(val, "\\", "\\\\"); | |
| string_replace_all(val, "\"", "\\\""); | |
| ss << '"' << val << '"'; | |
| } else if (arr_type == GGUF_TYPE_ARRAY) { | |
| ss << "???"; | |
| } else { | |
| ss << gguf_data_to_str(arr_type, data, j); | |
| } | |
| if (j < arr_n - 1) { | |
| ss << ", "; | |
| } | |
| } | |
| ss << "]"; | |
| return ss.str(); | |
| } | |
| default: | |
| return gguf_data_to_str(type, gguf_get_val_data(ctx_gguf, i), 0); | |
| } | |
| } | |
| // | |
| // debugging | |
| // | |
| static void print_tensor_shape(ggml_tensor * t) { | |
| printf("%s.shape = [", t->name); | |
| for (int i = 0; i < ggml_n_dims(t); ++i) { | |
| printf("%" PRId64, t->ne[i]); | |
| if (i < ggml_n_dims(t) - 1) { | |
| printf(", "); | |
| } | |
| } | |
| printf("]\n"); | |
| } | |
| static void print_tensor_data(ggml_tensor * t, uint8_t * data, int64_t n) { | |
| ggml_type type = t->type; | |
| int64_t * ne = t->ne; | |
| size_t * nb = t->nb; | |
| for (int64_t i3 = 0; i3 < ne[3]; i3++) { | |
| printf("%s.data: [\n", t->name); | |
| for (int64_t i2 = 0; i2 < ne[2]; i2++) { | |
| if (i2 == n && ne[2] > 2*n) { | |
| printf(" ..., \n"); | |
| i2 = ne[2] - n; | |
| } | |
| printf(" [\n"); | |
| for (int64_t i1 = 0; i1 < ne[1]; i1++) { | |
| if (i1 == n && ne[1] > 2*n) { | |
| printf(" ..., \n"); | |
| i1 = ne[1] - n; | |
| } | |
| printf(" ["); | |
| for (int64_t i0 = 0; i0 < ne[0]; i0++) { | |
| if (i0 == n && ne[0] > 2*n) { | |
| printf("..., "); | |
| i0 = ne[0] - n; | |
| } | |
| size_t i = i3 * nb[3] + i2 * nb[2] + i1 * nb[1] + i0 * nb[0]; | |
| float v; | |
| if (type == GGML_TYPE_F16) { | |
| v = ggml_fp16_to_fp32(*(ggml_fp16_t *) &data[i]); | |
| } else if (type == GGML_TYPE_F32) { | |
| v = *(float *) &data[i]; | |
| } else if (type == GGML_TYPE_I32) { | |
| v = (float) *(int32_t *) &data[i]; | |
| } else if (type == GGML_TYPE_I16) { | |
| v = (float) *(int16_t *) &data[i]; | |
| } else if (type == GGML_TYPE_I8) { | |
| v = (float) *(int8_t *) &data[i]; | |
| } else { | |
| GGML_ABORT("fatal error"); | |
| } | |
| printf("%8.4f", v); | |
| if (i0 < ne[0] - 1) printf(", "); | |
| } | |
| printf("],\n"); | |
| } | |
| printf(" ],\n"); | |
| } | |
| printf(" ]\n"); | |
| } | |
| } | |
| // | |
| // API used internally with mtmd | |
| // | |
| projector_type clip_get_projector_type(const struct clip_ctx * ctx); | |