helloadhavan/github_issues huggingface dataset:
Repository: ollama/ollama
Pull request: use `llm.ImageData`


Changed files:
filename: llm/dyn_ext_server.go
patch: @@ -161,13 +161,10 @@ func newDynExtServer(library, model string, adapters, projectors []string, opts
 func (llm *dynExtServer) Predict(ctx context.Context, predict PredictOpts, fn func(PredictResult)) error {
 	resp := newExtServerResp(128)
 	defer freeExtServerResp(resp)
-	var imageData []ImageData
+
 	if len(predict.Images) > 0 {
-		for cnt, i := range predict.Images {
-			imageData = append(imageData, ImageData{Data: i, ID: cnt})
-		}
+		slog.Info(fmt.Sprintf("loaded %d images", len(predict.Images)))
 	}
-	slog.Info(fmt.Sprintf("loaded %d images", len(imageData)))
 
 	request := map[string]any{
 		"prompt":            predict.Prompt,
@@ -189,7 +186,7 @@ func (llm *dynExtServer) Predict(ctx context.Context, predict PredictOpts, fn fu
 		"penalize_nl":       predict.Options.PenalizeNewline,
 		"seed":              predict.Options.Seed,
 		"stop":              predict.Options.Stop,
-		"image_data":        imageData,
+		"image_data":        predict.Images,
 		"cache_prompt":      true,
 	}
 

filename: llm/llama.go
patch: @@ -62,7 +62,7 @@ const maxRetries = 3
 type PredictOpts struct {
 	Prompt  string
 	Format  string
-	Images  map[int]api.ImageData
+	Images  []ImageData
 	Options api.Options
 }
 

filename: server/routes.go
patch: @@ -312,9 +312,12 @@ func GenerateHandler(c *gin.Context) {
 			ch <- resp
 		}
 
-		images := make(map[int]api.ImageData)
+		var images []llm.ImageData
 		for i := range req.Images {
-			images[i] = req.Images[i]
+			images = append(images, llm.ImageData{
+				ID:   i,
+				Data: req.Images[i],
+			})
 		}
 
 		// Start prediction
@@ -1188,11 +1191,19 @@ func ChatHandler(c *gin.Context) {
 			ch <- resp
 		}
 
+		var imageData []llm.ImageData
+		for k, v := range images {
+			imageData = append(imageData, llm.ImageData{
+				ID:   k,
+				Data: v,
+			})
+		}
+
 		// Start prediction
 		predictReq := llm.PredictOpts{
 			Prompt:  prompt,
 			Format:  req.Format,
-			Images:  images,
+			Images:  imageData,
 			Options: opts,
 		}
 		if err := loaded.runner.Predict(c.Request.Context(), predictReq, fn); err != nil {
Repository: denoland/deno
Pull request: fix(tsgo): nil deref for exported symbols

- https://github.com/denoland/typescript-go/pull/19
- Fixes https://gist.github.com/lucacasonato/eeaaeba048f0c2a7dbf629ddf171c1c2

Changed files:
filename: cli/tsc/go/tsgo_version.rs
patch: @@ -23,15 +23,15 @@ impl Hashes {
   }
 }
 
-pub const VERSION: &str = "0.1.13";
+pub const VERSION: &str = "0.1.14";
 pub const DOWNLOAD_BASE_URL: &str =
-  "https://github.com/denoland/typescript-go/releases/download/v0.1.13";
+  "https://github.com/denoland/typescript-go/releases/download/v0.1.14";
 pub const HASHES: Hashes = Hashes {
-  windows_x64: "sha256:0d884056a42af3943a2d9b17eb862f199a5b763d132506036205853ffd499142",
-  macos_x64: "sha256:5d34443bd0af95debbc9edbfea1ae6d45d78af26a6da1fe5f547b5824b63c2d0",
-  macos_arm64: "sha256:e93c671629e6929cb0b3ebad2a8834641b77e4953c3038a50b29daeb2f36e070",
-  linux_x64: "sha256:dd29cd82d8f89bc70d23011e9cc687d7d4d9631ef395ffeac43f605ab8409255",
-  linux_arm64: "sha256:bf6380027b63e3758cdd29be7d35daaa02371ce60e285b7da3d37a2c3f950fc0",
+  windows_x64: "sha256:0346e293e00ba7a112637e6f27ef88fda125eab2a21906f2c722a288f30494f2",
+  macos_x64: "sha256:9642438198668feb84b3fde797c3ad9672669eeac816455a1d1c66a75360af01",
+  macos_arm64: "sha256:c85755c4252dd51eef77f8e94f9819303b2d24b1cc4970cb989faea25e242993",
+  linux_x64: "sha256:b2b8f8dd6c751dc28285dda69126415bfac93c0b823c71168969fb1c56baf301",
+  linux_arm64: "sha256:abdb1275666ec300a26e64261d83bc4124fea0b60272e3b382b5292875c763a8",
 };
 
 const _: () = {

filename: tests/node_compat/runner/suite
patch: @@ -1 +1 @@
-Subproject commit 170b25ab9080b9d58d21b582fbf28ee5676b8387
+Subproject commit efdcff0c97da58383af5725d3d68cf653161c73f
Repository: vercel/next.js
Pull request: Only send notification if canary fails on required jobs

Follow-up to https://github.com/vercel/next.js/pull/83851/

The 2nd attempt can fail with required jobs and then the final attempt only fails on optional. So we need to duplicate the logic for retry and notification job.

Changed files:
filename: .github/workflows/retry_test.yml
patch: @@ -39,7 +39,7 @@ jobs:
             const requiredJobName = {
               'build-and-test': 'thank you, next',
               'build-and-deploy': 'thank you, build',
-            }[context.workflow]
+            }[github.event.workflow_run.name]
 
             async function rerunIfRequiredNotSuccessful() {
               const result = await github.paginate.iterator(
@@ -93,7 +93,51 @@ jobs:
       }}
     runs-on: ubuntu-latest
     steps:
+      - name: Check conclusion of required job
+        id: required_job_conclusion
+        uses: actions/github-script@v7
+        continue-on-error: true
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+        with:
+          script: |
+            // See build-and-test.yml and build-and-deploy.yml for the required job names
+            const requiredJobName = {
+              'build-and-test': 'thank you, next',
+              'build-and-deploy': 'thank you, build',
+            }[github.event.workflow_run.name]
+
+            async function rerunIfRequiredNotSuccessful() {
+              const result = await github.paginate.iterator(
+                'GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs',
+                {
+                  attempt_number: context.payload.workflow_run.run_attempt,
+                  owner: context.repo.owner,
+                  repo: context.repo.repo,
+                  run_id: context.payload.workflow_run.id,
+                }
+              )
+
+              for await (const { data: jobs } of result) {
+                for (const job of jobs) {
+                  if (job.name === requiredJobName) {
+                    console.log(
+                      "Using conclusion '%s' from %s",
+                      job.conclusion,
+                      job.html_url
+                    )
+                    return job.conclusion
+                  }
+                }
+              }
+
+              console.log("Couldn't find job with name '%s'", requiredJobName)
+              return null
+            }
+
+            return await rerunIfRequiredNotSuccessful()
       - name: send webhook
+        if: ${{ steps.required_job_conclusion.outputs.result != 'success' }}
         uses: slackapi/slack-github-action@v1.25.0
         with:
           # These urls are intentionally missing the protocol,
Repository: denoland/deno
Pull request: test: add --filter flag to node_compat tests

With this commit it's now possible to run a Node compat test that is not listed in the config like so:
```
cargo test --test node_compat -- --filter test-http2-client-http1-server.js
```

Changed files:
filename: tests/node_compat/mod.rs
patch: @@ -121,6 +121,10 @@ fn main() {
   let config = load_config();
   let mut category = if cli_args.report {
     collect_all_tests()
+  } else if let Some(filter) = cli_args.filter.as_ref() {
+    let mut category = collect_all_tests();
+    category.filter_children(filter);
+    category
   } else {
     collect_tests_from_config(&config)
   };
@@ -217,6 +221,7 @@ struct CliArgs {
   inspect_brk: bool,
   inspect_wait: bool,
   report: bool,
+  filter: Option<String>,
 }
 
 // You need to run with `--test node_compat` for this to work.
@@ -225,11 +230,22 @@ fn parse_cli_args() -> CliArgs {
   let mut inspect_brk = false;
   let mut inspect_wait = false;
   let mut report = false;
+  let mut filter = None;
+
+  let mut has_filter = false;
   for arg in std::env::args() {
+    if has_filter {
+      filter = Some(arg.as_str().to_string());
+      has_filter = false;
+    }
+
     match arg.as_str() {
       "--inspect-brk" => inspect_brk = true,
       "--inspect-wait" => inspect_wait = true,
       "--report" => report = true,
+      "--filter" => {
+        has_filter = true;
+      }
       _ => {}
     }
   }
@@ -238,6 +254,7 @@ fn parse_cli_args() -> CliArgs {
     inspect_brk,
     inspect_wait,
     report,
+    filter,
   }
 }
Repository: ollama/ollama
Pull request: update slog handler options

- consistent format by using text handler for debug and non-debug
- truncate source file to just the file name

sample outputs:

```
time=2024-01-31T15:01:02.632-08:00 level=INFO source=routes.go:983 msg="Listening on 127.0.0.1:11434 (version 0.0.0)"
time=2024-01-31T15:01:02.632-08:00 level=INFO source=payload_common.go:106 msg="Extracting dynamic libraries..."
time=2024-01-31T15:01:02.653-08:00 level=INFO source=payload_common.go:145 msg="Dynamic LLM libraries [metal]"
```

Changed files:
filename: server/routes.go
patch: @@ -938,13 +938,26 @@ func (s *Server) GenerateRoutes() http.Handler {
 }
 
 func Serve(ln net.Listener) error {
+	level := slog.LevelInfo
 	if debug := os.Getenv("OLLAMA_DEBUG"); debug != "" {
-		var programLevel = new(slog.LevelVar)
-		h := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{Level: programLevel, AddSource: true})
-		slog.SetDefault(slog.New(h))
-		programLevel.Set(slog.LevelDebug)
-		slog.Debug("Debug logging enabled")
+		level = slog.LevelDebug
 	}
+
+	handler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
+		Level:     level,
+		AddSource: true,
+		ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr {
+			if attr.Key == slog.SourceKey {
+				source := attr.Value.Any().(*slog.Source)
+				source.File = filepath.Base(source.File)
+			}
+
+			return attr
+		},
+	})
+
+	slog.SetDefault(slog.New(handler))
+
 	if noprune := os.Getenv("OLLAMA_NOPRUNE"); noprune == "" {
 		// clean up unused layers and manifests
 		if err := PruneLayers(); err != nil {
Repository: nodejs/node
Pull request: bootstrap: initialize http proxy after user module loader setup

The externalized undici relies on the user module loader, so in the externalized build, initialization of http proxy which relies on undici needs to be deferred until after the user module loader is initialized.

Refs: https://github.com/nodejs/node/issues/58865
Refs: https://github.com/nodejs/node/issues/57872

<!--
Before submitting a pull request, please read:

- the CONTRIBUTING guide at https://github.com/nodejs/node/blob/HEAD/CONTRIBUTING.md
- the commit message formatting guidelines at
  https://github.com/nodejs/node/blob/HEAD/doc/contributing/pull-requests.md#commit-message-guidelines

For code changes:
1. Include tests for any bug fixes or new features.
2. Update documentation if relevant.
3. Ensure that `make -j4 test` (UNIX), or `vcbuild test` (Windows) passes.

If you believe this PR should be highlighted in the Node.js CHANGELOG
please add the `notable-change` label.

Developer's Certificate of Origin 1.1

By making a contribution to this project, I certify that:

(a) The contribution was created in whole or in part by me and I
    have the right to submit it under the open source license
    indicated in the file; or

(b) The contribution is based upon previous work that, to the best
    of my knowledge, is covered under an appropriate open source
    license and I have the right under that license to submit that
    work with modifications, whether created in whole or in part
    by me, under the same open source license (unless I am
    permitted to submit under a different license), as indicated
    in the file; or

(c) The contribution was provided directly to me by some other
    person who certified (a), (b) or (c) and I have not modified
    it.

(d) I understand and agree that this project and the contribution
    are public and that a record of the contribution (including all
    personal information I submit with it, including my sign-off) is
    maintained indefinitely and may be redistributed consistent with
    this project or the open source license(s) involved.
-->


Changed files:
filename: lib/internal/process/pre_execution.js
patch: @@ -126,7 +126,6 @@ function prepareExecution(options) {
   initializeConfigFileSupport();
 
   require('internal/dns/utils').initializeDns();
-  setupHttpProxy();
 
   if (isMainThread) {
     assert(internalBinding('worker').isMainThread);
@@ -159,6 +158,10 @@ function prepareExecution(options) {
     setupUserModules(forceDefaultLoader);
   }
 
+  // This has to be done after the user module loader is initialized,
+  // in case undici is externalized.
+  setupHttpProxy();
+
   return mainEntry;
 }
Repository: huggingface/transformers
Pull request: Intel CPU dockerfile

Upload Intel CPU dockerfile

Changed files:
filename: docker/transformers-intel-cpu/Dockerfile
patch: @@ -0,0 +1,71 @@
+FROM intel/deep-learning-essentials:2025.1.3-0-devel-ubuntu24.04 AS base
+LABEL maintainer="Hugging Face"
+SHELL ["/bin/bash", "-c"]
+
+ARG PYTHON_VERSION=3.12
+ENV DEBIAN_FRONTEND=noninteractive
+
+RUN apt-get update && \
+    apt-get install -y software-properties-common && \
+    add-apt-repository -y ppa:deadsnakes/ppa && \
+    apt-get update
+
+RUN apt-get update && \
+    apt-get -y install \
+    apt-utils \
+    build-essential \
+    ca-certificates \
+    clinfo \
+    curl \
+    git \
+    git-lfs \
+    vim \
+    numactl \
+    gnupg2 \
+    gpg-agent \
+    python3-dev \
+    python3-opencv \
+    unzip \
+    ffmpeg \
+    tesseract-ocr \
+    espeak-ng \
+    wget \
+    ncurses-term \
+    google-perftools \
+    libjemalloc-dev \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
+# Use virtual env because Ubuntu:24 does not allowed pip on original python
+RUN curl -LsSf https://astral.sh/uv/install.sh | sh
+ENV PATH="/root/.local/bin:$PATH"
+ENV VIRTUAL_ENV="/opt/venv"
+ENV UV_PYTHON_INSTALL_DIR=/opt/uv/python
+RUN uv venv --python ${PYTHON_VERSION} --seed ${VIRTUAL_ENV}
+ENV PATH="$VIRTUAL_ENV/bin:$PATH"
+
+RUN pip install --upgrade pip wheel
+RUN pip install torch torchvision torchaudio torchcodec --index-url https://download.pytorch.org/whl/cpu --no-cache-dir
+RUN pip install av pyctcdecode pytesseract decord galore-torch fire scipy scikit-learn sentencepiece sentence_transformers sacremoses nltk rouge_score librosa soundfile mpi4py pytorch_msssim
+RUN pip install onnx optimum onnxruntime
+RUN pip install autoawq
+RUN pip install gptqmodel --no-build-isolation
+RUN pip install -U datasets timm transformers accelerate peft diffusers opencv-python kenlm evaluate
+RUN pip install -U intel-openmp
+
+# install bitsandbytes
+RUN git clone https://github.com/bitsandbytes-foundation/bitsandbytes.git && cd bitsandbytes/ && \
+    cmake -DCOMPUTE_BACKEND=cpu -S . && make && pip install . && cd ../
+
+# CPU don't need triton
+RUN pip uninstall triton -y
+
+ENV LD_PRELOAD=${LD_PRELOAD}:/opt/venv/lib/libiomp5.so:/usr/lib/x86_64-linux-gnu/libtcmalloc.so.4
+ENV KMP_AFFINITY=granularity=fine,compact,1,0
+
+RUN touch /entrypoint.sh
+RUN chmod +x /entrypoint.sh
+RUN echo "#!/bin/bash" >> /entrypoint.sh
+RUN echo "/bin/bash" >> /entrypoint.sh
+
+ENTRYPOINT ["/entrypoint.sh"]
Repository: electron/electron
Pull request: fix: opening package paths as directory on macOS

Backport of #47077

See that PR for details.


Notes: fix opening package paths as directory when `treatPackageAsDirectory` is enabled on macOS

Changed files:
filename: shell/browser/ui/file_dialog_mac.mm
patch: @@ -303,9 +303,10 @@ void ReadDialogPathsWithBookmarks(NSOpenPanel* dialog,
       BOOL exists =
           [[NSFileManager defaultManager] fileExistsAtPath:path
                                                isDirectory:&is_directory];
-      BOOL is_package =
-          [[NSWorkspace sharedWorkspace] isFilePackageAtPath:path];
-      if (!exists || !is_directory || is_package)
+      BOOL is_package_as_directory =
+          [[NSWorkspace sharedWorkspace] isFilePackageAtPath:path] &&
+          [dialog treatsFilePackagesAsDirectories];
+      if (!exists || !is_directory || !is_package_as_directory)
         continue;
     }
Repository: facebook/react
Pull request: Set disableLegacyMode to true for www

Set disableLegacyMode to true for www


Changed files:
filename: packages/shared/forks/ReactFeatureFlags.www-dynamic.js
patch: @@ -32,7 +32,6 @@ export const retryLaneExpirationMs = 5000;
 export const syncLaneExpirationMs = 250;
 export const transitionLaneExpirationMs = 5000;
 export const enableAddPropertiesFastPath = __VARIANT__;
-export const disableLegacyMode = __VARIANT__;
 
 // Enable this flag to help with concurrent mode debugging.
 // It logs information to the console about React scheduling, rendering, and commit phases.

filename: packages/shared/forks/ReactFeatureFlags.www.js
patch: @@ -119,8 +119,7 @@ export const useModernStrictMode = true;
 // because JSX is an extremely hot path.
 export const disableStringRefs = false;
 
-export const disableLegacyMode: boolean =
-  __EXPERIMENTAL__ || dynamicFeatureFlags.disableLegacyMode;
+export const disableLegacyMode = true;
 
 export const enableOwnerStacks = false;
 export const enableShallowPropDiffing = false;
Repository: vercel/next.js
Pull request: Fix conclusion check for retry_test workflow

Vade lied to me. Fixes
```
Error: Unhandled error: TypeError: Cannot read properties of undefined (reading 'workflow_run')
```
-- https://github.com/vercel/next.js/actions/runs/17835748140/job/50712367293#step:2:51

Changed files:
filename: .github/workflows/retry_test.yml
patch: @@ -39,7 +39,7 @@ jobs:
             const requiredJobName = {
               'build-and-test': 'thank you, next',
               'build-and-deploy': 'thank you, build',
-            }[github.event.workflow_run.name]
+            }[context.payload.workflow_run.name]
 
             async function rerunIfRequiredNotSuccessful() {
               const result = await github.paginate.iterator(
@@ -105,7 +105,7 @@ jobs:
             const requiredJobName = {
               'build-and-test': 'thank you, next',
               'build-and-deploy': 'thank you, build',
-            }[github.event.workflow_run.name]
+            }[context.payload.workflow_run.name]
 
             async function rerunIfRequiredNotSuccessful() {
               const result = await github.paginate.iterator(
Repository: ollama/ollama
Pull request: remove unnecessary parse raw

There's no point parsing the raw private key when all it's doing is creating a ssh key

Changed files:
filename: server/auth.go
patch: @@ -147,12 +147,7 @@ func (s SignatureData) Bytes() []byte {
 
 // SignData takes a SignatureData object and signs it with a raw private key
 func (s SignatureData) Sign(rawKey []byte) (string, error) {
-	privateKey, err := ssh.ParseRawPrivateKey(rawKey)
-	if err != nil {
-		return "", err
-	}
-
-	signer, err := ssh.NewSignerFromKey(privateKey)
+	signer, err := ssh.ParsePrivateKey(rawKey)
 	if err != nil {
 		return "", err
 	}
Repository: ggml-org/llama.cpp
Pull request: fix: /metrics endpoint returning JSON-escaped Prometheus format

The `/metrics` endpoint returns Prometheus-format text that is incorrectly JSON-escaped, causing the output to be wrapped in double quotes, which prevents Prometheus from parsing it correctly.

Related code snippets:

https://github.com/ggml-org/llama.cpp/blob/2eba631b8127a5a4853ea625a0eac4a7449bc7b8/tools/server/server.cpp#L4567

https://github.com/ggml-org/llama.cpp/blob/2eba631b8127a5a4853ea625a0eac4a7449bc7b8/tools/server/server.cpp#L4441-L4444

I added an `ok()` overload with a `std::string` parameter to fix this issue.

Related issue:
- #17384

Note: I've checked other calls to `ok()` and they all pass JSON types, so this issue won't occur elsewhere.


Changed files:
filename: tools/server/server.cpp
patch: @@ -2713,7 +2713,8 @@ struct server_routes {
 
         res->headers["Process-Start-Time-Unix"] = std::to_string(res_task->t_start);
         res->content_type = "text/plain; version=0.0.4";
-        res->ok(prometheus.str());
+        res->status = 200;
+        res->data = prometheus.str();
         return res;
     };
Repository: facebook/react
Pull request: [compiler] Provide support for custom fbt-like macro functions

Stack from [ghstack](https://github.com/ezyang/ghstack) (oldest at bottom):
* __->__ #29893



Changed files:
filename: compiler/packages/babel-plugin-react-compiler/src/ReactiveScopes/MemoizeFbtAndMacroOperandsInSameScope.ts
patch: @@ -5,7 +5,6 @@
  * LICENSE file in the root directory of this source tree.
  */
 
-import prettyFormat from "pretty-format";
 import {
   HIRFunction,
   IdentifierId,
Repository: denoland/deno
Pull request: fix(ext/web): handle empty TextDecoder input when stream is true

for: 
https://github.com/denoland/deno/issues/31605#issuecomment-3677640653

fixes the issue where TextDecoder with stream: true and an empty chunk would return incorrect results.
It resolves the chunking problem for legacy encodings like big5, shift_jis, and euc-kr.

Changed files:
filename: ext/web/08_text_encoding.js
patch: @@ -119,6 +119,10 @@ class TextDecoder {
       stream = options.stream;
     }
 
+    if (stream && input.length === 0) {
+      return "";
+    }
+
     try {
       /** @type {ArrayBufferLike} */
       let buffer = input;

filename: tests/unit/text_encoding_test.ts
patch: @@ -324,3 +324,56 @@ Deno.test(
     assertStrictEquals(cancelled, true);
   },
 );
+
+Deno.test(
+  "TextDecoder should handle empty chunk in stream mode (legacy encodings)",
+  () => {
+    // big5: [0xa4, 0xa4] => "中" (U+4E2D)
+    {
+      const u8 = new Uint8Array([0xa4, 0xa4]);
+      const str = new TextDecoder("big5").decode(u8);
+      assertEquals(str, "\u4e2d");
+
+      const d = new TextDecoder("big5");
+      const chunks = [
+        d.decode(u8.subarray(0, 1), { stream: true }),
+        d.decode(u8.subarray(1), { stream: true }),
+        d.decode(new Uint8Array(), { stream: true }),
+        d.decode(),
+      ];
+      assertEquals(chunks.join(""), str);
+    }
+
+    // shift_jis: [0x82, 0xa0] => "あ" (U+3042)
+    {
+      const u8 = new Uint8Array([0x82, 0xa0]);
+      const str = new TextDecoder("shift_jis").decode(u8);
+      assertEquals(str, "\u3042");
+
+      const d = new TextDecoder("shift_jis");
+      const chunks = [
+        d.decode(u8.subarray(0, 1), { stream: true }),
+        d.decode(u8.subarray(1), { stream: true }),
+        d.decode(new Uint8Array(), { stream: true }),
+        d.decode(),
+      ];
+      assertEquals(chunks.join(""), str);
+    }
+
+    // euc-kr: [0xb0, 0xa1] => "가" (U+AC00)
+    {
+      const u8 = new Uint8Array([0xb0, 0xa1]);
+      const str = new TextDecoder("euc-kr").decode(u8);
+      assertEquals(str, "\uac00");
+
+      const d = new TextDecoder("euc-kr");
+      const chunks = [
+        d.decode(u8.subarray(0, 1), { stream: true }),
+        d.decode(u8.subarray(1), { stream: true }),
+        d.decode(new Uint8Array(), { stream: true }),
+        d.decode(),
+      ];
+      assertEquals(chunks.join(""), str);
+    }
+  },
+);
Repository: ollama/ollama
Pull request: Add MindMac to Community Integrations -> Web & Desktop section

Hi there,

MindMac is a privacy-first & feature-rich GPT client for macOS, designed for maximum productivity. It already has Ollama support, enabling users to run any model on their devices and easily connect with MindMac to ask questions seamlessly. Quick documentation can be found [here](https://docs.mindmac.app/how-to.../add-ollama-endpoint). Please help to review this PR. Thank you in advance.

Best regards,

Hoang


Changed files:
filename: README.md
patch: @@ -265,6 +265,7 @@ See the [API documentation](./docs/api.md) for all endpoints.
 - [Amica](https://github.com/semperai/amica)
 - [chatd](https://github.com/BruceMacD/chatd)
 - [Ollama-SwiftUI](https://github.com/kghandour/Ollama-SwiftUI)
+- [MindMac](https://mindmac.app)
 
 
 ### Terminal